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 SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::getInstance().getSensorInfo(sensorID));
603 string sensorDescr = str(format("%1%_%2%_%3%") % iLayer % iLadder % iSensor);
604
605 if (m_additionalPlots) {
606 //----------------------------------------------------------------
607 // Number of fired strips per sensor
608 //----------------------------------------------------------------
609 name = str(format("SVDDQM_%1%_FiredU") % sensorDescr);
610 title = str(format("SVD Sensor %1% Number of Fired U-Strips") % sensorDescr);
611 m_firedU[i] = new TH1F(name.c_str(), title.c_str(), 50, 0, 50);
612 m_firedU[i]->GetXaxis()->SetTitle("# fired strips");
613 m_firedU[i]->GetYaxis()->SetTitle("count");
614 m_histoList->Add(m_firedU[i]);
615 name = str(format("SVDDQM_%1%_FiredV") % sensorDescr);
616 title = str(format("SVD Sensor %1% Number of Fired V-Strips") % sensorDescr);
617 m_firedV[i] = new TH1F(name.c_str(), title.c_str(), 50, 0, 50);
618 m_firedV[i]->GetXaxis()->SetTitle("# fired strips");
619 m_firedV[i]->GetYaxis()->SetTitle("count");
620 m_histoList->Add(m_firedV[i]);
621 //----------------------------------------------------------------
622 // Number of clusters per sensor
623 //----------------------------------------------------------------
624 name = str(format("SVDDQM_%1%_ClustersU") % sensorDescr);
625 title = str(format("SVD Sensor %1% Number of U-Clusters") % sensorDescr);
626 m_clustersU[i] = new TH1F(name.c_str(), title.c_str(), 20, 0, 20);
627 m_clustersU[i]->GetXaxis()->SetTitle("# clusters");
628 m_clustersU[i]->GetYaxis()->SetTitle("count");
629 m_histoList->Add(m_clustersU[i]);
630 name = str(format("SVDDQM_%1%_ClustersV") % sensorDescr);
631 title = str(format("SVD Sensor %1% Number of V-Clusters") % sensorDescr);
632 m_clustersV[i] = new TH1F(name.c_str(), title.c_str(), 20, 0, 20);
633 m_clustersV[i]->GetXaxis()->SetTitle("# clusters");
634 m_clustersV[i]->GetYaxis()->SetTitle("count");
635 m_histoList->Add(m_clustersV[i]);
636 //----------------------------------------------------------------
637 // Charge of strips
638 //----------------------------------------------------------------
639 name = str(format("SVDDQM_%1%_ADCStripU") % sensorDescr);
640 title = str(format("SVD Sensor %1% U-Strip signal in ADC Counts, all 6 APV samples") % sensorDescr);
641 m_stripSignalU[i] = new TH1F(name.c_str(), title.c_str(), 256, -0.5, 255.5);
642 m_stripSignalU[i]->GetXaxis()->SetTitle("signal ADC");
643 m_stripSignalU[i]->GetYaxis()->SetTitle("count");
645 name = str(format("SVDDQM_%1%_ADCStripV") % sensorDescr);
646 title = str(format("SVD Sensor %1% V-Strip signal in ADC Counts, all 6 APV samples") % sensorDescr);
647 m_stripSignalV[i] = new TH1F(name.c_str(), title.c_str(), 256, -0.5, 255.5);
648 m_stripSignalV[i]->GetXaxis()->SetTitle("signal ADC");
649 m_stripSignalV[i]->GetYaxis()->SetTitle("count");
651 }
652
653 //----------------------------------------------------------------
654 // Charge of clusters
655 //----------------------------------------------------------------
656 name = str(format("SVDDQM_%1%_ClusterChargeU") % sensorDescr);
657 title = str(format("SVD Sensor %1% U-Cluster Charge") % sensorDescr);
658 m_clusterChargeU[i] = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
659 m_clusterChargeU[i]->GetXaxis()->SetTitle("cluster charge [ke-]");
660 m_clusterChargeU[i]->GetYaxis()->SetTitle("count");
662 name = str(format("SVDDQM_%1%_ClusterChargeV") % sensorDescr);
663 title = str(format("SVD Sensor %1% V-Cluster Charge") % sensorDescr);
664 m_clusterChargeV[i] = new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
665 m_clusterChargeV[i]->GetXaxis()->SetTitle("cluster charge [ke-]");
666 m_clusterChargeV[i]->GetYaxis()->SetTitle("count");
668 //----------------------------------------------------------------
669 // SNR of clusters
670 //----------------------------------------------------------------
671 name = str(format("SVDDQM_%1%_ClusterSNRU") % sensorDescr);
672 title = str(format("SVD Sensor %1% U-Cluster SNR") % sensorDescr);
673 m_clusterSNRU[i] = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
674 m_clusterSNRU[i]->GetXaxis()->SetTitle("cluster SNR");
675 m_clusterSNRU[i]->GetYaxis()->SetTitle("count");
676 m_histoList->Add(m_clusterSNRU[i]);
677 name = str(format("SVDDQM_%1%_ClusterSNRV") % sensorDescr);
678 title = str(format("SVD Sensor %1% V-Cluster SNR") % sensorDescr);
679 m_clusterSNRV[i] = new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
680 m_clusterSNRV[i]->GetXaxis()->SetTitle("cluster SNR");
681 m_clusterSNRV[i]->GetYaxis()->SetTitle("count");
682 m_histoList->Add(m_clusterSNRV[i]);
683
684 //----------------------------------------------------------------
685 // Strips Counts
686 //----------------------------------------------------------------
687 name = str(format("SVDDQM_%1%_StripCountU") % sensorDescr);
688 title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired U-Strip vs Strip Number") % sensorDescr);
689 m_stripCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
690 m_stripCountU[i]->GetXaxis()->SetTitle("cellID");
691 m_stripCountU[i]->GetYaxis()->SetTitle("count");
692 m_histoList->Add(m_stripCountU[i]);
693 name = str(format("SVDDQM_%1%_StripCountV") % sensorDescr);
694 title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired V-Strip vs Strip Number") % sensorDescr);
695 m_stripCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
696 m_stripCountV[i]->GetXaxis()->SetTitle("cellID");
697 m_stripCountV[i]->GetYaxis()->SetTitle("count");
698 m_histoList->Add(m_stripCountV[i]);
699 //----------------------------------------------------------------
700 // Strips Counts with online ZS
701 //----------------------------------------------------------------
702 name = str(format("SVDDQM_%1%_OnlineZSStripCountU") % sensorDescr);
703 title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired U-Strip vs Strip Number") % sensorDescr);
704 m_onlineZSstripCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
705 m_onlineZSstripCountU[i]->GetXaxis()->SetTitle("cellID");
706 m_onlineZSstripCountU[i]->GetYaxis()->SetTitle("count");
708 name = str(format("SVDDQM_%1%_OnlineZSStripCountV") % sensorDescr);
709 title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired V-Strip vs Strip Number") % sensorDescr);
710 m_onlineZSstripCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
711 m_onlineZSstripCountV[i]->GetXaxis()->SetTitle("cellID");
712 m_onlineZSstripCountV[i]->GetYaxis()->SetTitle("count");
714
715 //----------------------------------------------------------------
716 // Strips Counts for 3 samples
717 //----------------------------------------------------------------
718 if (m_3Samples) {
719 name = str(format("SVDDQM_%1%_Strip3CountU") % sensorDescr);
720 title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired U-Strip vs Strip Number for 3 samples") % sensorDescr);
721 m_strip3SampleCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
722 m_strip3SampleCountU[i]->GetXaxis()->SetTitle("cellID");
723 m_strip3SampleCountU[i]->GetYaxis()->SetTitle("count");
725 name = str(format("SVDDQM_%1%_Strip3CountV") % sensorDescr);
726 title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired V-Strip vs Strip Number for 3 samples") % sensorDescr);
727 m_strip3SampleCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
728 m_strip3SampleCountV[i]->GetXaxis()->SetTitle("cellID");
729 m_strip3SampleCountV[i]->GetYaxis()->SetTitle("count");
731
732 //----------------------------------------------------------------
733 // Strips Counts with online ZS for 3 samples
734 //----------------------------------------------------------------
735 name = str(format("SVDDQM_%1%_OnlineZSStrip3CountU") % sensorDescr);
736 title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired U-Strip vs Strip Number for 3 samples") % sensorDescr);
737 m_onlineZSstrip3SampleCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
738 m_onlineZSstrip3SampleCountU[i]->GetXaxis()->SetTitle("cellID");
739 m_onlineZSstrip3SampleCountU[i]->GetYaxis()->SetTitle("count");
741 name = str(format("SVDDQM_%1%_OnlineZSStrip3CountV") % sensorDescr);
742 title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired V-Strip vs Strip Number for 3 samples") % sensorDescr);
743 m_onlineZSstrip3SampleCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
744 m_onlineZSstrip3SampleCountV[i]->GetXaxis()->SetTitle("cellID");
745 m_onlineZSstrip3SampleCountV[i]->GetYaxis()->SetTitle("count");
747
748 //----------------------------------------------------------------
749 // Strips Counts for 6 samples
750 //----------------------------------------------------------------
751 name = str(format("SVDDQM_%1%_Strip6CountU") % sensorDescr);
752 title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired U-Strip vs Strip Number for 6 samples") % sensorDescr);
753 m_strip6SampleCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
754 m_strip6SampleCountU[i]->GetXaxis()->SetTitle("cellID");
755 m_strip6SampleCountU[i]->GetYaxis()->SetTitle("count");
757 name = str(format("SVDDQM_%1%_strip6CountV") % sensorDescr);
758 title = str(format("SVD Sensor %1% Integrated Number of ZS5 Fired V-Strip vs Strip Number for 6 samples") % sensorDescr);
759 m_strip6SampleCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
760 m_strip6SampleCountV[i]->GetXaxis()->SetTitle("cellID");
761 m_strip6SampleCountV[i]->GetYaxis()->SetTitle("count");
763 //----------------------------------------------------------------
764 // Strips Counts with online ZS for 6 samples
765 //----------------------------------------------------------------
766 name = str(format("SVDDQM_%1%_OnlineZSStrip6CountU") % sensorDescr);
767 title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired U-Strip vs Strip Number for 6 samples") % sensorDescr);
768 m_onlineZSstrip6sampleCountU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
769 m_onlineZSstrip6sampleCountU[i]->GetXaxis()->SetTitle("cellID");
770 m_onlineZSstrip6sampleCountU[i]->GetYaxis()->SetTitle("count");
772 name = str(format("SVDDQM_%1%_OnlineZSStrip6CountV") % sensorDescr);
773 title = str(format("SVD Sensor %1% Integrated Number of online-ZS Fired V-Strip vs Strip Number for 6 samples") % sensorDescr);
774 m_onlineZSstrip6sampleCountV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
775 m_onlineZSstrip6sampleCountV[i]->GetXaxis()->SetTitle("cellID");
776 m_onlineZSstrip6sampleCountV[i]->GetYaxis()->SetTitle("count");
778 }
779
780 //----------------------------------------------------------------
781 // Strips Counts for cluster time group id = 0, 1, 2, 3
782 //----------------------------------------------------------------
783 name = str(format("SVDDQM_%1%_StripCountSignalGroupIDsU") % sensorDescr);
784 title = str(format("SVD Sensor %1% Integrated NumberFired U-Strip for group Id = 0, 1, 2 & 3 vs Strip Number") % sensorDescr);
785 m_stripCountSignalGroupIDsU[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
786 m_stripCountSignalGroupIDsU[i]->GetXaxis()->SetTitle("cellID");
787 m_stripCountSignalGroupIDsU[i]->GetYaxis()->SetTitle("count");
789 name = str(format("SVDDQM_%1%_StripCountSignalGroupIDsV") % sensorDescr);
790 title = str(format("SVD Sensor %1% Integrated Number of Fired V-Strip for group Id = 0, 1, 2 & 3 vs Strip Number") % sensorDescr);
791 m_stripCountSignalGroupIDsV[i] = new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
792 m_stripCountSignalGroupIDsV[i]->GetXaxis()->SetTitle("cellID");
793 m_stripCountSignalGroupIDsV[i]->GetYaxis()->SetTitle("count");
795
796 //----------------------------------------------------------------
797 // Cluster size distribution
798 //----------------------------------------------------------------
799 name = str(format("SVDDQM_%1%_ClusterSizeU") % sensorDescr);
800 title = str(format("SVD Sensor %1% U-Cluster Size") % sensorDescr);
801 m_clusterSizeU[i] = new TH1F(name.c_str(), title.c_str(), 9, 1, 10);
802 m_clusterSizeU[i]->GetXaxis()->SetTitle("cluster size");
803 m_clusterSizeU[i]->GetYaxis()->SetTitle("count");
805 name = str(format("SVDDQM_%1%_ClusterSizeV") % sensorDescr);
806 title = str(format("SVD Sensor %1% V-Cluster Size") % sensorDescr);
807 m_clusterSizeV[i] = new TH1F(name.c_str(), title.c_str(), 9, 1, 10);
808 m_clusterSizeV[i]->GetXaxis()->SetTitle("cluster size");
809 m_clusterSizeV[i]->GetYaxis()->SetTitle("count");
811 //----------------------------------------------------------------
812 // Cluster time distribution
813 //----------------------------------------------------------------
814 name = str(format("SVDDQM_%1%_ClusterTimeU") % sensorDescr);
815 Title = Form("SVD Sensor %s U-Cluster Time %s", sensorDescr.c_str(), refFrame.Data());
816 m_clusterTimeU[i] = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
817 m_clusterTimeU[i]->GetXaxis()->SetTitle("cluster time (ns)");
818 m_clusterTimeU[i]->GetYaxis()->SetTitle("count");
820 name = str(format("SVDDQM_%1%_ClusterTimeV") % sensorDescr);
821 Title = Form("SVD Sensor %s V-Cluster Time %s", sensorDescr.c_str(), refFrame.Data());
822 m_clusterTimeV[i] = new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
823 m_clusterTimeV[i]->GetXaxis()->SetTitle("cluster time (ns)");
824 m_clusterTimeV[i]->GetYaxis()->SetTitle("count");
826 }
827
828 for (int i = 0; i < nSVDChips; i++) {
829 VxdID id = gTools->getChipIDFromSVDIndex(i);
830 int iLayer = id.getLayerNumber();
831 int iLadder = id.getLadderNumber();
832 int iSensor = id.getSensorNumber();
833 int iChip = gTools->getSVDChipNumber(id);
834 int IsU = gTools->isSVDSideU(id);
835 TString AxisTicks = Form("%i_%i_%i_u%i", iLayer, iLadder, iSensor, iChip);
836 if (!IsU)
837 AxisTicks = Form("%i_%i_%i_v%i", iLayer, iLadder, iSensor, iChip);
838 m_hitMapCountsChip->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
839 m_hitMapClCountsChip->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
840 }
841
842
843
844 //----------------------------------------------------------------
845 // Additional histograms for out of ExpressReco
846 //----------------------------------------------------------------
847
848 if (m_ShowAllHistos == 1) {
849 TDirectory* dirShowAll = nullptr;
850 dirShowAll = oldDir->mkdir("SVDDQMAll");
851 dirShowAll->cd();
852
853 m_hitMapU = new TH2F*[nSVDSensors];
854 m_hitMapV = new TH2F*[nSVDSensors];
855 m_hitMapUCl = new TH1F*[nSVDSensors];
856 m_hitMapVCl = new TH1F*[nSVDSensors];
857 for (int i = 0; i < nSVDSensors; i++) {
858 VxdID id = gTools->getSensorIDFromSVDIndex(i);
859 int iLayer = id.getLayerNumber();
860 int iLadder = id.getLadderNumber();
861 int iSensor = id.getSensorNumber();
862 VxdID sensorID(iLayer, iLadder, iSensor);
863 SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::getInstance().getSensorInfo(sensorID));
864 string sensorDescr = str(format("%1%_%2%_%3%") % iLayer % iLadder % iSensor);
865 //----------------------------------------------------------------
866 // Hitmaps: Number of strips by coordinate
867 //----------------------------------------------------------------
868 name = str(format("SVD_%1%_StripHitmapU") % sensorDescr);
869 title = str(format("SVD Sensor %1% Strip Hitmap in U") % sensorDescr);
870 int nStrips = SensorInfo.getUCells();
871 m_hitMapU[i] = new TH2F(name.c_str(), title.c_str(), nStrips, 0, nStrips, SVDShaperDigit::c_nAPVSamples, 0,
873 m_hitMapU[i]->GetXaxis()->SetTitle("u position [pitch units]");
874 m_hitMapU[i]->GetYaxis()->SetTitle("timebin [time units]");
875 m_hitMapU[i]->GetZaxis()->SetTitle("hits");
876 m_histoList->Add(m_hitMapU[i]);
877 name = str(format("SVD_%1%_StripHitmapV") % sensorDescr);
878 title = str(format("SVD Sensor %1% Strip Hitmap in V") % sensorDescr);
879 nStrips = SensorInfo.getVCells();
880 m_hitMapV[i] = new TH2F(name.c_str(), title.c_str(), nStrips, 0, nStrips, SVDShaperDigit::c_nAPVSamples, 0,
882 m_hitMapV[i]->GetXaxis()->SetTitle("v position [pitch units]");
883 m_hitMapV[i]->GetYaxis()->SetTitle("timebin [time units]");
884 m_hitMapV[i]->GetZaxis()->SetTitle("hits");
885 m_histoList->Add(m_hitMapV[i]);
886 //----------------------------------------------------------------
887 // Hitmaps: Number of clusters by coordinate
888 //----------------------------------------------------------------
889 name = str(format("SVD_%1%_HitmapClstU") % sensorDescr);
890 title = str(format("SVD Sensor %1% Hitmap Clusters in U") % sensorDescr);
891 nStrips = SensorInfo.getUCells();
892 m_hitMapUCl[i] = new TH1F(name.c_str(), title.c_str(), nStrips, 0, nStrips);
893 m_hitMapUCl[i]->GetXaxis()->SetTitle("u position [pitch units]");
894 m_hitMapUCl[i]->GetYaxis()->SetTitle("hits");
895 m_histoList->Add(m_hitMapUCl[i]);
896 name = str(format("SVD_%1%_HitmapClstV") % sensorDescr);
897 title = str(format("SVD Sensor %1% Hitmap Clusters in V") % sensorDescr);
898 nStrips = SensorInfo.getVCells();
899 m_hitMapVCl[i] = new TH1F(name.c_str(), title.c_str(), nStrips, 0, nStrips);
900 m_hitMapVCl[i]->GetXaxis()->SetTitle("v position [pitch units]");
901 m_hitMapVCl[i]->GetYaxis()->SetTitle("hits");
902 m_histoList->Add(m_hitMapVCl[i]);
903 }
904 }
905
906 oldDir->cd();
907}
908
909
911{
912 // Register histograms (calls back defineHisto)
913 REG_HISTOGRAM
914
915 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
916 if (gTools->getNumberOfSVDLayers() != 0) {
917 //Register collections
921
922 storeSVDClusters.isOptional();
923 storeSVDShaperDigits.isOptional();
924 m_svdEventInfo.isOptional();
925 storeNoZSSVDShaperDigits.isOptional();
926
927 //Store names to speed up creation later
928 m_storeSVDShaperDigitsName = storeSVDShaperDigits.getName();
929 }
930
931 m_objTrgSummary.isOptional();
932}
933
935{
936 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
937 if (gTools->getNumberOfSVDLayers() == 0) return;
938
939
940 StoreObjPtr<EventMetaData> evtMetaData;
941 m_expNumber = evtMetaData->getExperiment();
942 m_runNumber = evtMetaData->getRun();
943
944 // Add experiment and run number to the title of selected histograms (CR shifter plots)
945 TString runID = TString::Format(" ~ Exp%d Run%d", m_expNumber, m_runNumber);
946 TObject* obj;
947 TIter nextH(m_histoList);
948 while ((obj = nextH()))
949 if (obj->InheritsFrom("TH1")) {
950
951 TString tmp = (TString)obj->GetTitle();
952 Int_t pos = tmp.Last('~');
953 if (pos == -1) pos = tmp.Length() + 2;
954
955 TString title = tmp(0, pos - 2);
956 ((TH1F*)obj)->SetTitle(title + runID);
957 ((TH1F*)obj)->Reset();
958 }
959}
960
962{
963 //check HLT decision and increase number of events only if the event has been accepted
966 if (!eventAccepted) return;
967 }
968
969 int nSamples = 0;
970 if (m_svdEventInfo.isValid())
971 nSamples = m_svdEventInfo->getNSamples();
972 else
973 return;
974
975 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
976 if (gTools->getNumberOfSVDLayers() == 0) return;
977
978 const StoreArray<SVDShaperDigit> storeNoZSSVDShaperDigits(m_storeNoZSSVDShaperDigitsName);
979 const StoreArray<SVDShaperDigit> storeSVDShaperDigits(m_storeSVDShaperDigitsName);
980 const StoreArray<SVDCluster> storeSVDClusters(m_storeSVDClustersName);
981
982 if (!storeSVDShaperDigits.isValid()) {
983 B2WARNING("Missing SVDShaperDigit, SVDDQMExpressRecoModule is skipped.");
984 return;
985 }
986
987 m_nEvents->Fill(0);
988
989 int firstSVDLayer = gTools->getFirstSVDLayer();
990 int lastSVDLayer = gTools->getLastSVDLayer();
991 int nSVDSensors = gTools->getNumberOfSVDSensors();
992
993 // Fired strips offline ZS
994 vector< set<int> > uStrips(nSVDSensors); // sets to eliminate multiple samples per strip
995 vector< set<int> > vStrips(nSVDSensors);
996 for (const SVDShaperDigit& digitIn : storeSVDShaperDigits) {
997 int iLayer = digitIn.getSensorID().getLayerNumber();
998 if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer)) continue;
999 int iLadder = digitIn.getSensorID().getLadderNumber();
1000 int iSensor = digitIn.getSensorID().getSensorNumber();
1001 VxdID sensorID(iLayer, iLadder, iSensor);
1002 int index = gTools->getSVDSensorIndex(sensorID);
1003 SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::getInstance().getSensorInfo(sensorID));
1004 if (digitIn.isUStrip()) {
1005
1006 //fill strip count first
1007 if (m_stripCountU[index] != nullptr) m_stripCountU[index]->Fill(digitIn.getCellID());
1008
1009 if (m_3Samples) {
1010 if (nSamples == 3) {
1011 if (m_strip3SampleCountU[index] != nullptr) m_strip3SampleCountU[index]->Fill(digitIn.getCellID());
1012 } else {
1013 if (m_strip6SampleCountU[index] != nullptr) m_strip6SampleCountU[index]->Fill(digitIn.getCellID());
1014 }
1015 }
1016 //fill max bin
1017 if (m_stripMaxBinUAll != nullptr) m_stripMaxBinUAll->Fill(digitIn.getMaxTimeBin());
1018 if (iLayer == 3)
1019 if (m_stripMaxBinU3 != nullptr) m_stripMaxBinU3->Fill(digitIn.getMaxTimeBin());
1020 if (iLayer == 6)
1021 if (m_stripMaxBinU6 != nullptr) m_stripMaxBinU6->Fill(digitIn.getMaxTimeBin());
1022
1023 uStrips.at(index).insert(digitIn.getCellID());
1024 int Chip = (int)(digitIn.getCellID() / gTools->getSVDChannelsPerChip()) + 1;
1025 int indexChip = gTools->getSVDChipIndex(sensorID, kTRUE, Chip);
1026 // 6-to-1 relation weights are equal to digit signals, modulo rounding error
1027 SVDShaperDigit::APVFloatSamples samples = digitIn.getSamples();
1028 int isSample = 0;
1029 for (size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
1031 if (m_stripSignalU[index] != nullptr) m_stripSignalU[index]->Fill(samples[i]);
1032 if (samples[i] > m_CutSVDCharge) {
1033 isSample = 1;
1034 if (m_ShowAllHistos == 1) {
1035 if (m_hitMapU[index] != nullptr) m_hitMapU[index]->Fill(digitIn.getCellID(), i);
1036 }
1037 }
1038 }
1039 if (isSample) {
1040 if (m_hitMapCountsU != nullptr) m_hitMapCountsU->Fill(index);
1041 if (m_hitMapCountsChip != nullptr) m_hitMapCountsChip->Fill(indexChip);
1042 }
1043 } else {
1044 //fill strip count first
1045 if (m_stripCountV[index] != nullptr) m_stripCountV[index]->Fill(digitIn.getCellID());
1046
1047 if (m_3Samples) {
1048 if (nSamples == 3) {
1049 if (m_strip3SampleCountV[index] != nullptr) m_strip3SampleCountV[index]->Fill(digitIn.getCellID());
1050 } else {
1051 if (m_strip6SampleCountV[index] != nullptr) m_strip6SampleCountV[index]->Fill(digitIn.getCellID());
1052 }
1053 }
1054
1055 //fill max bin
1056 if (m_stripMaxBinVAll != nullptr) m_stripMaxBinVAll->Fill(digitIn.getMaxTimeBin());
1057
1058 if (iLayer == 3)
1059 if (m_stripMaxBinV3 != nullptr) m_stripMaxBinV3->Fill(digitIn.getMaxTimeBin());
1060 if (iLayer == 6)
1061 if (m_stripMaxBinV6 != nullptr) m_stripMaxBinV6->Fill(digitIn.getMaxTimeBin());
1062
1063 vStrips.at(index).insert(digitIn.getCellID());
1064 int Chip = (int)(digitIn.getCellID() / gTools->getSVDChannelsPerChip()) + 1;
1065 int indexChip = gTools->getSVDChipIndex(sensorID, kFALSE, Chip);
1066 // 6-to-1 relation weights are equal to digit signals, modulo rounding error
1067 SVDShaperDigit::APVFloatSamples samples = digitIn.getSamples();
1068 int isSample = 0;
1069 for (size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
1071 if (m_stripSignalV[index] != nullptr) m_stripSignalV[index]->Fill(samples[i]);
1072 if (samples[i] > m_CutSVDCharge) {
1073 isSample = 1;
1074 if (m_ShowAllHistos == 1) {
1075 if (m_hitMapV[index] != nullptr) m_hitMapV[index]->Fill(digitIn.getCellID(), i);
1076 }
1077 }
1078 }
1079 if (isSample) {
1080 if (m_hitMapCountsV != nullptr) m_hitMapCountsV->Fill(index);
1081 if (m_hitMapCountsChip != nullptr) m_hitMapCountsChip->Fill(indexChip);
1082 }
1083 }
1084 }
1085 if (m_additionalPlots) {
1086 for (int i = 0; i < nSVDSensors; i++) {
1087 if ((m_firedU[i] != nullptr) && (uStrips[i].size() > 0))
1088 m_firedU[i]->Fill(uStrips[i].size());
1089 if ((m_firedV[i] != nullptr) && (vStrips[i].size() > 0))
1090 m_firedV[i]->Fill(vStrips[i].size());
1091 }
1092 }
1093
1094 // Fired strips ONLINE ZS
1095 if (storeNoZSSVDShaperDigits.isValid())
1096 for (const SVDShaperDigit& digitIn : storeNoZSSVDShaperDigits) {
1097 int iLayer = digitIn.getSensorID().getLayerNumber();
1098 if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer)) continue;
1099 int iLadder = digitIn.getSensorID().getLadderNumber();
1100 int iSensor = digitIn.getSensorID().getSensorNumber();
1101 VxdID sensorID(iLayer, iLadder, iSensor);
1102 int index = gTools->getSVDSensorIndex(sensorID);
1103 SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::getInstance().getSensorInfo(sensorID));
1104 if (digitIn.isUStrip()) {
1105 if (m_onlineZSstripCountU[index] != nullptr) m_onlineZSstripCountU[index]->Fill(digitIn.getCellID());
1106 if (m_3Samples) {
1107 if (nSamples == 3) {
1108 if (m_onlineZSstrip3SampleCountU[index] != nullptr) m_onlineZSstrip3SampleCountU[index]->Fill(digitIn.getCellID());
1109 } else {
1110 if (m_onlineZSstrip6sampleCountU[index] != nullptr) m_onlineZSstrip6sampleCountU[index]->Fill(digitIn.getCellID());
1111 }
1112 }
1113 } else {
1114 if (m_onlineZSstripCountV[index] != nullptr) m_onlineZSstripCountV[index]->Fill(digitIn.getCellID());
1115 if (m_3Samples) {
1116 if (nSamples == 3) {
1117 if (m_onlineZSstrip3SampleCountV[index] != nullptr) m_onlineZSstrip3SampleCountV[index]->Fill(digitIn.getCellID());
1118 } else {
1119 if (m_onlineZSstrip6sampleCountV[index] != nullptr) m_onlineZSstrip6sampleCountV[index]->Fill(digitIn.getCellID());
1120 }
1121 }
1122 }
1123 }
1124
1125 vector< set<int> > countsU(nSVDSensors); // sets to eliminate multiple samples per strip
1126 vector< set<int> > countsV(nSVDSensors);
1127 // Hitmaps, Charge, Seed, Size, Time, ...
1128 for (const SVDCluster& cluster : storeSVDClusters) {
1129 if (cluster.getCharge() < m_CutSVDClusterCharge) continue;
1130 int iLayer = cluster.getSensorID().getLayerNumber();
1131 if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer)) continue;
1132 int iLadder = cluster.getSensorID().getLadderNumber();
1133 int iSensor = cluster.getSensorID().getSensorNumber();
1134 VxdID sensorID(iLayer, iLadder, iSensor);
1135 int index = gTools->getSVDSensorIndex(sensorID);
1136 SVD::SensorInfo SensorInfo = dynamic_cast<const SVD::SensorInfo&>(VXD::GeoCache::getInstance().getSensorInfo(sensorID));
1137
1138 float time = cluster.getClsTime();
1139 if (m_desynchSVDTime && m_svdEventInfo.isValid())
1140 time = time - m_svdEventInfo->getSVD2FTSWTimeShift(cluster.getFirstFrame());
1141
1142 vector<int> vec = cluster.getTimeGroupId();
1143 auto minElement = min_element(vec.begin(), vec.end());
1144 int groupId = -1;
1145 if (vec.size() > 0) {
1146 groupId = *minElement;
1147
1148 if (cluster.isUCluster()) {
1149 if (m_clusterTimeGroupIdU != nullptr) m_clusterTimeGroupIdU->Fill(time, groupId);
1150 if (m_objTrgSummary.isValid()) {
1151 int trgQuality = m_objTrgSummary->getTimQuality();
1152 if (trgQuality == 1)
1153 if (m_clusterTimeCoarseGroupIdU != nullptr) m_clusterTimeCoarseGroupIdU->Fill(time, groupId);
1154 if (trgQuality == 2)
1155 if (m_clusterTimeFineGroupIdU != nullptr) m_clusterTimeFineGroupIdU->Fill(time, groupId);
1156 }
1157
1158 } else {
1159 if (m_clusterTimeGroupIdV != nullptr) m_clusterTimeGroupIdV->Fill(time, groupId);
1160 if (m_objTrgSummary.isValid()) {
1161 int trgQuality = m_objTrgSummary->getTimQuality();
1162 if (trgQuality == 1)
1163 if (m_clusterTimeCoarseGroupIdV != nullptr) m_clusterTimeCoarseGroupIdV->Fill(time, groupId);
1164 if (trgQuality == 2)
1165 if (m_clusterTimeFineGroupIdV != nullptr) m_clusterTimeFineGroupIdV->Fill(time, groupId);
1166 }
1167 }
1168 }
1169
1170 if (cluster.isUCluster()) {
1171 countsU.at(index).insert(SensorInfo.getUCellID(cluster.getPosition()));
1172 int indexChip = gTools->getSVDChipIndex(sensorID, kTRUE,
1173 (int)(SensorInfo.getUCellID(cluster.getPosition()) / gTools->getSVDChannelsPerChip()) + 1);
1174 if (m_hitMapClCountsU != nullptr) m_hitMapClCountsU->Fill(index);
1175 if (m_hitMapClCountsChip != nullptr) m_hitMapClCountsChip->Fill(indexChip);
1176 if (m_clusterChargeU[index] != nullptr) m_clusterChargeU[index]->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1177 if (m_clusterSNRU[index] != nullptr) m_clusterSNRU[index]->Fill(cluster.getSNR());
1178 if (m_clusterChargeUAll != nullptr) m_clusterChargeUAll->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1179 if (m_clusterSNRUAll != nullptr) m_clusterSNRUAll->Fill(cluster.getSNR());
1180 if (m_clusterSizeU[index] != nullptr) m_clusterSizeU[index]->Fill(cluster.getSize());
1181 if (m_clusterTimeU[index] != nullptr) m_clusterTimeU[index]->Fill(time);
1182 if (m_clusterTimeUAll != nullptr) m_clusterTimeUAll->Fill(time);
1183 if (iLayer == 3) {
1184 if (m_clusterChargeU3 != nullptr) m_clusterChargeU3->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1185 if (m_clusterSNRU3 != nullptr) m_clusterSNRU3->Fill(cluster.getSNR());
1186 if (m_clusterTimeU3 != nullptr) m_clusterTimeU3->Fill(time);
1187 if (m_3Samples) {
1188 if (nSamples == 3) {
1189 if (m_cluster3SampleTimeU3 != nullptr) m_cluster3SampleTimeU3->Fill(time);
1190 } else {
1191 if (m_cluster6SampleTimeU3 != nullptr) m_cluster6SampleTimeU3->Fill(time);
1192 }
1193 }
1194 } else {
1195 if (m_clusterChargeU456 != nullptr) m_clusterChargeU456->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1196 if (m_clusterSNRU456 != nullptr) m_clusterSNRU456->Fill(cluster.getSNR());
1197 if (m_clusterTimeU456 != nullptr) m_clusterTimeU456->Fill(time);
1198 if (m_3Samples) {
1199 if (nSamples == 3) {
1200 if (m_cluster3SampleTimeU456 != nullptr) m_cluster3SampleTimeU456->Fill(time);
1201 } else {
1202 if (m_cluster6SampleTimeU456 != nullptr) m_cluster6SampleTimeU456->Fill(time);
1203 }
1204 }
1205 }
1206
1207 if (m_ShowAllHistos == 1)
1208 if (m_hitMapUCl[index] != nullptr) m_hitMapUCl[index]->Fill(SensorInfo.getUCellID(cluster.getPosition()));
1209
1210 // groupId for U side
1211 if (groupId == 0 || groupId == 1 || groupId == 2 || groupId == 3) {
1212 if (iLayer == 3) {
1213 if (m_clusterChargeGroupIDsL3U != nullptr) m_clusterChargeGroupIDsL3U->Fill(cluster.getCharge() /
1214 1000.0); // in kelectrons
1215 if (m_clusterSNRGroupIDsL3U != nullptr) m_clusterSNRGroupIDsL3U->Fill(cluster.getSNR());
1216 if (m_clusterTimeGroupIDsL3U != nullptr) m_clusterTimeGroupIDsL3U->Fill(time);
1217 } else {
1218 if (m_clusterChargeGroupIDsL456U != nullptr) m_clusterChargeGroupIDsL456U->Fill(cluster.getCharge() /
1219 1000.0); // in kelectrons
1220 if (m_clusterSNRGroupIDsL456U != nullptr) m_clusterSNRGroupIDsL456U->Fill(cluster.getSNR());
1221 if (m_clusterTimeGroupIDsL456U != nullptr) m_clusterTimeGroupIDsL456U->Fill(time);
1222 }
1223
1224 for (const SVDShaperDigit& digitIn : cluster.getRelationsTo<SVDShaperDigit>(m_storeSVDShaperDigitsName)) {
1225 if (m_stripCountSignalGroupIDsU != nullptr) m_stripCountSignalGroupIDsU[index]->Fill(digitIn.getCellID());
1226 }
1227 }
1228 } else {
1229 countsV.at(index).insert(SensorInfo.getVCellID(cluster.getPosition()));
1230 int indexChip = gTools->getSVDChipIndex(sensorID, kFALSE,
1231 (int)(SensorInfo.getVCellID(cluster.getPosition()) / gTools->getSVDChannelsPerChip()) + 1);
1232 if (m_hitMapClCountsV != nullptr) m_hitMapClCountsV->Fill(index);
1233 if (m_hitMapClCountsChip != nullptr) m_hitMapClCountsChip->Fill(indexChip);
1234 if (m_clusterChargeV[index] != nullptr) m_clusterChargeV[index]->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1235 if (m_clusterSNRV[index] != nullptr) m_clusterSNRV[index]->Fill(cluster.getSNR());
1236 if (m_clusterChargeVAll != nullptr) m_clusterChargeVAll->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1237 if (m_clusterSNRVAll != nullptr) m_clusterSNRVAll->Fill(cluster.getSNR());
1238 if (m_clusterSizeV[index] != nullptr) m_clusterSizeV[index]->Fill(cluster.getSize());
1239 if (m_clusterTimeV[index] != nullptr) m_clusterTimeV[index]->Fill(time);
1240 if (m_clusterTimeVAll != nullptr) m_clusterTimeVAll->Fill(time);
1241 if (iLayer == 3) {
1242 if (m_clusterChargeV3 != nullptr) m_clusterChargeV3->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1243 if (m_clusterSNRV3 != nullptr) m_clusterSNRV3->Fill(cluster.getSNR());
1244 if (m_clusterTimeV3 != nullptr) m_clusterTimeV3->Fill(time);
1245 if (m_3Samples) {
1246 if (nSamples == 3) {
1247 if (m_cluster3SampleTimeV3 != nullptr) m_cluster3SampleTimeV3->Fill(time);
1248 } else {
1249 if (m_cluster6SampleTimeV3 != nullptr) m_cluster6SampleTimeV3->Fill(time);
1250 }
1251 }
1252 } else {
1253 if (m_clusterChargeV456 != nullptr) m_clusterChargeV456->Fill(cluster.getCharge() / 1000.0); // in kelectrons
1254 if (m_clusterSNRV456 != nullptr) m_clusterSNRV456->Fill(cluster.getSNR());
1255 if (m_clusterTimeV456 != nullptr) m_clusterTimeV456->Fill(time);
1256 if (m_3Samples) {
1257 if (nSamples == 3) {
1258 if (m_cluster3SampleTimeV456 != nullptr) m_cluster3SampleTimeV456->Fill(time);
1259 } else {
1260 if (m_cluster6SampleTimeV456 != nullptr) m_cluster6SampleTimeV456->Fill(time);
1261 }
1262 }
1263 }
1264 if (m_ShowAllHistos == 1)
1265 if (m_hitMapVCl[index] != nullptr) m_hitMapVCl[index]->Fill(SensorInfo.getVCellID(cluster.getPosition()));
1266
1267 // groupId for V side
1268 if (groupId == 0 || groupId == 1 || groupId == 2 || groupId == 3) {
1269 if (iLayer == 3) {
1270 if (m_clusterChargeGroupIDsL3V != nullptr) m_clusterChargeGroupIDsL3V->Fill(cluster.getCharge() /
1271 1000.0); // in kelectrons
1272 if (m_clusterSNRGroupIDsL3V != nullptr) m_clusterSNRGroupIDsL3V->Fill(cluster.getSNR());
1273 if (m_clusterTimeGroupIDsL3V != nullptr) m_clusterTimeGroupIDsL3V->Fill(time);
1274 } else {
1275 if (m_clusterChargeGroupIDsL456V != nullptr) m_clusterChargeGroupIDsL456V->Fill(cluster.getCharge() /
1276 1000.0); // in kelectrons
1277 if (m_clusterSNRGroupIDsL456V != nullptr) m_clusterSNRGroupIDsL456V->Fill(cluster.getSNR());
1278 if (m_clusterTimeGroupIDsL456V != nullptr) m_clusterTimeGroupIDsL456V->Fill(time);
1279 }
1280 for (const SVDShaperDigit& digitIn : cluster.getRelationsTo<SVDShaperDigit>(m_storeSVDShaperDigitsName)) {
1281 if (m_stripCountSignalGroupIDsV != nullptr) m_stripCountSignalGroupIDsV[index]->Fill(digitIn.getCellID());
1282 }
1283 }
1284 }
1285 }
1286 if (m_additionalPlots) {
1287 for (int i = 0; i < nSVDSensors; i++) {
1288 if ((m_clustersU[i] != nullptr) && (countsU[i].size() > 0))
1289 m_clustersU[i]->Fill(countsU[i].size());
1290 if ((m_clustersV[i] != nullptr) && (countsV[i].size() > 0))
1291 m_clustersV[i]->Fill(countsV[i].size());
1292 }
1293 }
1294}
1295
1296
1298{
1299 // m_histoList->Delete();
1300 delete m_histoList;
1301
1302}
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:288
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.