Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-23 23:39:50

0001 import glob
0002 import math
0003 import FWCore.ParameterSet.Config as cms
0004 import FWCore.Utilities.FileUtils as FileUtils
0005 from FWCore.ParameterSet.VarParsing import VarParsing
0006 from Alignment.OfflineValidation.TkAlAllInOneTool.defaultInputFiles_cff import filesDefaultMC_DoubleMuon_string
0007 
0008 options = VarParsing('analysis')
0009 options.register('scenario', 
0010                  'null',
0011                  VarParsing.multiplicity.singleton,
0012                  VarParsing.varType.string,
0013                  "Name of input misalignment scenario")
0014 
0015 options.register('globalTag',
0016                  "125X_mcRun3_2022_design_v6", # default value
0017                  VarParsing.multiplicity.singleton, # singleton or list
0018                  VarParsing.varType.string, # string, int, or float
0019                  "name of the input Global Tag")
0020 
0021 options.register ('myfile',
0022                   filesDefaultMC_DoubleMuon_string, # default value
0023                   VarParsing.multiplicity.singleton,
0024                   VarParsing.varType.string,
0025                   "file name")
0026 
0027 options.register ('fromRECO',
0028                   True, # default value
0029                   VarParsing.multiplicity.singleton,
0030                   VarParsing.varType.bool,
0031                   "start from RECO data-tier, if False it will use TkAlDiMuonAndVertex ALCARECO")
0032 
0033 options.register ('FileList',
0034                   '', # default value
0035                   VarParsing.multiplicity.singleton, 
0036                   VarParsing.varType.string,
0037                   "FileList in DAS format")
0038 
0039 options.parseArguments()
0040 
0041 if(options.FileList):
0042     print("FileList:           ", options.FileList)
0043 else:
0044     print("inputFile:          ", options.myfile)
0045 print("outputFile:         ", "ZmmNtuple_MC_GEN-SIM_{fscenario}.root".format(fscenario=options.scenario))
0046 print("conditionGT:        ", options.globalTag)
0047 print("max events:         ", options.maxEvents)
0048 
0049 valid_scenarios = ['-10e-6','-8e-6','-6e-6','-4e-6','-2e-6','0','2e-6','4e-6','6e-6','8e-6','10e-6','null']
0050 
0051 if options.scenario not in valid_scenarios:
0052     print("Error: Invalid scenario specified. Please choose from the following list: ")
0053     print(valid_scenarios)
0054     exit(1)
0055 
0056 process = cms.Process("SagittaBiasNtuplizer")
0057 
0058 ###################################################################
0059 # Set the process to run multi-threaded
0060 ###################################################################
0061 process.options.numberOfThreads = 8
0062 
0063 ###################################################################
0064 # Message logger service
0065 ###################################################################
0066 process.load("FWCore.MessageLogger.MessageLogger_cfi")
0067 process.MessageLogger.cerr.enable = False
0068 process.MessageLogger.SagittaBiasNtuplizer=dict()  
0069 process.MessageLogger.cout = cms.untracked.PSet(
0070     enable = cms.untracked.bool(True),
0071     threshold = cms.untracked.string("INFO"),
0072     default   = cms.untracked.PSet(limit = cms.untracked.int32(0)),                       
0073     FwkReport = cms.untracked.PSet(limit = cms.untracked.int32(-1),
0074                                    reportEvery = cms.untracked.int32(1000)
0075                                    ),                                                      
0076     SagittaBiasNtuplizer = cms.untracked.PSet( limit = cms.untracked.int32(-1)),
0077     enableStatistics = cms.untracked.bool(True)
0078     )
0079 
0080 ###################################################################
0081 # Geometry producer and standard includes
0082 ###################################################################
0083 process.load("RecoVertex.BeamSpotProducer.BeamSpot_cff")
0084 process.load("Configuration.StandardSequences.Services_cff")
0085 process.load("Configuration.StandardSequences.GeometryRecoDB_cff")
0086 process.load('Configuration.StandardSequences.MagneticField_cff')
0087 process.load("CondCore.CondDB.CondDB_cfi")
0088 
0089 ###################################################################
0090 # TransientTrack from https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideTransientTracks
0091 ###################################################################
0092 process.load("TrackingTools.TransientTrack.TransientTrackBuilder_cfi")
0093 process.load('TrackPropagation.SteppingHelixPropagator.SteppingHelixPropagatorOpposite_cfi')
0094 process.load('TrackPropagation.SteppingHelixPropagator.SteppingHelixPropagatorAlong_cfi')
0095 process.load('TrackingTools.TrackAssociator.DetIdAssociatorESProducer_cff')
0096 
0097 ####################################################################
0098 # Get the GlogalTag
0099 ####################################################################
0100 process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff")
0101 from Configuration.AlCa.GlobalTag import GlobalTag
0102 process.GlobalTag = GlobalTag(process.GlobalTag, options.globalTag, '')
0103 if (options.scenario=='null'):
0104     print("null scenario, do nothing")
0105     pass
0106 elif (options.scenario=='ideal'):
0107     print("ideal scenario, use ideal tags")
0108     process.GlobalTag.toGet = cms.VPSet(cms.PSet(record = cms.string('TrackerAlignmentRcd'),
0109                                                  tag = cms.string("TrackerAlignment_Upgrade2017_design_v4")),
0110                                         cms.PSet(record = cms.string('TrackerAlignmentErrorExtendedRcd'),
0111                                                  tag = cms.string("TrackerAlignmentErrorsExtended_Upgrade2017_design_v0")),
0112                                         cms.PSet(record = cms.string('TrackerSurfaceDeformationRcd'),
0113                                                  tag = cms.string("TrackerSurfaceDeformations_zero")))
0114 else :
0115     print("using {} scenario".format(options.scenario))
0116     process.GlobalTag.toGet = cms.VPSet(cms.PSet(connect = cms.string("sqlite_file:/afs/cern.ch/user/m/musich/public/layer_rotation_studies/outputfile_"+options.scenario+".db"),                                             
0117                                                  record = cms.string('TrackerAlignmentRcd'),
0118                                                  tag = cms.string("Alignments")))
0119 
0120 ###################################################################
0121 # Source
0122 ###################################################################
0123 if(options.FileList):
0124     print('Loading file list from ASCII file')
0125     filelist = FileUtils.loadListFromFile (options.FileList)
0126     readFiles = cms.untracked.vstring( *filelist)
0127 else:
0128     readFiles = cms.untracked.vstring([options.myfile])
0129 
0130 process.source = cms.Source("PoolSource",
0131                             fileNames = readFiles)
0132 
0133 process.maxEvents = cms.untracked.PSet(input = cms.untracked.int32(options.maxEvents))
0134 
0135 ###################################################################
0136 # Alignment Track Selector
0137 ###################################################################
0138 import Alignment.CommonAlignmentProducer.AlignmentTrackSelector_cfi
0139 process.MuSkimSelector = Alignment.CommonAlignmentProducer.AlignmentTrackSelector_cfi.AlignmentTrackSelector.clone(
0140     applyBasicCuts = True,                                                                            
0141     filter = True,
0142     src = "ALCARECOTkAlDiMuon",
0143     ptMin = 17.,
0144     pMin = 17.,
0145     etaMin = -2.5,
0146     etaMax = 2.5,
0147     d0Min = -2.,
0148     d0Max = 2.,
0149     dzMin = -25.,
0150     dzMax = 25.,
0151     nHitMin = 6,
0152     nHitMin2D = 0)
0153 
0154 ###################################################################
0155 # refitting the muon tracks
0156 ###################################################################
0157 process.load("RecoTracker.TrackProducer.TrackRefitters_cff")
0158 import RecoTracker.TrackProducer.TrackRefitters_cff
0159 process.refittedMuons = RecoTracker.TrackProducer.TrackRefitter_cfi.TrackRefitter.clone(
0160     src = "ALCARECOTkAlDiMuon",
0161     TrajectoryInEvent = True,
0162     NavigationSchool = '',
0163     TTRHBuilder = "WithAngleAndTemplate")
0164 
0165 ###################################################################
0166 # refitting the vertex tracks
0167 ###################################################################
0168 process.refittedVtxTracks = RecoTracker.TrackProducer.TrackRefitter_cfi.TrackRefitter.clone(
0169     src = "ALCARECOTkAlDiMuonVertexTracks",
0170     TrajectoryInEvent = True,
0171     NavigationSchool = '',
0172     TTRHBuilder = "WithAngleAndTemplate")
0173 
0174 ###################################################################
0175 # refitting all tracks
0176 ###################################################################
0177 process.refittedTracks = RecoTracker.TrackProducer.TrackRefitter_cfi.TrackRefitter.clone(
0178     src = "generalTracks",
0179     TrajectoryInEvent = True,
0180     NavigationSchool = '',
0181     TTRHBuilder = "WithAngleAndTemplate")
0182 
0183 ####################################################################
0184 # Re-do vertices
0185 ####################################################################
0186 from RecoVertex.PrimaryVertexProducer.OfflinePrimaryVertices_cfi import offlinePrimaryVertices
0187 process.offlinePrimaryVerticesFromRefittedTrks = offlinePrimaryVertices.clone()
0188 process.offlinePrimaryVerticesFromRefittedTrks.TrackLabel = "refittedTracks" if options.fromRECO else "refittedVtxTracks"
0189 
0190 ###################################################################
0191 # The analysis modules
0192 ###################################################################
0193 process.ZtoMMNtuple = cms.EDAnalyzer("SagittaBiasNtuplizer",
0194                                      useReco = cms.bool(options.fromRECO),
0195                                      doGen = cms.bool(True),
0196                                      vertices = cms.InputTag('offlinePrimaryVerticesFromRefittedTrks'),
0197                                      **({
0198                                          "muons": cms.InputTag('muons'),
0199                                          "tracks": cms.InputTag('refittedTracks')
0200                                      } if options.fromRECO else {
0201                                          "muonTracks": cms.InputTag('refittedMuons'),
0202                                          "genParticles": cms.InputTag('TkAlDiMuonAndVertexGenMuonSelector')
0203                                      }))
0204 
0205 process.DiMuonVertexValidation = cms.EDAnalyzer("DiMuonVertexValidation",
0206                                                 useReco = cms.bool(options.fromRECO),
0207                                                 vertices = cms.InputTag('offlinePrimaryVerticesFromRefittedTrks'),
0208                                                 **({
0209                                                     "muons": cms.InputTag('muons'),
0210                                                     "tracks" : cms.InputTag("generalTracks")
0211                                                 } if options.fromRECO else {
0212                                                     "muonTracks": cms.InputTag('refittedMuons'),
0213                                                     "tracks": cms.InputTag('')
0214                                                 }))
0215                                     
0216 from Alignment.OfflineValidation.diMuonValidation_cfi import diMuonValidation as _diMuonValidation
0217 process.DiMuonMassValidation = _diMuonValidation.clone(
0218     TkTag = 'refittedMuons',
0219     #TkTag = 'TrackRefitter1',
0220     # mu mu mass
0221     Pair_mass_min   = 80.,
0222     Pair_mass_max   = 120.,
0223     Pair_mass_nbins = 80,
0224     Pair_etaminpos  = -2.4,
0225     Pair_etamaxpos  = 2.4,
0226     Pair_etaminneg  = -2.4,
0227     Pair_etamaxneg  = 2.4,
0228     # cosTheta CS
0229     Variable_CosThetaCS_xmin  = -1.,
0230     Variable_CosThetaCS_xmax  =  1.,
0231     Variable_CosThetaCS_nbins = 20,
0232     # DeltaEta
0233     Variable_DeltaEta_xmin  = -4.8,
0234     Variable_DeltaEta_xmax  = 4.8,
0235     Variable_DeltaEta_nbins = 20,
0236     # EtaMinus
0237     Variable_EtaMinus_xmin  = -2.4,
0238     Variable_EtaMinus_xmax  =  2.4,
0239     Variable_EtaMinus_nbins = 12,
0240     # EtaPlus
0241     Variable_EtaPlus_xmin  = -2.4,
0242     Variable_EtaPlus_xmax  =  2.4,
0243     Variable_EtaPlus_nbins = 12,
0244     # Phi CS
0245     Variable_PhiCS_xmin  = -math.pi/2.,
0246     Variable_PhiCS_xmax  =  math.pi/2.,
0247     Variable_PhiCS_nbins = 20,
0248     # Phi Minus
0249     Variable_PhiMinus_xmin  = -math.pi,
0250     Variable_PhiMinus_xmax  =  math.pi,
0251     Variable_PhiMinus_nbins = 16,
0252     # Phi Plus
0253     Variable_PhiPlus_xmin  = -math.pi,
0254     Variable_PhiPlus_xmax  =  math.pi,
0255     Variable_PhiPlus_nbins = 16,
0256     # mu mu pT
0257     Variable_PairPt_xmin  = 0.,
0258     Variable_PairPt_xmax  = 100.,
0259     Variable_PairPt_nbins = 100)
0260 
0261 ###################################################################
0262 # Output name
0263 ###################################################################
0264 process.TFileService = cms.Service("TFileService",
0265                                    fileName = cms.string("ZmmNtuple_MC_GEN-SIM_"+options.scenario+".root"))
0266 
0267 ###################################################################
0268 # Path
0269 ###################################################################
0270 process.p1 = cms.Path(
0271     process.offlineBeamSpot *
0272     (process.refittedTracks if options.fromRECO else process.refittedMuons * process.refittedVtxTracks) *
0273     process.offlinePrimaryVerticesFromRefittedTrks *
0274     process.ZtoMMNtuple *
0275     process.DiMuonVertexValidation *
0276     (process.DiMuonMassValidation if not options.fromRECO else cms.Sequence())
0277 )