Belle II Software  release-06-01-15
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 skipped.");
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  auto gTools = VXD::GeoCache::getInstance().getGeoTools();
612  if (gTools->getNumberOfSVDLayers() == 0) return;
613 
614  //reset histograms
615  TObject* obj;
616  TIter nextH(m_histoList);
617  while ((obj = nextH()))
618  if (obj->InheritsFrom("TH1")) {
619  ((TH1F*)obj)->Reset();
620  }
621 }
622 
623 void SVDDQMExpressRecoModule::event()
624 {
625 
626  //check HLT decision and increase number of events only if the event has been accepted
627 
628  if (m_skipRejectedEvents && (m_resultStoreObjectPointer.isValid())) {
629  const bool eventAccepted = FinalTriggerDecisionCalculator::getFinalTriggerDecision(*m_resultStoreObjectPointer);
630  if (!eventAccepted) return;
631  }
632  m_nEvents->Fill(0);
633 
634  StoreObjPtr<EventMetaData> evtMetaData;
635  m_expNumber = evtMetaData->getExperiment();
636  m_runNumber = evtMetaData->getRun();
637 
638  auto gTools = VXD::GeoCache::getInstance().getGeoTools();
639  if (gTools->getNumberOfSVDLayers() == 0) return;
640 
641  // Add experiment and run number to the title of selected histograms (CR shifter plots)
642  TString runID = TString::Format(" ~ Exp%d Run%d", m_expNumber, m_runNumber);
643  TObject* obj;
644  TIter nextH(m_histoList);
645  while ((obj = nextH()))
646  if (obj->InheritsFrom("TH1")) {
647  if (((TString)obj->GetTitle()).Contains(runID) == false) {
648  ((TH1F*)obj)->SetTitle(obj->GetTitle() + runID);
649  }
650  }
651 
652  const StoreArray<SVDShaperDigit> storeNoZSSVDShaperDigits(m_storeNoZSSVDShaperDigitsName);
653  const StoreArray<SVDShaperDigit> storeSVDShaperDigits(m_storeSVDShaperDigitsName);
654  const StoreArray<SVDCluster> storeSVDClusters(m_storeSVDClustersName);
655 
656  if (!storeSVDShaperDigits.isValid() || !storeSVDShaperDigits.getEntries()) {
657  return;
658  }
659 
660  int firstSVDLayer = gTools->getFirstSVDLayer();
661  int lastSVDLayer = gTools->getLastSVDLayer();
662  int nSVDSensors = gTools->getNumberOfSVDSensors();
663 
664  // Fired strips offline ZS
665  vector< set<int> > uStrips(nSVDSensors); // sets to eliminate multiple samples per strip
666  vector< set<int> > vStrips(nSVDSensors);
667  for (const SVDShaperDigit& digitIn : storeSVDShaperDigits) {
668  int iLayer = digitIn.getSensorID().getLayerNumber();
669  if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer)) continue;
670  int iLadder = digitIn.getSensorID().getLadderNumber();
671  int iSensor = digitIn.getSensorID().getSensorNumber();
672  VxdID sensorID(iLayer, iLadder, iSensor);
673  int index = gTools->getSVDSensorIndex(sensorID);
674  SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::get(sensorID));
675  if (digitIn.isUStrip()) {
676 
677  // B2DEBUG(29, digitIn.toString().c_str() );
678 
679  //fill strip count first
680  if (m_stripCountU[index] != nullptr) m_stripCountU[index]->Fill(digitIn.getCellID());
681 
682  //fill max bin
683  if (m_stripMaxBinUAll != nullptr) m_stripMaxBinUAll->Fill(digitIn.getMaxTimeBin());
684  if (iLayer == 3)
685  if (m_stripMaxBinU3 != nullptr) m_stripMaxBinU3->Fill(digitIn.getMaxTimeBin());
686  if (iLayer == 6)
687  if (m_stripMaxBinU6 != nullptr) m_stripMaxBinU6->Fill(digitIn.getMaxTimeBin());
688 
689  uStrips.at(index).insert(digitIn.getCellID());
690  int Chip = (int)(digitIn.getCellID() / gTools->getSVDChannelsPerChip()) + 1;
691  int indexChip = gTools->getSVDChipIndex(sensorID, kTRUE, Chip);
692  // 6-to-1 relation weights are equal to digit signals, modulo rounding error
693  SVDShaperDigit::APVFloatSamples samples = digitIn.getSamples();
694  int isSample = 0;
695  for (size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
696  if (m_stripSignalU[index] != nullptr) m_stripSignalU[index]->Fill(samples[i]);
697  if (samples[i] > m_CutSVDCharge) {
698  isSample = 1;
699  if (m_ShowAllHistos == 1) {
700  if (m_hitMapU[index] != nullptr) m_hitMapU[index]->Fill(digitIn.getCellID(), i);
701  }
702  }
703  }
704  if (isSample) {
705  if (m_hitMapCountsU != nullptr) m_hitMapCountsU->Fill(index);
706  if (m_hitMapCountsChip != nullptr) m_hitMapCountsChip->Fill(indexChip);
707  }
708  } else {
709  //fill strip count first
710  if (m_stripCountV[index] != nullptr) m_stripCountV[index]->Fill(digitIn.getCellID());
711 
712  //fill max bin
713  if (m_stripMaxBinVAll != nullptr) m_stripMaxBinVAll->Fill(digitIn.getMaxTimeBin());
714 
715  if (iLayer == 3)
716  if (m_stripMaxBinV3 != nullptr) m_stripMaxBinV3->Fill(digitIn.getMaxTimeBin());
717  if (iLayer == 6)
718  if (m_stripMaxBinV6 != nullptr) m_stripMaxBinV6->Fill(digitIn.getMaxTimeBin());
719 
720  vStrips.at(index).insert(digitIn.getCellID());
721  int Chip = (int)(digitIn.getCellID() / gTools->getSVDChannelsPerChip()) + 1;
722  int indexChip = gTools->getSVDChipIndex(sensorID, kFALSE, Chip);
723  // 6-to-1 relation weights are equal to digit signals, modulo rounding error
724  SVDShaperDigit::APVFloatSamples samples = digitIn.getSamples();
725  int isSample = 0;
726  for (size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
727  if (m_stripSignalV[index] != nullptr) m_stripSignalV[index]->Fill(samples[i]);
728  if (samples[i] > m_CutSVDCharge) {
729  isSample = 1;
730  if (m_ShowAllHistos == 1) {
731  if (m_hitMapV[index] != nullptr) m_hitMapV[index]->Fill(digitIn.getCellID(), i);
732  }
733  }
734  }
735  if (isSample) {
736  if (m_hitMapCountsV != nullptr) m_hitMapCountsV->Fill(index);
737  if (m_hitMapCountsChip != nullptr) m_hitMapCountsChip->Fill(indexChip);
738  }
739  }
740  }
741  for (int i = 0; i < nSVDSensors; i++) {
742  if ((m_firedU[i] != nullptr) && (uStrips[i].size() > 0))
743  m_firedU[i]->Fill(uStrips[i].size());
744  if ((m_firedV[i] != nullptr) && (vStrips[i].size() > 0))
745  m_firedV[i]->Fill(vStrips[i].size());
746  }
747 
748  // Fired strips ONLINE ZS
749  if (storeNoZSSVDShaperDigits.isValid())
750  for (const SVDShaperDigit& digitIn : storeNoZSSVDShaperDigits) {
751  int iLayer = digitIn.getSensorID().getLayerNumber();
752  if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer)) continue;
753  int iLadder = digitIn.getSensorID().getLadderNumber();
754  int iSensor = digitIn.getSensorID().getSensorNumber();
755  VxdID sensorID(iLayer, iLadder, iSensor);
756  int index = gTools->getSVDSensorIndex(sensorID);
757  SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::get(sensorID));
758  if (digitIn.isUStrip()) {
759  if (m_onlineZSstripCountU[index] != nullptr) m_onlineZSstripCountU[index]->Fill(digitIn.getCellID());
760  } else {
761  if (m_onlineZSstripCountV[index] != nullptr) m_onlineZSstripCountV[index]->Fill(digitIn.getCellID());
762  }
763  }
764 
765  vector< set<int> > countsU(nSVDSensors); // sets to eliminate multiple samples per strip
766  vector< set<int> > countsV(nSVDSensors);
767  // Hitmaps, Charge, Seed, Size, Time, ...
768  for (const SVDCluster& cluster : storeSVDClusters) {
769  if (cluster.getCharge() < m_CutSVDClusterCharge) continue;
770  int iLayer = cluster.getSensorID().getLayerNumber();
771  if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer)) continue;
772  int iLadder = cluster.getSensorID().getLadderNumber();
773  int iSensor = cluster.getSensorID().getSensorNumber();
774  VxdID sensorID(iLayer, iLadder, iSensor);
775  int index = gTools->getSVDSensorIndex(sensorID);
776  SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::get(sensorID));
777 
778  float time = cluster.getClsTime();
779  if (m_desynchSVDTime && m_svdEventInfo.isValid())
780  time = time - m_svdEventInfo->getSVD2FTSWTimeShift(cluster.getFirstFrame());
781 
782  if (cluster.isUCluster()) {
783  countsU.at(index).insert(SensorInfo.getUCellID(cluster.getPosition()));
784  int indexChip = gTools->getSVDChipIndex(sensorID, kTRUE,
785  (int)(SensorInfo.getUCellID(cluster.getPosition()) / gTools->getSVDChannelsPerChip()) + 1);
786  if (m_hitMapClCountsU != nullptr) m_hitMapClCountsU->Fill(index);
787  if (m_hitMapClCountsChip != nullptr) m_hitMapClCountsChip->Fill(indexChip);
788  if (m_clusterChargeU[index] != nullptr) m_clusterChargeU[index]->Fill(cluster.getCharge() / 1000.0); // in kelectrons
789  if (m_clusterSNRU[index] != nullptr) m_clusterSNRU[index]->Fill(cluster.getSNR());
790  if (m_clusterChargeUAll != nullptr) m_clusterChargeUAll->Fill(cluster.getCharge() / 1000.0); // in kelectrons
791  if (m_clusterSNRUAll != nullptr) m_clusterSNRUAll->Fill(cluster.getSNR());
792  if (m_clusterSizeU[index] != nullptr) m_clusterSizeU[index]->Fill(cluster.getSize());
793  if (m_clusterTimeU[index] != nullptr) m_clusterTimeU[index]->Fill(time);
794  if (m_clusterTimeUAll != nullptr) m_clusterTimeUAll->Fill(time);
795  if (iLayer == 3) {
796  if (m_clusterChargeU3 != nullptr) m_clusterChargeU3->Fill(cluster.getCharge() / 1000.0); // in kelectrons
797  if (m_clusterSNRU3 != nullptr) m_clusterSNRU3->Fill(cluster.getSNR());
798  if (m_clusterTimeU3 != nullptr) m_clusterTimeU3->Fill(time);
799  } else {
800  if (m_clusterChargeU456 != nullptr) m_clusterChargeU456->Fill(cluster.getCharge() / 1000.0); // in kelectrons
801  if (m_clusterSNRU456 != nullptr) m_clusterSNRU456->Fill(cluster.getSNR());
802  if (m_clusterTimeU456 != nullptr) m_clusterTimeU456->Fill(time);
803  }
804 
805  if (m_ShowAllHistos == 1)
806  if (m_hitMapUCl[index] != nullptr) m_hitMapUCl[index]->Fill(SensorInfo.getUCellID(cluster.getPosition()));
807  } else {
808  countsV.at(index).insert(SensorInfo.getVCellID(cluster.getPosition()));
809  int indexChip = gTools->getSVDChipIndex(sensorID, kFALSE,
810  (int)(SensorInfo.getVCellID(cluster.getPosition()) / gTools->getSVDChannelsPerChip()) + 1);
811  if (m_hitMapClCountsV != nullptr) m_hitMapClCountsV->Fill(index);
812  if (m_hitMapClCountsChip != nullptr) m_hitMapClCountsChip->Fill(indexChip);
813  if (m_clusterChargeV[index] != nullptr) m_clusterChargeV[index]->Fill(cluster.getCharge() / 1000.0); // in kelectrons
814  if (m_clusterSNRV[index] != nullptr) m_clusterSNRV[index]->Fill(cluster.getSNR());
815  if (m_clusterChargeVAll != nullptr) m_clusterChargeVAll->Fill(cluster.getCharge() / 1000.0); // in kelectrons
816  if (m_clusterSNRVAll != nullptr) m_clusterSNRVAll->Fill(cluster.getSNR());
817  if (m_clusterSizeV[index] != nullptr) m_clusterSizeV[index]->Fill(cluster.getSize());
818  if (m_clusterTimeV[index] != nullptr) m_clusterTimeV[index]->Fill(time);
819  if (m_clusterTimeVAll != nullptr) m_clusterTimeVAll->Fill(time);
820  if (iLayer == 3) {
821  if (m_clusterChargeV3 != nullptr) m_clusterChargeV3->Fill(cluster.getCharge() / 1000.0); // in kelectrons
822  if (m_clusterSNRV3 != nullptr) m_clusterSNRV3->Fill(cluster.getSNR());
823  if (m_clusterTimeV3 != nullptr) m_clusterTimeV3->Fill(time);
824  } else {
825  if (m_clusterChargeV456 != nullptr) m_clusterChargeV456->Fill(cluster.getCharge() / 1000.0); // in kelectrons
826  if (m_clusterSNRV456 != nullptr) m_clusterSNRV456->Fill(cluster.getSNR());
827  if (m_clusterTimeV456 != nullptr) m_clusterTimeV456->Fill(time);
828  }
829  if (m_ShowAllHistos == 1)
830  if (m_hitMapVCl[index] != nullptr) m_hitMapVCl[index]->Fill(SensorInfo.getVCellID(cluster.getPosition()));
831 
832  }
833  }
834  for (int i = 0; i < nSVDSensors; i++) {
835  if ((m_clustersU[i] != nullptr) && (countsU[i].size() > 0))
836  m_clustersU[i]->Fill(countsU[i].size());
837  if ((m_clustersV[i] != nullptr) && (countsV[i].size() > 0))
838  m_clustersV[i]->Fill(countsV[i].size());
839  }
840 }
841 
842 
843 void SVDDQMExpressRecoModule::terminate()
844 {
845 
846  // m_histoList->Delete();
847  delete m_histoList;
848 
849 }
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.