Belle II Software  release-08-01-10
commondqm.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 import basf2 as b2
13 from svd import add_svd_create_recodigits
14 from svd.dqm_utils import add_svd_dqm_dose
15 from geometry import check_components
16 from analysisDQM import add_analysis_dqm, add_mirabelle_dqm
17 import neurotrigger
18 
19 
20 def add_common_dqm(path, components=None, dqm_environment="expressreco", dqm_mode="dont_care", create_hlt_unit_histograms=False):
21  """
22  This function adds DQMs which are common for Cosmic runs and Collion runs
23 
24  @param components: A list of the detector components which are available in this
25  run of basf2
26  @param dqm_environment: The environment the DQM modules are running in
27  "expressreco" (default) if running on the ExpressReco system
28  "hlt" if running on the HLT online reconstructon nodes
29  If running on the hlt, you may want to output less or other DQM plots
30  due to the limited bandwith of the HLT nodes.
31  @param dqm_mode: How to split up the path for online/HLT.
32  For dqm_mode == "dont_care" all the DQM modules should be added.
33  For dqm_mode == "all_events" only the DQM modules which should run on all events
34  (filtered and dismissed) should be added
35  For dqm_mode == "before_reco" only the DQM modules which should run before
36  all reconstruction
37  For dqm_mode == "filtered" only the DQM modules which should run on filtered
38  events should be added
39  @param create_hlt_unit_histograms: Parameter for SoftwareTiggerHLTDQMModule.
40  Should be True only when running on the HLT servers
41  """
42  assert dqm_mode in ["dont_care", "all_events", "filtered", "before_filter"]
43  # Check components.
44  check_components(components)
45 
46  if dqm_mode in ["dont_care", "filtered"]:
47  # TTD trigger and bunch injection monitoring
48  path.add_module('TTDDQM')
49 
50  if dqm_environment == "expressreco" and (dqm_mode in ["dont_care"]):
51  # PXD (not useful on HLT)
52  if components is None or 'PXD' in components:
53  path.add_module('PXDDAQDQM', histogramDirectoryName='PXDDAQ')
54  path.add_module('PXDROIDQM', histogramDirectoryName='PXDROI')
55  path.add_module('PXDDQMExpressReco', histogramDirectoryName='PXDER')
56  path.add_module('SetupGenfitExtrapolation')
57  path.add_module('PXDROIFinder',
58  recoTrackListName='RecoTracks',
59  PXDInterceptListName='PXDIntercepts')
60  # moved to cosmics/collision as we need different cuts
61  # path.add_module('PXDDQMEfficiency', histogramDirectoryName='PXDEFF')
62  path.add_module('PXDTrackClusterDQM', histogramDirectoryName='PXDER')
63  path.add_module('PXDInjectionDQM', histogramDirectoryName='PXDINJ', eachModule=True)
64  # SVD
65  if components is None or 'SVD' in components:
66  # reconstruct SVDRecoDigits first of all
67  add_svd_create_recodigits(path)
68 
69  # SVD DATA FORMAT
70  svdunpackerdqm = b2.register_module('SVDUnpackerDQM')
71  path.add_module(svdunpackerdqm)
72  # offline ZS emulator
73  path.add_module(
74  'SVDZeroSuppressionEmulator',
75  SNthreshold=5,
76  ShaperDigits='SVDShaperDigits',
77  ShaperDigitsIN='SVDShaperDigitsZS5',
78  FADCmode=True)
79  # SVD Occupancy after Injection
80  path.add_module('SVDDQMInjection', ShaperDigits='SVDShaperDigitsZS5')
81  # SVDDQMExpressReco General
82  path.add_module('SVDDQMExpressReco',
83  offlineZSShaperDigits='SVDShaperDigitsZS5')
84  # SVD HIT TIME
85  path.add_module('SVDDQMHitTime')
86  # SVD EFFICIENCY
87  path.add_module('SetupGenfitExtrapolation')
88  path.add_module('SVDROIFinder',
89  recoTrackListName='RecoTracks',
90  SVDInterceptListName='SVDIntercepts')
91  path.add_module('SVDDQMEfficiency')
92  # SVD CLUSTERS ON TRACK
93  path.add_module('SVDDQMClustersOnTrack')
94  # SVD DOSE
95  add_svd_dqm_dose(path, 'SVDShaperDigitsZS5')
96 
97  # Event time measuring detectors
98  if components is None or 'CDC' in components or 'ECL' in components or 'TOP' in components:
99  eventT0DQMmodule = b2.register_module('EventT0DQM')
100  path.add_module(eventT0DQMmodule)
101 
102  if dqm_environment == "hlt" and (dqm_mode in ["dont_care", "before_filter"]):
103  path.add_module(
104  "SoftwareTriggerHLTDQM",
105  createHLTUnitHistograms=create_hlt_unit_histograms,
106  createTotalResultHistograms=False,
107  createExpRunEventHistograms=False,
108  createErrorFlagHistograms=True,
109  cutResultIdentifiers={},
110  histogramDirectoryName="softwaretrigger_before_filter",
111  pathLocation="before filter",
112  ).set_name("SoftwareTriggerHLTDQM_before_filter")
113 
114  path.add_module(
115  "TrackingAbortDQM",
116  histogramDirectoryName="TrackingAbort_before_filter",
117  ).set_name("TrackingAbortDQM_before_filter")
118 
119  path.add_module("DetectorOccupanciesDQM", histogramDirectoryName="DetectorOccupancies_before_filter").set_name(
120  "DetectorOccupanciesDQM_before_filter")
121 
122  path.add_module("StatisticsTimingHLTDQM",
123  createHLTUnitHistograms=create_hlt_unit_histograms,
124  )
125 
126  if dqm_environment == "hlt" and (dqm_mode in ["dont_care", "filtered"]):
127  # HLT
128  hlt_trigger_lines_in_plot = []
129  hlt_skim_lines_in_plot = []
130 
131  hlt_trigger_lines_per_unit_in_plot = [
132  "ge3_loose_tracks_inc_1_tight_not_ee2leg",
133  "Elab_gt_0.5_plus_2_others_with_Elab_gt_0.18_plus_no_clust_with_Ecms_gt_2.0",
134  "selectee",
135  "Estargt2_GeV_cluster",
136  ]
137  cutResultIdentifiers = {}
138 
139  from softwaretrigger import filter_categories, skim_categories
140 
141  filter_cat = [method for method in dir(filter_categories) if method.startswith('__') is False if method != 'RESULTS']
142  skim_cat = [method for method in dir(skim_categories) if method.startswith('__') is False]
143 
144  def read_lines(category):
145  return [i.split(" ", 1)[1].replace(" ", "_") for i in category]
146 
147  for i in filter_cat:
148  cutResultIdentifiers[i] = {"filter": read_lines(getattr(filter_categories, i))}
149  hlt_trigger_lines_in_plot += read_lines(getattr(filter_categories, i))
150 
151  for i in skim_cat:
152  cutResultIdentifiers[i] = {"skim": read_lines(getattr(skim_categories, i))}
153  hlt_skim_lines_in_plot += read_lines(getattr(skim_categories, i))
154 
155  cutResultIdentifiers["skim"] = {"skim": hlt_skim_lines_in_plot}
156  cutResultIdentifiers["filter"] = {"filter": hlt_trigger_lines_in_plot}
157 
158  additionalL1Identifiers = [
159  'ffy',
160  'fyo',
161  'c4',
162  'hie',
163  'mu_b2b',
164  'mu_eb2b',
165  'beklm',
166  'eklm2',
167  'cdcklm1',
168  'seklm1',
169  'ieklm1',
170  'ecleklm1',
171  'fso',
172  'fioiecl1',
173  'ff30',
174  'stt',
175  'ioiecl1',
176  'ioiecl2',
177  'lml1',
178  'lml2',
179  'lml3',
180  'lml4',
181  'lml5',
182  'lml6',
183  'lml7',
184  'lml8',
185  'lml9',
186  'lml10',
187  'lml12',
188  'lml13',
189  'bhapur']
190 
191  # Default plot
192  path.add_module(
193  "SoftwareTriggerHLTDQM",
194  cutResultIdentifiers=cutResultIdentifiers,
195  l1Identifiers=["fff", "ffo", "lml0", "ffb", "fp"],
196  additionalL1Identifiers=additionalL1Identifiers,
197  createHLTUnitHistograms=create_hlt_unit_histograms,
198  cutResultIdentifiersPerUnit=hlt_trigger_lines_per_unit_in_plot,
199  pathLocation="after filter",
200  )
201 
202  path.add_module("TrackingAbortDQM")
203 
204  path.add_module("DetectorOccupanciesDQM")
205 
206  # Skim plots where bhabha contamination is removed
207  path.add_module(
208  "SoftwareTriggerHLTDQM",
209  cutResultIdentifiers={
210  "skim": {"skim": hlt_skim_lines_in_plot},
211  },
212  cutResultIdentifiersIgnored={
213  "skim": [
214  "accept_bhabha_all",
215  ]
216  },
217  createTotalResultHistograms=False,
218  createExpRunEventHistograms=False,
219  histogramDirectoryName="softwaretrigger_skim_nobhabha",
220  ).set_name("SoftwareTriggerHLTDQM_skim_nobhabha")
221 
222  if dqm_environment == "hlt" and (dqm_mode in ["dont_care", "filtered"]):
223  # SVD DATA FORMAT
224  if components is None or 'SVD' in components:
225  svdunpackerdqm = b2.register_module('SVDUnpackerDQM')
226  path.add_module(svdunpackerdqm)
227 
228  # CDC
229  if (components is None or 'CDC' in components) and (dqm_mode in ["dont_care", "filtered"]):
230  cdcdqm = b2.register_module('cdcDQM7')
231  path.add_module(cdcdqm)
232 
233  module_names = [m.name() for m in path.modules()]
234  if ('SoftwareTrigger' in module_names):
235  cdcdedxdqm = b2.register_module('CDCDedxDQM')
236  path.add_module(cdcdedxdqm)
237 
238  if dqm_environment == "expressreco":
239  path.add_module('CDCDQM')
240 
241  # ECL
242  if (components is None or 'ECL' in components) and (dqm_mode in ["dont_care", "filtered"]):
243  ecldqm = b2.register_module('ECLDQM')
244  path.add_module(ecldqm)
245  ecldqmext = b2.register_module('ECLDQMEXTENDED')
246  path.add_module(ecldqmext)
247  path.add_module('ECLDQMOutOfTimeDigits')
248  path.add_module('ECLDQMConnectedRegions')
249  # we dont want to create large histograms on HLT, thus ERECO only
250  if dqm_environment == "expressreco":
251  path.add_module('ECLDQMInjection', histogramDirectoryName='ECLINJ')
252 
253  # TOP
254  if (components is None or 'TOP' in components) and (dqm_mode in ["dont_care", "filtered"]):
255  topdqm = b2.register_module('TOPDQM')
256  path.add_module(topdqm)
257 
258  # KLM
259  if (components is None or 'KLM' in components) and (dqm_mode in ["dont_care", "filtered"]):
260  klmdqm = b2.register_module("KLMDQM")
261  path.add_module(klmdqm)
262 
263  # TRG before all reconstruction runs (so on all events with all unpacked information)
264  if (components is None or 'TRG' in components) and (dqm_mode in ["dont_care", "before_filter"]):
265  # TRGECL
266  trgecldqm = b2.register_module('TRGECLDQM')
267  path.add_module(trgecldqm)
268  trgecltimingdqm = b2.register_module('TRGECLEventTimingDQM')
269  path.add_module(trgecltimingdqm)
270  # TRGGDL
271  trggdldqm = b2.register_module('TRGGDLDQM')
272  trggdldqm.param('skim', 0)
273  path.add_module(trggdldqm)
274  # TRGTOP
275  trgtopdqm = b2.register_module('TRGTOPDQM')
276  trgtopdqm.param('skim', 0)
277  path.add_module(trgtopdqm)
278  # TRGGRL
279  trggrldqm = b2.register_module('TRGGRLDQM')
280  path.add_module(trggrldqm)
281  # TRGCDCTSF
282  nmod_tsf = [0, 1, 2, 3, 4, 5, 6]
283  for mod_tsf in nmod_tsf:
284  path.add_module('TRGCDCTSFDQM', TSFMOD=mod_tsf)
285  # TRGCDC2D
286  trgcdct2ddqm = b2.register_module('TRGCDCT2DDQM')
287  path.add_module(trgcdct2ddqm)
288  # TRGCDC3D
289  nmod_t3d = [0, 1, 2, 3]
290  for mod_t3d in nmod_t3d:
291  path.add_module('TRGCDCT3DConverter',
292  hitCollectionName='FirmCDCTriggerSegmentHits' + str(mod_t3d),
293  addTSToDatastore=True,
294  EventTimeName='FirmBinnedEventT0' + str(mod_t3d),
295  addEventTimeToDatastore=True,
296  inputCollectionName='FirmTRGCDC2DFinderTracks' + str(mod_t3d),
297  add2DFinderToDatastore=True,
298  outputCollectionName='FirmTRGCDC3DFitterTracks' + str(mod_t3d),
299  add3DToDatastore=True,
300  fit3DWithTSIM=0,
301  firmwareResultCollectionName='TRGCDCT3DUnpackerStore' + str(mod_t3d),
302  isVerbose=0)
303  path.add_module('TRGCDCT3DDQM', T3DMOD=mod_t3d)
304  # CDCTriggerNeuro
305  if dqm_environment != "expressreco":
307  path.add_module('CDCTriggerNeuroDQMOnline', histogramDirectoryName="TRGCDCTNN2", useRecoTracks=False)
308  path.add_module('CDCTriggerNeuroDQM')
309 
310  # TRG for expressreco:
311  if dqm_environment == "expressreco" and (components is None or 'TRG' in components) and (dqm_mode in ["dont_care"]):
312  # TRGCDCTNN
314  path.add_module('CDCTriggerRecoMatcher', TrgTrackCollectionName=neurotrigger.hwneurotracks,
315  hitCollectionName=neurotrigger.hwneuroinputsegmenthits, axialOnly=True)
316  path.add_module('CDCTriggerRecoMatcher', TrgTrackCollectionName=neurotrigger.hwsimneurotracks,
317  hitCollectionName=neurotrigger.hwneuroinputsegmenthits, axialOnly=True)
318  path.add_module('CDCTriggerRecoMatcher', TrgTrackCollectionName=neurotrigger.hwneuroinput2dfindertracks,
319  hitCollectionName=neurotrigger.hwneuroinputsegmenthits, axialOnly=True)
320  path.add_module('CDCTriggerNeuroDQMOnline', histogramDirectoryName="TRGCDCTNN2", useRecoTracks=True)
321 
322  # TRG after skim
323  if (components is None or 'TRG' in components) and (dqm_mode in ["dont_care", "filtered"]):
324  # TRGGDL
325  trggdldqm_skim = b2.register_module('TRGGDLDQM')
326  trggdldqm_skim.param('skim', 1)
327  path.add_module(trggdldqm_skim)
328  # TRGTOP
329  trgtopdqm_skim = b2.register_module('TRGTOPDQM')
330  trgtopdqm_skim.param('skim', 1)
331  path.add_module(trgtopdqm_skim)
332 
333  # TrackDQM, needs at least one VXD components to be present or will crash otherwise
334  if (components is None or 'SVD' in components or 'PXD' in components) and (dqm_mode in ["dont_care", "filtered"]):
335  if (dqm_environment == "hlt"):
336  path.add_module('TrackingHLTDQM')
337  else:
338  path.add_module('ParallelTrackFilter', min_d0=-0.5, max_d0=0.5, min_z0=-1, max_z0=1,
339  inputArrayName="", outputINArrayName="TracksFromIP", outputOUTArrayName="TracksNotFromIP")
340  path.add_module('TrackingExpressRecoDQM', histogramDirectoryName="TrackingERDQM_FromIP",
341  tracksStoreArrayName="TracksFromIP", histogramTitleSuffix=" - Tracks from IP") \
342  .set_name("TrackingExpressRecoDQM_FromIP")
343  path.add_module('TrackingExpressRecoDQM', histogramDirectoryName="TrackingERDQM_NotFromIP",
344  tracksStoreArrayName="TracksNotFromIP", histogramTitleSuffix=" - Tracks not from IP") \
345  .set_name("TrackingExpressRecoDQM_NotFromIP")
346 
347  # ARICH
348  if (components is None or 'ARICH' in components) and (dqm_mode in ["dont_care", "filtered"]):
349  path.add_module('ARICHDQM')
350 
351  if dqm_mode in ["dont_care", "filtered"]:
352  # PhysicsObjectsDQM
353  add_analysis_dqm(path)
354  if dqm_environment == "expressreco" and (dqm_mode in ["dont_care"]):
355  add_mirabelle_dqm(path)
356 
357  # KLM2 (requires mu+ particle list from add_analysis_dqm)
358  if (components is None or ('KLM' in components and 'CDC' in components)) and (dqm_mode in ["dont_care", "filtered"]):
359  path.add_module("KLMDQM2", MuonListName='mu+:KLMDQM',
360  MinimalMatchingDigits=12,
361  MinimalMatchingDigitsOuterLayers=0,
362  MinimalMomentumNoOuterLayers=4.0,
363  SoftwareTriggerName="")
364 
365  # We want to see the datasize of all events after removing the raw data
366  if dqm_mode in ["dont_care", "all_events"]:
367  # DAQ Monitor
368  path.add_module('DAQMonitor')
def add_neurotrigger_hw(path, nntweightfile=None, debug_level=4, debugout=False, **kwargs)