Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 11:57:19

0001 import math
0002 import glob
0003 import importlib
0004 import FWCore.ParameterSet.Config as cms
0005 from Alignment.OfflineValidation.TkAlAllInOneTool.defaultInputFiles_cff import filesDefaultData_Comissioning2022_Cosmics_string,filesDefaultMC_DoubleMuonPUPhase_string
0006 
0007 ###################################################################
0008 # Setup 'standard' options
0009 ###################################################################
0010 import FWCore.ParameterSet.VarParsing as VarParsing
0011 options = VarParsing.VarParsing()
0012 options.register('outFileName',
0013                  "test.root", # default value
0014                  VarParsing.VarParsing.multiplicity.singleton, # singleton or list
0015                  VarParsing.VarParsing.varType.string, # string, int, or float
0016                  "name of the output file (test.root is default)")
0017 
0018 options.register('trackCollection',
0019                  "ctfWithMaterialTracksP5", #ALCARECOTkAlCosmicsCTF0T
0020                  VarParsing.VarParsing.multiplicity.singleton, # singleton or list
0021                  VarParsing.VarParsing.varType.string, # string, int, or float
0022                  "name of the input track collection")
0023 
0024 options.register('globalTag',
0025                  "auto:run3_data_prompt", # default value
0026                  VarParsing.VarParsing.multiplicity.singleton, # singleton or list
0027                  VarParsing.VarParsing.varType.string, # string, int, or float
0028                  "name of the input Global Tag")
0029 
0030 options.register('unitTest',
0031                  False, # default value
0032                  VarParsing.VarParsing.multiplicity.singleton, # singleton or list
0033                  VarParsing.VarParsing.varType.bool, # string, int, or float
0034                  "is it a unit test?")
0035 
0036 options.register('isDiMuonData',
0037                  False, # default value
0038                  VarParsing.VarParsing.multiplicity.singleton, # singleton or list
0039                  VarParsing.VarParsing.varType.bool, # string, int, or float
0040                  "is it running on DiMuon data?")
0041 
0042 options.register('isCosmics',
0043                  False, # default value
0044                  VarParsing.VarParsing.multiplicity.singleton, # singleton or list
0045                  VarParsing.VarParsing.varType.bool, # string, int, or float
0046                  "is it running on cosmics data?")
0047 
0048 options.register('inputData',
0049                  "/eos/cms/store/express/Commissioning2022/ExpressCosmics/FEVT/Express-v1/000/350/010/00000/*",
0050                  VarParsing.VarParsing.multiplicity.singleton, # singleton or list
0051                  VarParsing.VarParsing.varType.string, # string, int, or float
0052                  "eos directory to read from")
0053 
0054 options.register('maxEvents',
0055                  -1,
0056                  VarParsing.VarParsing.multiplicity.singleton, # singleton or list                 
0057                  VarParsing.VarParsing.varType.int, # string, int, or float
0058                  "num. events to run")
0059 
0060 options.register('Detector',
0061                  '2023',
0062                  VarParsing.VarParsing.multiplicity.singleton, # singleton or list                 
0063                  VarParsing.VarParsing.varType.string, # string, int, or float
0064                  "Detector to run upon")
0065 
0066 options.parseArguments()
0067 
0068 
0069 from Configuration.PyReleaseValidation.upgradeWorkflowComponents import upgradeProperties
0070 ConditionsInfo = {}
0071 if 'D' in options.Detector:
0072     ConditionsInfo = upgradeProperties[2026][options.Detector] # so if the default changes, change wf only here
0073 else:
0074     ConditionsInfo = upgradeProperties[2017][options.Detector]
0075     
0076 era_value = ConditionsInfo['Era']
0077 era_module_name = f'Configuration.Eras.Era_{era_value}_cff'
0078 config_name = f'{era_value}'
0079 era_module = importlib.import_module(era_module_name)
0080 era_config = getattr(era_module, config_name, None)
0081 
0082 if era_config is not None:
0083     # Use the configurations from the imported module in the process setup
0084     process = cms.Process("AlCaRECOAnalysis", era_config)
0085 else:
0086     print(f"Error: Could not find configuration {config_name} in module {era_module_name}.")
0087 
0088 ###################################################################
0089 # Message logger service
0090 ###################################################################
0091 process.load("FWCore.MessageLogger.MessageLogger_cfi")
0092 process.MessageLogger.cerr.enable = False
0093 process.MessageLogger.DMRChecker=dict()  
0094 process.MessageLogger.GeneralPurposeTrackAnalyzer=dict()
0095 process.MessageLogger.cout = cms.untracked.PSet(
0096     enable = cms.untracked.bool(True),
0097     threshold = cms.untracked.string("INFO"),
0098     default   = cms.untracked.PSet(limit = cms.untracked.int32(0)),                       
0099     FwkReport = cms.untracked.PSet(limit = cms.untracked.int32(-1),
0100                                    reportEvery = cms.untracked.int32(1000)
0101                                    ),                                                      
0102     DMRChecker = cms.untracked.PSet( limit = cms.untracked.int32(-1)),
0103     GeneralPurposeTrackAnalyzer = cms.untracked.PSet( limit = cms.untracked.int32(-1)),
0104     #enableStatistics = cms.untracked.bool(True)
0105     )
0106 
0107 ###################################################################
0108 # Geometry producer and standard includes
0109 ###################################################################
0110 process.load("RecoVertex.BeamSpotProducer.BeamSpot_cff")
0111 process.load("Configuration.StandardSequences.Services_cff")
0112 if 'D' in options.Detector:
0113     geom = options.Detector  # Replace with your actual dynamic part
0114     process.load(f'Configuration.Geometry.GeometryExtended{geom}Reco_cff')
0115 else:
0116     process.load("Configuration.StandardSequences.GeometryRecoDB_cff")
0117 
0118 process.load('Configuration.StandardSequences.MagneticField_cff')
0119 #process.load("Configuration.StandardSequences.MagneticField_0T_cff")
0120 process.load("CondCore.CondDB.CondDB_cfi")
0121 
0122 ####################################################################
0123 # Get the GlogalTag
0124 ####################################################################
0125 process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff")
0126 from Configuration.AlCa.GlobalTag import GlobalTag
0127 process.GlobalTag = GlobalTag(process.GlobalTag,options.globalTag if (options.globalTag != '') else ConditionsInfo['GT'], '')
0128 
0129 ###################################################################
0130 # Source
0131 ###################################################################
0132 readFiles = cms.untracked.vstring()
0133 process.source = cms.Source("PoolSource",fileNames = readFiles)
0134 the_files=[]
0135 if(options.unitTest):
0136     ## fixed input for the unit test
0137     if('D' in options.Detector) :
0138         # it's for phase-2
0139         readFiles.extend([filesDefaultMC_DoubleMuonPUPhase_string])
0140     else:
0141         # it's for phase-1
0142         readFiles.extend([filesDefaultData_Comissioning2022_Cosmics_string])
0143 else:
0144     file_list = glob.glob(options.inputData)
0145     for f in file_list:
0146         if '/eos/cms' in f:
0147             the_files.append(f.replace("/eos/cms",""))
0148         else: 
0149             the_files.append(f.replace("./","file:"))
0150     print(the_files)
0151     readFiles.extend(the_files)
0152 
0153 process.maxEvents = cms.untracked.PSet(input = cms.untracked.int32((10 if (options.unitTest) else options.maxEvents)))
0154 
0155 ###################################################################
0156 # momentum constraint for 0T
0157 ###################################################################
0158 process.load("RecoTracker.TrackProducer.MomentumConstraintProducer_cff")
0159 import RecoTracker.TrackProducer.MomentumConstraintProducer_cff
0160 process.AliMomConstraint = RecoTracker.TrackProducer.MomentumConstraintProducer_cff.MyMomConstraint.clone()
0161 process.AliMomConstraint.src = options.trackCollection
0162 process.AliMomConstraint.fixedMomentum = 5.0
0163 process.AliMomConstraint.fixedMomentumError = 0.005
0164 
0165 ###################################################################
0166 # Alignment Track Selector
0167 ###################################################################
0168 import Alignment.CommonAlignmentProducer.AlignmentTrackSelector_cfi
0169 process.MuSkimSelector = Alignment.CommonAlignmentProducer.AlignmentTrackSelector_cfi.AlignmentTrackSelector.clone(
0170     applyBasicCuts = True,                                                                            
0171     filter = True,
0172     src = options.trackCollection,
0173     ptMin = 17.,
0174     pMin = 17.,
0175     etaMin = -2.5,
0176     etaMax = 2.5,
0177     d0Min = -2.,
0178     d0Max = 2.,
0179     dzMin = -25.,
0180     dzMax = 25.,
0181     nHitMin = 6,
0182     nHitMin2D = 0)
0183 
0184 ###################################################################
0185 # The TrackRefitter
0186 ###################################################################
0187 process.load("RecoTracker.TrackProducer.TrackRefitters_cff")
0188 import RecoTracker.TrackProducer.TrackRefitters_cff
0189 if options.isCosmics:
0190     process.TrackRefitter1 = process.TrackRefitterP5.clone(
0191         src =  options.trackCollection, #'AliMomConstraint',
0192         TrajectoryInEvent = True,
0193         TTRHBuilder = "WithAngleAndTemplate", #"WithTrackAngle"
0194         NavigationSchool = "",
0195         #constraint = 'momentum', ### SPECIFIC FOR CRUZET
0196         #srcConstr='AliMomConstraint' ### SPECIFIC FOR CRUZET$works only with tag V02-10-02 TrackingTools/PatternTools / or CMSSW >=31X
0197     )
0198 else:
0199     process.TrackRefitter1 = RecoTracker.TrackProducer.TrackRefitter_cfi.TrackRefitter.clone(
0200         src =  options.trackCollection, #'AliMomConstraint',
0201         TrajectoryInEvent = True,
0202         TTRHBuilder = "WithAngleAndTemplate", #"WithTrackAngle"
0203         NavigationSchool = "",
0204     )
0205 
0206 ###################################################################
0207 # the pT filter
0208 ###################################################################
0209 from CommonTools.RecoAlgos.ptMaxTrackCountFilter_cfi import ptMaxTrackCountFilter
0210 process.myfilter = ptMaxTrackCountFilter.clone(src = cms.InputTag(options.trackCollection),
0211                                                ptMax = cms.double(10.))
0212 
0213 process.preAnaSeq = cms.Sequence()
0214 if(options.unitTest):
0215     print("adding the max pT filter")
0216     process.preAnaSeq = cms.Sequence(process.myfilter)
0217 
0218 ###################################################################
0219 # The analysis module
0220 ###################################################################
0221 process.myanalysis = cms.EDAnalyzer("GeneralPurposeTrackAnalyzer",
0222                                     TkTag  = cms.InputTag('TrackRefitter1'),
0223                                     #TkTag  = cms.InputTag(options.trackCollection),
0224                                     isCosmics = cms.bool(options.isCosmics))
0225 
0226 process.fastdmr = cms.EDAnalyzer("DMRChecker",
0227                                  TkTag  = cms.InputTag('TrackRefitter1'),
0228                                  isCosmics = cms.bool(options.isCosmics))
0229 
0230 ###################################################################
0231 # Output name
0232 ###################################################################
0233 process.TFileService = cms.Service("TFileService",
0234                                    fileName = cms.string(options.outFileName))
0235 
0236 
0237 ###################################################################
0238 # TransientTrack from https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideTransientTracks
0239 ###################################################################
0240 process.load("TrackingTools.TransientTrack.TransientTrackBuilder_cfi")
0241 process.load('TrackPropagation.SteppingHelixPropagator.SteppingHelixPropagatorOpposite_cfi')
0242 process.load('TrackPropagation.SteppingHelixPropagator.SteppingHelixPropagatorAlong_cfi')
0243 process.load('TrackingTools.TrackAssociator.DetIdAssociatorESProducer_cff')
0244 
0245 process.DiMuonVertexValidation = cms.EDAnalyzer("DiMuonVertexValidation",
0246                                                 useReco = cms.bool(False),
0247                                                 muonTracks = cms.InputTag('TrackRefitter1'),
0248                                                 tracks = cms.InputTag(''),
0249                                                 vertices = cms.InputTag('offlinePrimaryVertices'))
0250 
0251 from Alignment.OfflineValidation.diMuonValidation_cfi import diMuonValidation as _diMuonValidation
0252 process.DiMuonMassValidation = _diMuonValidation.clone(
0253     #TkTag = 'refittedMuons',
0254     TkTag = 'TrackRefitter1',
0255     # mu mu mass
0256     Pair_mass_min   = 80.,
0257     Pair_mass_max   = 120.,
0258     Pair_mass_nbins = 80,
0259     Pair_etaminpos  = -2.4,
0260     Pair_etamaxpos  = 2.4,
0261     Pair_etaminneg  = -2.4,
0262     Pair_etamaxneg  = 2.4,
0263     # cosTheta CS
0264     Variable_CosThetaCS_xmin  = -1.,
0265     Variable_CosThetaCS_xmax  =  1.,
0266     Variable_CosThetaCS_nbins = 20,
0267     # DeltaEta
0268     Variable_DeltaEta_xmin  = -4.8,
0269     Variable_DeltaEta_xmax  = 4.8,
0270     Variable_DeltaEta_nbins = 20,
0271     # EtaMinus
0272     Variable_EtaMinus_xmin  = -2.4,
0273     Variable_EtaMinus_xmax  =  2.4,
0274     Variable_EtaMinus_nbins = 12,
0275     # EtaPlus
0276     Variable_EtaPlus_xmin  = -2.4,
0277     Variable_EtaPlus_xmax  =  2.4,
0278     Variable_EtaPlus_nbins = 12,
0279     # Phi CS
0280     Variable_PhiCS_xmin  = -math.pi/2.,
0281     Variable_PhiCS_xmax  =  math.pi/2.,
0282     Variable_PhiCS_nbins = 20,
0283     # Phi Minus
0284     Variable_PhiMinus_xmin  = -math.pi,
0285     Variable_PhiMinus_xmax  =  math.pi,
0286     Variable_PhiMinus_nbins = 16,
0287     # Phi Plus
0288     Variable_PhiPlus_xmin  = -math.pi,
0289     Variable_PhiPlus_xmax  =  math.pi,
0290     Variable_PhiPlus_nbins = 16,
0291     # mu mu pT
0292     Variable_PairPt_xmin  = 0.,
0293     Variable_PairPt_xmax  = 100.,
0294     Variable_PairPt_nbins = 100)
0295 
0296 ###################################################################
0297 # Path
0298 ###################################################################
0299 process.p1 = cms.Path(process.offlineBeamSpot
0300                       #*process.AliMomConstraint  # for 0T
0301                       * process.TrackRefitter1
0302                       * process.myanalysis
0303                       * process.fastdmr)
0304 
0305 ###################################################################
0306 # append di muon analysis
0307 ###################################################################
0308 if(options.isDiMuonData):
0309     process.p1.insert(5,process.DiMuonVertexValidation)
0310     process.p1.insert(6,process.DiMuonMassValidation)
0311 
0312 ###################################################################
0313 # preprend the filter for unit tests
0314 ###################################################################
0315 if(options.unitTest and not options.isDiMuonData):
0316     process.p1.insert(0, process.preAnaSeq)
0317 
0318 
0319 
0320