10 #include <dqm/analysis/modules/DQMHistAnalysisECLShapers.h>
22 B2DEBUG(20,
"DQMHistAnalysisECLShapers: Constructor done.");
24 addParam(
"useEpics", m_useEpics,
"Whether to update EPICS PVs.",
false);
32 if (ca_current_context()) ca_context_destroy();
39 B2DEBUG(20,
"DQMHistAnalysisECLShapers: initialized.");
44 if (!ca_current_context()) SEVCHK(ca_context_create(ca_disable_preemptive_callback),
"ca_context_create");
46 std::string pv_name =
"ECL:logic_check:crate" + std::to_string(i + 1);
47 SEVCHK(ca_create_channel(pv_name.c_str(), NULL, NULL, 10, &chid_logic[i]),
"ca_create_channel failure");
49 SEVCHK(ca_create_channel(
"ECL:pedwidth:test:max_fw", NULL, NULL, 10,
50 &chid_pedwidth[0]),
"ca_create_channel failure");
51 SEVCHK(ca_create_channel(
"ECL:pedwidth:test:max_br", NULL, NULL, 10,
52 &chid_pedwidth[1]),
"ca_create_channel failure");
53 SEVCHK(ca_create_channel(
"ECL:pedwidth:test:max_bw", NULL, NULL, 10,
54 &chid_pedwidth[2]),
"ca_create_channel failure");
55 SEVCHK(ca_create_channel(
"ECL:pedwidth:test:max_al", NULL, NULL, 10,
56 &chid_pedwidth[3]),
"ca_create_channel failure");
57 SEVCHK(ca_pend_io(5.0),
"ca_pend_io failure");
64 B2DEBUG(20,
"DQMHistAnalysisECLShapers: beginRun called.");
69 TH1* h_fail_crateid =
findHist(
"ECL/fail_crateid");
70 TProfile* h_pedrms_cellid = (TProfile*)
findHist(
"ECL/pedrms_cellid");
74 if (h_fail_crateid != NULL) {
76 int errors_count = h_fail_crateid->GetBinContent(i + 1);
77 if (chid_logic[i]) SEVCHK(ca_put(DBR_LONG, chid_logic[i], (
void*)&errors_count),
"ca_set failure");
80 if (h_pedrms_cellid != NULL) {
82 std::multiset<double> barrel_pedwidth;
83 std::multiset<double> bwd_pedwidth;
84 std::multiset<double> fwd_pedwidth;
86 for (
int i = 0; i < 8736; i++) {
87 const int cellid = i + 1;
88 if (h_pedrms_cellid->GetBinEntries(cellid) < 100)
continue;
89 double pedrms = h_pedrms_cellid->GetBinContent(cellid);
91 fwd_pedwidth.insert(pedrms);
92 }
else if (cellid < 7777) {
93 barrel_pedwidth.insert(pedrms);
95 bwd_pedwidth.insert(pedrms);
99 double pedwidth_max[4] = {
105 pedwidth_max[3] = *std::max(&pedwidth_max[0], &pedwidth_max[2]);
106 for (
int i = 0; i < 4; i++) {
107 if (pedwidth_max[i] <= 0)
continue;
108 if (!chid_pedwidth[i])
continue;
109 SEVCHK(ca_put(DBR_DOUBLE, chid_pedwidth[i], (
void*)&pedwidth_max[i]),
"ca_set failure");
112 SEVCHK(ca_pend_io(5.0),
"ca_pend_io failure");
119 B2DEBUG(20,
"DQMHistAnalysisECLShapers: endRun called");
125 B2DEBUG(20,
"terminate called");
130 if (chid_logic[i]) SEVCHK(ca_clear_channel(chid_logic[i]),
"ca_clear_channel failure");
132 for (
int i = 0; i < 4; i++) {
133 if (chid_pedwidth[i]) SEVCHK(ca_clear_channel(chid_pedwidth[i]),
"ca_clear_channel failure");
135 SEVCHK(ca_pend_io(5.0),
"ca_pend_io failure");
142 int len = values.size();
148 auto end_iter = std::prev(values.end(), len * 0.1);
This module is for analysis of ECL DQM histograms.
virtual ~DQMHistAnalysisECLShapersModule()
Destructor.
virtual void initialize() override
Initialize the module.
virtual void event() override
Event processor.
virtual void endRun() override
Call when a run ends.
virtual void terminate() override
Terminate.
double robust_max(std::multiset< double > values)
Remove upper 10% of the values, return the maximum in the remaining 90%.
virtual void beginRun() override
Call when a run begins.
bool m_useEpics
flag if to export to EPICS
static const int c_collector_count
Number of ECLCollector modules (normally 52)
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.