Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-05-23 23:48:06

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     bsFromFile = config["validation"].get("bsFromFile","offlineBeamSpot::RECO"),  # source of the event beamspot (in the ALCARECO files)
0170     bsFromDB = "offlineBeamSpot::@currentProcess", # source of the DB beamspot (from Global Tag) NOTE: only if dbFromEvent is True!
0171     dbFromEvent = True,
0172     warningThr = config["validation"].get("bsIncompatibleWarnThresh", 3), # significance threshold to emit a warning message
0173     errorThr = config["validation"].get("bsIncompatibleErrThresh", 5),    # significance threshold to abort the job
0174 )
0175 
0176 process.load("Alignment.CommonAlignment.filterOutLowPt_cfi")
0177 process.filterOutLowPt.src = cms.untracked.InputTag(config["validation"].get("trackcollection", "ALCARECOTkAlMinBias"))
0178 process.filterOutLowPt.ptmin = cms.untracked.double(config["validation"].get("ptCut", 3.))
0179 process.filterOutLowPt.runControl = False
0180 if(isMultipleRuns):
0181      process.filterOutLowPt.runControlNumber.extend((runboundary))
0182 else:
0183      process.filterOutLowPt.runControlNumber = [runboundary]
0184 
0185 if isMC:
0186      process.goodvertexSkim = cms.Sequence(process.noscraping + process.filterOutLowPt)
0187 else:
0188      process.goodvertexSkim = cms.Sequence(process.primaryVertexFilter + process.noscraping + process.filterOutLowPt)
0189 
0190 
0191 ####################################################################
0192 # Imports of parameters
0193 ####################################################################
0194 from RecoVertex.PrimaryVertexProducer.OfflinePrimaryVertices_cfi import offlinePrimaryVertices
0195 ## modify the parameters which differ
0196 FilteringParams = offlinePrimaryVertices.TkFilterParameters.clone(
0197      maxNormalizedChi2 = 5.0,  # chi2ndof < 5
0198      maxD0Significance = 5.0,  # fake cut (requiring 1 PXB hit)
0199      maxEta = 5.0,             # as per recommendation in PR #18330
0200 )
0201 
0202 ## MM 04.05.2017 (use settings as in: https://github.com/cms-sw/cmssw/pull/18330)
0203 from RecoVertex.PrimaryVertexProducer.OfflinePrimaryVertices_cfi import DA_vectParameters
0204 DAClusterizationParams = DA_vectParameters.clone()
0205 
0206 GapClusterizationParams = cms.PSet(algorithm   = cms.string('gap'),
0207                                    TkGapClusParameters = cms.PSet(zSeparation = cms.double(0.2))  # 0.2 cm max separation betw. clusters
0208                                    )
0209 
0210 ####################################################################
0211 # Deterministic annealing clustering or Gap clustering
0212 ####################################################################
0213 def switchClusterizerParameters(da):
0214      if da:
0215           print(">>>>>>>>>> testPVValidation_cfg.py: msg%-i: Running DA Algorithm!")
0216           return DAClusterizationParams
0217      else:
0218           print(">>>>>>>>>> testPVValidation_cfg.py: msg%-i: Running GAP Algorithm!")
0219           return GapClusterizationParams
0220 
0221 ####################################################################
0222 # Configure the PVValidation Analyzer module
0223 ####################################################################
0224 from Alignment.OfflineValidation.primaryVertexValidation_cfi import primaryVertexValidation  as _primaryVertexValidation
0225 process.PVValidation = _primaryVertexValidation.clone(
0226     TrackCollectionTag = "FinalTrackRefitter",
0227     VertexCollectionTag = config["validation"].get("vertexcollection", "offlinePrimaryVertices"),
0228     Debug = False,
0229     storeNtuple = False,
0230     useTracksFromRecoVtx = False,
0231     isLightNtuple = True,
0232     askFirstLayerHit = False,
0233     forceBeamSpot = config["validation"].get("forceBeamSpot", False),
0234     probePt = config["validation"].get("ptCut", 3),
0235     probeEta  = config["validation"].get("etaCut", 2.5),
0236     minPt  = config["validation"].get("minPt", 1.),
0237     maxPt  = config["validation"].get("maxPt", 30.),
0238     doBPix = config["validation"].get("doBPix", True),
0239     doFPix = config["validation"].get("doFPix", True),
0240     numberOfBins = config["validation"].get("numberOfBins", 48),
0241     runControl = config["validation"].get("runControl", False),
0242     runControlNumber = [runboundary],
0243     TkFilterParameters = FilteringParams,
0244     TkClusParameters = switchClusterizerParameters(isDA)
0245 )
0246 
0247 ####################################################################
0248 # Output file
0249 ####################################################################
0250 process.TFileService = cms.Service("TFileService",
0251             fileName = cms.string("{}/PVValidation_{}_{}.root".format(config.get("output", os.getcwd()), config["alignment"].get("name", ""), config["validation"].get("IOV", 1.))),
0252             closeFileFast = cms.untracked.bool(True),
0253     )
0254 
0255 ####################################################################
0256 # Path
0257 ####################################################################
0258 process.p = cms.Path(process.goodvertexSkim*
0259                      process.seqTrackselRefit*
0260                      process.BeamSpotChecker*
0261                      process.PVValidation)
0262 
0263 print("Done")