15 #include <svd/calibration/SVDClusterCalibrations.h>
16 #include <svd/dataobjects/SVDCluster.h>
18 #include <framework/datastore/StoreArray.h>
20 #include <vxd/dataobjects/VxdID.h>
22 #include <unordered_map>
39 struct ClustersOnSensor {
44 inline void addCluster(
const SVDCluster* entry)
46 vxdID = entry->getSensorID();
47 if (entry->isUCluster() ==
true) {
clustersU.push_back(entry);
return; }
76 for (
unsigned int i = 0; i < uint(svdClusters.
getEntries()); ++i) {
77 const SVDCluster* currentCluster = svdClusters[i];
78 std::vector<const SVDCluster*> currentClusterCombi = { currentCluster };
79 SpacePointType* newSP = spacePoints.
appendNew(currentClusterCombi);
80 newSP->addRelationTo(currentCluster);
95 std::vector< std::vector<const SVDCluster*> >& foundCombinations, SVDClusterCalibrations& clusterCal)
98 for (
const SVDCluster* uCluster : aSensor.
clustersU) {
99 if (! clusterCal.isClusterInTime(uCluster->getSensorID(), 1, uCluster->getClsTime())) {
100 B2DEBUG(1,
"Cluster rejected due to timing cut. Cluster time: " << uCluster->getClsTime());
103 for (
const SVDCluster* vCluster : aSensor.
clustersV) {
104 if (! clusterCal.isClusterInTime(vCluster->getSensorID(), 0, vCluster->getClsTime())) {
105 B2DEBUG(1,
"Cluster rejected due to timing cut. Cluster time: " << vCluster->getClsTime());
109 if (! clusterCal.areClusterTimesCompatible(vCluster->getSensorID(), uCluster->getClsTime(), vCluster->getClsTime())) {
110 B2DEBUG(1,
"Cluster combination rejected due to timing cut. Cluster time U (" << uCluster->getClsTime() <<
111 ") is incompatible with Cluster time V (" << vCluster->getClsTime() <<
")");
116 foundCombinations.push_back({uCluster, vCluster});
132 inline void spPDFName(
const VxdID& sensor,
int uSize,
int vSize,
int maxClusterSize, std::string& PDFName,
133 std::string& errorPDFName,
bool useLegacyNaming)
135 if (useLegacyNaming ==
true) {
137 if (uSize > maxClusterSize) uSize = maxClusterSize;
138 if (vSize > maxClusterSize) vSize = maxClusterSize;
140 std::string sensorName;
142 if (sensor.getLayerNumber() == 3) sensorName =
"l3";
143 if (sensor.getLayerNumber() > 3 && sensor.getSensorNumber() == 1) sensorName =
"trap";
144 if (sensor.getLayerNumber() > 3 && sensor.getSensorNumber() > 1) sensorName =
"large";
146 PDFName = sensorName + std::to_string(uSize) + std::to_string(vSize);
147 errorPDFName =
"error" + PDFName;
150 if (uSize > maxClusterSize) uSize = maxClusterSize;
151 if (vSize > maxClusterSize) vSize = maxClusterSize;
153 int layer = sensor.getLayerNumber();
154 int ladder = sensor.getLadderNumber();
155 int sens = sensor.getSensorNumber();
157 PDFName = std::to_string(layer) +
"." + std::to_string(ladder) +
"." + std::to_string(sens) +
"." + std::to_string(
158 uSize) +
"." + std::to_string(vSize);
159 errorPDFName = PDFName +
"_Error";
174 inline void calculatePairingProb(TFile* pdfFile, std::vector<const SVDCluster*>& clusters,
double& prob,
double& error,
175 bool useLegacyNaming)
179 int pdfEntries = pdfFile->GetListOfKeys()->GetSize();
180 if (useLegacyNaming ==
true) {
181 maxSize = floor(sqrt((pdfEntries - 4) / 6));
183 maxSize = floor(sqrt((pdfEntries - 4) / 344));
185 std::string chargeProbInput;
186 std::string chargeErrorInput;
188 spPDFName(clusters[0]->getSensorID(), clusters[0]->getSize(), clusters[1]->getSize(), maxSize,
189 chargeProbInput, chargeErrorInput, useLegacyNaming);
190 std::string timeProbInput =
"timeProb";
191 std::string timeErrorInput =
"timeError";
192 std::string sizeProbInput =
"sizeProb";
193 std::string sizeErrorInput =
"sizeError";
196 TH2F* chargePDF =
nullptr;
197 TH2F* chargeError =
nullptr;
198 TH2F* timePDF =
nullptr;
199 TH2F* timeError =
nullptr;
200 TH2F* sizePDF =
nullptr;
201 TH2F* sizeError =
nullptr;
203 pdfFile->GetObject(chargeProbInput.c_str(), chargePDF);
204 pdfFile->GetObject(chargeErrorInput.c_str(), chargeError);
205 pdfFile->GetObject(timeProbInput.c_str(), timePDF);
206 pdfFile->GetObject(timeErrorInput.c_str(), timeError);
207 pdfFile->GetObject(sizeProbInput.c_str(), sizePDF);
208 pdfFile->GetObject(sizeErrorInput.c_str(), sizeError);
210 int xChargeBin = chargePDF->GetXaxis()->FindFixBin(clusters[0]->getCharge());
211 int yChargeBin = chargePDF->GetYaxis()->FindFixBin(clusters[1]->getCharge());
213 int xTimeBin = timePDF->GetXaxis()->FindFixBin(clusters[0]->getClsTime());
214 int yTimeBin = timePDF->GetYaxis()->FindFixBin(clusters[1]->getClsTime());
217 int xSizeBin = sizePDF->GetXaxis()->FindFixBin(clusters[0]->getSize());
218 int ySizeBin = sizePDF->GetYaxis()->FindFixBin(clusters[1]->getSize());
220 double chargeProb = chargePDF->GetBinContent(xChargeBin, yChargeBin);
221 double timeProb = timePDF->GetBinContent(xTimeBin, yTimeBin);
222 double sizeProb = sizePDF->GetBinContent(xSizeBin, ySizeBin);
223 double chargeProbError = chargePDF->GetBinContent(xChargeBin, yChargeBin);
224 double timeProbError = timePDF->GetBinContent(xTimeBin, yTimeBin);
225 double sizeProbError = sizePDF->GetBinContent(xSizeBin, ySizeBin);
228 if (chargeProbError == 0) {
229 B2DEBUG(1,
"svdClusterProbabilityEstimator has not been run, spacePoint QI will return zero!");
232 prob = chargeProb * timeProb * sizeProb * clusters[0]->getQuality() * clusters[1]->getQuality();
233 error = prob * sqrt(pow(timeProb * sizeProb * clusters[0]->getQuality() * clusters[1]->getQuality() * chargeProbError , 2) +
234 pow(chargeProb * sizeProb * clusters[0]->getQuality() * clusters[1]->getQuality() * timeProbError , 2) +
235 pow(chargeProb * timeProb * clusters[0]->getQuality() * clusters[1]->getQuality() * sizeProbError , 2) +
236 pow(chargeProb * timeProb * sizeProb * clusters[1]->getQuality() * clusters[0]->getQualityError() , 2) +
237 pow(chargeProb * timeProb * sizeProb * clusters[0]->getQuality() * clusters[1]->getQualityError() , 2));
248 StoreArray<SpacePointType>& spacePoints, SVDClusterCalibrations& clusterCal,
bool useQualityEstimator, TFile* pdfFile,
249 bool useLegacyNaming)
251 std::unordered_map<VxdID::baseType, ClustersOnSensor>
253 std::vector<std::vector<const SVDCluster*> >
260 for (
unsigned int i = 0; i < uint(svdClusters.getEntries()); ++i) {
263 activatedSensors[currentCluster->
getSensorID().
getID()].addCluster(currentCluster);
267 for (
auto& aSensor : activatedSensors)
271 for (
auto& clusterCombi : foundCombinations) {
272 SpacePointType* newSP = spacePoints.appendNew(clusterCombi);
273 if (useQualityEstimator ==
true) {
275 newSP->setQualityEstimation(probability);
276 newSP->setQualityEstimationError(error);
278 for (
auto* cluster : clusterCombi) {
279 newSP->addRelationTo(cluster, cluster->isUCluster() ? 1. : -1.);