Belle II Software development
DQMHistAnalysisPXDDAQ.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8//+
9// File : DQMHistAnalysisPXDDAQ.cc
10// Description : Analysis of PXD DAQ and Issues
11//-
12
13
14#include <dqm/analysis/modules/DQMHistAnalysisPXDDAQ.h>
15#include <TROOT.h>
16
17using namespace std;
18using namespace Belle2;
19
20//-----------------------------------------------------------------
21// Register the Module
22//-----------------------------------------------------------------
23REG_MODULE(DQMHistAnalysisPXDDAQ);
24
25//-----------------------------------------------------------------
26// Implementation
27//-----------------------------------------------------------------
28
31{
32 // This module CAN NOT be run in parallel!
33 setDescription("DQM Analysis for PXD DAQ Statistics and Issues");
34
35 // Parameter definition
36 addParam("histogramDirectoryName", m_histogramDirectoryName, "Name of Histogram dir", std::string("PXDDAQ"));
37 addParam("minEntries", m_minEntries, "minimum number of new entries for last time slot", 10000);
38 B2DEBUG(1, "DQMHistAnalysisPXDDAQ: Constructor done.");
39
40}
41
43{
44 B2DEBUG(1, "DQMHistAnalysisPXDDAQ: initialized.");
45
47
48 gROOT->cd(); // this seems to be important, or strange things happen
49
50 m_cDAQError = new TCanvas((m_histogramDirectoryName + "/c_DAQError").data());
51 m_cMissingDHC = new TCanvas((m_histogramDirectoryName + "/c_MissingDHC").data());
52 m_cMissingDHE = new TCanvas((m_histogramDirectoryName + "/c_MissingDHE").data());
53 m_cMissingDHP = new TCanvas((m_histogramDirectoryName + "/c_MissingDHP").data());
54 m_cStatistic = new TCanvas((m_histogramDirectoryName + "/c_Statistic").data());
55 m_cStatisticUpd = new TCanvas((m_histogramDirectoryName + "/c_StatisticUpd").data());
57 HistDelta::c_Underflow, m_minEntries, 1); // register delta
58
59 m_monObj->addCanvas(m_cDAQError);
60 m_monObj->addCanvas(m_cMissingDHC);
61 m_monObj->addCanvas(m_cMissingDHE);
62 m_monObj->addCanvas(m_cMissingDHP);
63 m_monObj->addCanvas(m_cStatistic);
64
65 m_hMissingDHC = new TH2F("hPXDMissingDHC", "PXD Missing DHC", 16, 0, 16, 2, 0, 2);
66 m_hMissingDHE = new TH2F("hPXDMissingDHE", "PXD Missing DHE", 64, 0, 64, 2, 0, 2);
67
68 registerEpicsPV("PXD:DAQ:HLTRej", "HLTReject");
69 registerEpicsPV("PXD:DAQ:Trunc", "Trunc");
70 registerEpicsPV("PXD:DAQ:HER_Trunc", "HER_Trunc");
71 registerEpicsPV("PXD:DAQ:LER_Trunc", "LER_Trunc");
72 registerEpicsPV("PXD:DAQ:CM63", "CM63");
73 registerEpicsPV("PXD:DAQ:HER_CM63", "HER_CM63");
74 registerEpicsPV("PXD:DAQ:LER_CM63", "LER_CM63");
75 registerEpicsPV("PXD:DAQ:HER_CM63_1ms", "HER_CM63_1ms");
76 registerEpicsPV("PXD:DAQ:LER_CM63_1ms", "LER_CM63_1ms");
77 registerEpicsPV("PXD:DAQ:HER_Trunc_1ms", "HER_Trunc_1ms");
78 registerEpicsPV("PXD:DAQ:LER_Trunc_1ms", "LER_Trunc_1ms");
79 registerEpicsPV("PXD:DAQ:MissFrame", "MissFrame");
80 registerEpicsPV("PXD:DAQ:Timeout", "Timeout");
81 registerEpicsPV("PXD:DAQ:LinkDown", "LinkDown");
82 registerEpicsPV("PXD:DAQ:Mismatch", "Mismatch");
83 registerEpicsPV("PXD:DAQ:HER_Miss", "HER_Miss");
84 registerEpicsPV("PXD:DAQ:LER_Miss", "LER_Miss");
85 registerEpicsPV("PXD:DAQ:HER_Miss_1ms", "HER_Miss_1ms");
86 registerEpicsPV("PXD:DAQ:LER_Miss_1ms", "LER_Miss_1ms");
87 registerEpicsPV("PXD:DAQ:unused", "unused");
88}
89
91{
92 B2DEBUG(1, "DQMHistAnalysisPXDDAQ: beginRun called.");
93
94 m_cMissingDHP->Clear();
95 m_cMissingDHE->Clear();
96 m_cMissingDHC->Clear();
97 m_cStatistic->Clear();
98 m_cStatisticUpd->Clear();
99
100 m_hMissingDHE->Reset();
101 m_hMissingDHC->Reset();
102 if (m_hMissingDHP) m_hMissingDHP->Reset();
103 if (m_hDAQError) m_hDAQError->Reset();
104 if (m_hStatistic) m_hStatistic->Reset();
105}
106
108{
109 if (m_cMissingDHP == nullptr || m_cMissingDHE == nullptr || m_cMissingDHC == nullptr
110 || m_cStatistic == nullptr) return; // we could assume this
111
112 {
113 // Overall PXD DAQ Error
114 auto hh1 = findHist(m_histogramDirectoryName, "PXDDAQError", true);
115 if (hh1) {
116 m_cDAQError->Clear();
117 m_cDAQError->cd();
118 if (m_hDAQError) delete m_hDAQError;
119 m_hDAQError = static_cast<TH1D*>(hh1->DrawClone("text"));// or just Clone here and Draw below?
120 m_hDAQError->SetName("hPXDDAQError");
121 m_hDAQError->SetTitle("PXD Fraction of DAQ Errors");
122 if (m_hDAQError->GetBinContent(0)) {
123 m_hDAQError->Scale(1.0 / m_hDAQError->GetBinContent(0));
124 }
125 m_hDAQError->Draw("text,hist");
127 }
128 }
129 {
130 // DHC histogram
131 auto hh1 = findHist(m_histogramDirectoryName, "PXDDAQDHCError", true);
132 if (hh1) {
133 auto events = hh1->GetBinContent(hh1->GetBin(-1, -1));
134 m_cMissingDHC->Clear();
135 m_cMissingDHC->cd();
136 // first, we have to relate the per-DHC overflow (DHC object count) to the overall overflow (event count)
137 // second, we have to relate the "fake data" DHC bin to the per-DHC overflow (DHC object count)
138 m_hMissingDHC->Reset();
139 for (int i = 0; i < 16; i++) {
140 auto dhecount = hh1->GetBinContent(hh1->GetBin(i, -1));
141 if (events > 0) m_hMissingDHC->Fill((double)i, 0.0, 1.0 - dhecount / events);
142 // c_FAKE_NO_DATA_TRIG = 1ull << 29,
143 if (dhecount > 0) m_hMissingDHC->Fill((double)i, 1.0, hh1->GetBinContent(hh1->GetBin(i, 29) / dhecount));
144 }
145 m_hMissingDHC->Draw("text");
147 }
148 }
149
150 {
151 // DHE histogram
152 auto hh1 = findHist(m_histogramDirectoryName, "PXDDAQDHEError", true);
153 if (hh1) {
154 auto events = hh1->GetBinContent(hh1->GetBin(-1, -1));
155 // first, we have to relate the per-DHE overflow (DHE object count) to the overall overflow (event count)
156 // second, we have to relate the "fake data" DHE bin to the per-DHE overflow (DHE object count)
157 m_cMissingDHE->Clear();
158 m_cMissingDHE->cd();
159 m_hMissingDHE->Reset();
160 for (int i = 0; i < 64; i++) {
161 auto dhecount = hh1->GetBinContent(hh1->GetBin(i, -1));
162 if (events > 0) m_hMissingDHE->Fill((double)i, 0.0, 1.0 - dhecount / events);
163 // c_FAKE_NO_DATA_TRIG = 1ull << 29,
164 if (dhecount > 0) m_hMissingDHE->Fill((double)i, 1.0, hh1->GetBinContent(hh1->GetBin(i, 29) / dhecount));
165 }
166 m_hMissingDHE->Draw("text");
168 }
169 }
170
171 {
172 // DHP histogram
173 auto hh1 = findHist(m_histogramDirectoryName, "PXDDAQDHPDataMissing", true);
174 if (hh1) {
175 m_cMissingDHP->Clear();
176 m_cMissingDHP->cd();
177 if (m_hMissingDHP) delete m_hMissingDHP;
178 m_hMissingDHP = static_cast<TH1F*>(hh1->DrawClone("text"));
179 if (m_hMissingDHP->GetBinContent(0)) {
180 m_hMissingDHP->Scale(1.0 / m_hMissingDHP->GetBinContent(0));
181 m_hMissingDHP->Draw("text");
182 }
183 m_cMissingDHP->Modified();
184 m_cMissingDHP->Update();
186 }
187 // double data = m_hMissingDHP->Max???;
188 //
189 // m_monObj->setVariable("missingDHPFraction", data);
190 //
191 }
192
193 std::string name = "PXDDAQStat";
194
195 auto* statsum = findHist(m_histogramDirectoryName, name, true);
196 if (statsum) {
197 // Stat histogram
198 m_cStatistic->Clear();
199 m_cStatistic->cd();
200 if (m_hStatistic) delete m_hStatistic;
201 m_hStatistic = static_cast<TH1D*>(statsum->DrawClone("text"));
202 if (m_hStatistic->GetBinContent(0)) {
203 m_hStatistic->Scale(1.0 / m_hStatistic->GetBinContent(0));
204 m_hStatistic->Draw("text");
205 }
206 m_cStatistic->Modified();
207 m_cStatistic->Update();
209 }
210
211 // now the important part, check fraction of "errors" and export
212 double data_HLTRej = 0.0;
213 double data_Trunc = 0.0;
214 double data_HER_Trunc = 0.0;
215 double data_LER_Trunc = 0.0;
216 double data_CM63 = 0.0;
217 double data_HER_CM63 = 0.0;
218 double data_LER_CM63 = 0.0;
219 double data_HER_CM63_1ms = 0.0;
220 double data_LER_CM63_1ms = 0.0;
221 double data_HER_Trunc_1ms = 0.0;
222 double data_LER_Trunc_1ms = 0.0;
223 double data_MissFrame = 0.0;
224 double data_Timeout = 0.0;
225 double data_LinkDown = 0.0;
226 double data_Mismatch = 0.0;
227 double data_HER_Miss = 0.0;
228 double data_LER_Miss = 0.0;
229 double data_HER_Miss_1ms = 0.0;
230 double data_LER_Miss_1ms = 0.0;
231 double data_unused = 0.0;
232
233 bool update_epics = false;
234
235 auto* delta = getDelta(m_histogramDirectoryName, name); // only updated by default
236 if (delta) {
237 gROOT->cd();
238 m_cStatisticUpd->Clear();
239 m_cStatisticUpd->cd();// necessary!
240 delta->Draw("hist");
241 // now check that we have enough stats for useful export
242 double scale = delta->GetBinContent(0);// underflow is event counter
243 if (scale >= m_minEntries) {
244 if (scale != 0.0) scale = 1.0 / scale; // just avoid divide by zero, should never happen
245 data_HLTRej = delta->GetBinContent(1 + 0) * scale;
246 data_Trunc = delta->GetBinContent(1 + 1) * scale;
247 data_HER_Trunc = delta->GetBinContent(1 + 2) * scale;
248 data_LER_Trunc = delta->GetBinContent(1 + 3) * scale;
249 data_CM63 = delta->GetBinContent(1 + 4) * scale;
250 data_HER_CM63 = delta->GetBinContent(1 + 5) * scale;
251 data_LER_CM63 = delta->GetBinContent(1 + 6) * scale;
252 data_HER_CM63_1ms = delta->GetBinContent(1 + 7) * scale;
253 data_LER_CM63_1ms = delta->GetBinContent(1 + 8) * scale;
254 data_HER_Trunc_1ms = delta->GetBinContent(1 + 9) * scale;
255 data_LER_Trunc_1ms = delta->GetBinContent(1 + 10) * scale;
256 data_MissFrame = delta->GetBinContent(1 + 11) * scale;
257 data_Timeout = delta->GetBinContent(1 + 12) * scale;
258 data_LinkDown = delta->GetBinContent(1 + 13) * scale;
259 data_Mismatch = delta->GetBinContent(1 + 14) * scale;
260 data_HER_Miss = delta->GetBinContent(1 + 15) * scale;
261 data_LER_Miss = delta->GetBinContent(1 + 16) * scale;
262 data_HER_Miss_1ms = delta->GetBinContent(1 + 17) * scale;
263 data_LER_Miss_1ms = delta->GetBinContent(1 + 18) * scale;
264 data_unused = delta->GetBinContent(1 + 19) * scale;
265 update_epics = true;
266 }
267 m_cStatisticUpd->Modified();
268 m_cStatisticUpd->Update();
269 }
270
271 if (update_epics) {
272 m_monObj->setVariable("HLTReject", data_HLTRej);
273 m_monObj->setVariable("Trunc", data_Trunc);
274 m_monObj->setVariable("HER_Trunc", data_HER_Trunc);
275 m_monObj->setVariable("LER_Trunc", data_LER_Trunc);
276 m_monObj->setVariable("CM63", data_CM63);
277 m_monObj->setVariable("HER_CM63", data_HER_CM63);
278 m_monObj->setVariable("LER_CM63", data_LER_CM63);
279 m_monObj->setVariable("HER_CM63_1ms", data_HER_CM63_1ms);
280 m_monObj->setVariable("LER_CM63_1ms", data_LER_CM63_1ms);
281 m_monObj->setVariable("HER_Trunc_1ms", data_HER_Trunc_1ms);
282 m_monObj->setVariable("LER_Trunc_1ms", data_LER_Trunc_1ms);
283 m_monObj->setVariable("MissFrame", data_MissFrame);
284 m_monObj->setVariable("Timeout", data_Timeout);
285 m_monObj->setVariable("LinkDown", data_LinkDown);
286 m_monObj->setVariable("Mismatch", data_Mismatch);
287 m_monObj->setVariable("HER_Miss", data_HER_Miss);
288 m_monObj->setVariable("LER_Miss", data_LER_Miss);
289 m_monObj->setVariable("HER_Miss_1ms", data_HER_Miss_1ms);
290 m_monObj->setVariable("LER_Miss_1ms", data_LER_Miss_1ms);
291
292 setEpicsPV("HLTReject", data_HLTRej);
293 setEpicsPV("Trunc", data_Trunc);
294 setEpicsPV("HER_Trunc", data_HER_Trunc);
295 setEpicsPV("LER_Trunc", data_LER_Trunc);
296 setEpicsPV("CM63", data_CM63);
297 setEpicsPV("HER_CM63", data_HER_CM63);
298 setEpicsPV("LER_CM63", data_LER_CM63);
299 setEpicsPV("HER_CM63_1ms", data_HER_CM63_1ms);
300 setEpicsPV("LER_CM63_1ms", data_LER_CM63_1ms);
301 setEpicsPV("HER_Trunc_1ms", data_HER_Trunc_1ms);
302 setEpicsPV("LER_Trunc_1ms", data_LER_Trunc_1ms);
303 setEpicsPV("MissFrame", data_MissFrame);
304 setEpicsPV("Timeout", data_Timeout);
305 setEpicsPV("LinkDown", data_LinkDown);
306 setEpicsPV("Mismatch", data_Mismatch);
307 setEpicsPV("HER_Miss", data_HER_Miss);
308 setEpicsPV("LER_Miss", data_LER_Miss);
309 setEpicsPV("HER_Miss_1ms", data_HER_Miss_1ms);
310 setEpicsPV("LER_Miss_1ms", data_LER_Miss_1ms);
311 setEpicsPV("unused", data_unused);
312 }
313}
314
316{
317 B2DEBUG(1, "DQMHistAnalysisPXDDAQ: terminate called.");
318 // delete dynamical variables
319 if (m_cDAQError) delete m_cDAQError;
320 if (m_cMissingDHC) delete m_cMissingDHC;
321 if (m_cMissingDHE) delete m_cMissingDHE;
322 if (m_cMissingDHP) delete m_cMissingDHP;
323 if (m_cStatistic) delete m_cStatistic;
325
326 if (m_hMissingDHC) delete m_hMissingDHC;
327 if (m_hMissingDHE) delete m_hMissingDHE;
328 if (m_hDAQError) delete m_hDAQError;
329 if (m_hMissingDHP) delete m_hMissingDHP;
330 if (m_hStatistic) delete m_hStatistic;
331}
static bool hasDeltaPar(const std::string &dirname, const std::string &histname)
Check if Delta histogram parameters exist for histogram.
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 void addDeltaPar(const std::string &dirname, const std::string &histname, HistDelta::EDeltaType t, int p, unsigned int a=1)
Add Delta histogram parameters.
static TH1 * findHist(const std::string &histname, bool onlyIfUpdated=false)
Get histogram from list (no other search).
static void UpdateCanvas(const std::string &name, bool updated=true)
Mark canvas as updated (or not)
TH1 * getDelta(const std::string &fullname, int n=0, bool onlyIfUpdated=true)
Get Delta histogram.
DQMHistAnalysisModule()
Constructor / Destructor.
void setEpicsPV(const std::string &keyname, double value)
Write value to a EPICS PV.
void terminate(void) override final
Terminator.
void initialize(void) override final
Initializer.
TH1D * m_hStatistic
Histogram covering stat.
MonitoringObject * m_monObj
Monitoring Object.
std::string m_histogramDirectoryName
name of histogram directory
TH2F * m_hMissingDHC
Histogram covering all DHC modules.
TH1 * m_hDAQError
Histogram covering all error types.
TH1F * m_hMissingDHP
Histogram covering all modules*DHP.
TH2F * m_hMissingDHE
Histogram covering all DHE modules.
void beginRun(void) override final
Called when entering a new run.
void event(void) override final
This method is called for each event.
void setDescription(const std::string &description)
Sets the description of the module.
Definition Module.cc:214
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition Module.h:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
Abstract base class for different kinds of events.
STL namespace.