Belle II Software  release-08-00-10
TOPDQMModule.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <top/modules/TOPDQM/TOPDQMModule.h>
10 #include <top/geometry/TOPGeometryPar.h>
11 #include <tracking/dataobjects/ExtHit.h>
12 #include <framework/gearbox/Unit.h>
13 #include <framework/gearbox/Const.h>
14 #include <framework/logging/Logger.h>
15 #include "TDirectory.h"
16 #include <boost/format.hpp>
17 #include <algorithm>
18 
19 using namespace std;
20 using boost::format;
21 
22 namespace Belle2 {
28  using namespace TOP;
29 
30  //-----------------------------------------------------------------
32  //-----------------------------------------------------------------
33 
34  REG_MODULE(TOPDQM);
35 
36  //-----------------------------------------------------------------
37  // Implementation
38  //-----------------------------------------------------------------
39 
40  TOPDQMModule::TOPDQMModule() : HistoModule()
41  {
42  // set module description (e.g. insert text)
43  setDescription("TOP DQM histogrammer");
45 
46  // Add parameters
47  addParam("histogramDirectoryName", m_histogramDirectoryName,
48  "histogram directory in ROOT file", string("TOP"));
49  addParam("momentumCut", m_momentumCut,
50  "momentum cut used to histogram number of photons per track", 0.5);
51  }
52 
53 
55  {
56  }
57 
59  {
60  // Create a separate histogram directory and cd into it.
61 
62  TDirectory* oldDir = gDirectory;
63  oldDir->mkdir(m_histogramDirectoryName.c_str())->cd();
64 
65  // Variables needed for booking
66 
67  const auto* geo = TOPGeometryPar::Instance()->getGeometry();
68  m_numModules = geo->getNumModules();
69  double bunchTimeSep = geo->getNominalTDC().getSyncTimeBase() / 24;
70 
71  // Histograms
72 
73  m_BoolEvtMonitor = new TH1D("BoolEvtMonitor", "Event synchronization", 2, -0.5, 1.5);
74  m_BoolEvtMonitor->GetYaxis()->SetTitle("number of digits");
75  m_BoolEvtMonitor->GetXaxis()->SetBinLabel(1, "synchronized");
76  m_BoolEvtMonitor->GetXaxis()->SetBinLabel(2, "de-synchronized");
77  m_BoolEvtMonitor->GetXaxis()->SetLabelSize(0.05);
78  m_BoolEvtMonitor->GetXaxis()->SetAlphanumeric();
79  m_BoolEvtMonitor->SetMinimum(0);
80 
81  m_window_vs_slot = new TH2F("window_vs_slot", "Asic windows", 16, 0.5, 16.5, 512, 0, 512);
82  m_window_vs_slot->SetXTitle("slot number");
83  m_window_vs_slot->SetYTitle("window number w.r.t reference window");
84  m_window_vs_slot->SetStats(kFALSE);
85  m_window_vs_slot->SetMinimum(0);
86  m_window_vs_slot->GetXaxis()->SetNdivisions(16);
87 
88  int nbinsT0 = 75;
89  double rangeT0 = nbinsT0 * bunchTimeSep;
90  m_eventT0 = new TH1F("eventT0", "Event T0; event T0 [ns]; events per bin", nbinsT0, -rangeT0 / 2, rangeT0 / 2);
91 
92  m_bunchOffset = new TH1F("bunchOffset", "Bunch offset", 100, -bunchTimeSep / 2, bunchTimeSep / 2);
93  m_bunchOffset->SetXTitle("offset [ns]");
94  m_bunchOffset->SetYTitle("events per bin");
95  m_bunchOffset->SetMinimum(0);
96 
97  m_time = new TH1F("goodHitTimes", "Time distribution of good hits", 1000, -20, 80);
98  m_time->SetXTitle("time [ns]");
99  m_time->SetYTitle("hits per bin");
100 
101  m_timeBG = new TH1F("goodHitTimesBG", "Time distribution of good hits (background)", 1000, -20, 80);
102  m_timeBG->SetXTitle("time [ns]");
103  m_timeBG->SetYTitle("hits per bin");
104 
105  m_signalHits = new TProfile("signalHits", "Number of good hits per track in [0, 50] ns", 16, 0.5, 16.5, 0, 1000);
106  m_signalHits->SetXTitle("slot number");
107  m_signalHits->SetYTitle("hits per track");
108  m_signalHits->SetMinimum(0);
109  m_signalHits->GetXaxis()->SetNdivisions(16);
110 
111  m_backgroundHits = new TProfile("backgroundHits", "Number of good hits pet track in [-50, 0] ns", 16, 0.5, 16.5, 0, 1000);
112  m_backgroundHits->SetXTitle("slot number");
113  m_backgroundHits->SetYTitle("hits per track");
114  m_backgroundHits->SetMinimum(0);
115  m_backgroundHits->GetXaxis()->SetNdivisions(16);
116 
117  int nbinsHits = 1000;
118  double xmaxHits = 10000;
119  m_goodHitsPerEventAll = new TH1F("goodHitsPerEventAll", "Number of good hits per event", nbinsHits, 0, xmaxHits);
120  m_goodHitsPerEventAll->GetXaxis()->SetTitle("hits per event");
121  m_goodHitsPerEventAll->GetYaxis()->SetTitle("entries per bin");
122 
123  m_badHitsPerEventAll = new TH1F("badHitsPerEventAll", "Number of junk hits per event", nbinsHits, 0, xmaxHits);
124  m_badHitsPerEventAll->GetXaxis()->SetTitle("hits per event");
125  m_badHitsPerEventAll->GetYaxis()->SetTitle("entries per bin");
126 
127  int nbinsTDC = 400;
128  double xminTDC = -100;
129  double xmaxTDC = 700;
130  m_goodTDCAll = new TH1F("goodTDCAll", "Raw time distribution of good hits", nbinsTDC, xminTDC, xmaxTDC);
131  m_goodTDCAll->SetXTitle("raw time [samples]");
132  m_goodTDCAll->SetYTitle("hits per sample");
133 
134  m_badTDCAll = new TH1F("badTDCAll", "Raw time distribution of junk hits", nbinsTDC, xminTDC, xmaxTDC);
135  m_badTDCAll->SetXTitle("raw time [samples]");
136  m_badTDCAll->SetYTitle("hits per sample");
137 
138  m_TOPOccAfterInjLER = new TH1F("TOPOccInjLER", "TOPOccInjLER/Time;Time in #mus;Nhits/Time (#mus bins)", 4000, 0, 20000);
139  m_TOPOccAfterInjHER = new TH1F("TOPOccInjHER", "TOPOccInjHER/Time;Time in #mus;Nhits/Time (#mus bins)", 4000, 0, 20000);
140  m_TOPEOccAfterInjLER = new TH1F("TOPEOccInjLER", "TOPEOccInjLER/Time;Time in #mus;Triggers/Time (#mus bins)", 4000, 0, 20000);
141  m_TOPEOccAfterInjHER = new TH1F("TOPEOccInjHER", "TOPEOccInjHER/Time;Time in #mus;Triggers/Time (#mus bins)", 4000, 0, 20000);
142 
143  for (int i = 0; i < m_numModules; i++) {
144  int module = i + 1;
145  string name, title;
146  TH1F* h1 = 0;
147  TH2F* h2 = 0;
148 
149  name = str(format("window_vs_asic_%1%") % (module));
150  title = str(format("Asic windows for slot #%1%") % (module));
151  h2 = new TH2F(name.c_str(), title.c_str(), 64, 0, 64, 512, 0, 512);
152  h2->SetStats(kFALSE);
153  h2->SetXTitle("ASIC number");
154  h2->SetYTitle("window number w.r.t reference window");
155  h2->SetMinimum(0);
156  m_window_vs_asic.push_back(h2);
157 
158  name = str(format("good_hits_xy_%1%") % (module));
159  title = str(format("Distribution of good hits for slot #%1%") % (module));
160  h2 = new TH2F(name.c_str(), title.c_str(), 64, 0.5, 64.5, 8, 0.5, 8.5);
161  h2->SetStats(kFALSE);
162  h2->GetXaxis()->SetTitle("pixel column");
163  h2->GetYaxis()->SetTitle("pixel row");
164  h2->SetMinimum(0);
165  m_goodHitsXY.push_back(h2);
166 
167  name = str(format("bad_hits_xy_%1%") % (module));
168  title = str(format("Distribution of junk hits for slot #%1%") % (module));
169  h2 = new TH2F(name.c_str(), title.c_str(), 64, 0.5, 64.5, 8, 0.5, 8.5);
170  h2->SetStats(kFALSE);
171  h2->GetXaxis()->SetTitle("pixel column");
172  h2->GetYaxis()->SetTitle("pixel row");
173  h2->SetMinimum(0);
174  m_badHitsXY.push_back(h2);
175 
176  name = str(format("good_hits_asics_%1%") % (module));
177  title = str(format("Distribution of good hits for slot #%1%") % (module));
178  h2 = new TH2F(name.c_str(), title.c_str(), 64, 0, 64, 8, 0, 8);
179  h2->SetStats(kFALSE);
180  h2->GetXaxis()->SetTitle("ASIC number");
181  h2->GetYaxis()->SetTitle("ASIC channel");
182  h2->SetMinimum(0);
183  m_goodHitsAsics.push_back(h2);
184 
185  name = str(format("bad_hits_asics_%1%") % (module));
186  title = str(format("Distribution of junk hits for slot #%1%") % (module));
187  h2 = new TH2F(name.c_str(), title.c_str(), 64, 0, 64, 8, 0, 8);
188  h2->SetStats(kFALSE);
189  h2->GetXaxis()->SetTitle("ASIC number");
190  h2->GetYaxis()->SetTitle("ASIC channel");
191  h2->SetMinimum(0);
192  m_badHitsAsics.push_back(h2);
193 
194  name = str(format("good_TDC_%1%") % (module));
195  title = str(format("Raw time distribution of good hits for slot #%1%") % (module));
196  h1 = new TH1F(name.c_str(), title.c_str(), nbinsTDC, xminTDC, xmaxTDC);
197  h1->GetXaxis()->SetTitle("raw time [samples]");
198  h1->GetYaxis()->SetTitle("hits per sample");
199  m_goodTDC.push_back(h1);
200 
201  name = str(format("bad_TDC_%1%") % (module));
202  title = str(format("Raw time distribution of junk hits for slot #%1%") % (module));
203  h1 = new TH1F(name.c_str(), title.c_str(), nbinsTDC, xminTDC, xmaxTDC);
204  h1->GetXaxis()->SetTitle("raw time [samples]");
205  h1->GetYaxis()->SetTitle("hits per sample");
206  m_badTDC.push_back(h1);
207 
208  name = str(format("good_timing_%1%") % (module));
209  title = str(format("Time distribution of good hits for slot #%1%") % (module));
210  h1 = new TH1F(name.c_str(), title.c_str(), 200, -20, 80);
211  h1->GetXaxis()->SetTitle("time [ns]");
212  h1->GetYaxis()->SetTitle("hits per time bin");
213  m_goodTiming.push_back(h1);
214 
215  name = str(format("good_timing_%1%BG") % (module));
216  title = str(format("Time distribution of good hits (background) for slot #%1%") % (module));
217  h1 = new TH1F(name.c_str(), title.c_str(), 200, -20, 80);
218  h1->GetXaxis()->SetTitle("time [ns]");
219  h1->GetYaxis()->SetTitle("hits per time bin");
220  m_goodTimingBG.push_back(h1);
221 
222  name = str(format("good_channel_hits_%1%") % (module));
223  title = str(format("Distribution of good hits for slot #%1%") % (module));
224  int numPixels = geo->getModule(i + 1).getPMTArray().getNumPixels();
225  h1 = new TH1F(name.c_str(), title.c_str(), numPixels, 0, numPixels);
226  h1->GetXaxis()->SetTitle("channel number");
227  h1->GetYaxis()->SetTitle("hits per channel");
228  h1->SetMinimum(0);
229  m_goodChannelHits.push_back(h1);
230 
231  name = str(format("bad_channel_hits_%1%") % (module));
232  title = str(format("Distribution of junk hits for slot #%1%") % (module));
233  h1 = new TH1F(name.c_str(), title.c_str(), numPixels, 0, numPixels);
234  h1->GetXaxis()->SetTitle("channel number");
235  h1->GetYaxis()->SetTitle("hits per channel");
236  h1->SetMinimum(0);
237  m_badChannelHits.push_back(h1);
238 
239  name = str(format("pulseHeights_%1%") % (module));
240  title = str(format("Average pulse heights for slot #%1%") % (module));
241  auto* prof = new TProfile(name.c_str(), title.c_str(), 32, 0.5, 32.5, 0, 2000);
242  prof->GetXaxis()->SetTitle("PMT number");
243  prof->GetYaxis()->SetTitle("pulse height [ADC counts]");
244  prof->SetMarkerStyle(20);
245  prof->SetMinimum(0);
246  m_pulseHeights.push_back(prof);
247  }
248 
249  // cd back to root directory
250  oldDir->cd();
251  }
252 
254  {
255  // Register histograms (calls back defineHisto)
256 
257  REG_HISTOGRAM;
258 
259  // register dataobjects
260 
261  m_rawFTSW.isOptional();
262  m_digits.isRequired();
263  m_recBunch.isOptional();
264  m_timeZeros.isOptional();
265  m_tracks.isOptional();
266 
267  }
268 
270  {
271  m_BoolEvtMonitor->Reset();
272  m_window_vs_slot->Reset();
273  m_eventT0->Reset();
274  m_bunchOffset->Reset();
275  m_time->Reset();
276  m_timeBG->Reset();
277  m_signalHits->Reset();
278  m_backgroundHits->Reset();
279  m_goodTDCAll->Reset();
280  m_badTDCAll->Reset();
281  m_goodHitsPerEventAll->Reset();
282  m_badHitsPerEventAll->Reset();
283  m_TOPOccAfterInjLER->Reset();
284  m_TOPOccAfterInjHER->Reset();
285  m_TOPEOccAfterInjLER->Reset();
286  m_TOPEOccAfterInjHER->Reset();
287 
288  for (int i = 0; i < m_numModules; i++) {
289  m_window_vs_asic[i]->Reset();
290  m_goodHitsXY[i]->Reset();
291  m_badHitsXY[i]->Reset();
292  m_goodHitsAsics[i]->Reset();
293  m_badHitsAsics[i]->Reset();
294  m_goodTDC[i]->Reset();
295  m_badTDC[i]->Reset();
296  m_goodTiming[i]->Reset();
297  m_goodTimingBG[i]->Reset();
298  m_goodChannelHits[i]->Reset();
299  m_badChannelHits[i]->Reset();
300  m_pulseHeights[i]->Reset();
301  }
302  }
303 
305  {
306 
307  // check if event time is reconstructed; distinguish collision data and cosmics
308 
309  bool recBunchValid = false;
310  bool cosmics = false;
311  if (m_recBunch.isValid()) { // collision data
312  recBunchValid = m_recBunch->isReconstructed(); // event time is reconstructed
313  } else if (m_timeZeros.getEntries() == 1) { // cosmics w/ reconstructed event time
314  cosmics = true;
315  m_eventT0->Fill(m_timeZeros[0]->getTime());
316  }
317 
318  // fill bunch offset
319 
320  if (recBunchValid) {
321  double t0 = m_commonT0->isRoughlyCalibrated() ? m_commonT0->getT0() : 0;
322  m_bunchOffset->Fill(m_recBunch->getCurrentOffset() - t0);
323  m_eventT0->Fill(m_recBunch->getTime());
324  }
325 
326  // fill event desynchronization
327 
328  if (m_digits.getEntries() > 0) {
329  for (const auto& digit : m_digits) {
330  int x = digit.getFirstWindow() != m_digits[0]->getFirstWindow() ? 1 : 0 ;
331  m_BoolEvtMonitor->Fill(x);
332  }
333  }
334 
335  // count tracks in the modules and store the momenta
336 
337  std::vector<int> numTracks(m_numModules, 0);
338  std::vector<double> trackMomenta(m_numModules, 0);
339  for (const auto& track : m_tracks) {
340  const auto* fitResult = track.getTrackFitResultWithClosestMass(Const::pion);
341  if (not fitResult) continue;
342  int slot = getModuleID(track);
343  if (slot == 0) continue;
344  numTracks[slot - 1]++;
345  trackMomenta[slot - 1] = std::max(trackMomenta[slot - 1], fitResult->getMomentum().R());
346  }
347 
348  // select modules for counting hits in signal and background time windows
349 
350  std::vector<bool> selectedSlots(m_numModules, false);
351  for (size_t i = 0; i < selectedSlots.size(); i++) {
352  selectedSlots[i] = (recBunchValid or cosmics) and numTracks[i] == 1 and trackMomenta[i] > m_momentumCut;
353  }
354 
355  // prepare counters
356 
357  int nHits_good = 0;
358  int nHits_bad = 0;
359  std::vector<int> numSignalHits(m_numModules, 0);
360  std::vector<int> numBackgroundHits(m_numModules, 0);
361 
362  // loop over digits, fill histograms and increment counters
363 
364  for (const auto& digit : m_digits) {
365  int slot = digit.getModuleID();
366  if (slot < 1 or slot > m_numModules) {
367  B2ERROR("Invalid slot ID found in TOPDigits: ID = " << slot);
368  continue;
369  }
370  int asic_no = digit.getChannel() / 8;
371  int asic_ch = digit.getChannel() % 8;
372 
373  m_window_vs_slot->Fill(digit.getModuleID(), digit.getRawTime() / 64 + 220);
374  m_window_vs_asic[slot - 1]->Fill(asic_no, digit.getRawTime() / 64 + 220);
375 
376  if (digit.getHitQuality() != TOPDigit::c_Junk) { // good hits
377  m_goodHitsXY[slot - 1]->Fill(digit.getPixelCol(), digit.getPixelRow());
378  m_goodHitsAsics[slot - 1]->Fill(asic_no, asic_ch);
379  m_goodTDC[slot - 1]->Fill(digit.getRawTime());
380  m_goodTDCAll->Fill(digit.getRawTime());
381  m_goodChannelHits[slot - 1]->Fill(digit.getChannel());
382  m_pulseHeights[slot - 1]->Fill(digit.getPMTNumber(), digit.getPulseHeight());
383  nHits_good++;
384  if (digit.hasStatus(TOPDigit::c_EventT0Subtracted)) {
385  double time = digit.getTime();
386  if (cosmics) time += 10; // move for 10 ns in order to get the complete signal at positive times
387  if (numTracks[slot - 1] > 0) {
388  m_goodTiming[slot - 1]->Fill(time);
389  m_time->Fill(time);
390  } else {
391  m_goodTimingBG[slot - 1]->Fill(time);
392  m_timeBG->Fill(time);
393  }
394  if (selectedSlots[slot - 1] and abs(time) < 50) {
395  if (time > 0) numSignalHits[slot - 1]++;
396  else numBackgroundHits[slot - 1]++;
397  }
398  }
399  } else { // bad hits: FE not valid, pedestal jump, too short or too wide pulses
400  m_badHitsXY[slot - 1]->Fill(digit.getPixelCol(), digit.getPixelRow());
401  m_badHitsAsics[slot - 1]->Fill(asic_no, asic_ch);
402  m_badTDC[slot - 1]->Fill(digit.getRawTime());
403  m_badTDCAll->Fill(digit.getRawTime());
404  m_badChannelHits[slot - 1]->Fill(digit.getChannel());
405  nHits_bad++;
406  }
407  }
408 
409  // histogram counters
410 
411  m_goodHitsPerEventAll->Fill(nHits_good);
412  m_badHitsPerEventAll->Fill(nHits_bad);
413  for (int slot = 1; slot <= m_numModules; slot++) {
414  if (selectedSlots[slot - 1]) {
415  m_signalHits->Fill(slot, numSignalHits[slot - 1]);
416  m_backgroundHits->Fill(slot, numBackgroundHits[slot - 1]);
417  }
418  }
419 
420  // fill injection histograms
421 
422  for (auto& it : m_rawFTSW) {
423  B2DEBUG(29, "TTD FTSW : " << hex << it.GetTTUtime(0) << " " << it.GetTTCtime(0) << " EvtNr " << it.GetEveNo(0) << " Type " <<
424  (it.GetTTCtimeTRGType(0) & 0xF) << " TimeSincePrev " << it.GetTimeSincePrevTrigger(0) << " TimeSinceInj " <<
425  it.GetTimeSinceLastInjection(0) << " IsHER " << it.GetIsHER(0) << " Bunch " << it.GetBunchNumber(0));
426  auto difference = it.GetTimeSinceLastInjection(0);
427  if (difference != 0x7FFFFFFF) {
428  unsigned int nentries = m_digits.getEntries();
429  float diff2 = difference / 127.; // 127MHz clock ticks to us, inexact rounding
430  if (it.GetIsHER(0)) {
431  m_TOPOccAfterInjHER->Fill(diff2, nentries);
432  m_TOPEOccAfterInjHER->Fill(diff2);
433  } else {
434  m_TOPOccAfterInjLER->Fill(diff2, nentries);
435  m_TOPEOccAfterInjLER->Fill(diff2);
436  }
437  }
438  }
439 
440  }
441 
442 
443  int TOPDQMModule::getModuleID(const Track& track) const
444  {
445  Const::EDetector myDetID = Const::EDetector::TOP;
446  int pdgCode = std::abs(Const::pion.getPDGCode());
447 
448  RelationVector<ExtHit> extHits = track.getRelationsWith<ExtHit>();
449  for (const auto& extHit : extHits) {
450  if (std::abs(extHit.getPdgCode()) != pdgCode) continue;
451  if (extHit.getDetectorID() != myDetID) continue;
452  if (extHit.getCopyID() < 1 or extHit.getCopyID() > m_numModules) continue;
453  return extHit.getCopyID();
454  }
455 
456  return 0;
457  }
458 
459 
461 } // end Belle2 namespace
462 
EDetector
Enum for identifying the detector components (detector and subdetector).
Definition: Const.h:42
static const ChargedStable pion
charged pion particle
Definition: Const.h:652
Store one Ext hit as a ROOT object.
Definition: ExtHit.h:32
int getCopyID() const
Get detector-element ID of sensitive element within detector.
Definition: ExtHit.h:126
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
Definition: HistoModule.h:29
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
Class for type safe access to objects that are referred to in relations.
std::vector< TH2F * > m_window_vs_asic
Histograms window w.r.t reference vs.
Definition: TOPDQMModule.h:116
std::vector< TH1F * > m_badChannelHits
Histograms for bad channel hits.
Definition: TOPDQMModule.h:126
int m_numModules
number of TOP modules
Definition: TOPDQMModule.h:130
std::vector< TH2F * > m_goodHitsXY
Histograms (2D) for good hits in pixels.
Definition: TOPDQMModule.h:117
std::vector< TH2F * > m_goodHitsAsics
Histograms (2D) for good hits in asic channels.
Definition: TOPDQMModule.h:119
StoreObjPtr< TOPRecBunch > m_recBunch
reconstructed bunch and event T0
Definition: TOPDQMModule.h:135
DBObjPtr< TOPCalCommonT0 > m_commonT0
common T0 calibration constants
Definition: TOPDQMModule.h:140
double m_momentumCut
momentum cut
Definition: TOPDQMModule.h:94
std::vector< TH2F * > m_badHitsXY
Histograms (2D) for bad hits in pixels.
Definition: TOPDQMModule.h:118
TH1F * m_bunchOffset
reconstructed bunch: current offset
Definition: TOPDQMModule.h:100
TProfile * m_backgroundHits
number of hits in the background time window vs.
Definition: TOPDQMModule.h:104
std::vector< TH1F * > m_badTDC
Histograms for TDC distribution of bad hits.
Definition: TOPDQMModule.h:122
std::vector< TH1F * > m_goodChannelHits
Histograms for good channel hits.
Definition: TOPDQMModule.h:125
TH1F * m_eventT0
reconstructed event T0
Definition: TOPDQMModule.h:99
StoreArray< RawFTSW > m_rawFTSW
Input array for DAQ Status.
Definition: TOPDQMModule.h:133
TH2F * m_window_vs_slot
Histogram window w.r.t reference vs.
Definition: TOPDQMModule.h:98
std::vector< TH1F * > m_goodTDC
Histograms for TDC distribution of good hits.
Definition: TOPDQMModule.h:121
std::vector< TH1F * > m_goodTimingBG
Histograms for timing distribution of good hits (background)
Definition: TOPDQMModule.h:124
TH1F * m_timeBG
time distribution of good hits (background)
Definition: TOPDQMModule.h:102
TH1F * m_TOPEOccAfterInjHER
Histogram for Nr Entries (=Triggrs) for normalization after HER injection.
Definition: TOPDQMModule.h:114
std::string m_histogramDirectoryName
histogram directory in ROOT file
Definition: TOPDQMModule.h:93
StoreArray< Track > m_tracks
collection of tracks
Definition: TOPDQMModule.h:137
TH1F * m_badHitsPerEventAll
Number of bad hits per event (all slots)
Definition: TOPDQMModule.h:107
TH1F * m_TOPEOccAfterInjLER
Histogram for Nr Entries (=Triggrs) for normalization after LER injection.
Definition: TOPDQMModule.h:113
std::vector< TH1F * > m_goodTiming
Histograms for timing distribution of good hits.
Definition: TOPDQMModule.h:123
TH1F * m_time
time distribution of good hits
Definition: TOPDQMModule.h:101
TH1F * m_goodTDCAll
TDC distribution of good hits (all slots)
Definition: TOPDQMModule.h:108
TH1F * m_TOPOccAfterInjLER
Histogram Ndigits after LER injection.
Definition: TOPDQMModule.h:111
StoreArray< TOPDigit > m_digits
collection of digits
Definition: TOPDQMModule.h:134
std::vector< TProfile * > m_pulseHeights
Pulse heights of good hits.
Definition: TOPDQMModule.h:127
StoreArray< TOPTimeZero > m_timeZeros
reconstructed event T0 in case of cosmics
Definition: TOPDQMModule.h:136
TProfile * m_signalHits
number of hits in the signal time window vs.
Definition: TOPDQMModule.h:103
TH1D * m_BoolEvtMonitor
Event desynchronization monitoring.
Definition: TOPDQMModule.h:97
std::vector< TH2F * > m_badHitsAsics
Histograms (2D) for bad hits in asic channels.
Definition: TOPDQMModule.h:120
TH1F * m_TOPOccAfterInjHER
Histogram Ndigits after HER injection.
Definition: TOPDQMModule.h:112
TH1F * m_badTDCAll
TDC distribution of bad hits (all slots)
Definition: TOPDQMModule.h:109
TH1F * m_goodHitsPerEventAll
Number of good hits per event (all slots)
Definition: TOPDQMModule.h:106
const TOPGeometry * getGeometry() const
Returns pointer to geometry object using basf2 units.
static TOPGeometryPar * Instance()
Static method to obtain the pointer to its instance.
Class that bundles various TrackFitResults.
Definition: Track.h:25
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
virtual void initialize() override
Initialize the Module.
virtual void event() override
Event processor.
virtual ~TOPDQMModule()
Destructor.
Definition: TOPDQMModule.cc:54
virtual void beginRun() override
Called when entering a new run.
int getModuleID(const Track &track) const
Returns slot ID of the module that is hit by the track.
virtual void defineHisto() override
Histogram definitions such as TH1(), TH2(), TNtuple(), TTree()....
Definition: TOPDQMModule.cc:58
Abstract base class for different kinds of events.