Belle II Software development
kink_variables.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#include <gtest/gtest.h>
9
10#include <analysis/VariableManager/Manager.h>
11#include <analysis/dataobjects/Particle.h>
12#include <analysis/dataobjects/ParticleExtraInfoMap.h>
13
14#include <analysis/variables/KinkVariables.h>
15
16#include <mdst/dataobjects/Kink.h>
17#include <mdst/dataobjects/MCParticle.h>
18#include <mdst/dataobjects/Track.h>
19#include <mdst/dataobjects/TrackFitResult.h>
20
21#include <framework/datastore/StoreArray.h>
22
23#include <TRandom3.h>
24#include <Math/Cartesian2D.h>
25#include <Math/Vector3D.h>
26
27using namespace Belle2;
28using namespace Belle2::Variable;
29using namespace ROOT::Math;
30
31namespace {
32 class KinkVariablesTest : public ::testing::Test {
33 protected:
35 void SetUp() override
36 {
38 StoreArray<Kink> myKinks;
40 StoreArray<Track> myTracks;
41 StoreArray<Particle> myParticles;
42 StoreArray<MCParticle> myMCParticles;
44 myKinks.registerInDataStore();
45 myTFRs.registerInDataStore();
46 myTracks.registerInDataStore();
47 myParticles.registerInDataStore();
48 myMCParticles.registerInDataStore();
49 myParticles.registerRelationTo(myMCParticles);
50 myTracks.registerRelationTo(myMCParticles);
52
53 TRandom3 generator;
54
55 const float pValueMotherTrack = 0.5;
56 const float pValueDaughterTrack = 0.6;
57 const float ndfMotherTrack = 15;
58 const float ndfDaughterTrack = 5;
59 const double bField = Belle2::BFieldManager::getFieldInTesla(XYZVector(0, 0, 0)).Z();
60 const int charge = 1;
61 TMatrixDSym cov6(6);
62 cov6.Zero();
63 cov6(0, 0) = 0.05;
64 cov6(1, 1) = 0.2;
65 cov6(2, 2) = 0.4;
66 cov6(3, 3) = 0.01;
67 cov6(4, 4) = 0.04;
68 cov6(5, 5) = 0.00875;
69
70 // Generate a random put orthogonal pair of vectors in the r-phi plane
71 Cartesian2D d(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
72 Cartesian2D pt(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
73 d.SetXY(d.X(), -(d.X()*pt.X()) / pt.Y());
74
75 // Add a random z component
76 XYZVector position(d.X(), d.Y(), generator.Uniform(-1, 1));
77 XYZVector momentum(pt.X(), pt.Y(), generator.Uniform(-1, 1));
78
79 auto CDCValue = static_cast<unsigned long long int>(0x300000000000000);
80
81 TrackFitResult* myMotherTrackFitResult = myTFRs.appendNew(position, momentum, cov6, charge, Const::muon, pValueMotherTrack, bField,
82 CDCValue, 16777215, ndfMotherTrack);
83 Track myMotherTrack;
84 myMotherTrack.setTrackFitResultIndex(Const::muon, 0);
85 Track* muonTrack = myTracks.appendNew(myMotherTrack);
86
87 TrackFitResult* myDaughterTrackFitResult = myTFRs.appendNew(position, momentum, cov6, charge, Const::electron, pValueDaughterTrack,
88 bField, CDCValue, 16777215, ndfDaughterTrack);
89 Track myDaughterTrack;
90 myDaughterTrack.setTrackFitResultIndex(Const::electron, 1);
91 Track* electronTrack = myTracks.appendNew(myDaughterTrack);
92
93 Kink* myKink = myKinks.appendNew(std::make_pair(muonTrack, std::make_pair(myMotherTrackFitResult, myMotherTrackFitResult)),
94 std::make_pair(electronTrack, myDaughterTrackFitResult), 1, 1, 2, 11100);
95
96 myParticles.appendNew(muonTrack, Const::muon);
97 Particle* myKinkMuon = myParticles.appendNew(myKink, Const::muon, 0);
98 myKinkMuon->writeExtraInfo("kinkDaughterPDGCode", Const::electron.getPDGCode());
99
100 auto* true_muon = myMCParticles.appendNew(MCParticle());
101 true_muon->setPDG(Const::muon.getPDGCode());
102 muonTrack->addRelationTo(true_muon);
103 myKinkMuon->addRelationTo(true_muon);
104
105 auto* true_electron = myMCParticles.appendNew(MCParticle());
106 true_electron->setPDG(Const::electron.getPDGCode());
107 electronTrack->addRelationTo(true_electron);
108 }
109
111 void TearDown() override
112 {
114 }
115 };
116
117 /*
118 * Test kink vertex variables
119 */
120 TEST_F(KinkVariablesTest, KinkVertex)
121 {
122 StoreArray<Particle> myParticles{};
123 auto part = myParticles[1];
124
125 EXPECT_FLOAT_EQ(kinkVertexX(part), 1);
126 EXPECT_FLOAT_EQ(kinkVertexY(part), 1);
127 EXPECT_FLOAT_EQ(kinkVertexZ(part), 2);
128 }
129
130 /*
131 * Test kink flag variables
132 */
133 TEST_F(KinkVariablesTest, KinkFlag)
134 {
135 StoreArray<Particle> myParticles{};
136 auto part = myParticles[1];
137
138 EXPECT_FLOAT_EQ(kinkCombinedFitResultFlag(part), 10);
139 EXPECT_FLOAT_EQ(kinkCombinedFitResultFlagBit1(part), 0);
140 EXPECT_FLOAT_EQ(kinkCombinedFitResultFlagBit2(part), 1);
141 EXPECT_FLOAT_EQ(kinkCombinedFitResultFlagBit3(part), 0);
142 EXPECT_FLOAT_EQ(kinkCombinedFitResultFlagBit4(part), 1);
143 }
144
145 /*
146 * Test KinkDaughterTrack variables
147 */
148 TEST_F(KinkVariablesTest, KinkDaughterTrack)
149 {
150 StoreArray<Particle> myParticles{};
151 auto part = myParticles[1];
152
153 auto* var = Manager::Instance().getVariable("kinkDaughterTrack(nCDCHits)");
154 ASSERT_NE(var, nullptr);
155 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 3);
156
157 var = Manager::Instance().getVariable("kinkDaughterTrack(nSVDHits)");
158 ASSERT_NE(var, nullptr);
159 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 24);
160
161 var = Manager::Instance().getVariable("kinkDaughterTrack(nPXDHits)");
162 ASSERT_NE(var, nullptr);
163 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 12);
164
165 var = Manager::Instance().getVariable("kinkDaughterTrack(nVXDHits)");
166 ASSERT_NE(var, nullptr);
167 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 36);
168
169 var = Manager::Instance().getVariable("kinkDaughterTrack(firstSVDLayer)");
170 ASSERT_NE(var, nullptr);
171 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 3);
172
173 var = Manager::Instance().getVariable("kinkDaughterTrack(firstPXDLayer)");
174 ASSERT_NE(var, nullptr);
175 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 1);
176
177 var = Manager::Instance().getVariable("kinkDaughterTrack(firstCDCLayer)");
178 ASSERT_NE(var, nullptr);
179 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), -1);
180
181 var = Manager::Instance().getVariable("kinkDaughterTrack(lastCDCLayer)");
182 ASSERT_NE(var, nullptr);
183 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), -1);
184
185 var = Manager::Instance().getVariable("kinkDaughterTrack(pValue)");
186 ASSERT_NE(var, nullptr);
187 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.6);
188
189 var = Manager::Instance().getVariable("kinkDaughterTrack(ndf)");
190 ASSERT_NE(var, nullptr);
191 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 5);
192
193 var = Manager::Instance().getVariable("kinkDaughterTrack(chi2)");
194 ASSERT_NE(var, nullptr);
195 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 3.6554995);
196
197 var = Manager::Instance().getVariable("kinkDaughterTrack(d0)");
198 ASSERT_NE(var, nullptr);
199 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 1.5421079);
200
201 var = Manager::Instance().getVariable("kinkDaughterTrack(phi0)");
202 ASSERT_NE(var, nullptr);
203 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), -0.45246184);
204
205 var = Manager::Instance().getVariable("kinkDaughterTrack(omega)");
206 ASSERT_NE(var, nullptr);
207 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0045218822);
208
209 var = Manager::Instance().getVariable("kinkDaughterTrack(z0)");
210 ASSERT_NE(var, nullptr);
211 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), -0.5366869);
212
213 var = Manager::Instance().getVariable("kinkDaughterTrack(tanLambda)");
214 ASSERT_NE(var, nullptr);
215 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), -0.030219816);
216
217 var = Manager::Instance().getVariable("kinkDaughterTrack(d0Err)");
218 ASSERT_NE(var, nullptr);
219 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.41392139);
220
221 var = Manager::Instance().getVariable("kinkDaughterTrack(phi0Err)");
222 ASSERT_NE(var, nullptr);
223 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.18485548);
224
225 var = Manager::Instance().getVariable("kinkDaughterTrack(omegaErr)");
226 ASSERT_NE(var, nullptr);
227 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.00057035277);
228
229 var = Manager::Instance().getVariable("kinkDaughterTrack(z0Err)");
230 ASSERT_NE(var, nullptr);
231 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.63257021);
232
233 var = Manager::Instance().getVariable("kinkDaughterTrack(tanLambdaErr)");
234 ASSERT_NE(var, nullptr);
235 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.09413857);
236 }
237
238 /*
239 * Test KinkDaughterInitTrack variables
240 */
241 TEST_F(KinkVariablesTest, KinkDaughterInitTrack)
242 {
243 StoreArray<Particle> myParticles{};
244 auto part = myParticles[1];
245
246 auto* var = Manager::Instance().getVariable("kinkDaughterInitTrack(pValue)");
247 ASSERT_NE(var, nullptr);
248 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.6);
249
250 var = Manager::Instance().getVariable("kinkDaughterInitTrack(ndf)");
251 ASSERT_NE(var, nullptr);
252 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 5);
253
254 var = Manager::Instance().getVariable("kinkDaughterInitTrack(chi2)");
255 ASSERT_NE(var, nullptr);
256 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 3.6554995);
257 }
258
259 /*
260 * Test KinkMotherInitTrack variables
261 */
262 TEST_F(KinkVariablesTest, KinkMotherInitTrack)
263 {
264 StoreArray<Particle> myParticles{};
265 auto part = myParticles[1];
266
267 auto* var = Manager::Instance().getVariable("kinkMotherInitTrack(pValue)");
268 ASSERT_NE(var, nullptr);
269 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.5);
270
271 var = Manager::Instance().getVariable("kinkMotherInitTrack(ndf)");
272 ASSERT_NE(var, nullptr);
273 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 15);
274
275 var = Manager::Instance().getVariable("kinkMotherInitTrack(chi2)");
276 ASSERT_NE(var, nullptr);
277 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 14.33886);
278 }
279
280 /*
281 * Test KinkPairDaughterMC variables
282 */
283 TEST_F(KinkVariablesTest, KinkPairDaughterMC)
284 {
285 StoreArray<Particle> myParticles;
286 auto part = myParticles[1];
287
288 auto* var = Manager::Instance().getVariable("kinkPairDaughterMC(mcPDG)");
289 ASSERT_NE(var, nullptr);
290 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 11);
291
292 var = Manager::Instance().getVariable("kinkPairDaughterMC(genMotherPDG)");
293 ASSERT_NE(var, nullptr);
294 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
295
296 var = Manager::Instance().getVariable("kinkPairDaughterMC(mcSecPhysProc)");
297 ASSERT_NE(var, nullptr);
298 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
299
300 var = Manager::Instance().getVariable("kinkPairDaughterMC(x)");
301 ASSERT_NE(var, nullptr);
302 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
303
304 var = Manager::Instance().getVariable("kinkPairDaughterMC(y)");
305 ASSERT_NE(var, nullptr);
306 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
307
308 var = Manager::Instance().getVariable("kinkPairDaughterMC(z)");
309 ASSERT_NE(var, nullptr);
310 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
311
312 var = Manager::Instance().getVariable("kinkPairDaughterMC(px)");
313 ASSERT_NE(var, nullptr);
314 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
315
316 var = Manager::Instance().getVariable("kinkPairDaughterMC(py)");
317 ASSERT_NE(var, nullptr);
318 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
319
320 var = Manager::Instance().getVariable("kinkPairDaughterMC(pz)");
321 ASSERT_NE(var, nullptr);
322 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
323
324 var = Manager::Instance().getVariable("kinkPairDaughterMC(pt)");
325 ASSERT_NE(var, nullptr);
326 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
327
328 var = Manager::Instance().getVariable("kinkPairDaughterMC(p)");
329 ASSERT_NE(var, nullptr);
330 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
331
332 var = Manager::Instance().getVariable("kinkPairDaughterMC(E)");
333 ASSERT_NE(var, nullptr);
334 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
335 }
336
337 /*
338 * Test KinkPairMotherMC variables
339 */
340 TEST_F(KinkVariablesTest, KinkPairMotherMC)
341 {
342 StoreArray<Particle> myParticles{};
343 auto part = myParticles[1];
344
345 auto* var = Manager::Instance().getVariable("kinkPairMotherMC(px)");
346 ASSERT_NE(var, nullptr);
347 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
348
349 var = Manager::Instance().getVariable("kinkPairMotherMC(py)");
350 ASSERT_NE(var, nullptr);
351 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
352
353 var = Manager::Instance().getVariable("kinkPairMotherMC(pz)");
354 ASSERT_NE(var, nullptr);
355 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
356
357 var = Manager::Instance().getVariable("kinkPairMotherMC(pt)");
358 ASSERT_NE(var, nullptr);
359 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
360
361 var = Manager::Instance().getVariable("kinkPairMotherMC(p)");
362 ASSERT_NE(var, nullptr);
363 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
364
365 var = Manager::Instance().getVariable("kinkPairMotherMC(E)");
366 ASSERT_NE(var, nullptr);
367 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
368 }
369}
static ROOT::Math::XYZVector getFieldInTesla(const ROOT::Math::XYZVector &pos)
return the magnetic field at a given position in Tesla.
Definition: BFieldManager.h:60
static const ChargedStable muon
muon particle
Definition: Const.h:660
static const ChargedStable electron
electron particle
Definition: Const.h:659
static DataStore & Instance()
Instance of singleton Store.
Definition: DataStore.cc:53
void setInitializeActive(bool active)
Setter for m_initializeActive.
Definition: DataStore.cc:93
void reset(EDurability durability)
Frees memory occupied by data store items and removes all objects from the map.
Definition: DataStore.cc:85
Object holding information for Kinks.
Definition: Kink.h:32
A Class to store the Monte Carlo particle information.
Definition: MCParticle.h:32
Class to store reconstructed particles.
Definition: Particle.h:76
void writeExtraInfo(const std::string &name, const double value)
Sets the user defined extraInfo.
Definition: Particle.cc:1393
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
T * appendNew()
Construct a new T object at the end of the array.
Definition: StoreArray.h:246
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
Definition: StoreArray.h:140
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:95
Values of the result of a track fit with a given particle hypothesis.
Class that bundles various TrackFitResults.
Definition: Track.h:25
void setTrackFitResultIndex(const Const::ChargedStable &chargedStable, short index)
Set an index (for positive values) or unavailability-code (index = -1) for a specific mass hypothesis...
Definition: Track.h:188
const Var * getVariable(std::string name)
Get the variable belonging to the given key.
Definition: Manager.cc:58
static Manager & Instance()
get singleton instance.
Definition: Manager.cc:26
double charge(int pdgCode)
Returns electric charge of a particle with given pdg code.
Definition: EvtPDLUtil.cc:44
Abstract base class for different kinds of events.