9 #include <svd/modules/svdSpacePointCreator/SpacePointHelperFunctions.h>
10 #include <svd/modules/svdSpacePointCreator/SVDSpacePointQICalibrationModule.h>
25 setDescription(
"Generate PDFs used in assigning quality to SpacePoints.");
26 setPropertyFlags(c_ParallelProcessingCertified);
29 addParam(
"SVDClusters", m_svdClustersName,
30 "SVDCluster collection name",
string(
""));
32 addParam(
"RecoTracks", m_recoTracksName,
33 "RecoTracks collection name",
string(
""));
36 addParam(
"NameOfInstance", m_nameOfInstance,
37 "allows the user to set an identifier for this module. Usefull if one wants to use several instances of that module",
string(
""));
38 addParam(
"binSize", m_binSize,
"Number of bins in charge distribution.",
41 addParam(
"maxClusterSize", m_maxClusterSize,
"Max number of strips the PDF are separated into.",
44 addParam(
"useLegacyNaming", m_useLegacyNaming,
45 "Use legacy pdf naming",
bool(
true));
47 addParam(
"outputFileName", m_outputFileName,
48 "Name of output file containing pdfs", std::string(
"spacePointQICalibration.root"));
53 void SVDSpacePointQICalibrationModule::initialize()
56 m_svdClusters.isRequired(m_svdClustersName);
57 m_recoTracks.isRequired(m_recoTracksName);
62 for (
auto& layers : geo.
getLayers(VXD::SensorInfoBase::SVD)) {
64 for (
auto& sensors : geo.
getSensors(ladders)) {
66 for (
int uSize = 1; uSize <= m_maxClusterSize; uSize++) {
67 for (
int vSize = 1; vSize <= m_maxClusterSize; vSize++) {
68 std::string sensorName =
"";
69 std::string errorStringName =
"";
72 spPDFName(sensors, uSize, vSize, m_maxClusterSize, sensorName, errorStringName, m_useLegacyNaming);
74 std::string signalHistName = sensorName +
"signal";
75 std::string backgroundHistName = sensorName +
"background";
77 if (signalHistMap.count(sensorName) == 0) {
78 TH2F* sigHist =
new TH2F(signalHistName.c_str(),
"", m_binSize, 0, 200000, m_binSize, 0, 200000);
79 TH2F* bkgHist =
new TH2F(backgroundHistName.c_str(),
"", m_binSize, 0, 200000, m_binSize, 0, 200000);
81 signalHistMap[sensorName] = sigHist;
82 backgroundHistMap[sensorName] = bkgHist;
89 TH2F* timeSignal =
new TH2F(
"timeSignal",
"", 40, -100, 100, 40, -100, 100);
90 TH2F* timeBackground =
new TH2F(
"timeBackground",
"", 40, -100, 100, 40, -100, 100);
91 TH2F* sizeSignal =
new TH2F(
"sizeSignal",
"", 20, 0, 20, 20, 0, 20);
92 TH2F* sizeBackground =
new TH2F(
"sizeBackground",
"", 20, 0, 20, 20, 0, 20);
94 signalHistMap[
"timeSignal"] = timeSignal;
95 signalHistMap[
"sizeSignal"] = sizeSignal;
96 backgroundHistMap[
"timeBackground"] = timeBackground;
97 backgroundHistMap[
"sizeBackground"] = sizeBackground;
103 void SVDSpacePointQICalibrationModule::event()
105 for (
auto& track : m_recoTracks) {
106 if (track.wasFitSuccessful() == 1) {
107 if (track.hasSVDHits() == 1) {
108 for (
auto& svdHit : track.getSVDHitList()) {
109 if (svdHit->isUCluster()) {
110 for (
auto& svdHit2 : track.getSVDHitList()) {
111 if (svdHit2->isUCluster() == 0) {
112 if (svdHit->getSensorID() == svdHit2->getSensorID()) {
114 std::string errorStringName;
115 spPDFName(svdHit->getSensorID(), svdHit->getSize(), svdHit2->getSize(), m_maxClusterSize, pdfName, errorStringName,
117 auto sigHist = signalHistMap.at(pdfName);
118 sigHist->Fill(svdHit->getCharge(), svdHit2->getCharge());
119 auto timeSigHist = signalHistMap.at(
"timeSignal");
120 timeSigHist->Fill(svdHit->getClsTime(), svdHit2->getClsTime());
121 auto sizeSigHist = signalHistMap.at(
"sizeSignal");
122 sizeSigHist->Fill(svdHit->getSize(), svdHit2->getSize());
133 for (
auto& uCluster : m_svdClusters) {
134 if (uCluster.isUCluster() == 1) {
135 for (
auto& vCluster : m_svdClusters) {
136 if (vCluster.isUCluster() == 0) {
137 if (uCluster.getSensorID() == vCluster.getSensorID()) {
139 std::string errorStringName;
140 spPDFName(uCluster.getSensorID(), uCluster.getSize(), vCluster.getSize(), m_maxClusterSize, pdfName, errorStringName,
142 auto bkgHist = backgroundHistMap.at(pdfName);
143 bkgHist->Fill(uCluster.getCharge(), vCluster.getCharge());
144 auto timeBkgHist = backgroundHistMap.at(
"timeBackground");
145 timeBkgHist->Fill(uCluster.getClsTime(), vCluster.getClsTime());
146 auto sizeBkgHist = backgroundHistMap.at(
"sizeBackground");
147 sizeBkgHist->Fill(uCluster.getSize(), vCluster.getSize());
157 void SVDSpacePointQICalibrationModule::terminate()
160 TFile* f =
new TFile(m_outputFileName.c_str(),
"RECREATE");
162 std::vector<std::string> usedSensors;
164 for (
auto& layers : geo.
getLayers(VXD::SensorInfoBase::SVD)) {
165 for (
auto& ladders : geo.
getLadders(layers)) {
166 for (
auto& sensors : geo.
getSensors(ladders)) {
167 for (
int uSize = 1; uSize <= m_maxClusterSize; uSize++) {
168 for (
int vSize = 1; vSize <= m_maxClusterSize; vSize++) {
169 std::string sensorName;
170 std::string errorName;
173 spPDFName(sensors, uSize, vSize, m_maxClusterSize, sensorName, errorName, m_useLegacyNaming);
175 if (std::find(usedSensors.begin(), usedSensors.end(), sensorName.c_str()) == usedSensors.end()) {
176 usedSensors.push_back(sensorName);
177 TH2F* probHist =
new TH2F(sensorName.c_str(),
"", m_binSize, 0, 200000, m_binSize, 0, 200000);
178 TH2F* errorHist =
new TH2F(errorName.c_str(),
"", m_binSize, 0, 200000, m_binSize, 0, 200000);
179 calculateProb(signalHistMap[sensorName], backgroundHistMap[sensorName], probHist);
180 calculateError(signalHistMap[sensorName], backgroundHistMap[sensorName], errorHist);
190 TH2F* timeProb =
new TH2F(
"timeProb",
"", 40, -100, 100, 40, -100, 100);
191 TH2F* timeError =
new TH2F(
"timeError",
"", 40, -100, 100, 40, -100, 100);
192 TH2F* sizeProb =
new TH2F(
"sizeProb",
"", 20, 0, 20, 20, 0, 20);
193 TH2F* sizeError =
new TH2F(
"sizeError",
"", 20, 0, 20, 20, 0, 20);
194 calculateProb(signalHistMap[
"timeSignal"], backgroundHistMap[
"timeBackground"], timeProb);
195 calculateError(signalHistMap[
"timeSignal"], backgroundHistMap[
"timeBackground"], timeError);
196 calculateProb(signalHistMap[
"sizeSignal"], backgroundHistMap[
"sizeBackground"], sizeProb);
197 calculateError(signalHistMap[
"sizeSignal"], backgroundHistMap[
"sizeBackground"], sizeError);
207 void SVDSpacePointQICalibrationModule::calculateProb(TH2F* signal, TH2F* background, TH2F* probability)
209 signal->Divide(background);
210 probability->Add(signal);
213 void SVDSpacePointQICalibrationModule::calculateError(TH2F* signal, TH2F* background, TH2F* error)
215 int imax = signal->GetXaxis()->GetNbins();
216 int jmax = signal->GetYaxis()->GetNbins();
217 for (
int i = 1; i <= imax; i++) {
218 for (
int j = 1; j <= jmax; j++) {
219 int bkg = background->GetBinContent(i, j);
220 int sig = signal->GetBinContent(i, j);
221 double var = ((sig + 1) * (sig + 2)) / ((bkg + 2) * (bkg + 3)) -
222 ((sig + 1) * (sig + 1)) / ((bkg + 2) * (bkg + 2));
223 double err = sqrt(var);
224 error->SetBinContent(i, j, err);
Imports Clusters of the SVD detector and converts them to spacePoints.
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 spPDFName(const VxdID &sensor, int uSize, int vSize, int maxClusterSize, std::string &PDFName, std::string &errorPDFName, bool useLegacyNaming)
Function to set name of PDF for spacePoint quality estimation.
Abstract base class for different kinds of events.