10 #include <dqm/analysis/modules/DQMHistAnalysisECL.h>
12 #include <boost/format.hpp>
26 B2DEBUG(20,
"DQMHistAnalysisECL: Constructor done.");
28 m_WaveformOption = {
"psd",
"logic",
"rand",
"dphy",
"other"};
30 addParam(
"HitMapThresholds", m_HitMapThresholds,
"Thresholds to display hit map, MeV", std::vector<double> {0, 5, 10, 50});
31 addParam(
"WaveformOption", m_WaveformOption,
"Option (all,psd,logic,rand,dphy) to display waveform flow",
33 addParam(
"CrateTimeOffsetsMax", m_CrateTimeOffsetsMax,
"Maximum boundary for crate time offsets", 20.);
34 addParam(
"LogicTestMax", m_LogicTestMax,
" Maximum of fails for logic test", 50);
43 B2DEBUG(20,
"DQMHistAnalysisECL: initialized.");
57 std::string canvas_name = str(boost::format(
"ECL/c_cid_Thr%1%MeV_analysis") %
id);
58 TCanvas* canvas =
new TCanvas(canvas_name.c_str());
64 std::string canvas_name = str(boost::format(
"ECL/c_wf_cid_%1%_analysis") %
id);
65 TCanvas* canvas =
new TCanvas(canvas_name.c_str());
91 h_crate_time_offsets->SetTitle(
"Crate time offset (E > 1 GeV); Crate ID (same as ECLCollector ID); Time offset [ns]");
97 h_logic_summary =
new TH2F(
"logic_summary",
"FPGA <-> C++ fitter inconsistencies count", 52, 1, 53, 12, 1, 13);
98 h_logic_summary->SetTitle(
"FPGA <-> C++ fitter inconsistencies count; ECLCollector ID (same as Crate ID); Shaper ID inside the crate");
101 for (
unsigned short i = 0; i < 52; i++)
h_logic_summary->GetXaxis()->SetBinLabel(i + 1, std::to_string(i + 1).c_str());
102 for (
unsigned short i = 0; i < 12; i++)
h_logic_summary->GetYaxis()->SetBinLabel(i + 1, std::to_string(i + 1).c_str());
109 B2DEBUG(20,
"DQMHistAnalysisECL: beginRun called.");
118 for (
unsigned short i = 0; i < h->GetNbinsX(); i++) {
119 Double_t entries = h->GetBinContent(i + 1);
120 Double_t error = h->GetBinError(i + 1);
122 h->SetBinContent(i + 1, entries / weight);
123 h->SetBinError(i + 1, error / weight);
135 B2DEBUG(20,
"DQMHistAnalysisECL: event called");
138 gStyle->SetPalette(1);
145 TH1* h_quality =
findHist(
"ECL/quality");
146 if (h_quality != NULL) {
147 h_quality->SetFillColor(kPink - 4);
148 h_quality->SetDrawOption(
"hist");
149 h_quality->SetMinimum(0.1);
150 h_quality->Draw(
"hist");
160 TH1* h_quality_other =
findHist(
"ECL/quality_other");
161 if (h_quality_other != NULL) {
162 h_quality_other->SetMinimum(0.1);
163 h_quality_other->SetFillColor(kPink - 4);
164 h_quality_other->Draw(
"hist");
171 TH1* h_evtot =
findHist(
"ECL/event");
172 if (h_evtot != NULL) {
173 Double_t events = h_evtot->GetBinContent(1);
181 if (val !=
"psd" && val !=
"other") {
182 TH1* h_evtot_norm =
findHist(str(boost::format(
"ECL/event_%1%") % val));
183 if (h_evtot_norm != NULL) {
184 Double_t events = h_evtot_norm->GetBinContent(1);
186 str(boost::format(
"ECL/wf_cid_%1%") % val), events);
188 }
else if (val ==
"psd") {
191 TH1* h_psd =
findHist(str(boost::format(
"ECL/wf_cid_%1%") % val));
192 TH1* h_psd_norm =
findHist(str(boost::format(
"ECL/%1%_cid") % val));
193 if (h_psd != NULL && h_psd_norm != NULL) {
194 h_psd->Divide(h_psd, h_psd_norm);
209 TH1* h_trigtag1 =
findHist(
"ECL/trigtag1");
210 if (h_trigtag1 != NULL) {
211 h_trigtag1->SetMinimum(0.1);
212 h_trigtag1->Draw(
"hist");
223 TH1* h_adc_hits =
findHist(
"ECL/adc_hits");
224 if (h_adc_hits != NULL) {
225 h_adc_hits->SetMinimum(0.1);
226 h_adc_hits->Draw(
"hist");
238 TH1* h_ampfail_quality =
findHist(
"ECL/ampfail_quality");
239 if (h_ampfail_quality != NULL) {
240 h_ampfail_quality->SetMinimum(0.1);
241 h_ampfail_quality->Draw(
"hist");
242 for (
unsigned short i = 1; i < 5; i++) {
243 if (h_ampfail_quality->GetBinContent(i + 1)) {
259 TH1* h_timefail_quality =
findHist(
"ECL/timefail_quality");
260 if (h_timefail_quality != NULL) {
261 h_timefail_quality->SetMinimum(0.1);
262 h_timefail_quality->Draw(
"hist");
263 for (
unsigned short i = 1; i < 5; i++) {
264 if (h_timefail_quality->GetBinContent(i + 1)) {
280 TH1* h_trigtag2_trigid =
findHist(
"ECL/trigtag2_trigid");
281 if (h_trigtag2_trigid != NULL) {
282 h_trigtag2_trigid->Draw(
"colz");
283 for (
unsigned short i = 0; i < 52; i++) {
284 if (h_trigtag2_trigid->GetBinContent(h_trigtag2_trigid->GetBin(i + 1, 3))) {
302 TH1* h_quality_fit_data =
findHist(
"ECL/quality_fit_data");
303 if (h_quality_fit_data != NULL) {
304 h_quality_fit_data->Draw(
"hist");
305 for (
unsigned short i = 0; i < 4; i++) {
306 for (
unsigned short j = 0; j < 4; j++) {
307 if (h_quality_fit_data->GetBinContent(h_quality_fit_data->GetBin(i + 1, j + 1)) > 0) {
324 for (
unsigned short i = 0; i < 52; i++) {
325 std::string h_title =
"ECL/time_crate_" + std::to_string(i + 1) +
"_Thr1GeV";
335 }
else m_low.push_back(i + 1);
349 for (
unsigned short i = 0; i < 52; i++)
h_crate_time_offsets->GetXaxis()->SetBinLabel(i + 1, std::to_string(i + 1).c_str());
354 if (!
m_low.empty()) {
355 auto tg =
new TLatex(5, 40,
"Low statistics");
356 tg->SetTextSize(.06);
357 tg->SetTextAlign(12);
360 if (
m_low.size() < 52) {
361 std::ostringstream sstream;
362 std::copy(
m_low.begin(),
m_low.end() - 1, std::ostream_iterator<short>(sstream,
","));
363 sstream <<
m_low.back();
364 std::string str =
"Crates: " + sstream.str();
365 auto tg1 =
new TLatex(5, 30, str.c_str());
366 tg1->SetTextSize(.03);
367 tg1->SetTextAlign(12);
370 auto tg1 =
new TLatex(5, 30,
"All crates");
371 tg1->SetTextSize(.06);
372 tg1->SetTextAlign(12);
389 TH1* h_fail_crateid =
findHist(
"ECL/fail_crateid");
390 TH1* h_fail_shaperid =
findHist(
"ECL/fail_shaperid");
391 if (h_fail_crateid != NULL && h_fail_shaperid != NULL) {
392 for (
unsigned short i = 0; i < 52; i++) {
393 if (h_fail_crateid->GetBinContent(i + 1)) {
394 for (
unsigned short j = i * 12; j < i * 12 + 12; j++) {
395 if (h_fail_shaperid->GetBinContent(j + 1)) {
396 unsigned short shaper = (j + 1) - 12 * i;
421 B2DEBUG(20,
"DQMHistAnalysisECL: endRun called");
427 B2DEBUG(20,
"terminate called");
This module is for analysis of ECL DQM histograms.
std::vector< double > m_HitMapThresholds
Parameters for hit map histograms.
void normalize(TCanvas *, const std::string &, const Double_t &)
Normalize histograms.
TCanvas * c_bad_quality_analysis
TCanvas for bad_quality .
std::vector< TCanvas * > c_wf_analysis
Vector of TCanvases for waveforms .
virtual void initialize() override
Initialize the module.
TLine * m_lower_boundary_trigtag2
TLine to show lower boundary for 'trigtag2_trigid' histogram.
int m_LogicTestMax
Maximum of fails for logic test.
virtual void event() override
Event processor.
virtual ~DQMHistAnalysisECLModule()
Destructor.
TCanvas * c_crate_time_offsets
TCanvas for time offsets.
TH1 * h_time_crate_Thr1GeV
Histogram showing signal times from ECL crates (Thr.
virtual void endRun() override
Call when a run ends.
TCanvas * c_quality_fit_data_analysis
TCanvas for quality_fit_data .
virtual void terminate() override
Terminate.
TCanvas * c_ampfail_quality_analysis
TCanvas for ampfail_quality .
TLine * m_upper_boundary_time_offsets
TLine to show upper boundary for 'crate_time_offsets' graph.
TLine * m_upper_boundary_trigtag2
TLine to show upper boundary for 'trigtag2_trigid' histogram.
virtual void beginRun() override
Call when a run begins.
std::vector< short > m_low
Vector for crates IDs w/ low statistics.
std::vector< std::string > m_WaveformOption
Options for waveform histograms.
TCanvas * c_quality_analysis
TCanvas for quality .
TH2F * h_logic_summary
Histogram for ECL logic summary.
TCanvas * c_adc_hits_analysis
TCanvas for adc_hits .
TCanvas * c_logic_summary
TCanvas for ECL logic summary.
TGraphErrors * h_crate_time_offsets
Graph for time offsets.
TLine * m_lower_boundary_time_offsets
TLine to show lower boundary for 'crate_time_offsets' graph.
TCanvas * c_quality_other_analysis
TCanvas for quality_other .
std::vector< TCanvas * > c_cid_analysis
Vector of TCanvases for hit map .
TCanvas * c_trigtag1_analysis
TCanvas for trigtag1 .
double m_CrateTimeOffsetsMax
Maximum boundary for crate time offsets.
TCanvas * c_trigtag2_analysis
TCanvas for trigtag2 .
TCanvas * c_timefail_quality_analysis
TCanvas for timefail_quality .
The base class for the histogram analysis module.
static TH1 * findHist(const std::string &histname)
Find histogram.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.