Belle II Software  release-08-01-10
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 
21 namespace 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:580
int getPDGCode() const
PDG code.
Definition: Const.h:464
EDetector
Enum for identifying the detector components (detector and subdetector).
Definition: Const.h:42
static const ChargedStable electron
electron particle
Definition: Const.h:650
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.
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
Definition: globalLabel.cc:72
Abstract base class for different kinds of events.