Belle II Software  release-06-01-15
SVDDQMInjectionModule.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 <svd/modules/svdDQM/SVDDQMInjectionModule.h>
10 #include "TDirectory.h"
11 
12 using namespace std;
13 using namespace Belle2;
14 using namespace Belle2::SVD;
15 using namespace Belle2::VXD;
16 
17 //-----------------------------------------------------------------
18 // Register the Module
19 //-----------------------------------------------------------------
20 REG_MODULE(SVDDQMInjection)
21 
22 //-----------------------------------------------------------------
23 // Implementation
24 //-----------------------------------------------------------------
25 
26 SVDDQMInjectionModule::SVDDQMInjectionModule() : HistoModule() , m_vxdGeometry(VXD::GeoCache::getInstance())
27 {
28  //Set module properties
29  setDescription("Monitor SVD Occupancy after Injection.");
30  setPropertyFlags(c_ParallelProcessingCertified);
31  addParam("histogramDirectoryName", m_histogramDirectoryName, "Name of the directory where histograms will be placed.",
32  std::string("SVDInjection"));
33  addParam("ShaperDigits", m_SVDShaperDigitsName, "Name of SVD ShaperDigits to count occupancy - usually ZS5 strips.",
34  std::string(""));
35 }
36 
37 void SVDDQMInjectionModule::defineHisto()
38 {
39  TDirectory* oldDir = gDirectory;
40  if (m_histogramDirectoryName != "") {
41  oldDir->mkdir(m_histogramDirectoryName.c_str());// do not rely on return value, might be ZERO
42  oldDir->cd(m_histogramDirectoryName.c_str());//changing to the right directory
43  }
44 
45  m_hOccAfterInjLER = new TH1F("SVDOccInjLER", "SVDOccInjLER/Time;Time in #mus;Count/Time (5 #mus bins)", 4000, 0, 20000);
46  m_hOccAfterInjHER = new TH1F("SVDOccInjHER", "SVDOccInjHER/Time;Time in #mus;Count/Time (5 #mus bins)", 4000, 0, 20000);
47  m_hTrgOccAfterInjLER = new TH1F("SVDTrgOccInjLER", "SVDTrgOccInjLER/Time;Time in #mus;Triggers/Time (5 #mus bins)", 4000, 0,
48  20000);
49  m_hTrgOccAfterInjHER = new TH1F("SVDTrgOccInjHER", "SVDTrgOccInjHER/Time;Time in #mus;Triggers/Time (5 #mus bins)", 4000, 0,
50  20000);
51  m_hMaxOccAfterInjLER = new TH1F("SVDMaxOccInjLER", "SVDMaxOccInjLER/Time;Time in #mus;Triggers/Time (5 #mus bins)", 4000, 0,
52  20000);
53  m_hMaxOccAfterInjHER = new TH1F("SVDMaxOccInjHER", "SVDMaxOccInjHER/Time;Time in #mus;Triggers/Time (5 #mus bins)", 4000, 0,
54  20000);
55  m_hBunchNumVSNStrips = new TH2F("SVDBunchNumVSNStrips", "SVDBunchNumVSNStrips;Bunch No.;Number of fired strips", 1280, 0, 1280, 10,
56  0,
57  10000);
58 
59 
60  // cd back to root directory
61  oldDir->cd();
62 }
63 
64 void SVDDQMInjectionModule::initialize()
65 {
66  REG_HISTOGRAM
67 
68  m_rawTTD.isOptional();
69  m_digits.isOptional(m_SVDShaperDigitsName);
70 }
71 
72 void SVDDQMInjectionModule::beginRun()
73 {
74  // Assume that everthing is non-zero ;-)
75  m_hOccAfterInjLER->Reset();
76  m_hOccAfterInjHER->Reset();
77  m_hTrgOccAfterInjLER->Reset();
78  m_hTrgOccAfterInjHER->Reset();
79  m_hMaxOccAfterInjLER->Reset();
80  m_hMaxOccAfterInjHER->Reset();
81  m_hBunchNumVSNStrips->Reset();
82 }
83 
84 void SVDDQMInjectionModule::event()
85 {
86 
87  if (!m_rawTTD.isValid()) {
88  B2WARNING("Missing RawFTSW, SVDDQMInjection is skipped.");
89  return;
90  }
91 
92  if (!m_digits.isValid()) {
93  B2WARNING("Missing " << m_SVDShaperDigitsName << ", SVDDQMInjection is skipped.");
94  return;
95  }
96 
97 
98  for (auto& it : m_rawTTD) {
99  B2DEBUG(29, "TTD FTSW : " << hex << it.GetTTUtime(0) << " " << it.GetTTCtime(0) << " EvtNr " << it.GetEveNo(0) << " Type " <<
100  (it.GetTTCtimeTRGType(0) & 0xF) << " TimeSincePrev " << it.GetTimeSincePrevTrigger(0) << " TimeSinceInj " <<
101  it.GetTimeSinceLastInjection(0) << " IsHER " << it.GetIsHER(0) << " Bunch " << it.GetBunchNumber(0));
102 
103  // get last injection time
104  auto difference = it.GetTimeSinceLastInjection(0);
105  // check time overflow, too long ago
106  if (difference != 0x7FFFFFFF) {
107  unsigned int allV = 0;
108  unsigned int allU = 0;
109  unsigned int nHitsL3v = 0;
110  unsigned int nHitsL3u = 0;
111  for (auto& p : m_digits) {
112  if (p.isUStrip()) allU++;
113  else allV++;
114 
115  if (p.getSensorID().getLayerNumber() != 3) continue;
116  if (p.isUStrip())
117  nHitsL3u++;
118  else nHitsL3v++;
119  }
120 
121  B2DEBUG(29, "L3 V = " << nHitsL3v << ", L3 U = " << nHitsL3u << ", all V = " << allV << ", all U = " << allU);
122 
123  //choose your counter
124  unsigned int counter = nHitsL3u;
125 
126  float diff2 = difference / 127.; // 127MHz clock ticks to us, inexact rounding
127  if (it.GetIsHER(0)) {
128  m_hOccAfterInjHER->Fill(diff2, counter);
129  m_hTrgOccAfterInjHER->Fill(diff2);
130  auto bin = m_hMaxOccAfterInjHER->FindBin(diff2);
131  auto value = m_hMaxOccAfterInjHER->GetBinContent(bin);
132  if (counter > value) m_hMaxOccAfterInjHER->SetBinContent(bin, counter);
133  } else {
134  m_hOccAfterInjLER->Fill(diff2, counter);
135  m_hTrgOccAfterInjLER->Fill(diff2);
136  auto bin = m_hMaxOccAfterInjLER->FindBin(diff2);
137  auto value = m_hMaxOccAfterInjLER->GetBinContent(bin);
138  if (counter > value) m_hMaxOccAfterInjLER->SetBinContent(bin, counter);
139 
140  }
141  m_hBunchNumVSNStrips->Fill(it.GetBunchNumber(0), allU + allV);
142  }
143 
144  break;
145  }
146 }
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
Definition: HistoModule.h:29
The SVD Occupancy after Injection DQM module.
Class to faciliate easy access to sensor information of the VXD like coordinate transformations or pi...
Definition: GeoCache.h:39
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
Namespace to encapsulate code needed for simulation and reconstrucion of the SVD.
Definition: GeoSVDCreator.h:23
Namespace to provide code needed by both Vertex Detectors, PXD and SVD, and also testbeam telescopes.
Definition: GeoCache.h:34
Abstract base class for different kinds of events.