9#include <dqm/analysis/modules/DQMHistAnalysisTOP.h>
10#include <boost/format.hpp>
11#include <boost/algorithm/string.hpp>
17#include <TProfile2D.h>
60 "boarstacks to be excluded from alarming. Names are given like '5c', '13d' etc.",
m_excludedBoardstacks);
65 "alarm levels for time distribution (residual fraction w.r.t reference plot)",
m_timingAlarmLevels);
75 B2DEBUG(20,
"DQMHistAnalysisTOP: Constructor done.");
84 if (
m_asicWindowsBand.size() != 2) B2ERROR(
"Parameter list 'asicWindowsBand' must contain two numbers");
85 if (
m_asicWindowsAlarmLevels.size() != 2) B2ERROR(
"Parameter list 'asicWindowsAlarmLevels' must contain two numbers");
88 if (
m_unpackerErrAlarmLevels.size() != 2) B2ERROR(
"Parameter list 'unpackerErrAlarmLevels' must contain two numbers");
89 if (
m_junkHitsAlarmLevels.size() != 2) B2ERROR(
"Parameter list 'junkHitsAlarmLevels' must contain two numbers");
91 if (
m_backgroundAlarmLevels.size() != 2) B2ERROR(
"Parameter list 'backgroundAlarmLevels' must contain two numbers");
93 if (
m_injectionBGAlarmLevels.size() != 2) B2ERROR(
"Parameter list 'injectionBGAlarmLevels' must contain two numbers");
94 if (
m_timingAlarmLevels.size() != 2) B2ERROR(
"Parameter list 'timingAlarmLevels' must contain two numbers");
95 if (
m_eventT0MeanAlarmLevels.size() != 2) B2ERROR(
"Parameter list 'eventT0MeanAlarmLevels' must contain two numbers");
96 if (
m_eventT0RmsAlarmLevels.size() != 2) B2ERROR(
"Parameter list 'eventT0RmsAlarmLevels' must contain two numbers");
97 if (
m_offsetMeanAlarmLevels.size() != 2) B2ERROR(
"Parameter list 'offsetMeanAlarmLevels' must contain two numbers");
98 if (
m_offsetRmsAlarmLevels.size() != 2) B2ERROR(
"Parameter list 'offsetRmsAlarmLevels' must contain two numbers");
103 for (
int slot = 1; slot <= 16; slot++) {
104 string slotstr = to_string(slot);
105 for (std::string bs : {
"a",
"b",
"c",
"d"}) {
153 m_windowMedian =
new TH1F(
"TOP/windowMedian",
"Asic windows (medians); slot number; median", 64, 1, 17);
162 m_deadFraction =
new TH1F(
"TOP/deadFraction",
"Fraction of dead channels in included boardstacks", 16, 0.5, 16.5);
165 m_hotFraction =
new TH1F(
"TOP/hotFraction",
"Fraction of hot channels in included boardstacks", 16, 0.5, 16.5);
168 m_excludedFraction =
new TH1F(
"TOP/excludedFraction",
"Fraction of hot and dead channels in excluded bordstacks", 16, 0.5, 16.5);
171 m_activeFraction =
new TH1F(
"TOP/activeFraction",
"Fraction of active channels", 16, 0.5, 16.5);
174 m_c_deadAndHot =
new TCanvas(
"TOP/c_deadAndHotChannels",
"c_deadAndHotChannels");
176 m_junkFraction =
new TH1F(
"TOP/junkFraction",
"Fraction of junk hits per boardstack", 64, 1, 17);
182 m_excludedBSHisto =
new TH1F(
"TOP/excludedBSHisto",
"Fraction of junk hits per boardstack", 64, 1, 17);
189 for (
int slot = 1; slot <= 16; slot++) {
190 string hname =
"TOP/pmtHitRates_" + to_string(slot);
191 string htitle =
"PMT hits per event for slot #" + to_string(slot);
192 auto* h =
new TH1F(hname.c_str(), htitle.c_str(), 32, 0.5, 32.5);
193 h->SetXTitle(
"PMT number");
194 h->SetYTitle(
"Number of good hits per event");
196 string cname =
"TOP/c_pmtHitRates_" + to_string(slot);
197 string ctitle =
"c_pmtHitRates_" + to_string(slot);
201 for (std::string name : {
202 "nhitInjLER",
"nhitInjHER",
"nhitInjLERcut",
"nhitInjHERcut",
203 "eventInjLER",
"eventInjHER",
"eventInjLERcut",
"eventInjHERcut"
205 for (std::string proj : {
"_px",
"_py"}) {
206 std::string cname =
"TOP/c_" + name + proj;
207 m_c_injBGs[cname] =
new TCanvas(cname.c_str(), (name + proj).c_str());
214 m_text1 =
new TPaveText(0.125, 0.8, 0.675, 0.88,
"NDC");
215 m_text1->SetFillColorAlpha(kWhite, 0);
217 m_text2 =
new TPaveText(0.55, 0.8, 0.85, 0.89,
"NDC");
218 m_text2->SetFillColorAlpha(kWhite, 0);
220 m_text3 =
new TPaveText(0.47, 0.8, 0.85, 0.89,
"NDC");
221 m_text3->SetFillColorAlpha(kWhite, 0);
223 m_text4 =
new TPaveText(0.125, 0.8, 0.675, 0.88,
"NDC");
224 m_text4->SetFillColorAlpha(kWhite, 0);
229 B2DEBUG(20,
"DQMHistAnalysisTOP: initialized.");
237 B2DEBUG(20,
"DQMHistAnalysisTOP: beginRun called.");
244 auto* rtype =
findHist(
"DQMInfo/rtype");
245 m_runType = rtype ? rtype->GetTitle() :
"";
249 auto* goodHitsPerEvent =
findHist(
"TOP/goodHitsPerEventAll");
250 m_numEvents = goodHitsPerEvent ? goodHitsPerEvent->GetEntries() : 0;
252 bool zeroSupp = gStyle->GetHistMinimumZero();
253 gStyle->SetHistMinimumZero(
true);
299 const auto* trackHits =
static_cast<TH2F*
>(
findHist(
"TOP/trackHits"));
301 for (
int slot = 1; slot <= 16; slot++) {
316 auto* injVetoFlagDiff =
static_cast<TH1F*
>(
findHist(
"TOP/injVetoFlagDiff"));
317 if (injVetoFlagDiff) injVetoFlagDiff->Scale(1 / injVetoFlagDiff->Integral(),
"nosw2");
332 gStyle->SetHistMinimumZero(zeroSupp);
341 m_monObj->setVariable(var.first, var.second);
342 B2DEBUG(20, var.first <<
" " << var.second);
345 B2DEBUG(20,
"DQMHistAnalysisTOP : endRun called");
351 B2DEBUG(20,
"terminate called");
357 int alarmState = c_Gray;
360 auto* hraw =
static_cast<TH2F*
>(
findHist(
"TOP/window_vs_slot"));
362 auto* px = hraw->ProjectionX(
"tmp_px");
364 if (px->GetNbinsX() == 64) {
368 band->Add(px, band, 1, -1);
369 double total = px->Integral();
370 double totalWindowFraction = (total != 0) ? band->Integral() / total : 0;
371 band->Divide(band, px);
376 m_text1->AddText(Form(
"Fraction outside red lines: %.2f %%", totalWindowFraction * 100.0));
384 auto* canvas =
findCanvas(
"TOP/c_window_vs_slot");
388 if (hraw) hraw->Draw();
391 canvas->Pad()->SetFrameFillColor(10);
401 int alarmState = c_Gray;
404 for (
int slot = 1; slot <= 16; slot++) {
405 std::string name =
"TOP/window_vs_asic_" + std::to_string(slot);
406 auto* h =
static_cast<TH2F*
>(
findHist(name));
408 for (
int bs = 1; bs <= 4; bs++) {
409 std::vector<double> longArray;
410 longArray.reserve(16 * h->GetNbinsY());
411 for (
int asic = 1; asic <= 16; asic++) {
412 int binX = (bs - 1) * 16 + asic;
413 for (
int binY = 1; binY <= h->GetNbinsY(); binY++) longArray.push_back(h->GetBinContent(binX, binY));
415 auto median = TMath::Median(longArray.size(), longArray.data(), 0, 0);
416 int bin = (slot - 1) * 4 + bs;
431 canvas->Pad()->SetFrameFillColor(10);
440 int alarmState = c_Gray;
444 auto* h =
findHist(
"TOP/BoolEvtMonitor");
447 double totalEvts = 0;
448 auto* evtMonitor =
dynamic_cast<TH2D*
>(h);
451 auto* tmp = evtMonitor->ProjectionX(
"tmp");
453 totalEvts = tmp->Integral();
460 badEvts = h->GetBinContent(2);
461 totalEvts = h->Integral();
464 double badRatio = badEvts / totalEvts;
466 m_text2->AddText(Form(
"Fraction: %.4f %%", badRatio * 100.0));
472 auto* canvas =
findCanvas(
"TOP/c_BoolEvtMonitor");
476 canvas->Pad()->SetFrameFillColor(10);
487 canvas->Pad()->SetFrameFillColor(10);
498 int alarmState = c_Gray;
500 auto* hist =
static_cast<TH1F*
>(
findHist(
"TOP/unpackErr"));
503 for (
int i = 1; i <= hist->GetNbinsX(); i++) {
504 hmax = std::max(hmax, hist->GetBinContent(i) - 3 * hist->GetBinError(i));
514 canvas->Pad()->SetFrameFillColor(10);
523 int alarmState = c_Gray;
529 auto* h =
static_cast<TH1F*
>(
findHist(
"TOP/goodHitsPerEventAll"));
531 xcut = h->GetBinCenter(h->GetMaximumBin()) + 900;
532 ymax = h->GetMaximum() / 2;
533 double totalEvts = h->GetEntries();
534 if (totalEvts > 1000) {
536 fract = h->Integral(h->FindBin(xcut), h->GetNbinsX() + 1) / totalEvts * 100;
538 m_text4->AddText(Form(
"Events w/ Injection BG: %.2f %%", fract));
545 auto* canvas =
findCanvas(
"TOP/c_goodHitsPerEventAll");
559 canvas->Pad()->SetFrameFillColor(10);
568 int alarmState = c_Gray;
570 auto* h =
static_cast<TH1F*
>(
findHist(
"TOP/eventT0"));
572 double totalEvts = h->GetEntries();
573 if (totalEvts > 100) {
574 double mean = h->GetMean();
575 double rms = h->GetRMS();
585 canvas->Pad()->SetFrameFillColor(10);
594 int alarmState = c_Gray;
596 auto* h =
static_cast<TH1F*
>(
findHist(
"TOP/bunchOffset"));
598 double totalEvts = h->GetEntries();
599 if (totalEvts > 100) {
600 double mean = h->GetMean();
601 double rms = h->GetRMS();
608 auto* canvas =
findCanvas(
"TOP/c_bunchOffset");
611 canvas->Pad()->SetFrameFillColor(10);
620 int alarmState = c_Gray;
622 auto* h =
static_cast<TH1F*
>(
findHist(
"TOP/goodHitTimes"));
623 auto* href =
static_cast<TH1F*
>(
findRefHist(
"TOP/goodHitTimes"));
625 double n = h->Integral();
626 double nref = href->Integral();
628 auto* h_clone =
static_cast<TH1F*
>(h->Clone(
"tmp"));
629 auto* href_clone =
static_cast<TH1F*
>(href->Clone(
"tmpref"));
630 h_clone->Scale(1 / n);
631 href_clone->Scale(1 / nref);
632 h_clone->Add(h_clone, href_clone, 1, -1);
635 for (
int i = 1; i <= h_clone->GetNbinsX(); i++) {
636 sumDiff += fabs(h_clone->GetBinContent(i));
637 errDiff += pow(h_clone->GetBinError(i), 2);
639 errDiff =
sqrt(errDiff);
640 if (sumDiff < 5 * errDiff) sumDiff = 0;
649 auto* canvas =
findCanvas(
"TOP/c_goodHitTimes");
652 canvas->Pad()->SetFrameFillColor(10);
660 if (h1->GetNbinsX() != h2->GetNbinsX())
return false;
661 if (h1->GetXaxis()->GetXmin() != h2->GetXaxis()->GetXmin())
return false;
662 if (h1->GetXaxis()->GetXmax() != h2->GetXaxis()->GetXmax())
return false;
672 double inactiveFract = 0;
674 for (
int slot = 1; slot <= 16; slot++) {
675 auto* h =
static_cast<TH1F*
>(
findHist(
"TOP/good_channel_hits_" + std::to_string(slot)));
679 double deadCut = cuts.first;
680 double hotCut = cuts.second;
681 double deadFract = 0;
683 double deadFractIncl = 0;
684 double hotFractIncl = 0;
685 for (
int chan = 0; chan < h->GetNbinsX(); chan++) {
686 double y = h->GetBinContent(chan + 1);
687 int bs = chan / 128 + (slot - 1) * 4;
691 if (included) deadFractIncl += 1;
692 }
else if (y > hotCut) {
694 if (included) hotFractIncl += 1;
697 deadFract /= h->GetNbinsX();
698 hotFract /= h->GetNbinsX();
699 deadFractIncl /= h->GetNbinsX();
700 hotFractIncl /= h->GetNbinsX();
703 m_excludedFraction->SetBinContent(slot, deadFract - deadFractIncl + hotFract - hotFractIncl);
705 inactiveFract = std::max(inactiveFract, deadFractIncl + hotFractIncl);
710 int alarmState = c_Gray;
735 canvas->Pad()->SetFrameFillColor(10);
737 m_stack =
new THStack(
"TOP/stack",
"Fraction of dead and hot channels");
748 m_legend =
new TLegend(0.8, 0.87, 0.99, 0.99);
766 canvas->Pad()->SetFrameFillColor(10);
772 auto* signalHits =
static_cast<TProfile*
>(
findHist(
"TOP/signalHits"));
773 if (not signalHits)
return;
775 auto* backgroundHits =
static_cast<TProfile*
>(
findHist(
"TOP/backgroundHits"));
776 if (not backgroundHits)
return;
782 auto* activeFract =
static_cast<TH1F*
>(activeFraction->Clone(
"tmp"));
783 for (
int i = 1; i <= activeFract->GetNbinsX(); i++) activeFract->SetBinError(i, 0);
789 int alarmState = c_Gray;
790 if (signalHits->GetEntries() > 0 and activeFraction->Integral() > 0) {
793 if (signalHits->GetBinEntries(i) < 10)
continue;
819 if (backgroundHits->GetEntries() > 100 and activeFraction->Integral() > 0) {
825 double error = fun->GetParError(0);
856 for (
int slot = 1; slot <= 16; slot++) {
857 auto* good =
static_cast<TH1F*
>(
findHist(
"TOP/good_channel_hits_" + std::to_string(slot)));
858 if (not good)
continue;
859 auto* bad =
static_cast<TH1F*
>(
findHist(
"TOP/bad_channel_hits_" + std::to_string(slot)));
860 if (not bad)
continue;
861 for (
int i = 0; i < 512; i++) {
863 allHits->Fill(slot + bs / 4.0, good->GetBinContent(i + 1) + bad->GetBinContent(i + 1));
870 int alarmState = c_Gray;
871 if (allHits->Integral() > 0) {
886 canvas->Pad()->SetFrameFillColor(10);
902 double totalHits = 0;
903 std::vector<TH2F*> histos;
904 for (
int slot = 1; slot <= 16; slot++) {
905 TH2F* h =
static_cast<TH2F*
>(
findHist(name + std::to_string(slot)));
908 totalHits += h->Integral();
910 if (histos.empty())
return;
911 double average = totalHits / 512 / histos.size();
913 for (
auto* h : histos) h->GetZaxis()->SetRangeUser(0, std::max(average * scale, 1.0));
920 if (not canvas)
return;
922 auto* h =
static_cast<TH1F*
>(
findHist(
"TOP/" + name));
925 auto* hb =
static_cast<TH1F*
>(
findHist(
"TOP/" + name +
"BG"));
930 double s = (slot == 0) ? trackHits->Integral(1, 16, 2, 2) : trackHits->GetBinContent(slot, 2);
932 double sb = (slot == 0) ? trackHits->Integral(1, 16, 1, 1) : trackHits->GetBinContent(slot, 1);
934 h->Add(h, hb, 1, -s / sb);
937 int i0 = h->GetXaxis()->FindBin(0.);
938 double s = h->Integral(1, i0);
940 double sb = hb->Integral(1, i0);
942 if (s / sb > 1)
return;
943 h->Add(h, hb, 1, -s / sb);
946 TString title = TString(h->GetTitle()) +
" (BG subtracted)";
958 auto* h0 =
static_cast<TH1F*
>(
findHist(
"TOP/goodHitsPerEventAll"));
960 double numEvents = h0->GetEntries();
961 if (numEvents == 0)
return;
964 for (
int slot = 1; slot <= numSlots; slot++) {
965 string name =
"TOP/good_hits_xy_" + to_string(slot);
966 auto* hxy =
static_cast<TH2F*
>(
findHist(name));
967 if (not hxy)
continue;
968 std::vector<double> pmts(32, 0);
969 for (
int row = 0; row < 8; row++) {
970 for (
int col = 0; col < 64; col++) {
971 int pmt = col / 4 + (row / 4) * 16;
972 pmts[pmt] += hxy->GetBinContent(col + 1, row + 1);
976 for (
size_t i = 0; i < pmts.size(); i++) {
977 h->SetBinContent(i + 1, pmts[i] / numEvents);
991 for (std::string name : {
"nhitInjLER",
"nhitInjHER",
"nhitInjLERcut",
"nhitInjHERcut"}) {
992 std::string hname =
"TOP/" + name;
993 auto* h =
static_cast<TProfile2D*
>(
findHist(hname));
995 for (std::string proj : {
"_px",
"_py"}) {
996 std::string cname =
"TOP/c_" + name + proj;
998 if (not canvas)
continue;
1002 if (hproj)
delete hproj;
1003 hproj = (proj ==
"_px") ? h->ProfileX((hname + proj).c_str()) : h->ProfileY((hname + proj).c_str());
1004 std::string xtitle = (proj ==
"_px") ? h->GetXaxis()->GetTitle() : h->GetYaxis()->GetTitle();
1005 hproj->SetXTitle(xtitle.c_str());
1006 hproj->SetYTitle(h->GetZaxis()->GetTitle());
1007 hproj->SetMinimum(0);
1008 hproj->Draw(
"hist");
1013 for (std::string name : {
"eventInjLER",
"eventInjHER",
"eventInjLERcut",
"eventInjHERcut"}) {
1014 std::string hname =
"TOP/" + name;
1015 auto* h =
static_cast<TH2F*
>(
findHist(hname));
1016 if (not h)
continue;
1017 for (std::string proj : {
"_px",
"_py"}) {
1018 std::string cname =
"TOP/c_" + name + proj;
1020 if (not canvas)
continue;
1024 if (hproj)
delete hproj;
1025 hproj = (proj ==
"_px") ? h->ProjectionX((hname + proj).c_str()) : h->ProjectionY((hname + proj).c_str());
1026 std::string xtitle = (proj ==
"_px") ? h->GetXaxis()->GetTitle() : h->GetYaxis()->GetTitle();
1027 hproj->SetXTitle(xtitle.c_str());
1028 hproj->SetYTitle(h->GetZaxis()->GetTitle());
1029 hproj->SetMinimum(0);
1030 hproj->Draw(
"hist");
1039 if (histogram)
delete histogram;
1040 auto* h =
static_cast<TH2F*
>(
findHist(hname));
1043 histogram = h->ProjectionX((hname +
"Fract").c_str(), 2, 2);
1044 auto* px = h->ProjectionX(
"tmp");
1045 histogram->Divide(histogram, px, 1, 1,
"B");
1047 histogram->SetTitle(TString(h->GetTitle()) +
" is set");
1048 histogram->SetYTitle(
"fraction of events");
1049 histogram->SetMarkerStyle(24);
1050 histogram->SetMinimum(0);
1052 if (not canvas)
return;
1062 for (
int slot = 1; slot <= 16; slot++) {
1063 auto vname = variableName + std::to_string(slot);
1064 double value = histogram ? histogram->GetBinContent(slot) : 0;
1075 if (value < alarmLevels[0])
return c_Green;
1076 else if (value < alarmLevels[1])
return c_Yellow;
1079 if (value < alarmLevels[0])
return c_Red;
1080 else if (value < alarmLevels[1])
return c_Yellow;
1081 else return c_Green;
1087 std::vector<TLine*>& alarmLines,
bool bigRed)
1089 std::vector<int> colors = {kOrange, kRed};
1090 if (not bigRed) std::reverse(colors.begin(), colors.end());
1091 for (
size_t i = 0; i < std::min(colors.size(), alarmLevels.size()); i++) {
1092 if (i < alarmLines.size()) {
1093 auto* line = alarmLines[i];
1096 line->SetY1(alarmLevels[i]);
1097 line->SetY2(alarmLevels[i]);
1099 auto* line =
new TLine(xmin, alarmLevels[i], xmax, alarmLevels[i]);
1100 line->SetLineWidth(2);
1101 line->SetLineStyle(2);
1102 line->SetLineColor(colors[i]);
1103 alarmLines.push_back(line);
1118 auto* line =
new TLine(1, y, 17, y);
1119 line->SetLineWidth(2);
1120 line->SetLineColor(kRed);
1134 std::vector<double> binContents;
1135 for (
int k = 1; k <= h->GetNbinsY(); k++) {
1136 for (
int i = 1; i <= h->GetNbinsX(); i++) {
1137 binContents.push_back(h->GetBinContent(i, k));
1142 double rms = h->GetMaximum();
1143 for (
int iter = 0; iter < 5; iter++) {
1147 for (
auto y : binContents) {
1148 if (y == 0 or fabs(y - mean) > 3 * rms)
continue;
1153 if (n == 0)
continue;
1155 rms =
sqrt(sumyy / n - mean * mean);
1158 return std::make_pair(mean / 5, std::max(mean * 2, mean + 6 * rms));
1164 int badBoardstacks = 0;
1165 int badCarriers = 0;
1167 for (
int slot = 1; slot <= 16; slot++) {
1168 std::string hname =
"TOP/good_hits_asics_" + to_string(slot);
1169 auto* h =
static_cast<TH2F*
>(
findHist(hname));
1170 if (not h)
continue;
1173 double deadCut = cuts.first;
1174 double hotCut = cuts.second;
1175 std::vector<int> asics(64, 0);
1176 std::vector<int> carriers(16, 0);
1177 std::vector<int> boardstacks(4, 0);
1178 for (
int asic = 0; asic < 64; asic++) {
1179 int carrier = asic / 4;
1180 int boardstack = carrier / 4;
1181 for (
int chan = 0; chan < 8; chan++) {
1182 double y = h->GetBinContent(asic + 1, chan + 1);
1183 if (y > deadCut and y <= hotCut) {
1185 carriers[carrier]++;
1186 boardstacks[boardstack]++;
1190 for (
int n : asics)
if (n == 0) badAsics++;
1191 for (
int n : carriers)
if (n == 0) badCarriers++;
1192 for (
int n : boardstacks)
if (n == 0) badBoardstacks++;
1194 badAsics -= badCarriers * 4;
1195 badCarriers -= badBoardstacks * 4;
1198 for (
int slot = 1; slot <= 16; slot++) {
1199 std::string hname =
"TOP/good_hits_xy_" + to_string(slot);
1200 auto* h =
static_cast<TH2F*
>(
findHist(hname));
1201 if (not h)
continue;
1204 double deadCut = cuts.first;
1205 double hotCut = cuts.second;
1206 std::vector<int> pmts(32, 0);
1207 for (
int row = 0; row < 8; row++) {
1208 for (
int col = 0; col < 64; col++) {
1209 double y = h->GetBinContent(col + 1, row + 1);
1210 if (y > deadCut and y <= hotCut) {
1211 int pmt = col / 4 + (row / 4) * 16;
1216 for (
int n : pmts)
if (n == 0) badPMTs++;
1218 badPMTs -= badBoardstacks * 8;
1220 setEpicsPV(
"badBoardstacks", badBoardstacks);
1230 B2DEBUG(20,
"badBoardstacks: " << badBoardstacks);
1231 B2DEBUG(20,
"badCarriers: " << badCarriers);
1232 B2DEBUG(20,
"badAsics: " << badAsics);
1233 B2DEBUG(20,
"badPMTs: " << badPMTs);
1234 B2DEBUG(20,
"excludedBS: " << numBS);
1267 bool status =
false;
1273 for (
auto c : excludedBS) {
1274 if (isspace(c))
continue;
1275 else if (ispunct(c)) {
1276 if (not name.empty()) {
1280 }
else name.push_back(c);
1282 if (not name.empty()) {
1307 if (ss.size() > 2) {ss.pop_back(); ss.pop_back();}
1308 B2DEBUG(20,
"excludedBoardstacks: [" << ss <<
"]");
1317 for (
const auto& bsname : excludedBoardstacks) {
1320 else B2ERROR(
"Invalid boardstack name: " << bsname);
1327 if (not canvas)
return;
static TCanvas * findCanvas(TString cname)
Find canvas by name.
static TH1 * findRefHist(const std::string &histname, ERefScaling scaling=ERefScaling::c_RefScaleNone, const TH1 *hist=nullptr)
Get referencehistogram from list (no other search).
int registerEpicsPV(const std::string &pvname, const std::string &keyname="")
EPICS related Functions.
static MonitoringObject * getMonitoringObject(const std::string &name)
Get MonitoringObject with given name (new object is created if non-existing)
static TH1 * findHist(const std::string &histname, bool onlyIfUpdated=false)
Get histogram from list (no other search).
DQMHistAnalysisModule()
Constructor / Destructor.
std::string getEpicsStringPV(const std::string &keyname, bool &status)
Read value from a EPICS PV.
bool requestLimitsFromEpicsPVs(chid id, double &lowerAlarm, double &lowerWarn, double &upperWarn, double &upperAlarm)
Get Alarm Limits from EPICS PV.
void setEpicsPV(const std::string &keyname, double value)
Write value to a EPICS PV.
void updateEventMonitorCanvas()
Updates canvas of event desynchronization monitor w/ alarming.
TCanvas * m_c_evtMonitorFract
Canvas: fractions of de-synchronized hits.
TH1D * m_skipProcFlagFract
fraction of events w/ skip processing flag set vs.
std::vector< int > m_asicWindowsBand
lower and upper bin of a band denoting good windows
void updateWindowMedianCanvas()
Updates canvas of window_vs_slot median w/ alarming.
static void setZAxisRange(const std::string &name, double scale)
Sets z-axis range of 2D histograms.
TCanvas * m_c_photonYields
Canvas: photon yields per slot.
std::vector< double > m_offsetRmsAlarmLevels
alarm levels for r.m.s.
void initialize() override final
Initializer.
void makePMTHitRatesPlots()
Makes plots of the number of PMT hits per event.
TH1F * m_excludedFraction
fraction of dead and hot channels per slot in excluded boardstacks only
void updateEventT0Canvas()
Updates canvas of event T0 w/ alarming.
std::vector< double > m_deadChannelsAlarmLevels
alarm levels for the fraction of dead + hot channels
std::vector< double > m_asicWindowsAlarmLevels
alarm levels for fraction of windows outside the band
TPaveText * m_text2
text to be written to event desynchonization monitor
TCanvas * m_c_junkFraction
Canvas: fraction of junk hits per boardstack.
THStack * m_stack
stack for drawing dead, hot and active channel fractions
const TH1F * makeDeadAndHotFractionsPlot()
Makes a plot of dead and hot channel fractions per slot.
static void makeBGSubtractedTimingPlot(const std::string &name, const TH2F *trackHits, int slot)
Makes background subtracted time distribution plot.
void updateTimingCanvas()
Updates canvas of timing plot w/ alarming.
void updateUnpackerErrCanvas()
Updates canvas of unpacker errors w/ alarming.
TPaveText * m_text3
text to be written to background rates
std::vector< TLine * > m_deadChannelsAlarmLines
lines representing alarm levels
std::vector< TCanvas * > m_c_pmtHitRates
Canvases of PMT hits per event (index = slot - 1)
int m_alarmStateOverall
overall alarm state of histograms to be sent by EpicsPV
TPaveText * m_text1
text to be written to window_vs_slot
std::vector< TLine * > m_photonYieldsAlarmLines
lines representing alarm levels
static std::pair< double, double > getDeadAndHotCuts(const TH1 *h)
Returns cut levels for dead and hot channels.
std::vector< double > m_offsetMeanAlarmLevels
alarm levels for mean of bunch offset [ns]
std::vector< bool > m_includedBoardstacks
boardstacks included in alarming
TH1D * m_evtMonitorFract
fractions of de-synchronized hits
static bool sameHistDefinition(TH1 *h1, TH1 *h2)
Checks if histograms are defined in the same way (nbins, xmin, xmax)
TPaveText * m_text4
text to be written to number of good hits per event
std::string m_pvPrefix
Epics PV prefix.
TH1D * m_photonYields
photon yields per slot
TH1D * m_backgroundRates
background rates per slot
TCanvas * m_c_windowMedian
Canvas: window_vs_slot medians.
MonitoringObject * m_monObj
MiraBelle monitoring object.
TCanvas * m_c_backgroundRates
Canvas: background rates per slot.
std::map< std::string, TCanvas * > m_c_injBGs
Canvases for projections of injection BG histograms.
std::vector< double > m_eventMonitorAlarmLevels
alarm levels for fraction of desynchronized digits
static void makeFlagFractPlot(const std::string &hname, TH1 *histogram, TCanvas *canvas)
Makes a plot of fraction of events with the flag is set.
void terminate() override final
This method is called at the end of the event processing.
std::map< std::string, double > m_mirabelleVariables
variables for MiraBelle
void setAlarmLines()
Sets all alarm lines.
TH1F * m_activeFraction
fraction of active channels per slot
int getAlarmColor(unsigned alarmState) const
Converts alarm state to color.
std::vector< double > m_eventT0MeanAlarmLevels
alarm levels for mean of event T0 [ns]
void event() override final
This method is called for each event.
std::string m_runType
Run type.
void makeInjectionBGPlots()
Makes projections of injection BG plots.
static void setGridX(const std::string &canvasName)
Sets grid x on the canvas.
std::vector< double > m_photonYieldsAlarmLevels
alarm levels for the number of photons per track
TCanvas * m_c_skipProcFlagFract
Canvas: fraction of events w/ skip processing flag set vs.
TCanvas * m_c_injVetoFlagFract
Canvas: fraction of events w/ injection veto flag set vs.
std::vector< TLine * > m_junkHitsAlarmLines
lines representing alarm levels
void setIncludedBoardstacks(const std::vector< std::string > &excludedBoardstacks)
Sets flags for boardstacks to be included in alarming.
std::vector< double > m_injectionBGAlarmLevels
alarm levels for injection background (in % of events)
TH1F * m_deadFraction
fraction of dead channels per slot (included boardstacks only)
double m_averageRate
average BG rate (to pass to EpicsPV)
TH1F * m_hotFraction
fraction of hot channels per slot (included boardstacks only)
std::vector< std::string > m_excludedBoardstacks
list of boarstacks to be excluded from alarming
void makePhotonYieldsAndBGRatePlots(const TH1F *activeFraction)
Make plots of dead-and-hot-channel corrected photon yields and BG rates per slot.
TH1F * m_junkFraction
fraction of junk hits per boardstack
void endRun() override final
This method is called if the current run ends.
int getAlarmState(double value, const std::vector< double > &alarmLevels, bool bigRed=true) const
Returns alarm state.
TH1F * m_windowMedian
window_vs_slot medians
std::vector< double > m_eventT0RmsAlarmLevels
alarm levels for r.m.s.
std::vector< TLine * > m_asicWindowsBandLines
lines denoting a band of good windows
void makeJunkFractionPlot()
Makes a plot of fractions of junk hits per boardstack.
std::vector< double > m_windowMedianAlarmLevels
alarm levels for window_vs_slot medians
void beginRun() override final
Called when entering a new run.
TLegend * m_legend
legend for dead and hot channels
TCanvas * m_c_deadAndHot
Canvas: fractin of dead and hot channels.
std::vector< TLine * > m_backgroundAlarmLines
lines representing alarm levels
std::vector< double > m_unpackerErrAlarmLevels
alarm levels for the fraction of unpacker errors
DQMHistAnalysisTOPModule()
Constructor.
void updateWindowVsSlotCanvas()
Updates canvas of window_vs_slot w/ alarming.
TH1D * m_injVetoFlagFract
fraction of events w/ injection veto flag set vs.
double m_numEvents
number of events processed with TOPDQM module
std::map< std::string, int > m_bsmap
a map of boardstack names to ID's
std::vector< double > m_backgroundAlarmLevels
alarm levels for background rates [MHz/PMT]
std::map< std::string, TH1D * > m_projections
projections of injection BG
void updateBunchOffsetCanvas()
Updates canvas of bunch offset w/ alarming.
void setEpicsVariables()
Calculates and sets epics variables.
std::vector< double > m_junkHitsAlarmLevels
alarm levels for the fraction of junk hits
bool m_IsNullRun
Run type flag for null runs.
void updateNGoodHitsCanvas()
Updates canvas of number of good hits per event w/ alarming (injection BG)
TLine * m_injBGCutLine
a line denoting the cut on the number of hits for injection BG counting
std::vector< double > m_timingAlarmLevels
alarm levels for time distribution (fraction of area difference)
int getOffcialAlarmStatus(unsigned alarmState) const
Converts alarm state to official status (see EStatus of the base class)
std::vector< TH1F * > m_pmtHitRates
histograms of PMT hits per event (index = slot - 1)
TH1F * m_excludedBSHisto
histogram to show excluded boardstacks on junk fraction plot
std::map< std::string, TProfile * > m_profiles
profiles of injection BG
void updateLimits()
Updates limits defined by module parameters using EpicsPVs.
void setMiraBelleVariables(const std::string &variableName, const TH1 *histogram)
Sets MiraBelle variables from the histogram with bins corresponding to slot numbers.
void setDescription(const std::string &description)
Sets the description of the module.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
double sqrt(double a)
sqrt for double
Abstract base class for different kinds of events.