Belle II Software development
trackIsoScoreCalculator.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 <framework/logging/Logger.h>
10#include <framework/gearbox/Const.h>
11#include <framework/gearbox/Unit.h>
12#include <framework/utilities/TestHelpers.h>
13
14#include <analysis/dbobjects/PIDDetectorWeights.h>
15
16#include <gtest/gtest.h>
17#include <random>
18
19
20
21namespace Belle2 {
28 class TrackIsoScoreCalculatorTest : public ::testing::Test {
29
30 public:
31
36
41
45 int m_layer = 0;
46
52 std::string m_dummyFile = "dummyFile.root";
53
54
55 protected:
56
62 {
63
64 unsigned int nEntries(6);
65
66 ROOT::RDataFrame rdf(nEntries);
67
68 std::vector<double> pdgIds(nEntries, static_cast<double>(m_testHypo.getPDGCode()));
69 std::vector<double> pMinEdges = {1.0, 1.0, 1.0, 1.5, 1.5, 1.5};
70 std::vector<double> pMaxEdges = {1.5, 1.5, 1.5, 3.0, 3.0, 3.0};
71 std::vector<double> thetaMinEdges = {0.22, 0.56, 2.23, 0.22, 0.56, 2.23};
72 std::vector<double> thetaMaxEdges = {0.56, 2.23, 2.71, 0.56, 2.23, 2.71};
73 std::vector<double> pBinIdxs = {1.0, 1.0, 1.0, 2.0, 2.0, 2.0};
74 std::vector<double> thetaBinIdxs = {1.0, 2.0, 3.0, 1.0, 2.0, 3.0};
75 std::vector<std::string> regLabels = {"FWD", "Barrel", "BWD", "FWD", "Barrel", "BWD"};
76 std::vector<double> weights_SVD = {0., 0., -0.003, 0.031, 0.017, 0.077};
77 std::vector<double> weights_CDC = {-0.061, -0.084, -0.162, -0.073, -0.073, -0.05, -0.121};
78 std::vector<double> weights_TOP = {0., 0., 0., 0., 0., 0.};
79 std::vector<double> weights_ARICH = {0., 0., 0., -0.004, 0., 0.};
80 std::vector<double> weights_ECL = {-0.062, -0.118, -0.136, -0.22, -0.255, -0.377};
81 std::vector<double> weights_KLM = {0., 0., 0.006, -0.003, 0.003, 0.002};
82
83 unsigned int iEntry(0);
84 rdf.Define("pdgId", [&]() { auto x = pdgIds[iEntry]; return x; })
85 .Define("p_min", [&]() { auto x = pMinEdges[iEntry]; return x; })
86 .Define("p_max", [&]() { auto x = pMaxEdges[iEntry]; return x; })
87 .Define("theta_min", [&]() { auto x = thetaMinEdges[iEntry]; return x; })
88 .Define("theta_max", [&]() { auto x = thetaMaxEdges[iEntry]; return x; })
89 .Define("p_bin_idx", [&]() { auto x = pBinIdxs[iEntry]; return x; })
90 .Define("theta_bin_idx", [&]() { auto x = thetaBinIdxs[iEntry]; return x; })
91 .Define("reg_label", [&]() { auto x = regLabels[iEntry]; return x; })
92 .Define("ablat_s_SVD", [&]() { auto x = weights_SVD[iEntry]; return x; })
93 .Define("ablat_s_CDC", [&]() { auto x = weights_CDC[iEntry]; return x; })
94 .Define("ablat_s_TOP", [&]() { auto x = weights_TOP[iEntry]; return x; })
95 .Define("ablat_s_ARICH", [&]() { auto x = weights_ARICH[iEntry]; return x; })
96 .Define("ablat_s_ECL", [&]() { auto x = weights_ECL[iEntry]; return x; })
97 .Define("ablat_s_KLM", [&]() { auto x = weights_KLM[iEntry]; ++iEntry; return x; }) // Only the last call in the chain must increment the entry counter!
98 .Snapshot("tree", m_dummyFile);
99
100 };
101
107 {
108
109 unsigned int nEntries(6);
110
111 ROOT::RDataFrame rdf(nEntries);
112
113 std::vector<double> pdgIds(nEntries, static_cast<double>(m_testHypo.getPDGCode()));
114 std::vector<double> pMinEdges = {1.0, 1.0, 1.0, 1.5, 1.5, 1.5};
115 std::vector<double> pMaxEdges = {1.8, 1.8, 1.8, 3.0, 3.0, 3.0}; // note the non-contiguous edges wrt. pMinEdges
116 std::vector<double> thetaMinEdges = {0.22, 0.56, 2.23, 0.22, 0.56, 2.23};
117 std::vector<double> thetaMaxEdges = {0.56, 2.23, 2.71, 0.56, 2.23, 2.71};
118 std::vector<double> pBinIdxs = {1.0, 1.0, 1.0, 2.0, 2.0, 2.0};
119 std::vector<double> thetaBinIdxs = {1.0, 2.0, 3.0, 1.0, 2.0, 3.0};
120
121 // Tell snapshot to update file.
122 ROOT::RDF::RSnapshotOptions opt;
123 opt.fMode = "UPDATE";
124
125 unsigned int iEntry(0);
126 rdf.Define("pdgId", [&]() { auto x = pdgIds[iEntry]; return x; })
127 .Define("p_min", [&]() { auto x = pMinEdges[iEntry]; return x; })
128 .Define("p_max", [&]() { auto x = pMaxEdges[iEntry]; return x; })
129 .Define("theta_min", [&]() { auto x = thetaMinEdges[iEntry]; return x; })
130 .Define("theta_max", [&]() { auto x = thetaMaxEdges[iEntry]; return x; })
131 .Define("p_bin_idx", [&]() { auto x = pBinIdxs[iEntry]; return x; })
132 .Define("theta_bin_idx", [&]() { auto x = thetaBinIdxs[iEntry]; ++iEntry; return x; })
133 .Snapshot("tree_broken", m_dummyFile, "", opt);
134
135 };
136
140 void SetUp() override
141 {
144 }
145
149 void TearDown() override
150 {
151 // Delete all dummy files.
152 if (remove(m_dummyFile.c_str())) {
153 B2ERROR("Couldn't remove file: " << m_dummyFile);
154 }
155 }
156
157 };
158
164 {
165
166 PIDDetectorWeights dbrep("tree", m_dummyFile);
167
168 // Test for correct filling of the RDataFrame.
169 auto pdgIds = dbrep.getWeightsRDF().Take<double>("pdgId").GetValue();
170 for (const auto& pdgId : pdgIds) {
171 EXPECT_EQ(pdgId, m_testHypo.getPDGCode());
172 }
173
174 // Retrieve weight for a (p, theta) pair in the available weights range.
175 auto p = 1.23; // GeV/c
176 auto theta = 1.34; // rad
177 auto weight = dbrep.getWeight(m_testHypo, m_detector, p, theta);
178 EXPECT_EQ(weight, -0.118);
179
180 // Test for weight in case of out-of-range p and/or theta values.
181 p = 1.46;
182 theta = 0.12;
183 weight = dbrep.getWeight(m_testHypo, m_detector, p, theta);
184 EXPECT_TRUE(std::isnan(weight));
185
186 // Trigger a FATAL if reading an ill-defined source table.
187 EXPECT_B2FATAL(PIDDetectorWeights("tree_broken", m_dummyFile));
188
189 }
190
192} // namespace
Provides a type-safe way to pass members of the chargedStableSet set.
Definition: Const.h:589
int getPDGCode() const
PDG code.
Definition: Const.h:473
EDetector
Enum for identifying the detector components (detector and subdetector).
Definition: Const.h:42
static const ChargedStable electron
electron particle
Definition: Const.h:659
Class for handling the PID weights per detector, used to calculate the track helix isolation score pe...
ROOT::RDataFrame getWeightsRDF() const
Get the RDataFrame of detector weights.
double getWeight(Const::ChargedStable hypo, Const::EDetector det, double p, double theta) const
Lookup the weight from the internal map structures.
Test the calculation of the track helix-based isolation score per particle.
Const::ChargedStable m_testHypo
The charged particle hypothesis to test.
Const::EDetector m_detector
The detector to test.
void SetUp() override
Prepare resources for the tests.
void createDummyBrokenTTree()
Create a ROOT::TTree with a "broken" bin edges structure, i.e.
void createDummyTTree()
Create a ROOT::TTree for the detector weights w/ a few entries.
void TearDown() override
Release all resources.
std::string m_dummyFile
Dummy ROOT file name.
int m_layer
The detector layer to test.
Abstract base class for different kinds of events.