Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-08 03:35:45

0001 
0002 import FWCore.ParameterSet.Config as cms
0003 import FWCore.PythonUtilities.LumiList as LumiList
0004 from Alignment.OfflineValidation.TkAlAllInOneTool.defaultInputFiles_cff import filesDefaultData_HLTPhys2024I
0005 
0006 from FWCore.ParameterSet.VarParsing import VarParsing
0007 
0008 from Alignment.OfflineValidation.TkAlAllInOneTool.utils import _byteify
0009 import json
0010 import os
0011 
0012 ##Define process
0013 process = cms.Process("PrimaryVertexValidation")
0014 
0015 ##Argument parsing
0016 options = VarParsing()
0017 options.register("config", "", VarParsing.multiplicity.singleton, VarParsing.varType.string , "AllInOne config")
0018 
0019 options.parseArguments()
0020 
0021 ##Read in AllInOne config in JSON format
0022 if options.config == "":
0023     config = {"validation": {},
0024               "alignment": {}}
0025 else:
0026     with open(options.config, "r") as configFile:
0027         config = json.load(configFile)
0028 
0029 isDA = config["validation"].get("isda", True)
0030 isMC = config["validation"].get("ismc", True)
0031 
0032 runboundary = config["validation"].get("runboundary", 1)
0033 
0034 ##Read filenames from given TXT file and define input source
0035 readFiles = []
0036 
0037 if "dataset" in config["validation"]:
0038     with open(config["validation"]["dataset"], "r") as datafiles:
0039         for fileName in datafiles.readlines():
0040             readFiles.append(fileName.replace("\n", ""))
0041 
0042     process.source = cms.Source("PoolSource",
0043                                 fileNames = cms.untracked.vstring(readFiles),
0044                                 skipEvents = cms.untracked.uint32(0)
0045                             )
0046 else:
0047     print(">>>>>>>>>> PV_cfg.py: msg%-i: config not specified! Loading default dataset -> filesDefaultData_HLTPhys2024I!")
0048     process.source = cms.Source("PoolSource",
0049                                 fileNames = filesDefaultData_HLTPhys2024I,
0050                                 skipEvents = cms.untracked.uint32(0)
0051                             )
0052 
0053 ##Get good lumi section and load data or handle MC
0054 if "goodlumi" in config["validation"]:
0055     if os.path.isfile(config["validation"]["goodlumi"]):
0056         goodLumiSecs = cms.untracked.VLuminosityBlockRange(LumiList.LumiList(filename = config["validation"]["goodlumi"]).getCMSSWString().split(','))
0057         
0058     else:
0059         print("Does not exist: {}. Continue without good lumi section file.")
0060         goodLumiSecs = cms.untracked.VLuminosityBlockRange()
0061 
0062 else:
0063     goodLumiSecs = cms.untracked.VLuminosityBlockRange()
0064 
0065 if isMC:
0066      print(">>>>>>>>>> PV_cfg.py: msg%-i: This is simulation!")
0067      runboundary = 1
0068 else:
0069      process.source.lumisToProcess = goodLumiSecs
0070 
0071 isMultipleRuns=False
0072 if(isinstance(runboundary, (list, tuple))):
0073      isMultipleRuns=True
0074      print("Multiple Runs are selected")       
0075 if(isMultipleRuns):
0076      process.source.firstRun = cms.untracked.uint32(runboundary[0])
0077 else:
0078      process.source.firstRun = cms.untracked.uint32(runboundary)
0079 
0080 ##default set to 1 for unit tests
0081 process.maxEvents = cms.untracked.PSet(input = cms.untracked.int32(config["validation"].get("maxevents", 1)))
0082 
0083 ##Bookeeping
0084 process.options = cms.untracked.PSet(
0085    wantSummary = cms.untracked.bool(False),
0086    Rethrow = cms.untracked.vstring("ProductNotFound"),
0087    fileMode  =  cms.untracked.string('NOMERGE'),
0088 )
0089 
0090 process.load("FWCore.MessageLogger.MessageLogger_cfi")
0091 process.MessageLogger = cms.Service("MessageLogger",
0092                                     destinations   = cms.untracked.vstring('cerr'),
0093                                     cerr       = cms.untracked.PSet(threshold = cms.untracked.string('INFO'))
0094                                    )
0095 
0096 ##Basic modules
0097 process.load("RecoVertex.BeamSpotProducer.BeamSpot_cff")
0098 process.load("Configuration.Geometry.GeometryRecoDB_cff") #or process.load("Configuration.Geometry.GeometryDB_cff")?????
0099 process.load('Configuration.StandardSequences.Services_cff')
0100 process.load("Configuration.StandardSequences.MagneticField_cff")
0101 
0102 ####################################################################
0103 # Produce the Transient Track Record in the event
0104 ####################################################################
0105 process.load("TrackingTools.TransientTrack.TransientTrackBuilder_cfi")
0106 
0107 ####################################################################
0108 # Load and Configure Common Track Selection and refitting sequence
0109 ####################################################################
0110 import Alignment.CommonAlignment.tools.trackselectionRefitting as trackselRefit
0111 process.seqTrackselRefit = trackselRefit.getSequence(process,
0112                                                      config["validation"].get("trackcollection", "ALCARECOTkAlMinBias"),
0113                                                      isPVValidation=True,
0114                                                      TTRHBuilder=config["validation"].get("tthrbuilder", "WithAngleAndTemplate"),
0115                                                      usePixelQualityFlag=config["validation"].get("usePixelQualityFlag", True),
0116                                                      openMassWindow=False,
0117                                                      cosmicsDecoMode=True,
0118                                                      cosmicsZeroTesla=config["validation"].get("cosmicsZeroTesla", False),                                                     
0119                                                      momentumConstraint=None,
0120                                                      cosmicTrackSplitting=False,
0121                                                      use_d0cut=False,
0122                                                      )
0123 
0124 #Global tag
0125 process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff")
0126 from Configuration.AlCa.GlobalTag import GlobalTag
0127 process.GlobalTag = GlobalTag(process.GlobalTag, config["alignment"].get("globaltag", "140X_dataRun3_Prompt_v4"))
0128 
0129 ##Load conditions if wished
0130 if "conditions" in config["alignment"]:
0131     from CalibTracker.Configuration.Common.PoolDBESSource_cfi import poolDBESSource
0132 
0133     for condition in config["alignment"]["conditions"]:
0134         setattr(process, "conditionsIn{}".format(condition), poolDBESSource.clone(
0135              connect = cms.string(str(config["alignment"]["conditions"][condition]["connect"])),
0136              toGet = cms.VPSet(
0137                         cms.PSet(
0138                                  record = cms.string(str(condition)),
0139                                  tag = cms.string(str(config["alignment"]["conditions"][condition]["tag"]))
0140                         )
0141                      )
0142             )
0143         )
0144 
0145         setattr(process, "prefer_conditionsIn{}".format(condition), cms.ESPrefer("PoolDBESSource", "conditionsIn{}".format(condition)))
0146 
0147 ####################################################################
0148 # Load and Configure event selection
0149 ####################################################################
0150 process.primaryVertexFilter = cms.EDFilter("VertexSelector",
0151                                            src = cms.InputTag(config["validation"].get("vertexcollection", "offlinePrimaryVertices")),
0152                                            cut = cms.string("!isFake && ndof > 4 && abs(z) <= 24 && position.Rho <= 2"),
0153                                            filter = cms.bool(True)
0154                                            )
0155 
0156 process.noscraping = cms.EDFilter("FilterOutScraping",
0157                                   applyfilter = cms.untracked.bool(True),
0158                                   src = cms.untracked.InputTag(config["validation"].get("trackcollection", "ALCARECOTkAlMinBias")),
0159                                   debugOn = cms.untracked.bool(False),
0160                                   numtrack = cms.untracked.uint32(10),
0161                                   thresh = cms.untracked.double(0.25)
0162                                   )
0163 
0164 ###################################################################
0165 # Beamspot compatibility check
0166 ###################################################################
0167 from RecoVertex.BeamSpotProducer.beamSpotCompatibilityChecker_cfi import beamSpotCompatibilityChecker
0168 process.BeamSpotChecker = beamSpotCompatibilityChecker.clone(
0169     bsFromEvent = "offlineBeamSpot::RECO",  # source of the event beamspot (in the ALCARECO files)
0170     bsFromDB = "offlineBeamSpot",           # source of the DB beamspot (from Global Tag) NOTE: only if dbFromEvent is True!
0171     warningThr = config["validation"].get("bsIncompatibleWarnThresh", 3), # significance threshold to emit a warning message
0172     errorThr = config["validation"].get("bsIncompatibleErrThresh", 5),    # significance threshold to abort the job
0173 )
0174 
0175 process.load("Alignment.CommonAlignment.filterOutLowPt_cfi")
0176 process.filterOutLowPt.src = cms.untracked.InputTag(config["validation"].get("trackcollection", "ALCARECOTkAlMinBias"))
0177 process.filterOutLowPt.ptmin = cms.untracked.double(config["validation"].get("ptCut", 3.))
0178 process.filterOutLowPt.runControl = False
0179 if(isMultipleRuns):
0180      process.filterOutLowPt.runControlNumber.extend((runboundary))
0181 else:
0182      process.filterOutLowPt.runControlNumber = [runboundary]
0183 
0184 if isMC:
0185      process.goodvertexSkim = cms.Sequence(process.BeamSpotChecker + process.noscraping + process.filterOutLowPt)
0186 else:
0187      process.goodvertexSkim = cms.Sequence(process.BeamSpotChecker + process.primaryVertexFilter + process.noscraping + process.filterOutLowPt)
0188 
0189 
0190 ####################################################################
0191 # Imports of parameters
0192 ####################################################################
0193 from RecoVertex.PrimaryVertexProducer.OfflinePrimaryVertices_cfi import offlinePrimaryVertices
0194 ## modify the parameters which differ
0195 FilteringParams = offlinePrimaryVertices.TkFilterParameters.clone(
0196      maxNormalizedChi2 = 5.0,  # chi2ndof < 5
0197      maxD0Significance = 5.0,  # fake cut (requiring 1 PXB hit)
0198      maxEta = 5.0,             # as per recommendation in PR #18330
0199 )
0200 
0201 ## MM 04.05.2017 (use settings as in: https://github.com/cms-sw/cmssw/pull/18330)
0202 from RecoVertex.PrimaryVertexProducer.OfflinePrimaryVertices_cfi import DA_vectParameters
0203 DAClusterizationParams = DA_vectParameters.clone()
0204 
0205 GapClusterizationParams = cms.PSet(algorithm   = cms.string('gap'),
0206                                    TkGapClusParameters = cms.PSet(zSeparation = cms.double(0.2))  # 0.2 cm max separation betw. clusters
0207                                    )
0208 
0209 ####################################################################
0210 # Deterministic annealing clustering or Gap clustering
0211 ####################################################################
0212 def switchClusterizerParameters(da):
0213      if da:
0214           print(">>>>>>>>>> testPVValidation_cfg.py: msg%-i: Running DA Algorithm!")
0215           return DAClusterizationParams
0216      else:
0217           print(">>>>>>>>>> testPVValidation_cfg.py: msg%-i: Running GAP Algorithm!")
0218           return GapClusterizationParams
0219 
0220 ####################################################################
0221 # Configure the PVValidation Analyzer module
0222 ####################################################################
0223 from Alignment.OfflineValidation.primaryVertexValidation_cfi import primaryVertexValidation  as _primaryVertexValidation
0224 process.PVValidation = _primaryVertexValidation.clone(
0225     TrackCollectionTag = "FinalTrackRefitter",
0226     VertexCollectionTag = config["validation"].get("vertexcollection", "offlinePrimaryVertices"),
0227     Debug = False,
0228     storeNtuple = False,
0229     useTracksFromRecoVtx = False,
0230     isLightNtuple = True,
0231     askFirstLayerHit = False,
0232     forceBeamSpot = config["validation"].get("forceBeamSpot", False),
0233     probePt = config["validation"].get("ptCut", 3),
0234     probeEta  = config["validation"].get("etaCut", 2.5),
0235     minPt  = config["validation"].get("minPt", 1.),
0236     maxPt  = config["validation"].get("maxPt", 30.),
0237     doBPix = config["validation"].get("doBPix", True),
0238     doFPix = config["validation"].get("doFPix", True),
0239     numberOfBins = config["validation"].get("numberOfBins", 48),
0240     runControl = config["validation"].get("runControl", False),
0241     runControlNumber = [runboundary],
0242     TkFilterParameters = FilteringParams,
0243     TkClusParameters = switchClusterizerParameters(isDA)
0244 )
0245 
0246 ####################################################################
0247 # Output file
0248 ####################################################################
0249 process.TFileService = cms.Service("TFileService",
0250             fileName = cms.string("{}/PVValidation_{}_{}.root".format(config.get("output", os.getcwd()), config["alignment"].get("name", ""), config["validation"].get("IOV", 1.))),
0251             closeFileFast = cms.untracked.bool(True),
0252     )
0253 
0254 ####################################################################
0255 # Path
0256 ####################################################################
0257 process.p = cms.Path(process.goodvertexSkim*process.seqTrackselRefit*process.PVValidation)
0258 
0259 print("Done")