10 #include <dqm/analysis/modules/DQMHistAnalysisPXDCM.h>
13 #include <vxd/geometry/GeoCache.h>
33 addParam(
"histogramDirectoryName", m_histogramDirectoryName,
"Name of Histogram dir", std::string(
"PXDCM"));
34 addParam(
"PVPrefix", m_pvPrefix,
"PV Prefix", std::string(
"DQM:PXD:CommonMode:"));
35 addParam(
"useEpics", m_useEpics,
"useEpics",
true);
36 addParam(
"minEntries", m_minEntries,
"minimum number of new entries for last time slot", 10000);
37 addParam(
"warnMeanAdhoc", m_warnMeanAdhoc,
"warn level for peak position", 1.0);
38 addParam(
"errorMeanAdhoc", m_errorMeanAdhoc,
"error level for peak position", 2.0);
39 B2DEBUG(99,
"DQMHistAnalysisPXDCM: Constructor done.");
42 DQMHistAnalysisPXDCMModule::~DQMHistAnalysisPXDCMModule()
46 if (ca_current_context()) ca_context_destroy();
51 void DQMHistAnalysisPXDCMModule::initialize()
53 m_monObj = getMonitoringObject(
"pxd");
58 for (
VxdID& aVxdID : sensors) {
60 if (info.getType() != VXD::SensorInfoBase::PXD)
continue;
61 m_PXDModules.push_back(aVxdID);
63 std::sort(m_PXDModules.begin(), m_PXDModules.end());
67 m_cCommonMode =
new TCanvas((m_histogramDirectoryName +
"/c_CommonMode").data());
68 m_cCommonModeDelta =
new TCanvas((m_histogramDirectoryName +
"/c_CommonModeDelta").data());
70 m_hCommonMode =
new TH2D(
"CommonMode",
"CommonMode; Module; CommonMode", m_PXDModules.size(), 0, m_PXDModules.size(), 63, 0, 63);
71 m_hCommonMode->SetDirectory(0);
72 m_hCommonMode->SetStats(
false);
73 m_hCommonModeDelta =
new TH2D(
"CommonModeAdhoc",
"CommonMode Adhoc; Module; CommonMode", m_PXDModules.size(), 0,
74 m_PXDModules.size(), 63, 0, 63);
75 m_hCommonModeDelta->SetDirectory(0);
76 m_hCommonModeDelta->SetStats(
false);
77 m_hCommonModeOld =
new TH2D(
"CommonModeOld",
"CommonMode Old; Module; CommonMode", m_PXDModules.size(), 0, m_PXDModules.size(),
79 m_hCommonModeOld->SetDirectory(0);
80 m_hCommonModeOld->SetStats(
false);
82 for (
unsigned int i = 0; i < m_PXDModules.size(); i++) {
83 TString ModuleName = (std::string)m_PXDModules[i];
84 m_hCommonMode->GetXaxis()->SetBinLabel(i + 1, ModuleName);
85 m_hCommonModeDelta->GetXaxis()->SetBinLabel(i + 1, ModuleName);
86 m_hCommonModeOld->GetXaxis()->SetBinLabel(i + 1, ModuleName);
89 m_hCommonMode->Draw(
"colz");
90 m_hCommonModeDelta->Draw(
"colz");
91 m_hCommonModeOld->Draw(
"colz");
93 m_monObj->addCanvas(m_cCommonMode);
96 m_line1 =
new TLine(0, 10, m_PXDModules.size(), 10);
97 m_line2 =
new TLine(0, 16, m_PXDModules.size(), 16);
99 m_line1->SetHorizontal(
true);
100 m_line1->SetLineColor(3);
101 m_line1->SetLineWidth(3);
102 m_line2->SetHorizontal(
true);
103 m_line2->SetLineColor(1);
104 m_line2->SetLineWidth(3);
112 if (!ca_current_context()) SEVCHK(ca_context_create(ca_disable_preemptive_callback),
"ca_context_create");
114 SEVCHK(ca_create_channel((m_pvPrefix +
"Outside").data(), NULL, NULL, 10, &mychid[0]),
"ca_create_channel failure");
115 SEVCHK(ca_create_channel((m_pvPrefix +
"Status").data(), NULL, NULL, 10, &mychid[1]),
"ca_create_channel failure");
116 SEVCHK(ca_create_channel((m_pvPrefix +
"CM63").data(), NULL, NULL, 10, &mychid[2]),
"ca_create_channel failure");
117 SEVCHK(ca_create_channel((m_pvPrefix +
"Status_Adhoc").data(), NULL, NULL, 10, &mychid[3]),
"ca_create_channel failure");
119 for (
VxdID& aPXDModule : m_PXDModules) {
120 TString buff = (std::string)aPXDModule;
121 buff.ReplaceAll(
".",
"_");
122 auto& my = mychid_mean[aPXDModule];
123 SEVCHK(ca_create_channel((m_pvPrefix +
"Mean:" + buff).Data(), NULL, NULL, 10, &my),
"ca_create_channel failure");
125 SEVCHK(ca_pend_io(5.0),
"ca_pend_io failure");
128 B2DEBUG(99,
"DQMHistAnalysisPXDCM: initialized.");
131 void DQMHistAnalysisPXDCMModule::beginRun()
133 B2DEBUG(99,
"DQMHistAnalysisPXDCM: beginRun called.");
135 m_cCommonMode->Clear();
136 m_cCommonModeDelta->Clear();
137 m_cCommonMode->SetLogz();
138 m_cCommonModeDelta->SetLogz();
141 m_hCommonMode->Reset();
142 m_hCommonModeDelta->Reset();
143 m_hCommonModeOld->Reset();
146 void DQMHistAnalysisPXDCMModule::event()
148 double all_outside = 0.0, all = 0.0;
150 bool error_flag =
false;
151 bool warn_flag =
false;
152 bool error_adhoc_flag =
false;
153 bool warn_adhoc_flag =
false;
154 bool anyupdate =
false;
155 if (!m_cCommonMode)
return;
156 m_hCommonMode->Reset();
158 for (
unsigned int i = 0; i < m_PXDModules.size(); i++) {
159 std::string name =
"PXDDAQCM2_" + (std::string)m_PXDModules[i ];
162 TH1* hh1 = findHist(name);
164 hh1 = findHist(m_histogramDirectoryName, name);
167 double current_full = 0.0;
168 double outside_full = 0.0;
170 auto nevent = hh1->GetBinContent(0);
171 bool update = nevent - m_hCommonModeOld->GetBinContent(i + 1, 0) > m_minEntries ;
173 if (update) m_hCommonModeOld->SetBinContent(i + 1, 0, nevent);
174 for (
int bin = 1; bin <= 63; bin++) {
176 v = hh1->GetBinContent(bin);
177 m_hCommonMode->SetBinContent(i + 1, bin, v);
179 if (nevent < m_minEntries) {
180 m_hCommonModeDelta->SetBinContent(i + 1, bin, v);
182 auto old = m_hCommonModeOld->GetBinContent(i + 1, bin);
183 m_hCommonModeDelta->SetBinContent(i + 1, bin, v - old);
184 m_hCommonModeOld->SetBinContent(i + 1, bin, v);
190 outside_full += hh1->Integral(16, 63);
193 all_outside += outside_full;
195 double dhpc = hh1->GetBinContent(64);
197 if (current_full > 1) {
198 error_flag |= (outside_full / current_full > 1e-5);
199 warn_flag |= (outside_full / current_full > 1e-6);
205 Double_t mean_adhoc = 0.;
206 Double_t entries_adhoc = 0.;
207 Double_t outside_adhoc = 0.;
209 for (
int cm_y = 0; cm_y < 16; cm_y++) {
210 auto v = m_hCommonModeDelta->GetBinContent(m_hCommonModeDelta->GetBin(i + 1, cm_y + 1));
212 mean_adhoc += v * (cm_y + 1);
215 for (
int cm_y = 16; cm_y < 64; cm_y++) {
216 auto v = m_hCommonModeDelta->GetBinContent(m_hCommonModeDelta->GetBin(i + 1, cm_y + 1));
220 if (entries_adhoc > 0) {
221 mean_adhoc /= entries_adhoc;
222 warn_adhoc_flag |= entries_adhoc > 1000 && fabs(10.0 - mean_adhoc) > m_warnMeanAdhoc;
223 error_adhoc_flag |= entries_adhoc > 1000 && fabs(10.0 - mean_adhoc) > m_errorMeanAdhoc;
224 m_monObj->setVariable((
"cm_" + (std::string)m_PXDModules[i]).c_str(), mean_adhoc);
227 auto my = mychid_mean[m_PXDModules[i]];
229 if (my) SEVCHK(ca_put(DBR_DOUBLE, my, (
void*)&mean_adhoc),
"ca_set failure");
242 m_cCommonMode->Pad()->SetFillColor(kGray);
246 if (all_outside / all > 1e-5 || error_flag) {
247 m_cCommonMode->Pad()->SetFillColor(kRed);
249 }
else if (all_outside / all > 1e-6 || warn_flag) {
250 m_cCommonMode->Pad()->SetFillColor(kYellow);
252 }
else if (all_outside == 0. ) {
253 m_cCommonMode->Pad()->SetFillColor(kGreen);
256 m_cCommonMode->Pad()->SetFillColor(kWhite);
262 m_hCommonMode->Draw(
"colz");
268 auto tt =
new TLatex(5.5, 3,
"1.3.2 Module is excluded, please ignore");
269 tt->SetTextAngle(90);
270 tt->SetTextAlign(12);
273 m_cCommonMode->Modified();
274 m_cCommonMode->Update();
278 int status_adhoc = 0;
279 m_cCommonModeDelta->cd();
283 m_cCommonModeDelta->Pad()->SetFillColor(kGray);
287 if (error_adhoc_flag) {
288 m_cCommonModeDelta->Pad()->SetFillColor(kRed);
290 }
else if (warn_adhoc_flag) {
291 m_cCommonModeDelta->Pad()->SetFillColor(kYellow);
294 m_cCommonModeDelta->Pad()->SetFillColor(kGreen);
302 if (m_useEpics && anyupdate) SEVCHK(ca_put(DBR_INT, mychid[3], (
void*)&status_adhoc),
"ca_set failure");
304 if (m_hCommonModeDelta) {
305 m_hCommonModeDelta->Draw(
"colz");
311 auto tt =
new TLatex(5.5, 3,
"1.3.2 Module is excluded, please ignore");
312 tt->SetTextAngle(90);
313 tt->SetTextAlign(12);
316 m_cCommonModeDelta->Modified();
317 m_cCommonModeDelta->Update();
322 double data = all > 0 ? (all_outside / all) : 0;
323 double data2 = all > 0 ? (all_cm / all) : 0;
324 SEVCHK(ca_put(DBR_DOUBLE, mychid[0], (
void*)&data),
"ca_set failure");
325 SEVCHK(ca_put(DBR_INT, mychid[1], (
void*)&status),
"ca_set failure");
326 SEVCHK(ca_put(DBR_DOUBLE, mychid[2], (
void*)&data2),
"ca_set failure");
327 SEVCHK(ca_pend_io(5.0),
"ca_pend_io failure");
332 void DQMHistAnalysisPXDCMModule::terminate()
334 B2DEBUG(99,
"DQMHistAnalysisPXDCM: terminate called");
338 for (
auto m : mychid) SEVCHK(ca_clear_channel(m),
"ca_clear_channel failure");
339 for (
auto& m : mychid_mean) SEVCHK(ca_clear_channel(m.second),
"ca_clear_channel failure");
340 SEVCHK(ca_pend_io(5.0),
"ca_pend_io failure");