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()
178 hDAQErrorEvent->Fill(-1);
180 hDAQDHPDataMissing->Fill(-1);
181 hDAQErrorDHC->Fill(-1, -1);
182 hDAQErrorDHE->Fill(-1, -1);
183 for (
auto& it : hDAQCM2)
if (it.second) it.second->Fill(-1);
189 bool eodbFlag = m_rawSVD.getEntries() == 0;
191 bool truncFlag =
false;
192 bool nolinkFlag =
false;
193 bool missingFlag =
false;
194 bool timeoutFlag =
false;
195 bool mismatchFlag =
false;
196 bool cm63Flag =
false;
198 B2DEBUG(20,
"Iterate PXD DAQ Status");
199 auto evt = *m_storeDAQEvtStats;
200 PXDErrorFlags evt_emask = evt.getErrorMask();
201 for (
int i = 0; i < ONSEN_MAX_TYPE_ERR; i++) {
202 PXDErrorFlags mask = (1ull << i);
203 if ((evt_emask & mask) == mask) hDAQErrorEvent->Fill(getPXDBitErrorName(i).c_str(), 1);
205 B2DEBUG(20,
"Iterate PXD Packets, Err " << evt_emask);
206 for (
auto& pkt : evt) {
207 B2DEBUG(20,
"Iterate PXD DHC in Pkt " << pkt.getPktIndex());
208 for (
auto& dhc : pkt) {
209 hDAQErrorDHC->Fill(dhc.getDHCID(), -1);
210 PXDErrorFlags dhc_emask = dhc.getErrorMask();
211 for (
int i = 0; i < ONSEN_MAX_TYPE_ERR; i++) {
212 PXDErrorFlags mask = (1ull << i);
213 if ((dhc_emask & mask) == mask) hDAQErrorDHC->Fill(dhc.getDHCID(), i);
215 unsigned int cmask = dhc.getEndErrorInfo();
216 for (
int i = 0; i < 32; i++) {
217 unsigned int mask = (1 << i);
218 if ((cmask & mask) == mask) hDAQEndErrorDHC->Fill(dhc.getDHCID(), i);
220 if (hDAQDHCReduction[dhc.getDHCID()]) {
221 float red = dhc.getRedCnt() ? float(dhc.getRawCnt()) / dhc.getRedCnt() : 0.;
222 B2DEBUG(98,
"==DHC " << dhc.getDHCID() <<
"(Raw)" << dhc.getRawCnt() <<
" / (Red)" << dhc.getRedCnt() <<
" = " << red);
223 if (red >= 40.) red = 39.999999999;
224 hDAQDHCReduction[dhc.getDHCID()]->Fill(red);
226 B2DEBUG(20,
"Iterate PXD DHE in DHC " << dhc.getDHCID() <<
" , Err " << dhc_emask);
227 for (
auto& dhe : dhc) {
228 hDAQErrorDHE->Fill(dhe.getDHEID(), -1);
229 PXDErrorFlags dhe_emask = dhe.getErrorMask();
230 B2DEBUG(20,
"DHE " << dhe.getDHEID() <<
" , Err " << dhe_emask);
231 for (
int i = 0; i < ONSEN_MAX_TYPE_ERR; i++) {
232 PXDErrorFlags mask = (1ull << i);
233 if ((dhe_emask & mask) == mask) hDAQErrorDHE->Fill(dhe.getDHEID(), i);
235 if (dhe.isUsable()) {
236 hDAQUseableModule->Fill(dhe.getDHEID());
238 hDAQNotUseableModule->Fill(dhe.getDHEID());
240 for (
int i = 0; i < 4; i++) {
241 if ((dhe.getDHPFoundMask() & (1 << i)) == 0) hDAQDHPDataMissing->Fill(dhe.getDHEID() + i * 0.25);
243 for (
auto& dhp : dhe) {
244 truncFlag |= dhp.getTruncated();
246 unsigned int emask = dhe.getEndErrorInfo();
248 for (
int i = 0; i < 4 * 2; i++) {
249 auto sm = (emask >> i * 4) & 0xF;
251 if (sm > 0) hDAQEndErrorDHE->Fill(dhe.getDHEID(), i * 8 + sm);
252 missingFlag |= sm == 0x1;
253 timeoutFlag |= sm == 0x2;
254 nolinkFlag |= sm == 0x3;
256 mismatchFlag |= sm == 0x5;
257 truncFlag |= sm == 0x6;
260 if (hDAQDHETriggerGate[dhe.getSensorID()]) hDAQDHETriggerGate[dhe.getSensorID()]->Fill(dhe.getTriggerGate());
261 if (hDAQDHEReduction[dhe.getSensorID()]) {
262 float red = dhe.getRedCnt() ? float(dhe.getRawCnt()) / dhe.getRedCnt() : 0.;
263 B2DEBUG(98,
"==DHE " << dhe.getSensorID() <<
"(Raw)" << dhe.getRawCnt() <<
" / (Red)" << dhe.getRedCnt() <<
" = " << red);
264 if (red >= 40.) red = 39.999999999;
265 hDAQDHEReduction[dhe.getSensorID()]->Fill(red);
267 for (
auto cm = dhe.cm_begin(); cm < dhe.cm_end(); ++cm) {
269 if (hDAQCM[dhe.getSensorID()]) hDAQCM[dhe.getSensorID()]->Fill(std::get<0>(*cm) * 192 + std::get<1>(*cm) / 4, std::get<2>(*cm));
270 if (hDAQCM2[dhe.getSensorID()]) hDAQCM2[dhe.getSensorID()]->Fill(std::get<2>(*cm));
277 cm63Flag |= 63 == std::get<2>(*cm);
284 for (
auto& it : m_rawTTD) {
289 double lasttrig = it.GetTimeSincePrevTrigger(0) / 127.;
290 if (eodbFlag && hEODBTrgDiff) hEODBTrgDiff->Fill(lasttrig);
291 if (cm63Flag && hCM63TrgDiff) hCM63TrgDiff->Fill(lasttrig);
292 if (truncFlag && hTruncTrgDiff) hTruncTrgDiff->Fill(lasttrig);
293 if (missingFlag && hMissTrgDiff) hMissTrgDiff->Fill(lasttrig);
296 auto difference = it.GetTimeSinceLastInjection(0);
298 if (difference != 0x7FFFFFFF) {
299 double diff2 = difference / 127.;
300 if (it.GetIsHER(0)) {
302 if (hEODBAfterInjHER) hEODBAfterInjHER->Fill(diff2);
306 if (diff2 > 1000) hDAQStat->Fill(7);
307 if (hCM63AfterInjHER) hCM63AfterInjHER->Fill(diff2);
311 if (diff2 > 1000) hDAQStat->Fill(9);
312 if (hTruncAfterInjHER) hTruncAfterInjHER->Fill(diff2);
316 if (diff2 > 1000) hDAQStat->Fill(17);
317 if (hMissAfterInjHER) hMissAfterInjHER->Fill(diff2);
321 if (hEODBAfterInjLER) hEODBAfterInjLER->Fill(diff2);
325 if (diff2 > 1000) hDAQStat->Fill(8);
326 if (hCM63AfterInjLER) hCM63AfterInjLER->Fill(diff2);
330 if (diff2 > 1000) hDAQStat->Fill(10);
331 if (hTruncAfterInjLER) hTruncAfterInjLER->Fill(diff2);
335 if (diff2 > 1000) hDAQStat->Fill(18);
336 if (hMissAfterInjLER) hMissAfterInjLER->Fill(diff2);
344 if (truncFlag) hDAQStat->Fill(1);
345 if (cm63Flag) hDAQStat->Fill(4);
346 if (missingFlag) hDAQStat->Fill(11);
347 if (timeoutFlag) hDAQStat->Fill(12);
348 if (nolinkFlag) hDAQStat->Fill(13);
349 if (mismatchFlag) hDAQStat->Fill(14);
352 if (eodbFlag) hDAQStat->Fill(0);