19 #include <dqm/analysis/modules/DQMHistAnalysisECL.h>
21 #include <boost/format.hpp>
35 B2DEBUG(20,
"DQMHistAnalysisECL: Constructor done.");
37 m_WaveformOption = {
"psd",
"logic",
"rand",
"dphy",
"other"};
39 addParam(
"HitMapThresholds", m_HitMapThresholds,
"Thresholds to display hit map, MeV", std::vector<double> {0, 5, 10, 50});
40 addParam(
"WaveformOption", m_WaveformOption,
"Option (all,psd,logic,rand,dphy) to display waveform flow",
42 addParam(
"CrateTimeOffsetsMax", m_CrateTimeOffsetsMax,
"Maximum boundary for crate time offsets", 20.);
43 addParam(
"LogicTestMax", m_LogicTestMax,
" Maximum of fails for logic test", 50);
52 B2DEBUG(20,
"DQMHistAnalysisECL: initialized.");
66 std::string canvas_name = str(boost::format(
"ECL/c_cid_Thr%1%MeV_analysis") %
id);
67 TCanvas* canvas =
new TCanvas(canvas_name.c_str());
73 std::string canvas_name = str(boost::format(
"ECL/c_wf_cid_%1%_analysis") %
id);
74 TCanvas* canvas =
new TCanvas(canvas_name.c_str());
88 m_lower_boundary_time_offsets =
new TLine(0, -20, 52, -20);
89 m_lower_boundary_time_offsets->SetLineWidth(3);
90 m_lower_boundary_time_offsets->SetLineColor(kBlue);
92 m_upper_boundary_time_offsets =
new TLine(0, 20, 52, 20);
93 m_upper_boundary_time_offsets->SetLineWidth(3);
94 m_upper_boundary_time_offsets->SetLineColor(kBlue);
100 h_crate_time_offsets->SetTitle(
"Crate time offset (E > 1 GeV); Crate ID (same as ECLCollector ID); Time offset [ns]");
106 h_logic_summary =
new TH2F(
"logic_summary",
"FPGA <-> C++ fitter inconsistencies count", 52, 1, 53, 12, 1, 13);
107 h_logic_summary->SetTitle(
"FPGA <-> C++ fitter inconsistencies count; ECLCollector ID (same as Crate ID); Shaper ID inside the crate");
110 for (
unsigned short i = 0; i < 52; i++)
h_logic_summary->GetXaxis()->SetBinLabel(i + 1, std::to_string(i + 1).c_str());
111 for (
unsigned short i = 0; i < 12; i++)
h_logic_summary->GetYaxis()->SetBinLabel(i + 1, std::to_string(i + 1).c_str());
118 B2DEBUG(20,
"DQMHistAnalysisECL: beginRun called.");
127 for (
unsigned short i = 0; i < h->GetNbinsX(); i++) {
128 Double_t entries = h->GetBinContent(i + 1);
129 Double_t error = h->GetBinError(i + 1);
131 h->SetBinContent(i + 1, entries / weight);
132 h->SetBinError(i + 1, error / weight);
144 B2DEBUG(20,
"DQMHistAnalysisECL: event called");
147 gStyle->SetPalette(1);
154 TH1* h_quality =
findHist(
"ECL/quality");
155 if (h_quality != NULL) {
156 h_quality->SetMinimum(0.1);
167 TH1* h_quality_other =
findHist(
"ECL/quality_other");
168 if (h_quality_other != NULL) {
169 h_quality_other->SetMinimum(0.1);
170 h_quality_other->Draw();
177 TH1* h_evtot =
findHist(
"ECL/event");
178 if (h_evtot != NULL) {
179 Double_t events = h_evtot->GetBinContent(1);
187 if (val !=
"psd" && val !=
"other") {
188 TH1* h_evtot_norm =
findHist(str(boost::format(
"ECL/event_%1%") % val));
189 if (h_evtot_norm != NULL) {
190 Double_t events = h_evtot_norm->GetBinContent(1);
192 str(boost::format(
"ECL/wf_cid_%1%") % val), events);
194 }
else if (val ==
"psd") {
197 TH1* h_psd =
findHist(str(boost::format(
"ECL/wf_cid_%1%") % val));
198 TH1* h_psd_norm =
findHist(str(boost::format(
"ECL/%1%_cid") % val));
199 if (h_psd != NULL && h_psd_norm != NULL) {
200 h_psd->Divide(h_psd, h_psd_norm);
215 TH1* h_trigtag1 =
findHist(
"ECL/trigtag1");
216 if (h_trigtag1 != NULL) {
217 h_trigtag1->SetMinimum(0.1);
229 TH1* h_adc_hits =
findHist(
"ECL/adc_hits");
230 if (h_adc_hits != NULL) {
231 h_adc_hits->SetMinimum(0.1);
244 TH1* h_ampfail_quality =
findHist(
"ECL/ampfail_quality");
245 if (h_ampfail_quality != NULL) {
246 h_ampfail_quality->SetMinimum(0.1);
247 h_ampfail_quality->Draw();
248 for (
unsigned short i = 1; i < 5; i++) {
249 if (h_ampfail_quality->GetBinContent(i + 1)) {
265 TH1* h_timefail_quality =
findHist(
"ECL/timefail_quality");
266 if (h_timefail_quality != NULL) {
267 h_timefail_quality->SetMinimum(0.1);
268 h_timefail_quality->Draw();
269 for (
unsigned short i = 1; i < 5; i++) {
270 if (h_timefail_quality->GetBinContent(i + 1)) {
286 TH1* h_trigtag2_trigid =
findHist(
"ECL/trigtag2_trigid");
287 if (h_trigtag2_trigid != NULL) {
288 h_trigtag2_trigid->Draw();
289 for (
unsigned short i = 0; i < 52; i++) {
290 if (h_trigtag2_trigid->GetBinContent(h_trigtag2_trigid->GetBin(i + 1, 3))) {
308 TH1* h_quality_fit_data =
findHist(
"ECL/quality_fit_data");
309 if (h_quality_fit_data != NULL) {
310 h_quality_fit_data->Draw();
311 for (
unsigned short i = 0; i < 4; i++) {
312 for (
unsigned short j = 0; j < 4; j++) {
313 if (h_quality_fit_data->GetBinContent(h_quality_fit_data->GetBin(i + 1, j + 1)) > 0) {
330 for (
unsigned short i = 0; i < 52; i++) {
331 std::string h_title =
"ECL/time_crate_" + std::to_string(i + 1) +
"_Thr1GeV";
341 }
else m_low.push_back(i + 1);
355 for (
unsigned short i = 0; i < 52; i++)
h_crate_time_offsets->GetXaxis()->SetBinLabel(i + 1, std::to_string(i + 1).c_str());
360 if (!
m_low.empty()) {
361 auto tg =
new TLatex(5, 40,
"Low statistics");
362 tg->SetTextSize(.06);
363 tg->SetTextAlign(12);
366 if (
m_low.size() < 52) {
367 std::ostringstream sstream;
368 std::copy(
m_low.begin(),
m_low.end() - 1, std::ostream_iterator<short>(sstream,
","));
369 sstream <<
m_low.back();
370 std::string str =
"Crates: " + sstream.str();
371 auto tg1 =
new TLatex(5, 30, str.c_str());
372 tg1->SetTextSize(.03);
373 tg1->SetTextAlign(12);
376 auto tg1 =
new TLatex(5, 30,
"All crates");
377 tg1->SetTextSize(.06);
378 tg1->SetTextAlign(12);
383 m_lower_boundary_time_offsets->Draw();
384 m_upper_boundary_time_offsets->Draw();
395 TH1* h_fail_crateid =
findHist(
"ECL/fail_crateid");
396 TH1* h_fail_shaperid =
findHist(
"ECL/fail_shaperid");
397 if (h_fail_crateid != NULL && h_fail_shaperid != NULL) {
398 for (
unsigned short i = 0; i < 52; i++) {
399 if (h_fail_crateid->GetBinContent(i + 1)) {
400 for (
unsigned short j = i * 12; j < i * 12 + 12; j++) {
401 if (h_fail_shaperid->GetBinContent(j + 1)) {
402 unsigned short shaper = (j + 1) - 12 * i;
427 B2DEBUG(20,
"DQMHistAnalysisECL: endRun called");
433 B2DEBUG(20,
"terminate called");
445 delete m_lower_boundary_time_offsets;
446 delete m_upper_boundary_time_offsets;