9 #include <svd/modules/svdClusterQualityEstimator/ClusterQualityHelperFunctions.h>
10 #include <svd/modules/svdClusterQualityEstimator/SVDClusterQualityEstimatorCalibrationModule.h>
21 REG_MODULE(SVDClusterQualityEstimatorCalibration)
27 setDescription(
"Generate PDFs used in assigning quality to clusterss.");
28 setPropertyFlags(c_ParallelProcessingCertified);
31 addParam(
"SVDClusters", m_svdClustersName,
32 "SVDCluster collection name",
string(
""));
34 addParam(
"RecoTracks", m_recoTracksName,
35 "RecoTracks collection name",
string(
""));
38 addParam(
"NameOfInstance", m_nameOfInstance,
39 "allows the user to set an identifier for this module. Usefull if one wants to use several instances of that module",
string(
""));
40 addParam(
"binSizeCharge", m_binSizeCharge,
"Number of bins in charge distribtuion.",
42 addParam(
"binSizeTime", m_binSizeTime,
"Number of bins in charge distribtuion.",
45 addParam(
"maxClusterSize", m_maxClusterSize,
"Max number of strips the PDF are separated into.",
49 addParam(
"outputFileName", m_outputFileName,
50 "Name of output file containing pdfs", std::string(
"clusterQICalibration.root"));
52 addParam(
"useLegacyNaming", m_useLegacyNaming,
53 "Use old PDF name convention?",
bool(
true));
58 void SVDClusterQualityEstimatorCalibrationModule::initialize()
61 m_svdClusters.isRequired(m_svdClustersName);
62 m_recoTracks.isRequired(m_recoTracksName);
67 for (
auto& layers : geo.
getLayers(VXD::SensorInfoBase::SVD)) {
69 for (
auto& sensors : geo.
getSensors(ladders)) {
71 for (
int side = 0; side <= 1; side++) {
72 for (
int size = 1; size <= m_maxClusterSize; size++) {
73 std::string sensorName;
74 std::string errorNameString;
77 clusterPDFName(sensors, size, side, m_maxClusterSize, sensorName, errorNameString, m_useLegacyNaming);
79 std::string signalHistName = sensorName +
"signal";
80 std::string backgroundHistName = sensorName +
"background";
82 if (signalHistMap.count(sensorName) == 0) {
83 TH2F* sigHist =
new TH2F(signalHistName.c_str(),
"", m_binSizeTime, -100, 100, m_binSizeCharge, 0, 200000);
84 TH2F* bkgHist =
new TH2F(backgroundHistName.c_str(),
"", m_binSizeTime, -100, 100, m_binSizeCharge, 0, 200000);
86 signalHistMap[sensorName] = sigHist;
87 backgroundHistMap[sensorName] = bkgHist;
101 void SVDClusterQualityEstimatorCalibrationModule::event()
103 for (
auto& track : m_recoTracks) {
104 if (track.wasFitSuccessful() == 1) {
105 if (track.hasSVDHits() == 1) {
106 for (
auto& svdHit : track.getSVDHitList()) {
108 std::string errorNameString;
109 clusterPDFName(svdHit->getSensorID(), svdHit->getSize(), svdHit->isUCluster(), m_maxClusterSize, pdfName, errorNameString,
112 auto sigHist = signalHistMap.at(pdfName);
113 sigHist->Fill(svdHit->getClsTime(), svdHit->getCharge());
122 for (
auto& cluster : m_svdClusters) {
124 std::string errorNameString;
125 clusterPDFName(cluster.getSensorID(), cluster.getSize(), cluster.isUCluster(), m_maxClusterSize, pdfName, errorNameString,
128 auto bkgHist = backgroundHistMap.at(pdfName);
129 bkgHist->Fill(cluster.getClsTime(), cluster.getCharge());
135 void SVDClusterQualityEstimatorCalibrationModule::terminate()
138 TFile* f =
new TFile(m_outputFileName.c_str(),
"RECREATE");
141 std::vector<std::string> usedSensors;
144 for (
auto& layers : geo.
getLayers(VXD::SensorInfoBase::SVD)) {
145 for (
auto& ladders : geo.
getLadders(layers)) {
146 for (
auto& sensors : geo.
getSensors(ladders)) {
147 for (
int side = 0; side <= 1; side++) {
148 for (
int size = 1; size <= m_maxClusterSize; size++) {
149 std::string sensorName;
150 std::string errorName;
152 clusterPDFName(sensors, size, side, m_maxClusterSize, sensorName, errorName, m_useLegacyNaming);
154 if (std::find(usedSensors.begin(), usedSensors.end(), sensorName.c_str()) == usedSensors.end()) {
155 usedSensors.push_back(sensorName);
156 TH2F* probHist =
new TH2F(sensorName.c_str(),
"", m_binSizeTime, -100, 100, m_binSizeCharge, 0, 200000);
157 TH2F* errorHist =
new TH2F(errorName.c_str(),
"", m_binSizeTime, -100, 100, m_binSizeCharge, 0, 200000);
158 calculateProb(signalHistMap[sensorName], backgroundHistMap[sensorName], probHist);
159 calculateError(signalHistMap[sensorName], backgroundHistMap[sensorName], errorHist);
173 void SVDClusterQualityEstimatorCalibrationModule::calculateProb(TH2F* signal, TH2F* background, TH2F* probability)
175 signal->Divide(background);
176 probability->Add(signal);
179 void SVDClusterQualityEstimatorCalibrationModule::calculateError(TH2F* signal, TH2F* background, TH2F* error)
181 int imax = signal->GetXaxis()->GetNbins();
182 int jmax = signal->GetYaxis()->GetNbins();
183 for (
int i = 1; i <= imax; i++) {
184 for (
int j = 1; j <= jmax; j++) {
185 int bkg = background->GetBinContent(i, j);
186 int sig = signal->GetBinContent(i, j);
187 double var = ((sig + 1) * (sig + 2)) / ((bkg + 2) * (bkg + 3)) -
188 ((sig + 1) * (sig + 1)) / ((bkg + 2) * (bkg + 2));
189 double err = sqrt(var);
190 error->SetBinContent(i, j, err);
Generate PDFs for assigning probability that cluster generated from signal particle.
Class to faciliate easy access to sensor information of the VXD like coordinate transformations or pi...
const std::set< Belle2::VxdID > getLayers(SensorInfoBase::SensorType sensortype=SensorInfoBase::VXD)
Return a set of all known Layers.
const std::set< Belle2::VxdID > & getSensors(Belle2::VxdID ladder) const
Return a set of all sensor IDs belonging to a given ladder.
const std::set< Belle2::VxdID > & getLadders(Belle2::VxdID layer) const
Return a set of all ladder IDs belonging to a given layer.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
void clusterPDFName(const VxdID &sensor, int size, int side, int maxClusterSize, std::string &PDFName, std::string &errorPDFName, bool useLegacyNaming)
Function to set name of PDF for cluster quality estimation.
Abstract base class for different kinds of events.