Belle II Software  release-08-02-00
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", "passive_veto"],
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("StatisticsTimingHLTDQM",
203  histogramDirectoryName="timing_statistics_after_filter"
204  ).set_name("StatisticsTimingHLTDQM_after_filter")
205 
206  path.add_module("TrackingAbortDQM")
207 
208  path.add_module("DetectorOccupanciesDQM")
209 
210  # Skim plots where bhabha contamination is removed
211  path.add_module(
212  "SoftwareTriggerHLTDQM",
213  cutResultIdentifiers={
214  "skim": {"skim": hlt_skim_lines_in_plot},
215  },
216  cutResultIdentifiersIgnored={
217  "skim": [
218  "accept_bhabha_all",
219  ]
220  },
221  createTotalResultHistograms=False,
222  createExpRunEventHistograms=False,
223  histogramDirectoryName="softwaretrigger_skim_nobhabha",
224  ).set_name("SoftwareTriggerHLTDQM_skim_nobhabha")
225 
226  if dqm_environment == "hlt" and (dqm_mode in ["dont_care", "filtered"]):
227  # SVD DATA FORMAT
228  if components is None or 'SVD' in components:
229  svdunpackerdqm = b2.register_module('SVDUnpackerDQM')
230  path.add_module(svdunpackerdqm)
231 
232  # CDC
233  if (components is None or 'CDC' in components) and (dqm_mode in ["dont_care", "filtered"]):
234  cdcdqm = b2.register_module('cdcDQM7')
235  path.add_module(cdcdqm)
236 
237  module_names = [m.name() for m in path.modules()]
238  if ('SoftwareTrigger' in module_names):
239  cdcdedxdqm = b2.register_module('CDCDedxDQM')
240  path.add_module(cdcdedxdqm)
241 
242  if dqm_environment == "expressreco":
243  path.add_module('CDCDQM')
244 
245  # ECL
246  if (components is None or 'ECL' in components) and (dqm_mode in ["dont_care", "filtered"]):
247  ecldqm = b2.register_module('ECLDQM')
248  path.add_module(ecldqm)
249  ecldqmext = b2.register_module('ECLDQMEXTENDED')
250  path.add_module(ecldqmext)
251  path.add_module('ECLDQMOutOfTimeDigits')
252  path.add_module('ECLDQMConnectedRegions')
253  # we dont want to create large histograms on HLT, thus ERECO only
254  if dqm_environment == "expressreco":
255  path.add_module('ECLDQMInjection', histogramDirectoryName='ECLINJ')
256 
257  # TOP
258  if (components is None or 'TOP' in components) and (dqm_mode in ["dont_care", "filtered"]):
259  topdqm = b2.register_module('TOPDQM')
260  path.add_module(topdqm)
261 
262  # KLM
263  if (components is None or 'KLM' in components) and (dqm_mode in ["dont_care", "filtered"]):
264  klmdqm = b2.register_module("KLMDQM")
265  path.add_module(klmdqm)
266 
267  # TRG before all reconstruction runs (so on all events with all unpacked information)
268  if (components is None or 'TRG' in components) and (dqm_mode in ["dont_care", "before_filter"]):
269  # TRGECL
270  trgecldqm = b2.register_module('TRGECLDQM')
271  path.add_module(trgecldqm)
272  trgecltimingdqm = b2.register_module('TRGECLEventTimingDQM')
273  path.add_module(trgecltimingdqm)
274  # TRGGDL
275  trggdldqm = b2.register_module('TRGGDLDQM')
276  trggdldqm.param('skim', 0)
277  path.add_module(trggdldqm)
278  # TRGTOP
279  trgtopdqm = b2.register_module('TRGTOPDQM')
280  trgtopdqm.param('skim', 0)
281  path.add_module(trgtopdqm)
282  # TRGGRL
283  trggrldqm = b2.register_module('TRGGRLDQM')
284  path.add_module(trggrldqm)
285  # TRGCDCTSF
286  nmod_tsf = [0, 1, 2, 3, 4, 5, 6]
287  for mod_tsf in nmod_tsf:
288  path.add_module('TRGCDCTSFDQM', TSFMOD=mod_tsf)
289  # TRGCDC2D
290  trgcdct2ddqm = b2.register_module('TRGCDCT2DDQM')
291  path.add_module(trgcdct2ddqm)
292  # TRGCDC3D
293  nmod_t3d = [0, 1, 2, 3]
294  for mod_t3d in nmod_t3d:
295  path.add_module('TRGCDCT3DConverter',
296  hitCollectionName='FirmCDCTriggerSegmentHits' + str(mod_t3d),
297  addTSToDatastore=True,
298  EventTimeName='FirmBinnedEventT0' + str(mod_t3d),
299  addEventTimeToDatastore=True,
300  inputCollectionName='FirmTRGCDC2DFinderTracks' + str(mod_t3d),
301  add2DFinderToDatastore=True,
302  outputCollectionName='FirmTRGCDC3DFitterTracks' + str(mod_t3d),
303  add3DToDatastore=True,
304  fit3DWithTSIM=0,
305  firmwareResultCollectionName='TRGCDCT3DUnpackerStore' + str(mod_t3d),
306  isVerbose=0)
307  path.add_module('TRGCDCT3DDQM', T3DMOD=mod_t3d)
308  # CDCTriggerNeuro
309  if dqm_environment != "expressreco":
311  path.add_module('CDCTriggerNeuroDQMOnline', histogramDirectoryName="TRGCDCTNN2", useRecoTracks=False)
312  path.add_module('CDCTriggerNeuroDQM')
313 
314  # TRG for expressreco:
315  if dqm_environment == "expressreco" and (components is None or 'TRG' in components) and (dqm_mode in ["dont_care"]):
316  # TRGCDCTNN
318  path.add_module('CDCTriggerRecoMatcher', TrgTrackCollectionName=neurotrigger.hwneurotracks,
319  hitCollectionName=neurotrigger.hwneuroinputsegmenthits, axialOnly=True)
320  path.add_module('CDCTriggerRecoMatcher', TrgTrackCollectionName=neurotrigger.hwsimneurotracks,
321  hitCollectionName=neurotrigger.hwneuroinputsegmenthits, axialOnly=True)
322  path.add_module('CDCTriggerRecoMatcher', TrgTrackCollectionName=neurotrigger.hwneuroinput2dfindertracks,
323  hitCollectionName=neurotrigger.hwneuroinputsegmenthits, axialOnly=True)
324  path.add_module('CDCTriggerNeuroDQMOnline', histogramDirectoryName="TRGCDCTNN2", useRecoTracks=True)
325 
326  # TRG after skim
327  if (components is None or 'TRG' in components) and (dqm_mode in ["dont_care", "filtered"]):
328  # TRGGDL
329  trggdldqm_skim = b2.register_module('TRGGDLDQM')
330  trggdldqm_skim.param('skim', 1)
331  path.add_module(trggdldqm_skim)
332  trgeffdqm = b2.register_module("TRGEFFDQM")
333  path.add_module(trgeffdqm)
334 
335  # TRGTOP
336  trgtopdqm_skim = b2.register_module('TRGTOPDQM')
337  trgtopdqm_skim.param('skim', 1)
338  path.add_module(trgtopdqm_skim)
339 
340  # TrackDQM, needs at least one VXD components to be present or will crash otherwise
341  if (components is None or 'SVD' in components or 'PXD' in components) and (dqm_mode in ["dont_care", "filtered"]):
342  if (dqm_environment == "hlt"):
343  path.add_module('TrackingHLTDQM')
344  else:
345  path.add_module('ParallelTrackFilter', min_d0=-0.5, max_d0=0.5, min_z0=-1, max_z0=1,
346  inputArrayName="", outputINArrayName="TracksFromIP", outputOUTArrayName="TracksNotFromIP")
347  path.add_module('TrackingExpressRecoDQM', histogramDirectoryName="TrackingERDQM_FromIP",
348  tracksStoreArrayName="TracksFromIP", histogramTitleSuffix=" - Tracks from IP") \
349  .set_name("TrackingExpressRecoDQM_FromIP")
350  path.add_module('TrackingExpressRecoDQM', histogramDirectoryName="TrackingERDQM_NotFromIP",
351  tracksStoreArrayName="TracksNotFromIP", histogramTitleSuffix=" - Tracks not from IP") \
352  .set_name("TrackingExpressRecoDQM_NotFromIP")
353 
354  # ARICH
355  if (components is None or 'ARICH' in components) and (dqm_mode in ["dont_care", "filtered"]):
356  path.add_module('ARICHDQM')
357 
358  if dqm_mode in ["dont_care", "filtered"]:
359  # PhysicsObjectsDQM
360  add_analysis_dqm(path)
361  if dqm_environment == "expressreco" and (dqm_mode in ["dont_care"]):
362  add_mirabelle_dqm(path)
363 
364  # KLM2 (requires mu+ particle list from add_analysis_dqm)
365  if (components is None or ('KLM' in components and 'CDC' in components)) and (dqm_mode in ["dont_care", "filtered"]):
366  path.add_module("KLMDQM2", MuonListName='mu+:KLMDQM',
367  MinimalMatchingDigits=12,
368  MinimalMatchingDigitsOuterLayers=0,
369  MinimalMomentumNoOuterLayers=4.0,
370  SoftwareTriggerName="")
371 
372  # We want to see the datasize of all events after removing the raw data
373  if dqm_mode in ["dont_care", "all_events"]:
374  # DAQ Monitor
375  path.add_module('DAQMonitor')
def add_neurotrigger_hw(path, nntweightfile=None, debug_level=4, debugout=False, **kwargs)