Belle II Software development
PXDHotPixelMaskCollectorModule.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <pxd/modules/pxdHotPixelMaskCollector/PXDHotPixelMaskCollectorModule.h>
10#include <vxd/geometry/GeoCache.h>
11#include <pxd/dataobjects/PXDDigit.h>
12
13#include <boost/format.hpp>
14
15#include <TH1I.h>
16
17using namespace std;
18using boost::format;
19using namespace Belle2;
20
21
22//-----------------------------------------------------------------
23// Register the Module
24//-----------------------------------------------------------------
25REG_MODULE(PXDHotPixelMaskCollector);
26
27//-----------------------------------------------------------------
28// Implementation
29//-----------------------------------------------------------------
30
32{
33 // Set module properties
34 setDescription("Calibration Collector Module for PXD hot pixel masking from digits");
36
37 addParam("zeroSuppressionCut", m_0cut, "Minimum charge (in ADU) for detecting a hit", 0);
38 addParam("digitsName", m_storeDigitsName, "PXDDigit collection name", string(""));
39}
40
41void PXDHotPixelMaskCollectorModule::prepare() // Do your initialise() stuff here
42{
43 m_pxdDigit.isRequired();
44
46
47 if (gTools->getNumberOfPXDLayers() == 0) {
48 B2WARNING("Missing geometry for PXD, PXD-masking is skipped.");
49 }
50
51 //-------------------------------------------------------------------------------------------------
52 // PXDHits: Histogram the number of PXDDigits per event (assuming Belle 2 PXD with < 2% occupancy)
53 //-------------------------------------------------------------------------------------------------
54 auto hPXDHits = new TH1I("hPXDHits",
55 "Number of hits in PXD per events used for masking, distribution parameters found by PXDHotPixelMaskCollectorModule", 200000, 0,
56 200000);
57 hPXDHits->GetXaxis()->SetTitle("Number of hits");
58 hPXDHits->GetYaxis()->SetTitle("Events");
59 registerObject<TH1I>("PXDHits", hPXDHits);
60
61 //--------------------------------------------------------
62 // PXDHitCounts: Count the number of PXDDigits per sensor
63 //--------------------------------------------------------
64 int nPXDSensors = gTools->getNumberOfPXDSensors();
65 auto hPXDHitCounts = new TH1I("hPXDHitCounts",
66 "Number of hits in PXD sensors for masking, distribution parameters found by PXDHotPixelMaskCollectorModule", nPXDSensors, 0,
67 nPXDSensors);
68
69 hPXDHitCounts->GetXaxis()->SetTitle("SensorID");
70 hPXDHitCounts->GetYaxis()->SetTitle("Number of hits");
71 for (int i = 0; i < nPXDSensors; i++) {
72 VxdID id = gTools->getSensorIDFromPXDIndex(i);
73 string sensorDescr = id;
74 hPXDHitCounts->GetXaxis()->SetBinLabel(i + 1, str(format("%1%") % sensorDescr).c_str());
75 }
76 registerObject<TH1I>("PXDHitCounts", hPXDHitCounts);
77
78 // Fill PXDHitMap with empty histos for all sensors
79 for (int i = 0; i < nPXDSensors; i++) {
80 VxdID id = gTools->getSensorIDFromPXDIndex(i);
81 string sensorDescr = id;
82
83 //----------------------------------------------------------------
84 // Hitmaps: Number of hits per sensor and pixel
85 //----------------------------------------------------------------
86 string name = str(format("PXD_%1%_PixelHitmap") % id.getID());
87 string title = str(format("PXD Sensor %1% Pixel Hitmap from PXDHotPixelMaskCollector") % sensorDescr);
88
89 // Data object creation --------------------------------------------------
90 auto hsensorhitmap = new TH1I(name.c_str(), title.c_str(), 250 * 768, 0, 250 * 768);
91
92 // Data object registration ----------------------------------------------
93 registerObject<TH1I>(name.c_str(), hsensorhitmap); // Does the registerInDatastore for you
94 }
95
96}
97
98void PXDHotPixelMaskCollectorModule::collect() // Do your event() stuff here
99{
100
101 // Histogram pxd hits per event
102 TH1I* collector_hits = getObjectPtr<TH1I>("PXDHits");
103
104 // Even if there is no input StoreArray, we still want to fill zero hits
105 if (!m_pxdDigit)
106 collector_hits->Fill(0);
107 else
108 collector_hits->Fill(m_pxdDigit.getEntries());
109
110 auto& geo = VXD::GeoCache::getInstance();
111 auto gTools = geo.getGeoTools();
112
113 // Count hits per sensor
114 TH1I* collector_pxdhitcounts = getObjectPtr<TH1I>("PXDHitCounts");
115
116 for (auto& digit : m_pxdDigit) {
117 // Zero-suppression cut
118 if (digit.getCharge() < m_0cut) continue;
119
120 // Increment counter for hit pixel
121 string name = str(format("PXD_%1%_PixelHitmap") % digit.getSensorID().getID());
122 TH1I* collector_sensorhitmap = getObjectPtr<TH1I>(name.c_str());
123 collector_sensorhitmap->Fill(digit.getUCellID() * 768 + digit.getVCellID());
124 collector_pxdhitcounts->Fill(gTools->getPXDSensorIndex(digit.getSensorID()));
125 }
126}
void registerObject(std::string name, T *obj)
Register object with a name, takes ownership, do not access the pointer beyond prepare()
CalibrationCollectorModule()
Constructor. Sets the default prefix for calibration dataobjects.
T * getObjectPtr(std::string name)
Calls the CalibObjManager to get the requested stored collector data.
void setDescription(const std::string &description)
Sets the description of the module.
Definition Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition Module.h:80
int m_0cut
Minimum charge (ADU) for detecting a hit.
PXDHotPixelMaskCollectorModule()
Constructor: Sets the description, the properties and the parameters of the module.
StoreArray< PXDDigit > m_pxdDigit
< Required input for PXDigits
std::string m_storeDigitsName
Name of the collection to use for PXDDigits.
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition GeoCache.cc:214
const GeoTools * getGeoTools()
Return a raw pointer to a GeoTools object.
Definition GeoCache.h:141
Class to uniquely identify a any structure of the PXD and SVD.
Definition VxdID.h:32
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition Module.h:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
int getID(const std::vector< double > &breaks, double t)
get id of the time point t
Definition calibTools.h:60
Abstract base class for different kinds of events.
STL namespace.