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 skiped.");
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()
612 m_expNumber = evtMetaData->getExperiment();
613 m_runNumber = evtMetaData->getRun();
615 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
616 if (gTools->getNumberOfSVDLayers() == 0)
return;
619 TString runID = TString::Format(
" ~ Exp%d Run%d", m_expNumber, m_runNumber);
621 TIter nextH(m_histoList);
622 while ((obj = nextH()))
623 if (obj->InheritsFrom(
"TH1")) {
624 ((TH1F*)obj)->SetTitle(obj->GetTitle() + runID);
625 ((TH1F*)obj)->Reset();
629 void SVDDQMExpressRecoModule::event()
634 if (m_skipRejectedEvents && (m_resultStoreObjectPointer.isValid())) {
635 const bool eventAccepted = FinalTriggerDecisionCalculator::getFinalTriggerDecision(*m_resultStoreObjectPointer);
636 if (!eventAccepted)
return;
640 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
641 if (gTools->getNumberOfSVDLayers() == 0)
return;
652 int firstSVDLayer = gTools->getFirstSVDLayer();
653 int lastSVDLayer = gTools->getLastSVDLayer();
654 int nSVDSensors = gTools->getNumberOfSVDSensors();
657 vector< set<int> > uStrips(nSVDSensors);
658 vector< set<int> > vStrips(nSVDSensors);
660 int iLayer = digitIn.getSensorID().getLayerNumber();
661 if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer))
continue;
662 int iLadder = digitIn.getSensorID().getLadderNumber();
663 int iSensor = digitIn.getSensorID().getSensorNumber();
664 VxdID sensorID(iLayer, iLadder, iSensor);
665 int index = gTools->getSVDSensorIndex(sensorID);
667 if (digitIn.isUStrip()) {
672 if (m_stripCountU[index] !=
nullptr) m_stripCountU[index]->Fill(digitIn.getCellID());
675 if (m_stripMaxBinUAll !=
nullptr) m_stripMaxBinUAll->Fill(digitIn.getMaxTimeBin());
677 if (m_stripMaxBinU3 !=
nullptr) m_stripMaxBinU3->Fill(digitIn.getMaxTimeBin());
679 if (m_stripMaxBinU6 !=
nullptr) m_stripMaxBinU6->Fill(digitIn.getMaxTimeBin());
681 uStrips.at(index).insert(digitIn.getCellID());
682 int Chip = (int)(digitIn.getCellID() / gTools->getSVDChannelsPerChip()) + 1;
683 int indexChip = gTools->getSVDChipIndex(sensorID, kTRUE, Chip);
687 for (
size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
688 if (m_stripSignalU[index] !=
nullptr) m_stripSignalU[index]->Fill(samples[i]);
689 if (samples[i] > m_CutSVDCharge) {
691 if (m_ShowAllHistos == 1) {
692 if (m_hitMapU[index] !=
nullptr) m_hitMapU[index]->Fill(digitIn.getCellID(), i);
697 if (m_hitMapCountsU !=
nullptr) m_hitMapCountsU->Fill(index);
698 if (m_hitMapCountsChip !=
nullptr) m_hitMapCountsChip->Fill(indexChip);
702 if (m_stripCountV[index] !=
nullptr) m_stripCountV[index]->Fill(digitIn.getCellID());
705 if (m_stripMaxBinVAll !=
nullptr) m_stripMaxBinVAll->Fill(digitIn.getMaxTimeBin());
708 if (m_stripMaxBinV3 !=
nullptr) m_stripMaxBinV3->Fill(digitIn.getMaxTimeBin());
710 if (m_stripMaxBinV6 !=
nullptr) m_stripMaxBinV6->Fill(digitIn.getMaxTimeBin());
712 vStrips.at(index).insert(digitIn.getCellID());
713 int Chip = (int)(digitIn.getCellID() / gTools->getSVDChannelsPerChip()) + 1;
714 int indexChip = gTools->getSVDChipIndex(sensorID, kFALSE, Chip);
718 for (
size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
719 if (m_stripSignalV[index] !=
nullptr) m_stripSignalV[index]->Fill(samples[i]);
720 if (samples[i] > m_CutSVDCharge) {
722 if (m_ShowAllHistos == 1) {
723 if (m_hitMapV[index] !=
nullptr) m_hitMapV[index]->Fill(digitIn.getCellID(), i);
728 if (m_hitMapCountsV !=
nullptr) m_hitMapCountsV->Fill(index);
729 if (m_hitMapCountsChip !=
nullptr) m_hitMapCountsChip->Fill(indexChip);
733 for (
int i = 0; i < nSVDSensors; i++) {
734 if ((m_firedU[i] !=
nullptr) && (uStrips[i].size() > 0))
735 m_firedU[i]->Fill(uStrips[i].size());
736 if ((m_firedV[i] !=
nullptr) && (vStrips[i].size() > 0))
737 m_firedV[i]->Fill(vStrips[i].size());
741 if (storeNoZSSVDShaperDigits.
isValid())
743 int iLayer = digitIn.getSensorID().getLayerNumber();
744 if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer))
continue;
745 int iLadder = digitIn.getSensorID().getLadderNumber();
746 int iSensor = digitIn.getSensorID().getSensorNumber();
747 VxdID sensorID(iLayer, iLadder, iSensor);
748 int index = gTools->getSVDSensorIndex(sensorID);
750 if (digitIn.isUStrip()) {
751 if (m_onlineZSstripCountU[index] !=
nullptr) m_onlineZSstripCountU[index]->Fill(digitIn.getCellID());
753 if (m_onlineZSstripCountV[index] !=
nullptr) m_onlineZSstripCountV[index]->Fill(digitIn.getCellID());
757 vector< set<int> > countsU(nSVDSensors);
758 vector< set<int> > countsV(nSVDSensors);
760 for (
const SVDCluster& cluster : storeSVDClusters) {
761 if (cluster.getCharge() < m_CutSVDClusterCharge)
continue;
762 int iLayer = cluster.getSensorID().getLayerNumber();
763 if ((iLayer < firstSVDLayer) || (iLayer > lastSVDLayer))
continue;
764 int iLadder = cluster.getSensorID().getLadderNumber();
765 int iSensor = cluster.getSensorID().getSensorNumber();
766 VxdID sensorID(iLayer, iLadder, iSensor);
767 int index = gTools->getSVDSensorIndex(sensorID);
770 float time = cluster.getClsTime();
771 if (m_desynchSVDTime && m_svdEventInfo.isValid())
772 time = time - m_svdEventInfo->getSVD2FTSWTimeShift(cluster.getFirstFrame());
774 if (cluster.isUCluster()) {
776 int indexChip = gTools->getSVDChipIndex(sensorID, kTRUE,
778 if (m_hitMapClCountsU !=
nullptr) m_hitMapClCountsU->Fill(index);
779 if (m_hitMapClCountsChip !=
nullptr) m_hitMapClCountsChip->Fill(indexChip);
780 if (m_clusterChargeU[index] !=
nullptr) m_clusterChargeU[index]->Fill(cluster.getCharge() / 1000.0);
781 if (m_clusterSNRU[index] !=
nullptr) m_clusterSNRU[index]->Fill(cluster.getSNR());
782 if (m_clusterChargeUAll !=
nullptr) m_clusterChargeUAll->Fill(cluster.getCharge() / 1000.0);
783 if (m_clusterSNRUAll !=
nullptr) m_clusterSNRUAll->Fill(cluster.getSNR());
784 if (m_clusterSizeU[index] !=
nullptr) m_clusterSizeU[index]->Fill(cluster.getSize());
785 if (m_clusterTimeU[index] !=
nullptr) m_clusterTimeU[index]->Fill(time);
786 if (m_clusterTimeUAll !=
nullptr) m_clusterTimeUAll->Fill(time);
788 if (m_clusterChargeU3 !=
nullptr) m_clusterChargeU3->Fill(cluster.getCharge() / 1000.0);
789 if (m_clusterSNRU3 !=
nullptr) m_clusterSNRU3->Fill(cluster.getSNR());
790 if (m_clusterTimeU3 !=
nullptr) m_clusterTimeU3->Fill(time);
792 if (m_clusterChargeU456 !=
nullptr) m_clusterChargeU456->Fill(cluster.getCharge() / 1000.0);
793 if (m_clusterSNRU456 !=
nullptr) m_clusterSNRU456->Fill(cluster.getSNR());
794 if (m_clusterTimeU456 !=
nullptr) m_clusterTimeU456->Fill(time);
797 if (m_ShowAllHistos == 1)
798 if (m_hitMapUCl[index] !=
nullptr) m_hitMapUCl[index]->Fill(
SensorInfo.
getUCellID(cluster.getPosition()));
801 int indexChip = gTools->getSVDChipIndex(sensorID, kFALSE,
803 if (m_hitMapClCountsV !=
nullptr) m_hitMapClCountsV->Fill(index);
804 if (m_hitMapClCountsChip !=
nullptr) m_hitMapClCountsChip->Fill(indexChip);
805 if (m_clusterChargeV[index] !=
nullptr) m_clusterChargeV[index]->Fill(cluster.getCharge() / 1000.0);
806 if (m_clusterSNRV[index] !=
nullptr) m_clusterSNRV[index]->Fill(cluster.getSNR());
807 if (m_clusterChargeVAll !=
nullptr) m_clusterChargeVAll->Fill(cluster.getCharge() / 1000.0);
808 if (m_clusterSNRVAll !=
nullptr) m_clusterSNRVAll->Fill(cluster.getSNR());
809 if (m_clusterSizeV[index] !=
nullptr) m_clusterSizeV[index]->Fill(cluster.getSize());
810 if (m_clusterTimeV[index] !=
nullptr) m_clusterTimeV[index]->Fill(time);
811 if (m_clusterTimeVAll !=
nullptr) m_clusterTimeVAll->Fill(time);
813 if (m_clusterChargeV3 !=
nullptr) m_clusterChargeV3->Fill(cluster.getCharge() / 1000.0);
814 if (m_clusterSNRV3 !=
nullptr) m_clusterSNRV3->Fill(cluster.getSNR());
815 if (m_clusterTimeV3 !=
nullptr) m_clusterTimeV3->Fill(time);
817 if (m_clusterChargeV456 !=
nullptr) m_clusterChargeV456->Fill(cluster.getCharge() / 1000.0);
818 if (m_clusterSNRV456 !=
nullptr) m_clusterSNRV456->Fill(cluster.getSNR());
819 if (m_clusterTimeV456 !=
nullptr) m_clusterTimeV456->Fill(time);
821 if (m_ShowAllHistos == 1)
822 if (m_hitMapVCl[index] !=
nullptr) m_hitMapVCl[index]->Fill(
SensorInfo.
getVCellID(cluster.getPosition()));
826 for (
int i = 0; i < nSVDSensors; i++) {
827 if ((m_clustersU[i] !=
nullptr) && (countsU[i].size() > 0))
828 m_clustersU[i]->Fill(countsU[i].size());
829 if ((m_clustersV[i] !=
nullptr) && (countsV[i].size() > 0))
830 m_clustersV[i]->Fill(countsV[i].size());
835 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.