13 #include "pxd/modules/pxdDQM/PXDDQMExpressRecoModule.h"
15 #include <pxd/geometry/SensorInfo.h>
16 #include <vxd/geometry/GeoCache.h>
17 #include <vxd/geometry/SensorInfoBase.h>
18 #include <vxd/geometry/GeoTools.h>
19 #include <pxd/unpacking/PXDMappingLookup.h>
21 #include <boost/format.hpp>
23 #include "TDirectory.h"
43 setDescription(
"PXD DQM module for Express Reco "
44 "Recommended Number of events for monitor is 40 kEvents or more to fill all histograms "
47 setPropertyFlags(c_ParallelProcessingCertified);
48 addParam(
"CutMinCharge", m_CutMinCharge,
49 "cut on pixel charge for accepting good pixel, default >= 12", 12);
50 addParam(
"CutMinSeedCharge", m_CutMinSeedCharge,
51 "cut on cluster seed for accepting good cluster, default >= 12", 12);
52 addParam(
"CutMaxClusterSize", m_CutMaxClusterSize,
53 "cut on cluster size accepting good cluster, default <= 4", 4);
54 addParam(
"CutMinClusterCharge", m_CutMinClusterCharge,
55 "cut on cluster charge for accepting good cluster, default >= 12", 12);
56 addParam(
"histogramDirectoryName", m_histogramDirectoryName,
"Name of the directory where histograms will be placed",
57 std::string(
"PXDER"));
65 void PXDDQMExpressRecoModule::defineHisto()
67 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
68 if (gTools->getNumberOfLayers() == 0) {
69 B2FATAL(
"Missing geometry for VXD, check steering file.");
71 if (gTools->getNumberOfPXDLayers() == 0) {
72 B2WARNING(
"Missing geometry for PXD, PXD-DQM is skipped.");
77 TDirectory* oldDir = gDirectory;
78 if (m_histogramDirectoryName !=
"") {
79 oldDir->mkdir(m_histogramDirectoryName.c_str());
80 oldDir->cd(m_histogramDirectoryName.c_str());
84 int nPXDSensors = gTools->getNumberOfPXDSensors();
85 int nPXDChips = gTools->getTotalPXDChips();
88 m_hitMapCounts =
new TH1D(
"DQMER_PXD_PixelHitmapCounts",
"PXD Integrated number of fired pixels per sensor",
89 nPXDSensors, 0, nPXDSensors);
90 m_hitMapCounts->GetXaxis()->SetTitle(
"Sensor ID");
91 m_hitMapCounts->GetYaxis()->SetTitle(
"counts");
93 m_hitMapFilterCounts =
new TH1D(
"DQMER_PXD_PixelHitmapFilterCounts",
"PXD Integrated number of filtered pixels per sensor",
94 nPXDSensors, 0, nPXDSensors);
95 m_hitMapFilterCounts->GetXaxis()->SetTitle(
"Sensor ID");
96 m_hitMapFilterCounts->GetYaxis()->SetTitle(
"counts");
98 m_hitMapClCounts =
new TH1D(
"DQMER_PXD_ClusterHitmapCounts",
"PXD Integrated number of clusters per sensor",
99 nPXDSensors, 0, nPXDSensors);
100 m_hitMapClCounts->GetXaxis()->SetTitle(
"Sensor ID");
101 m_hitMapClCounts->GetYaxis()->SetTitle(
"counts");
103 m_hitMapClFilterCounts =
new TH1D(
"DQMER_PXD_ClusterHitmapFilterCounts",
"PXD Integrated number of filtered clusters per sensor",
104 nPXDSensors, 0, nPXDSensors);
105 m_hitMapClFilterCounts->GetXaxis()->SetTitle(
"Sensor ID");
106 m_hitMapClFilterCounts->GetYaxis()->SetTitle(
"counts");
109 m_hitMapCountsChip =
new TH1D(
"DQMER_PXD_PixelHitmapCountsChip",
"PXD Integrated number of fired pixels per chip",
110 nPXDChips, 0, nPXDChips);
111 m_hitMapCountsChip->GetXaxis()->SetTitle(
"Chip ID");
112 m_hitMapCountsChip->GetYaxis()->SetTitle(
"counts");
113 m_hitMapClCountsChip =
new TH1D(
"DQMER_PXD_ClusterHitmapCountsChip",
"PXD Integrated number of clusters per chip",
114 nPXDChips, 0, nPXDChips);
115 m_hitMapClCountsChip->GetXaxis()->SetTitle(
"Chip ID");
116 m_hitMapClCountsChip->GetYaxis()->SetTitle(
"counts");
117 for (
int i = 0; i < nPXDChips; i++) {
118 VxdID id = gTools->getChipIDFromPXDIndex(i);
120 int iLadder =
id.getLadderNumber();
121 int iSensor =
id.getSensorNumber();
122 int iChip = gTools->getPXDChipNumber(
id);
123 int IsU = gTools->isPXDSideU(
id);
124 TString AxisTicks = Form(
"%i_%i_%i_u%iDCD", iLayer, iLadder, iSensor, iChip);
126 AxisTicks = Form(
"%i_%i_%i_v%iSWB", iLayer, iLadder, iSensor, iChip);
127 m_hitMapCountsChip->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
128 m_hitMapClCountsChip->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
131 for (
int i = 0; i < nPXDSensors; i++) {
132 VxdID id = gTools->getSensorIDFromPXDIndex(i);
134 int iLadder =
id.getLadderNumber();
135 int iSensor =
id.getSensorNumber();
136 TString AxisTicks = Form(
"%i_%i_%i", iLayer, iLadder, iSensor);
137 m_hitMapCounts->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
138 m_hitMapClCounts->GetXaxis()->SetBinLabel(i + 1, AxisTicks.Data());
141 m_fired.resize(nPXDSensors);
142 m_goodfired.resize(nPXDSensors);
143 m_clusters.resize(nPXDSensors);
144 m_goodclusters.resize(nPXDSensors);
149 m_clusterCharge.resize(nPXDSensors);
150 m_pixelSignal.resize(nPXDSensors);
151 m_clusterSizeU.resize(nPXDSensors);
152 m_clusterSizeV.resize(nPXDSensors);
153 m_clusterSizeUV.resize(nPXDSensors);
154 for (
int i = 0; i < nPXDSensors; i++) {
155 VxdID id = gTools->getSensorIDFromPXDIndex(i);
157 int iLadder =
id.getLadderNumber();
158 int iSensor =
id.getSensorNumber();
159 VxdID sensorID(iLayer, iLadder, iSensor);
161 string sensorDescr = str(format(
"%1%_%2%_%3%") % iLayer % iLadder % iSensor);
165 string name = str(format(
"DQMER_PXD_%1%_Fired") % sensorDescr);
166 string title = str(format(
"PXD Sensor %1% Fired pixels") % sensorDescr);
167 m_fired[i] =
new TH1D(name.c_str(), title.c_str(), 200, 0, 200);
168 m_fired[i]->SetCanExtend(TH1::kAllAxes);
169 m_fired[i]->GetXaxis()->SetTitle(
"# of fired pixels");
170 m_fired[i]->GetYaxis()->SetTitle(
"counts");
174 name = str(format(
"DQMER_PXD_%1%_GoodFired") % sensorDescr);
175 title = str(format(
"PXD Sensor %1% Good pixels") % sensorDescr);
176 m_goodfired[i] =
new TH1D(name.c_str(), title.c_str(), 200, 0, 200);
177 m_goodfired[i]->SetCanExtend(TH1::kAllAxes);
178 m_goodfired[i]->GetXaxis()->SetTitle(
"# of fired pixels");
179 m_goodfired[i]->GetYaxis()->SetTitle(
"counts");
183 name = str(format(
"DQMER_PXD_%1%_Clusters") % sensorDescr);
184 title = str(format(
"PXD Sensor %1% Clusters") % sensorDescr);
185 m_clusters[i] =
new TH1D(name.c_str(), title.c_str(), 200, 0, 200);
186 m_clusters[i]->SetCanExtend(TH1::kAllAxes);
187 m_clusters[i]->GetXaxis()->SetTitle(
"# of clusters");
188 m_clusters[i]->GetYaxis()->SetTitle(
"counts");
192 name = str(format(
"DQMER_PXD_%1%_GoodClusters") % sensorDescr);
193 title = str(format(
"PXD Sensor %1% Good clusters") % sensorDescr);
194 m_goodclusters[i] =
new TH1D(name.c_str(), title.c_str(), 200, 0, 200);
195 m_goodclusters[i]->SetCanExtend(TH1::kAllAxes);
196 m_goodclusters[i]->GetXaxis()->SetTitle(
"# of clusters");
197 m_goodclusters[i]->GetYaxis()->SetTitle(
"counts");
226 name = str(format(
"DQMER_PXD_%1%_ClusterCharge") % sensorDescr);
227 title = str(format(
"PXD Sensor %1% Cluster Charge") % sensorDescr);
228 m_clusterCharge[i] =
new TH1D(name.c_str(), title.c_str(), 256, 0, 256);
229 m_clusterCharge[i]->GetXaxis()->SetTitle(
"charge of clusters [ADU]");
230 m_clusterCharge[i]->GetYaxis()->SetTitle(
"counts");
234 name = str(format(
"DQMER_PXD_%1%_PixelSignal") % sensorDescr);
235 title = str(format(
"PXD Sensor %1% Pixel Signal") % sensorDescr);
236 m_pixelSignal[i] =
new TH1D(name.c_str(), title.c_str(), 256, 0, 256);
237 m_pixelSignal[i]->GetXaxis()->SetTitle(
"signal of pixels [ADU]");
238 m_pixelSignal[i]->GetYaxis()->SetTitle(
"counts");
242 name = str(format(
"DQMER_PXD_%1%_ClusterSizeU") % sensorDescr);
243 title = str(format(
"PXD Sensor %1% Cluster Size U") % sensorDescr);
244 m_clusterSizeU[i] =
new TH1D(name.c_str(), title.c_str(), 10, 0, 10);
245 m_clusterSizeU[i]->GetXaxis()->SetTitle(
"size of u clusters");
246 m_clusterSizeU[i]->GetYaxis()->SetTitle(
"counts");
250 name = str(format(
"DQMER_PXD_%1%_ClusterSizeV") % sensorDescr);
251 title = str(format(
"PXD Sensor %1% Cluster Size V") % sensorDescr);
252 m_clusterSizeV[i] =
new TH1D(name.c_str(), title.c_str(), 10, 0, 10);
253 m_clusterSizeV[i]->GetXaxis()->SetTitle(
"size of v clusters");
254 m_clusterSizeV[i]->GetYaxis()->SetTitle(
"counts");
258 name = str(format(
"DQMER_PXD_%1%_ClusterSizeUV") % sensorDescr);
259 title = str(format(
"PXD Sensor %1% Cluster Size U+V") % sensorDescr);
260 m_clusterSizeUV[i] =
new TH1D(name.c_str(), title.c_str(), 10, 0, 10);
261 m_clusterSizeUV[i]->GetXaxis()->SetTitle(
"size of u+v clusters");
262 m_clusterSizeUV[i]->GetYaxis()->SetTitle(
"counts");
269 void PXDDQMExpressRecoModule::initialize()
274 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
275 if (gTools->getNumberOfPXDLayers() != 0) {
277 m_storePXDDigits.isOptional(m_storePXDDigitsName);
278 m_storePXDClusters.isOptional(m_storePXDClustersName);
282 void PXDDQMExpressRecoModule::beginRun()
284 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
285 if (gTools->getNumberOfPXDLayers() == 0)
return;
287 if (m_hitMapCounts !=
nullptr) m_hitMapCounts->Reset();
288 if (m_hitMapFilterCounts !=
nullptr) m_hitMapFilterCounts->Reset();
289 if (m_hitMapClCounts !=
nullptr) m_hitMapClCounts->Reset();
290 if (m_hitMapClFilterCounts !=
nullptr) m_hitMapClFilterCounts->Reset();
291 if (m_hitMapCountsChip !=
nullptr) m_hitMapCountsChip->Reset();
292 if (m_hitMapClCountsChip !=
nullptr) m_hitMapClCountsChip->Reset();
294 for (
int i = 0; i < gTools->getNumberOfPXDSensors(); i++) {
295 if (m_fired[i] !=
nullptr) m_fired[i]->Reset();
296 if (m_goodfired[i] !=
nullptr) m_goodfired[i]->Reset();
297 if (m_clusters[i] !=
nullptr) m_clusters[i]->Reset();
298 if (m_goodclusters[i] !=
nullptr) m_goodclusters[i]->Reset();
303 if (m_clusterCharge[i] !=
nullptr) m_clusterCharge[i]->Reset();
304 if (m_pixelSignal[i] !=
nullptr) m_pixelSignal[i]->Reset();
305 if (m_clusterSizeU[i] !=
nullptr) m_clusterSizeU[i]->Reset();
306 if (m_clusterSizeV[i] !=
nullptr) m_clusterSizeV[i]->Reset();
307 if (m_clusterSizeUV[i] !=
nullptr) m_clusterSizeUV[i]->Reset();
313 void PXDDQMExpressRecoModule::event()
315 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
316 if (gTools->getNumberOfPXDLayers() == 0)
return;
319 if (!m_storePXDDigits || !m_storePXDDigits.getEntries())
return;
321 int nPXDSensors = gTools->getNumberOfPXDSensors();
325 vector< int > Pixels(nPXDSensors);
326 vector< int > GoodPixels(nPXDSensors);
327 for (
const PXDDigit& digit : m_storePXDDigits) {
328 int iLayer = digit.getSensorID().getLayerNumber();
329 int iLadder = digit.getSensorID().getLadderNumber();
330 int iSensor = digit.getSensorID().getSensorNumber();
331 VxdID sensorID(iLayer, iLadder, iSensor);
332 int index = gTools->getPXDSensorIndex(sensorID);
335 int iChip = PXDMappingLookup::getDCDID(digit.getUCellID(), digit.getVCellID(), sensorID);
336 int indexChip = gTools->getPXDChipIndex(sensorID, kTRUE, iChip);
337 if (m_hitMapCountsChip !=
nullptr) m_hitMapCountsChip->Fill(indexChip);
338 iChip = PXDMappingLookup::getSWBID(digit.getVCellID());
339 indexChip = gTools->getPXDChipIndex(sensorID, kFALSE, iChip);
340 if (m_hitMapCountsChip !=
nullptr) m_hitMapCountsChip->Fill(indexChip);
341 if (m_pixelSignal[index] !=
nullptr) m_pixelSignal[index]->Fill(digit.getCharge());
342 if (m_hitMapCounts !=
nullptr) m_hitMapCounts->Fill(index);
344 if (digit.getCharge() >= m_CutMinCharge && digit.getCharge() < 255) {
346 if (m_hitMapFilterCounts !=
nullptr) m_hitMapFilterCounts->Fill(index);
349 for (
int i = 0; i < nPXDSensors; i++) {
350 if (m_fired[i] !=
nullptr && Pixels[i] > 0) m_fired[i]->Fill(Pixels[i]);
351 if (m_goodfired[i] !=
nullptr && GoodPixels[i] > 0) m_goodfired[i]->Fill(GoodPixels[i]);
355 vector< int > Clusters(nPXDSensors);
356 vector< int > GoodClusters(nPXDSensors);
357 for (
const PXDCluster& cluster : m_storePXDClusters) {
358 int iLayer = cluster.getSensorID().getLayerNumber();
359 int iLadder = cluster.getSensorID().getLadderNumber();
360 int iSensor = cluster.getSensorID().getSensorNumber();
361 VxdID sensorID(iLayer, iLadder, iSensor);
362 int index = gTools->getPXDSensorIndex(sensorID);
366 int indexChip = gTools->getPXDChipIndex(sensorID, kTRUE, iChip);
367 if (m_hitMapClCountsChip !=
nullptr) m_hitMapClCountsChip->Fill(indexChip);
369 indexChip = gTools->getPXDChipIndex(sensorID, kFALSE, iChip);
370 if (m_hitMapClCountsChip !=
nullptr) m_hitMapClCountsChip->Fill(indexChip);
371 if (m_hitMapClCounts !=
nullptr) m_hitMapClCounts->Fill(index);
372 if (m_clusterCharge[index] !=
nullptr) m_clusterCharge[index]->Fill(cluster.getCharge());
373 if (m_clusterSizeU[index] !=
nullptr) m_clusterSizeU[index]->Fill(cluster.getUSize());
374 if (m_clusterSizeV[index] !=
nullptr) m_clusterSizeV[index]->Fill(cluster.getVSize());
375 if (m_clusterSizeUV[index] !=
nullptr) m_clusterSizeUV[index]->Fill(cluster.getSize());
377 if (cluster.getSize() <= m_CutMaxClusterSize && cluster.getCharge() >= m_CutMinClusterCharge
378 && cluster.getSeedCharge() >= m_CutMinSeedCharge && cluster.getSeedCharge() < 255) {
379 GoodClusters[index]++;
380 if (m_hitMapClFilterCounts !=
nullptr) m_hitMapClFilterCounts->Fill(index);
383 for (
int i = 0; i < nPXDSensors; i++) {
384 if (m_clusters[i] !=
nullptr && Clusters[i] > 0) m_clusters[i]->Fill(Clusters[i]);
385 if (m_goodclusters[i] !=
nullptr && GoodClusters[i] > 0) m_goodclusters[i]->Fill(GoodClusters[i]);