9 #include "dqm/analysis/modules/DQMHistAnalysisPXDER.h"
11 #include <pxd/geometry/SensorInfo.h>
12 #include <vxd/geometry/SensorInfoBase.h>
13 #include <vxd/geometry/GeoCache.h>
15 #include <boost/format.hpp>
19 #include <TDirectory.h>
42 setDescription(
"PXD DQM analysis module for Express Reco ");
43 addParam(
"RefHistoFile", m_refFileName,
"Reference histrogram file name", std::string(
"refHisto.root"));
49 DQMHistAnalysisPXDERModule::~DQMHistAnalysisPXDERModule()
53 void DQMHistAnalysisPXDERModule::initialize()
56 if (m_refFileName !=
"") {
57 m_refFile =
new TFile(m_refFileName.data());
65 c_lastVXDLayer = c_nVXDLayers;
66 c_nPXDLayers = geo.
getLayers(VXD::SensorInfoBase::SensorType::PXD).size();
67 c_firstPXDLayer = c_firstVXDLayer;
68 c_lastPXDLayer = c_nPXDLayers;
69 c_nSVDLayers = geo.
getLayers(VXD::SensorInfoBase::SensorType::SVD).size();
70 c_firstSVDLayer = c_nPXDLayers + c_firstPXDLayer;
71 c_lastSVDLayer = c_firstSVDLayer + c_nSVDLayers;
76 if (layer.getLayerNumber() <= c_lastPXDLayer) {
86 for (
int i = 0; i < c_nPXDSensors; i++) {
90 getIDsFromIndex(i, iLayer, iLadder, iSensor);
91 VxdID sensorID(iLayer, iLadder, iSensor);
93 string sensorDescr = str(format(
"%1%_%2%_%3%") % iLayer % iLadder % iSensor);
97 m_fired.emplace_back(str(format(
"DQMER_PXD_%1%_Fired") % sensorDescr));
98 m_ref_fired.emplace_back(
"ref/" + m_fired.back());
102 m_clusters.emplace_back(str(format(
"DQMER_PXD_%1%_Clusters") % sensorDescr));
103 m_ref_clusters.emplace_back(
"ref/" + m_clusters.back());
107 m_startRow.emplace_back(str(format(
"DQMER_PXD_%1%_StartRow") % sensorDescr));
108 m_ref_startRow.emplace_back(
"ref/" + m_startRow.back());
112 m_chargStartRow.emplace_back(str(format(
"DQMER_PXD_%1%_AverageSeedByStartRow") % sensorDescr));
113 m_ref_chargStartRow.emplace_back(
"ref/" + m_chargStartRow.back());
116 m_startRowCount.emplace_back(str(format(
"DQMER_PXD_%1%_SeedCountsByStartRow") % sensorDescr));
117 m_ref_startRowCount.emplace_back(
"ref/" + m_startRowCount.back());
121 m_clusterCharge.emplace_back(str(format(
"DQMER_PXD_%1%_ClusterCharge") % sensorDescr));
122 m_ref_clusterCharge.emplace_back(
"ref/" + m_clusterCharge.back());
126 m_pixelSignal.emplace_back(str(format(
"DQMER_PXD_%1%_PixelSignal") % sensorDescr));
127 m_ref_pixelSignal.emplace_back(
"ref/" + m_pixelSignal.back());
131 m_clusterSizeU.emplace_back(str(format(
"DQMER_PXD_%1%_ClusterSizeU") % sensorDescr));
132 m_ref_clusterSizeU.emplace_back(
"ref/" + m_clusterSizeU.back());
136 m_clusterSizeV.emplace_back(str(format(
"DQMER_PXD_%1%_ClusterSizeV") % sensorDescr));
137 m_ref_clusterSizeV.emplace_back(
"ref/" + m_clusterSizeV.back());
141 m_clusterSizeUV.emplace_back(str(format(
"DQMER_PXD_%1%_ClusterSizeUV") % sensorDescr));
142 m_ref_clusterSizeUV.emplace_back(
"ref/" + m_clusterSizeUV.back());
151 m_fFiredFlag =
new TH1I(
"DQMER_PXD_FiredFlag",
"DQM ER PXD Fired Flag",
152 c_nPXDSensors, 0, c_nPXDSensors);
153 m_fFiredFlag->GetXaxis()->SetTitle(
"Sensor ID");
154 m_fFiredFlag->GetYaxis()->SetTitle(
"flag");
155 m_fClustersFlag =
new TH1I(
"DQMER_PXD_ClustersFlag",
"DQM ER PXD Clusters Flag",
156 c_nPXDSensors, 0, c_nPXDSensors);
157 m_fClustersFlag->GetXaxis()->SetTitle(
"Sensor ID");
158 m_fClustersFlag->GetYaxis()->SetTitle(
"flag");
159 m_fStartRowFlag =
new TH1I(
"DQMER_PXD_StartRowFlag",
"DQM ER PXD Start Row Flag",
160 c_nPXDSensors, 0, c_nPXDSensors);
161 m_fStartRowFlag->GetXaxis()->SetTitle(
"Sensor ID");
162 m_fStartRowFlag->GetYaxis()->SetTitle(
"flag");
163 m_fChargStartRowFlag =
new TH1I(
"DQMER_PXD_ChargStartRowFlag",
"DQM ER PXD Charg Start Row Flag",
164 c_nPXDSensors, 0, c_nPXDSensors);
165 m_fChargStartRowFlag->GetXaxis()->SetTitle(
"Sensor ID");
166 m_fChargStartRowFlag->GetYaxis()->SetTitle(
"flag");
167 m_fStartRowCountFlag =
new TH1I(
"DQMER_PXD_StartRowCountFlag",
"DQM ER PXD Row Count Flag",
168 c_nPXDSensors, 0, c_nPXDSensors);
169 m_fStartRowCountFlag->GetXaxis()->SetTitle(
"Sensor ID");
170 m_fStartRowCountFlag->GetYaxis()->SetTitle(
"flag");
179 m_fClusterChargeFlag =
new TH1I(
"DQMER_PXD_ClusterChargeFlag",
"DQM ER PXD Cluster Charge Flag",
180 c_nPXDSensors, 0, c_nPXDSensors);
181 m_fClusterChargeFlag->GetXaxis()->SetTitle(
"Sensor ID");
182 m_fClusterChargeFlag->GetYaxis()->SetTitle(
"flag");
183 m_fPixelSignalFlag =
new TH1I(
"DQMER_PXD_PixelSignalFlag",
"DQM ER PXD Pixel Signal Flag",
184 c_nPXDSensors, 0, c_nPXDSensors);
185 m_fPixelSignalFlag->GetXaxis()->SetTitle(
"Sensor ID");
186 m_fPixelSignalFlag->GetYaxis()->SetTitle(
"flag");
187 m_fClusterSizeUFlag =
new TH1I(
"DQMER_PXD_ClasterSizeUFlag",
"DQM ER PXD Cluster Size U Flag",
188 c_nPXDSensors, 0, c_nPXDSensors);
189 m_fClusterSizeUFlag->GetXaxis()->SetTitle(
"Sensor ID");
190 m_fClusterSizeUFlag->GetYaxis()->SetTitle(
"flag");
191 m_fClusterSizeVFlag =
new TH1I(
"DQMER_PXD_ClasterSizeVFlag",
"DQM ER PXD Cluster Size V Flag",
192 c_nPXDSensors, 0, c_nPXDSensors);
193 m_fClusterSizeVFlag->GetXaxis()->SetTitle(
"Sensor ID");
194 m_fClusterSizeVFlag->GetYaxis()->SetTitle(
"flag");
195 m_fClusterSizeUVFlag =
new TH1I(
"DQMER_PXD_ClasterSizeUVFlag",
"DQM ER PXD Cluster Size UV Flag",
196 c_nPXDSensors, 0, c_nPXDSensors);
197 m_fClusterSizeUVFlag->GetXaxis()->SetTitle(
"Sensor ID");
198 m_fClusterSizeUVFlag->GetYaxis()->SetTitle(
"flag");
200 for (
int i = 0; i < c_nPXDSensors; i++) {
204 getIDsFromIndex(i, iLayer, iLadder, iSensor);
205 TString AxisTicks = Form(
"%i_%i_%i", iLayer, iLadder, iSensor);
208 m_fFiredFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
209 m_fClustersFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
210 m_fStartRowFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
211 m_fChargStartRowFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
212 m_fStartRowCountFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
215 m_fClusterChargeFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
216 m_fPixelSignalFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
217 m_fClusterSizeUFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
218 m_fClusterSizeVFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
219 m_fClusterSizeUVFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
224 void DQMHistAnalysisPXDERModule::beginRun()
229 if (m_fFiredFlag != NULL) m_fFiredFlag->Reset();
230 if (m_fClustersFlag != NULL) m_fClustersFlag->Reset();
231 if (m_fStartRowFlag != NULL) m_fStartRowFlag->Reset();
232 if (m_fChargStartRowFlag != NULL) m_fChargStartRowFlag->Reset();
233 if (m_fStartRowCountFlag != NULL) m_fStartRowCountFlag->Reset();
234 if (m_fClusterChargeFlag != NULL) m_fClusterChargeFlag->Reset();
235 if (m_fPixelSignalFlag != NULL) m_fPixelSignalFlag->Reset();
236 if (m_fClusterSizeUFlag != NULL) m_fClusterSizeUFlag->Reset();
237 if (m_fClusterSizeVFlag != NULL) m_fClusterSizeVFlag->Reset();
238 if (m_fClusterSizeUVFlag != NULL) m_fClusterSizeUVFlag->Reset();
246 void DQMHistAnalysisPXDERModule::event()
252 if (m_fFiredFlag != NULL) m_fFiredFlag->Reset();
253 if (m_fClustersFlag != NULL) m_fClustersFlag->Reset();
254 if (m_fStartRowFlag != NULL) m_fStartRowFlag->Reset();
255 if (m_fChargStartRowFlag != NULL) m_fChargStartRowFlag->Reset();
256 if (m_fStartRowCountFlag != NULL) m_fStartRowCountFlag->Reset();
257 if (m_fClusterChargeFlag != NULL) m_fClusterChargeFlag->Reset();
258 if (m_fPixelSignalFlag != NULL) m_fPixelSignalFlag->Reset();
259 if (m_fClusterSizeUFlag != NULL) m_fClusterSizeUFlag->Reset();
260 if (m_fClusterSizeVFlag != NULL) m_fClusterSizeVFlag->Reset();
261 if (m_fClusterSizeUVFlag != NULL) m_fClusterSizeUVFlag->Reset();
264 for (
int i = 0; i < c_nPXDSensors; i++) {
269 double m_NoOfEvents = 1., m_NoOfEventsRef = 1.;
275 SetFlag(2, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
276 m_fired.at(i), m_ref_fired.at(i), m_fFiredFlag);
277 SetFlag(2, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
278 m_clusters.at(i), m_ref_clusters.at(i), m_fClustersFlag);
279 SetFlag(100, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
280 m_startRow.at(i), m_ref_startRow.at(i), m_fStartRowFlag);
281 SetFlag(100, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
282 m_chargStartRow.at(i), m_ref_chargStartRow.at(i), m_fChargStartRowFlag);
283 SetFlag(100, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
284 m_startRowCount.at(i), m_ref_startRowCount.at(i), m_fStartRowCountFlag);
285 SetFlag(5, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
286 m_clusterCharge.at(i), m_ref_clusterCharge.at(i), m_fClusterChargeFlag);
287 SetFlag(5, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
288 m_pixelSignal.at(i), m_ref_pixelSignal.at(i), m_fPixelSignalFlag);
289 SetFlag(2, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
290 m_clusterSizeU.at(i), m_ref_clusterSizeU.at(i), m_fClusterSizeUFlag);
291 SetFlag(2, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
292 m_clusterSizeV.at(i), m_ref_clusterSizeV.at(i), m_fClusterSizeVFlag);
293 SetFlag(2, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
294 m_clusterSizeUV.at(i), m_ref_clusterSizeUV.at(i), m_fClusterSizeUVFlag);
299 void DQMHistAnalysisPXDERModule::endRun()
303 void DQMHistAnalysisPXDERModule::terminate()
307 void DQMHistAnalysisPXDERModule::getIDsFromIndex(
const int Index,
int& Layer,
int& Ladder,
int&
Sensor)
const
312 if (layer.getLayerNumber() > c_lastPXDLayer)
continue;
315 if (tempcounter == Index) {
316 Layer = layer.getLayerNumber();
317 Ladder = ladder.getLadderNumber();
318 Sensor = sensor.getSensorNumber();
327 int DQMHistAnalysisPXDERModule::SetFlag(
int Type,
int bin,
double* pars,
double ratio,
const std::string& name_hist,
328 const std::string& name_refhist, TH1I* flaghist)
331 float WarningLevel = 6.0;
332 float ErrorLevel = 10.0;
336 hist = GetHisto(name_hist);
337 if (!hist)
return -1;
338 refhist = GetHisto(name_refhist);
339 if (!refhist)
return -1;
343 auto temp = std::unique_ptr<TH1F>(
new TH1F(
"temp",
"temp", hist->GetNbinsX(), hist->GetXaxis()->GetXmin(),
344 hist->GetXaxis()->GetXmax()));
348 for (
int j = 0; j < hist->GetNbinsX(); j++) {
349 double val = hist->GetBinContent(j + 1);
352 temp->SetBinContent(j + 1, val);
353 flagInt += temp->GetBinContent(j + 1);
354 flagrInt += refhist->GetBinContent(j + 1);
358 flaghist->SetBinContent(bin + 1, -1);
361 double flag = temp->GetMean();
362 double flagErr = temp->GetMeanError();
363 double flagRMS = temp->GetRMS();
364 double flagRMSErr = temp->GetRMSError();
365 double flagr = refhist->GetMean();
366 double flagrErr = refhist->GetMeanError();
367 double flagrRMS = refhist->GetRMS();
368 double flagrRMSErr = refhist->GetRMSError();
369 TString strDebugInfo = Form(
"Conditions for Flag--->\n source %f %f+-%f %f+-%f\n referen %f %f+-%f %f+-%f\n",
370 flagInt, flag, flagErr, flagRMS, flagRMSErr,
371 flagrInt, flagr, flagrErr, flagrRMS, flagrRMSErr
373 B2DEBUG(130, strDebugInfo.Data());
375 if ((fabs(flag - flagr) > ErrorLevel * (flagErr + flagrErr)) ||
376 (fabs(flagRMS - flagrRMS) > ErrorLevel * (flagRMSErr + flagrRMSErr)) ||
377 (fabs(flagInt - flagrInt) > ErrorLevel * (sqrt(flagInt) + sqrt(flagrInt)))
379 flaghist->SetBinContent(bin + 1, 2);
380 }
else if ((fabs(flag - flagr) > WarningLevel * (flagErr + flagrErr)) ||
381 (fabs(flagRMS - flagrRMS) > WarningLevel * (flagRMSErr + flagrRMSErr)) ||
382 (fabs(flagInt - flagrInt) > WarningLevel * (sqrt(flagInt) + sqrt(flagrInt)))
384 flaghist->SetBinContent(bin + 1, 1);
386 flaghist->SetBinContent(bin + 1, 0);
389 }
else if (Type == 2) {
390 if (fabs(flagInt - flagrInt) > ErrorLevel * (sqrt(flagInt) + sqrt(flagrInt))) {
391 flaghist->SetBinContent(bin + 1, 2);
392 }
else if (fabs(flagInt - flagrInt) > WarningLevel * (sqrt(flagInt) + sqrt(flagrInt))) {
393 flaghist->SetBinContent(bin + 1, 1);
395 flaghist->SetBinContent(bin + 1, 0);
398 }
else if (Type == 3) {
399 if (fabs(flag - flagr) > ErrorLevel * (flagErr + flagrErr)) {
400 flaghist->SetBinContent(bin + 1, 2);
401 }
else if (fabs(flag - flagr) > WarningLevel * (flagErr + flagrErr)) {
402 flaghist->SetBinContent(bin + 1, 1);
404 flaghist->SetBinContent(bin + 1, 0);
407 }
else if (Type == 4) {
408 if (fabs(flagRMS - flagrRMS) > ErrorLevel * (flagRMSErr + flagrRMSErr)) {
409 flaghist->SetBinContent(bin + 1, 2);
410 }
else if (fabs(flagRMS - flagrRMS) > WarningLevel * (flagRMSErr + flagrRMSErr)) {
411 flaghist->SetBinContent(bin + 1, 1);
413 flaghist->SetBinContent(bin + 1, 0);
416 }
else if (Type == 5) {
417 if ((fabs(flag - flagr) > ErrorLevel * (flagErr + flagrErr)) ||
418 (fabs(flagInt - flagrInt) > ErrorLevel * (sqrt(flagInt) + sqrt(flagrInt)))
420 flaghist->SetBinContent(bin + 1, 2);
421 }
else if ((fabs(flag - flagr) > WarningLevel * (flagErr + flagrErr)) ||
422 (fabs(flagInt - flagrInt) > WarningLevel * (sqrt(flagInt) + sqrt(flagrInt)))
424 flaghist->SetBinContent(bin + 1, 1);
426 flaghist->SetBinContent(bin + 1, 0);
429 }
else if (Type == 9) {
430 flagInt = temp->GetBinContent(bin + 1);
431 flagrInt = refhist->GetBinContent(bin + 1);
432 if (fabs(flagInt - flagrInt) > ErrorLevel * (sqrt(flagInt) + sqrt(flagrInt))) {
433 flaghist->SetBinContent(bin + 1, 2);
434 }
else if (fabs(flagInt - flagrInt) > WarningLevel * (sqrt(flagInt) + sqrt(flagrInt))) {
435 flaghist->SetBinContent(bin + 1, 1);
437 flaghist->SetBinContent(bin + 1, 0);
440 }
else if (Type == 10) {
441 float flag2 = refhist->Chi2Test(temp.get());
442 flaghist->SetBinContent(bin + 1, 0);
444 flaghist->SetBinContent(bin + 1, 2);
446 flaghist->SetBinContent(bin + 1, 1);
448 }
else if (Type == 100) {
449 flaghist->SetBinContent(bin + 1, 0);
452 flaghist->SetBinContent(bin + 1, -3);
455 strDebugInfo = Form(
"SetFlag---> %f, type %i\n", flaghist->GetBinContent(bin + 1), Type);
456 B2DEBUG(130, strDebugInfo.Data());
476 TH1* DQMHistAnalysisPXDERModule::GetHisto(TString histoname)
479 hh1 = findHist(histoname.Data());
481 B2INFO(
"Histo " << histoname <<
" not in memfile");
484 if (m_refFile && m_refFile->IsOpen()) {
485 TDirectory* d = m_refFile;
486 TString myl = histoname;
490 while (myl.Tokenize(tok, from,
"/")) {
494 if (myl.Tokenize(dummy, f,
"/")) {
495 auto e = d->GetDirectory(tok);
497 B2INFO(
"Cd Dir " << tok);
500 B2INFO(
"cd failed " << tok);
506 TObject* obj = d->FindObject(tok);
508 if (obj->IsA()->InheritsFrom(
"TH1")) {
509 B2INFO(
"Histo " << histoname <<
" found in ref file");
512 B2INFO(
"Histo " << histoname <<
" found in ref file but wrong type");
516 TIter next(d->GetListOfKeys());
518 while ((key = (TKey*)next())) {
519 TObject* obj2 = key->ReadObj() ;
520 if (obj2->InheritsFrom(
"TH1")) {
521 if (obj2->GetName() == tok) {
523 B2INFO(
"Histo " << histoname <<
" found as key -> readobj");
528 if (hh1 == NULL) B2INFO(
"Histo " << histoname <<
" NOT found in ref file " << tok);
533 B2INFO(
"Histo " << histoname <<
" not in memfile or ref file");
535 TDirectory* d = gROOT;
536 TString myl = histoname;
539 while (myl.Tokenize(tok, from,
"/")) {
543 if (myl.Tokenize(dummy, f,
"/")) {
544 auto e = d->GetDirectory(tok);
546 B2INFO(
"Cd Dir " << tok);
548 }
else B2INFO(
"cd failed " << tok);
554 TObject* obj = d->FindObject(tok);
556 if (obj->IsA()->InheritsFrom(
"TH1")) {
557 B2INFO(
"Histo " << histoname <<
" found in mem");
561 B2INFO(
"Histo " << histoname <<
" NOT found in mem");
567 B2INFO(
"Histo " << histoname <<
" not found");
The base class for the histogram analysis module.
Specific implementation of SensorInfo for PXD Sensors which provides additional pixel specific inform...
Class to faciliate easy access to sensor information of the VXD like coordinate transformations or pi...
const std::set< Belle2::VxdID > getLayers(SensorInfoBase::SensorType sensortype=SensorInfoBase::VXD)
Return a set of all known Layers.
const std::set< Belle2::VxdID > & getSensors(Belle2::VxdID ladder) const
Return a set of all sensor IDs belonging to a given ladder.
const std::set< Belle2::VxdID > & getLadders(Belle2::VxdID layer) const
Return a set of all ladder IDs belonging to a given layer.
Class to uniquely identify a any structure of the PXD and SVD.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
std::map< Digit, DigitValue > Sensor
Map of all hits in one Sensor.
Abstract base class for different kinds of events.