9 #include "svd/modules/svdDQM/SVDDQMExpressRecoModule.h"
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>
16 #include <svd/dataobjects/SVDShaperDigit.h>
17 #include <svd/dataobjects/SVDCluster.h>
19 #include <vxd/geometry/SensorInfoBase.h>
20 #include <vxd/geometry/GeoTools.h>
22 #include <boost/format.hpp>
24 #include "TDirectory.h"
29 using namespace SoftwareTrigger;
44 setDescription(
"Original SVD DQM module for ExpressReco.");
46 setPropertyFlags(c_ParallelProcessingCertified);
47 addParam(
"offlineZSShaperDigits", m_storeSVDShaperDigitsName,
"ShaperDigits StoreArray name - usually ZS5 strips.",
48 std::string(
"SVDShaperDigitsZS5"));
49 addParam(
"ShaperDigits", m_storeNoZSSVDShaperDigitsName,
"not zero-suppressed ShaperDigits StoreArray name.",
50 std::string(
"SVDShaperDigits"));
51 addParam(
"Clusters", m_storeSVDClustersName,
"Cluster StoreArray name.",
52 std::string(
"SVDClusters"));
53 addParam(
"skipHLTRejectedEvents", m_skipRejectedEvents,
"If True, skip events rejected by HLT.",
bool(
true));
54 addParam(
"ShowAllHistos", m_ShowAllHistos,
"Flag to show all histos in DQM, default = 0.",
int(0));
55 addParam(
"desynchronizeSVDTime", m_desynchSVDTime,
56 "if True, svd time back in SVD time reference.",
bool(
false));
57 addParam(
"CutSVDCharge", m_CutSVDCharge,
58 "minimum charge (ADC) to fill the strip-hitmap histogram.",
float(0));
59 addParam(
"CutSVDClusterCharge", m_CutSVDClusterCharge,
60 "minimum charge (in e-) to fill the cluster-hitmap histogram.",
float(0));
61 addParam(
"histogramDirectoryName", m_histogramDirectoryName,
"Name of the directory where histograms will be placed.",
62 std::string(
"SVDExpReco"));
64 m_histoList =
new TList();
68 SVDDQMExpressRecoModule::~SVDDQMExpressRecoModule()
76 void SVDDQMExpressRecoModule::defineHisto()
78 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
79 if (gTools->getNumberOfLayers() == 0) {
80 B2FATAL(
"Missing geometry for VXD, check steering file.");
82 if (gTools->getNumberOfSVDLayers() == 0) {
83 B2WARNING(
"Missing geometry for SVD, SVD-DQM is skipped.");
88 TDirectory* oldDir = gDirectory;
89 if (m_histogramDirectoryName !=
"") {
90 oldDir->mkdir(m_histogramDirectoryName.c_str());
91 oldDir->cd(m_histogramDirectoryName.c_str());
95 int nSVDSensors = gTools->getNumberOfSVDSensors();
96 int nSVDChips = gTools->getTotalSVDChips();
99 m_nEvents =
new TH1F(
"SVDDQM_nEvents",
"SVD Number of Events", 1, -0.5, 0.5);
100 m_nEvents->GetYaxis()->SetTitle(
"N events");
101 m_histoList->Add(m_nEvents);
105 m_hitMapCountsU =
new TH1F(
"SVDDQM_StripCountsU",
"SVD Integrated Number of ZS5 Fired U-Strips per sensor",
106 nSVDSensors, 0, nSVDSensors);
107 m_hitMapCountsU->GetXaxis()->SetTitle(
"Sensor ID");
108 m_hitMapCountsU->GetYaxis()->SetTitle(
"counts");
109 m_histoList->Add(m_hitMapCountsU);
110 m_hitMapCountsV =
new TH1F(
"SVDDQM_StripCountsV",
"SVD Integrated Number of ZS5 Fired V-Strips per sensor",
111 nSVDSensors, 0, nSVDSensors);
112 m_hitMapCountsV->GetXaxis()->SetTitle(
"Sensor ID");
113 m_hitMapCountsV->GetYaxis()->SetTitle(
"counts");
114 m_histoList->Add(m_hitMapCountsV);
115 m_hitMapClCountsU =
new TH1F(
"SVDDQM_ClusterCountsU",
"SVD Integrated Number of U-Clusters per sensor",
116 nSVDSensors, 0, nSVDSensors);
117 m_hitMapClCountsU->GetXaxis()->SetTitle(
"Sensor ID");
118 m_hitMapClCountsU->GetYaxis()->SetTitle(
"counts");
119 m_histoList->Add(m_hitMapClCountsU);
120 m_hitMapClCountsV =
new TH1F(
"SVDDQM_ClusterCountsV",
"SVD Integrated Number of V-Clusters per sensor",
121 nSVDSensors, 0, nSVDSensors);
122 m_hitMapClCountsV->GetXaxis()->SetTitle(
"Sensor ID");
123 m_hitMapClCountsV->GetYaxis()->SetTitle(
"counts");
124 m_histoList->Add(m_hitMapClCountsV);
125 for (
int i = 0; i < nSVDSensors; i++) {
126 VxdID id = gTools->getSensorIDFromSVDIndex(i);
128 int iLadder =
id.getLadderNumber();
129 int iSensor =
id.getSensorNumber();
130 TString AxisTicks = Form(
"%i_%i_%i", iLayer, iLadder, iSensor);
131 m_hitMapCountsU->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
132 m_hitMapCountsV->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
133 m_hitMapClCountsU->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
134 m_hitMapClCountsV->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
138 m_hitMapCountsChip =
new TH1F(
"SVDDQM_StripCountsChip",
"SVD Integrated Number of ZS5 Fired Strips per chip",
139 nSVDChips, 0, nSVDChips);
140 m_hitMapCountsChip->GetXaxis()->SetTitle(
"Chip ID");
141 m_hitMapCountsChip->GetYaxis()->SetTitle(
"counts");
142 m_histoList->Add(m_hitMapCountsChip);
143 m_hitMapClCountsChip =
new TH1F(
"SVDDQM_ClusterCountsChip",
"SVD Integrated Number of Clusters per chip",
144 nSVDChips, 0, nSVDChips);
145 m_hitMapClCountsChip->GetXaxis()->SetTitle(
"Chip ID");
146 m_hitMapClCountsChip->GetYaxis()->SetTitle(
"counts");
147 m_histoList->Add(m_hitMapClCountsChip);
149 m_firedU =
new TH1F*[nSVDSensors];
150 m_firedV =
new TH1F*[nSVDSensors];
151 m_clustersU =
new TH1F*[nSVDSensors];
152 m_clustersV =
new TH1F*[nSVDSensors];
155 m_clusterChargeU =
new TH1F*[nSVDSensors];
156 m_clusterChargeV =
new TH1F*[nSVDSensors];
157 m_clusterSNRU =
new TH1F*[nSVDSensors];
158 m_clusterSNRV =
new TH1F*[nSVDSensors];
159 m_stripSignalU =
new TH1F*[nSVDSensors];
160 m_stripSignalV =
new TH1F*[nSVDSensors];
161 m_stripCountU =
new TH1F*[nSVDSensors];
162 m_stripCountV =
new TH1F*[nSVDSensors];
163 m_onlineZSstripCountU =
new TH1F*[nSVDSensors];
164 m_onlineZSstripCountV =
new TH1F*[nSVDSensors];
165 m_clusterSizeU =
new TH1F*[nSVDSensors];
166 m_clusterSizeV =
new TH1F*[nSVDSensors];
167 m_clusterTimeU =
new TH1F*[nSVDSensors];
168 m_clusterTimeV =
new TH1F*[nSVDSensors];
171 float ChargeMax = 80;
175 float TimeMin = -150;
181 TString refFrame =
"in FTSW reference";
182 if (m_desynchSVDTime)
183 refFrame =
"in SVD reference";
189 string name = str(format(
"SVDDQM_ClusterChargeUAll"));
190 string title = str(format(
"SVD U-Cluster Charge for all sensors"));
191 m_clusterChargeUAll =
new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
192 m_clusterChargeUAll->GetXaxis()->SetTitle(
"cluster charge [ke-]");
193 m_clusterChargeUAll->GetYaxis()->SetTitle(
"count");
194 m_histoList->Add(m_clusterChargeUAll);
195 name = str(format(
"SVDDQM_ClusterChargeVAll"));
196 title = str(format(
"SVD V-Cluster Charge for all sensors"));
197 m_clusterChargeVAll =
new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
198 m_clusterChargeVAll->GetXaxis()->SetTitle(
"cluster charge [ke-]");
199 m_clusterChargeVAll->GetYaxis()->SetTitle(
"count");
200 m_histoList->Add(m_clusterChargeVAll);
204 name = str(format(
"SVDDQM_ClusterChargeU3"));
205 title = str(format(
"SVD U-Cluster Charge for layer 3 sensors"));
206 m_clusterChargeU3 =
new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
207 m_clusterChargeU3->GetXaxis()->SetTitle(
"cluster charge [ke-]");
208 m_clusterChargeU3->GetYaxis()->SetTitle(
"count");
209 m_histoList->Add(m_clusterChargeU3);
210 name = str(format(
"SVDDQM_ClusterChargeV3"));
211 title = str(format(
"SVD V-Cluster Charge for layer 3 sensors"));
212 m_clusterChargeV3 =
new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
213 m_clusterChargeV3->GetXaxis()->SetTitle(
"cluster charge [ke-]");
214 m_clusterChargeV3->GetYaxis()->SetTitle(
"count");
215 m_histoList->Add(m_clusterChargeV3);
217 name = str(format(
"SVDDQM_ClusterChargeU456"));
218 title = str(format(
"SVD U-Cluster Charge for layers 4,5,6 sensors"));
219 m_clusterChargeU456 =
new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
220 m_clusterChargeU456->GetXaxis()->SetTitle(
"cluster charge [ke-]");
221 m_clusterChargeU456->GetYaxis()->SetTitle(
"count");
222 m_histoList->Add(m_clusterChargeU456);
224 name = str(format(
"SVDDQM_ClusterChargeV456"));
225 title = str(format(
"SVD V-Cluster Charge for layers 4,5,6 sensors"));
226 m_clusterChargeV456 =
new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
227 m_clusterChargeV456->GetXaxis()->SetTitle(
"cluster charge [ke-]");
228 m_clusterChargeV456->GetYaxis()->SetTitle(
"count");
229 m_histoList->Add(m_clusterChargeV456);
234 name = str(format(
"SVDDQM_ClusterSNRUAll"));
235 title = str(format(
"SVD U-Cluster SNR for all sensors"));
236 m_clusterSNRUAll =
new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
237 m_clusterSNRUAll->GetXaxis()->SetTitle(
"cluster SNR");
238 m_clusterSNRUAll->GetYaxis()->SetTitle(
"count");
239 m_histoList->Add(m_clusterSNRUAll);
240 name = str(format(
"SVDDQM_ClusterSNRVAll"));
241 title = str(format(
"SVD V-Cluster SNR for all sensors"));
242 m_clusterSNRVAll =
new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
243 m_clusterSNRVAll->GetXaxis()->SetTitle(
"cluster SNR");
244 m_clusterSNRVAll->GetYaxis()->SetTitle(
"count");
245 m_histoList->Add(m_clusterSNRVAll);
249 name = str(format(
"SVDDQM_ClusterSNRU3"));
250 title = str(format(
"SVD U-Cluster SNR for layer 3 sensors"));
251 m_clusterSNRU3 =
new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
252 m_clusterSNRU3->GetXaxis()->SetTitle(
"cluster SNR");
253 m_clusterSNRU3->GetYaxis()->SetTitle(
"count");
254 m_histoList->Add(m_clusterSNRU3);
255 name = str(format(
"SVDDQM_ClusterSNRV3"));
256 title = str(format(
"SVD V-Cluster SNR for layer 3 sensors"));
257 m_clusterSNRV3 =
new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
258 m_clusterSNRV3->GetXaxis()->SetTitle(
"cluster SNR");
259 m_clusterSNRV3->GetYaxis()->SetTitle(
"count");
260 m_histoList->Add(m_clusterSNRV3);
262 name = str(format(
"SVDDQM_ClusterSNRU456"));
263 title = str(format(
"SVD U-Cluster SNR for layers 4,5,6 sensors"));
264 m_clusterSNRU456 =
new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
265 m_clusterSNRU456->GetXaxis()->SetTitle(
"cluster SNR");
266 m_clusterSNRU456->GetYaxis()->SetTitle(
"count");
267 m_histoList->Add(m_clusterSNRU456);
268 name = str(format(
"SVDDQM_ClusterSNRV456"));
269 title = str(format(
"SVD V-Cluster SNR for layers 4,5,6 sensors"));
270 m_clusterSNRV456 =
new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
271 m_clusterSNRV456->GetXaxis()->SetTitle(
"cluster SNR");
272 m_clusterSNRV456->GetYaxis()->SetTitle(
"count");
273 m_histoList->Add(m_clusterSNRV456);
277 TString Name =
"SVDDQM_ClusterTimeUAll";
278 TString Title = Form(
"SVD U-Cluster Time %s for all sensors", refFrame.Data());
279 m_clusterTimeUAll =
new TH1F(Name.Data(), Title.Data(), TimeBins, TimeMin, TimeMax);
280 m_clusterTimeUAll->GetXaxis()->SetTitle(
"cluster time (ns)");
281 m_clusterTimeUAll->GetYaxis()->SetTitle(
"count");
282 m_histoList->Add(m_clusterTimeUAll);
283 Name =
"SVDDQM_ClusterTimeVAll";
284 Title = Form(
"SVD V-Cluster Time %s for all sensors", refFrame.Data());
285 m_clusterTimeVAll =
new TH1F(Name.Data(), Title.Data(), TimeBins, TimeMin, TimeMax);
286 m_clusterTimeVAll->GetXaxis()->SetTitle(
"cluster time (ns)");
287 m_clusterTimeVAll->GetYaxis()->SetTitle(
"count");
288 m_histoList->Add(m_clusterTimeVAll);
292 Name =
"SVDDQM_ClusterTimeU3";
293 Title = Form(
"SVD U-Cluster Time %s for layer 3 sensors", refFrame.Data());
294 m_clusterTimeU3 =
new TH1F(Name.Data(), Title.Data(), TimeBins, TimeMin, TimeMax);
295 m_clusterTimeU3->GetXaxis()->SetTitle(
"cluster time (ns)");
296 m_clusterTimeU3->GetYaxis()->SetTitle(
"count");
297 m_histoList->Add(m_clusterTimeU3);
298 name = str(format(
"SVDDQM_ClusterTimeV3"));
299 Title = Form(
"SVD V-Cluster Time %s for layer 3 sensors", refFrame.Data());
300 m_clusterTimeV3 =
new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
301 m_clusterTimeV3->GetXaxis()->SetTitle(
"cluster time (ns)");
302 m_clusterTimeV3->GetYaxis()->SetTitle(
"count");
303 m_histoList->Add(m_clusterTimeV3);
305 name = str(format(
"SVDDQM_ClusterTimeU456"));
306 Title = Form(
"SVD U-Cluster Time %s for layers 4,5,6 sensors", refFrame.Data());
307 m_clusterTimeU456 =
new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
308 m_clusterTimeU456->GetXaxis()->SetTitle(
"cluster time (ns)");
309 m_clusterTimeU456->GetYaxis()->SetTitle(
"count");
310 m_histoList->Add(m_clusterTimeU456);
311 name = str(format(
"SVDDQM_ClusterTimeV456"));
312 Title = Form(
"SVD V-Cluster Time %s for layers 4,5,6 sensors", refFrame.Data());
313 m_clusterTimeV456 =
new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
314 m_clusterTimeV456->GetXaxis()->SetTitle(
"cluster time (ns)");
315 m_clusterTimeV456->GetYaxis()->SetTitle(
"count");
316 m_histoList->Add(m_clusterTimeV456);
321 name = str(format(
"SVDDQM_StripMaxBinUAll"));
322 title = str(format(
"SVD U-Strip MaxBin for all sensors"));
323 m_stripMaxBinUAll =
new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
324 m_stripMaxBinUAll->GetXaxis()->SetTitle(
"max bin");
325 m_stripMaxBinUAll->GetYaxis()->SetTitle(
"count");
326 m_histoList->Add(m_stripMaxBinUAll);
327 name = str(format(
"SVDDQM_StripMaxBinVAll"));
328 title = str(format(
"SVD V-Strip MaxBin for all sensors"));
329 m_stripMaxBinVAll =
new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
330 m_stripMaxBinVAll->GetXaxis()->SetTitle(
"max bin");
331 m_stripMaxBinVAll->GetYaxis()->SetTitle(
"count");
332 m_histoList->Add(m_stripMaxBinVAll);
334 name = str(format(
"SVDDQM_StripMaxBinU3"));
335 title = str(format(
"SVD U-Strip MaxBin for layer 3 sensors"));
336 m_stripMaxBinU3 =
new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
337 m_stripMaxBinU3->GetXaxis()->SetTitle(
"max bin");
338 m_stripMaxBinU3->GetYaxis()->SetTitle(
"count");
339 m_histoList->Add(m_stripMaxBinU3);
340 name = str(format(
"SVDDQM_StripMaxBinV3"));
341 title = str(format(
"SVD V-Strip MaxBin for layer 3 sensors"));
342 m_stripMaxBinV3 =
new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
343 m_stripMaxBinV3->GetXaxis()->SetTitle(
"max bin");
344 m_stripMaxBinV3->GetYaxis()->SetTitle(
"count");
345 m_histoList->Add(m_stripMaxBinV3);
347 name = str(format(
"SVDDQM_StripMaxBinU6"));
348 title = str(format(
"SVD U-Strip MaxBin for layer 6 sensors"));
349 m_stripMaxBinU6 =
new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
350 m_stripMaxBinU6->GetXaxis()->SetTitle(
"max bin");
351 m_stripMaxBinU6->GetYaxis()->SetTitle(
"count");
352 m_histoList->Add(m_stripMaxBinU6);
353 name = str(format(
"SVDDQM_StripMaxBinV6"));
354 title = str(format(
"SVD V-Strip MaxBin for layer 6 sensors"));
355 m_stripMaxBinV6 =
new TH1F(name.c_str(), title.c_str(), MaxBinBins, 0, MaxBinMax);
356 m_stripMaxBinV6->GetXaxis()->SetTitle(
"max bin");
357 m_stripMaxBinV6->GetYaxis()->SetTitle(
"count");
358 m_histoList->Add(m_stripMaxBinV6);
360 for (
int i = 0; i < nSVDSensors; i++) {
361 VxdID id = gTools->getSensorIDFromSVDIndex(i);
363 int iLadder =
id.getLadderNumber();
364 int iSensor =
id.getSensorNumber();
365 VxdID sensorID(iLayer, iLadder, iSensor);
367 string sensorDescr = str(format(
"%1%_%2%_%3%") % iLayer % iLadder % iSensor);
371 name = str(format(
"SVDDQM_%1%_FiredU") % sensorDescr);
372 title = str(format(
"SVD Sensor %1% Number of Fired U-Strips") % sensorDescr);
373 m_firedU[i] =
new TH1F(name.c_str(), title.c_str(), 50, 0, 50);
374 m_firedU[i]->GetXaxis()->SetTitle(
"# fired strips");
375 m_firedU[i]->GetYaxis()->SetTitle(
"count");
376 m_histoList->Add(m_firedU[i]);
377 name = str(format(
"SVDDQM_%1%_FiredV") % sensorDescr);
378 title = str(format(
"SVD Sensor %1% Number of Fired V-Strips") % sensorDescr);
379 m_firedV[i] =
new TH1F(name.c_str(), title.c_str(), 50, 0, 50);
380 m_firedV[i]->GetXaxis()->SetTitle(
"# fired strips");
381 m_firedV[i]->GetYaxis()->SetTitle(
"count");
382 m_histoList->Add(m_firedV[i]);
386 name = str(format(
"SVDDQM_%1%_ClustersU") % sensorDescr);
387 title = str(format(
"SVD Sensor %1% Number of U-Clusters") % sensorDescr);
388 m_clustersU[i] =
new TH1F(name.c_str(), title.c_str(), 20, 0, 20);
389 m_clustersU[i]->GetXaxis()->SetTitle(
"# clusters");
390 m_clustersU[i]->GetYaxis()->SetTitle(
"count");
391 m_histoList->Add(m_clustersU[i]);
392 name = str(format(
"SVDDQM_%1%_ClustersV") % sensorDescr);
393 title = str(format(
"SVD Sensor %1% Number of V-Clusters") % sensorDescr);
394 m_clustersV[i] =
new TH1F(name.c_str(), title.c_str(), 20, 0, 20);
395 m_clustersV[i]->GetXaxis()->SetTitle(
"# clusters");
396 m_clustersV[i]->GetYaxis()->SetTitle(
"count");
397 m_histoList->Add(m_clustersV[i]);
401 name = str(format(
"SVDDQM_%1%_ClusterChargeU") % sensorDescr);
402 title = str(format(
"SVD Sensor %1% U-Cluster Charge") % sensorDescr);
403 m_clusterChargeU[i] =
new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
404 m_clusterChargeU[i]->GetXaxis()->SetTitle(
"cluster charge [ke-]");
405 m_clusterChargeU[i]->GetYaxis()->SetTitle(
"count");
406 m_histoList->Add(m_clusterChargeU[i]);
407 name = str(format(
"SVDDQM_%1%_ClusterChargeV") % sensorDescr);
408 title = str(format(
"SVD Sensor %1% V-Cluster Charge") % sensorDescr);
409 m_clusterChargeV[i] =
new TH1F(name.c_str(), title.c_str(), ChargeBins, 0, ChargeMax);
410 m_clusterChargeV[i]->GetXaxis()->SetTitle(
"cluster charge [ke-]");
411 m_clusterChargeV[i]->GetYaxis()->SetTitle(
"count");
412 m_histoList->Add(m_clusterChargeV[i]);
416 name = str(format(
"SVDDQM_%1%_ClusterSNRU") % sensorDescr);
417 title = str(format(
"SVD Sensor %1% U-Cluster SNR") % sensorDescr);
418 m_clusterSNRU[i] =
new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
419 m_clusterSNRU[i]->GetXaxis()->SetTitle(
"cluster SNR");
420 m_clusterSNRU[i]->GetYaxis()->SetTitle(
"count");
421 m_histoList->Add(m_clusterSNRU[i]);
422 name = str(format(
"SVDDQM_%1%_ClusterSNRV") % sensorDescr);
423 title = str(format(
"SVD Sensor %1% V-Cluster SNR") % sensorDescr);
424 m_clusterSNRV[i] =
new TH1F(name.c_str(), title.c_str(), SNRBins, 0, SNRMax);
425 m_clusterSNRV[i]->GetXaxis()->SetTitle(
"cluster SNR");
426 m_clusterSNRV[i]->GetYaxis()->SetTitle(
"count");
427 m_histoList->Add(m_clusterSNRV[i]);
431 name = str(format(
"SVDDQM_%1%_ADCStripU") % sensorDescr);
432 title = str(format(
"SVD Sensor %1% U-Strip signal in ADC Counts, all 6 APV samples") % sensorDescr);
433 m_stripSignalU[i] =
new TH1F(name.c_str(), title.c_str(), 256, -0.5, 255.5);
434 m_stripSignalU[i]->GetXaxis()->SetTitle(
"signal ADC");
435 m_stripSignalU[i]->GetYaxis()->SetTitle(
"count");
436 m_histoList->Add(m_stripSignalU[i]);
437 name = str(format(
"SVDDQM_%1%_ADCStripV") % sensorDescr);
438 title = str(format(
"SVD Sensor %1% V-Strip signal in ADC Counts, all 6 APV samples") % sensorDescr);
439 m_stripSignalV[i] =
new TH1F(name.c_str(), title.c_str(), 256, -0.5, 255.5);
440 m_stripSignalV[i]->GetXaxis()->SetTitle(
"signal ADC");
441 m_stripSignalV[i]->GetYaxis()->SetTitle(
"count");
442 m_histoList->Add(m_stripSignalV[i]);
446 name = str(format(
"SVDDQM_%1%_StripCountU") % sensorDescr);
447 title = str(format(
"SVD Sensor %1% Integrated Number of ZS5 Fired U-Strip vs Strip Number") % sensorDescr);
448 m_stripCountU[i] =
new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
449 m_stripCountU[i]->GetXaxis()->SetTitle(
"cellID");
450 m_stripCountU[i]->GetYaxis()->SetTitle(
"count");
451 m_histoList->Add(m_stripCountU[i]);
452 name = str(format(
"SVDDQM_%1%_StripCountV") % sensorDescr);
453 title = str(format(
"SVD Sensor %1% Integrated Number of ZS5 Fired V-Strip vs Strip Number") % sensorDescr);
454 m_stripCountV[i] =
new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
455 m_stripCountV[i]->GetXaxis()->SetTitle(
"cellID");
456 m_stripCountV[i]->GetYaxis()->SetTitle(
"count");
457 m_histoList->Add(m_stripCountV[i]);
461 name = str(format(
"SVDDQM_%1%_OnlineZSStripCountU") % sensorDescr);
462 title = str(format(
"SVD Sensor %1% Integrated Number of online-ZS Fired U-Strip vs Strip Number") % sensorDescr);
463 m_onlineZSstripCountU[i] =
new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
464 m_onlineZSstripCountU[i]->GetXaxis()->SetTitle(
"cellID");
465 m_onlineZSstripCountU[i]->GetYaxis()->SetTitle(
"count");
466 m_histoList->Add(m_onlineZSstripCountU[i]);
467 name = str(format(
"SVDDQM_%1%_OnlineZSStripCountV") % sensorDescr);
468 title = str(format(
"SVD Sensor %1% Integrated Number of online-ZS Fired V-Strip vs Strip Number") % sensorDescr);
469 m_onlineZSstripCountV[i] =
new TH1F(name.c_str(), title.c_str(), 768, -0.5, 767.5);
470 m_onlineZSstripCountV[i]->GetXaxis()->SetTitle(
"cellID");
471 m_onlineZSstripCountV[i]->GetYaxis()->SetTitle(
"count");
472 m_histoList->Add(m_onlineZSstripCountV[i]);
476 name = str(format(
"SVDDQM_%1%_ClusterSizeU") % sensorDescr);
477 title = str(format(
"SVD Sensor %1% U-Cluster Size") % sensorDescr);
478 m_clusterSizeU[i] =
new TH1F(name.c_str(), title.c_str(), 9, 1, 10);
479 m_clusterSizeU[i]->GetXaxis()->SetTitle(
"cluster size");
480 m_clusterSizeU[i]->GetYaxis()->SetTitle(
"count");
481 m_histoList->Add(m_clusterSizeU[i]);
482 name = str(format(
"SVDDQM_%1%_ClusterSizeV") % sensorDescr);
483 title = str(format(
"SVD Sensor %1% V-Cluster Size") % sensorDescr);
484 m_clusterSizeV[i] =
new TH1F(name.c_str(), title.c_str(), 9, 1, 10);
485 m_clusterSizeV[i]->GetXaxis()->SetTitle(
"cluster size");
486 m_clusterSizeV[i]->GetYaxis()->SetTitle(
"count");
487 m_histoList->Add(m_clusterSizeV[i]);
491 name = str(format(
"SVDDQM_%1%_ClusterTimeU") % sensorDescr);
492 Title = Form(
"SVD Sensor %s U-Cluster Time %s", sensorDescr.c_str(), refFrame.Data());
493 m_clusterTimeU[i] =
new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
494 m_clusterTimeU[i]->GetXaxis()->SetTitle(
"cluster time (ns)");
495 m_clusterTimeU[i]->GetYaxis()->SetTitle(
"count");
496 m_histoList->Add(m_clusterTimeU[i]);
497 name = str(format(
"SVDDQM_%1%_ClusterTimeV") % sensorDescr);
498 Title = Form(
"SVD Sensor %s V-Cluster Time %s", sensorDescr.c_str(), refFrame.Data());
499 m_clusterTimeV[i] =
new TH1F(name.c_str(), Title.Data(), TimeBins, TimeMin, TimeMax);
500 m_clusterTimeV[i]->GetXaxis()->SetTitle(
"cluster time (ns)");
501 m_clusterTimeV[i]->GetYaxis()->SetTitle(
"count");
502 m_histoList->Add(m_clusterTimeV[i]);
505 for (
int i = 0; i < nSVDChips; i++) {
506 VxdID id = gTools->getChipIDFromSVDIndex(i);
508 int iLadder =
id.getLadderNumber();
509 int iSensor =
id.getSensorNumber();
510 int iChip = gTools->getSVDChipNumber(
id);
511 int IsU = gTools->isSVDSideU(
id);
512 TString AxisTicks = Form(
"%i_%i_%i_u%i", iLayer, iLadder, iSensor, iChip);
514 AxisTicks = Form(
"%i_%i_%i_v%i", iLayer, iLadder, iSensor, iChip);
515 m_hitMapCountsChip->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
516 m_hitMapClCountsChip->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
525 if (m_ShowAllHistos == 1) {
526 TDirectory* dirShowAll =
nullptr;
527 dirShowAll = oldDir->mkdir(
"SVDDQMAll");
530 m_hitMapU =
new TH2F*[nSVDSensors];
531 m_hitMapV =
new TH2F*[nSVDSensors];
532 m_hitMapUCl =
new TH1F*[nSVDSensors];
533 m_hitMapVCl =
new TH1F*[nSVDSensors];
534 for (
int i = 0; i < nSVDSensors; i++) {
535 VxdID id = gTools->getSensorIDFromSVDIndex(i);
537 int iLadder =
id.getLadderNumber();
538 int iSensor =
id.getSensorNumber();
539 VxdID sensorID(iLayer, iLadder, iSensor);
541 string sensorDescr = str(format(
"%1%_%2%_%3%") % iLayer % iLadder % iSensor);
545 name = str(format(
"SVD_%1%_StripHitmapU") % sensorDescr);
546 title = str(format(
"SVD Sensor %1% Strip Hitmap in U") % sensorDescr);
548 m_hitMapU[i] =
new TH2F(name.c_str(), title.c_str(), nStrips, 0, nStrips, SVDShaperDigit::c_nAPVSamples, 0,
549 SVDShaperDigit::c_nAPVSamples);
550 m_hitMapU[i]->GetXaxis()->SetTitle(
"u position [pitch units]");
551 m_hitMapU[i]->GetYaxis()->SetTitle(
"timebin [time units]");
552 m_hitMapU[i]->GetZaxis()->SetTitle(
"hits");
553 m_histoList->Add(m_hitMapU[i]);
554 name = str(format(
"SVD_%1%_StripHitmapV") % sensorDescr);
555 title = str(format(
"SVD Sensor %1% Strip Hitmap in V") % sensorDescr);
557 m_hitMapV[i] =
new TH2F(name.c_str(), title.c_str(), nStrips, 0, nStrips, SVDShaperDigit::c_nAPVSamples, 0,
558 SVDShaperDigit::c_nAPVSamples);
559 m_hitMapV[i]->GetXaxis()->SetTitle(
"v position [pitch units]");
560 m_hitMapV[i]->GetYaxis()->SetTitle(
"timebin [time units]");
561 m_hitMapV[i]->GetZaxis()->SetTitle(
"hits");
562 m_histoList->Add(m_hitMapV[i]);
566 name = str(format(
"SVD_%1%_HitmapClstU") % sensorDescr);
567 title = str(format(
"SVD Sensor %1% Hitmap Clusters in U") % sensorDescr);
569 m_hitMapUCl[i] =
new TH1F(name.c_str(), title.c_str(), nStrips, 0, nStrips);
570 m_hitMapUCl[i]->GetXaxis()->SetTitle(
"u position [pitch units]");
571 m_hitMapUCl[i]->GetYaxis()->SetTitle(
"hits");
572 m_histoList->Add(m_hitMapUCl[i]);
573 name = str(format(
"SVD_%1%_HitmapClstV") % sensorDescr);
574 title = str(format(
"SVD Sensor %1% Hitmap Clusters in V") % sensorDescr);
576 m_hitMapVCl[i] =
new TH1F(name.c_str(), title.c_str(), nStrips, 0, nStrips);
577 m_hitMapVCl[i]->GetXaxis()->SetTitle(
"v position [pitch units]");
578 m_hitMapVCl[i]->GetYaxis()->SetTitle(
"hits");
579 m_histoList->Add(m_hitMapVCl[i]);
587 void SVDDQMExpressRecoModule::initialize()
592 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
593 if (gTools->getNumberOfSVDLayers() != 0) {
601 m_svdEventInfo.isOptional();
605 m_storeSVDShaperDigitsName = storeSVDShaperDigits.
getName();
609 void SVDDQMExpressRecoModule::beginRun()
611 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
612 if (gTools->getNumberOfSVDLayers() == 0)
return;
616 TIter nextH(m_histoList);
617 while ((obj = nextH()))
618 if (obj->InheritsFrom(
"TH1")) {
619 ((TH1F*)obj)->Reset();
623 void SVDDQMExpressRecoModule::event()
628 if (m_skipRejectedEvents && (m_resultStoreObjectPointer.isValid())) {
629 const bool eventAccepted = FinalTriggerDecisionCalculator::getFinalTriggerDecision(*m_resultStoreObjectPointer);
630 if (!eventAccepted)
return;
635 m_expNumber = evtMetaData->getExperiment();
636 m_runNumber = evtMetaData->getRun();
638 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
639 if (gTools->getNumberOfSVDLayers() == 0)
return;
642 TString runID = TString::Format(
" ~ Exp%d Run%d", m_expNumber, m_runNumber);
644 TIter nextH(m_histoList);
645 while ((obj = nextH()))
646 if (obj->InheritsFrom(
"TH1")) {
647 if (((TString)obj->GetTitle()).Contains(runID) ==
false) {
648 ((TH1F*)obj)->SetTitle(obj->GetTitle() + runID);
660 int firstSVDLayer = gTools->getFirstSVDLayer();
661 int lastSVDLayer = gTools->getLastSVDLayer();
662 int nSVDSensors = gTools->getNumberOfSVDSensors();
665 vector< set<int> > uStrips(nSVDSensors);
666 vector< set<int> > vStrips(nSVDSensors);
668 int iLayer = digitIn.getSensorID().getLayerNumber();
669 if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer))
continue;
670 int iLadder = digitIn.getSensorID().getLadderNumber();
671 int iSensor = digitIn.getSensorID().getSensorNumber();
672 VxdID sensorID(iLayer, iLadder, iSensor);
673 int index = gTools->getSVDSensorIndex(sensorID);
675 if (digitIn.isUStrip()) {
680 if (m_stripCountU[index] !=
nullptr) m_stripCountU[index]->Fill(digitIn.getCellID());
683 if (m_stripMaxBinUAll !=
nullptr) m_stripMaxBinUAll->Fill(digitIn.getMaxTimeBin());
685 if (m_stripMaxBinU3 !=
nullptr) m_stripMaxBinU3->Fill(digitIn.getMaxTimeBin());
687 if (m_stripMaxBinU6 !=
nullptr) m_stripMaxBinU6->Fill(digitIn.getMaxTimeBin());
689 uStrips.at(index).insert(digitIn.getCellID());
690 int Chip = (int)(digitIn.getCellID() / gTools->getSVDChannelsPerChip()) + 1;
691 int indexChip = gTools->getSVDChipIndex(sensorID, kTRUE, Chip);
695 for (
size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
696 if (m_stripSignalU[index] !=
nullptr) m_stripSignalU[index]->Fill(samples[i]);
697 if (samples[i] > m_CutSVDCharge) {
699 if (m_ShowAllHistos == 1) {
700 if (m_hitMapU[index] !=
nullptr) m_hitMapU[index]->Fill(digitIn.getCellID(), i);
705 if (m_hitMapCountsU !=
nullptr) m_hitMapCountsU->Fill(index);
706 if (m_hitMapCountsChip !=
nullptr) m_hitMapCountsChip->Fill(indexChip);
710 if (m_stripCountV[index] !=
nullptr) m_stripCountV[index]->Fill(digitIn.getCellID());
713 if (m_stripMaxBinVAll !=
nullptr) m_stripMaxBinVAll->Fill(digitIn.getMaxTimeBin());
716 if (m_stripMaxBinV3 !=
nullptr) m_stripMaxBinV3->Fill(digitIn.getMaxTimeBin());
718 if (m_stripMaxBinV6 !=
nullptr) m_stripMaxBinV6->Fill(digitIn.getMaxTimeBin());
720 vStrips.at(index).insert(digitIn.getCellID());
721 int Chip = (int)(digitIn.getCellID() / gTools->getSVDChannelsPerChip()) + 1;
722 int indexChip = gTools->getSVDChipIndex(sensorID, kFALSE, Chip);
726 for (
size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
727 if (m_stripSignalV[index] !=
nullptr) m_stripSignalV[index]->Fill(samples[i]);
728 if (samples[i] > m_CutSVDCharge) {
730 if (m_ShowAllHistos == 1) {
731 if (m_hitMapV[index] !=
nullptr) m_hitMapV[index]->Fill(digitIn.getCellID(), i);
736 if (m_hitMapCountsV !=
nullptr) m_hitMapCountsV->Fill(index);
737 if (m_hitMapCountsChip !=
nullptr) m_hitMapCountsChip->Fill(indexChip);
741 for (
int i = 0; i < nSVDSensors; i++) {
742 if ((m_firedU[i] !=
nullptr) && (uStrips[i].size() > 0))
743 m_firedU[i]->Fill(uStrips[i].size());
744 if ((m_firedV[i] !=
nullptr) && (vStrips[i].size() > 0))
745 m_firedV[i]->Fill(vStrips[i].size());
749 if (storeNoZSSVDShaperDigits.
isValid())
751 int iLayer = digitIn.getSensorID().getLayerNumber();
752 if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer))
continue;
753 int iLadder = digitIn.getSensorID().getLadderNumber();
754 int iSensor = digitIn.getSensorID().getSensorNumber();
755 VxdID sensorID(iLayer, iLadder, iSensor);
756 int index = gTools->getSVDSensorIndex(sensorID);
758 if (digitIn.isUStrip()) {
759 if (m_onlineZSstripCountU[index] !=
nullptr) m_onlineZSstripCountU[index]->Fill(digitIn.getCellID());
761 if (m_onlineZSstripCountV[index] !=
nullptr) m_onlineZSstripCountV[index]->Fill(digitIn.getCellID());
765 vector< set<int> > countsU(nSVDSensors);
766 vector< set<int> > countsV(nSVDSensors);
768 for (
const SVDCluster& cluster : storeSVDClusters) {
769 if (cluster.getCharge() < m_CutSVDClusterCharge)
continue;
770 int iLayer = cluster.getSensorID().getLayerNumber();
771 if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer))
continue;
772 int iLadder = cluster.getSensorID().getLadderNumber();
773 int iSensor = cluster.getSensorID().getSensorNumber();
774 VxdID sensorID(iLayer, iLadder, iSensor);
775 int index = gTools->getSVDSensorIndex(sensorID);
778 float time = cluster.getClsTime();
779 if (m_desynchSVDTime && m_svdEventInfo.isValid())
780 time = time - m_svdEventInfo->getSVD2FTSWTimeShift(cluster.getFirstFrame());
782 if (cluster.isUCluster()) {
784 int indexChip = gTools->getSVDChipIndex(sensorID, kTRUE,
786 if (m_hitMapClCountsU !=
nullptr) m_hitMapClCountsU->Fill(index);
787 if (m_hitMapClCountsChip !=
nullptr) m_hitMapClCountsChip->Fill(indexChip);
788 if (m_clusterChargeU[index] !=
nullptr) m_clusterChargeU[index]->Fill(cluster.getCharge() / 1000.0);
789 if (m_clusterSNRU[index] !=
nullptr) m_clusterSNRU[index]->Fill(cluster.getSNR());
790 if (m_clusterChargeUAll !=
nullptr) m_clusterChargeUAll->Fill(cluster.getCharge() / 1000.0);
791 if (m_clusterSNRUAll !=
nullptr) m_clusterSNRUAll->Fill(cluster.getSNR());
792 if (m_clusterSizeU[index] !=
nullptr) m_clusterSizeU[index]->Fill(cluster.getSize());
793 if (m_clusterTimeU[index] !=
nullptr) m_clusterTimeU[index]->Fill(time);
794 if (m_clusterTimeUAll !=
nullptr) m_clusterTimeUAll->Fill(time);
796 if (m_clusterChargeU3 !=
nullptr) m_clusterChargeU3->Fill(cluster.getCharge() / 1000.0);
797 if (m_clusterSNRU3 !=
nullptr) m_clusterSNRU3->Fill(cluster.getSNR());
798 if (m_clusterTimeU3 !=
nullptr) m_clusterTimeU3->Fill(time);
800 if (m_clusterChargeU456 !=
nullptr) m_clusterChargeU456->Fill(cluster.getCharge() / 1000.0);
801 if (m_clusterSNRU456 !=
nullptr) m_clusterSNRU456->Fill(cluster.getSNR());
802 if (m_clusterTimeU456 !=
nullptr) m_clusterTimeU456->Fill(time);
805 if (m_ShowAllHistos == 1)
806 if (m_hitMapUCl[index] !=
nullptr) m_hitMapUCl[index]->Fill(
SensorInfo.
getUCellID(cluster.getPosition()));
809 int indexChip = gTools->getSVDChipIndex(sensorID, kFALSE,
811 if (m_hitMapClCountsV !=
nullptr) m_hitMapClCountsV->Fill(index);
812 if (m_hitMapClCountsChip !=
nullptr) m_hitMapClCountsChip->Fill(indexChip);
813 if (m_clusterChargeV[index] !=
nullptr) m_clusterChargeV[index]->Fill(cluster.getCharge() / 1000.0);
814 if (m_clusterSNRV[index] !=
nullptr) m_clusterSNRV[index]->Fill(cluster.getSNR());
815 if (m_clusterChargeVAll !=
nullptr) m_clusterChargeVAll->Fill(cluster.getCharge() / 1000.0);
816 if (m_clusterSNRVAll !=
nullptr) m_clusterSNRVAll->Fill(cluster.getSNR());
817 if (m_clusterSizeV[index] !=
nullptr) m_clusterSizeV[index]->Fill(cluster.getSize());
818 if (m_clusterTimeV[index] !=
nullptr) m_clusterTimeV[index]->Fill(time);
819 if (m_clusterTimeVAll !=
nullptr) m_clusterTimeVAll->Fill(time);
821 if (m_clusterChargeV3 !=
nullptr) m_clusterChargeV3->Fill(cluster.getCharge() / 1000.0);
822 if (m_clusterSNRV3 !=
nullptr) m_clusterSNRV3->Fill(cluster.getSNR());
823 if (m_clusterTimeV3 !=
nullptr) m_clusterTimeV3->Fill(time);
825 if (m_clusterChargeV456 !=
nullptr) m_clusterChargeV456->Fill(cluster.getCharge() / 1000.0);
826 if (m_clusterSNRV456 !=
nullptr) m_clusterSNRV456->Fill(cluster.getSNR());
827 if (m_clusterTimeV456 !=
nullptr) m_clusterTimeV456->Fill(time);
829 if (m_ShowAllHistos == 1)
830 if (m_hitMapVCl[index] !=
nullptr) m_hitMapVCl[index]->Fill(
SensorInfo.
getVCellID(cluster.getPosition()));
834 for (
int i = 0; i < nSVDSensors; i++) {
835 if ((m_clustersU[i] !=
nullptr) && (countsU[i].size() > 0))
836 m_clustersU[i]->Fill(countsU[i].size());
837 if ((m_clustersV[i] !=
nullptr) && (countsV[i].size() > 0))
838 m_clustersV[i]->Fill(countsV[i].size());
843 void SVDDQMExpressRecoModule::terminate()
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
Specific implementation of SensorInfo for PXD Sensors which provides additional pixel specific inform...
The SVD Cluster class This class stores all information about reconstructed SVD clusters.
SVD DQM Module for Express Reco.
The SVD ShaperDigit class.
std::array< APVFloatSampleType, c_nAPVSamples > APVFloatSamples
array of APVFloatSampleType objects
Specific implementation of SensorInfo for SVD Sensors which provides additional sensor specific infor...
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.
const std::string & getName() const
Return name under which the object is saved in the DataStore.
Accessor to arrays stored in the data store.
bool isValid() const
Check wether the array was registered.
int getEntries() const
Get the number of objects in the array.
Type-safe access to single objects in the data store.
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.
baseType getLayerNumber() const
Get the layer id.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.