Belle II Software  release-06-00-14
SVDDQMExpressRecoModule.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/SVDDQMExpressRecoModule.h"
10 
11 #include <hlt/softwaretrigger/core/FinalTriggerDecisionCalculator.h>
12 #include <framework/datastore/StoreObjPtr.h>
13 #include <framework/datastore/StoreArray.h>
14 #include <framework/dataobjects/EventMetaData.h>
15 
16 #include <svd/dataobjects/SVDShaperDigit.h>
17 #include <svd/dataobjects/SVDCluster.h>
18 
19 #include <vxd/geometry/SensorInfoBase.h>
20 #include <vxd/geometry/GeoTools.h>
21 
22 #include <boost/format.hpp>
23 
24 #include "TDirectory.h"
25 
26 using namespace std;
27 using boost::format;
28 using namespace Belle2;
29 using namespace SoftwareTrigger;
30 
31 //-----------------------------------------------------------------
32 // Register the Module
33 //-----------------------------------------------------------------
34 REG_MODULE(SVDDQMExpressReco)
35 
36 
37 //-----------------------------------------------------------------
38 // Implementation
39 //-----------------------------------------------------------------
40 
42 {
43  //Set module properties
44  setDescription("Original SVD DQM module for ExpressReco.");
45 
46  setPropertyFlags(c_ParallelProcessingCertified); // specify this flag if you need parallel processing
47  addParam("offlineZSShaperDigits", m_storeSVDShaperDigitsName, "ShaperDigits StoreArray name - usually ZS5 strips.",
48  std::string("SVDShaperDigitsZS5"));
49  addParam("ShaperDigits", m_storeNoZSSVDShaperDigitsName, "not zero-suppressed ShaperDigits StoreArray name.",
50  std::string("SVDShaperDigits"));
51  addParam("Clusters", m_storeSVDClustersName, "Cluster StoreArray name.",
52  std::string("SVDClusters"));
53  addParam("skipHLTRejectedEvents", m_skipRejectedEvents, "If True, skip events rejected by HLT.", bool(true));
54  addParam("ShowAllHistos", m_ShowAllHistos, "Flag to show all histos in DQM, default = 0.", int(0));
55  addParam("desynchronizeSVDTime", m_desynchSVDTime,
56  "if True, svd time back in SVD time reference.", bool(false));
57  addParam("CutSVDCharge", m_CutSVDCharge,
58  "minimum charge (ADC) to fill the strip-hitmap histogram.", float(0));
59  addParam("CutSVDClusterCharge", m_CutSVDClusterCharge,
60  "minimum charge (in e-) to fill the cluster-hitmap histogram.", float(0));
61  addParam("histogramDirectoryName", m_histogramDirectoryName, "Name of the directory where histograms will be placed.",
62  std::string("SVDExpReco"));
63 
64  m_histoList = new TList();
65 }
66 
67 
68 SVDDQMExpressRecoModule::~SVDDQMExpressRecoModule()
69 {
70 }
71 
72 //------------------------------------------------------------------
73 // Function to define histograms
74 //-----------------------------------------------------------------
75 
76 void SVDDQMExpressRecoModule::defineHisto()
77 {
78  auto gTools = VXD::GeoCache::getInstance().getGeoTools();
79  if (gTools->getNumberOfLayers() == 0) {
80  B2FATAL("Missing geometry for VXD, check steering file.");
81  }
82  if (gTools->getNumberOfSVDLayers() == 0) {
83  B2WARNING("Missing geometry for SVD, SVD-DQM is skiped.");
84  return;
85  }
86 
87  // Create a separate histogram directories and cd into it.
88  TDirectory* oldDir = gDirectory;
89  if (m_histogramDirectoryName != "") {
90  oldDir->mkdir(m_histogramDirectoryName.c_str());// do not use return value with ->cd(), its ZERO if dir already exists
91  oldDir->cd(m_histogramDirectoryName.c_str());
92  }
93 
94  // basic constants presets:
95  int nSVDSensors = gTools->getNumberOfSVDSensors();
96  int nSVDChips = gTools->getTotalSVDChips();
97 
98  // number of events counter
99  m_nEvents = new TH1F("SVDDQM_nEvents", "SVD Number of Events", 1, -0.5, 0.5);
100  m_nEvents->GetYaxis()->SetTitle("N events");
101  m_histoList->Add(m_nEvents);
102 
103  // Create basic histograms:
104  // basic counters per sensor:
105  m_hitMapCountsU = new TH1F("SVDDQM_StripCountsU", "SVD Integrated Number of ZS5 Fired U-Strips per sensor",
106  nSVDSensors, 0, nSVDSensors);
107  m_hitMapCountsU->GetXaxis()->SetTitle("Sensor ID");
108  m_hitMapCountsU->GetYaxis()->SetTitle("counts");
109  m_histoList->Add(m_hitMapCountsU);
110  m_hitMapCountsV = new TH1F("SVDDQM_StripCountsV", "SVD Integrated Number of ZS5 Fired V-Strips per sensor",
111  nSVDSensors, 0, nSVDSensors);
112  m_hitMapCountsV->GetXaxis()->SetTitle("Sensor ID");
113  m_hitMapCountsV->GetYaxis()->SetTitle("counts");
114  m_histoList->Add(m_hitMapCountsV);
115  m_hitMapClCountsU = new TH1F("SVDDQM_ClusterCountsU", "SVD Integrated Number of U-Clusters per sensor",
116  nSVDSensors, 0, nSVDSensors);
117  m_hitMapClCountsU->GetXaxis()->SetTitle("Sensor ID");
118  m_hitMapClCountsU->GetYaxis()->SetTitle("counts");
119  m_histoList->Add(m_hitMapClCountsU);
120  m_hitMapClCountsV = new TH1F("SVDDQM_ClusterCountsV", "SVD Integrated Number of V-Clusters per sensor",
121  nSVDSensors, 0, nSVDSensors);
122  m_hitMapClCountsV->GetXaxis()->SetTitle("Sensor ID");
123  m_hitMapClCountsV->GetYaxis()->SetTitle("counts");
124  m_histoList->Add(m_hitMapClCountsV);
125  for (int i = 0; i < nSVDSensors; i++) {
126  VxdID id = gTools->getSensorIDFromSVDIndex(i);
127  int iLayer = id.getLayerNumber();
128  int iLadder = id.getLadderNumber();
129  int iSensor = id.getSensorNumber();
130  TString AxisTicks = Form("%i_%i_%i", iLayer, iLadder, iSensor);
131  m_hitMapCountsU->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
132  m_hitMapCountsV->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
133  m_hitMapClCountsU->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
134  m_hitMapClCountsV->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
135  }
136 
137  // basic counters per chip:
138  m_hitMapCountsChip = new TH1F("SVDDQM_StripCountsChip", "SVD Integrated Number of ZS5 Fired Strips per chip",
139  nSVDChips, 0, nSVDChips);
140  m_hitMapCountsChip->GetXaxis()->SetTitle("Chip ID");
141  m_hitMapCountsChip->GetYaxis()->SetTitle("counts");
142  m_histoList->Add(m_hitMapCountsChip);
143  m_hitMapClCountsChip = new TH1F("SVDDQM_ClusterCountsChip", "SVD Integrated Number of Clusters per chip",
144  nSVDChips, 0, nSVDChips);
145  m_hitMapClCountsChip->GetXaxis()->SetTitle("Chip ID");
146  m_hitMapClCountsChip->GetYaxis()->SetTitle("counts");
147  m_histoList->Add(m_hitMapClCountsChip);
148 
149  m_firedU = new TH1F*[nSVDSensors];
150  m_firedV = new TH1F*[nSVDSensors];
151  m_clustersU = new TH1F*[nSVDSensors];
152  m_clustersV = new TH1F*[nSVDSensors];
153 
154 
155  m_clusterChargeU = new TH1F*[nSVDSensors];
156  m_clusterChargeV = new TH1F*[nSVDSensors];
157  m_clusterSNRU = new TH1F*[nSVDSensors];
158  m_clusterSNRV = new TH1F*[nSVDSensors];
159  m_stripSignalU = new TH1F*[nSVDSensors];
160  m_stripSignalV = new TH1F*[nSVDSensors];
161  m_stripCountU = new TH1F*[nSVDSensors];
162  m_stripCountV = new TH1F*[nSVDSensors];
163  m_onlineZSstripCountU = new TH1F*[nSVDSensors];
164  m_onlineZSstripCountV = new TH1F*[nSVDSensors];
165  m_clusterSizeU = new TH1F*[nSVDSensors];
166  m_clusterSizeV = new TH1F*[nSVDSensors];
167  m_clusterTimeU = new TH1F*[nSVDSensors];
168  m_clusterTimeV = new TH1F*[nSVDSensors];
169 
170  int ChargeBins = 80;
171  float ChargeMax = 80;
172  int SNRBins = 50;
173  float SNRMax = 100;
174  int TimeBins = 300;
175  float TimeMin = -150;
176  float TimeMax = 150;
177 
178  int MaxBinBins = 6;
179  int MaxBinMax = 6;
180 
181  TString refFrame = "in FTSW reference";
182  if (m_desynchSVDTime)
183  refFrame = "in SVD reference";
184 
185 
186  //----------------------------------------------------------------
187  // Charge of clusters for all sensors
188  //----------------------------------------------------------------
189  string name = str(format("SVDDQM_ClusterChargeUAll"));
190  string title = str(format("SVD U-Cluster Charge for all sensors"));
191  m_clusterChargeUAll = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
192  m_clusterChargeUAll->GetXaxis()->SetTitle("cluster charge [ke-]");
193  m_clusterChargeUAll->GetYaxis()->SetTitle("count");
194  m_histoList->Add(m_clusterChargeUAll);
195  name = str(format("SVDDQM_ClusterChargeVAll"));
196  title = str(format("SVD V-Cluster Charge for all sensors"));
197  m_clusterChargeVAll = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
198  m_clusterChargeVAll->GetXaxis()->SetTitle("cluster charge [ke-]");
199  m_clusterChargeVAll->GetYaxis()->SetTitle("count");
200  m_histoList->Add(m_clusterChargeVAll);
201  //----------------------------------------------------------------
202  // Charge of clusters for L3/L456 sensors
203  //----------------------------------------------------------------
204  name = str(format("SVDDQM_ClusterChargeU3"));
205  title = str(format("SVD U-Cluster Charge for layer 3 sensors"));
206  m_clusterChargeU3 = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
207  m_clusterChargeU3->GetXaxis()->SetTitle("cluster charge [ke-]");
208  m_clusterChargeU3->GetYaxis()->SetTitle("count");
209  m_histoList->Add(m_clusterChargeU3);
210  name = str(format("SVDDQM_ClusterChargeV3"));
211  title = str(format("SVD V-Cluster Charge for layer 3 sensors"));
212  m_clusterChargeV3 = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
213  m_clusterChargeV3->GetXaxis()->SetTitle("cluster charge [ke-]");
214  m_clusterChargeV3->GetYaxis()->SetTitle("count");
215  m_histoList->Add(m_clusterChargeV3);
216 
217  name = str(format("SVDDQM_ClusterChargeU456"));
218  title = str(format("SVD U-Cluster Charge for layers 4,5,6 sensors"));
219  m_clusterChargeU456 = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
220  m_clusterChargeU456->GetXaxis()->SetTitle("cluster charge [ke-]");
221  m_clusterChargeU456->GetYaxis()->SetTitle("count");
222  m_histoList->Add(m_clusterChargeU456);
223 
224  name = str(format("SVDDQM_ClusterChargeV456"));
225  title = str(format("SVD V-Cluster Charge for layers 4,5,6 sensors"));
226  m_clusterChargeV456 = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
227  m_clusterChargeV456->GetXaxis()->SetTitle("cluster charge [ke-]");
228  m_clusterChargeV456->GetYaxis()->SetTitle("count");
229  m_histoList->Add(m_clusterChargeV456);
230 
231  //----------------------------------------------------------------
232  // SNR of clusters for all sensors
233  //----------------------------------------------------------------
234  name = str(format("SVDDQM_ClusterSNRUAll"));
235  title = str(format("SVD U-Cluster SNR for all sensors"));
236  m_clusterSNRUAll = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax); // max = ~ 60
237  m_clusterSNRUAll->GetXaxis()->SetTitle("cluster SNR");
238  m_clusterSNRUAll->GetYaxis()->SetTitle("count");
239  m_histoList->Add(m_clusterSNRUAll);
240  name = str(format("SVDDQM_ClusterSNRVAll"));
241  title = str(format("SVD V-Cluster SNR for all sensors"));
242  m_clusterSNRVAll = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
243  m_clusterSNRVAll->GetXaxis()->SetTitle("cluster SNR");
244  m_clusterSNRVAll->GetYaxis()->SetTitle("count");
245  m_histoList->Add(m_clusterSNRVAll);
246  //----------------------------------------------------------------
247  // SNR of clusters for L3/L456 sensors
248  //----------------------------------------------------------------
249  name = str(format("SVDDQM_ClusterSNRU3"));
250  title = str(format("SVD U-Cluster SNR for layer 3 sensors"));
251  m_clusterSNRU3 = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
252  m_clusterSNRU3->GetXaxis()->SetTitle("cluster SNR");
253  m_clusterSNRU3->GetYaxis()->SetTitle("count");
254  m_histoList->Add(m_clusterSNRU3);
255  name = str(format("SVDDQM_ClusterSNRV3"));
256  title = str(format("SVD V-Cluster SNR for layer 3 sensors"));
257  m_clusterSNRV3 = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
258  m_clusterSNRV3->GetXaxis()->SetTitle("cluster SNR");
259  m_clusterSNRV3->GetYaxis()->SetTitle("count");
260  m_histoList->Add(m_clusterSNRV3);
261 
262  name = str(format("SVDDQM_ClusterSNRU456"));
263  title = str(format("SVD U-Cluster SNR for layers 4,5,6 sensors"));
264  m_clusterSNRU456 = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
265  m_clusterSNRU456->GetXaxis()->SetTitle("cluster SNR");
266  m_clusterSNRU456->GetYaxis()->SetTitle("count");
267  m_histoList->Add(m_clusterSNRU456);
268  name = str(format("SVDDQM_ClusterSNRV456"));
269  title = str(format("SVD V-Cluster SNR for layers 4,5,6 sensors"));
270  m_clusterSNRV456 = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
271  m_clusterSNRV456->GetXaxis()->SetTitle("cluster SNR");
272  m_clusterSNRV456->GetYaxis()->SetTitle("count");
273  m_histoList->Add(m_clusterSNRV456);
274  //----------------------------------------------------------------
275  // Cluster time distribution for all sensors
276  //----------------------------------------------------------------
277  TString Name = "SVDDQM_ClusterTimeUAll";
278  TString Title = Form("SVD U-Cluster Time %s for all sensors", refFrame.Data());
279  m_clusterTimeUAll = new TH1F(Name.Data(), Title.Data(), TimeBins, TimeMin, TimeMax);
280  m_clusterTimeUAll->GetXaxis()->SetTitle("cluster time (ns)");
281  m_clusterTimeUAll->GetYaxis()->SetTitle("count");
282  m_histoList->Add(m_clusterTimeUAll);
283  Name = "SVDDQM_ClusterTimeVAll";
284  Title = Form("SVD V-Cluster Time %s for all sensors", refFrame.Data());
285  m_clusterTimeVAll = new TH1F(Name.Data(), Title.Data(), TimeBins, TimeMin, TimeMax);
286  m_clusterTimeVAll->GetXaxis()->SetTitle("cluster time (ns)");
287  m_clusterTimeVAll->GetYaxis()->SetTitle("count");
288  m_histoList->Add(m_clusterTimeVAll);
289  //----------------------------------------------------------------
290  // Time of clusters for L3/L456 sensors
291  //----------------------------------------------------------------
292  Name = "SVDDQM_ClusterTimeU3";
293  Title = Form("SVD U-Cluster Time %s for layer 3 sensors", refFrame.Data());
294  m_clusterTimeU3 = new TH1F(Name.Data(), Title.Data(), TimeBins, TimeMin, TimeMax);
295  m_clusterTimeU3->GetXaxis()->SetTitle("cluster time (ns)");
296  m_clusterTimeU3->GetYaxis()->SetTitle("count");
297  m_histoList->Add(m_clusterTimeU3);
298  name = str(format("SVDDQM_ClusterTimeV3"));
299  Title = Form("SVD V-Cluster Time %s for layer 3 sensors", refFrame.Data());
300  m_clusterTimeV3 = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
301  m_clusterTimeV3->GetXaxis()->SetTitle("cluster time (ns)");
302  m_clusterTimeV3->GetYaxis()->SetTitle("count");
303  m_histoList->Add(m_clusterTimeV3);
304 
305  name = str(format("SVDDQM_ClusterTimeU456"));
306  Title = Form("SVD U-Cluster Time %s for layers 4,5,6 sensors", refFrame.Data());
307  m_clusterTimeU456 = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
308  m_clusterTimeU456->GetXaxis()->SetTitle("cluster time (ns)");
309  m_clusterTimeU456->GetYaxis()->SetTitle("count");
310  m_histoList->Add(m_clusterTimeU456);
311  name = str(format("SVDDQM_ClusterTimeV456"));
312  Title = Form("SVD V-Cluster Time %s for layers 4,5,6 sensors", refFrame.Data());
313  m_clusterTimeV456 = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
314  m_clusterTimeV456->GetXaxis()->SetTitle("cluster time (ns)");
315  m_clusterTimeV456->GetYaxis()->SetTitle("count");
316  m_histoList->Add(m_clusterTimeV456);
317 
318  //----------------------------------------------------------------
319  // MaxBin of strips for all sensors (offline ZS)
320  //----------------------------------------------------------------
321  name = str(format("SVDDQM_StripMaxBinUAll"));
322  title = str(format("SVD U-Strip MaxBin for all sensors"));
323  m_stripMaxBinUAll = new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
324  m_stripMaxBinUAll->GetXaxis()->SetTitle("max bin");
325  m_stripMaxBinUAll->GetYaxis()->SetTitle("count");
326  m_histoList->Add(m_stripMaxBinUAll);
327  name = str(format("SVDDQM_StripMaxBinVAll"));
328  title = str(format("SVD V-Strip MaxBin for all sensors"));
329  m_stripMaxBinVAll = new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
330  m_stripMaxBinVAll->GetXaxis()->SetTitle("max bin");
331  m_stripMaxBinVAll->GetYaxis()->SetTitle("count");
332  m_histoList->Add(m_stripMaxBinVAll);
333 
334  name = str(format("SVDDQM_StripMaxBinU3"));
335  title = str(format("SVD U-Strip MaxBin for layer 3 sensors"));
336  m_stripMaxBinU3 = new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
337  m_stripMaxBinU3->GetXaxis()->SetTitle("max bin");
338  m_stripMaxBinU3->GetYaxis()->SetTitle("count");
339  m_histoList->Add(m_stripMaxBinU3);
340  name = str(format("SVDDQM_StripMaxBinV3"));
341  title = str(format("SVD V-Strip MaxBin for layer 3 sensors"));
342  m_stripMaxBinV3 = new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
343  m_stripMaxBinV3->GetXaxis()->SetTitle("max bin");
344  m_stripMaxBinV3->GetYaxis()->SetTitle("count");
345  m_histoList->Add(m_stripMaxBinV3);
346 
347  name = str(format("SVDDQM_StripMaxBinU6"));
348  title = str(format("SVD U-Strip MaxBin for layer 6 sensors"));
349  m_stripMaxBinU6 = new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
350  m_stripMaxBinU6->GetXaxis()->SetTitle("max bin");
351  m_stripMaxBinU6->GetYaxis()->SetTitle("count");
352  m_histoList->Add(m_stripMaxBinU6);
353  name = str(format("SVDDQM_StripMaxBinV6"));
354  title = str(format("SVD V-Strip MaxBin for layer 6 sensors"));
355  m_stripMaxBinV6 = new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
356  m_stripMaxBinV6->GetXaxis()->SetTitle("max bin");
357  m_stripMaxBinV6->GetYaxis()->SetTitle("count");
358  m_histoList->Add(m_stripMaxBinV6);
359 
360  for (int i = 0; i < nSVDSensors; i++) {
361  VxdID id = gTools->getSensorIDFromSVDIndex(i);
362  int iLayer = id.getLayerNumber();
363  int iLadder = id.getLadderNumber();
364  int iSensor = id.getSensorNumber();
365  VxdID sensorID(iLayer, iLadder, iSensor);
366  SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::get(sensorID));
367  string sensorDescr = str(format("%1%_%2%_%3%") % iLayer % iLadder % iSensor);
368  //----------------------------------------------------------------
369  // Number of fired strips per sensor
370  //----------------------------------------------------------------
371  name = str(format("SVDDQM_%1%_FiredU") % sensorDescr);
372  title = str(format("SVD Sensor %1% Number of Fired U-Strips") % sensorDescr);
373  m_firedU[i] = new TH1F(name.c_str(), title.c_str(), 50, 0, 50);
374  m_firedU[i]->GetXaxis()->SetTitle("# fired strips");
375  m_firedU[i]->GetYaxis()->SetTitle("count");
376  m_histoList->Add(m_firedU[i]);
377  name = str(format("SVDDQM_%1%_FiredV") % sensorDescr);
378  title = str(format("SVD Sensor %1% Number of Fired V-Strips") % sensorDescr);
379  m_firedV[i] = new TH1F(name.c_str(), title.c_str(), 50, 0, 50);
380  m_firedV[i]->GetXaxis()->SetTitle("# fired strips");
381  m_firedV[i]->GetYaxis()->SetTitle("count");
382  m_histoList->Add(m_firedV[i]);
383  //----------------------------------------------------------------
384  // Number of clusters per sensor
385  //----------------------------------------------------------------
386  name = str(format("SVDDQM_%1%_ClustersU") % sensorDescr);
387  title = str(format("SVD Sensor %1% Number of U-Clusters") % sensorDescr);
388  m_clustersU[i] = new TH1F(name.c_str(), title.c_str(), 20, 0, 20);
389  m_clustersU[i]->GetXaxis()->SetTitle("# clusters");
390  m_clustersU[i]->GetYaxis()->SetTitle("count");
391  m_histoList->Add(m_clustersU[i]);
392  name = str(format("SVDDQM_%1%_ClustersV") % sensorDescr);
393  title = str(format("SVD Sensor %1% Number of V-Clusters") % sensorDescr);
394  m_clustersV[i] = new TH1F(name.c_str(), title.c_str(), 20, 0, 20);
395  m_clustersV[i]->GetXaxis()->SetTitle("# clusters");
396  m_clustersV[i]->GetYaxis()->SetTitle("count");
397  m_histoList->Add(m_clustersV[i]);
398  //----------------------------------------------------------------
399  // Charge of clusters
400  //----------------------------------------------------------------
401  name = str(format("SVDDQM_%1%_ClusterChargeU") % sensorDescr);
402  title = str(format("SVD Sensor %1% U-Cluster Charge") % sensorDescr);
403  m_clusterChargeU[i] = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
404  m_clusterChargeU[i]->GetXaxis()->SetTitle("cluster charge [ke-]");
405  m_clusterChargeU[i]->GetYaxis()->SetTitle("count");
406  m_histoList->Add(m_clusterChargeU[i]);
407  name = str(format("SVDDQM_%1%_ClusterChargeV") % sensorDescr);
408  title = str(format("SVD Sensor %1% V-Cluster Charge") % sensorDescr);
409  m_clusterChargeV[i] = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
410  m_clusterChargeV[i]->GetXaxis()->SetTitle("cluster charge [ke-]");
411  m_clusterChargeV[i]->GetYaxis()->SetTitle("count");
412  m_histoList->Add(m_clusterChargeV[i]);
413  //----------------------------------------------------------------
414  // SNR of clusters
415  //----------------------------------------------------------------
416  name = str(format("SVDDQM_%1%_ClusterSNRU") % sensorDescr);
417  title = str(format("SVD Sensor %1% U-Cluster SNR") % sensorDescr);
418  m_clusterSNRU[i] = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
419  m_clusterSNRU[i]->GetXaxis()->SetTitle("cluster SNR");
420  m_clusterSNRU[i]->GetYaxis()->SetTitle("count");
421  m_histoList->Add(m_clusterSNRU[i]);
422  name = str(format("SVDDQM_%1%_ClusterSNRV") % sensorDescr);
423  title = str(format("SVD Sensor %1% V-Cluster SNR") % sensorDescr);
424  m_clusterSNRV[i] = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
425  m_clusterSNRV[i]->GetXaxis()->SetTitle("cluster SNR");
426  m_clusterSNRV[i]->GetYaxis()->SetTitle("count");
427  m_histoList->Add(m_clusterSNRV[i]);
428  //----------------------------------------------------------------
429  // Charge of strips
430  //----------------------------------------------------------------
431  name = str(format("SVDDQM_%1%_ADCStripU") % sensorDescr);
432  title = str(format("SVD Sensor %1% U-Strip signal in ADC Counts, all 6 APV samples") % sensorDescr);
433  m_stripSignalU[i] = new TH1F(name.c_str(), title.c_str(), 256, -0.5, 255.5);
434  m_stripSignalU[i]->GetXaxis()->SetTitle("signal ADC");
435  m_stripSignalU[i]->GetYaxis()->SetTitle("count");
436  m_histoList->Add(m_stripSignalU[i]);
437  name = str(format("SVDDQM_%1%_ADCStripV") % sensorDescr);
438  title = str(format("SVD Sensor %1% V-Strip signal in ADC Counts, all 6 APV samples") % sensorDescr);
439  m_stripSignalV[i] = new TH1F(name.c_str(), title.c_str(), 256, -0.5, 255.5);
440  m_stripSignalV[i]->GetXaxis()->SetTitle("signal ADC");
441  m_stripSignalV[i]->GetYaxis()->SetTitle("count");
442  m_histoList->Add(m_stripSignalV[i]);
443  //----------------------------------------------------------------
444  // Strips Counts
445  //----------------------------------------------------------------
446  name = str(format("SVDDQM_%1%_StripCountU") % sensorDescr);
447  title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired U-Strip vs Strip Number") % sensorDescr);
448  m_stripCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
449  m_stripCountU[i]->GetXaxis()->SetTitle("cellID");
450  m_stripCountU[i]->GetYaxis()->SetTitle("count");
451  m_histoList->Add(m_stripCountU[i]);
452  name = str(format("SVDDQM_%1%_StripCountV") % sensorDescr);
453  title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired V-Strip vs Strip Number") % sensorDescr);
454  m_stripCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
455  m_stripCountV[i]->GetXaxis()->SetTitle("cellID");
456  m_stripCountV[i]->GetYaxis()->SetTitle("count");
457  m_histoList->Add(m_stripCountV[i]);
458  //----------------------------------------------------------------
459  // Strips Counts with online ZS
460  //----------------------------------------------------------------
461  name = str(format("SVDDQM_%1%_OnlineZSStripCountU") % sensorDescr);
462  title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired U-Strip vs Strip Number") % sensorDescr);
463  m_onlineZSstripCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
464  m_onlineZSstripCountU[i]->GetXaxis()->SetTitle("cellID");
465  m_onlineZSstripCountU[i]->GetYaxis()->SetTitle("count");
466  m_histoList->Add(m_onlineZSstripCountU[i]);
467  name = str(format("SVDDQM_%1%_OnlineZSStripCountV") % sensorDescr);
468  title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired V-Strip vs Strip Number") % sensorDescr);
469  m_onlineZSstripCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
470  m_onlineZSstripCountV[i]->GetXaxis()->SetTitle("cellID");
471  m_onlineZSstripCountV[i]->GetYaxis()->SetTitle("count");
472  m_histoList->Add(m_onlineZSstripCountV[i]);
473  //----------------------------------------------------------------
474  // Cluster size distribution
475  //----------------------------------------------------------------
476  name = str(format("SVDDQM_%1%_ClusterSizeU") % sensorDescr);
477  title = str(format("SVD Sensor %1% U-Cluster Size") % sensorDescr);
478  m_clusterSizeU[i] = new TH1F(name.c_str(), title.c_str(), 9, 1, 10);
479  m_clusterSizeU[i]->GetXaxis()->SetTitle("cluster size");
480  m_clusterSizeU[i]->GetYaxis()->SetTitle("count");
481  m_histoList->Add(m_clusterSizeU[i]);
482  name = str(format("SVDDQM_%1%_ClusterSizeV") % sensorDescr);
483  title = str(format("SVD Sensor %1% V-Cluster Size") % sensorDescr);
484  m_clusterSizeV[i] = new TH1F(name.c_str(), title.c_str(), 9, 1, 10);
485  m_clusterSizeV[i]->GetXaxis()->SetTitle("cluster size");
486  m_clusterSizeV[i]->GetYaxis()->SetTitle("count");
487  m_histoList->Add(m_clusterSizeV[i]);
488  //----------------------------------------------------------------
489  // Cluster time distribution
490  //----------------------------------------------------------------
491  name = str(format("SVDDQM_%1%_ClusterTimeU") % sensorDescr);
492  Title = Form("SVD Sensor %s U-Cluster Time %s", sensorDescr.c_str(), refFrame.Data());
493  m_clusterTimeU[i] = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
494  m_clusterTimeU[i]->GetXaxis()->SetTitle("cluster time (ns)");
495  m_clusterTimeU[i]->GetYaxis()->SetTitle("count");
496  m_histoList->Add(m_clusterTimeU[i]);
497  name = str(format("SVDDQM_%1%_ClusterTimeV") % sensorDescr);
498  Title = Form("SVD Sensor %s V-Cluster Time %s", sensorDescr.c_str(), refFrame.Data());
499  m_clusterTimeV[i] = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
500  m_clusterTimeV[i]->GetXaxis()->SetTitle("cluster time (ns)");
501  m_clusterTimeV[i]->GetYaxis()->SetTitle("count");
502  m_histoList->Add(m_clusterTimeV[i]);
503  }
504 
505  for (int i = 0; i < nSVDChips; i++) {
506  VxdID id = gTools->getChipIDFromSVDIndex(i);
507  int iLayer = id.getLayerNumber();
508  int iLadder = id.getLadderNumber();
509  int iSensor = id.getSensorNumber();
510  int iChip = gTools->getSVDChipNumber(id);
511  int IsU = gTools->isSVDSideU(id);
512  TString AxisTicks = Form("%i_%i_%i_u%i", iLayer, iLadder, iSensor, iChip);
513  if (!IsU)
514  AxisTicks = Form("%i_%i_%i_v%i", iLayer, iLadder, iSensor, iChip);
515  m_hitMapCountsChip->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
516  m_hitMapClCountsChip->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
517  }
518 
519 
520 
521  //----------------------------------------------------------------
522  // Additional histograms for out of ExpressReco
523  //----------------------------------------------------------------
524 
525  if (m_ShowAllHistos == 1) {
526  TDirectory* dirShowAll = nullptr;
527  dirShowAll = oldDir->mkdir("SVDDQMAll");
528  dirShowAll->cd();
529 
530  m_hitMapU = new TH2F*[nSVDSensors];
531  m_hitMapV = new TH2F*[nSVDSensors];
532  m_hitMapUCl = new TH1F*[nSVDSensors];
533  m_hitMapVCl = new TH1F*[nSVDSensors];
534  for (int i = 0; i < nSVDSensors; i++) {
535  VxdID id = gTools->getSensorIDFromSVDIndex(i);
536  int iLayer = id.getLayerNumber();
537  int iLadder = id.getLadderNumber();
538  int iSensor = id.getSensorNumber();
539  VxdID sensorID(iLayer, iLadder, iSensor);
540  SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::get(sensorID));
541  string sensorDescr = str(format("%1%_%2%_%3%") % iLayer % iLadder % iSensor);
542  //----------------------------------------------------------------
543  // Hitmaps: Number of strips by coordinate
544  //----------------------------------------------------------------
545  name = str(format("SVD_%1%_StripHitmapU") % sensorDescr);
546  title = str(format("SVD Sensor %1% Strip Hitmap in U") % sensorDescr);
547  int nStrips = SensorInfo.getUCells();
548  m_hitMapU[i] = new TH2F(name.c_str(), title.c_str(), nStrips, 0, nStrips, SVDShaperDigit::c_nAPVSamples, 0,
549  SVDShaperDigit::c_nAPVSamples);
550  m_hitMapU[i]->GetXaxis()->SetTitle("u position [pitch units]");
551  m_hitMapU[i]->GetYaxis()->SetTitle("timebin [time units]");
552  m_hitMapU[i]->GetZaxis()->SetTitle("hits");
553  m_histoList->Add(m_hitMapU[i]);
554  name = str(format("SVD_%1%_StripHitmapV") % sensorDescr);
555  title = str(format("SVD Sensor %1% Strip Hitmap in V") % sensorDescr);
556  nStrips = SensorInfo.getVCells();
557  m_hitMapV[i] = new TH2F(name.c_str(), title.c_str(), nStrips, 0, nStrips, SVDShaperDigit::c_nAPVSamples, 0,
558  SVDShaperDigit::c_nAPVSamples);
559  m_hitMapV[i]->GetXaxis()->SetTitle("v position [pitch units]");
560  m_hitMapV[i]->GetYaxis()->SetTitle("timebin [time units]");
561  m_hitMapV[i]->GetZaxis()->SetTitle("hits");
562  m_histoList->Add(m_hitMapV[i]);
563  //----------------------------------------------------------------
564  // Hitmaps: Number of clusters by coordinate
565  //----------------------------------------------------------------
566  name = str(format("SVD_%1%_HitmapClstU") % sensorDescr);
567  title = str(format("SVD Sensor %1% Hitmap Clusters in U") % sensorDescr);
568  nStrips = SensorInfo.getUCells();
569  m_hitMapUCl[i] = new TH1F(name.c_str(), title.c_str(), nStrips, 0, nStrips);
570  m_hitMapUCl[i]->GetXaxis()->SetTitle("u position [pitch units]");
571  m_hitMapUCl[i]->GetYaxis()->SetTitle("hits");
572  m_histoList->Add(m_hitMapUCl[i]);
573  name = str(format("SVD_%1%_HitmapClstV") % sensorDescr);
574  title = str(format("SVD Sensor %1% Hitmap Clusters in V") % sensorDescr);
575  nStrips = SensorInfo.getVCells();
576  m_hitMapVCl[i] = new TH1F(name.c_str(), title.c_str(), nStrips, 0, nStrips);
577  m_hitMapVCl[i]->GetXaxis()->SetTitle("v position [pitch units]");
578  m_hitMapVCl[i]->GetYaxis()->SetTitle("hits");
579  m_histoList->Add(m_hitMapVCl[i]);
580  }
581  }
582 
583  oldDir->cd();
584 }
585 
586 
587 void SVDDQMExpressRecoModule::initialize()
588 {
589  // Register histograms (calls back defineHisto)
590  REG_HISTOGRAM
591 
592  auto gTools = VXD::GeoCache::getInstance().getGeoTools();
593  if (gTools->getNumberOfSVDLayers() != 0) {
594  //Register collections
595  StoreArray<SVDShaperDigit> storeNoZSSVDShaperDigits(m_storeNoZSSVDShaperDigitsName);
596  StoreArray<SVDShaperDigit> storeSVDShaperDigits(m_storeSVDShaperDigitsName);
597  StoreArray<SVDCluster> storeSVDClusters(m_storeSVDClustersName);
598 
599  storeSVDClusters.isOptional();
600  storeSVDShaperDigits.isOptional();
601  m_svdEventInfo.isOptional();
602  storeNoZSSVDShaperDigits.isOptional();
603 
604  //Store names to speed up creation later
605  m_storeSVDShaperDigitsName = storeSVDShaperDigits.getName();
606  }
607 }
608 
609 void SVDDQMExpressRecoModule::beginRun()
610 {
611  StoreObjPtr<EventMetaData> evtMetaData;
612  m_expNumber = evtMetaData->getExperiment();
613  m_runNumber = evtMetaData->getRun();
614 
615  auto gTools = VXD::GeoCache::getInstance().getGeoTools();
616  if (gTools->getNumberOfSVDLayers() == 0) return;
617 
618  // Add experiment and run number to the title of selected histograms (CR shifter plots)
619  TString runID = TString::Format(" ~ Exp%d Run%d", m_expNumber, m_runNumber);
620  TObject* obj;
621  TIter nextH(m_histoList);
622  while ((obj = nextH()))
623  if (obj->InheritsFrom("TH1")) {
624  ((TH1F*)obj)->SetTitle(obj->GetTitle() + runID);
625  ((TH1F*)obj)->Reset();
626  }
627 }
628 
629 void SVDDQMExpressRecoModule::event()
630 {
631 
632  //check HLT decision and increase number of events only if the event has been accepted
633 
634  if (m_skipRejectedEvents && (m_resultStoreObjectPointer.isValid())) {
635  const bool eventAccepted = FinalTriggerDecisionCalculator::getFinalTriggerDecision(*m_resultStoreObjectPointer);
636  if (!eventAccepted) return;
637  }
638  m_nEvents->Fill(0);
639 
640  auto gTools = VXD::GeoCache::getInstance().getGeoTools();
641  if (gTools->getNumberOfSVDLayers() == 0) return;
642 
643  const StoreArray<SVDShaperDigit> storeNoZSSVDShaperDigits(m_storeNoZSSVDShaperDigitsName);
644 
645  const StoreArray<SVDShaperDigit> storeSVDShaperDigits(m_storeSVDShaperDigitsName);
646  const StoreArray<SVDCluster> storeSVDClusters(m_storeSVDClustersName);
647 
648  if (!storeSVDShaperDigits.isValid() || !storeSVDShaperDigits.getEntries()) {
649  return;
650  }
651 
652  int firstSVDLayer = gTools->getFirstSVDLayer();
653  int lastSVDLayer = gTools->getLastSVDLayer();
654  int nSVDSensors = gTools->getNumberOfSVDSensors();
655 
656  // Fired strips offline ZS
657  vector< set<int> > uStrips(nSVDSensors); // sets to eliminate multiple samples per strip
658  vector< set<int> > vStrips(nSVDSensors);
659  for (const SVDShaperDigit& digitIn : storeSVDShaperDigits) {
660  int iLayer = digitIn.getSensorID().getLayerNumber();
661  if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer)) continue;
662  int iLadder = digitIn.getSensorID().getLadderNumber();
663  int iSensor = digitIn.getSensorID().getSensorNumber();
664  VxdID sensorID(iLayer, iLadder, iSensor);
665  int index = gTools->getSVDSensorIndex(sensorID);
666  SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::get(sensorID));
667  if (digitIn.isUStrip()) {
668 
669  // B2DEBUG(29, digitIn.toString().c_str() );
670 
671  //fill strip count first
672  if (m_stripCountU[index] != nullptr) m_stripCountU[index]->Fill(digitIn.getCellID());
673 
674  //fill max bin
675  if (m_stripMaxBinUAll != nullptr) m_stripMaxBinUAll->Fill(digitIn.getMaxTimeBin());
676  if (iLayer == 3)
677  if (m_stripMaxBinU3 != nullptr) m_stripMaxBinU3->Fill(digitIn.getMaxTimeBin());
678  if (iLayer == 6)
679  if (m_stripMaxBinU6 != nullptr) m_stripMaxBinU6->Fill(digitIn.getMaxTimeBin());
680 
681  uStrips.at(index).insert(digitIn.getCellID());
682  int Chip = (int)(digitIn.getCellID() / gTools->getSVDChannelsPerChip()) + 1;
683  int indexChip = gTools->getSVDChipIndex(sensorID, kTRUE, Chip);
684  // 6-to-1 relation weights are equal to digit signals, modulo rounding error
685  SVDShaperDigit::APVFloatSamples samples = digitIn.getSamples();
686  int isSample = 0;
687  for (size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
688  if (m_stripSignalU[index] != nullptr) m_stripSignalU[index]->Fill(samples[i]);
689  if (samples[i] > m_CutSVDCharge) {
690  isSample = 1;
691  if (m_ShowAllHistos == 1) {
692  if (m_hitMapU[index] != nullptr) m_hitMapU[index]->Fill(digitIn.getCellID(), i);
693  }
694  }
695  }
696  if (isSample) {
697  if (m_hitMapCountsU != nullptr) m_hitMapCountsU->Fill(index);
698  if (m_hitMapCountsChip != nullptr) m_hitMapCountsChip->Fill(indexChip);
699  }
700  } else {
701  //fill strip count first
702  if (m_stripCountV[index] != nullptr) m_stripCountV[index]->Fill(digitIn.getCellID());
703 
704  //fill max bin
705  if (m_stripMaxBinVAll != nullptr) m_stripMaxBinVAll->Fill(digitIn.getMaxTimeBin());
706 
707  if (iLayer == 3)
708  if (m_stripMaxBinV3 != nullptr) m_stripMaxBinV3->Fill(digitIn.getMaxTimeBin());
709  if (iLayer == 6)
710  if (m_stripMaxBinV6 != nullptr) m_stripMaxBinV6->Fill(digitIn.getMaxTimeBin());
711 
712  vStrips.at(index).insert(digitIn.getCellID());
713  int Chip = (int)(digitIn.getCellID() / gTools->getSVDChannelsPerChip()) + 1;
714  int indexChip = gTools->getSVDChipIndex(sensorID, kFALSE, Chip);
715  // 6-to-1 relation weights are equal to digit signals, modulo rounding error
716  SVDShaperDigit::APVFloatSamples samples = digitIn.getSamples();
717  int isSample = 0;
718  for (size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
719  if (m_stripSignalV[index] != nullptr) m_stripSignalV[index]->Fill(samples[i]);
720  if (samples[i] > m_CutSVDCharge) {
721  isSample = 1;
722  if (m_ShowAllHistos == 1) {
723  if (m_hitMapV[index] != nullptr) m_hitMapV[index]->Fill(digitIn.getCellID(), i);
724  }
725  }
726  }
727  if (isSample) {
728  if (m_hitMapCountsV != nullptr) m_hitMapCountsV->Fill(index);
729  if (m_hitMapCountsChip != nullptr) m_hitMapCountsChip->Fill(indexChip);
730  }
731  }
732  }
733  for (int i = 0; i < nSVDSensors; i++) {
734  if ((m_firedU[i] != nullptr) && (uStrips[i].size() > 0))
735  m_firedU[i]->Fill(uStrips[i].size());
736  if ((m_firedV[i] != nullptr) && (vStrips[i].size() > 0))
737  m_firedV[i]->Fill(vStrips[i].size());
738  }
739 
740  // Fired strips ONLINE ZS
741  if (storeNoZSSVDShaperDigits.isValid())
742  for (const SVDShaperDigit& digitIn : storeNoZSSVDShaperDigits) {
743  int iLayer = digitIn.getSensorID().getLayerNumber();
744  if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer)) continue;
745  int iLadder = digitIn.getSensorID().getLadderNumber();
746  int iSensor = digitIn.getSensorID().getSensorNumber();
747  VxdID sensorID(iLayer, iLadder, iSensor);
748  int index = gTools->getSVDSensorIndex(sensorID);
749  SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::get(sensorID));
750  if (digitIn.isUStrip()) {
751  if (m_onlineZSstripCountU[index] != nullptr) m_onlineZSstripCountU[index]->Fill(digitIn.getCellID());
752  } else {
753  if (m_onlineZSstripCountV[index] != nullptr) m_onlineZSstripCountV[index]->Fill(digitIn.getCellID());
754  }
755  }
756 
757  vector< set<int> > countsU(nSVDSensors); // sets to eliminate multiple samples per strip
758  vector< set<int> > countsV(nSVDSensors);
759  // Hitmaps, Charge, Seed, Size, Time, ...
760  for (const SVDCluster& cluster : storeSVDClusters) {
761  if (cluster.getCharge() < m_CutSVDClusterCharge) continue;
762  int iLayer = cluster.getSensorID().getLayerNumber();
763  if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer)) continue;
764  int iLadder = cluster.getSensorID().getLadderNumber();
765  int iSensor = cluster.getSensorID().getSensorNumber();
766  VxdID sensorID(iLayer, iLadder, iSensor);
767  int index = gTools->getSVDSensorIndex(sensorID);
768  SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::get(sensorID));
769 
770  float time = cluster.getClsTime();
771  if (m_desynchSVDTime && m_svdEventInfo.isValid())
772  time = time - m_svdEventInfo->getSVD2FTSWTimeShift(cluster.getFirstFrame());
773 
774  if (cluster.isUCluster()) {
775  countsU.at(index).insert(SensorInfo.getUCellID(cluster.getPosition()));
776  int indexChip = gTools->getSVDChipIndex(sensorID, kTRUE,
777  (int)(SensorInfo.getUCellID(cluster.getPosition()) / gTools->getSVDChannelsPerChip()) + 1);
778  if (m_hitMapClCountsU != nullptr) m_hitMapClCountsU->Fill(index);
779  if (m_hitMapClCountsChip != nullptr) m_hitMapClCountsChip->Fill(indexChip);
780  if (m_clusterChargeU[index] != nullptr) m_clusterChargeU[index]->Fill(cluster.getCharge() / 1000.0); // in kelectrons
781  if (m_clusterSNRU[index] != nullptr) m_clusterSNRU[index]->Fill(cluster.getSNR());
782  if (m_clusterChargeUAll != nullptr) m_clusterChargeUAll->Fill(cluster.getCharge() / 1000.0); // in kelectrons
783  if (m_clusterSNRUAll != nullptr) m_clusterSNRUAll->Fill(cluster.getSNR());
784  if (m_clusterSizeU[index] != nullptr) m_clusterSizeU[index]->Fill(cluster.getSize());
785  if (m_clusterTimeU[index] != nullptr) m_clusterTimeU[index]->Fill(time);
786  if (m_clusterTimeUAll != nullptr) m_clusterTimeUAll->Fill(time);
787  if (iLayer == 3) {
788  if (m_clusterChargeU3 != nullptr) m_clusterChargeU3->Fill(cluster.getCharge() / 1000.0); // in kelectrons
789  if (m_clusterSNRU3 != nullptr) m_clusterSNRU3->Fill(cluster.getSNR());
790  if (m_clusterTimeU3 != nullptr) m_clusterTimeU3->Fill(time);
791  } else {
792  if (m_clusterChargeU456 != nullptr) m_clusterChargeU456->Fill(cluster.getCharge() / 1000.0); // in kelectrons
793  if (m_clusterSNRU456 != nullptr) m_clusterSNRU456->Fill(cluster.getSNR());
794  if (m_clusterTimeU456 != nullptr) m_clusterTimeU456->Fill(time);
795  }
796 
797  if (m_ShowAllHistos == 1)
798  if (m_hitMapUCl[index] != nullptr) m_hitMapUCl[index]->Fill(SensorInfo.getUCellID(cluster.getPosition()));
799  } else {
800  countsV.at(index).insert(SensorInfo.getVCellID(cluster.getPosition()));
801  int indexChip = gTools->getSVDChipIndex(sensorID, kFALSE,
802  (int)(SensorInfo.getVCellID(cluster.getPosition()) / gTools->getSVDChannelsPerChip()) + 1);
803  if (m_hitMapClCountsV != nullptr) m_hitMapClCountsV->Fill(index);
804  if (m_hitMapClCountsChip != nullptr) m_hitMapClCountsChip->Fill(indexChip);
805  if (m_clusterChargeV[index] != nullptr) m_clusterChargeV[index]->Fill(cluster.getCharge() / 1000.0); // in kelectrons
806  if (m_clusterSNRV[index] != nullptr) m_clusterSNRV[index]->Fill(cluster.getSNR());
807  if (m_clusterChargeVAll != nullptr) m_clusterChargeVAll->Fill(cluster.getCharge() / 1000.0); // in kelectrons
808  if (m_clusterSNRVAll != nullptr) m_clusterSNRVAll->Fill(cluster.getSNR());
809  if (m_clusterSizeV[index] != nullptr) m_clusterSizeV[index]->Fill(cluster.getSize());
810  if (m_clusterTimeV[index] != nullptr) m_clusterTimeV[index]->Fill(time);
811  if (m_clusterTimeVAll != nullptr) m_clusterTimeVAll->Fill(time);
812  if (iLayer == 3) {
813  if (m_clusterChargeV3 != nullptr) m_clusterChargeV3->Fill(cluster.getCharge() / 1000.0); // in kelectrons
814  if (m_clusterSNRV3 != nullptr) m_clusterSNRV3->Fill(cluster.getSNR());
815  if (m_clusterTimeV3 != nullptr) m_clusterTimeV3->Fill(time);
816  } else {
817  if (m_clusterChargeV456 != nullptr) m_clusterChargeV456->Fill(cluster.getCharge() / 1000.0); // in kelectrons
818  if (m_clusterSNRV456 != nullptr) m_clusterSNRV456->Fill(cluster.getSNR());
819  if (m_clusterTimeV456 != nullptr) m_clusterTimeV456->Fill(time);
820  }
821  if (m_ShowAllHistos == 1)
822  if (m_hitMapVCl[index] != nullptr) m_hitMapVCl[index]->Fill(SensorInfo.getVCellID(cluster.getPosition()));
823 
824  }
825  }
826  for (int i = 0; i < nSVDSensors; i++) {
827  if ((m_clustersU[i] != nullptr) && (countsU[i].size() > 0))
828  m_clustersU[i]->Fill(countsU[i].size());
829  if ((m_clustersV[i] != nullptr) && (countsV[i].size() > 0))
830  m_clustersV[i]->Fill(countsV[i].size());
831  }
832 }
833 
834 
835 void SVDDQMExpressRecoModule::terminate()
836 {
837 
838  // m_histoList->Delete();
839  delete m_histoList;
840 
841 }
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
Definition: HistoModule.h:29
Specific implementation of SensorInfo for PXD Sensors which provides additional pixel specific inform...
Definition: SensorInfo.h:23
The SVD Cluster class This class stores all information about reconstructed SVD clusters.
Definition: SVDCluster.h:28
SVD DQM Module for Express Reco.
The SVD ShaperDigit class.
std::array< APVFloatSampleType, c_nAPVSamples > APVFloatSamples
array of APVFloatSampleType objects
Specific implementation of SensorInfo for SVD Sensors which provides additional sensor specific infor...
Definition: SensorInfo.h:25
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.
const std::string & getName() const
Return name under which the object is saved in the DataStore.
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
bool isValid() const
Check wether the array was registered.
Definition: StoreArray.h:288
int getEntries() const
Get the number of objects in the array.
Definition: StoreArray.h:216
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:95
int getVCells() const
Return number of pixel/strips in v direction.
int getUCells() const
Return number of pixel/strips in u direction.
int getVCellID(double v, bool clamp=false) const
Return the corresponding pixel/strip ID of a given v coordinate.
int getUCellID(double u, double v=0, bool clamp=false) const
Return the corresponding pixel/strip ID of a given u coordinate.
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
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
Abstract base class for different kinds of events.