9 #include <pxd/modules/pxdDQM/PXDDAQDQMModule.h>
11 #include <TDirectory.h>
13 #include <boost/format.hpp>
19 using namespace Belle2::PXD::PXDError;
35 setDescription(
"Monitor DAQ errors");
36 setPropertyFlags(c_ParallelProcessingCertified);
37 addParam(
"histogramDirectoryName", m_histogramDirectoryName,
"Name of the directory where histograms will be placed",
38 std::string(
"pxdDAQ"));
41 void PXDDAQDQMModule::defineHisto()
43 TDirectory* oldDir = gDirectory;
44 if (m_histogramDirectoryName !=
"") {
45 oldDir->mkdir(m_histogramDirectoryName.c_str());
46 oldDir->cd(m_histogramDirectoryName.c_str());
49 hDAQErrorEvent =
new TH1D(
"PXDDAQError",
"PXDDAQError/Event;;Count", ONSEN_USED_TYPE_ERR, 0, ONSEN_USED_TYPE_ERR);
50 hDAQErrorDHC =
new TH2D(
"PXDDAQDHCError",
"PXDDAQError/DHC;DHC ID;", 16, 0, 16, ONSEN_USED_TYPE_ERR, 0, ONSEN_USED_TYPE_ERR);
51 hDAQErrorDHE =
new TH2D(
"PXDDAQDHEError",
"PXDDAQError/DHE;DHE ID;", 64, 0, 64, ONSEN_USED_TYPE_ERR, 0, ONSEN_USED_TYPE_ERR);
52 hDAQUseableModule =
new TH1D(
"PXDDAQUseableModule",
"PXDDAQUseableModule/DHE;DHE ID;", 64, 0, 64);
53 hDAQNotUseableModule =
new TH1D(
"PXDDAQNotUseableModule",
"PXDDAQNotUseableModule/DHE;DHE ID;", 64, 0, 64);
54 hDAQDHPDataMissing =
new TH1D(
"PXDDAQDHPDataMissing",
"PXDDAQDHPDataMissing/DHE*DHP;DHE ID;", 64 * 4, 0, 64);
55 hDAQEndErrorDHC =
new TH2D(
"PXDDAQDHCEndError",
"PXDDAQEndError/DHC;DHC ID;", 16, 0, 16, 32, 0, 32);
56 hDAQEndErrorDHE =
new TH2D(
"PXDDAQDHEEndError",
"PXDDAQEndError/DHE;DHE ID;", 64, 0, 64, 4 * 2 * 8, 0, 4 * 2 * 8);
62 for (
int i = 0; i < ONSEN_USED_TYPE_ERR; i++) {
63 const char* label = getPXDBitErrorName(i).c_str();
64 hDAQErrorEvent->GetXaxis()->SetBinLabel(i + 1, label);
65 hDAQErrorDHE->GetYaxis()->SetBinLabel(i + 1, label);
66 hDAQErrorDHC->GetYaxis()->SetBinLabel(i + 1, label);
69 hDAQErrorEvent->LabelsOption(
"v");
71 std::vector<VxdID> sensors = m_vxdGeometry.getListOfSensors();
72 for (
VxdID& avxdid : sensors) {
74 if (info.getType() != VXD::SensorInfoBase::PXD)
continue;
77 TString buff = (std::string)avxdid;
78 TString bufful = buff;
79 buff.ReplaceAll(
".",
"_");
84 hDAQDHETriggerGate[avxdid] =
new TH1D(
"PXDDAQDHETriggerGate_" + bufful,
85 "TriggerGate DHE " + buff +
"; Trigger Gate; Counts", 192, 0, 192);
86 hDAQDHEReduction[avxdid] =
new TH1D(
"PXDDAQDHEDataReduction_" + bufful,
"Data Reduction DHE " + buff +
"; Raw/Red; Counts", 200, 0,
88 hDAQCM[avxdid] =
new TH2D(
"PXDDAQCM_" + bufful,
"Common Mode on DHE " + buff +
"; Gate+Chip*192; Common Mode", 192 * 4, 0, 192 * 4,
90 hDAQCM2[avxdid] =
new TH1D(
"PXDDAQCM2_" + bufful,
"Common Mode on DHE " + buff +
"; Common Mode", 64, 0, 64);
92 for (
int i = 0; i < 16; i++) {
93 hDAQDHCReduction[i] =
new TH1D((
"PXDDAQDHCDataReduction_" + str(format(
"%d") % i)).c_str(),
94 (
"Data Reduction DHC " + str(format(
" %d") % i) +
"; Raw/Red; Counts").c_str(), 200, 0,
100 hEODBAfterInjLER =
new TH1I(
"PXDEODBInjLER",
"PXDEODBInjLER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
101 hEODBAfterInjHER =
new TH1I(
"PXDEODBInjHER",
"PXDEODBInjHER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
102 hCM63AfterInjLER =
new TH1I(
"PXDCM63InjLER",
"PXDCM63InjLER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
103 hCM63AfterInjHER =
new TH1I(
"PXDCM63InjHER",
"PXDCM63InjHER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
104 hTruncAfterInjLER =
new TH1I(
"PXDTruncInjLER",
"PXDTruncInjLER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
105 hTruncAfterInjHER =
new TH1I(
"PXDTruncInjHER",
"PXDTruncInjHER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
106 hMissAfterInjLER =
new TH1I(
"PXDMissInjLER",
"PXDMissInjLER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
107 hMissAfterInjHER =
new TH1I(
"PXDMissInjHER",
"PXDMissInjHER/Time;Time in #mus;Events/Time (5 #mus bins)", 4000, 0, 20000);
108 hEODBTrgDiff =
new TH1I(
"PXDEODBTrgDiff",
"PXDEODBTrgDiff/DiffTime;DiffTime in #mus;Events/Time (1 #mus bins)", 2000, 0, 2000);
109 hCM63TrgDiff =
new TH1I(
"PXDCM63TrgDiff",
"PXDCM63TrgDiff/DiffTime;DiffTime in #mus;Events/Time (1 #mus bins)", 2000, 0, 2000);
110 hTruncTrgDiff =
new TH1I(
"PXDTruncTrgDiff",
"PXDTruncTrgDiff/DiffTime;DiffTime in #mus;Events/Time (1 #mus bins)", 2000, 0, 2000);
111 hMissTrgDiff =
new TH1I(
"PXDMissTrgDiff",
"PXDMissTrgDiff/DiffTime;DiffTime in #mus;Events/Time (1 #mus bins)", 2000, 0, 2000);
113 hDAQStat =
new TH1D(
"PXDDAQStat",
"PXDDAQStat", 20, 0, 20);
114 auto xa = hDAQStat->GetXaxis();
117 xa->SetBinLabel(0 + 1,
"EODB/HLT rej");
118 xa->SetBinLabel(1 + 1,
"Trunc 8%");
119 xa->SetBinLabel(2 + 1,
"HER Trunc");
120 xa->SetBinLabel(3 + 1,
"LER Trunc");
121 xa->SetBinLabel(4 + 1,
"CM63");
122 xa->SetBinLabel(5 + 1,
"HER CM63");
123 xa->SetBinLabel(6 + 1,
"LER CM63");
124 xa->SetBinLabel(7 + 1,
"HER CM63>1ms");
125 xa->SetBinLabel(8 + 1,
"LER CM63>1ms");
126 xa->SetBinLabel(9 + 1,
"HER Trunc>1ms");
127 xa->SetBinLabel(10 + 1,
"LER Trunc>1ms");
128 xa->SetBinLabel(11 + 1,
"MissFrame");
129 xa->SetBinLabel(12 + 1,
"Timeout");
130 xa->SetBinLabel(13 + 1,
"Link Down");
131 xa->SetBinLabel(14 + 1,
"Mismatch");
132 xa->SetBinLabel(15 + 1,
"HER MissFrame");
133 xa->SetBinLabel(16 + 1,
"LER MissFrame");
134 xa->SetBinLabel(17 + 1,
"HER MissFrame>1ms");
135 xa->SetBinLabel(18 + 1,
"LER MissFrame>1ms");
136 xa->SetBinLabel(19 + 1,
"unused");
142 void PXDDAQDQMModule::initialize()
145 m_storeDAQEvtStats.isRequired();
146 m_rawTTD.isOptional();
147 m_rawSVD.isOptional();
150 void PXDDAQDQMModule::beginRun()
152 hDAQErrorEvent->Reset();
153 hDAQErrorDHC->Reset();
154 hDAQErrorDHE->Reset();
155 hDAQUseableModule->Reset();
156 hDAQNotUseableModule->Reset();
157 hDAQDHPDataMissing->Reset();
158 hDAQEndErrorDHC->Reset();
159 hDAQEndErrorDHE->Reset();
160 for (
auto& it : hDAQDHETriggerGate)
if (it.second) it.second->Reset();
161 for (
auto& it : hDAQDHCReduction)
if (it.second) it.second->Reset();
162 for (
auto& it : hDAQDHEReduction)
if (it.second) it.second->Reset();
163 for (
auto& it : hDAQCM)
if (it.second) it.second->Reset();
164 for (
auto& it : hDAQCM2)
if (it.second) it.second->Reset();
165 if (hCM63AfterInjLER) hCM63AfterInjLER->Reset();
166 if (hCM63AfterInjHER) hCM63AfterInjHER->Reset();
167 if (hTruncAfterInjLER) hTruncAfterInjLER->Reset();
168 if (hTruncAfterInjHER) hTruncAfterInjHER->Reset();
169 if (hMissAfterInjLER) hMissAfterInjLER->Reset();
170 if (hMissAfterInjHER) hMissAfterInjHER->Reset();
174 void PXDDAQDQMModule::event()
176 hDAQErrorEvent->Fill(-1);
178 hDAQDHPDataMissing->Fill(-1);
179 hDAQErrorDHC->Fill(-1, -1);
180 hDAQErrorDHE->Fill(-1, -1);
181 for (
auto& it : hDAQCM2)
if (it.second) it.second->Fill(-1);
187 bool eodbFlag = m_rawSVD.getEntries() == 0;
189 bool truncFlag =
false;
190 bool nolinkFlag =
false;
191 bool missingFlag =
false;
192 bool timeoutFlag =
false;
193 bool mismatchFlag =
false;
194 bool cm63Flag =
false;
196 B2DEBUG(20,
"Iterate PXD DAQ Status");
197 auto evt = *m_storeDAQEvtStats;
198 auto evt_emask = evt.getErrorMask();
199 for (
int i = 0; i < ONSEN_MAX_TYPE_ERR; i++) {
200 if (evt_emask[i]) hDAQErrorEvent->Fill(getPXDBitErrorName(i).c_str(), 1);
202 B2DEBUG(20,
"Iterate PXD Packets, Err " << evt_emask);
203 for (
auto& pkt : evt) {
204 B2DEBUG(20,
"Iterate PXD DHC in Pkt " << pkt.getPktIndex());
205 for (
auto& dhc : pkt) {
206 hDAQErrorDHC->Fill(dhc.getDHCID(), -1);
207 auto dhc_emask = dhc.getErrorMask();
208 for (
int i = 0; i < ONSEN_MAX_TYPE_ERR; i++) {
209 if (dhc_emask[i]) hDAQErrorDHC->Fill(dhc.getDHCID(), i);
211 unsigned int cmask = dhc.getEndErrorInfo();
212 for (
int i = 0; i < 32; i++) {
213 unsigned int mask = (1 << i);
214 if ((cmask & mask) == mask) hDAQEndErrorDHC->Fill(dhc.getDHCID(), i);
216 if (hDAQDHCReduction[dhc.getDHCID()]) {
217 float red = dhc.getRedCnt() ? float(dhc.getRawCnt()) / dhc.getRedCnt() : 0.;
218 B2DEBUG(98,
"==DHC " << dhc.getDHCID() <<
"(Raw)" << dhc.getRawCnt() <<
" / (Red)" << dhc.getRedCnt() <<
" = " << red);
219 if (red >= 40.) red = 39.999999999;
220 hDAQDHCReduction[dhc.getDHCID()]->Fill(red);
222 B2DEBUG(20,
"Iterate PXD DHE in DHC " << dhc.getDHCID() <<
" , Err " << dhc_emask);
223 for (
auto& dhe : dhc) {
224 hDAQErrorDHE->Fill(dhe.getDHEID(), -1);
225 auto dhe_emask = dhe.getErrorMask();
226 B2DEBUG(20,
"DHE " << dhe.getDHEID() <<
" , Err " << dhe_emask);
227 for (
int i = 0; i < ONSEN_MAX_TYPE_ERR; i++) {
228 if (dhe_emask[i]) hDAQErrorDHE->Fill(dhe.getDHEID(), i);
230 if (dhe.isUsable()) {
231 hDAQUseableModule->Fill(dhe.getDHEID());
233 hDAQNotUseableModule->Fill(dhe.getDHEID());
235 for (
int i = 0; i < 4; i++) {
236 if ((dhe.getDHPFoundMask() & (1 << i)) == 0) hDAQDHPDataMissing->Fill(dhe.getDHEID() + i * 0.25);
238 for (
auto& dhp : dhe) {
239 truncFlag |= dhp.getTruncated();
241 unsigned int emask = dhe.getEndErrorInfo();
243 for (
int i = 0; i < 4 * 2; i++) {
244 auto sm = (emask >> i * 4) & 0xF;
246 if (sm > 0) hDAQEndErrorDHE->Fill(dhe.getDHEID(), i * 8 + sm);
247 missingFlag |= sm == 0x1;
248 timeoutFlag |= sm == 0x2;
249 nolinkFlag |= sm == 0x3;
251 mismatchFlag |= sm == 0x5;
252 truncFlag |= sm == 0x6;
255 if (hDAQDHETriggerGate[dhe.getSensorID()]) hDAQDHETriggerGate[dhe.getSensorID()]->Fill(dhe.getTriggerGate());
256 if (hDAQDHEReduction[dhe.getSensorID()]) {
257 float red = dhe.getRedCnt() ? float(dhe.getRawCnt()) / dhe.getRedCnt() : 0.;
258 B2DEBUG(98,
"==DHE " << dhe.getSensorID() <<
"(Raw)" << dhe.getRawCnt() <<
" / (Red)" << dhe.getRedCnt() <<
" = " << red);
259 if (red >= 40.) red = 39.999999999;
260 hDAQDHEReduction[dhe.getSensorID()]->Fill(red);
262 for (
auto cm = dhe.cm_begin(); cm < dhe.cm_end(); ++cm) {
264 if (hDAQCM[dhe.getSensorID()]) hDAQCM[dhe.getSensorID()]->Fill(std::get<0>(*cm) * 192 + std::get<1>(*cm) / 4, std::get<2>(*cm));
265 if (hDAQCM2[dhe.getSensorID()]) hDAQCM2[dhe.getSensorID()]->Fill(std::get<2>(*cm));
272 cm63Flag |= 63 == std::get<2>(*cm);
279 for (
auto& it : m_rawTTD) {
284 double lasttrig = it.GetTimeSincePrevTrigger(0) / 127.;
285 if (eodbFlag && hEODBTrgDiff) hEODBTrgDiff->Fill(lasttrig);
286 if (cm63Flag && hCM63TrgDiff) hCM63TrgDiff->Fill(lasttrig);
287 if (truncFlag && hTruncTrgDiff) hTruncTrgDiff->Fill(lasttrig);
288 if (missingFlag && hMissTrgDiff) hMissTrgDiff->Fill(lasttrig);
291 auto difference = it.GetTimeSinceLastInjection(0);
293 if (difference != 0x7FFFFFFF) {
294 double diff2 = difference / 127.;
295 if (it.GetIsHER(0)) {
297 if (hEODBAfterInjHER) hEODBAfterInjHER->Fill(diff2);
301 if (diff2 > 1000) hDAQStat->Fill(7);
302 if (hCM63AfterInjHER) hCM63AfterInjHER->Fill(diff2);
306 if (diff2 > 1000) hDAQStat->Fill(9);
307 if (hTruncAfterInjHER) hTruncAfterInjHER->Fill(diff2);
311 if (diff2 > 1000) hDAQStat->Fill(17);
312 if (hMissAfterInjHER) hMissAfterInjHER->Fill(diff2);
316 if (hEODBAfterInjLER) hEODBAfterInjLER->Fill(diff2);
320 if (diff2 > 1000) hDAQStat->Fill(8);
321 if (hCM63AfterInjLER) hCM63AfterInjLER->Fill(diff2);
325 if (diff2 > 1000) hDAQStat->Fill(10);
326 if (hTruncAfterInjLER) hTruncAfterInjLER->Fill(diff2);
330 if (diff2 > 1000) hDAQStat->Fill(18);
331 if (hMissAfterInjLER) hMissAfterInjLER->Fill(diff2);
339 if (truncFlag) hDAQStat->Fill(1);
340 if (cm63Flag) hDAQStat->Fill(4);
341 if (missingFlag) hDAQStat->Fill(11);
342 if (timeoutFlag) hDAQStat->Fill(12);
343 if (nolinkFlag) hDAQStat->Fill(13);
344 if (mismatchFlag) hDAQStat->Fill(14);
347 if (eodbFlag) hDAQStat->Fill(0);
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
Class to faciliate easy access to sensor information of the VXD like coordinate transformations or pi...
Base class to provide Sensor Information for PXD and SVD.
Class to uniquely identify a any structure of the PXD and SVD.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Namespace to encapsulate code needed for simulation and reconstrucion of the PXD.
Namespace to provide code needed by both Vertex Detectors, PXD and SVD, and also testbeam telescopes.
Abstract base class for different kinds of events.