11 #include <tracking/modules/svdROIFinder/SVDROIDQMModule.h>
12 #include <vxd/geometry/GeoCache.h>
14 #include <TDirectory.h>
33 , hInterDictionary(172, [](const
Belle2::
VxdID & vxdid) {
return (
size_t)vxdid.getID(); })
34 , hROIDictionary(172, [](
const Belle2::VxdID& vxdid) {
return (
size_t)vxdid.getID(); })
35 , hROIDictionaryEvt(172, [](
const Belle2::VxdID& vxdid) {
return (
size_t)vxdid.getID(); })
46 setDescription(
"Monitor of the ROIs creation on HLT");
47 setPropertyFlags(c_ParallelProcessingCertified);
49 addParam(
"SVDShaperDigitsName", m_SVDShaperDigitsName,
50 "name of the list of SVDShaperDigits", std::string(
""));
51 addParam(
"SVDRecoDigitsName", m_SVDRecoDigitsName,
52 "name of the list of SVDRecoDigits", std::string(
""));
54 addParam(
"InterceptsName", m_InterceptsName,
55 "name of the list of interceptions", std::string(
""));
57 addParam(
"ROIsName", m_ROIsName,
58 "name of the list of ROIs", std::string(
""));
62 void SVDROIDQMModule::defineHisto()
66 TDirectory* oldDir = gDirectory;
67 TDirectory* roiDir = oldDir->mkdir(
"SVDROIs");
68 m_InterDir = roiDir->mkdir(
"intercept");
69 m_ROIDir = roiDir->mkdir(
"roi");
71 hCellU =
new TH1F(
"hCellU",
"CellID U", 769, -0.5, 768.5);
72 hCellU->GetXaxis()->SetTitle(
"U cell ID");
73 hCellV =
new TH1F(
"hCellV",
"CellID V", 769, -0.5, 768.5);
74 hCellV->GetXaxis()->SetTitle(
"V cell ID");
77 hnInter =
new TH1F(
"hnInter",
"number of intercepts", 100, 0, 100);
80 hnROIs =
new TH1F(
"hnROIs",
"number of ROIs", 100, 0, 100);
81 harea =
new TH1F(
"harea",
"ROIs area", 100, 0, 100000);
82 hredFactor =
new TH1F(
"hredFactor",
"ROI reduction factor", 1000, 0, 1);
85 createHistosDictionaries();
91 void SVDROIDQMModule::initialize()
95 m_SVDShaperDigits.isOptional(m_SVDShaperDigitsName);
96 m_SVDRecoDigits.isOptional(m_SVDRecoDigitsName);
97 m_ROIs.isRequired(m_ROIsName);
98 m_Intercepts.isRequired(m_InterceptsName);
105 void SVDROIDQMModule::event()
110 for (
auto& it : m_SVDShaperDigits)
112 hCellU->Fill(it.getCellID());
114 hCellV->Fill(it.getCellID());
116 hnInter->Fill(m_Intercepts.getEntries());
118 for (
auto& it : m_Intercepts)
119 fillSensorInterHistos(&it);
122 for (
auto it = hROIDictionaryEvt.begin(); it != hROIDictionaryEvt.end(); ++it)
123 (it->second).value = 0;
126 double redFactor = 0;
128 for (
auto& it : m_ROIs) {
130 fillSensorROIHistos(&it);
133 const int nPixelsU = aSensorInfo.
getUCells();
134 const int nPixelsV = aSensorInfo.
getVCells();
136 int minU = it.getMinUid();
137 int minV = it.getMinVid();
138 int maxU = it.getMaxUid();
139 int maxV = it.getMaxVid();
141 int tmpROIarea = (maxU - minU) * (maxV - minV);
142 ROIarea += tmpROIarea;
143 redFactor += (double)tmpROIarea / (nPixelsU * nPixelsV * m_numModules);
147 hnROIs->Fill(m_ROIs.getEntries());
149 harea->Fill((
double)ROIarea);
151 hredFactor->Fill((
double)redFactor);
154 for (
auto it = hROIDictionaryEvt.begin(); it != hROIDictionaryEvt.end(); ++it) {
156 aROIHistoAccumulateAndFill.
fill(aROIHistoAccumulateAndFill.
hPtr, aROIHistoAccumulateAndFill.
value);
161 void SVDROIDQMModule::createHistosDictionaries()
173 std::set<Belle2::VxdID> svdLayers = m_geoCache.getLayers(VXD::SensorInfoBase::SVD);
174 std::set<Belle2::VxdID>::iterator itSvdLayers = svdLayers.begin();
176 while (itSvdLayers != svdLayers.end()) {
178 std::set<Belle2::VxdID> svdLadders = m_geoCache.getLadders(*itSvdLayers);
179 std::set<Belle2::VxdID>::iterator itSvdLadders = svdLadders.begin();
181 while (itSvdLadders != svdLadders.end()) {
183 std::set<Belle2::VxdID> svdSensors = m_geoCache.getSensors(*itSvdLadders);
184 std::set<Belle2::VxdID>::iterator itSvdSensors = svdSensors.begin();
186 while (itSvdSensors != svdSensors.end()) {
192 const int nPixelsU = wSensorInfo.
getUCells();
193 const int nPixelsV = wSensorInfo.
getVCells();
194 string sensorid = std::to_string(itSvdSensors->getLayerNumber()) +
"_" + std::to_string(itSvdSensors->getLadderNumber()) +
"_" +
195 std::to_string(itSvdSensors->getSensorNumber());
201 name =
"hNROIs_" + sensorid;
202 title =
"number of ROIs for sensor " + sensorid;
205 new TH1F(name.c_str(), title.c_str(), 25, 0, 25),
206 [](
const ROIid*,
double & val) {val++;},
207 [](TH1 * hPtr,
double & val) { hPtr->Fill(val); },
210 hROIDictionaryEvt.insert(pair< Belle2::VxdID, ROIHistoAccumulateAndFill& > ((
Belle2::VxdID)*itSvdSensors, *aHAAF));
219 name =
"hCoorU_" + sensorid;
220 title =
"U coordinate of the extrapolation in U for sensor " + sensorid;
221 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
225 new TH1F(name.c_str(), title.c_str(), 100, -5, 5),
226 [](TH1 * hPtr,
const SVDIntercept * inter) { hPtr->Fill(inter->getCoorU()); }
231 name =
"hCoorV_" + sensorid;
232 title =
"V coordinate of the extrapolation in V for sensor " + sensorid;
233 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
237 new TH1F(name.c_str(), title.c_str(), 100, -5, 5),
238 [](TH1 * hPtr,
const SVDIntercept * inter) { hPtr->Fill(inter->getCoorV()); }
244 name =
"hCoorU_vs_CoorV_" + sensorid;
245 title =
"U vs V intercept (cm) " + sensorid;
246 tmp2D =
new TH2F(name.c_str(), title.c_str(), 100, -5, 5, 100, -5, 5);
247 tmp2D->GetXaxis()->SetTitle(
"intercept U coor (cm)");
248 tmp2D->GetYaxis()->SetTitle(
"intercept V coor (cm)");
249 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
254 [](TH1 * hPtr,
const SVDIntercept * inter) { hPtr->Fill(inter->getCoorU(), inter->getCoorV()); }
261 name =
"hStatErrU_" + sensorid;
262 title =
"stat error of the extrapolation in U for sensor " + sensorid;
263 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
267 new TH1F(name.c_str(), title.c_str(), 100, 0, 0.35),
268 [](TH1 * hPtr,
const SVDIntercept * inter) { hPtr->Fill(inter->getSigmaU()); }
272 name =
"hStatErrV_" + sensorid;
273 title =
"stat error of the extrapolation in V for sensor " + sensorid;
274 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
278 new TH1F(name.c_str(), title.c_str(), 100, 0, 0.35),
279 [](TH1 * hPtr,
const SVDIntercept * inter) { hPtr->Fill(inter->getSigmaV()); }
285 name =
"hResidU_" + sensorid;
286 title =
"U residuals = intercept - digit, for sensor " + sensorid;
287 tmp1D =
new TH1F(name.c_str(), title.c_str(), 1000, -5, 5);
288 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
296 for (
auto& it : SVDShaperDigits)
297 if ((
int)it.getSensorID() == (
int)inter->getSensorID()) {
300 hPtr->Fill(inter->getCoorU() - aSensorInfo.
getUCellPosition(it.getCellID()));
308 name =
"hResidV_" + sensorid;
309 title =
"V residuals = intercept - digit, for sensor " + sensorid;
310 tmp1D =
new TH1F(name.c_str(), title.c_str(), 1000, -5, 5);
311 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
319 for (
auto& it : SVDShaperDigits)
320 if ((
int)it.getSensorID() == (
int)inter->getSensorID()) {
321 if (!it.isUStrip()) {
323 hPtr->Fill(inter->getCoorV() - aSensorInfo.
getVCellPosition(it.getCellID()));
332 name =
"hResidU_vs_CoorU_" + sensorid;
333 title =
"U residual (cm) vs coor U (cm) " + sensorid;
334 tmp2D =
new TH2F(name.c_str(), title.c_str(), 1000, -5, 5, 1000, -5, 5);
335 tmp2D->GetYaxis()->SetTitle(
"U resid (cm)");
336 tmp2D->GetXaxis()->SetTitle(
"U coor (cm)");
337 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
345 for (
auto& it : SVDShaperDigits)
346 if (((
int)it.getSensorID() == (
int)inter->getSensorID()) && it.isUStrip()) {
348 double resid = inter->getCoorU() - aSensorInfo.
getUCellPosition(it.getCellID());
349 hPtr->Fill(inter->getCoorU(), resid);
356 name =
"hResidV_vs_CoorV_" + sensorid;
357 title =
"V residual (cm) vs coor V (cm) " + sensorid;
358 tmp2D =
new TH2F(name.c_str(), title.c_str(), 1000, -5, 5, 1000, -5, 5);
359 tmp2D->GetYaxis()->SetTitle(
"V resid (cm)");
360 tmp2D->GetXaxis()->SetTitle(
"V coor (cm)");
361 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
369 for (
auto& it : SVDShaperDigits)
370 if (((
int)it.getSensorID() == (
int)inter->getSensorID()) && (!it.isUStrip())) {
372 double resid = inter->getCoorV() - aSensorInfo.
getVCellPosition(it.getCellID());
373 hPtr->Fill(inter->getCoorV(), resid);
382 name =
"hResidU_vs_charge_" + sensorid;
383 title =
"U residual (cm) vs charge " + sensorid;
384 tmp2D =
new TH2F(name.c_str(), title.c_str(), 250, 0, 250, 100, -5, 5);
385 tmp2D->GetYaxis()->SetTitle(
"U resid (cm)");
386 tmp2D->GetXaxis()->SetTitle(
"charge");
387 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
395 for (
auto& it : SVDRecoDigits)
396 if (((
int)it.getSensorID() == (
int)inter->getSensorID()) && (it.isUStrip())) {
398 double resid = inter->getCoorU() - aSensorInfo.
getUCellPosition(it.getCellID());
399 hPtr->Fill(it.getCharge(), resid);
406 name =
"hResidV_vs_charge_" + sensorid;
407 title =
"V residual (cm) vs charge " + sensorid;
408 tmp2D =
new TH2F(name.c_str(), title.c_str(), 250, 0, 250, 100, -5, 5);
409 tmp2D->GetYaxis()->SetTitle(
"V resid (cm)");
410 tmp2D->GetXaxis()->SetTitle(
"charge");
411 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
419 for (
auto& it : SVDRecoDigits)
420 if (((
int)it.getSensorID() == (
int)inter->getSensorID()) && (!it.isUStrip())) {
422 double resid = inter->getCoorV() - aSensorInfo.
getVCellPosition(it.getCellID());
423 hPtr->Fill(it.getCharge(), resid);
432 name =
"hCoorU_vs_UDigit_" + sensorid;
433 title =
"U intercept (cm) vs U Digit (ID) " + sensorid;
434 tmp2D =
new TH2F(name.c_str(), title.c_str(), 1000, -5, 5, 1000, -5, 5);
435 tmp2D->GetXaxis()->SetTitle(
"intercept U coor (cm)");
436 tmp2D->GetYaxis()->SetTitle(
"digit U coor (cm)");
437 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
445 for (
auto& it : SVDShaperDigits)
446 if (((
int)it.getSensorID() == (
int)inter->getSensorID()) && (it.isUStrip())) {
448 hPtr->Fill(inter->getCoorU(), aSensorInfo.
getUCellPosition(it.getCellID()));
456 name =
"hCoorV_vs_VDigit_" + sensorid;
457 title =
"V intercept (cm) vs V Digit (ID) " + sensorid;
458 tmp2D =
new TH2F(name.c_str(), title.c_str(), 1000, -5, 5, 1000, -5, 5);
459 tmp2D->GetXaxis()->SetTitle(
"intercept V coor (cm)");
460 tmp2D->GetYaxis()->SetTitle(
"digi V coor (cm)");
461 hInterDictionary.insert(pair< Belle2::VxdID, InterHistoAndFill >
469 for (
auto& it : SVDShaperDigits) {
470 if (((
int)it.getSensorID() == (
int)inter->getSensorID()) && (!it.isUStrip())) {
472 hPtr->Fill(inter->getCoorV(), aSensorInfo.
getVCellPosition(it.getCellID()));
490 name =
"hminU_" + sensorid;
491 title =
"ROI min in U for sensor " + sensorid;
492 hROIDictionary.insert(pair< Belle2::VxdID, ROIHistoAndFill >
496 new TH1F(name.c_str(), title.c_str(), nPixelsU, 0, nPixelsU),
497 [](TH1 * hPtr,
const ROIid * roi) { hPtr->Fill(roi->getMinUid()); }
501 name =
"hminV_" + sensorid;
502 title =
"ROI min in V for sensor " + sensorid;
503 hROIDictionary.insert(pair< Belle2::VxdID, ROIHistoAndFill >
507 new TH1F(name.c_str(), title.c_str(), nPixelsV, 0, nPixelsV),
508 [](TH1 * hPtr,
const ROIid * roi) { hPtr->Fill(roi->getMinVid()); }
514 name =
"hmaxU_" + sensorid;
515 title =
"ROI max in U for sensor " + sensorid;
516 hROIDictionary.insert(pair< Belle2::VxdID, ROIHistoAndFill >
520 new TH1F(name.c_str(), title.c_str(), nPixelsU, 0, nPixelsU),
521 [](TH1 * hPtr,
const ROIid * roi) { hPtr->Fill(roi->getMaxUid()); }
525 name =
"hmaxV_" + sensorid;
526 title =
"ROI max in V for sensor " + sensorid;
527 hROIDictionary.insert(pair< Belle2::VxdID, ROIHistoAndFill >
531 new TH1F(name.c_str(), title.c_str(), nPixelsV, 0, nPixelsV),
532 [](TH1 * hPtr,
const ROIid * roi) { hPtr->Fill(roi->getMaxVid()); }
539 name =
"hwidthU_" + sensorid;
540 title =
"ROI width in U for sensor " + sensorid;
541 hROIDictionary.insert(pair< Belle2::VxdID, ROIHistoAndFill >
545 new TH1F(name.c_str(), title.c_str(), nPixelsU, 0, nPixelsU),
546 [](TH1 * hPtr,
const ROIid * roi) { hPtr->Fill(roi->getMaxUid() - roi->getMinUid()); }
550 name =
"hwidthV_" + sensorid;
551 title =
"ROI width in V for sensor " + sensorid;
552 hROIDictionary.insert(pair< Belle2::VxdID, ROIHistoAndFill >
556 new TH1F(name.c_str(), title.c_str(), nPixelsV, 0, nPixelsV),
557 [](TH1 * hPtr,
const ROIid * roi) { hPtr->Fill(roi->getMaxVid() - roi->getMinVid()); }
563 name =
"hROIcenter_" + sensorid;
564 title =
"ROI center " + sensorid;
565 tmp2D =
new TH2F(name.c_str(), title.c_str(), nPixelsU, 0, nPixelsU, nPixelsV, 0, nPixelsV);
566 tmp2D->GetXaxis()->SetTitle(
" U (ID)");
567 tmp2D->GetYaxis()->SetTitle(
" V (ID)");
568 hROIDictionary.insert(pair< Belle2::VxdID, ROIHistoAndFill >
573 [](TH1 * hPtr,
const ROIid * roi) { hPtr->Fill((roi->getMaxUid() + roi->getMinUid()) / 2, (roi->getMaxVid() + roi->getMinVid()) / 2); }
592 auto its = hInterDictionary.equal_range(inter->getSensorID());
594 for (
auto it = its.first; it != its.second; ++it) {
596 aInterHistoAndFill.second(aInterHistoAndFill.first, inter);
601 void SVDROIDQMModule::fillSensorROIHistos(
const ROIid* roi)
604 auto its = hROIDictionary.equal_range(roi->getSensorID());
606 for (
auto it = its.first; it != its.second; ++it) {
608 aROIHistoAndFill.second(aROIHistoAndFill.first, roi);
611 auto itsEvt = hROIDictionaryEvt.equal_range(roi->getSensorID());
612 for (
auto it = itsEvt.first; it != itsEvt.second; ++it)
613 (it->second).accumulate(roi, (it->second).value);
616 void SVDROIDQMModule::endRun()
619 hCellU->Scale((
double)1 / n_events);
620 hCellV->Scale((
double)1 / n_events);
622 for (
auto it = hROIDictionaryEvt.begin(); it != hROIDictionaryEvt.end(); ++it)
623 delete &(it->second);