11 #include <pxd/modules/pxdDQM/PXDRawDQMModule.h>
12 #include <vxd/geometry/GeoCache.h>
14 #include <TDirectory.h>
15 #include <boost/format.hpp>
37 setDescription(
"Monitor raw PXD");
38 setPropertyFlags(c_ParallelProcessingCertified);
39 addParam(
"histogramDirectoryName", m_histogramDirectoryName,
"Name of the directory where histograms will be placed",
40 std::string(
"pxdraw"));
42 addParam(
"RawPXDsName", m_storeRawPxdrarrayName,
"The name of the StoreArray of RawPXDs to be processed",
string(
""));
43 addParam(
"PXDRawHitsName", m_storeRawHitsName,
"The name of the StoreArray of PXDRawHits to be processed",
string(
""));
44 addParam(
"PXDRawAdcsName", m_storeRawAdcsName,
"The name of the StoreArray of PXDRawAdcs to be processed",
string(
""));
47 void PXDRawDQMModule::defineHisto()
50 TDirectory* oldDir = gDirectory;
51 if (m_histogramDirectoryName !=
"") {
52 oldDir->mkdir(m_histogramDirectoryName.c_str());
53 oldDir->cd(m_histogramDirectoryName.c_str());
56 hrawPxdPackets =
new TH1F(
"hrawPxdPackets",
"Pxd Raw Packet Nr;Nr per Event", 16, 0, 16);
57 hrawPxdPacketSize =
new TH1F(
"hrawPxdPacketSize",
"Pxd Raw Packetsize;Words per packet", 1024, 0, 1024);
58 hrawPxdHitMapAll =
new TH2F(
"hrawPxdHitMapAll",
59 "Pxd Raw Hit Map Overview;column+(ladder-1)*300+100;row+850*((layer-1)*2+(sensor-1))", 3700 / 50, 0, 3700, 3500 / 50, 0, 3500);
64 hrawPxdHitsCount =
new TH1F(
"hrawPxdCount",
"Pxd Raw Count ;Nr per Event", 8192, 0, 8192);
65 for (
auto i = 0; i < 64; i++) {
66 auto layer = (((i >> 5) & 0x1) + 1);
67 auto ladder = ((i >> 1) & 0xF);
68 auto sensor = ((i & 0x1) + 1);
72 string s = str(format(
"Sensor %d:%d:%d (DHH ID %02Xh)") % layer % ladder % sensor % i);
73 string s2 = str(format(
"_%d.%d.%d") % layer % ladder % sensor);
75 hrawPxdHitMap[i] =
new TH2F((
"hrawPxdHitMap" + s2).c_str(),
76 (
"Pxd Raw Hit Map, " + s +
";column;row").c_str(), 250,
78 hrawPxdChargeMap[i] =
new TH2F((
"hrawPxdChargeMap" + s2).c_str(),
79 (
"Pxd Raw Charge Map, " + s +
";column;row").c_str(), 250, 0, 250, 768, 0, 768);
80 hrawPxdHitsCharge[i] =
new TH1F((
"hrawPxdHitsCharge" + s2).c_str(),
81 (
"Pxd Raw Hit Charge, " + s +
";Charge").c_str(), 256, 0, 256);
82 hrawPxdHitTimeWindow[i] =
new TH1F((
"hrawPxdHitTimeWindow" + s2).c_str(),
83 (
"Pxd Raw Hit Time Window (framenr*192-gate_of_hit), " + s +
";Time [a.u.]").c_str(), 2048, -256, 2048 - 256);
84 hrawPxdGateTimeWindow[i] =
new TH1F((
"hrawPxdGateTimeWindow" + s2).c_str(),
85 (
"Pxd Raw Gate Time Window (framenr*192-triggergate_of_hit), " + s +
";Time [a.u.]").c_str(), 2048, -256, 2048 - 256);
87 hrawPxdHitMap[i] = NULL;
88 hrawPxdChargeMap[i] = NULL;
89 hrawPxdHitsCharge[i] = NULL;
90 hrawPxdHitTimeWindow[i] = NULL;
91 hrawPxdGateTimeWindow[i] = NULL;
99 void PXDRawDQMModule::initialize()
102 m_storeRawPxdrarray.isOptional(m_storeRawPxdrarrayName);
103 m_storeRawHits.isRequired(m_storeRawHitsName);
104 m_storeRawAdcs.isRequired(m_storeRawAdcsName);
105 m_storeDAQEvtStats.isRequired();
108 void PXDRawDQMModule::beginRun()
111 if (hrawPxdPackets) hrawPxdPackets->Reset();
112 if (hrawPxdPacketSize) hrawPxdPacketSize->Reset();
113 if (hrawPxdHitsCount) hrawPxdHitsCount->Reset();
114 if (hrawPxdHitMapAll) hrawPxdHitMapAll->Reset();
115 if (hrawPxdAdcMapAll) hrawPxdAdcMapAll->Reset();
116 for (
int i = 0; i < 64; i++) {
117 if (hrawPxdHitMap[i]) hrawPxdHitMap[i]->Reset();
118 if (hrawPxdChargeMap[i]) hrawPxdChargeMap[i]->Reset();
119 if (hrawPxdHitsCharge[i]) hrawPxdHitsCharge[i]->Reset();
120 if (hrawPxdHitTimeWindow[i]) hrawPxdHitTimeWindow[i]->Reset();
121 if (hrawPxdGateTimeWindow[i]) hrawPxdGateTimeWindow[i]->Reset();
125 void PXDRawDQMModule::event()
127 hrawPxdPackets->Fill(m_storeRawPxdrarray.getEntries());
129 for (
auto& it : m_storeRawPxdrarray) {
130 if (hrawPxdPacketSize) hrawPxdPacketSize->Fill(it.size());
133 if (hrawPxdHitsCount) hrawPxdHitsCount->Fill(m_storeRawHits.getEntries());
135 for (
auto& it : m_storeRawHits) {
137 VxdID currentVxdId = it.getSensorID();
143 const PXDDAQDHEStatus* dhe = (*m_storeDAQEvtStats).findDHE(currentVxdId);
144 if (dhe ==
nullptr) {
145 B2ERROR(
"No DHE found for SensorId: " << currentVxdId);
152 if (dhh_id == 0 || dhh_id >= 64) {
153 B2ERROR(
"SensorId (DHH ID) out of range: " << dhh_id);
156 if (hrawPxdHitMap[dhh_id]) hrawPxdHitMap[dhh_id]->Fill(it.getColumn(), it.getRow());
157 if (hrawPxdHitMapAll) hrawPxdHitMapAll->Fill(it.getColumn() + ladder * 300 - 200,
158 100 + it.getRow() + 850 * (layer + layer + sensor - 3));
159 if (hrawPxdChargeMap[dhh_id]) hrawPxdChargeMap[dhh_id]->Fill(it.getColumn(), it.getRow(), it.getCharge());
160 if (hrawPxdHitsCharge[dhh_id]) hrawPxdHitsCharge[dhh_id]->Fill(it.getCharge());
163 if (hrawPxdHitTimeWindow[dhh_id]) hrawPxdHitTimeWindow[dhh_id]->Fill(it.getFrameNr() * 192 - it.getRow() / 4);
164 if (hrawPxdGateTimeWindow[dhh_id]) hrawPxdGateTimeWindow[dhh_id]->Fill(it.getFrameNr() * 192 - startGate);
167 if (hrawPxdAdcMapAll) {
168 for (
auto& it : m_storeRawAdcs) {
171 unsigned int layer, ladder, sensor;
173 currentVxdId = it.getSensorID();
178 dhh_id = ((layer - 1) << 5) | ((ladder) << 1) | (sensor - 1);
179 if (dhh_id <= 0 || dhh_id >= 64) {
180 B2ERROR(
"SensorId (DHH ID) out of range: " << dhh_id);
184 unsigned int chip_offset;
185 chip_offset = it.getChip() * 64;
186 const unsigned char* data = &it.getData()[0];
187 for (
int row = 0; row < 768; row++) {
188 for (
int col = 0; col < 64; col++) {
189 hrawPxdAdcMapAll->Fill(col + chip_offset + ladder * 300 - 200, 100 + row + 850 * (layer + layer + sensor - 3), *(data++));