Belle II Software development
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/SVDRecoDigit.h>
18#include <svd/dataobjects/SVDCluster.h>
19
20#include <vxd/geometry/SensorInfoBase.h>
21#include <vxd/geometry/GeoTools.h>
22
23#include <boost/format.hpp>
24
25#include <TDirectory.h>
26
27using namespace std;
28using boost::format;
29using namespace Belle2;
30using namespace SoftwareTrigger;
31
32//-----------------------------------------------------------------
33// Register the Module
34//-----------------------------------------------------------------
35REG_MODULE(SVDDQMExpressReco);
36
37
38//-----------------------------------------------------------------
39// Implementation
40//-----------------------------------------------------------------
41
43{
44 //Set module properties
45 setDescription("Original SVD DQM module for ExpressReco.");
46
47 setPropertyFlags(c_ParallelProcessingCertified); // specify this flag if you need parallel processing
48 addParam("offlineZSShaperDigits", m_storeSVDShaperDigitsName, "ShaperDigits StoreArray name - usually ZS5 strips.",
49 std::string("SVDShaperDigitsZS5"));
50 addParam("ShaperDigits", m_storeNoZSSVDShaperDigitsName, "not zero-suppressed ShaperDigits StoreArray name.",
51 std::string("SVDShaperDigits"));
52 addParam("Clusters", m_storeSVDClustersName, "Cluster StoreArray name.",
53 std::string("SVDClusters"));
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 addParam("additionalPlots", m_additionalPlots, "Flag to produce additional plots",
64 bool(false));
65 addParam("useParamFromDB", m_useParamFromDB, "use SVDDQMPlotsConfiguration from DB", bool(true));
66 addParam("skipHLTRejectedEvents", m_skipRejectedEvents, "If True, skip events rejected by HLT.", bool(false));
67 addParam("samples3", m_3Samples, "if True 3 samples histograms analysis is performed", bool(false));
68
69 m_histoList = new TList();
70}
71
72
73SVDDQMExpressRecoModule::~SVDDQMExpressRecoModule()
74{
75}
76
77//------------------------------------------------------------------
78// Function to define histograms
79//-----------------------------------------------------------------
80
82{
83 if (m_useParamFromDB) {
84 if (!m_svdPlotsConfig.isValid())
85 B2FATAL("no valid configuration found for SVD reconstruction");
86 else {
87 B2DEBUG(20, "SVDRecoConfiguration: from now on we are using " << m_svdPlotsConfig->get_uniqueID());
88 m_3Samples = m_svdPlotsConfig->isPlotsFor3SampleMonitoring();
89 m_skipRejectedEvents = m_svdPlotsConfig->isSkipHLTRejectedEvents();
90 }
91 }
92
94 if (gTools->getNumberOfLayers() == 0) {
95 B2FATAL("Missing geometry for VXD, check steering file.");
96 }
97 if (gTools->getNumberOfSVDLayers() == 0) {
98 B2WARNING("Missing geometry for SVD, SVD-DQM is skipped.");
99 return;
100 }
101
102 // Create a separate histogram directories and cd into it.
103 TDirectory* oldDir = gDirectory;
104 if (m_histogramDirectoryName != "") {
105 oldDir->mkdir(m_histogramDirectoryName.c_str());// do not use return value with ->cd(), its ZERO if dir already exists
106 oldDir->cd(m_histogramDirectoryName.c_str());
107 }
108
109 // basic constants presets:
110 int nSVDSensors = gTools->getNumberOfSVDSensors();
111 int nSVDChips = gTools->getTotalSVDChips();
112
113 // number of events counter
114 m_nEvents = new TH1F("SVDDQM_nEvents", "SVD Number of Events", 1, -0.5, 0.5);
115 m_nEvents->GetYaxis()->SetTitle("N events");
117
118 // Create basic histograms:
119 // basic counters per sensor:
120 m_hitMapCountsU = new TH1F("SVDDQM_StripCountsU", "SVD Integrated Number of ZS5 Fired U-Strips per sensor",
121 nSVDSensors, 0, nSVDSensors);
122 m_hitMapCountsU->GetXaxis()->SetTitle("Sensor ID");
123 m_hitMapCountsU->GetYaxis()->SetTitle("counts");
125 m_hitMapCountsV = new TH1F("SVDDQM_StripCountsV", "SVD Integrated Number of ZS5 Fired V-Strips per sensor",
126 nSVDSensors, 0, nSVDSensors);
127 m_hitMapCountsV->GetXaxis()->SetTitle("Sensor ID");
128 m_hitMapCountsV->GetYaxis()->SetTitle("counts");
130 m_hitMapClCountsU = new TH1F("SVDDQM_ClusterCountsU", "SVD Integrated Number of U-Clusters per sensor",
131 nSVDSensors, 0, nSVDSensors);
132 m_hitMapClCountsU->GetXaxis()->SetTitle("Sensor ID");
133 m_hitMapClCountsU->GetYaxis()->SetTitle("counts");
135 m_hitMapClCountsV = new TH1F("SVDDQM_ClusterCountsV", "SVD Integrated Number of V-Clusters per sensor",
136 nSVDSensors, 0, nSVDSensors);
137 m_hitMapClCountsV->GetXaxis()->SetTitle("Sensor ID");
138 m_hitMapClCountsV->GetYaxis()->SetTitle("counts");
140 for (int i = 0; i < nSVDSensors; i++) {
141 VxdID id = gTools->getSensorIDFromSVDIndex(i);
142 int iLayer = id.getLayerNumber();
143 int iLadder = id.getLadderNumber();
144 int iSensor = id.getSensorNumber();
145 TString AxisTicks = Form("%i_%i_%i", iLayer, iLadder, iSensor);
146 m_hitMapCountsU->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
147 m_hitMapCountsV->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
148 m_hitMapClCountsU->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
149 m_hitMapClCountsV->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
150 }
151
152 // basic counters per chip:
153 m_hitMapCountsChip = new TH1F("SVDDQM_StripCountsChip", "SVD Integrated Number of ZS5 Fired Strips per chip",
154 nSVDChips, 0, nSVDChips);
155 m_hitMapCountsChip->GetXaxis()->SetTitle("Chip ID");
156 m_hitMapCountsChip->GetYaxis()->SetTitle("counts");
158 m_hitMapClCountsChip = new TH1F("SVDDQM_ClusterCountsChip", "SVD Integrated Number of Clusters per chip",
159 nSVDChips, 0, nSVDChips);
160 m_hitMapClCountsChip->GetXaxis()->SetTitle("Chip ID");
161 m_hitMapClCountsChip->GetYaxis()->SetTitle("counts");
163
164 if (m_additionalPlots) {
165 m_firedU = new TH1F*[nSVDSensors];
166 m_firedV = new TH1F*[nSVDSensors];
167 m_clustersU = new TH1F*[nSVDSensors];
168 m_clustersV = new TH1F*[nSVDSensors];
169 m_stripSignalU = new TH1F*[nSVDSensors];
170 m_stripSignalV = new TH1F*[nSVDSensors];
171 }
172
173 m_clusterChargeU = new TH1F*[nSVDSensors];
174 m_clusterChargeV = new TH1F*[nSVDSensors];
175 m_clusterSNRU = new TH1F*[nSVDSensors];
176 m_clusterSNRV = new TH1F*[nSVDSensors];
177
178 m_stripCountU = new TH1F*[nSVDSensors];
179 m_stripCountV = new TH1F*[nSVDSensors];
180 m_strip3SampleCountU = new TH1F*[nSVDSensors];
181 m_strip3SampleCountV = new TH1F*[nSVDSensors];
182 m_strip6SampleCountU = new TH1F*[nSVDSensors];
183 m_strip6SampleCountV = new TH1F*[nSVDSensors];
184
185 m_stripCountSignalGroupIDsU = new TH1F*[nSVDSensors];
186 m_stripCountSignalGroupIDsV = new TH1F*[nSVDSensors];
187
188 m_onlineZSstripCountU = new TH1F*[nSVDSensors];
189 m_onlineZSstripCountV = new TH1F*[nSVDSensors];
190
191 if (m_3Samples) {
192 m_onlineZSstrip3SampleCountU = new TH1F*[nSVDSensors];
193 m_onlineZSstrip3SampleCountV = new TH1F*[nSVDSensors];
194 m_onlineZSstrip6sampleCountU = new TH1F*[nSVDSensors];
195 m_onlineZSstrip6sampleCountV = new TH1F*[nSVDSensors];
196 }
197
198 m_clusterSizeU = new TH1F*[nSVDSensors];
199 m_clusterSizeV = new TH1F*[nSVDSensors];
200 m_clusterTimeU = new TH1F*[nSVDSensors];
201 m_clusterTimeV = new TH1F*[nSVDSensors];
202
203 int ChargeBins = 80;
204 float ChargeMax = 80;
205 int SNRBins = 50;
206 float SNRMax = 100;
207 int TimeBins = 300;
208 float TimeMin = -150;
209 float TimeMax = 150;
210
211 int GroupIdBins = 21;
212 float GroupIdMin = -1.5;
213 float GroupIdMax = 19.5;
214
215 int MaxBinBins = 6;
216 int MaxBinMax = 6;
217
218 TString refFrame = "in FTSW reference";
220 refFrame = "in SVD reference";
221
222
223 //----------------------------------------------------------------
224 // Charge of clusters for all sensors
225 //----------------------------------------------------------------
226 string name = str(format("SVDDQM_ClusterChargeUAll"));
227 string title = str(format("SVD U-Cluster Charge for all sensors"));
228 m_clusterChargeUAll = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
229 m_clusterChargeUAll->GetXaxis()->SetTitle("cluster charge [ke-]");
230 m_clusterChargeUAll->GetYaxis()->SetTitle("count");
232 name = str(format("SVDDQM_ClusterChargeVAll"));
233 title = str(format("SVD V-Cluster Charge for all sensors"));
234 m_clusterChargeVAll = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
235 m_clusterChargeVAll->GetXaxis()->SetTitle("cluster charge [ke-]");
236 m_clusterChargeVAll->GetYaxis()->SetTitle("count");
238 //----------------------------------------------------------------
239 // Charge of clusters for L3/L456 sensors
240 //----------------------------------------------------------------
241 name = str(format("SVDDQM_ClusterChargeU3"));
242 title = str(format("SVD U-Cluster Charge for layer 3 sensors"));
243 m_clusterChargeU3 = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
244 m_clusterChargeU3->GetXaxis()->SetTitle("cluster charge [ke-]");
245 m_clusterChargeU3->GetYaxis()->SetTitle("count");
247 name = str(format("SVDDQM_ClusterChargeV3"));
248 title = str(format("SVD V-Cluster Charge for layer 3 sensors"));
249 m_clusterChargeV3 = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
250 m_clusterChargeV3->GetXaxis()->SetTitle("cluster charge [ke-]");
251 m_clusterChargeV3->GetYaxis()->SetTitle("count");
253
254 name = str(format("SVDDQM_ClusterChargeU456"));
255 title = str(format("SVD U-Cluster Charge for layers 4,5,6 sensors"));
256 m_clusterChargeU456 = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
257 m_clusterChargeU456->GetXaxis()->SetTitle("cluster charge [ke-]");
258 m_clusterChargeU456->GetYaxis()->SetTitle("count");
260
261 name = str(format("SVDDQM_ClusterChargeV456"));
262 title = str(format("SVD V-Cluster Charge for layers 4,5,6 sensors"));
263 m_clusterChargeV456 = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
264 m_clusterChargeV456->GetXaxis()->SetTitle("cluster charge [ke-]");
265 m_clusterChargeV456->GetYaxis()->SetTitle("count");
267
268 //----------------------------------------------------------------
269 // SNR of clusters for all sensors
270 //----------------------------------------------------------------
271 name = str(format("SVDDQM_ClusterSNRUAll"));
272 title = str(format("SVD U-Cluster SNR for all sensors"));
273 m_clusterSNRUAll = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax); // max = ~ 60
274 m_clusterSNRUAll->GetXaxis()->SetTitle("cluster SNR");
275 m_clusterSNRUAll->GetYaxis()->SetTitle("count");
277 name = str(format("SVDDQM_ClusterSNRVAll"));
278 title = str(format("SVD V-Cluster SNR for all sensors"));
279 m_clusterSNRVAll = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
280 m_clusterSNRVAll->GetXaxis()->SetTitle("cluster SNR");
281 m_clusterSNRVAll->GetYaxis()->SetTitle("count");
283 //----------------------------------------------------------------
284 // SNR of clusters for L3/L456 sensors
285 //----------------------------------------------------------------
286 name = str(format("SVDDQM_ClusterSNRU3"));
287 title = str(format("SVD U-Cluster SNR for layer 3 sensors"));
288 m_clusterSNRU3 = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
289 m_clusterSNRU3->GetXaxis()->SetTitle("cluster SNR");
290 m_clusterSNRU3->GetYaxis()->SetTitle("count");
292 name = str(format("SVDDQM_ClusterSNRV3"));
293 title = str(format("SVD V-Cluster SNR for layer 3 sensors"));
294 m_clusterSNRV3 = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
295 m_clusterSNRV3->GetXaxis()->SetTitle("cluster SNR");
296 m_clusterSNRV3->GetYaxis()->SetTitle("count");
298
299 name = str(format("SVDDQM_ClusterSNRU456"));
300 title = str(format("SVD U-Cluster SNR for layers 4,5,6 sensors"));
301 m_clusterSNRU456 = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
302 m_clusterSNRU456->GetXaxis()->SetTitle("cluster SNR");
303 m_clusterSNRU456->GetYaxis()->SetTitle("count");
305 name = str(format("SVDDQM_ClusterSNRV456"));
306 title = str(format("SVD V-Cluster SNR for layers 4,5,6 sensors"));
307 m_clusterSNRV456 = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
308 m_clusterSNRV456->GetXaxis()->SetTitle("cluster SNR");
309 m_clusterSNRV456->GetYaxis()->SetTitle("count");
311 //----------------------------------------------------------------
312 // Cluster time distribution for all sensors
313 //----------------------------------------------------------------
314 TString Name = "SVDDQM_ClusterTimeUAll";
315 TString Title = Form("SVD U-Cluster Time %s for all sensors", refFrame.Data());
316 m_clusterTimeUAll = new TH1F(Name.Data(), Title.Data(), TimeBins, TimeMin, TimeMax);
317 m_clusterTimeUAll->GetXaxis()->SetTitle("cluster time (ns)");
318 m_clusterTimeUAll->GetYaxis()->SetTitle("count");
320 Name = "SVDDQM_ClusterTimeVAll";
321 Title = Form("SVD V-Cluster Time %s for all sensors", refFrame.Data());
322 m_clusterTimeVAll = new TH1F(Name.Data(), Title.Data(), TimeBins, TimeMin, TimeMax);
323 m_clusterTimeVAll->GetXaxis()->SetTitle("cluster time (ns)");
324 m_clusterTimeVAll->GetYaxis()->SetTitle("count");
326 //----------------------------------------------------------------
327 // Time of clusters for L3/L456 sensors
328 //----------------------------------------------------------------
329 Name = "SVDDQM_ClusterTimeU3";
330 Title = Form("SVD U-Cluster Time %s for layer 3 sensors", refFrame.Data());
331 m_clusterTimeU3 = new TH1F(Name.Data(), Title.Data(), TimeBins, TimeMin, TimeMax);
332 m_clusterTimeU3->GetXaxis()->SetTitle("cluster time (ns)");
333 m_clusterTimeU3->GetYaxis()->SetTitle("count");
335 name = str(format("SVDDQM_ClusterTimeV3"));
336 Title = Form("SVD V-Cluster Time %s for layer 3 sensors", refFrame.Data());
337 m_clusterTimeV3 = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
338 m_clusterTimeV3->GetXaxis()->SetTitle("cluster time (ns)");
339 m_clusterTimeV3->GetYaxis()->SetTitle("count");
341
342 name = str(format("SVDDQM_ClusterTimeU456"));
343 Title = Form("SVD U-Cluster Time %s for layers 4,5,6 sensors", refFrame.Data());
344 m_clusterTimeU456 = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
345 m_clusterTimeU456->GetXaxis()->SetTitle("cluster time (ns)");
346 m_clusterTimeU456->GetYaxis()->SetTitle("count");
348 name = str(format("SVDDQM_ClusterTimeV456"));
349 Title = Form("SVD V-Cluster Time %s for layers 4,5,6 sensors", refFrame.Data());
350 m_clusterTimeV456 = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
351 m_clusterTimeV456->GetXaxis()->SetTitle("cluster time (ns)");
352 m_clusterTimeV456->GetYaxis()->SetTitle("count");
354
355 //----------------------------------------------------------------
356 // Time of clusters for L3/L456 sensors for 3 samples
357 //----------------------------------------------------------------
358 if (m_3Samples) {
359 Name = "SVDDQM_Cluster3TimeU3";
360 Title = Form("SVD U-Cluster Time %s for layer 3 sensors for 3 samples", refFrame.Data());
361 m_cluster3SampleTimeU3 = new TH1F(Name.Data(), Title.Data(), TimeBins, TimeMin, TimeMax);
362 m_cluster3SampleTimeU3->GetXaxis()->SetTitle("cluster time (ns)");
363 m_cluster3SampleTimeU3->GetYaxis()->SetTitle("count");
365 name = str(format("SVDDQM_Cluster3TimeV3"));
366 Title = Form("SVD V-Cluster Time %s for layer 3 sensors for 3 samples", refFrame.Data());
367 m_cluster3SampleTimeV3 = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
368 m_cluster3SampleTimeV3->GetXaxis()->SetTitle("cluster time (ns)");
369 m_cluster3SampleTimeV3->GetYaxis()->SetTitle("count");
371 name = str(format("SVDDQM_Cluster3TimeU456"));
372 Title = Form("SVD U-Cluster Time %s for layers 4,5,6 sensors for 3 samples", refFrame.Data());
373 m_cluster3SampleTimeU456 = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
374 m_cluster3SampleTimeU456->GetXaxis()->SetTitle("cluster time (ns)");
375 m_cluster3SampleTimeU456->GetYaxis()->SetTitle("count");
377 name = str(format("SVDDQM_Cluster3TimeV456"));
378 Title = Form("SVD V-Cluster Time %s for layers 4,5,6 sensors for 3 samples", refFrame.Data());
379 m_cluster3SampleTimeV456 = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
380 m_cluster3SampleTimeV456->GetXaxis()->SetTitle("cluster time (ns)");
381 m_cluster3SampleTimeV456->GetYaxis()->SetTitle("count");
383
384 //----------------------------------------------------------------
385 // Time of clusters for L3/L456 sensors for 6 samples
386 //----------------------------------------------------------------
387 Name = "SVDDQM_Cluster6TimeU3";
388 Title = Form("SVD U-Cluster Time %s for layer 3 sensors for 6 samples", refFrame.Data());
389 m_cluster6SampleTimeU3 = new TH1F(Name.Data(), Title.Data(), TimeBins, TimeMin, TimeMax);
390 m_cluster6SampleTimeU3->GetXaxis()->SetTitle("cluster time (ns)");
391 m_cluster6SampleTimeU3->GetYaxis()->SetTitle("count");
393 name = str(format("SVDDQM_Cluster6TimeV3"));
394 Title = Form("SVD V-Cluster Time %s for layer 3 sensors for 6 samples", refFrame.Data());
395 m_cluster6SampleTimeV3 = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
396 m_cluster6SampleTimeV3->GetXaxis()->SetTitle("cluster time (ns)");
397 m_cluster6SampleTimeV3->GetYaxis()->SetTitle("count");
399
400 name = str(format("SVDDQM_Cluster6TimeU456"));
401 Title = Form("SVD U-Cluster Time %s for layers 4,5,6 sensors for 6 samples", refFrame.Data());
402 m_cluster6SampleTimeU456 = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
403 m_cluster6SampleTimeU456->GetXaxis()->SetTitle("cluster time (ns)");
404 m_cluster6SampleTimeU456->GetYaxis()->SetTitle("count");
406 name = str(format("SVDDQM_Cluster6TimeV456"));
407 Title = Form("SVD V-Cluster Time %s for layers 4,5,6 sensors for 6 samples", refFrame.Data());
408 m_cluster6SampleTimeV456 = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
409 m_cluster6SampleTimeV456->GetXaxis()->SetTitle("cluster time (ns)");
410 m_cluster6SampleTimeV456->GetYaxis()->SetTitle("count");
412 }
413
414
415 //----------------------------------------------------------------
416 // Charge of clusters for L3/L456 sensors group id = 0, 1, 2, 3
417 //----------------------------------------------------------------
418 name = str(format("SVDDQM_ClusterChargeGroupIDsL3U"));
419 title = str(format("SVD U-Cluster Charge for layer 3 sensors for group Id = 0, 1, 2 & 3"));
420 m_clusterChargeGroupIDsL3U = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
421 m_clusterChargeGroupIDsL3U->GetXaxis()->SetTitle("cluster charge [ke-]");
422 m_clusterChargeGroupIDsL3U->GetYaxis()->SetTitle("count");
424 name = str(format("SVDDQM_ClusterChargeGroupIDsL3V"));
425 title = str(format("SVD V-Cluster Charge for layer 3 sensors for group Id = 0, 1, 2 & 3"));
426 m_clusterChargeGroupIDsL3V = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
427 m_clusterChargeGroupIDsL3V->GetXaxis()->SetTitle("cluster charge [ke-]");
428 m_clusterChargeGroupIDsL3V->GetYaxis()->SetTitle("count");
430
431 name = str(format("SVDDQM_ClusterChargeGroupIDsL456U"));
432 title = str(format("SVD U-Cluster Charge for layers 4,5,6 sensors for group Id = 0, 1, 2 & 3"));
433 m_clusterChargeGroupIDsL456U = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
434 m_clusterChargeGroupIDsL456U->GetXaxis()->SetTitle("cluster charge [ke-]");
435 m_clusterChargeGroupIDsL456U->GetYaxis()->SetTitle("count");
437
438 name = str(format("SVDDQM_ClusterChargeGroupIDsL456V"));
439 title = str(format("SVD V-Cluster Charge for layers 4,5,6 sensors for group Id = 0, 1, 2 & 3"));
440 m_clusterChargeGroupIDsL456V = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
441 m_clusterChargeGroupIDsL456V->GetXaxis()->SetTitle("cluster charge [ke-]");
442 m_clusterChargeGroupIDsL456V->GetYaxis()->SetTitle("count");
444
445 //----------------------------------------------------------------
446 // SNR of clusters for L3/L456 sensors group id = 0, 1, 2, 3
447 //----------------------------------------------------------------
448 name = str(format("SVDDQM_ClusterSNRGroupIDsL3U"));
449 title = str(format("SVD U-Cluster SNR for layer 3 sensors for group Id = 0, 1, 2 & 3"));
450 m_clusterSNRGroupIDsL3U = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
451 m_clusterSNRGroupIDsL3U->GetXaxis()->SetTitle("cluster SNR");
452 m_clusterSNRGroupIDsL3U->GetYaxis()->SetTitle("count");
454 name = str(format("SVDDQM_ClusterSNRGroupIDsL3V"));
455 title = str(format("SVD V-Cluster SNR for layer 3 sensors for group Id = 0, 1, 2 & 3"));
456 m_clusterSNRGroupIDsL3V = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
457 m_clusterSNRGroupIDsL3V->GetXaxis()->SetTitle("cluster SNR");
458 m_clusterSNRGroupIDsL3V->GetYaxis()->SetTitle("count");
460
461 name = str(format("SVDDQM_ClusterSNRGroupIDsL456U"));
462 title = str(format("SVD U-Cluster SNR for layers 4,5,6 sensors for group Id = 0, 1, 2 & 3"));
463 m_clusterSNRGroupIDsL456U = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
464 m_clusterSNRGroupIDsL456U->GetXaxis()->SetTitle("cluster SNR");
465 m_clusterSNRGroupIDsL456U->GetYaxis()->SetTitle("count");
467 name = str(format("SVDDQM_ClusterSNRGroupIDsL456V"));
468 title = str(format("SVD V-Cluster SNR for layers 4,5,6 sensors for group Id = 0, 1, 2 & 3"));
469 m_clusterSNRGroupIDsL456V = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
470 m_clusterSNRGroupIDsL456V->GetXaxis()->SetTitle("cluster SNR");
471 m_clusterSNRGroupIDsL456V->GetYaxis()->SetTitle("count");
473
474
475 //----------------------------------------------------------------
476 // Time of clusters for L3/L456 sensors group id = 0, 1, 2, 3
477 //----------------------------------------------------------------
478 Name = "SVDDQM_ClusterTimeGroupIDsL3U";
479 Title = Form("SVD U-Cluster Time %s for layer 3 sensors for group Id = 0, 1, 2 & 3", refFrame.Data());
480 m_clusterTimeGroupIDsL3U = new TH1F(Name.Data(), Title.Data(), TimeBins, TimeMin, TimeMax);
481 m_clusterTimeGroupIDsL3U->GetXaxis()->SetTitle("cluster time (ns)");
482 m_clusterTimeGroupIDsL3U->GetYaxis()->SetTitle("count");
484 name = str(format("SVDDQM_ClusterTimeGroupIDsL3V"));
485 Title = Form("SVD V-Cluster Time %s for layer 3 sensors for group Id = 0, 1, 2 & 3", refFrame.Data());
486 m_clusterTimeGroupIDsL3V = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
487 m_clusterTimeGroupIDsL3V->GetXaxis()->SetTitle("cluster time (ns)");
488 m_clusterTimeGroupIDsL3V->GetYaxis()->SetTitle("count");
490
491 name = str(format("SVDDQM_ClusterTimeGroupIDsL456U"));
492 Title = Form("SVD U-Cluster Time %s for layers 4,5,6 sensors for group Id = 0, 1, 2 & 3", refFrame.Data());
493 m_clusterTimeGroupIDsL456U = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
494 m_clusterTimeGroupIDsL456U->GetXaxis()->SetTitle("cluster time (ns)");
495 m_clusterTimeGroupIDsL456U->GetYaxis()->SetTitle("count");
497 name = str(format("SVDDQM_ClusterTimeGroupIDsL456V"));
498 Title = Form("SVD V-Cluster Time %s for layers 4,5,6 sensors for group Id = 0, 1, 2 & 3", refFrame.Data());
499 m_clusterTimeGroupIDsL456V = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
500 m_clusterTimeGroupIDsL456V->GetXaxis()->SetTitle("cluster time (ns)");
501 m_clusterTimeGroupIDsL456V->GetYaxis()->SetTitle("count");
503
504 //----------------------------------------------------------------
505 // Cluster time group Id vs cluster time for U/V sensors
506 //----------------------------------------------------------------
507 Name = "SVDDQM_ClusterTimeGroupIdU";
508 Title = Form("SVD cluster Time Group Id %s vs cluster time for U/P Side", refFrame.Data());
509 m_clusterTimeGroupIdU = new TH2F(Name.Data(), Title.Data(), TimeBins / 2, TimeMin, TimeMax, GroupIdBins, GroupIdMin, GroupIdMax);
510 m_clusterTimeGroupIdU->GetXaxis()->SetTitle("cluster time (ns)");
511 m_clusterTimeGroupIdU->GetYaxis()->SetTitle("cluster group id");
513 Name = "SVDDQM_ClusterTimeGroupIdV";
514 Title = Form("SVD cluster Time Group Id %s vs cluster time for V/N Side", refFrame.Data());
515 m_clusterTimeGroupIdV = new TH2F(Name.Data(), Title.Data(), TimeBins / 2, TimeMin, TimeMax, GroupIdBins, GroupIdMin, GroupIdMax);
516 m_clusterTimeGroupIdV->GetXaxis()->SetTitle("cluster time (ns)");
517 m_clusterTimeGroupIdV->GetYaxis()->SetTitle("cluster group id");
519
520 //----------------------------------------------------------------
521 // Cluster time group Id vs cluster time for U/V sensors for coarse and fine trigger
522 //----------------------------------------------------------------
523 Name = "SVDDQM_cluster6TimeGroupIdU";
524 Title = Form("SVD cluster Time Group Id %s vs cluster time for U/P Side for coarse trigger", refFrame.Data());
525 m_clusterTimeCoarseGroupIdU = new TH2F(Name.Data(), Title.Data(), TimeBins / 2, TimeMin, TimeMax, GroupIdBins, GroupIdMin,
526 GroupIdMax);
527 m_clusterTimeCoarseGroupIdU->GetXaxis()->SetTitle("cluster time (ns)");
528 m_clusterTimeCoarseGroupIdU->GetYaxis()->SetTitle("cluster group id");
530 Name = "SVDDQM_cluster6TimeGroupIdV";
531 Title = Form("SVD cluster Time Group Id %s vs cluster time for V/N Side for coarse trigger", refFrame.Data());
532 m_clusterTimeCoarseGroupIdV = new TH2F(Name.Data(), Title.Data(), TimeBins / 2, TimeMin, TimeMax, GroupIdBins, GroupIdMin,
533 GroupIdMax);
534 m_clusterTimeCoarseGroupIdV->GetXaxis()->SetTitle("cluster time (ns)");
535 m_clusterTimeCoarseGroupIdV->GetYaxis()->SetTitle("cluster group id");
537
538 Name = "SVDDQM_cluster3TimeGroupIdU";
539 Title = Form("SVD cluster Time Group Id %s vs cluster time for U/P Side for fine trigger", refFrame.Data());
540 m_clusterTimeFineGroupIdU = new TH2F(Name.Data(), Title.Data(), TimeBins / 2, TimeMin, TimeMax, GroupIdBins, GroupIdMin,
541 GroupIdMax);
542 m_clusterTimeFineGroupIdU->GetXaxis()->SetTitle("cluster time (ns)");
543 m_clusterTimeFineGroupIdU->GetYaxis()->SetTitle("cluster group id");
545 Name = "SVDDQM_cluster3TimeGroupIdV";
546 Title = Form("SVD cluster Time Group Id %s vs cluster time for V/N Side for fine trigger", refFrame.Data());
547 m_clusterTimeFineGroupIdV = new TH2F(Name.Data(), Title.Data(), TimeBins / 2, TimeMin, TimeMax, GroupIdBins, GroupIdMin,
548 GroupIdMax);
549 m_clusterTimeFineGroupIdV->GetXaxis()->SetTitle("cluster time (ns)");
550 m_clusterTimeFineGroupIdV->GetYaxis()->SetTitle("cluster group id");
552
553 //----------------------------------------------------------------
554 // MaxBin of strips for all sensors (offline ZS)
555 //----------------------------------------------------------------
556 name = str(format("SVDDQM_StripMaxBinUAll"));
557 title = str(format("SVD U-Strip MaxBin for all sensors"));
558 m_stripMaxBinUAll = new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
559 m_stripMaxBinUAll->GetXaxis()->SetTitle("max bin");
560 m_stripMaxBinUAll->GetYaxis()->SetTitle("count");
562 name = str(format("SVDDQM_StripMaxBinVAll"));
563 title = str(format("SVD V-Strip MaxBin for all sensors"));
564 m_stripMaxBinVAll = new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
565 m_stripMaxBinVAll->GetXaxis()->SetTitle("max bin");
566 m_stripMaxBinVAll->GetYaxis()->SetTitle("count");
568
569 name = str(format("SVDDQM_StripMaxBinU3"));
570 title = str(format("SVD U-Strip MaxBin for layer 3 sensors"));
571 m_stripMaxBinU3 = new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
572 m_stripMaxBinU3->GetXaxis()->SetTitle("max bin");
573 m_stripMaxBinU3->GetYaxis()->SetTitle("count");
575 name = str(format("SVDDQM_StripMaxBinV3"));
576 title = str(format("SVD V-Strip MaxBin for layer 3 sensors"));
577 m_stripMaxBinV3 = new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
578 m_stripMaxBinV3->GetXaxis()->SetTitle("max bin");
579 m_stripMaxBinV3->GetYaxis()->SetTitle("count");
581
582 name = str(format("SVDDQM_StripMaxBinU6"));
583 title = str(format("SVD U-Strip MaxBin for layer 6 sensors"));
584 m_stripMaxBinU6 = new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
585 m_stripMaxBinU6->GetXaxis()->SetTitle("max bin");
586 m_stripMaxBinU6->GetYaxis()->SetTitle("count");
588 name = str(format("SVDDQM_StripMaxBinV6"));
589 title = str(format("SVD V-Strip MaxBin for layer 6 sensors"));
590 m_stripMaxBinV6 = new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
591 m_stripMaxBinV6->GetXaxis()->SetTitle("max bin");
592 m_stripMaxBinV6->GetYaxis()->SetTitle("count");
594
595
596 for (int i = 0; i < nSVDSensors; i++) {
597 VxdID id = gTools->getSensorIDFromSVDIndex(i);
598 int iLayer = id.getLayerNumber();
599 int iLadder = id.getLadderNumber();
600 int iSensor = id.getSensorNumber();
601 VxdID sensorID(iLayer, iLadder, iSensor);
602 string sensorDescr = str(format("%1%_%2%_%3%") % iLayer % iLadder % iSensor);
603
604 if (m_additionalPlots) {
605 //----------------------------------------------------------------
606 // Number of fired strips per sensor
607 //----------------------------------------------------------------
608 name = str(format("SVDDQM_%1%_FiredU") % sensorDescr);
609 title = str(format("SVD Sensor %1% Number of Fired U-Strips") % sensorDescr);
610 m_firedU[i] = new TH1F(name.c_str(), title.c_str(), 50, 0, 50);
611 m_firedU[i]->GetXaxis()->SetTitle("# fired strips");
612 m_firedU[i]->GetYaxis()->SetTitle("count");
613 m_histoList->Add(m_firedU[i]);
614 name = str(format("SVDDQM_%1%_FiredV") % sensorDescr);
615 title = str(format("SVD Sensor %1% Number of Fired V-Strips") % sensorDescr);
616 m_firedV[i] = new TH1F(name.c_str(), title.c_str(), 50, 0, 50);
617 m_firedV[i]->GetXaxis()->SetTitle("# fired strips");
618 m_firedV[i]->GetYaxis()->SetTitle("count");
619 m_histoList->Add(m_firedV[i]);
620 //----------------------------------------------------------------
621 // Number of clusters per sensor
622 //----------------------------------------------------------------
623 name = str(format("SVDDQM_%1%_ClustersU") % sensorDescr);
624 title = str(format("SVD Sensor %1% Number of U-Clusters") % sensorDescr);
625 m_clustersU[i] = new TH1F(name.c_str(), title.c_str(), 20, 0, 20);
626 m_clustersU[i]->GetXaxis()->SetTitle("# clusters");
627 m_clustersU[i]->GetYaxis()->SetTitle("count");
628 m_histoList->Add(m_clustersU[i]);
629 name = str(format("SVDDQM_%1%_ClustersV") % sensorDescr);
630 title = str(format("SVD Sensor %1% Number of V-Clusters") % sensorDescr);
631 m_clustersV[i] = new TH1F(name.c_str(), title.c_str(), 20, 0, 20);
632 m_clustersV[i]->GetXaxis()->SetTitle("# clusters");
633 m_clustersV[i]->GetYaxis()->SetTitle("count");
634 m_histoList->Add(m_clustersV[i]);
635 //----------------------------------------------------------------
636 // Charge of strips
637 //----------------------------------------------------------------
638 name = str(format("SVDDQM_%1%_ADCStripU") % sensorDescr);
639 title = str(format("SVD Sensor %1% U-Strip signal in ADC Counts, all 6 APV samples") % sensorDescr);
640 m_stripSignalU[i] = new TH1F(name.c_str(), title.c_str(), 256, -0.5, 255.5);
641 m_stripSignalU[i]->GetXaxis()->SetTitle("signal ADC");
642 m_stripSignalU[i]->GetYaxis()->SetTitle("count");
644 name = str(format("SVDDQM_%1%_ADCStripV") % sensorDescr);
645 title = str(format("SVD Sensor %1% V-Strip signal in ADC Counts, all 6 APV samples") % sensorDescr);
646 m_stripSignalV[i] = new TH1F(name.c_str(), title.c_str(), 256, -0.5, 255.5);
647 m_stripSignalV[i]->GetXaxis()->SetTitle("signal ADC");
648 m_stripSignalV[i]->GetYaxis()->SetTitle("count");
650 }
651
652 //----------------------------------------------------------------
653 // Charge of clusters
654 //----------------------------------------------------------------
655 name = str(format("SVDDQM_%1%_ClusterChargeU") % sensorDescr);
656 title = str(format("SVD Sensor %1% U-Cluster Charge") % sensorDescr);
657 m_clusterChargeU[i] = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
658 m_clusterChargeU[i]->GetXaxis()->SetTitle("cluster charge [ke-]");
659 m_clusterChargeU[i]->GetYaxis()->SetTitle("count");
661 name = str(format("SVDDQM_%1%_ClusterChargeV") % sensorDescr);
662 title = str(format("SVD Sensor %1% V-Cluster Charge") % sensorDescr);
663 m_clusterChargeV[i] = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
664 m_clusterChargeV[i]->GetXaxis()->SetTitle("cluster charge [ke-]");
665 m_clusterChargeV[i]->GetYaxis()->SetTitle("count");
667 //----------------------------------------------------------------
668 // SNR of clusters
669 //----------------------------------------------------------------
670 name = str(format("SVDDQM_%1%_ClusterSNRU") % sensorDescr);
671 title = str(format("SVD Sensor %1% U-Cluster SNR") % sensorDescr);
672 m_clusterSNRU[i] = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
673 m_clusterSNRU[i]->GetXaxis()->SetTitle("cluster SNR");
674 m_clusterSNRU[i]->GetYaxis()->SetTitle("count");
675 m_histoList->Add(m_clusterSNRU[i]);
676 name = str(format("SVDDQM_%1%_ClusterSNRV") % sensorDescr);
677 title = str(format("SVD Sensor %1% V-Cluster SNR") % sensorDescr);
678 m_clusterSNRV[i] = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
679 m_clusterSNRV[i]->GetXaxis()->SetTitle("cluster SNR");
680 m_clusterSNRV[i]->GetYaxis()->SetTitle("count");
681 m_histoList->Add(m_clusterSNRV[i]);
682
683 //----------------------------------------------------------------
684 // Strips Counts
685 //----------------------------------------------------------------
686 name = str(format("SVDDQM_%1%_StripCountU") % sensorDescr);
687 title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired U-Strip vs Strip Number") % sensorDescr);
688 m_stripCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
689 m_stripCountU[i]->GetXaxis()->SetTitle("cellID");
690 m_stripCountU[i]->GetYaxis()->SetTitle("count");
691 m_histoList->Add(m_stripCountU[i]);
692 name = str(format("SVDDQM_%1%_StripCountV") % sensorDescr);
693 title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired V-Strip vs Strip Number") % sensorDescr);
694 m_stripCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
695 m_stripCountV[i]->GetXaxis()->SetTitle("cellID");
696 m_stripCountV[i]->GetYaxis()->SetTitle("count");
697 m_histoList->Add(m_stripCountV[i]);
698 //----------------------------------------------------------------
699 // Strips Counts with online ZS
700 //----------------------------------------------------------------
701 name = str(format("SVDDQM_%1%_OnlineZSStripCountU") % sensorDescr);
702 title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired U-Strip vs Strip Number") % sensorDescr);
703 m_onlineZSstripCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
704 m_onlineZSstripCountU[i]->GetXaxis()->SetTitle("cellID");
705 m_onlineZSstripCountU[i]->GetYaxis()->SetTitle("count");
707 name = str(format("SVDDQM_%1%_OnlineZSStripCountV") % sensorDescr);
708 title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired V-Strip vs Strip Number") % sensorDescr);
709 m_onlineZSstripCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
710 m_onlineZSstripCountV[i]->GetXaxis()->SetTitle("cellID");
711 m_onlineZSstripCountV[i]->GetYaxis()->SetTitle("count");
713
714 //----------------------------------------------------------------
715 // Strips Counts for 3 samples
716 //----------------------------------------------------------------
717 if (m_3Samples) {
718 name = str(format("SVDDQM_%1%_Strip3CountU") % sensorDescr);
719 title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired U-Strip vs Strip Number for 3 samples") % sensorDescr);
720 m_strip3SampleCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
721 m_strip3SampleCountU[i]->GetXaxis()->SetTitle("cellID");
722 m_strip3SampleCountU[i]->GetYaxis()->SetTitle("count");
724 name = str(format("SVDDQM_%1%_Strip3CountV") % sensorDescr);
725 title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired V-Strip vs Strip Number for 3 samples") % sensorDescr);
726 m_strip3SampleCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
727 m_strip3SampleCountV[i]->GetXaxis()->SetTitle("cellID");
728 m_strip3SampleCountV[i]->GetYaxis()->SetTitle("count");
730
731 //----------------------------------------------------------------
732 // Strips Counts with online ZS for 3 samples
733 //----------------------------------------------------------------
734 name = str(format("SVDDQM_%1%_OnlineZSStrip3CountU") % sensorDescr);
735 title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired U-Strip vs Strip Number for 3 samples") % sensorDescr);
736 m_onlineZSstrip3SampleCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
737 m_onlineZSstrip3SampleCountU[i]->GetXaxis()->SetTitle("cellID");
738 m_onlineZSstrip3SampleCountU[i]->GetYaxis()->SetTitle("count");
740 name = str(format("SVDDQM_%1%_OnlineZSStrip3CountV") % sensorDescr);
741 title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired V-Strip vs Strip Number for 3 samples") % sensorDescr);
742 m_onlineZSstrip3SampleCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
743 m_onlineZSstrip3SampleCountV[i]->GetXaxis()->SetTitle("cellID");
744 m_onlineZSstrip3SampleCountV[i]->GetYaxis()->SetTitle("count");
746
747 //----------------------------------------------------------------
748 // Strips Counts for 6 samples
749 //----------------------------------------------------------------
750 name = str(format("SVDDQM_%1%_Strip6CountU") % sensorDescr);
751 title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired U-Strip vs Strip Number for 6 samples") % sensorDescr);
752 m_strip6SampleCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
753 m_strip6SampleCountU[i]->GetXaxis()->SetTitle("cellID");
754 m_strip6SampleCountU[i]->GetYaxis()->SetTitle("count");
756 name = str(format("SVDDQM_%1%_strip6CountV") % sensorDescr);
757 title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired V-Strip vs Strip Number for 6 samples") % sensorDescr);
758 m_strip6SampleCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
759 m_strip6SampleCountV[i]->GetXaxis()->SetTitle("cellID");
760 m_strip6SampleCountV[i]->GetYaxis()->SetTitle("count");
762 //----------------------------------------------------------------
763 // Strips Counts with online ZS for 6 samples
764 //----------------------------------------------------------------
765 name = str(format("SVDDQM_%1%_OnlineZSStrip6CountU") % sensorDescr);
766 title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired U-Strip vs Strip Number for 6 samples") % sensorDescr);
767 m_onlineZSstrip6sampleCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
768 m_onlineZSstrip6sampleCountU[i]->GetXaxis()->SetTitle("cellID");
769 m_onlineZSstrip6sampleCountU[i]->GetYaxis()->SetTitle("count");
771 name = str(format("SVDDQM_%1%_OnlineZSStrip6CountV") % sensorDescr);
772 title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired V-Strip vs Strip Number for 6 samples") % sensorDescr);
773 m_onlineZSstrip6sampleCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
774 m_onlineZSstrip6sampleCountV[i]->GetXaxis()->SetTitle("cellID");
775 m_onlineZSstrip6sampleCountV[i]->GetYaxis()->SetTitle("count");
777 }
778
779 //----------------------------------------------------------------
780 // Strips Counts for cluster time group id = 0, 1, 2, 3
781 //----------------------------------------------------------------
782 name = str(format("SVDDQM_%1%_StripCountSignalGroupIDsU") % sensorDescr);
783 title = str(format("SVD Sensor %1% Integrated NumberFired U-Strip for group Id = 0, 1, 2 & 3 vs Strip Number") % sensorDescr);
784 m_stripCountSignalGroupIDsU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
785 m_stripCountSignalGroupIDsU[i]->GetXaxis()->SetTitle("cellID");
786 m_stripCountSignalGroupIDsU[i]->GetYaxis()->SetTitle("count");
788 name = str(format("SVDDQM_%1%_StripCountSignalGroupIDsV") % sensorDescr);
789 title = str(format("SVD Sensor %1% Integrated Number of Fired V-Strip for group Id = 0, 1, 2 & 3 vs Strip Number") % sensorDescr);
790 m_stripCountSignalGroupIDsV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
791 m_stripCountSignalGroupIDsV[i]->GetXaxis()->SetTitle("cellID");
792 m_stripCountSignalGroupIDsV[i]->GetYaxis()->SetTitle("count");
794
795 //----------------------------------------------------------------
796 // Cluster size distribution
797 //----------------------------------------------------------------
798 name = str(format("SVDDQM_%1%_ClusterSizeU") % sensorDescr);
799 title = str(format("SVD Sensor %1% U-Cluster Size") % sensorDescr);
800 m_clusterSizeU[i] = new TH1F(name.c_str(), title.c_str(), 9, 1, 10);
801 m_clusterSizeU[i]->GetXaxis()->SetTitle("cluster size");
802 m_clusterSizeU[i]->GetYaxis()->SetTitle("count");
804 name = str(format("SVDDQM_%1%_ClusterSizeV") % sensorDescr);
805 title = str(format("SVD Sensor %1% V-Cluster Size") % sensorDescr);
806 m_clusterSizeV[i] = new TH1F(name.c_str(), title.c_str(), 9, 1, 10);
807 m_clusterSizeV[i]->GetXaxis()->SetTitle("cluster size");
808 m_clusterSizeV[i]->GetYaxis()->SetTitle("count");
810 //----------------------------------------------------------------
811 // Cluster time distribution
812 //----------------------------------------------------------------
813 name = str(format("SVDDQM_%1%_ClusterTimeU") % sensorDescr);
814 Title = Form("SVD Sensor %s U-Cluster Time %s", sensorDescr.c_str(), refFrame.Data());
815 m_clusterTimeU[i] = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
816 m_clusterTimeU[i]->GetXaxis()->SetTitle("cluster time (ns)");
817 m_clusterTimeU[i]->GetYaxis()->SetTitle("count");
819 name = str(format("SVDDQM_%1%_ClusterTimeV") % sensorDescr);
820 Title = Form("SVD Sensor %s V-Cluster Time %s", sensorDescr.c_str(), refFrame.Data());
821 m_clusterTimeV[i] = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
822 m_clusterTimeV[i]->GetXaxis()->SetTitle("cluster time (ns)");
823 m_clusterTimeV[i]->GetYaxis()->SetTitle("count");
825 }
826
827 for (int i = 0; i < nSVDChips; i++) {
828 VxdID id = gTools->getChipIDFromSVDIndex(i);
829 int iLayer = id.getLayerNumber();
830 int iLadder = id.getLadderNumber();
831 int iSensor = id.getSensorNumber();
832 int iChip = gTools->getSVDChipNumber(id);
833 int IsU = gTools->isSVDSideU(id);
834 TString AxisTicks = Form("%i_%i_%i_u%i", iLayer, iLadder, iSensor, iChip);
835 if (!IsU)
836 AxisTicks = Form("%i_%i_%i_v%i", iLayer, iLadder, iSensor, iChip);
837 m_hitMapCountsChip->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
838 m_hitMapClCountsChip->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
839 }
840
841
842
843 //----------------------------------------------------------------
844 // Additional histograms for out of ExpressReco
845 //----------------------------------------------------------------
846
847 if (m_ShowAllHistos == 1) {
848 TDirectory* dirShowAll = nullptr;
849 dirShowAll = oldDir->mkdir("SVDDQMAll");
850 dirShowAll->cd();
851
852 m_hitMapU = new TH2F*[nSVDSensors];
853 m_hitMapV = new TH2F*[nSVDSensors];
854 m_hitMapUCl = new TH1F*[nSVDSensors];
855 m_hitMapVCl = new TH1F*[nSVDSensors];
856 for (int i = 0; i < nSVDSensors; i++) {
857 VxdID id = gTools->getSensorIDFromSVDIndex(i);
858 int iLayer = id.getLayerNumber();
859 int iLadder = id.getLadderNumber();
860 int iSensor = id.getSensorNumber();
861 VxdID sensorID(iLayer, iLadder, iSensor);
862 SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::getInstance().getSensorInfo(sensorID));
863 string sensorDescr = str(format("%1%_%2%_%3%") % iLayer % iLadder % iSensor);
864 //----------------------------------------------------------------
865 // Hitmaps: Number of strips by coordinate
866 //----------------------------------------------------------------
867 name = str(format("SVD_%1%_StripHitmapU") % sensorDescr);
868 title = str(format("SVD Sensor %1% Strip Hitmap in U") % sensorDescr);
869 int nStrips = SensorInfo.getUCells();
870 m_hitMapU[i] = new TH2F(name.c_str(), title.c_str(), nStrips, 0, nStrips, SVDShaperDigit::c_nAPVSamples, 0,
872 m_hitMapU[i]->GetXaxis()->SetTitle("u position [pitch units]");
873 m_hitMapU[i]->GetYaxis()->SetTitle("timebin [time units]");
874 m_hitMapU[i]->GetZaxis()->SetTitle("hits");
875 m_histoList->Add(m_hitMapU[i]);
876 name = str(format("SVD_%1%_StripHitmapV") % sensorDescr);
877 title = str(format("SVD Sensor %1% Strip Hitmap in V") % sensorDescr);
878 nStrips = SensorInfo.getVCells();
879 m_hitMapV[i] = new TH2F(name.c_str(), title.c_str(), nStrips, 0, nStrips, SVDShaperDigit::c_nAPVSamples, 0,
881 m_hitMapV[i]->GetXaxis()->SetTitle("v position [pitch units]");
882 m_hitMapV[i]->GetYaxis()->SetTitle("timebin [time units]");
883 m_hitMapV[i]->GetZaxis()->SetTitle("hits");
884 m_histoList->Add(m_hitMapV[i]);
885 //----------------------------------------------------------------
886 // Hitmaps: Number of clusters by coordinate
887 //----------------------------------------------------------------
888 name = str(format("SVD_%1%_HitmapClstU") % sensorDescr);
889 title = str(format("SVD Sensor %1% Hitmap Clusters in U") % sensorDescr);
890 nStrips = SensorInfo.getUCells();
891 m_hitMapUCl[i] = new TH1F(name.c_str(), title.c_str(), nStrips, 0, nStrips);
892 m_hitMapUCl[i]->GetXaxis()->SetTitle("u position [pitch units]");
893 m_hitMapUCl[i]->GetYaxis()->SetTitle("hits");
894 m_histoList->Add(m_hitMapUCl[i]);
895 name = str(format("SVD_%1%_HitmapClstV") % sensorDescr);
896 title = str(format("SVD Sensor %1% Hitmap Clusters in V") % sensorDescr);
897 nStrips = SensorInfo.getVCells();
898 m_hitMapVCl[i] = new TH1F(name.c_str(), title.c_str(), nStrips, 0, nStrips);
899 m_hitMapVCl[i]->GetXaxis()->SetTitle("v position [pitch units]");
900 m_hitMapVCl[i]->GetYaxis()->SetTitle("hits");
901 m_histoList->Add(m_hitMapVCl[i]);
902 }
903 }
904
905 oldDir->cd();
906}
907
908
910{
911 // Register histograms (calls back defineHisto)
912 REG_HISTOGRAM
913
914 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
915 if (gTools->getNumberOfSVDLayers() != 0) {
916 //Register collections
920
921 storeSVDClusters.isOptional();
922 storeSVDShaperDigits.isOptional();
923 m_svdEventInfo.isOptional();
924 storeNoZSSVDShaperDigits.isOptional();
925
926 //Store names to speed up creation later
927 m_storeSVDShaperDigitsName = storeSVDShaperDigits.getName();
928 }
929
930 m_objTrgSummary.isOptional();
931}
932
934{
935 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
936 if (gTools->getNumberOfSVDLayers() == 0) return;
937
938
939 StoreObjPtr<EventMetaData> evtMetaData;
940 m_expNumber = evtMetaData->getExperiment();
941 m_runNumber = evtMetaData->getRun();
942
943 // Add experiment and run number to the title of selected histograms (CR shifter plots)
944 TString runID = TString::Format(" ~ Exp%d Run%d", m_expNumber, m_runNumber);
945 TObject* obj;
946 TIter nextH(m_histoList);
947 while ((obj = nextH()))
948 if (obj->InheritsFrom("TH1")) {
949
950 TString tmp = (TString)obj->GetTitle();
951 Int_t pos = tmp.Last('~');
952 if (pos == -1) pos = tmp.Length() + 2;
953
954 TString title = tmp(0, pos - 2);
955 (static_cast<TH1F*>(obj))->SetTitle(title + runID);
956 (static_cast<TH1F*>(obj))->Reset();
957 }
958}
959
961{
962 //check HLT decision and increase number of events only if the event has been accepted
965 if (!eventAccepted) return;
966 }
967
968 int nSamples = 0;
969 if (m_svdEventInfo.isValid())
970 nSamples = m_svdEventInfo->getNSamples();
971 else
972 return;
973
974 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
975 if (gTools->getNumberOfSVDLayers() == 0) return;
976
977 const StoreArray<SVDShaperDigit> storeNoZSSVDShaperDigits(m_storeNoZSSVDShaperDigitsName);
978 const StoreArray<SVDShaperDigit> storeSVDShaperDigits(m_storeSVDShaperDigitsName);
979 const StoreArray<SVDCluster> storeSVDClusters(m_storeSVDClustersName);
980
981 if (!storeSVDShaperDigits.isValid()) {
982 B2WARNING("Missing SVDShaperDigit, SVDDQMExpressRecoModule is skipped.");
983 return;
984 }
985
986 m_nEvents->Fill(0);
987
988 int firstSVDLayer = gTools->getFirstSVDLayer();
989 int lastSVDLayer = gTools->getLastSVDLayer();
990 int nSVDSensors = gTools->getNumberOfSVDSensors();
991
992 // Fired strips offline ZS
993 vector< set<int> > uStrips(nSVDSensors); // sets to eliminate multiple samples per strip
994 vector< set<int> > vStrips(nSVDSensors);
995 for (const SVDShaperDigit& digitIn : storeSVDShaperDigits) {
996 int iLayer = digitIn.getSensorID().getLayerNumber();
997 if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer)) continue;
998 int iLadder = digitIn.getSensorID().getLadderNumber();
999 int iSensor = digitIn.getSensorID().getSensorNumber();
1000 VxdID sensorID(iLayer, iLadder, iSensor);
1001 int index = gTools->getSVDSensorIndex(sensorID);
1002 if (digitIn.isUStrip()) {
1003
1004 //fill strip count first
1005 if (m_stripCountU[index] != nullptr) m_stripCountU[index]->Fill(digitIn.getCellID());
1006
1007 if (m_3Samples) {
1008 if (nSamples == 3) {
1009 if (m_strip3SampleCountU[index] != nullptr) m_strip3SampleCountU[index]->Fill(digitIn.getCellID());
1010 } else {
1011 if (m_strip6SampleCountU[index] != nullptr) m_strip6SampleCountU[index]->Fill(digitIn.getCellID());
1012 }
1013 }
1014 //fill max bin
1015 if (m_stripMaxBinUAll != nullptr) m_stripMaxBinUAll->Fill(digitIn.getMaxTimeBin());
1016 if (iLayer == 3)
1017 if (m_stripMaxBinU3 != nullptr) m_stripMaxBinU3->Fill(digitIn.getMaxTimeBin());
1018 if (iLayer == 6)
1019 if (m_stripMaxBinU6 != nullptr) m_stripMaxBinU6->Fill(digitIn.getMaxTimeBin());
1020
1021 uStrips.at(index).insert(digitIn.getCellID());
1022 int Chip = (int)(digitIn.getCellID() / gTools->getSVDChannelsPerChip()) + 1;
1023 int indexChip = gTools->getSVDChipIndex(sensorID, kTRUE, Chip);
1024 // 6-to-1 relation weights are equal to digit signals, modulo rounding error
1025 SVDShaperDigit::APVFloatSamples samples = digitIn.getSamples();
1026 int isSample = 0;
1027 for (size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
1029 if (m_stripSignalU[index] != nullptr) m_stripSignalU[index]->Fill(samples[i]);
1030 if (samples[i] > m_CutSVDCharge) {
1031 isSample = 1;
1032 if (m_ShowAllHistos == 1) {
1033 if (m_hitMapU[index] != nullptr) m_hitMapU[index]->Fill(digitIn.getCellID(), i);
1034 }
1035 }
1036 }
1037 if (isSample) {
1038 if (m_hitMapCountsU != nullptr) m_hitMapCountsU->Fill(index);
1039 if (m_hitMapCountsChip != nullptr) m_hitMapCountsChip->Fill(indexChip);
1040 }
1041 } else {
1042 //fill strip count first
1043 if (m_stripCountV[index] != nullptr) m_stripCountV[index]->Fill(digitIn.getCellID());
1044
1045 if (m_3Samples) {
1046 if (nSamples == 3) {
1047 if (m_strip3SampleCountV[index] != nullptr) m_strip3SampleCountV[index]->Fill(digitIn.getCellID());
1048 } else {
1049 if (m_strip6SampleCountV[index] != nullptr) m_strip6SampleCountV[index]->Fill(digitIn.getCellID());
1050 }
1051 }
1052
1053 //fill max bin
1054 if (m_stripMaxBinVAll != nullptr) m_stripMaxBinVAll->Fill(digitIn.getMaxTimeBin());
1055
1056 if (iLayer == 3)
1057 if (m_stripMaxBinV3 != nullptr) m_stripMaxBinV3->Fill(digitIn.getMaxTimeBin());
1058 if (iLayer == 6)
1059 if (m_stripMaxBinV6 != nullptr) m_stripMaxBinV6->Fill(digitIn.getMaxTimeBin());
1060
1061 vStrips.at(index).insert(digitIn.getCellID());
1062 int Chip = (int)(digitIn.getCellID() / gTools->getSVDChannelsPerChip()) + 1;
1063 int indexChip = gTools->getSVDChipIndex(sensorID, kFALSE, Chip);
1064 // 6-to-1 relation weights are equal to digit signals, modulo rounding error
1065 SVDShaperDigit::APVFloatSamples samples = digitIn.getSamples();
1066 int isSample = 0;
1067 for (size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
1069 if (m_stripSignalV[index] != nullptr) m_stripSignalV[index]->Fill(samples[i]);
1070 if (samples[i] > m_CutSVDCharge) {
1071 isSample = 1;
1072 if (m_ShowAllHistos == 1) {
1073 if (m_hitMapV[index] != nullptr) m_hitMapV[index]->Fill(digitIn.getCellID(), i);
1074 }
1075 }
1076 }
1077 if (isSample) {
1078 if (m_hitMapCountsV != nullptr) m_hitMapCountsV->Fill(index);
1079 if (m_hitMapCountsChip != nullptr) m_hitMapCountsChip->Fill(indexChip);
1080 }
1081 }
1082 }
1083 if (m_additionalPlots) {
1084 for (int i = 0; i < nSVDSensors; i++) {
1085 if ((m_firedU[i] != nullptr) && (uStrips[i].size() > 0))
1086 m_firedU[i]->Fill(uStrips[i].size());
1087 if ((m_firedV[i] != nullptr) && (vStrips[i].size() > 0))
1088 m_firedV[i]->Fill(vStrips[i].size());
1089 }
1090 }
1091
1092 // Fired strips ONLINE ZS
1093 if (storeNoZSSVDShaperDigits.isValid())
1094 for (const SVDShaperDigit& digitIn : storeNoZSSVDShaperDigits) {
1095 int iLayer = digitIn.getSensorID().getLayerNumber();
1096 if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer)) continue;
1097 int iLadder = digitIn.getSensorID().getLadderNumber();
1098 int iSensor = digitIn.getSensorID().getSensorNumber();
1099 VxdID sensorID(iLayer, iLadder, iSensor);
1100 int index = gTools->getSVDSensorIndex(sensorID);
1101 if (digitIn.isUStrip()) {
1102 if (m_onlineZSstripCountU[index] != nullptr) m_onlineZSstripCountU[index]->Fill(digitIn.getCellID());
1103 if (m_3Samples) {
1104 if (nSamples == 3) {
1105 if (m_onlineZSstrip3SampleCountU[index] != nullptr) m_onlineZSstrip3SampleCountU[index]->Fill(digitIn.getCellID());
1106 } else {
1107 if (m_onlineZSstrip6sampleCountU[index] != nullptr) m_onlineZSstrip6sampleCountU[index]->Fill(digitIn.getCellID());
1108 }
1109 }
1110 } else {
1111 if (m_onlineZSstripCountV[index] != nullptr) m_onlineZSstripCountV[index]->Fill(digitIn.getCellID());
1112 if (m_3Samples) {
1113 if (nSamples == 3) {
1114 if (m_onlineZSstrip3SampleCountV[index] != nullptr) m_onlineZSstrip3SampleCountV[index]->Fill(digitIn.getCellID());
1115 } else {
1116 if (m_onlineZSstrip6sampleCountV[index] != nullptr) m_onlineZSstrip6sampleCountV[index]->Fill(digitIn.getCellID());
1117 }
1118 }
1119 }
1120 }
1121
1122 vector< set<int> > countsU(nSVDSensors); // sets to eliminate multiple samples per strip
1123 vector< set<int> > countsV(nSVDSensors);
1124 // Hitmaps, Charge, Seed, Size, Time, ...
1125 for (const SVDCluster& cluster : storeSVDClusters) {
1126 if (cluster.getCharge() < m_CutSVDClusterCharge) continue;
1127 int iLayer = cluster.getSensorID().getLayerNumber();
1128 if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer)) continue;
1129 int iLadder = cluster.getSensorID().getLadderNumber();
1130 int iSensor = cluster.getSensorID().getSensorNumber();
1131 VxdID sensorID(iLayer, iLadder, iSensor);
1132 int index = gTools->getSVDSensorIndex(sensorID);
1133 SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::getInstance().getSensorInfo(sensorID));
1134
1135 float time = cluster.getClsTime();
1136 if (m_desynchSVDTime && m_svdEventInfo.isValid())
1137 time = time - m_svdEventInfo->getSVD2FTSWTimeShift(cluster.getFirstFrame());
1138
1139 vector<int> vec = cluster.getTimeGroupId();
1140 auto minElement = min_element(vec.begin(), vec.end());
1141 int groupId = -1;
1142 if (vec.size() > 0) {
1143 groupId = *minElement;
1144
1145 if (cluster.isUCluster()) {
1146 if (m_clusterTimeGroupIdU != nullptr) m_clusterTimeGroupIdU->Fill(time, groupId);
1147 if (m_objTrgSummary.isValid()) {
1148 int trgQuality = m_objTrgSummary->getTimQuality();
1149 if (trgQuality == 1)
1150 if (m_clusterTimeCoarseGroupIdU != nullptr) m_clusterTimeCoarseGroupIdU->Fill(time, groupId);
1151 if (trgQuality == 2)
1152 if (m_clusterTimeFineGroupIdU != nullptr) m_clusterTimeFineGroupIdU->Fill(time, groupId);
1153 }
1154
1155 } else {
1156 if (m_clusterTimeGroupIdV != nullptr) m_clusterTimeGroupIdV->Fill(time, groupId);
1157 if (m_objTrgSummary.isValid()) {
1158 int trgQuality = m_objTrgSummary->getTimQuality();
1159 if (trgQuality == 1)
1160 if (m_clusterTimeCoarseGroupIdV != nullptr) m_clusterTimeCoarseGroupIdV->Fill(time, groupId);
1161 if (trgQuality == 2)
1162 if (m_clusterTimeFineGroupIdV != nullptr) m_clusterTimeFineGroupIdV->Fill(time, groupId);
1163 }
1164 }
1165 }
1166
1167 if (cluster.isUCluster()) {
1168 countsU.at(index).insert(SensorInfo.getUCellID(cluster.getPosition()));
1169 int indexChip = gTools->getSVDChipIndex(sensorID, kTRUE,
1170 (int)(SensorInfo.getUCellID(cluster.getPosition()) / gTools->getSVDChannelsPerChip()) + 1);
1171 if (m_hitMapClCountsU != nullptr) m_hitMapClCountsU->Fill(index);
1172 if (m_hitMapClCountsChip != nullptr) m_hitMapClCountsChip->Fill(indexChip);
1173 if (m_clusterChargeU[index] != nullptr) m_clusterChargeU[index]->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1174 if (m_clusterSNRU[index] != nullptr) m_clusterSNRU[index]->Fill(cluster.getSNR());
1175 if (m_clusterChargeUAll != nullptr) m_clusterChargeUAll->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1176 if (m_clusterSNRUAll != nullptr) m_clusterSNRUAll->Fill(cluster.getSNR());
1177 if (m_clusterSizeU[index] != nullptr) m_clusterSizeU[index]->Fill(cluster.getSize());
1178 if (m_clusterTimeU[index] != nullptr) m_clusterTimeU[index]->Fill(time);
1179 if (m_clusterTimeUAll != nullptr) m_clusterTimeUAll->Fill(time);
1180 if (iLayer == 3) {
1181 if (m_clusterChargeU3 != nullptr) m_clusterChargeU3->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1182 if (m_clusterSNRU3 != nullptr) m_clusterSNRU3->Fill(cluster.getSNR());
1183 if (m_clusterTimeU3 != nullptr) m_clusterTimeU3->Fill(time);
1184 if (m_3Samples) {
1185 if (nSamples == 3) {
1186 if (m_cluster3SampleTimeU3 != nullptr) m_cluster3SampleTimeU3->Fill(time);
1187 } else {
1188 if (m_cluster6SampleTimeU3 != nullptr) m_cluster6SampleTimeU3->Fill(time);
1189 }
1190 }
1191 } else {
1192 if (m_clusterChargeU456 != nullptr) m_clusterChargeU456->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1193 if (m_clusterSNRU456 != nullptr) m_clusterSNRU456->Fill(cluster.getSNR());
1194 if (m_clusterTimeU456 != nullptr) m_clusterTimeU456->Fill(time);
1195 if (m_3Samples) {
1196 if (nSamples == 3) {
1197 if (m_cluster3SampleTimeU456 != nullptr) m_cluster3SampleTimeU456->Fill(time);
1198 } else {
1199 if (m_cluster6SampleTimeU456 != nullptr) m_cluster6SampleTimeU456->Fill(time);
1200 }
1201 }
1202 }
1203
1204 if (m_ShowAllHistos == 1)
1205 if (m_hitMapUCl[index] != nullptr) m_hitMapUCl[index]->Fill(SensorInfo.getUCellID(cluster.getPosition()));
1206
1207 // groupId for U side
1208 if (groupId == 0 || groupId == 1 || groupId == 2 || groupId == 3) {
1209 if (iLayer == 3) {
1210 if (m_clusterChargeGroupIDsL3U != nullptr) m_clusterChargeGroupIDsL3U->Fill(cluster.getCharge() /
1211 1000.0); // in kelectrons
1212 if (m_clusterSNRGroupIDsL3U != nullptr) m_clusterSNRGroupIDsL3U->Fill(cluster.getSNR());
1213 if (m_clusterTimeGroupIDsL3U != nullptr) m_clusterTimeGroupIDsL3U->Fill(time);
1214 } else {
1215 if (m_clusterChargeGroupIDsL456U != nullptr) m_clusterChargeGroupIDsL456U->Fill(cluster.getCharge() /
1216 1000.0); // in kelectrons
1217 if (m_clusterSNRGroupIDsL456U != nullptr) m_clusterSNRGroupIDsL456U->Fill(cluster.getSNR());
1218 if (m_clusterTimeGroupIDsL456U != nullptr) m_clusterTimeGroupIDsL456U->Fill(time);
1219 }
1220
1221 for (const SVDShaperDigit& digitIn : cluster.getRelationsTo<SVDShaperDigit>(m_storeSVDShaperDigitsName)) {
1222 if (m_stripCountSignalGroupIDsU != nullptr) m_stripCountSignalGroupIDsU[index]->Fill(digitIn.getCellID());
1223 }
1224 }
1225 } else {
1226 countsV.at(index).insert(SensorInfo.getVCellID(cluster.getPosition()));
1227 int indexChip = gTools->getSVDChipIndex(sensorID, kFALSE,
1228 (int)(SensorInfo.getVCellID(cluster.getPosition()) / gTools->getSVDChannelsPerChip()) + 1);
1229 if (m_hitMapClCountsV != nullptr) m_hitMapClCountsV->Fill(index);
1230 if (m_hitMapClCountsChip != nullptr) m_hitMapClCountsChip->Fill(indexChip);
1231 if (m_clusterChargeV[index] != nullptr) m_clusterChargeV[index]->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1232 if (m_clusterSNRV[index] != nullptr) m_clusterSNRV[index]->Fill(cluster.getSNR());
1233 if (m_clusterChargeVAll != nullptr) m_clusterChargeVAll->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1234 if (m_clusterSNRVAll != nullptr) m_clusterSNRVAll->Fill(cluster.getSNR());
1235 if (m_clusterSizeV[index] != nullptr) m_clusterSizeV[index]->Fill(cluster.getSize());
1236 if (m_clusterTimeV[index] != nullptr) m_clusterTimeV[index]->Fill(time);
1237 if (m_clusterTimeVAll != nullptr) m_clusterTimeVAll->Fill(time);
1238 if (iLayer == 3) {
1239 if (m_clusterChargeV3 != nullptr) m_clusterChargeV3->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1240 if (m_clusterSNRV3 != nullptr) m_clusterSNRV3->Fill(cluster.getSNR());
1241 if (m_clusterTimeV3 != nullptr) m_clusterTimeV3->Fill(time);
1242 if (m_3Samples) {
1243 if (nSamples == 3) {
1244 if (m_cluster3SampleTimeV3 != nullptr) m_cluster3SampleTimeV3->Fill(time);
1245 } else {
1246 if (m_cluster6SampleTimeV3 != nullptr) m_cluster6SampleTimeV3->Fill(time);
1247 }
1248 }
1249 } else {
1250 if (m_clusterChargeV456 != nullptr) m_clusterChargeV456->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1251 if (m_clusterSNRV456 != nullptr) m_clusterSNRV456->Fill(cluster.getSNR());
1252 if (m_clusterTimeV456 != nullptr) m_clusterTimeV456->Fill(time);
1253 if (m_3Samples) {
1254 if (nSamples == 3) {
1255 if (m_cluster3SampleTimeV456 != nullptr) m_cluster3SampleTimeV456->Fill(time);
1256 } else {
1257 if (m_cluster6SampleTimeV456 != nullptr) m_cluster6SampleTimeV456->Fill(time);
1258 }
1259 }
1260 }
1261 if (m_ShowAllHistos == 1)
1262 if (m_hitMapVCl[index] != nullptr) m_hitMapVCl[index]->Fill(SensorInfo.getVCellID(cluster.getPosition()));
1263
1264 // groupId for V side
1265 if (groupId == 0 || groupId == 1 || groupId == 2 || groupId == 3) {
1266 if (iLayer == 3) {
1267 if (m_clusterChargeGroupIDsL3V != nullptr) m_clusterChargeGroupIDsL3V->Fill(cluster.getCharge() /
1268 1000.0); // in kelectrons
1269 if (m_clusterSNRGroupIDsL3V != nullptr) m_clusterSNRGroupIDsL3V->Fill(cluster.getSNR());
1270 if (m_clusterTimeGroupIDsL3V != nullptr) m_clusterTimeGroupIDsL3V->Fill(time);
1271 } else {
1272 if (m_clusterChargeGroupIDsL456V != nullptr) m_clusterChargeGroupIDsL456V->Fill(cluster.getCharge() /
1273 1000.0); // in kelectrons
1274 if (m_clusterSNRGroupIDsL456V != nullptr) m_clusterSNRGroupIDsL456V->Fill(cluster.getSNR());
1275 if (m_clusterTimeGroupIDsL456V != nullptr) m_clusterTimeGroupIDsL456V->Fill(time);
1276 }
1277 for (const SVDShaperDigit& digitIn : cluster.getRelationsTo<SVDShaperDigit>(m_storeSVDShaperDigitsName)) {
1278 if (m_stripCountSignalGroupIDsV != nullptr) m_stripCountSignalGroupIDsV[index]->Fill(digitIn.getCellID());
1279 }
1280 }
1281 }
1282 }
1283 if (m_additionalPlots) {
1284 for (int i = 0; i < nSVDSensors; i++) {
1285 if ((m_clustersU[i] != nullptr) && (countsU[i].size() > 0))
1286 m_clustersU[i]->Fill(countsU[i].size());
1287 if ((m_clustersV[i] != nullptr) && (countsV[i].size() > 0))
1288 m_clustersV[i]->Fill(countsV[i].size());
1289 }
1290 }
1291}
1292
1293
1295{
1296 // m_histoList->Delete();
1297 delete m_histoList;
1298
1299}
HistoModule()
Constructor.
Definition HistoModule.h:32
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
TH1F ** m_hitMapUCl
Hitmaps clusters for u.
TH1F ** m_clustersV
number of v clusters per event
TH1F * m_clusterSNRVAll
v SNR of clusters for all sensors
TH1F ** m_strip3SampleCountV
v strip count for 3 samples
TH1F * m_clusterTimeV456
v Time of clusters for layer 4,5,6 sensors
bool m_useParamFromDB
if true read back from DB configuration parameters
TH1F * m_clusterSNRUAll
u SNR of clusters for all sensors
TH1F * m_clusterChargeU3
u charge of clusters for layer 3 sensors
void initialize() override final
Module function initialize.
TH2F * m_clusterTimeGroupIdV
time group id for V side
TH1F * m_clusterSNRV3
v SNR of clusters for layer 3 sensors
TH1F * m_hitMapCountsV
Hitmaps v of Digits.
TH2F ** m_hitMapU
Hitmaps pixels for u.
TH1F ** m_onlineZSstrip6sampleCountU
u strip count (online Zero Suppression) for 6 samples
std::string m_storeNoZSSVDShaperDigitsName
not zero-suppressed SVDShaperDigits StoreArray name
bool m_skipRejectedEvents
if true skip events rejected by HLT
TH1F * m_clusterTimeGroupIDsL456V
v Time group id of clusters for layer 4,5,6 sensors
TH1F * m_clusterSNRGroupIDsL456U
u SNR group id of clusters for layer 4,5,6 sensors
TH1F * m_stripMaxBinU6
u MaxBin of strips for layer 6 sensors (offline Zero Suppression)
TH1F * m_clusterTimeUAll
u time of clusters for all sensors
TH1F ** m_onlineZSstrip3SampleCountV
v strip count (online Zero Suppression for 3 samples
TH1F * m_clusterTimeGroupIDsL456U
u Time group id of clusters for layer 4,5,6 sensors
TH1F * m_hitMapClCountsU
Hitmaps u of Clusters.
TH2F * m_clusterTimeFineGroupIdV
time group id for V side for fine trigger
float m_CutSVDCharge
cut for accepting strips to hitmap histogram default = 0 ADU
TH1F * m_cluster6SampleTimeU3
u Time of clusters for layer 3 sensors for 6 samples
StoreObjPtr< SVDEventInfo > m_svdEventInfo
SVDEventInfo data object.
TH1F * m_clusterChargeGroupIDsL3V
v charge group id of clusters for layer 3 sensors
TH1F * m_hitMapCountsU
Hitmaps u of Digits.
TH1F ** m_clusterSNRV
v SNR of clusters per sensor
TH1F ** m_clusterChargeV
v charge of clusters
TH1F * m_cluster3SampleTimeU3
u Time of clusters for layer 3 sensors for 3 samples
TH1F ** m_stripSignalU
u charge of strips
TH1F * m_clusterChargeUAll
u charge of clusters for all sensors
TH1F * m_clusterSNRGroupIDsL3U
u SNR group id of clusters for layer 3 sensors
TH1F * m_cluster3SampleTimeU456
u Time of clusters for layer 4,5,6 sensors for 3 samples
TH1F ** m_stripCountSignalGroupIDsV
V strip count for cluster time group Id = 0.
TH1F * m_clusterChargeU456
u charge of clusters for layer 4,5,6 sensors
void defineHisto() override final
Histogram definitions such as TH1(), TH2(), TNtuple(), TTree()....
TH1F * m_cluster3SampleTimeV456
v Time of clusters for layer 4,5,6 sensors for 3 samples
TH1F * m_clusterChargeGroupIDsL456U
u charge group id of clusters for layer 4,5,6 sensors
TH1F * m_clusterTimeV3
v Time of clusters for layer 3 sensors
DBObjPtr< SVDDQMPlotsConfiguration > m_svdPlotsConfig
SVD DQM plots configuration.
TH1F ** m_clusterSNRU
u SNR of clusters per sensor
TH1F ** m_hitMapVCl
Hitmaps clusters for v.
TH1F ** m_strip3SampleCountU
u strip count for 3 samples
void terminate() override final
Module function terminate.
TH1F * m_stripMaxBinV3
v MaxBin of strips for layer 3 sensors (offline Zero Suppression)
TH1F * m_clusterTimeVAll
v time of clusters for all sensors
TH2F * m_clusterTimeCoarseGroupIdU
time group id for U side for coarse trigger
void event() override final
Module function event.
TH1F * m_clusterTimeGroupIDsL3U
u Time group id of clusters for layer 3 sensors
TH1F ** m_onlineZSstripCountV
v strip count (online Zero Suppression
TH1F ** m_stripSignalV
v charge of strips
StoreObjPtr< TRGSummary > m_objTrgSummary
Trigger Summary data object.
std::string m_storeSVDShaperDigitsName
SVDShaperDigits StoreArray name.
TH1F * m_clusterSNRGroupIDsL456V
v SNR group id of clusters for layer 4,5,6 sensors
TH1F * m_clusterChargeGroupIDsL456V
v charge group id of clusters for layer 4,5,6 sensors
std::string m_histogramDirectoryName
Name of the histogram directory in ROOT file.
TH1F * m_clusterChargeVAll
v charge of clusters for all sensors
TH1F ** m_stripCountSignalGroupIDsU
U strip count for cluster time group Id = 0.
TH1F * m_clusterSNRU3
u SNR of clusters for layer 3 sensors
TH1F * m_clusterSNRGroupIDsL3V
v SNR group id of clusters for layer 3 sensors
TH1F * m_clusterSNRV456
v SNR of clusters for layer 4,5,6 sensors
TH1F * m_stripMaxBinUAll
u MaxBin of strips for all sensors (offline Zero Suppression)
bool m_3Samples
if true enable 3 samples histograms analysis
TList * m_histoList
list of cumulative histograms
TH1F ** m_clusterChargeU
u charge of clusters
TH1F * m_hitMapCountsChip
Hitmaps of digits on chips.
TH1F * m_cluster3SampleTimeV3
v Time of clusters for layer 3 sensors for 3 samples
TH1F * m_clusterChargeV3
v charge of clusters for layer 3 sensors
TH2F ** m_hitMapV
Hitmaps pixels for v.
TH1F * m_stripMaxBinV6
v MaxBin of strips for layer 6 sensors (offline Zero Suppression)
TH1F ** m_strip6SampleCountV
v strip count for 3 samples
TH1F * m_cluster6SampleTimeV456
v Time of clusters for layer 4,5,6 sensors for 6 samples
TH1F ** m_firedU
Fired u strips per event.
TH1F * m_clusterTimeU3
u Time of clusters for layer 3 sensors
TH1F * m_cluster6SampleTimeV3
v Time of clusters for layer 3 sensors for 6 samples
TH1F * m_clusterSNRU456
u SNR of clusters for layer 4,5,6 sensors
TH1F * m_clusterChargeGroupIDsL3U
u charge group id of clusters for layer 3 sensors
void beginRun() override final
Module function beginRun.
TH1F ** m_onlineZSstripCountU
u strip count (online Zero Suppression)
int m_ShowAllHistos
Flag to show all histos in DQM, default = 0 (do not show)
bool m_additionalPlots
additional plots flag
TH1F * m_stripMaxBinU3
u MaxBin of strips for layer 3 sensors (offline Zero Suppression)
bool m_desynchSVDTime
if TRUE: svdTime back in SVD time reference
TH1F * m_clusterTimeGroupIDsL3V
v Time group id of clusters for layer 3 sensors
TH1F * m_stripMaxBinVAll
v MaxBin of strips for all sensors (offline Zero Suppression)
TH1F * m_hitMapClCountsChip
Hitmaps of clusters on chips.
TH1F ** m_strip6SampleCountU
u strip count for 6 samples
TH1F ** m_onlineZSstrip3SampleCountU
u strip count (online Zero Suppression) for 3 samples
TH1F ** m_onlineZSstrip6sampleCountV
v strip count (online Zero Suppression for 6 samples
StoreObjPtr< SoftwareTriggerResult > m_resultStoreObjectPointer
Store Object for reading the trigger decision.
float m_CutSVDClusterCharge
cut for accepting clusters to hitmap histogram, default = 0 ke-
TH2F * m_clusterTimeGroupIdU
time group id for U side
std::string m_storeSVDClustersName
SVDClusters StoreArray name.
TH1F * m_clusterTimeU456
u Time of clusters for layer 4,5,6 sensors
TH2F * m_clusterTimeCoarseGroupIdV
time group id for V side for coarse trigger
TH1F ** m_firedV
Fired v strips per event.
TH1F * m_clusterChargeV456
v charge of clusters for layer 4,5,6 sensors
TH1F * m_hitMapClCountsV
Hitmaps v of Clusters.
TH1F ** m_clustersU
number of u clusters per event
TH2F * m_clusterTimeFineGroupIdU
time group id for U side for fine trigger
TH1F * m_cluster6SampleTimeU456
u Time of clusters for layer 4,5,6 sensors for 6 samples
The SVD ShaperDigit class.
static const std::size_t c_nAPVSamples
Number of APV samples stored.
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
static bool getFinalTriggerDecision(const SoftwareTriggerResult &result, bool forgetTotalResult=false)
Calculate the final cut decision using all "total_results" of all sub triggers in the software trigge...
const std::string & getName() const
Return name under which the object is saved in the DataStore.
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.
Accessor to arrays stored in the data store.
Definition StoreArray.h:113
bool isValid() const
Check whether the array was registered.
Definition StoreArray.h:289
Type-safe access to single objects in the data store.
Definition StoreObjPtr.h:96
const SensorInfoBase & getSensorInfo(Belle2::VxdID id) const
Return a reference to the SensorInfo of a given SensorID.
Definition GeoCache.cc:67
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition GeoCache.cc:214
const GeoTools * getGeoTools()
Return a raw pointer to a GeoTools object.
Definition GeoCache.h:141
unsigned short getNumberOfSVDSensors() const
Get number of SVD sensors.
Definition GeoTools.h:138
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:32
baseType getLayerNumber() const
Get the layer id.
Definition VxdID.h:95
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:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
Abstract base class for different kinds of events.
STL namespace.