Back to home page

Project CMSSW displayed by LXR

 
 

    


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

0001 from __future__ import print_function
0002 from fnmatch import fnmatch
0003 import FWCore.ParameterSet.Config as cms
0004 import FWCore.PythonUtilities.LumiList as LumiList
0005 import FWCore.Utilities.FileUtils as FileUtils
0006 from FWCore.ParameterSet.VarParsing import VarParsing
0007 from Alignment.OfflineValidation.TkAlAllInOneTool.defaultInputFiles_cff import filesDefaultMC_DoubleMuon_string
0008 
0009 import sys
0010 import json
0011 import os
0012 
0013 ###################################################################
0014 # Define process
0015 ###################################################################
0016 process = cms.Process("DiMuonVertexValidation")
0017 
0018 ###################################################################
0019 # Argument parsing
0020 ###################################################################
0021 options = VarParsing()
0022 options.register("config", "", VarParsing.multiplicity.singleton, VarParsing.varType.string , "AllInOne config")
0023 
0024 options.parseArguments()
0025 
0026 ###################################################################
0027 # Read in AllInOne config in JSON format
0028 ###################################################################
0029 if options.config == "":
0030     config = {"validation": {},
0031               "alignment": {}}
0032 else:
0033     with open(options.config, "r") as configFile:
0034         config = json.load(configFile)
0035 
0036 isMC = config["validation"].get("ismc", True)
0037 
0038 ###################################################################
0039 # Read filenames from given TXT file and define input source
0040 ###################################################################
0041 readFiles = []
0042 
0043 if "dataset" in config["validation"]:
0044     with open(config["validation"]["dataset"], "r") as datafiles:
0045         for fileName in datafiles.readlines():
0046             readFiles.append(fileName.replace("\n", ""))
0047 
0048     process.source = cms.Source("PoolSource",
0049                                 fileNames = cms.untracked.vstring(readFiles),
0050                                 skipEvents = cms.untracked.uint32(0))
0051 else:
0052     process.source = cms.Source("PoolSource",
0053                                 fileNames = cms.untracked.vstring(filesDefaultMC_DoubleMuon_string),
0054                                 skipEvents = cms.untracked.uint32(0))
0055 
0056 ###################################################################
0057 # Get good lumi section and load data or handle MC
0058 ###################################################################
0059 if "goodlumi" in config["validation"]:
0060     if os.path.isfile(config["validation"]["goodlumi"]):
0061         goodLumiSecs = cms.untracked.VLuminosityBlockRange(LumiList.LumiList(filename = config["validation"]["goodlumi"]).getCMSSWString().split(','))
0062         
0063     else:
0064         print("Does not exist: {}. Continue without good lumi section file.")
0065         goodLumiSecs = cms.untracked.VLuminosityBlockRange()
0066 
0067 else:
0068     goodLumiSecs = cms.untracked.VLuminosityBlockRange()
0069 
0070 if isMC:
0071     pass
0072 else:
0073     process.source.lumisToProcess = goodLumiSecs
0074 
0075 ###################################################################
0076 ## efault set to 1 for unit tests
0077 ###################################################################
0078 process.maxEvents = cms.untracked.PSet(input = cms.untracked.int32(config["validation"].get("maxevents", 100)))
0079 
0080 ###################################################################
0081 # Bookeeping
0082 ###################################################################
0083 process.options = cms.untracked.PSet(
0084    wantSummary = cms.untracked.bool(False),
0085    Rethrow = cms.untracked.vstring("ProductNotFound"),
0086    fileMode  =  cms.untracked.string('NOMERGE'),
0087 )
0088 
0089 ###################################################################
0090 # Messages
0091 ###################################################################
0092 process.load('FWCore.MessageService.MessageLogger_cfi')   
0093 process.MessageLogger.cerr.enable = False
0094 process.MessageLogger.TrackRefitter=dict()
0095 process.MessageLogger.PrimaryVertexProducer=dict()
0096 process.MessageLogger.DiMuonVertexValidation=dict()
0097 process.MessageLogger.DiLeptonHelpCounts=dict()
0098 process.MessageLogger.PlotsVsKinematics=dict()
0099 process.MessageLogger.cout = cms.untracked.PSet(
0100     enable = cms.untracked.bool(True),
0101     threshold = cms.untracked.string("INFO"),
0102     default   = cms.untracked.PSet(limit = cms.untracked.int32(0)),                       
0103     FwkReport = cms.untracked.PSet(limit = cms.untracked.int32(-1),
0104                                    reportEvery = cms.untracked.int32(100)
0105                                    ),                                                      
0106     DiMuonVertexValidation = cms.untracked.PSet( limit = cms.untracked.int32(-1)),
0107     DiLeptonHelpCounts = cms.untracked.PSet( limit = cms.untracked.int32(-1)),
0108     enableStatistics = cms.untracked.bool(True)
0109     )
0110 
0111 ###################################################################
0112 # import of standard configurations
0113 ###################################################################
0114 process.load('Configuration.StandardSequences.Services_cff')
0115 process.load('Configuration.StandardSequences.GeometryRecoDB_cff')
0116 process.load('Configuration.StandardSequences.MagneticField_AutoFromDBCurrent_cff')
0117 process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff')
0118 
0119 ###################################################################
0120 # TransientTrack from https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideTransientTracks
0121 ###################################################################
0122 process.load("TrackingTools.TransientTrack.TransientTrackBuilder_cfi")
0123 process.load('TrackPropagation.SteppingHelixPropagator.SteppingHelixPropagatorOpposite_cfi')
0124 process.load('TrackPropagation.SteppingHelixPropagator.SteppingHelixPropagatorAlong_cfi')
0125 process.load('TrackingTools.TrackAssociator.DetIdAssociatorESProducer_cff')
0126 
0127 ####################################################################
0128 # Get the BeamSpot
0129 ####################################################################
0130 process.load("RecoVertex.BeamSpotProducer.BeamSpot_cff")
0131 
0132 ####################################################################
0133 # Global tag
0134 ####################################################################
0135 process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff")
0136 from Configuration.AlCa.GlobalTag import GlobalTag
0137 # default to remain in sycn with the default input sample
0138 process.GlobalTag = GlobalTag(process.GlobalTag, config["alignment"].get("globaltag", "auto:phase1_2022_realistic"))
0139 
0140 ####################################################################
0141 # Load conditions if wished
0142 ####################################################################
0143 if "conditions" in config["alignment"]:
0144     from CalibTracker.Configuration.Common.PoolDBESSource_cfi import poolDBESSource
0145 
0146     for condition in config["alignment"]["conditions"]:
0147         setattr(process, "conditionsIn{}".format(condition), poolDBESSource.clone(
0148              connect = cms.string(str(config["alignment"]["conditions"][condition]["connect"])),
0149              toGet = cms.VPSet(
0150                         cms.PSet(
0151                                  record = cms.string(str(condition)),
0152                                  tag = cms.string(str(config["alignment"]["conditions"][condition]["tag"]))
0153                         )
0154                      )
0155             )
0156         )
0157 
0158         setattr(process, "prefer_conditionsIn{}".format(condition), cms.ESPrefer("PoolDBESSource", "conditionsIn{}".format(condition)))
0159 
0160 ###################################################################
0161 # refitting the muon tracks
0162 ###################################################################
0163 process.load("RecoTracker.TrackProducer.TrackRefitters_cff")
0164 import RecoTracker.TrackProducer.TrackRefitters_cff
0165 process.refittedMuons = RecoTracker.TrackProducer.TrackRefitter_cfi.TrackRefitter.clone(
0166     src = config["validation"].get("muonTrackcollection", "ALCARECOTkAlDiMuon"), # ALCARECOTkAlDiMuon
0167     TrajectoryInEvent = True,
0168     NavigationSchool = '',
0169     TTRHBuilder = config["validation"].get("tthrbuilder", "WithAngleAndTemplate"))
0170 
0171 ###################################################################
0172 # refitting the vertex tracks
0173 ###################################################################
0174 process.refittedVtxTracks = RecoTracker.TrackProducer.TrackRefitter_cfi.TrackRefitter.clone(
0175     src = config["validation"].get("trackcollection", "generalTracks"), # ALCARECOTkAlDiMuonVertexTracks
0176     TrajectoryInEvent = True,
0177     NavigationSchool = '',
0178     TTRHBuilder = config["validation"].get("tthrbuilder", "WithAngleAndTemplate"))
0179 
0180 ####################################################################
0181 # Re-do vertices
0182 ####################################################################
0183 from RecoVertex.PrimaryVertexProducer.OfflinePrimaryVertices_cfi import offlinePrimaryVertices
0184 process.offlinePrimaryVerticesFromRefittedTrks = offlinePrimaryVertices.clone()
0185 process.offlinePrimaryVerticesFromRefittedTrks.TrackLabel = cms.InputTag("refittedVtxTracks")
0186 
0187 ####################################################################
0188 # Sequence
0189 ####################################################################
0190 process.seqRefitting = cms.Sequence(process.offlineBeamSpot   +
0191                                     process.refittedMuons     +
0192                                     process.refittedVtxTracks +
0193                                     process.offlinePrimaryVerticesFromRefittedTrks)
0194 
0195 ####################################################################
0196 # Output file
0197 ####################################################################
0198 process.TFileService = cms.Service("TFileService",
0199                                    fileName = cms.string("{}/DiMuonVertexValidation.root".format(config.get("output", os.getcwd()))),
0200                                    closeFileFast = cms.untracked.bool(True))
0201 
0202 ####################################################################
0203 # Analysis module
0204 ####################################################################
0205 from Alignment.OfflineValidation.diMuonVertexValidation_cfi import diMuonVertexValidation
0206 process.DiMuonVertexValidation = diMuonVertexValidation.clone(useReco = config["validation"].get("useReco",True),
0207                                                               vertices = 'offlinePrimaryVerticesFromRefittedTrks')
0208 
0209 ## the two sets of parameters below are mutually exclusive,
0210 ## depending if RECO or ALCARECO is used
0211 ## the useReco flag above must be set accordingly
0212 if (config["validation"].get("useReco",True)):
0213     print("I AM USING RECO DATA-TIER")
0214     process.DiMuonVertexValidation.muons  = 'muons'
0215     process.DiMuonVertexValidation.tracks = 'refittedVtxTracks'
0216 else:
0217     print("I AM USING ALCARECO DATA-TIER")
0218     if(hasattr(process.DiMuonVertexValidation,'muons')):
0219         delattr(process.DiMuonVertexValidation,'muons')
0220     process.DiMuonVertexValidation.muonTracks = cms.InputTag('refittedMuons')
0221 
0222 ####################################################################
0223 # Path
0224 ####################################################################
0225 process.p = cms.Path(process.seqRefitting                            +
0226                      process.offlinePrimaryVerticesFromRefittedTrks  +
0227                      process.DiMuonVertexValidation)
0228 
0229 print("# Done")