CMS 3D CMS Logo

customizeHLTforCMSSW.py
Go to the documentation of this file.
1 import FWCore.ParameterSet.Config as cms
2 
3 # helper functions
5 
6 # add one customisation function per PR
7 # - put the PR number into the name of the function
8 # - add a short comment
9 # for example:
10 
11 # CCCTF tuning
12 # def customiseFor12718(process):
13 # for pset in process._Process__psets.values():
14 # if hasattr(pset,'ComponentType'):
15 # if (pset.ComponentType == 'CkfBaseTrajectoryFilter'):
16 # if not hasattr(pset,'minGoodStripCharge'):
17 # pset.minGoodStripCharge = cms.PSet(refToPSet_ = cms.string('HLTSiStripClusterChargeCutNone'))
18 # return process
19 
21  """Customise the HLT to run on Run 2 data/MC using the old readout for the HCAL barel"""
22 
23  for producer in producers_by_type(process, "HBHEPhase1Reconstructor"):
24  # switch on the QI8 processing for 2018 HCAL barrel
25  producer.processQIE8 = True
26 
27  # adapt CaloTowers threshold for 2018 HCAL barrel with only one depth
28  for producer in producers_by_type(process, "CaloTowersCreator"):
29  producer.HBThreshold1 = 0.7
30  producer.HBThreshold2 = 0.7
31  producer.HBThreshold = 0.7
32 
33  # adapt Particle Flow threshold for 2018 HCAL barrel with only one depth
34  from RecoParticleFlow.PFClusterProducer.particleFlowClusterHBHE_cfi import _thresholdsHB, _thresholdsHEphase1, _seedingThresholdsHB
35 
36  logWeightDenominatorHCAL2018 = cms.VPSet(
37  cms.PSet(
38  depths = cms.vint32(1, 2, 3, 4),
39  detector = cms.string('HCAL_BARREL1'),
40  logWeightDenominator = _thresholdsHB
41  ),
42  cms.PSet(
43  depths = cms.vint32(1, 2, 3, 4, 5, 6, 7),
44  detector = cms.string('HCAL_ENDCAP'),
45  logWeightDenominator = _thresholdsHEphase1
46  )
47  )
48 
49  for producer in producers_by_type(process, "PFRecHitProducer"):
50  if producer.producers[0].name.value() == 'PFHBHERecHitCreator':
51  producer.producers[0].qualityTests[0].cuts[0].threshold = _thresholdsHB
52 
53  for producer in producers_by_type(process, "PFClusterProducer"):
54  if producer.seedFinder.thresholdsByDetector[0].detector.value() == 'HCAL_BARREL1':
55  producer.seedFinder.thresholdsByDetector[0].seedingThreshold = _seedingThresholdsHB
56  producer.initialClusteringStep.thresholdsByDetector[0].gatheringThreshold = _thresholdsHB
57  producer.pfClusterBuilder.recHitEnergyNorms[0].recHitEnergyNorm = _thresholdsHB
58  producer.pfClusterBuilder.positionCalc.logWeightDenominatorByDetector = logWeightDenominatorHCAL2018
59  producer.pfClusterBuilder.allCellsPositionCalc.logWeightDenominatorByDetector = logWeightDenominatorHCAL2018
60 
61  for producer in producers_by_type(process, "PFMultiDepthClusterProducer"):
62  producer.pfClusterBuilder.allCellsPositionCalc.logWeightDenominatorByDetector = logWeightDenominatorHCAL2018
63 
64  # done
65  return process
66 
68  """Adapt the HLT to run the legacy DT unpacking
69  for pre2018 data/MC workflows as the default"""
70 
71  if hasattr(process,'hltMuonDTDigis'):
72  process.hltMuonDTDigis = cms.EDProducer( "DTUnpackingModule",
73  useStandardFEDid = cms.bool( True ),
74  maxFEDid = cms.untracked.int32( 779 ),
75  inputLabel = cms.InputTag( "rawDataCollector" ),
76  minFEDid = cms.untracked.int32( 770 ),
77  dataType = cms.string( "DDU" ),
78  readOutParameters = cms.PSet(
79  localDAQ = cms.untracked.bool( False ),
80  debug = cms.untracked.bool( False ),
81  rosParameters = cms.PSet(
82  localDAQ = cms.untracked.bool( False ),
83  debug = cms.untracked.bool( False ),
84  writeSC = cms.untracked.bool( True ),
85  readDDUIDfromDDU = cms.untracked.bool( True ),
86  readingDDU = cms.untracked.bool( True ),
87  performDataIntegrityMonitor = cms.untracked.bool( False )
88  ),
89  performDataIntegrityMonitor = cms.untracked.bool( False )
90  ),
91  dqmOnly = cms.bool( False )
92  )
93 
94  return process
95 
97  """Customise the HLT to run on Run 2 data/MC using the old definition of the pixel calibrations
98 
99  Up to 11.0.x, the pixel calibarations were fully specified in the configuration:
100  VCaltoElectronGain = 47
101  VCaltoElectronGain_L1 = 50
102  VCaltoElectronOffset = -60
103  VCaltoElectronOffset_L1 = -670
104 
105  Starting with 11.1.x, the calibrations for Run 3 were moved to the conditions, leaving in the configuration only:
106  VCaltoElectronGain = 1
107  VCaltoElectronGain_L1 = 1
108  VCaltoElectronOffset = 0
109  VCaltoElectronOffset_L1 = 0
110 
111  Since the conditions for Run 2 have not been updated to the new scheme, the HLT configuration needs to be reverted.
112  """
113  # revert the Pixel parameters to be compatible with the Run 2 conditions
114  for producer in producers_by_type(process, "SiPixelClusterProducer"):
115  producer.VCaltoElectronGain = 47
116  producer.VCaltoElectronGain_L1 = 50
117  producer.VCaltoElectronOffset = -60
118  producer.VCaltoElectronOffset_L1 = -670
119 
120  for pluginType in ["SiPixelRawToClusterCUDA", "SiPixelRawToClusterCUDAPhase1", "SiPixelRawToClusterCUDAHIonPhase1"]:
121  for producer in producers_by_type(process, pluginType):
122  producer.VCaltoElectronGain = 47
123  producer.VCaltoElectronGain_L1 = 50
124  producer.VCaltoElectronOffset = -60
125  producer.VCaltoElectronOffset_L1 = -670
126 
127  return process
128 
130  # revert the pixel Layer 1 cluster threshold to be compatible with Run2:
131  for producer in producers_by_type(process, "SiPixelClusterProducer"):
132  if hasattr(producer,"ClusterThreshold_L1"):
133  producer.ClusterThreshold_L1 = 2000
134  for pluginType in ["SiPixelRawToClusterCUDA", "SiPixelRawToClusterCUDAPhase1", "SiPixelRawToClusterCUDAHIonPhase1"]:
135  for producer in producers_by_type(process, pluginType):
136  if hasattr(producer,"clusterThreshold_layer1"):
137  producer.clusterThreshold_layer1 = 2000
138  for producer in producers_by_type(process, "SiPixelDigisClustersFromSoA"):
139  if hasattr(producer,"clusterThreshold_layer1"):
140  producer.clusterThreshold_layer1 = 2000
141 
142  return process
143 
145  for prod in producers_by_type(process, 'CTPPSGeometryESModule'):
146  prod.isRun2 = True
147  for prod in producers_by_type(process, 'CTPPSPixelRawToDigi'):
148  prod.isRun3 = False
149 
150  return process
151 
153  for prod in producers_by_type(process, 'PFECALSuperClusterProducer'):
154  if hasattr(prod, 'regressionConfig'):
155  prod.regressionConfig.regTrainedWithPS = cms.bool(False)
156 
157  return process
158 
160  """Customisation for the HLT BeamSpot when running on Run-2 (2018) data:
161  - For Run-2 data, disable the use of the BS transient record, in order to read the BS record from SCAL.
162  - Additionally, remove all instances of OnlineBeamSpotESProducer (not needed if useTransientRecord=False).
163  - See CMSHLT-2271 and CMSHLT-2300 for further details.
164  """
165  for prod in producers_by_type(process, 'BeamSpotOnlineProducer'):
166  prod.useTransientRecord = False
167  onlineBeamSpotESPLabels = [prod.label_() for prod in esproducers_by_type(process, 'OnlineBeamSpotESProducer')]
168  for espLabel in onlineBeamSpotESPLabels:
169  delattr(process, espLabel)
170 
171  # re-introduce SCAL digis, if missing
172  if not hasattr(process, 'hltScalersRawToDigi') and hasattr(process, 'HLTBeamSpot') and isinstance(process.HLTBeamSpot, cms.Sequence):
173 
174  if hasattr(process, 'hltOnlineBeamSpot'):
175  process.hltOnlineBeamSpot.src = 'hltScalersRawToDigi'
176 
177  if hasattr(process, 'hltPixelTrackerHVOn'):
178  process.hltPixelTrackerHVOn.DcsStatusLabel = 'hltScalersRawToDigi'
179 
180  if hasattr(process, 'hltStripTrackerHVOn'):
181  process.hltStripTrackerHVOn.DcsStatusLabel = 'hltScalersRawToDigi'
182 
183  process.hltScalersRawToDigi = cms.EDProducer( "ScalersRawToDigi",
184  scalersInputTag = cms.InputTag( "rawDataCollector" )
185  )
186 
187  process.HLTBeamSpot.insert(0, process.hltScalersRawToDigi)
188 
189  return process
190 
192  """Customisation to apply the ECAL Run-2 Ultra-Legacy calibrations (CMSHLT-2339)"""
193  if hasattr(process, 'GlobalTag'):
194  if not hasattr(process.GlobalTag, 'toGet'):
195  process.GlobalTag.toGet = cms.VPSet()
196  process.GlobalTag.toGet += [
197  cms.PSet(
198  record = cms.string('EcalLaserAlphasRcd'),
199  tag = cms.string('EcalLaserAlphas_UL_Run1_Run2_2018_lastIOV_movedTo1')
200  ),
201  cms.PSet(
202  record = cms.string('EcalIntercalibConstantsRcd'),
203  tag = cms.string('EcalIntercalibConstants_UL_Run1_Run2_2018_lastIOV_movedTo1')
204  )
205  ]
206  else:
207  print('# customiseECALCalibrationsFor2018Input -- the process.GlobalTag ESSource does not exist: no customisation applied.')
208 
209  return process
210 
212  """Customise the HLT to run on Run 2 data/MC"""
213  process = customisePixelGainForRun2Input(process)
215  process = customiseHCALFor2018Input(process)
216  process = customiseCTPPSFor2018Input(process)
217  process = customiseEGammaRecoFor2018Input(process)
218  process = customiseBeamSpotFor2018Input(process)
219  process = customiseECALCalibrationsFor2018Input(process)
220 
221  return process
222 
223 
224 def customiseForOffline(process):
225  # For running HLT offline on Run-3 Data, use "(OnlineBeamSpotESProducer).timeThreshold = 1e6",
226  # in order to pick the beamspot that was actually used by the HLT (instead of a "fake" beamspot).
227  # These same settings can be used offline for Run-3 Data and Run-3 MC alike.
228  # Note: the products of the OnlineBeamSpotESProducer are used only
229  # if the configuration uses "(BeamSpotOnlineProducer).useTransientRecord = True".
230  # See CMSHLT-2271 and CMSHLT-2300 for further details.
231  for prod in esproducers_by_type(process, 'OnlineBeamSpotESProducer'):
232  prod.timeThreshold = int(1e6)
233 
234  # For running HLT offline and relieve the strain on Frontier so it will no longer inject a
235  # transaction id which tells Frontier to add a unique "&freshkey" to many query URLs.
236  # That was intended as a feature to only be used by the Online HLT, to guarantee that fresh conditions
237  # from the database were loaded at each Lumi section
238  # Seee CMSHLT-3123 for further details
239  if hasattr(process, 'GlobalTag'):
240  # Set ReconnectEachRun and RefreshEachRun to False
241  process.GlobalTag.ReconnectEachRun = cms.untracked.bool(False)
242  process.GlobalTag.RefreshEachRun = cms.untracked.bool(False)
243 
244  if hasattr(process.GlobalTag, 'toGet'):
245  # Filter out PSet objects containing only 'record' and 'refreshTime'
246  process.GlobalTag.toGet = [
247  pset for pset in process.GlobalTag.toGet
248  if set(pset.parameterNames_()) != {'record', 'refreshTime'}
249  ]
250 
251  return process
252 
253 def checkHLTfor43774(process):
254  filt_types = ["HLTEgammaGenericFilter","HLTEgammaGenericQuadraticEtaFilter","HLTEgammaGenericQuadraticFilter","HLTElectronGenericFilter"]
255  absAbleVar = ["DEta","deta","DetaSeed","Dphi","OneOESuperMinusOneOP","OneOESeedMinusOneOP"]
256  for filt_type in filt_types:
257  for filt in filters_by_type(process, filt_type):
258  if filt.varTag.productInstanceLabel in absAbleVar:
259  if (filt.useAbs != cms.bool(True)):
260  print('# TSG WARNING: check value of parameter "useAbs" in',filt,'(expect True but is False)!')
261 
262  return process
263 
264 def customizeHLTfor45302(process):
265 
266  dqmPixelRecoPathName = None
267  for pathName in process.paths_():
268  if pathName.startswith('DQM_PixelReconstruction_v'):
269  dqmPixelRecoPathName = pathName
270  break
271 
272  if dqmPixelRecoPathName == None:
273  return process
274 
275  import copy
276  from DQM.SiPixelPhase1Common.SiPixelPhase1RawData_cfi import SiPixelPhase1RawDataConf,SiPixelPhase1RawDataAnalyzer
277 
278  # PixelDigiErrors: monitor of SerialSync product
279  SiPixelPhase1RawDataConfForCPU = copy.deepcopy(SiPixelPhase1RawDataConf)
280  for pset in SiPixelPhase1RawDataConfForCPU:
281  pset.topFolderName = "SiPixelHeterogeneous/PixelErrorsCPU"
282 
283  process.hltPixelPhase1MonitorRawDataACPU = SiPixelPhase1RawDataAnalyzer.clone(
284  src = "hltSiPixelDigiErrorsSerialSync",
285  histograms = SiPixelPhase1RawDataConfForCPU
286  )
287 
288  # PixelDigiErrors: monitor of GPU product
289  SiPixelPhase1RawDataConfForGPU = copy.deepcopy(SiPixelPhase1RawDataConf)
290  for pset in SiPixelPhase1RawDataConfForGPU:
291  pset.topFolderName = "SiPixelHeterogeneous/PixelErrorsGPU"
292 
293  process.hltPixelPhase1MonitorRawDataAGPU = SiPixelPhase1RawDataAnalyzer.clone(
294  src = "hltSiPixelDigiErrors",
295  histograms = SiPixelPhase1RawDataConfForGPU
296  )
297 
298  # PixelDigiErrors: 'Alpaka' comparison
299  process.hltPixelDigiErrorsCompareGPUvsCPU = cms.EDProducer('SiPixelPhase1RawDataErrorComparator',
300  pixelErrorSrcCPU = cms.InputTag( 'hltSiPixelDigiErrorsSerialSync' ),
301  pixelErrorSrcGPU = cms.InputTag( 'hltSiPixelDigiErrors' ),
302  topFolderName = cms.string( 'SiPixelHeterogeneous/PixelErrorsCompareGPUvsCPU' )
303  )
304 
305  # Comparisons below are to change the names of the modules defined in customizeHLTforAlpaka
306  process.hltPixelRecHitsSoACompareGPUvsCPU = cms.EDProducer('SiPixelPhase1CompareRecHits',
307  pixelHitsReferenceSoA = cms.InputTag('hltSiPixelRecHitsSoASerialSync'),
308  pixelHitsTargetSoA = cms.InputTag('hltSiPixelRecHitsSoA'),
309  topFolderName = cms.string('SiPixelHeterogeneous/PixelRecHitsCompareGPUvsCPU'),
310  minD2cut = cms.double(1.0e-4)
311  )
312 
313  process.hltPixelTracksSoACompareGPUvsCPU = cms.EDProducer("SiPixelPhase1CompareTracks",
314  deltaR2cut = cms.double(0.04),
315  minQuality = cms.string('loose'),
316  pixelTrackReferenceSoA = cms.InputTag("hltPixelTracksSoASerialSync"),
317  pixelTrackTargetSoA = cms.InputTag("hltPixelTracksSoA"),
318  topFolderName = cms.string('SiPixelHeterogeneous/PixelTrackCompareGPUvsCPU'),
319  useQualityCut = cms.bool(True)
320  )
321 
322  process.hltPixelVertexSoACompareGPUvsCPU = cms.EDProducer("SiPixelCompareVertices",
323  beamSpotSrc = cms.InputTag("hltOnlineBeamSpot"),
324  dzCut = cms.double(1),
325  pixelVertexReferenceSoA = cms.InputTag("hltPixelVerticesSoASerialSync"),
326  pixelVertexTargetSoA = cms.InputTag("hltPixelVerticesSoA"),
327  topFolderName = cms.string('SiPixelHeterogeneous/PixelVertexCompareGPUvsCPU')
328  )
329 
330  process.HLTDQMPixelReconstruction = cms.Sequence(
331  process.hltPixelPhase1MonitorRawDataACPU
332  + process.hltPixelPhase1MonitorRawDataAGPU
333  + process.hltPixelDigiErrorsCompareGPUvsCPU
334  + process.hltPixelRecHitsSoAMonitorCPU
335  + process.hltPixelRecHitsSoAMonitorGPU
336  + process.hltPixelRecHitsSoACompareGPUvsCPU
337  + process.hltPixelTracksSoAMonitorCPU
338  + process.hltPixelTracksSoAMonitorGPU
339  + process.hltPixelTracksSoACompareGPUvsCPU
340  + process.hltPixelVertexSoAMonitorCPU
341  + process.hltPixelVertexSoAMonitorGPU
342  + process.hltPixelVertexSoACompareGPUvsCPU
343  )
344 
345  return process
346 
347 
348 def customizeHLTfor44746(process):
349  for modLabel in ['hltDoubleEle10Mass50PPOnAAFilter', 'hltDoubleEle15Mass50PPOnAAFilter']:
350  if hasattr(process, modLabel):
351  mod = getattr(process, modLabel)
352  mod.l1EGCand = cms.InputTag('hltEgammaCandidatesPPOnAA')
353  return process
354 
355 # CMSSW version specific customizations
356 def customizeHLTforCMSSW(process, menuType="GRun"):
357 
358  process = customiseForOffline(process)
359 
360  # add call to action function in proper order: newest last!
361  # process = customiseFor12718(process)
362 
363  process = checkHLTfor43774(process)
364  process = customizeHLTfor45302(process)
365  process = customizeHLTfor44746(process)
366 
367  return process
def producers_by_type(process, types)
def customisePixelL1ClusterThresholdForRun2Input(process)
def customizeHLTforCMSSW(process, menuType="GRun")
def filters_by_type(process, types)
Definition: common.py:13
def customiseECALCalibrationsFor2018Input(process)
def customiseFor2017DtUnpacking(process)
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
def customiseHCALFor2018Input(process)
def customiseCTPPSFor2018Input(process)
def customiseFor2018Input(process)
def customiseEGammaRecoFor2018Input(process)
def customiseBeamSpotFor2018Input(process)
def customisePixelGainForRun2Input(process)
def esproducers_by_type(process, types)
Definition: common.py:21