Belle II Software  release-08-01-10
TrackingAbortDQMModule.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 "tracking/modules/trackingDQM/TrackingAbortDQMModule.h"
10 
11 #include <framework/dataobjects/EventMetaData.h>
12 #include <svd/dataobjects/SVDShaperDigit.h>
13 #include <svd/dataobjects/SVDCluster.h>
14 #include <cdc/dataobjects/CDCHit.h>
15 #include <mdst/dataobjects/EventLevelTrackingInfo.h>
16 #include <mdst/dataobjects/TRGSummary.h>
17 
18 #include <TDirectory.h>
19 #include <TLine.h>
20 #include <TStyle.h>
21 
22 #include <algorithm>
23 
24 
25 using namespace Belle2;
26 
27 //-----------------------------------------------------------------
28 // Register the Module
29 //-----------------------------------------------------------------
30 REG_MODULE(TrackingAbortDQM);
31 
32 
33 //-----------------------------------------------------------------
34 // Implementation
35 //-----------------------------------------------------------------
36 
38 {
39  setDescription("DQM Module to monitor Tracking Aborts and detector-related quantities.");
40 
41  addParam("histogramDirectoryName", m_histogramDirectoryName, "Name of the directory where histograms will be placed.",
42  std::string("TrackingAbort"));
43 
45 }
46 
47 
48 TrackingAbortDQMModule::~TrackingAbortDQMModule()
49 {
50 }
51 
52 //------------------------------------------------------------------
53 // Function to define histograms
54 //-----------------------------------------------------------------
55 
57 {
58 
59  // Create a separate histogram directories and cd into it.
60  TDirectory* oldDir = gDirectory;
61  if (m_histogramDirectoryName != "") {
62  oldDir->mkdir(m_histogramDirectoryName.c_str());
63  oldDir->cd(m_histogramDirectoryName.c_str());
64  }
65 
66  //histogram index:
67  // 0 if the event is triggered OUTSIDE the active_veto window
68  std::string tag[2] = {"OUT", "IN"};
69  std::string title[2] = {"[Outside Active Veto Window]", "[Inside Active Veto Window]"};
70 
71 
72  //number of events with and without at least one abort
73  //outside active_veto window:
74  std::string histoName = "EventsWithAborts";
75  std::string histoTitle = "Events With at Least one Abort";
76  m_nEventsWithAbort[0] = new TH1F(TString::Format("%s_%s", histoName.c_str(), tag[0].c_str()),
77  TString::Format("%s %s", histoTitle.c_str(), title[0].c_str()),
78  2, -0.5, 1.5);
79  m_nEventsWithAbort[0]->GetYaxis()->SetTitle("Number of Events");
80  m_nEventsWithAbort[0]->GetXaxis()->SetBinLabel(1, "No Abort");
81  m_nEventsWithAbort[0]->GetXaxis()->SetBinLabel(2, "At Least One Abort");
82  m_nEventsWithAbort[0]->SetMinimum(0.1);
83 
84  //inside active_veto window:
85  m_nEventsWithAbort[1] = new TH1F(*m_nEventsWithAbort[0]);
86  m_nEventsWithAbort[1]->SetName(TString::Format("%s_%s", histoName.c_str(), tag[1].c_str()));
87  m_nEventsWithAbort[1]->SetTitle(TString::Format("%s %s", histoTitle.c_str(), title[1].c_str()));
88 
89  //abort flag reason
90  //outside active_veto window:
91  histoName = "TrkAbortReason";
92  histoTitle = "Tracking Abort Reason";
93  m_trackingErrorFlagsReasons[0] = new TH1F(TString::Format("%s_%s", histoName.c_str(), tag[0].c_str()),
94  TString::Format("%s %s", histoTitle.c_str(), title[0].c_str()),
95  5, -0.5, 4.5);
96  m_trackingErrorFlagsReasons[0]->GetXaxis()->SetTitle("Type of error occurred");
97  m_trackingErrorFlagsReasons[0]->GetYaxis()->SetTitle("Number of Events");
98  m_trackingErrorFlagsReasons[0]->GetXaxis()->SetBinLabel(1, "Unspecified PR");
99  m_trackingErrorFlagsReasons[0]->GetXaxis()->SetBinLabel(2, "VXDTF2");
100  m_trackingErrorFlagsReasons[0]->GetXaxis()->SetBinLabel(3, "SVDCKF");
101  m_trackingErrorFlagsReasons[0]->GetXaxis()->SetBinLabel(4, "PXDCKF");
102  m_trackingErrorFlagsReasons[0]->GetXaxis()->SetBinLabel(5, "SpacePoint");
103  //inside active_veto window:
105  m_trackingErrorFlagsReasons[1]->SetName(TString::Format("%s_%s", histoName.c_str(), tag[1].c_str()));
106  m_trackingErrorFlagsReasons[1]->SetTitle(TString::Format("%s %s", histoTitle.c_str(), title[1].c_str()));
107 
108 
109  //SVD L3 occupancy - see SVDDQMDose module for details
110  histoName = "SVDL3UOcc";
111  histoTitle = "SVD L3 u-side ZS5 Occupancy (%)";
112  //outside active_veto window:
113  m_svdL3uZS5Occupancy[0] = new TH1F(TString::Format("%s_%s", histoName.c_str(), tag[0].c_str()),
114  TString::Format("%s %s", histoTitle.c_str(), title[0].c_str()),
115  90, 0, 100.0 / 1536.0 * 90);
116  m_svdL3uZS5Occupancy[0]->GetXaxis()->SetTitle("occupancy [%]");
117  m_svdL3uZS5Occupancy[0]->GetYaxis()->SetTitle("Number of Events");
118  //inside active_veto window:
119  m_svdL3uZS5Occupancy[1] = new TH1F(*m_svdL3uZS5Occupancy[0]);
120  m_svdL3uZS5Occupancy[1]->SetName(TString::Format("%s_%s", histoName.c_str(), tag[1].c_str()));
121  m_svdL3uZS5Occupancy[1]->SetTitle(TString::Format("%s %s", histoTitle.c_str(), title[1].c_str()));
122 
123 
124  //CDC extra hits
125  histoName = "nCDCExtraHits";
126  histoTitle = "Number of CDC Extra Hits";
127  //outside active_veto window:
128  m_nCDCExtraHits[0] = new TH1F(TString::Format("%s_%s", histoName.c_str(), tag[0].c_str()),
129  TString::Format("%s %s", histoTitle.c_str(), title[0].c_str()),
130  200, 0, 5000);
131  m_nCDCExtraHits[0]->GetXaxis()->SetTitle("nCDCExtraHits");
132  m_nCDCExtraHits[0]->GetYaxis()->SetTitle("Number of Events");
133  //inside active_veto window:
134  m_nCDCExtraHits[1] = new TH1F(*m_nCDCExtraHits[0]);
135  m_nCDCExtraHits[1]->SetName(TString::Format("%s_%s", histoName.c_str(), tag[1].c_str()));
136  m_nCDCExtraHits[1]->SetTitle(TString::Format("%s %s", histoTitle.c_str(), title[1].c_str()));
137 
138  //SVD L3 v-side cluster time
139  histoName = "svdL3VTime";
140  histoTitle = "Layer3 v-side Cluster Time Distribution";
141  //outside active_veto window:
142  m_svdTime[0] = new TH1F(TString::Format("%s_%s", histoName.c_str(), tag[0].c_str()),
143  TString::Format("%s %s", histoTitle.c_str(), title[0].c_str()),
144  300, -150, 150);
145  m_svdTime[0]->GetXaxis()->SetTitle("cluster time (ns)");
146  m_svdTime[0]->GetYaxis()->SetTitle("Number of Events");
147  //inside active_veto window:
148  m_svdTime[1] = new TH1F(*m_svdTime[0]);
149  m_svdTime[1]->SetName(TString::Format("%s_%s", histoName.c_str(), tag[1].c_str()));
150  m_svdTime[1]->SetTitle(TString::Format("%s %s", histoTitle.c_str(), title[1].c_str()));
151 
152  //SVD, CDC Averages
153  histoName = "averages";
154  histoTitle = "Averages from SVD and CDC";
155  //outside active_veto window:
156  m_integratedAverages[0] = new TH1D(TString::Format("%s_%s", histoName.c_str(), tag[0].c_str()),
157  TString::Format("%s %s", histoTitle.c_str(), title[0].c_str()),
158  5, 0, 5);
159  m_integratedAverages[0]->GetYaxis()->SetTitle("Number of X [bin-dependent]");
160  m_integratedAverages[0]->GetXaxis()->SetBinLabel(1, "nCDCHitsInner");
161  m_integratedAverages[0]->GetXaxis()->SetBinLabel(2, "nCDCHitsOuter");
162  m_integratedAverages[0]->GetXaxis()->SetBinLabel(3, "nStripsZS5_L3V");
163  m_integratedAverages[0]->GetXaxis()->SetBinLabel(4, "nStripsZS5_L4U");
164  m_integratedAverages[0]->GetXaxis()->SetBinLabel(5, "nStripsZS5_L4V");
165  //inside active_veto window:
166  m_integratedAverages[1] = new TH1D(*m_integratedAverages[0]);
167  m_integratedAverages[1]->SetName(TString::Format("%s_%s", histoName.c_str(), tag[1].c_str()));
168  m_integratedAverages[1]->SetTitle(TString::Format("%s %s", histoTitle.c_str(), title[1].c_str()));
169 
170  oldDir->cd();
171 
172 }
173 
175 {
176  m_eventLevelTrackingInfo.isOptional();
177  m_eventMetaData.isOptional();
178  m_trgSummary.isOptional();
179  m_strips.isOptional();
180  m_cdcHits.isOptional();
181 
182  // Register histograms (calls back defineHisto)
183  REG_HISTOGRAM
184 }
185 
186 
188 {
189 
190  if (m_trackingErrorFlagsReasons[0] != nullptr) m_trackingErrorFlagsReasons[0]->Reset();
191  if (m_trackingErrorFlagsReasons[1] != nullptr) m_trackingErrorFlagsReasons[1]->Reset();
192  if (m_nEventsWithAbort[0] != nullptr) m_nEventsWithAbort[0]->Reset();
193  if (m_nEventsWithAbort[1] != nullptr) m_nEventsWithAbort[1]->Reset();
194  if (m_svdL3uZS5Occupancy[0] != nullptr) m_svdL3uZS5Occupancy[0]->Reset();
195  if (m_svdL3uZS5Occupancy[1] != nullptr) m_svdL3uZS5Occupancy[1]->Reset();
196  if (m_nCDCExtraHits[0] != nullptr) m_nCDCExtraHits[0]->Reset();
197  if (m_nCDCExtraHits[1] != nullptr) m_nCDCExtraHits[1]->Reset();
198  if (m_svdTime[0] != nullptr) m_svdTime[0]->Reset();
199  if (m_svdTime[1] != nullptr) m_svdTime[1]->Reset();
200  if (m_integratedAverages[0] != nullptr) m_integratedAverages[0]->Reset();
201  if (m_integratedAverages[1] != nullptr) m_integratedAverages[1]->Reset();
202 }
203 
204 
206 {
207 
208  //skip events in which we do not have EventMetaData or TRGSummary
209  if (!m_eventMetaData.isValid()) return;
210  if (!m_trgSummary.isValid()) return;
211 
212  //skip the empty events
213  if (m_eventMetaData->getErrorFlag() & EventMetaData::EventErrorFlag::c_B2LinkPacketCRCError)
214  return;
215 
216  if (m_eventMetaData->getErrorFlag() & EventMetaData::EventErrorFlag::c_B2LinkEventCRCError)
217  return;
218 
219  if (m_eventMetaData->getErrorFlag() & EventMetaData::EventErrorFlag::c_HLTCrash)
220  return;
221 
222  if (m_eventMetaData->getErrorFlag() & EventMetaData::EventErrorFlag::c_ReconstructionAbort)
223  return;
224 
225  //find out if we are in the passive veto (i=0) or in the active veto window (i=1)
226  int index = 0; //events accepted in the passive veto window but not in the active
227  if (m_trgSummary->testInput("passive_veto") == 1 && m_trgSummary->testInput("cdcecl_veto") == 0) index = 1;
228 
229 
230  //fill the tracking abort reason histogram & nEvents with Abort
231  if (m_eventLevelTrackingInfo.isValid()) {
232  if (m_eventLevelTrackingInfo->hasAnErrorFlag()) {
233 
234  m_nEventsWithAbort[index]->Fill(1);
235 
236  if (m_eventLevelTrackingInfo->hasUnspecifiedTrackFindingFailure())
237  m_trackingErrorFlagsReasons[index]->Fill(0);
238  if (m_eventLevelTrackingInfo->hasVXDTF2AbortionFlag())
239  m_trackingErrorFlagsReasons[index]->Fill(1);
240  if (m_eventLevelTrackingInfo->hasSVDCKFAbortionFlag())
241  m_trackingErrorFlagsReasons[index]->Fill(2);
242  if (m_eventLevelTrackingInfo->hasPXDCKFAbortionFlag())
243  m_trackingErrorFlagsReasons[index]->Fill(3);
244  if (m_eventLevelTrackingInfo->hasSVDSpacePointCreatorAbortionFlag())
245  m_trackingErrorFlagsReasons[index]->Fill(4);
246  } else { //EventLevelTrackingInfo valid but no error
247  m_nEventsWithAbort[index]->Fill(0);
248  }
249  } else //EventLevelTrackingInfo not valid
250  m_nEventsWithAbort[index]->Fill(0);
251 
252  //compute the number of ZS5 strips of L3 and L4, both sides
253  float nStripsL3UZS5 = 0;
254  float nStripsL3VZS5 = 0;
255  float nStripsL4UZS5 = 0;
256  float nStripsL4VZS5 = 0;
257  for (const SVDShaperDigit& hit : m_strips) {
258  const VxdID& sensorID = hit.getSensorID();
259  if (sensorID.getLayerNumber() > 4) continue;
260  const float noise = m_NoiseCal.getNoise(sensorID, hit.isUStrip(), hit.getCellID());
261  const float cutMinSignal = std::round(5 * noise);
262 
263  if (hit.passesZS(1, cutMinSignal)) {
264  if (sensorID.getLayerNumber() == 3) {
265  if (hit.isUStrip()) nStripsL3UZS5++;
266  else nStripsL3VZS5++;
267  } else if (hit.isUStrip()) nStripsL4UZS5++;
268  else nStripsL4VZS5++;
269  }
270  }
271 
272  //fill the SVD L3 v-side cluster time
273  for (const SVDCluster& hit : m_clusters) {
274  const VxdID& sensorID = hit.getSensorID();
275  if (sensorID.getLayerNumber() != 3) continue;
276  if (hit.isUCluster()) continue;
277 
278  m_svdTime[index]->Fill(hit.getClsTime());
279  }
280 
281  // fill the svd L3 v ZS5 occupancy, add the overflow in the last bin to make them visible in the plot
282  m_svdL3uZS5Occupancy[index]->Fill(std::min((double)nStripsL3UZS5 / m_nStripsL3U * 100, (double)5.82));
283 
284  //fill the nCDCExtraHits, add the overflow in the last bin to make them visible in the plot
285  if (m_eventLevelTrackingInfo.isValid())
286  m_nCDCExtraHits[index]->Fill(std::min((int)m_eventLevelTrackingInfo->getNCDCHitsNotAssigned(), (int)4999));
287 
288  //compute number of CDC hits in the inner and outer layers
289  int nCDCHitsInner = 0;
290  int nCDCHitsOuter = 0;
291  for (const CDCHit& hit : m_cdcHits) {
292  if (hit.getISuperLayer() == 0) nCDCHitsInner++;
293  else nCDCHitsOuter++;
294  }
295 
296  // fill the integrated averages TH1F
297  // bin 1: nCDCHits Inner layers
298  updateBinContent(index, 1, nCDCHitsInner);
299  // bin 2: nCDCHits Outer layers
300  updateBinContent(index, 2, nCDCHitsOuter);
301  // bin 3: nStrips L3 V-side
302  updateBinContent(index, 3, nStripsL3VZS5);
303  // bin 4: nStrips L4 U-side
304  updateBinContent(index, 4, nStripsL4UZS5);
305  // bin 5: nStrips L4 V-side
306  updateBinContent(index, 5, nStripsL4VZS5);
307 
308 
309 }
310 
311 void TrackingAbortDQMModule::updateBinContent(int index, int bin, float valueToBeAdded)
312 {
313  float oldValue = m_integratedAverages[index]->GetBinContent(bin);
314  m_integratedAverages[index]->SetBinContent(bin, oldValue + valueToBeAdded);
315 }
Class containing the result of the unpacker in raw data and the result of the digitizer in simulation...
Definition: CDCHit.h:40
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
The SVD Cluster class This class stores all information about reconstructed SVD clusters.
Definition: SVDCluster.h:29
float getNoise(const VxdID &sensorID, const bool &isU, const unsigned short &strip) const
This is the method for getting the noise.
The SVD ShaperDigit class.
void initialize() override final
Module function initialize.
TH1F * m_svdTime[2]
L3 V-side time for all clusters.
StoreObjPtr< EventLevelTrackingInfo > m_eventLevelTrackingInfo
tracking abort info
TH1D * m_integratedAverages[2]
integrated averages of additional SVD, CDC variables
SVDNoiseCalibrations m_NoiseCal
SVDNoise calibration db object.
TH1F * m_trackingErrorFlagsReasons[2]
stores the reason of the abort
void defineHisto() override final
Defines Histograms.
StoreObjPtr< TRGSummary > m_trgSummary
trg summary
TH1F * m_svdL3uZS5Occupancy[2]
distribution of the SVD L3 V ZS5 occupancy
StoreArray< SVDCluster > m_clusters
SVD clusters.
TH1F * m_nEventsWithAbort[2]
0: no abort; 1: at least one abort
TH1F * m_nCDCExtraHits[2]
distribution of the number of extra CDC hits
static constexpr int m_nStripsL3U
number of U-side L3 strips
StoreObjPtr< EventMetaData > m_eventMetaData
event meta data
void event() override final
Module function event.
StoreArray< SVDShaperDigit > m_strips
SVD strips.
void updateBinContent(int index, int bin, float valueToBeAdded)
function to update the bin content
std::string m_histogramDirectoryName
Name of the histogram directory in ROOT file.
StoreArray< CDCHit > m_cdcHits
CDCHits.
void beginRun() override final
Module function beginRun.
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:33
baseType getLayerNumber() const
Get the layer id.
Definition: VxdID.h:96
REG_MODULE(arichBtest)
Register the Module.
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
Abstract base class for different kinds of events.