9 #include <svd/modules/svdClusterQualityEstimator/SVDClusterQualityEstimatorModule.h>
10 #include <svd/modules/svdClusterQualityEstimator/ClusterQualityHelperFunctions.h>
11 #include <framework/utilities/FileSystem.h>
23 setDescription(
"Assignment of probability for a cluster being generated from signal hit.");
25 setPropertyFlags(c_ParallelProcessingCertified);
27 addParam(
"SVDClusters", m_svdClustersName,
28 "SVDCluster collection name",
string(
""));
30 addParam(
"useQualityEstimator", m_useQualityEstimator,
31 "Standard is true. If turned off clusters will not be assigned a quality.",
bool(
true));
33 addParam(
"inputPDF", m_inputPDF,
34 "Path containing pdf root file", std::string(
"/data/svd/clusterQICalibration.root"));
36 addParam(
"useLegacyNaming", m_useLegacyNaming,
37 "Use old PDF name convention?",
bool(
true));
41 void SVDClusterQualityEstimatorModule::initialize()
44 if (m_useQualityEstimator ==
true) {
45 if (m_inputPDF.empty()) {
46 B2ERROR(
"Input PDF filename not set!");
48 std::string fullPath = FileSystem::findFile(m_inputPDF);
49 if (fullPath.empty()) {
50 B2ERROR(
"PDF file:" << m_inputPDF <<
"not located! Check filename input matches name of PDF file!");
52 m_inputPDF = fullPath;
55 m_calibrationFile =
new TFile(m_inputPDF.c_str(),
"READ");
57 if (!m_calibrationFile->IsOpen())
58 B2FATAL(
"Couldn't open pdf file:" << m_inputPDF);
62 m_svdClusters.isRequired(m_svdClustersName);
66 void SVDClusterQualityEstimatorModule::event()
69 if (m_useQualityEstimator ==
true) {
70 for (
auto& svdCluster : m_svdClusters) {
72 double charge = svdCluster.getCharge();
73 double time = svdCluster.getClsTime();
75 int pdfEntries = m_calibrationFile->GetListOfKeys()->GetSize();
77 if (m_useLegacyNaming == 1) {
78 maxSize = floor(pdfEntries / 12);
80 maxSize = floor(pdfEntries / 688);
83 std::string probInputName;
84 std::string errorInputName;
86 clusterPDFName(svdCluster.getSensorID(), svdCluster.getSize(), svdCluster.isUCluster(), maxSize, probInputName, errorInputName,
89 TH2F* probPDF =
nullptr;
90 TH2F* errorPDF =
nullptr;
91 m_calibrationFile->GetObject(probInputName.c_str(), probPDF);
92 m_calibrationFile->GetObject(errorInputName.c_str(), errorPDF);
95 int xBin = probPDF->GetXaxis()->FindFixBin(time);
96 int yBin = probPDF->GetYaxis()->FindFixBin(charge);
98 double signalProb = probPDF->GetBinContent(xBin, yBin);
99 double signalProbError = errorPDF->GetBinContent(xBin, yBin);
101 svdCluster.setQualityIndicator(signalProb);
102 svdCluster.setQualityIndicatorError(signalProbError);
107 void SVDClusterQualityEstimatorModule::terminate()
109 B2INFO(
"SVDClusterQualityEstimatorModule::terminate");
111 if (m_useQualityEstimator ==
true) {
112 m_calibrationFile->Delete();
Calculates the probability of a cluster originating from signal hit.
#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.