15 #include "dqm/analysis/modules/DQMHistAnalysisPXDER.h"
17 #include <pxd/geometry/SensorInfo.h>
18 #include <vxd/geometry/SensorInfoBase.h>
19 #include <vxd/geometry/GeoCache.h>
21 #include <boost/format.hpp>
25 #include <TDirectory.h>
48 setDescription(
"PXD DQM analysis module for Express Reco ");
49 addParam(
"RefHistoFile", m_refFileName,
"Reference histrogram file name", std::string(
"refHisto.root"));
55 DQMHistAnalysisPXDERModule::~DQMHistAnalysisPXDERModule()
59 void DQMHistAnalysisPXDERModule::initialize()
62 if (m_refFileName !=
"") {
63 m_refFile =
new TFile(m_refFileName.data());
71 c_lastVXDLayer = c_nVXDLayers;
72 c_nPXDLayers = geo.
getLayers(VXD::SensorInfoBase::SensorType::PXD).size();
73 c_firstPXDLayer = c_firstVXDLayer;
74 c_lastPXDLayer = c_nPXDLayers;
75 c_nSVDLayers = geo.
getLayers(VXD::SensorInfoBase::SensorType::SVD).size();
76 c_firstSVDLayer = c_nPXDLayers + c_firstPXDLayer;
77 c_lastSVDLayer = c_firstSVDLayer + c_nSVDLayers;
82 if (layer.getLayerNumber() <= c_lastPXDLayer) {
92 for (
int i = 0; i < c_nPXDSensors; i++) {
96 getIDsFromIndex(i, iLayer, iLadder, iSensor);
97 VxdID sensorID(iLayer, iLadder, iSensor);
99 string sensorDescr = str(format(
"%1%_%2%_%3%") % iLayer % iLadder % iSensor);
103 m_fired.emplace_back(str(format(
"DQMER_PXD_%1%_Fired") % sensorDescr));
104 m_ref_fired.emplace_back(
"ref/" + m_fired.back());
108 m_clusters.emplace_back(str(format(
"DQMER_PXD_%1%_Clusters") % sensorDescr));
109 m_ref_clusters.emplace_back(
"ref/" + m_clusters.back());
113 m_startRow.emplace_back(str(format(
"DQMER_PXD_%1%_StartRow") % sensorDescr));
114 m_ref_startRow.emplace_back(
"ref/" + m_startRow.back());
118 m_chargStartRow.emplace_back(str(format(
"DQMER_PXD_%1%_AverageSeedByStartRow") % sensorDescr));
119 m_ref_chargStartRow.emplace_back(
"ref/" + m_chargStartRow.back());
122 m_startRowCount.emplace_back(str(format(
"DQMER_PXD_%1%_SeedCountsByStartRow") % sensorDescr));
123 m_ref_startRowCount.emplace_back(
"ref/" + m_startRowCount.back());
127 m_clusterCharge.emplace_back(str(format(
"DQMER_PXD_%1%_ClusterCharge") % sensorDescr));
128 m_ref_clusterCharge.emplace_back(
"ref/" + m_clusterCharge.back());
132 m_pixelSignal.emplace_back(str(format(
"DQMER_PXD_%1%_PixelSignal") % sensorDescr));
133 m_ref_pixelSignal.emplace_back(
"ref/" + m_pixelSignal.back());
137 m_clusterSizeU.emplace_back(str(format(
"DQMER_PXD_%1%_ClusterSizeU") % sensorDescr));
138 m_ref_clusterSizeU.emplace_back(
"ref/" + m_clusterSizeU.back());
142 m_clusterSizeV.emplace_back(str(format(
"DQMER_PXD_%1%_ClusterSizeV") % sensorDescr));
143 m_ref_clusterSizeV.emplace_back(
"ref/" + m_clusterSizeV.back());
147 m_clusterSizeUV.emplace_back(str(format(
"DQMER_PXD_%1%_ClusterSizeUV") % sensorDescr));
148 m_ref_clusterSizeUV.emplace_back(
"ref/" + m_clusterSizeUV.back());
157 m_fFiredFlag =
new TH1I(
"DQMER_PXD_FiredFlag",
"DQM ER PXD Fired Flag",
158 c_nPXDSensors, 0, c_nPXDSensors);
159 m_fFiredFlag->GetXaxis()->SetTitle(
"Sensor ID");
160 m_fFiredFlag->GetYaxis()->SetTitle(
"flag");
161 m_fClustersFlag =
new TH1I(
"DQMER_PXD_ClustersFlag",
"DQM ER PXD Clusters Flag",
162 c_nPXDSensors, 0, c_nPXDSensors);
163 m_fClustersFlag->GetXaxis()->SetTitle(
"Sensor ID");
164 m_fClustersFlag->GetYaxis()->SetTitle(
"flag");
165 m_fStartRowFlag =
new TH1I(
"DQMER_PXD_StartRowFlag",
"DQM ER PXD Start Row Flag",
166 c_nPXDSensors, 0, c_nPXDSensors);
167 m_fStartRowFlag->GetXaxis()->SetTitle(
"Sensor ID");
168 m_fStartRowFlag->GetYaxis()->SetTitle(
"flag");
169 m_fChargStartRowFlag =
new TH1I(
"DQMER_PXD_ChargStartRowFlag",
"DQM ER PXD Charg Start Row Flag",
170 c_nPXDSensors, 0, c_nPXDSensors);
171 m_fChargStartRowFlag->GetXaxis()->SetTitle(
"Sensor ID");
172 m_fChargStartRowFlag->GetYaxis()->SetTitle(
"flag");
173 m_fStartRowCountFlag =
new TH1I(
"DQMER_PXD_StartRowCountFlag",
"DQM ER PXD Row Count Flag",
174 c_nPXDSensors, 0, c_nPXDSensors);
175 m_fStartRowCountFlag->GetXaxis()->SetTitle(
"Sensor ID");
176 m_fStartRowCountFlag->GetYaxis()->SetTitle(
"flag");
185 m_fClusterChargeFlag =
new TH1I(
"DQMER_PXD_ClusterChargeFlag",
"DQM ER PXD Cluster Charge Flag",
186 c_nPXDSensors, 0, c_nPXDSensors);
187 m_fClusterChargeFlag->GetXaxis()->SetTitle(
"Sensor ID");
188 m_fClusterChargeFlag->GetYaxis()->SetTitle(
"flag");
189 m_fPixelSignalFlag =
new TH1I(
"DQMER_PXD_PixelSignalFlag",
"DQM ER PXD Pixel Signal Flag",
190 c_nPXDSensors, 0, c_nPXDSensors);
191 m_fPixelSignalFlag->GetXaxis()->SetTitle(
"Sensor ID");
192 m_fPixelSignalFlag->GetYaxis()->SetTitle(
"flag");
193 m_fClusterSizeUFlag =
new TH1I(
"DQMER_PXD_ClasterSizeUFlag",
"DQM ER PXD Cluster Size U Flag",
194 c_nPXDSensors, 0, c_nPXDSensors);
195 m_fClusterSizeUFlag->GetXaxis()->SetTitle(
"Sensor ID");
196 m_fClusterSizeUFlag->GetYaxis()->SetTitle(
"flag");
197 m_fClusterSizeVFlag =
new TH1I(
"DQMER_PXD_ClasterSizeVFlag",
"DQM ER PXD Cluster Size V Flag",
198 c_nPXDSensors, 0, c_nPXDSensors);
199 m_fClusterSizeVFlag->GetXaxis()->SetTitle(
"Sensor ID");
200 m_fClusterSizeVFlag->GetYaxis()->SetTitle(
"flag");
201 m_fClusterSizeUVFlag =
new TH1I(
"DQMER_PXD_ClasterSizeUVFlag",
"DQM ER PXD Cluster Size UV Flag",
202 c_nPXDSensors, 0, c_nPXDSensors);
203 m_fClusterSizeUVFlag->GetXaxis()->SetTitle(
"Sensor ID");
204 m_fClusterSizeUVFlag->GetYaxis()->SetTitle(
"flag");
206 for (
int i = 0; i < c_nPXDSensors; i++) {
210 getIDsFromIndex(i, iLayer, iLadder, iSensor);
211 TString AxisTicks = Form(
"%i_%i_%i", iLayer, iLadder, iSensor);
214 m_fFiredFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
215 m_fClustersFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
216 m_fStartRowFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
217 m_fChargStartRowFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
218 m_fStartRowCountFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
221 m_fClusterChargeFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
222 m_fPixelSignalFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
223 m_fClusterSizeUFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
224 m_fClusterSizeVFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
225 m_fClusterSizeUVFlag->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
230 void DQMHistAnalysisPXDERModule::beginRun()
235 if (m_fFiredFlag != NULL) m_fFiredFlag->Reset();
236 if (m_fClustersFlag != NULL) m_fClustersFlag->Reset();
237 if (m_fStartRowFlag != NULL) m_fStartRowFlag->Reset();
238 if (m_fChargStartRowFlag != NULL) m_fChargStartRowFlag->Reset();
239 if (m_fStartRowCountFlag != NULL) m_fStartRowCountFlag->Reset();
240 if (m_fClusterChargeFlag != NULL) m_fClusterChargeFlag->Reset();
241 if (m_fPixelSignalFlag != NULL) m_fPixelSignalFlag->Reset();
242 if (m_fClusterSizeUFlag != NULL) m_fClusterSizeUFlag->Reset();
243 if (m_fClusterSizeVFlag != NULL) m_fClusterSizeVFlag->Reset();
244 if (m_fClusterSizeUVFlag != NULL) m_fClusterSizeUVFlag->Reset();
252 void DQMHistAnalysisPXDERModule::event()
258 if (m_fFiredFlag != NULL) m_fFiredFlag->Reset();
259 if (m_fClustersFlag != NULL) m_fClustersFlag->Reset();
260 if (m_fStartRowFlag != NULL) m_fStartRowFlag->Reset();
261 if (m_fChargStartRowFlag != NULL) m_fChargStartRowFlag->Reset();
262 if (m_fStartRowCountFlag != NULL) m_fStartRowCountFlag->Reset();
263 if (m_fClusterChargeFlag != NULL) m_fClusterChargeFlag->Reset();
264 if (m_fPixelSignalFlag != NULL) m_fPixelSignalFlag->Reset();
265 if (m_fClusterSizeUFlag != NULL) m_fClusterSizeUFlag->Reset();
266 if (m_fClusterSizeVFlag != NULL) m_fClusterSizeVFlag->Reset();
267 if (m_fClusterSizeUVFlag != NULL) m_fClusterSizeUVFlag->Reset();
270 for (
int i = 0; i < c_nPXDSensors; i++) {
275 double m_NoOfEvents = 1., m_NoOfEventsRef = 1.;
281 SetFlag(2, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
282 m_fired.at(i), m_ref_fired.at(i), m_fFiredFlag);
283 SetFlag(2, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
284 m_clusters.at(i), m_ref_clusters.at(i), m_fClustersFlag);
285 SetFlag(100, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
286 m_startRow.at(i), m_ref_startRow.at(i), m_fStartRowFlag);
287 SetFlag(100, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
288 m_chargStartRow.at(i), m_ref_chargStartRow.at(i), m_fChargStartRowFlag);
289 SetFlag(100, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
290 m_startRowCount.at(i), m_ref_startRowCount.at(i), m_fStartRowCountFlag);
291 SetFlag(5, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
292 m_clusterCharge.at(i), m_ref_clusterCharge.at(i), m_fClusterChargeFlag);
293 SetFlag(5, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
294 m_pixelSignal.at(i), m_ref_pixelSignal.at(i), m_fPixelSignalFlag);
295 SetFlag(2, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
296 m_clusterSizeU.at(i), m_ref_clusterSizeU.at(i), m_fClusterSizeUFlag);
297 SetFlag(2, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
298 m_clusterSizeV.at(i), m_ref_clusterSizeV.at(i), m_fClusterSizeVFlag);
299 SetFlag(2, i, pars, (
double)m_NoOfEvents / m_NoOfEventsRef,
300 m_clusterSizeUV.at(i), m_ref_clusterSizeUV.at(i), m_fClusterSizeUVFlag);
305 void DQMHistAnalysisPXDERModule::endRun()
309 void DQMHistAnalysisPXDERModule::terminate()
313 void DQMHistAnalysisPXDERModule::getIDsFromIndex(
const int Index,
int& Layer,
int& Ladder,
int&
Sensor)
const
318 if (layer.getLayerNumber() > c_lastPXDLayer)
continue;
321 if (tempcounter == Index) {
322 Layer = layer.getLayerNumber();
323 Ladder = ladder.getLadderNumber();
324 Sensor = sensor.getSensorNumber();
333 int DQMHistAnalysisPXDERModule::SetFlag(
int Type,
int bin,
double* pars,
double ratio,
const std::string& name_hist,
334 const std::string& name_refhist, TH1I* flaghist)
337 float WarningLevel = 6.0;
338 float ErrorLevel = 10.0;
342 hist = GetHisto(name_hist);
343 if (!hist)
return -1;
344 refhist = GetHisto(name_refhist);
345 if (!refhist)
return -1;
349 auto temp = std::unique_ptr<TH1F>(
new TH1F(
"temp",
"temp", hist->GetNbinsX(), hist->GetXaxis()->GetXmin(),
350 hist->GetXaxis()->GetXmax()));
354 for (
int j = 0; j < hist->GetNbinsX(); j++) {
355 double val = hist->GetBinContent(j + 1);
358 temp->SetBinContent(j + 1, val);
359 flagInt += temp->GetBinContent(j + 1);
360 flagrInt += refhist->GetBinContent(j + 1);
364 flaghist->SetBinContent(bin + 1, -1);
367 double flag = temp->GetMean();
368 double flagErr = temp->GetMeanError();
369 double flagRMS = temp->GetRMS();
370 double flagRMSErr = temp->GetRMSError();
371 double flagr = refhist->GetMean();
372 double flagrErr = refhist->GetMeanError();
373 double flagrRMS = refhist->GetRMS();
374 double flagrRMSErr = refhist->GetRMSError();
375 TString strDebugInfo = Form(
"Conditions for Flag--->\n source %f %f+-%f %f+-%f\n referen %f %f+-%f %f+-%f\n",
376 flagInt, flag, flagErr, flagRMS, flagRMSErr,
377 flagrInt, flagr, flagrErr, flagrRMS, flagrRMSErr
379 B2DEBUG(130, strDebugInfo.Data());
381 if ((fabs(flag - flagr) > ErrorLevel * (flagErr + flagrErr)) ||
382 (fabs(flagRMS - flagrRMS) > ErrorLevel * (flagRMSErr + flagrRMSErr)) ||
383 (fabs(flagInt - flagrInt) > ErrorLevel * (sqrt(flagInt) + sqrt(flagrInt)))
385 flaghist->SetBinContent(bin + 1, 2);
386 }
else if ((fabs(flag - flagr) > WarningLevel * (flagErr + flagrErr)) ||
387 (fabs(flagRMS - flagrRMS) > WarningLevel * (flagRMSErr + flagrRMSErr)) ||
388 (fabs(flagInt - flagrInt) > WarningLevel * (sqrt(flagInt) + sqrt(flagrInt)))
390 flaghist->SetBinContent(bin + 1, 1);
392 flaghist->SetBinContent(bin + 1, 0);
395 }
else if (Type == 2) {
396 if (fabs(flagInt - flagrInt) > ErrorLevel * (sqrt(flagInt) + sqrt(flagrInt))) {
397 flaghist->SetBinContent(bin + 1, 2);
398 }
else if (fabs(flagInt - flagrInt) > WarningLevel * (sqrt(flagInt) + sqrt(flagrInt))) {
399 flaghist->SetBinContent(bin + 1, 1);
401 flaghist->SetBinContent(bin + 1, 0);
404 }
else if (Type == 3) {
405 if (fabs(flag - flagr) > ErrorLevel * (flagErr + flagrErr)) {
406 flaghist->SetBinContent(bin + 1, 2);
407 }
else if (fabs(flag - flagr) > WarningLevel * (flagErr + flagrErr)) {
408 flaghist->SetBinContent(bin + 1, 1);
410 flaghist->SetBinContent(bin + 1, 0);
413 }
else if (Type == 4) {
414 if (fabs(flagRMS - flagrRMS) > ErrorLevel * (flagRMSErr + flagrRMSErr)) {
415 flaghist->SetBinContent(bin + 1, 2);
416 }
else if (fabs(flagRMS - flagrRMS) > WarningLevel * (flagRMSErr + flagrRMSErr)) {
417 flaghist->SetBinContent(bin + 1, 1);
419 flaghist->SetBinContent(bin + 1, 0);
422 }
else if (Type == 5) {
423 if ((fabs(flag - flagr) > ErrorLevel * (flagErr + flagrErr)) ||
424 (fabs(flagInt - flagrInt) > ErrorLevel * (sqrt(flagInt) + sqrt(flagrInt)))
426 flaghist->SetBinContent(bin + 1, 2);
427 }
else if ((fabs(flag - flagr) > WarningLevel * (flagErr + flagrErr)) ||
428 (fabs(flagInt - flagrInt) > WarningLevel * (sqrt(flagInt) + sqrt(flagrInt)))
430 flaghist->SetBinContent(bin + 1, 1);
432 flaghist->SetBinContent(bin + 1, 0);
435 }
else if (Type == 9) {
436 flagInt = temp->GetBinContent(bin + 1);
437 flagrInt = refhist->GetBinContent(bin + 1);
438 if (fabs(flagInt - flagrInt) > ErrorLevel * (sqrt(flagInt) + sqrt(flagrInt))) {
439 flaghist->SetBinContent(bin + 1, 2);
440 }
else if (fabs(flagInt - flagrInt) > WarningLevel * (sqrt(flagInt) + sqrt(flagrInt))) {
441 flaghist->SetBinContent(bin + 1, 1);
443 flaghist->SetBinContent(bin + 1, 0);
446 }
else if (Type == 10) {
447 float flag2 = refhist->Chi2Test(temp.get());
448 flaghist->SetBinContent(bin + 1, 0);
450 flaghist->SetBinContent(bin + 1, 2);
452 flaghist->SetBinContent(bin + 1, 1);
454 }
else if (Type == 100) {
455 flaghist->SetBinContent(bin + 1, 0);
458 flaghist->SetBinContent(bin + 1, -3);
461 strDebugInfo = Form(
"SetFlag---> %f, type %i\n", flaghist->GetBinContent(bin + 1), Type);
462 B2DEBUG(130, strDebugInfo.Data());
482 TH1* DQMHistAnalysisPXDERModule::GetHisto(TString histoname)
485 hh1 = findHist(histoname.Data());
487 B2INFO(
"Histo " << histoname <<
" not in memfile");
492 if (m_refFile && m_refFile->IsOpen()) {
493 TDirectory* d = m_refFile;
494 TString myl = histoname;
498 while (myl.Tokenize(tok, from,
"/")) {
502 if (myl.Tokenize(dummy, f,
"/")) {
503 auto e = d->GetDirectory(tok);
505 B2INFO(
"Cd Dir " << tok);
508 B2INFO(
"cd failed " << tok);
514 TObject* obj = d->FindObject(tok);
516 if (obj->IsA()->InheritsFrom(
"TH1")) {
517 B2INFO(
"Histo " << histoname <<
" found in ref file");
520 B2INFO(
"Histo " << histoname <<
" found in ref file but wrong type");
524 TIter next(d->GetListOfKeys());
526 while ((key = (TKey*)next())) {
527 TObject* obj2 = key->ReadObj() ;
528 if (obj2->InheritsFrom(
"TH1")) {
529 if (obj2->GetName() == tok) {
531 B2INFO(
"Histo " << histoname <<
" found as key -> readobj");
536 if (hh1 == NULL) B2INFO(
"Histo " << histoname <<
" NOT found in ref file " << tok);
541 B2INFO(
"Histo " << histoname <<
" not in memfile or ref file");
544 TDirectory* d = gROOT;
545 TString myl = histoname;
548 while (myl.Tokenize(tok, from,
"/")) {
552 if (myl.Tokenize(dummy, f,
"/")) {
553 auto e = d->GetDirectory(tok);
555 B2INFO(
"Cd Dir " << tok);
557 }
else B2INFO(
"cd failed " << tok);
563 TObject* obj = d->FindObject(tok);
565 if (obj->IsA()->InheritsFrom(
"TH1")) {
566 B2INFO(
"Histo " << histoname <<
" found in mem");
570 B2INFO(
"Histo " << histoname <<
" NOT found in mem");
576 B2INFO(
"Histo " << histoname <<
" not found");