11 #include <pxd/modules/pxdDQM/PXDDAQDQMModule.h>
13 #include <TDirectory.h>
15 #include <boost/format.hpp>
21 using namespace Belle2::PXD::PXDError;
37 setDescription(
"Monitor DAQ errors");
38 setPropertyFlags(c_ParallelProcessingCertified);
39 addParam(
"histogramDirectoryName", m_histogramDirectoryName,
"Name of the directory where histograms will be placed",
40 std::string(
"pxdDAQ"));
43 void PXDDAQDQMModule::defineHisto()
45 TDirectory* oldDir = gDirectory;
46 if (m_histogramDirectoryName !=
"") {
47 oldDir->mkdir(m_histogramDirectoryName.c_str());
48 oldDir->cd(m_histogramDirectoryName.c_str());
51 hDAQErrorEvent =
new TH1D(
"PXDDAQError",
"PXDDAQError/Event;;Count", ONSEN_USED_TYPE_ERR, 0, ONSEN_USED_TYPE_ERR);
52 hDAQErrorDHC =
new TH2D(
"PXDDAQDHCError",
"PXDDAQError/DHC;DHC ID;", 16, 0, 16, ONSEN_USED_TYPE_ERR, 0, ONSEN_USED_TYPE_ERR);
53 hDAQErrorDHE =
new TH2D(
"PXDDAQDHEError",
"PXDDAQError/DHE;DHE ID;", 64, 0, 64, ONSEN_USED_TYPE_ERR, 0, ONSEN_USED_TYPE_ERR);
54 hDAQUseableModule =
new TH1D(
"PXDDAQUseableModule",
"PXDDAQUseableModule/DHE;DHE ID;", 64, 0, 64);
55 hDAQNotUseableModule =
new TH1D(
"PXDDAQNotUseableModule",
"PXDDAQNotUseableModule/DHE;DHE ID;", 64, 0, 64);
56 hDAQDHPDataMissing =
new TH1D(
"PXDDAQDHPDataMissing",
"PXDDAQDHPDataMissing/DHE*DHP;DHE ID;", 64 * 4, 0, 64);
57 hDAQEndErrorDHC =
new TH2D(
"PXDDAQDHCEndError",
"PXDDAQEndError/DHC;DHC ID;", 16, 0, 16, 32, 0, 32);
58 hDAQEndErrorDHE =
new TH2D(
"PXDDAQDHEEndError",
"PXDDAQEndError/DHE;DHE ID;", 64, 0, 64, 4 * 2 * 8, 0, 4 * 2 * 8);
64 for (
int i = 0; i < ONSEN_USED_TYPE_ERR; i++) {
65 const char* label = getPXDBitErrorName(i).c_str();
66 hDAQErrorEvent->GetXaxis()->SetBinLabel(i + 1, label);
67 hDAQErrorDHE->GetYaxis()->SetBinLabel(i + 1, label);
68 hDAQErrorDHC->GetYaxis()->SetBinLabel(i + 1, label);
71 hDAQErrorEvent->LabelsOption(
"v");
73 std::vector<VxdID> sensors = m_vxdGeometry.getListOfSensors();
74 for (
VxdID& avxdid : sensors) {
76 if (info.getType() != VXD::SensorInfoBase::PXD)
continue;
79 TString buff = (std::string)avxdid;
80 TString bufful = buff;
81 buff.ReplaceAll(
".",
"_");
86 hDAQDHETriggerGate[avxdid] =
new TH1D(
"PXDDAQDHETriggerGate_" + bufful,
87 "TriggerGate DHE " + buff +
"; Trigger Gate; Counts", 192, 0, 192);
88 hDAQDHEReduction[avxdid] =
new TH1D(
"PXDDAQDHEDataReduction_" + bufful,
"Data Reduction DHE " + buff +
"; Raw/Red; Counts", 200, 0,
90 hDAQCM[avxdid] =
new TH2D(
"PXDDAQCM_" + bufful,
"Common Mode on DHE " + buff +
"; Gate+Chip*192; Common Mode", 192 * 4, 0, 192 * 4,
92 hDAQCM2[avxdid] =
new TH1D(
"PXDDAQCM2_" + bufful,
"Common Mode on DHE " + buff +
"; Common Mode", 64, 0, 64);
94 for (
int i = 0; i < 16; i++) {
95 hDAQDHCReduction[i] =
new TH1D((
"PXDDAQDHCDataReduction_" + str(format(
"%d") % i)).c_str(),
96 (
"Data Reduction DHC " + str(format(
" %d") % i) +
"; Raw/Red; Counts").c_str(), 200, 0,
102 hEODBAfterInjLER =
new TH1I(
"PXDEODBInjLER",
"PXDEODBInjLER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
103 hEODBAfterInjHER =
new TH1I(
"PXDEODBInjHER",
"PXDEODBInjHER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
104 hCM63AfterInjLER =
new TH1I(
"PXDCM63InjLER",
"PXDCM63InjLER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
105 hCM63AfterInjHER =
new TH1I(
"PXDCM63InjHER",
"PXDCM63InjHER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
106 hTruncAfterInjLER =
new TH1I(
"PXDTruncInjLER",
"PXDTruncInjLER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
107 hTruncAfterInjHER =
new TH1I(
"PXDTruncInjHER",
"PXDTruncInjHER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
108 hMissAfterInjLER =
new TH1I(
"PXDMissInjLER",
"PXDMissInjLER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
109 hMissAfterInjHER =
new TH1I(
"PXDMissInjHER",
"PXDMissInjHER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
110 hEODBTrgDiff =
new TH1I(
"PXDEODBTrgDiff",
"PXDEODBTrgDiff/DiffTime;DiffTime in #mus;Events/Time (1 #mus bins)", 2000, 0, 2000);
111 hCM63TrgDiff =
new TH1I(
"PXDCM63TrgDiff",
"PXDCM63TrgDiff/DiffTime;DiffTime in #mus;Events/Time (1 #mus bins)", 2000, 0, 2000);
112 hTruncTrgDiff =
new TH1I(
"PXDTruncTrgDiff",
"PXDTruncTrgDiff/DiffTime;DiffTime in #mus;Events/Time (1 #mus bins)", 2000, 0, 2000);
113 hMissTrgDiff =
new TH1I(
"PXDMissTrgDiff",
"PXDMissTrgDiff/DiffTime;DiffTime in #mus;Events/Time (1 #mus bins)", 2000, 0, 2000);
115 hDAQStat =
new TH1D(
"PXDDAQStat",
"PXDDAQStat", 20, 0, 20);
116 auto xa = hDAQStat->GetXaxis();
119 xa->SetBinLabel(0 + 1,
"EODB/HLT rej");
120 xa->SetBinLabel(1 + 1,
"Trunc 8%");
121 xa->SetBinLabel(2 + 1,
"HER Trunc");
122 xa->SetBinLabel(3 + 1,
"LER Trunc");
123 xa->SetBinLabel(4 + 1,
"CM63");
124 xa->SetBinLabel(5 + 1,
"HER CM63");
125 xa->SetBinLabel(6 + 1,
"LER CM63");
126 xa->SetBinLabel(7 + 1,
"HER CM63>1ms");
127 xa->SetBinLabel(8 + 1,
"LER CM63>1ms");
128 xa->SetBinLabel(9 + 1,
"HER Trunc>1ms");
129 xa->SetBinLabel(10 + 1,
"LER Trunc>1ms");
130 xa->SetBinLabel(11 + 1,
"MissFrame");
131 xa->SetBinLabel(12 + 1,
"Timeout");
132 xa->SetBinLabel(13 + 1,
"Link Down");
133 xa->SetBinLabel(14 + 1,
"Mismatch");
134 xa->SetBinLabel(15 + 1,
"HER MissFrame");
135 xa->SetBinLabel(16 + 1,
"LER MissFrame");
136 xa->SetBinLabel(17 + 1,
"HER MissFrame>1ms");
137 xa->SetBinLabel(18 + 1,
"LER MissFrame>1ms");
138 xa->SetBinLabel(19 + 1,
"unused");
144 void PXDDAQDQMModule::initialize()
147 m_storeDAQEvtStats.isRequired();
148 m_rawTTD.isOptional();
149 m_rawSVD.isOptional();
152 void PXDDAQDQMModule::beginRun()
154 hDAQErrorEvent->Reset();
155 hDAQErrorDHC->Reset();
156 hDAQErrorDHE->Reset();
157 hDAQUseableModule->Reset();
158 hDAQNotUseableModule->Reset();
159 hDAQDHPDataMissing->Reset();
160 hDAQEndErrorDHC->Reset();
161 hDAQEndErrorDHE->Reset();
162 for (
auto& it : hDAQDHETriggerGate)
if (it.second) it.second->Reset();
163 for (
auto& it : hDAQDHCReduction)
if (it.second) it.second->Reset();
164 for (
auto& it : hDAQDHEReduction)
if (it.second) it.second->Reset();
165 for (
auto& it : hDAQCM)
if (it.second) it.second->Reset();
166 for (
auto& it : hDAQCM2)
if (it.second) it.second->Reset();
167 if (hCM63AfterInjLER) hCM63AfterInjLER->Reset();
168 if (hCM63AfterInjHER) hCM63AfterInjHER->Reset();
169 if (hTruncAfterInjLER) hTruncAfterInjLER->Reset();
170 if (hTruncAfterInjHER) hTruncAfterInjHER->Reset();
171 if (hMissAfterInjLER) hMissAfterInjLER->Reset();
172 if (hMissAfterInjHER) hMissAfterInjHER->Reset();
176 void PXDDAQDQMModule::event()
179 hDAQDHPDataMissing->Fill(-1);
180 hDAQErrorDHC->Fill(-1, -1);
181 hDAQErrorDHE->Fill(-1, -1);
182 for (
auto& it : hDAQCM2)
if (it.second) it.second->Fill(-1);
188 bool eodbFlag = m_rawSVD.getEntries() == 0;
190 bool truncFlag =
false;
191 bool nolinkFlag =
false;
192 bool missingFlag =
false;
193 bool timeoutFlag =
false;
194 bool mismatchFlag =
false;
195 bool cm63Flag =
false;
197 B2DEBUG(20,
"Iterate PXD DAQ Status");
198 auto evt = *m_storeDAQEvtStats;
199 PXDErrorFlags evt_emask = evt.getErrorMask();
200 for (
int i = 0; i < ONSEN_MAX_TYPE_ERR; i++) {
201 PXDErrorFlags mask = (1ull << i);
202 if ((evt_emask & mask) == mask) hDAQErrorEvent->Fill(getPXDBitErrorName(i).c_str(), 1);
204 B2DEBUG(20,
"Iterate PXD Packets, Err " << evt_emask);
205 for (
auto& pkt : evt) {
206 B2DEBUG(20,
"Iterate PXD DHC in Pkt " << pkt.getPktIndex());
207 for (
auto& dhc : pkt) {
208 hDAQErrorDHC->Fill(dhc.getDHCID(), -1);
209 PXDErrorFlags dhc_emask = dhc.getErrorMask();
210 for (
int i = 0; i < ONSEN_MAX_TYPE_ERR; i++) {
211 PXDErrorFlags mask = (1ull << i);
212 if ((dhc_emask & mask) == mask) hDAQErrorDHC->Fill(dhc.getDHCID(), i);
214 unsigned int cmask = dhc.getEndErrorInfo();
215 for (
int i = 0; i < 32; i++) {
216 unsigned int mask = (1 << i);
217 if ((cmask & mask) == mask) hDAQEndErrorDHC->Fill(dhc.getDHCID(), i);
219 if (hDAQDHCReduction[dhc.getDHCID()]) {
220 float red = dhc.getRedCnt() ? float(dhc.getRawCnt()) / dhc.getRedCnt() : 0.;
221 B2DEBUG(98,
"==DHC " << dhc.getDHCID() <<
"(Raw)" << dhc.getRawCnt() <<
" / (Red)" << dhc.getRedCnt() <<
" = " << red);
222 if (red >= 40.) red = 39.999999999;
223 hDAQDHCReduction[dhc.getDHCID()]->Fill(red);
225 B2DEBUG(20,
"Iterate PXD DHE in DHC " << dhc.getDHCID() <<
" , Err " << dhc_emask);
226 for (
auto& dhe : dhc) {
227 hDAQErrorDHE->Fill(dhe.getDHEID(), -1);
228 PXDErrorFlags dhe_emask = dhe.getErrorMask();
229 B2DEBUG(20,
"DHE " << dhe.getDHEID() <<
" , Err " << dhe_emask);
230 for (
int i = 0; i < ONSEN_MAX_TYPE_ERR; i++) {
231 PXDErrorFlags mask = (1ull << i);
232 if ((dhe_emask & mask) == mask) hDAQErrorDHE->Fill(dhe.getDHEID(), i);
234 if (dhe.isUsable()) {
235 hDAQUseableModule->Fill(dhe.getDHEID());
237 hDAQNotUseableModule->Fill(dhe.getDHEID());
239 for (
int i = 0; i < 4; i++) {
240 if ((dhe.getDHPFoundMask() & (1 << i)) == 0) hDAQDHPDataMissing->Fill(dhe.getDHEID() + i * 0.25);
242 for (
auto& dhp : dhe) {
243 truncFlag |= dhp.getTruncated();
245 unsigned int emask = dhe.getEndErrorInfo();
247 for (
int i = 0; i < 4 * 2; i++) {
248 auto sm = (emask >> i * 4) & 0xF;
250 if (sm > 0) hDAQEndErrorDHE->Fill(dhe.getDHEID(), i * 8 + sm);
251 missingFlag |= sm == 0x1;
252 timeoutFlag |= sm == 0x2;
253 nolinkFlag |= sm == 0x3;
255 mismatchFlag |= sm == 0x5;
256 truncFlag |= sm == 0x6;
259 if (hDAQDHETriggerGate[dhe.getSensorID()]) hDAQDHETriggerGate[dhe.getSensorID()]->Fill(dhe.getTriggerGate());
260 if (hDAQDHEReduction[dhe.getSensorID()]) {
261 float red = dhe.getRedCnt() ? float(dhe.getRawCnt()) / dhe.getRedCnt() : 0.;
262 B2DEBUG(98,
"==DHE " << dhe.getSensorID() <<
"(Raw)" << dhe.getRawCnt() <<
" / (Red)" << dhe.getRedCnt() <<
" = " << red);
263 if (red >= 40.) red = 39.999999999;
264 hDAQDHEReduction[dhe.getSensorID()]->Fill(red);
266 for (
auto cm = dhe.cm_begin(); cm < dhe.cm_end(); ++cm) {
268 if (hDAQCM[dhe.getSensorID()]) hDAQCM[dhe.getSensorID()]->Fill(std::get<0>(*cm) * 192 + std::get<1>(*cm) / 4, std::get<2>(*cm));
269 if (hDAQCM2[dhe.getSensorID()]) hDAQCM2[dhe.getSensorID()]->Fill(std::get<2>(*cm));
270 cm63Flag |= 63 == std::get<2>(*cm);
277 for (
auto& it : m_rawTTD) {
282 double lasttrig = it.GetTimeSincePrevTrigger(0) / 127.;
283 if (eodbFlag && hEODBTrgDiff) hEODBTrgDiff->Fill(lasttrig);
284 if (cm63Flag && hCM63TrgDiff) hCM63TrgDiff->Fill(lasttrig);
285 if (truncFlag && hTruncTrgDiff) hTruncTrgDiff->Fill(lasttrig);
286 if (missingFlag && hMissTrgDiff) hMissTrgDiff->Fill(lasttrig);
289 auto difference = it.GetTimeSinceLastInjection(0);
291 if (difference != 0x7FFFFFFF) {
292 double diff2 = difference / 127.;
293 if (it.GetIsHER(0)) {
295 if (hEODBAfterInjHER) hEODBAfterInjHER->Fill(diff2);
299 if (diff2 > 1000) hDAQStat->Fill(7);
300 if (hCM63AfterInjHER) hCM63AfterInjHER->Fill(diff2);
304 if (diff2 > 1000) hDAQStat->Fill(9);
305 if (hTruncAfterInjHER) hTruncAfterInjHER->Fill(diff2);
309 if (diff2 > 1000) hDAQStat->Fill(17);
310 if (hMissAfterInjHER) hMissAfterInjHER->Fill(diff2);
314 if (hEODBAfterInjLER) hEODBAfterInjLER->Fill(diff2);
318 if (diff2 > 1000) hDAQStat->Fill(8);
319 if (hCM63AfterInjLER) hCM63AfterInjLER->Fill(diff2);
323 if (diff2 > 1000) hDAQStat->Fill(10);
324 if (hTruncAfterInjLER) hTruncAfterInjLER->Fill(diff2);
328 if (diff2 > 1000) hDAQStat->Fill(18);
329 if (hMissAfterInjLER) hMissAfterInjLER->Fill(diff2);
337 if (truncFlag) hDAQStat->Fill(1);
338 if (cm63Flag) hDAQStat->Fill(4);
339 if (missingFlag) hDAQStat->Fill(11);
340 if (timeoutFlag) hDAQStat->Fill(12);
341 if (nolinkFlag) hDAQStat->Fill(13);
342 if (mismatchFlag) hDAQStat->Fill(14);
345 if (eodbFlag) hDAQStat->Fill(0);