2 #include <analysis/variables/Variables.h>
3 #include <analysis/variables/BasicParticleInformation.h>
4 #include <analysis/variables/VertexVariables.h>
5 #include <analysis/variables/PIDVariables.h>
6 #include <analysis/variables/TrackVariables.h>
8 #include <analysis/VariableManager/Manager.h>
9 #include <analysis/VariableManager/Utility.h>
11 #include <analysis/dataobjects/Particle.h>
12 #include <analysis/dataobjects/ParticleExtraInfoMap.h>
13 #include <analysis/dataobjects/ParticleList.h>
14 #include <analysis/dataobjects/EventExtraInfo.h>
15 #include <analysis/dataobjects/RestOfEvent.h>
16 #include <analysis/utility/ReferenceFrame.h>
18 #include <framework/datastore/StoreArray.h>
19 #include <framework/datastore/StoreObjPtr.h>
20 #include <framework/utilities/TestHelpers.h>
21 #include <framework/logging/Logger.h>
22 #include <framework/gearbox/Gearbox.h>
24 #include <mdst/dataobjects/MCParticle.h>
25 #include <mdst/dataobjects/MCParticleGraph.h>
26 #include <mdst/dataobjects/PIDLikelihood.h>
27 #include <mdst/dataobjects/Track.h>
28 #include <mdst/dataobjects/V0.h>
29 #include <mdst/dataobjects/ECLCluster.h>
30 #include <mdst/dataobjects/KLMCluster.h>
32 #include <gtest/gtest.h>
34 #include <TMatrixFSym.h>
36 #include <TLorentzVector.h>
42 using namespace Belle2::Variable;
47 TEST(KinematicVariableTest, Variable)
52 Gearbox& gearbox = Gearbox::getInstance();
53 gearbox.setBackends({std::string(
"file:")});
55 gearbox.open(
"geometry/Belle2.xml",
false);
58 Particle p({ 0.1 , -0.4, 0.8, 1.0 }, 11);
67 p.setMomentumVertexErrorMatrix(error);
69 EXPECT_FLOAT_EQ(0.9, particleP(&p));
70 EXPECT_FLOAT_EQ(1.0, particleE(&p));
71 EXPECT_FLOAT_EQ(0.1, particlePx(&p));
72 EXPECT_FLOAT_EQ(-0.4, particlePy(&p));
73 EXPECT_FLOAT_EQ(0.8, particlePz(&p));
74 EXPECT_FLOAT_EQ(0.412310562, particlePt(&p));
75 EXPECT_FLOAT_EQ(0.8 / 0.9, particleCosTheta(&p));
76 EXPECT_FLOAT_EQ(-1.325817664, particlePhi(&p));
78 EXPECT_FLOAT_EQ(0.737446378, particlePErr(&p));
79 EXPECT_FLOAT_EQ(sqrt(0.05), particlePxErr(&p));
80 EXPECT_FLOAT_EQ(sqrt(0.2), particlePyErr(&p));
81 EXPECT_FLOAT_EQ(sqrt(0.4), particlePzErr(&p));
82 EXPECT_FLOAT_EQ(0.488093530, particlePtErr(&p));
83 EXPECT_FLOAT_EQ(0.156402664, particleCosThetaErr(&p));
84 EXPECT_FLOAT_EQ(0.263066820, particlePhiErr(&p));
89 EXPECT_FLOAT_EQ(0.68176979, particleP(&p));
90 EXPECT_FLOAT_EQ(0.80920333, particleE(&p));
91 EXPECT_FLOAT_EQ(0.061728548, particlePx(&p));
92 EXPECT_FLOAT_EQ(-0.40000001, particlePy(&p));
93 EXPECT_FLOAT_EQ(0.54863429, particlePz(&p));
94 EXPECT_FLOAT_EQ(0.404735, particlePt(&p));
95 EXPECT_FLOAT_EQ(0.80472076, particleCosTheta(&p));
96 EXPECT_FLOAT_EQ(-1.4176828, particlePhi(&p));
98 EXPECT_FLOAT_EQ(sqrt(0.2), particlePyErr(&p));
103 EXPECT_ALL_NEAR(particleP(&p), 0.0, 1e-9);
104 EXPECT_FLOAT_EQ(0.4358899, particleE(&p));
105 EXPECT_ALL_NEAR(0.0, particlePx(&p), 1e-9);
106 EXPECT_ALL_NEAR(0.0, particlePy(&p), 1e-9);
107 EXPECT_ALL_NEAR(0.0, particlePz(&p), 1e-9);
108 EXPECT_ALL_NEAR(0.0, particlePt(&p), 1e-9);
114 EXPECT_FLOAT_EQ(0.9, particleP(&p));
115 EXPECT_FLOAT_EQ(1.0, particleE(&p));
116 EXPECT_FLOAT_EQ(0.1, particlePx(&p));
117 EXPECT_FLOAT_EQ(-0.4, particlePy(&p));
118 EXPECT_FLOAT_EQ(0.8, particlePz(&p));
119 EXPECT_FLOAT_EQ(0.412310562, particlePt(&p));
120 EXPECT_FLOAT_EQ(0.8 / 0.9, particleCosTheta(&p));
121 EXPECT_FLOAT_EQ(-1.325817664, particlePhi(&p));
123 EXPECT_FLOAT_EQ(0.737446378, particlePErr(&p));
124 EXPECT_FLOAT_EQ(sqrt(0.05), particlePxErr(&p));
125 EXPECT_FLOAT_EQ(sqrt(0.2), particlePyErr(&p));
126 EXPECT_FLOAT_EQ(sqrt(0.4), particlePzErr(&p));
127 EXPECT_FLOAT_EQ(0.488093530, particlePtErr(&p));
128 EXPECT_FLOAT_EQ(0.156402664, particleCosThetaErr(&p));
129 EXPECT_FLOAT_EQ(0.263066820, particlePhiErr(&p));
134 EXPECT_FLOAT_EQ(0.9, particleP(&p));
135 EXPECT_FLOAT_EQ(1.0, particleE(&p));
136 EXPECT_FLOAT_EQ(0.1, particlePx(&p));
137 EXPECT_FLOAT_EQ(-0.4, particlePy(&p));
138 EXPECT_FLOAT_EQ(0.8, particlePz(&p));
139 EXPECT_FLOAT_EQ(0.412310562, particlePt(&p));
140 EXPECT_FLOAT_EQ(0.8 / 0.9, particleCosTheta(&p));
141 EXPECT_FLOAT_EQ(-1.325817664, particlePhi(&p));
143 EXPECT_FLOAT_EQ(0.737446378, particlePErr(&p));
144 EXPECT_FLOAT_EQ(sqrt(0.05), particlePxErr(&p));
145 EXPECT_FLOAT_EQ(sqrt(0.2), particlePyErr(&p));
146 EXPECT_FLOAT_EQ(sqrt(0.4), particlePzErr(&p));
147 EXPECT_FLOAT_EQ(0.488093530, particlePtErr(&p));
148 EXPECT_FLOAT_EQ(0.156402664, particleCosThetaErr(&p));
149 EXPECT_FLOAT_EQ(0.263066820, particlePhiErr(&p));
151 const auto& frame = ReferenceFrame::GetCurrent();
152 EXPECT_FLOAT_EQ(-0.1, frame.getMomentumErrorMatrix(&p)(0, 1));
153 EXPECT_FLOAT_EQ(0.9, frame.getMomentumErrorMatrix(&p)(0, 2));
158 EXPECT_FLOAT_EQ(0.9, particleP(&p));
159 EXPECT_FLOAT_EQ(1.0, particleE(&p));
160 EXPECT_FLOAT_EQ(0.1, particlePx(&p));
161 EXPECT_FLOAT_EQ(-0.8, particlePy(&p));
162 EXPECT_FLOAT_EQ(-0.4, particlePz(&p));
164 EXPECT_FLOAT_EQ(0.737446378, particlePErr(&p));
165 EXPECT_FLOAT_EQ(sqrt(0.05), particlePxErr(&p));
166 EXPECT_FLOAT_EQ(sqrt(0.4), particlePyErr(&p));
167 EXPECT_FLOAT_EQ(sqrt(0.2), particlePzErr(&p));
169 const auto& frame = ReferenceFrame::GetCurrent();
170 EXPECT_FLOAT_EQ(-0.9, frame.getMomentumErrorMatrix(&p)(0, 1));
171 EXPECT_FLOAT_EQ(-0.1, frame.getMomentumErrorMatrix(&p)(0, 2));
176 EXPECT_FLOAT_EQ(0.68176979, particleP(&p));
177 EXPECT_FLOAT_EQ(0.80920333, particleE(&p));
178 EXPECT_FLOAT_EQ(0.061728548, particlePx(&p));
179 EXPECT_FLOAT_EQ(-0.40000001, particlePy(&p));
180 EXPECT_FLOAT_EQ(0.54863429, particlePz(&p));
181 EXPECT_FLOAT_EQ(0.404735, particlePt(&p));
182 EXPECT_FLOAT_EQ(0.80472076, particleCosTheta(&p));
183 EXPECT_FLOAT_EQ(-1.4176828, particlePhi(&p));
185 EXPECT_FLOAT_EQ(sqrt(0.2), particlePyErr(&p));
189 Particle pinv({ -0.1 , 0.4, -0.8, 1.0 }, 11);
191 Particle p2({ 0.0 , 0.0, 0.0, 0.4358899}, 11);
192 EXPECT_FLOAT_EQ(0.9, particleP(&p2));
193 EXPECT_FLOAT_EQ(1.0, particleE(&p2));
194 EXPECT_FLOAT_EQ(0.1, particlePx(&p2));
195 EXPECT_FLOAT_EQ(-0.4, particlePy(&p2));
196 EXPECT_FLOAT_EQ(0.8, particlePz(&p2));
197 EXPECT_FLOAT_EQ(0.412310562, particlePt(&p2));
198 EXPECT_FLOAT_EQ(0.8 / 0.9, particleCosTheta(&p2));
199 EXPECT_FLOAT_EQ(-1.325817664, particlePhi(&p2));
204 Particle p({ 0.0 , 0.0, 0.0, 0.0 }, 11);
205 EXPECT_FLOAT_EQ(0.0, particleP(&p));
206 EXPECT_FLOAT_EQ(0.0, particleE(&p));
207 EXPECT_FLOAT_EQ(0.0, particlePx(&p));
208 EXPECT_FLOAT_EQ(0.0, particlePy(&p));
209 EXPECT_FLOAT_EQ(0.0, particlePz(&p));
210 EXPECT_FLOAT_EQ(0.0, particlePt(&p));
211 EXPECT_FLOAT_EQ(1.0, particleCosTheta(&p));
212 EXPECT_FLOAT_EQ(0.0, particlePhi(&p));
215 EXPECT_FLOAT_EQ(0.0, particleP(&p));
216 EXPECT_FLOAT_EQ(0.0, particleE(&p));
217 EXPECT_FLOAT_EQ(0.0, particlePx(&p));
218 EXPECT_FLOAT_EQ(0.0, particlePy(&p));
219 EXPECT_FLOAT_EQ(0.0, particlePz(&p));
220 EXPECT_FLOAT_EQ(0.0, particlePt(&p));
221 EXPECT_FLOAT_EQ(1.0, particleCosTheta(&p));
222 EXPECT_FLOAT_EQ(0.0, particlePhi(&p));
226 DataStore::Instance().setInitializeActive(
true);
228 particles.registerInDataStore();
229 DataStore::Instance().setInitializeActive(
false);
231 TLorentzVector vec0 = {0.0, 0.0, 0.0, T.
getCMSEnergy()};
232 TLorentzVector vec1 = {0.0, +0.332174566, 0.0, T.
getCMSEnergy() / 2.};
233 TLorentzVector vec2 = {0.0, -0.332174566, 0.0, T.
getCMSEnergy() / 2.};
241 EXPECT_ALL_NEAR(m2RecoilSignalSide(p0), 0.0, 1e-7);
248 TEST(VertexVariableTest, Variable)
253 Gearbox& gearbox = Gearbox::getInstance();
254 gearbox.setBackends({std::string(
"file:")});
256 gearbox.open(
"geometry/Belle2.xml",
false);
258 Particle p({ 0.1 , -0.4, 0.8, 1.0 }, 11);
260 p.setVertex(TVector3(1.0, 2.0, 2.0));
262 EXPECT_FLOAT_EQ(1.0, particleDX(&p));
263 EXPECT_FLOAT_EQ(2.0, particleDY(&p));
264 EXPECT_FLOAT_EQ(2.0, particleDZ(&p));
265 EXPECT_FLOAT_EQ(std::sqrt(5.0), particleDRho(&p));
266 EXPECT_FLOAT_EQ(3.0, particleDistance(&p));
267 EXPECT_FLOAT_EQ(0.5, particlePvalue(&p));
271 EXPECT_FLOAT_EQ(1.0382183, particleDX(&p));
272 EXPECT_FLOAT_EQ(2.0, particleDY(&p));
273 EXPECT_FLOAT_EQ(2.2510159, particleDZ(&p));
274 EXPECT_FLOAT_EQ(std::sqrt(2.0 * 2.0 + 1.0382183 * 1.0382183), particleDRho(&p));
275 EXPECT_FLOAT_EQ(3.185117, particleDistance(&p));
276 EXPECT_FLOAT_EQ(0.5, particlePvalue(&p));
280 Particle p2({ 0.1 , -0.4, 0.8, 1.0 }, 11);
282 p2.setVertex(TVector3(1.0, 2.0, 2.0));
285 EXPECT_FLOAT_EQ(0.0, particleDX(&p));
286 EXPECT_FLOAT_EQ(0.0, particleDY(&p));
287 EXPECT_FLOAT_EQ(0.0, particleDZ(&p));
288 EXPECT_FLOAT_EQ(0.0, particleDRho(&p));
289 EXPECT_FLOAT_EQ(0.0, particleDistance(&p));
290 EXPECT_FLOAT_EQ(0.5, particlePvalue(&p));
313 TEST(TrackVariablesTest, Variable)
315 DataStore::Instance().setInitializeActive(
true);
320 myResults.registerInDataStore();
321 myTracks.registerInDataStore();
322 myV0s.registerInDataStore();
323 myParticles.registerInDataStore();
324 DataStore::Instance().setInitializeActive(
false);
328 const float pValue = 0.5;
329 const float bField = 1.5;
334 TVector2 d(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
335 TVector2 pt(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
336 d.Set(d.X(), -(d.X()*pt.Px()) / pt.Py());
339 TVector3 position(d.X(), d.Y(), generator.Uniform(-1, 1));
340 TVector3 momentum(pt.Px(), pt.Py(), generator.Uniform(-1, 1));
342 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
344 myResults.
appendNew(position, momentum, cov6, charge, Const::electron, pValue, bField, CDCValue, 16777215, 0);
351 const Manager::Var* vIsFromECL = Manager::Instance().getVariable(
"isFromECL");
352 const Manager::Var* vIsFromKLM = Manager::Instance().getVariable(
"isFromKLM");
353 const Manager::Var* vIsFromTrack = Manager::Instance().getVariable(
"isFromTrack");
354 const Manager::Var* vIsFromV0 = Manager::Instance().getVariable(
"isFromV0");
356 EXPECT_TRUE(vIsFromTrack->
function(part));
357 EXPECT_FALSE(vIsFromECL->
function(part));
358 EXPECT_FALSE(vIsFromKLM->
function(part));
359 EXPECT_FALSE(vIsFromV0->
function(part));
360 EXPECT_FLOAT_EQ(0.5, trackPValue(part));
361 EXPECT_FLOAT_EQ(position.Z(), trackZ0(part));
362 EXPECT_FLOAT_EQ(sqrt(pow(position.X(), 2) + pow(position.Y(), 2)), trackD0(part));
363 EXPECT_FLOAT_EQ(3, trackNCDCHits(part));
364 EXPECT_FLOAT_EQ(24, trackNSVDHits(part));
365 EXPECT_FLOAT_EQ(12, trackNPXDHits(part));
369 myResults.
appendNew(position, momentum, cov6, charge * -1,
370 Const::electron, pValue, bField, CDCValue, 16777215, 0);
375 myV0s.
appendNew(
V0(std::pair(savedTrack, myResults[0]), std::pair(savedTrack2, myResults[1])));
376 const TLorentzVector v0Momentum(momentum * 2, (momentum * 2).Mag());
377 auto v0particle = myParticles.
appendNew(v0Momentum, 22,
378 Particle::c_Unflavored, Particle::c_V0, 0);
380 v0particle->appendDaughter(1,
false);
383 EXPECT_FALSE(vIsFromTrack->
function(v0particle));
384 EXPECT_FALSE(vIsFromECL->
function(v0particle));
385 EXPECT_FALSE(vIsFromKLM->
function(v0particle));
386 EXPECT_TRUE(vIsFromV0->
function(v0particle));
388 const Manager::Var* vNDaughters = Manager::Instance().getVariable(
"nDaughters");
389 EXPECT_FLOAT_EQ(vNDaughters->
function(v0particle), 2);
392 class MCTruthVariablesTest :
public ::testing::Test {
397 DataStore::Instance().reset();
398 DataStore::Instance().setInitializeActive(
true);
408 clusters.registerInDataStore();
409 mcparticles.registerInDataStore();
410 tracks.registerInDataStore();
411 trackfits.registerInDataStore();
412 particles.registerInDataStore();
416 tracks.registerRelationTo(mcparticles);
417 particles.registerRelationTo(mcparticles);
421 tracks.registerRelationTo(clusters);
424 DataStore::Instance().setInitializeActive(
false);
439 true_electron->
setPDG(11);
446 cl0->setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
447 cl0->setClusterId(0);
451 cl1->setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
452 cl1->setClusterId(1);
457 TVector3(), TVector3(), cov, -1, Const::electron, 0.5, 1.5,
458 static_cast<unsigned long long int>(0x300000000000000), 16777215, 0);
459 auto* electron_tr = tracks.appendNew(
Track());
460 electron_tr->setTrackFitResultIndex(Const::electron, 0);
461 electron_tr->addRelationTo(cl1);
465 TVector3(), TVector3(), cov1, -1, Const::pion, 0.51, 1.5,
466 static_cast<unsigned long long int>(0x300000000000000), 16777215, 0);
467 auto* pion_tr = tracks.appendNew(
Track());
468 pion_tr->setTrackFitResultIndex(Const::pion, 0);
469 pion_tr->addRelationTo(cl1);
472 cl0->addRelationTo(true_photon, 12.3);
473 cl0->addRelationTo(true_electron, 2.3);
474 cl1->addRelationTo(true_electron, 45.6);
475 cl1->addRelationTo(true_photon, 5.6);
476 cl1->addRelationTo(true_pion, 15.6);
478 electron_tr->addRelationTo(true_electron);
479 pion_tr->addRelationTo(true_pion);
482 const auto* photon = particles.appendNew(
Particle(cl0));
483 const auto* electron = particles.appendNew(
Particle(electron_tr, Const::electron));
484 const auto* pion = particles.appendNew(
Particle(pion_tr, Const::pion));
485 const auto* misid_photon = particles.appendNew(
Particle(cl1));
488 photon->addRelationTo(true_photon);
489 electron->addRelationTo(true_electron);
490 pion->addRelationTo(true_pion);
491 misid_photon->addRelationTo(true_electron);
494 virtual void TearDown()
496 DataStore::Instance().reset();
500 TEST_F(MCTruthVariablesTest, ECLMCMatchWeightVariable)
503 const auto* photon = particles[0];
504 const auto* electron = particles[1];
505 const auto* pion = particles[2];
507 const auto* weight = Manager::Instance().getVariable(
"clusterMCMatchWeight");
508 EXPECT_FLOAT_EQ(weight->function(photon), 12.3);
509 EXPECT_FLOAT_EQ(weight->function(electron), 45.6);
510 EXPECT_FLOAT_EQ(weight->function(pion), 15.6);
513 TEST_F(MCTruthVariablesTest, ECLBestMCMatchVariables)
516 const auto* photon = particles[0];
517 const auto* electron = particles[1];
518 const auto* pion = particles[2];
519 const auto* misid_photon = particles[3];
522 const auto* pdgcode = Manager::Instance().getVariable(
"clusterBestMCPDG");
523 EXPECT_EQ(pdgcode->function(photon), 22);
524 EXPECT_EQ(pdgcode->function(electron), 11);
525 EXPECT_EQ(pdgcode->function(pion), 11);
526 EXPECT_EQ(pdgcode->function(misid_photon), 11);
528 const auto* weight = Manager::Instance().getVariable(
"clusterBestMCMatchWeight");
529 EXPECT_FLOAT_EQ(weight->function(photon), 12.3);
530 EXPECT_FLOAT_EQ(weight->function(electron), 45.6);
531 EXPECT_FLOAT_EQ(weight->function(pion), 45.6);
532 EXPECT_FLOAT_EQ(weight->function(misid_photon), 45.6);
535 class ROEVariablesTest :
public ::testing::Test {
538 void SetUp()
override
542 DataStore::Instance().setInitializeActive(
true);
543 pi0ParticleList.registerInDataStore(DataStore::c_DontWriteOut);
551 myECLClusters.registerInDataStore();
552 myKLMClusters.registerInDataStore();
553 myTFRs.registerInDataStore();
554 myTracks.registerInDataStore();
555 myParticles.registerInDataStore();
556 myROEs.registerInDataStore();
557 myPIDLikelihoods.registerInDataStore();
560 DataStore::Instance().setInitializeActive(
false);
564 void TearDown()
override
566 DataStore::Instance().reset();
573 TEST_F(ROEVariablesTest, Variable)
575 Gearbox& gearbox = Gearbox::getInstance();
576 gearbox.setBackends({std::string(
"file:")});
578 gearbox.open(
"geometry/Belle2.xml",
false);
589 pi0ParticleList->initialize(111,
"pi0:vartest");
608 myROEECL.
setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
619 const float pValue = 0.5;
620 const float bField = 1.5;
624 TVector3 position(1.0, 0, 0);
625 TVector3 momentum(0, 1.0, 0);
627 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
629 myTFRs.
appendNew(position, momentum, cov6, charge, Const::muon, pValue, bField, CDCValue, 16777215, 0);
655 vector<const Particle*> roeParticlesToAdd;
656 roeParticlesToAdd.push_back(roeTrackParticle);
657 roeParticlesToAdd.push_back(roeECLParticle);
658 roeParticlesToAdd.push_back(roeKLMParticle);
693 std::shared_ptr<Variable::Cut> trackSelection = std::shared_ptr<Variable::Cut>(Variable::Cut::compile(
"p > 2"));
694 std::shared_ptr<Variable::Cut> eclSelection = std::shared_ptr<Variable::Cut>(Variable::Cut::compile(
"p > 2"));
698 part->addRelationTo(savedROE);
703 B2INFO(
"E0 is " << E0);
705 TLorentzVector pTrack_ROE_Lab(momentum, TMath::Sqrt(Const::muon.getMass()*Const::muon.getMass() + 1.0 ));
706 pTrack_ROE_Lab = roeTrackParticle->
get4Vector();
707 TLorentzVector pECL_ROE_Lab(0, 0, eclROE, eclROE);
708 TLorentzVector pECL_REC_Lab(0, 0, eclREC, eclREC);
710 TLorentzVector rec4vec;
711 rec4vec.SetE(pECL_REC_Lab.E());
712 rec4vec.SetVect(pECL_REC_Lab.Vect());
714 TLorentzVector roe4vec;
715 roe4vec.SetE(pTrack_ROE_Lab.E() + pECL_ROE_Lab.E());
716 roe4vec.SetVect(pTrack_ROE_Lab.Vect() + pECL_ROE_Lab.Vect());
721 TVector3 pB = - roe4vecCMS.Vect();
725 m4v0.SetE(2 * E0 - (rec4vecCMS.E() + roe4vecCMS.E()));
726 m4v0.SetVect(- (rec4vecCMS.Vect() + roe4vecCMS.Vect()));
729 m4v1.SetE(E0 - rec4vecCMS.E());
730 m4v1.SetVect(- (rec4vecCMS.Vect() + roe4vecCMS.Vect()));
733 m4v2.SetE(E0 - rec4vecCMS.E());
734 m4v2.SetVect(- rec4vecCMS.Vect());
737 m4v3.SetE(E0 - rec4vecCMS.E());
738 m4v3.SetVect(pB - rec4vecCMS.Vect());
740 TLorentzVector neutrino4vecCMS;
741 neutrino4vecCMS.SetVect(- (roe4vecCMS.Vect() + rec4vecCMS.Vect()));
742 neutrino4vecCMS.SetE(neutrino4vecCMS.Vect().Mag());
744 TLorentzVector corrRec4vecCMS = rec4vecCMS + neutrino4vecCMS;
745 B2INFO(
"roe4vecCMS.E() = " << roe4vecCMS.E());
753 EXPECT_B2FATAL(savedROE->
hasParticle(part,
"noSuchMask"));
757 const Manager::Var* var = Manager::Instance().getVariable(
"nROE_Charged(mask1)");
758 ASSERT_NE(var,
nullptr);
759 EXPECT_FLOAT_EQ(var->function(part), 1.0);
761 var = Manager::Instance().getVariable(
"nROE_Charged(mask2)");
762 ASSERT_NE(var,
nullptr);
763 EXPECT_FLOAT_EQ(var->function(part), 0.0);
765 var = Manager::Instance().getVariable(
"nROE_Charged(mask1, 13)");
766 ASSERT_NE(var,
nullptr);
767 EXPECT_FLOAT_EQ(var->function(part), 1.0);
769 var = Manager::Instance().getVariable(
"nROE_Charged(mask1, 211)");
770 ASSERT_NE(var,
nullptr);
771 EXPECT_FLOAT_EQ(var->function(part), 0.0);
773 var = Manager::Instance().getVariable(
"nROE_Photons(mask1)");
774 ASSERT_NE(var,
nullptr);
775 EXPECT_FLOAT_EQ(var->function(part), 1.0);
777 var = Manager::Instance().getVariable(
"nROE_Photons(mask2)");
778 ASSERT_NE(var,
nullptr);
779 EXPECT_FLOAT_EQ(var->function(part), 0.0);
781 var = Manager::Instance().getVariable(
"nROE_NeutralHadrons(mask1)");
782 ASSERT_NE(var,
nullptr);
783 EXPECT_FLOAT_EQ(var->function(part), 1.0);
785 var = Manager::Instance().getVariable(
"nROE_Tracks(mask1)");
786 ASSERT_NE(var,
nullptr);
787 EXPECT_FLOAT_EQ(var->function(part), 1.0);
789 var = Manager::Instance().getVariable(
"nROE_Tracks(mask2)");
790 ASSERT_NE(var,
nullptr);
791 EXPECT_FLOAT_EQ(var->function(part), 0.0);
793 var = Manager::Instance().getVariable(
"nROE_ECLClusters(mask1)");
794 ASSERT_NE(var,
nullptr);
795 EXPECT_FLOAT_EQ(var->function(part), 1.0);
797 var = Manager::Instance().getVariable(
"nROE_ECLClusters(mask2)");
798 ASSERT_NE(var,
nullptr);
799 EXPECT_FLOAT_EQ(var->function(part), 0.0);
801 var = Manager::Instance().getVariable(
"nROE_NeutralECLClusters(mask1)");
802 ASSERT_NE(var,
nullptr);
803 EXPECT_FLOAT_EQ(var->function(part), 1.0);
805 var = Manager::Instance().getVariable(
"nROE_NeutralECLClusters(mask2)");
806 ASSERT_NE(var,
nullptr);
807 EXPECT_FLOAT_EQ(var->function(part), 0.0);
809 var = Manager::Instance().getVariable(
"nROE_ParticlesInList(pi0:vartest)");
810 ASSERT_NE(var,
nullptr);
811 EXPECT_FLOAT_EQ(var->function(part), 0.0);
813 var = Manager::Instance().getVariable(
"roeCharge(mask1)");
814 ASSERT_NE(var,
nullptr);
815 EXPECT_FLOAT_EQ(var->function(part), 1.0);
817 var = Manager::Instance().getVariable(
"roeCharge(mask2)");
818 ASSERT_NE(var,
nullptr);
819 EXPECT_FLOAT_EQ(var->function(part), 0.0);
821 var = Manager::Instance().getVariable(
"roeEextra(mask1)");
822 ASSERT_NE(var,
nullptr);
823 EXPECT_FLOAT_EQ(var->function(part), savedROEECL->
getEnergy(ECLCluster::EHypothesisBit::c_nPhotons));
825 var = Manager::Instance().getVariable(
"roeEextra(mask2)");
826 ASSERT_NE(var,
nullptr);
827 EXPECT_FLOAT_EQ(var->function(part), 0.0);
829 var = Manager::Instance().getVariable(
"roeDeltae(mask1)");
830 ASSERT_NE(var,
nullptr);
831 EXPECT_FLOAT_EQ(var->function(part), roe4vecCMS.E() - E0);
833 var = Manager::Instance().getVariable(
"roeDeltae(mask2)");
834 ASSERT_NE(var,
nullptr);
835 EXPECT_FLOAT_EQ(var->function(part), -E0);
837 var = Manager::Instance().getVariable(
"roeMbc(mask1)");
838 ASSERT_NE(var,
nullptr);
839 EXPECT_FLOAT_EQ(var->function(part), TMath::Sqrt(E0 * E0 - roe4vecCMS.Vect().Mag2()));
841 var = Manager::Instance().getVariable(
"roeMbc(mask2)");
842 ASSERT_NE(var,
nullptr);
843 EXPECT_FLOAT_EQ(var->function(part), E0);
845 var = Manager::Instance().getVariable(
"weDeltae(mask1,0)");
846 ASSERT_NE(var,
nullptr);
847 EXPECT_FLOAT_EQ(var->function(part), corrRec4vecCMS.E() - E0);
849 var = Manager::Instance().getVariable(
"weDeltae(mask2,0)");
850 ASSERT_NE(var,
nullptr);
851 EXPECT_FLOAT_EQ(var->function(part), rec4vecCMS.E() + rec4vecCMS.Vect().Mag() - E0);
853 var = Manager::Instance().getVariable(
"weMbc(mask1,0)");
854 ASSERT_NE(var,
nullptr);
855 EXPECT_FLOAT_EQ(var->function(part), TMath::Sqrt(E0 * E0 - corrRec4vecCMS.Vect().Mag2()));
857 var = Manager::Instance().getVariable(
"weMbc(mask2,0)");
858 ASSERT_NE(var,
nullptr);
859 EXPECT_FLOAT_EQ(var->function(part), E0);
861 var = Manager::Instance().getVariable(
"weMissM2(mask1,0)");
862 ASSERT_NE(var,
nullptr);
863 EXPECT_FLOAT_EQ(var->function(part), m4v0.Mag2());
865 var = Manager::Instance().getVariable(
"weMissM2(mask2,0)");
866 ASSERT_NE(var,
nullptr);
867 EXPECT_FLOAT_EQ(var->function(part), (2 * E0 - rec4vecCMS.E()) * (2 * E0 - rec4vecCMS.E()) - rec4vecCMS.Vect().Mag2());
872 class EventVariableTest :
public ::testing::Test {
875 void SetUp()
override
877 DataStore::Instance().setInitializeActive(
true);
880 DataStore::Instance().setInitializeActive(
false);
885 void TearDown()
override
887 DataStore::Instance().reset();
891 TEST_F(EventVariableTest, ExperimentRunEventDateAndTime)
893 const Manager::Var* exp = Manager::Instance().getVariable(
"expNum");
894 const Manager::Var* run = Manager::Instance().getVariable(
"runNum");
895 const Manager::Var* evt = Manager::Instance().getVariable(
"evtNum");
896 const Manager::Var* date = Manager::Instance().getVariable(
"date");
897 const Manager::Var* year = Manager::Instance().getVariable(
"year");
898 const Manager::Var* time = Manager::Instance().getVariable(
"eventTimeSeconds");
901 EXPECT_FALSE(date->function(
nullptr) == date->function(
nullptr));
903 EXPECT_FALSE(time->function(
nullptr) == time->function(
nullptr));
905 DataStore::Instance().setInitializeActive(
true);
907 evtMetaData.registerInDataStore();
908 DataStore::Instance().setInitializeActive(
false);
909 evtMetaData.create();
910 evtMetaData->setExperiment(1337);
911 evtMetaData->setRun(12345);
912 evtMetaData->setEvent(54321);
913 evtMetaData->setTime(1288569600e9);
918 EXPECT_FLOAT_EQ(exp->function(NULL), 1337.);
919 EXPECT_FLOAT_EQ(run->function(NULL), 12345.);
920 EXPECT_FLOAT_EQ(evt->function(NULL), 54321.);
921 EXPECT_FLOAT_EQ(date->function(NULL), 20101101.);
922 EXPECT_FLOAT_EQ(year->
function(NULL), 2010.);
923 EXPECT_FLOAT_EQ(time->function(NULL), 1288569600);
926 TEST_F(EventVariableTest, TestGlobalCounters)
929 const Manager::Var* var = Manager::Instance().getVariable(
"nMCParticles");
930 EXPECT_FLOAT_EQ(var->function(NULL), 0.0);
932 for (
unsigned i = 0; i < 10; ++i)
935 EXPECT_FLOAT_EQ(var->function(NULL), 10.0);
940 TEST_F(EventVariableTest, TestIfContinuumEvent_ForContinuumEvent)
942 DataStore::Instance().setInitializeActive(
true);
945 particles.registerRelationTo(mcParticles);
946 DataStore::Instance().setInitializeActive(
false);
948 auto* mcParticle = mcParticles.
appendNew();
950 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
951 auto* p1 = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
952 p1->addRelationTo(mcParticle);
956 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
957 auto* p2 = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
958 p2->addRelationTo(mcParticle);
960 const Manager::Var* var = Manager::Instance().getVariable(
"isContinuumEvent");
961 ASSERT_NE(var,
nullptr);
962 EXPECT_FLOAT_EQ(var->function(p1), 1.0);
963 EXPECT_FLOAT_EQ(var->function(p2), 1.0);
964 const Manager::Var* varN = Manager::Instance().getVariable(
"isNotContinuumEvent");
965 ASSERT_NE(varN,
nullptr);
966 EXPECT_FLOAT_EQ(varN->
function(p1), 0.0);
967 EXPECT_FLOAT_EQ(varN->
function(p2), 0.0);
970 TEST_F(EventVariableTest, TestIfContinuumEvent_ForUpsilon4SEvent)
972 DataStore::Instance().setInitializeActive(
true);
976 DataStore::Instance().setInitializeActive(
false);
978 auto* mcParticle = mcParticles2.
appendNew();
980 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
981 auto* p3 = particles2.
appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
982 p3->addRelationTo(mcParticle);
985 mcParticle->
setPDG(300553);
986 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
987 auto* p4 = particles2.
appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 300553);
988 p4->addRelationTo(mcParticle);
990 const Manager::Var* var2 = Manager::Instance().getVariable(
"isContinuumEvent");
991 ASSERT_NE(var2,
nullptr);
992 EXPECT_FLOAT_EQ(var2->
function(p3), 0.0);
993 EXPECT_FLOAT_EQ(var2->
function(p4), 0.0);
994 const Manager::Var* var2N = Manager::Instance().getVariable(
"isNotContinuumEvent");
995 ASSERT_NE(var2N,
nullptr);
996 EXPECT_FLOAT_EQ(var2N->
function(p3), 1.0);
997 EXPECT_FLOAT_EQ(var2N->
function(p4), 1.0);
1000 TEST_F(EventVariableTest, TestIfContinuumEvent_ForWrongReconstructedUpsilon4SEvent)
1002 DataStore::Instance().setInitializeActive(
true);
1006 DataStore::Instance().setInitializeActive(
false);
1008 auto* mcParticle = mcParticles3.
appendNew();
1010 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
1011 auto* p5 = particles3.
appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
1015 mcParticle->
setPDG(300553);
1016 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
1017 auto* p6 = particles3.
appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 15);
1020 const Manager::Var* var3 = Manager::Instance().getVariable(
"isContinuumEvent");
1021 ASSERT_NE(var3,
nullptr);
1022 EXPECT_FLOAT_EQ(var3->
function(p5), 0.0);
1023 EXPECT_FLOAT_EQ(var3->
function(p6), 0.0);
1024 const Manager::Var* var3N = Manager::Instance().getVariable(
"isNotContinuumEvent");
1025 ASSERT_NE(var3N,
nullptr);
1026 EXPECT_FLOAT_EQ(var3N->
function(p5), 1.0);
1027 EXPECT_FLOAT_EQ(var3N->
function(p6), 1.0);
1031 class MetaVariableTest :
public ::testing::Test {
1034 void SetUp()
override
1036 DataStore::Instance().setInitializeActive(
true);
1041 DataStore::Instance().setInitializeActive(
false);
1045 void TearDown()
override
1047 DataStore::Instance().reset();
1051 TEST_F(MetaVariableTest, countDaughters)
1053 TLorentzVector momentum;
1054 const int nDaughters = 6;
1056 std::vector<int> daughterIndices;
1057 for (
int i = 0; i < nDaughters; i++) {
1058 Particle d(TLorentzVector(1, 0, 0, 3.0), (i % 2) ? 211 : -211);
1059 momentum += d.get4Vector();
1060 Particle* newDaughters = particles.appendNew(d);
1063 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
1065 const Manager::Var* var = Manager::Instance().getVariable(
"countDaughters(charge > 0)");
1066 ASSERT_NE(var,
nullptr);
1067 EXPECT_DOUBLE_EQ(var->function(p), 3.0);
1069 var = Manager::Instance().getVariable(
"countDaughters(abs(charge) > 0)");
1070 ASSERT_NE(var,
nullptr);
1071 EXPECT_DOUBLE_EQ(var->function(p), 6.0);
1075 TEST_F(MetaVariableTest, useRestFrame)
1077 Gearbox& gearbox = Gearbox::getInstance();
1078 gearbox.setBackends({std::string(
"file:")});
1080 gearbox.open(
"geometry/Belle2.xml",
false);
1082 Particle p({ 0.1 , -0.4, 0.8, 1.0 }, 11);
1083 p.setVertex(TVector3(1.0, 2.0, 2.0));
1085 const Manager::Var* var = Manager::Instance().getVariable(
"p");
1086 ASSERT_NE(var,
nullptr);
1087 EXPECT_FLOAT_EQ(var->function(&p), 0.9);
1089 var = Manager::Instance().getVariable(
"E");
1090 ASSERT_NE(var,
nullptr);
1091 EXPECT_FLOAT_EQ(var->function(&p), 1.0);
1093 var = Manager::Instance().getVariable(
"distance");
1094 ASSERT_NE(var,
nullptr);
1095 EXPECT_FLOAT_EQ(var->function(&p), 3.0);
1097 var = Manager::Instance().getVariable(
"useRestFrame(p)");
1098 ASSERT_NE(var,
nullptr);
1099 EXPECT_ALL_NEAR(var->function(&p), 0.0, 1e-9);
1101 var = Manager::Instance().getVariable(
"useRestFrame(E)");
1102 ASSERT_NE(var,
nullptr);
1103 EXPECT_FLOAT_EQ(var->function(&p), 0.4358899);
1105 var = Manager::Instance().getVariable(
"useRestFrame(distance)");
1106 ASSERT_NE(var,
nullptr);
1107 EXPECT_FLOAT_EQ(var->function(&p), 0.0);
1110 TEST_F(MetaVariableTest, useLabFrame)
1112 Particle p({ 0.1 , -0.4, 0.8, 1.0 }, 11);
1113 p.setVertex(TVector3(1.0, 2.0, 2.0));
1115 const Manager::Var* var = Manager::Instance().getVariable(
"p");
1116 ASSERT_NE(var,
nullptr);
1117 EXPECT_FLOAT_EQ(var->function(&p), 0.9);
1119 var = Manager::Instance().getVariable(
"E");
1120 ASSERT_NE(var,
nullptr);
1121 EXPECT_FLOAT_EQ(var->function(&p), 1.0);
1123 var = Manager::Instance().getVariable(
"distance");
1124 ASSERT_NE(var,
nullptr);
1125 EXPECT_FLOAT_EQ(var->function(&p), 3.0);
1127 var = Manager::Instance().getVariable(
"useLabFrame(p)");
1128 ASSERT_NE(var,
nullptr);
1129 EXPECT_FLOAT_EQ(var->function(&p), 0.9);
1131 var = Manager::Instance().getVariable(
"useLabFrame(E)");
1132 ASSERT_NE(var,
nullptr);
1133 EXPECT_FLOAT_EQ(var->function(&p), 1.0);
1135 var = Manager::Instance().getVariable(
"useLabFrame(distance)");
1136 ASSERT_NE(var,
nullptr);
1137 EXPECT_FLOAT_EQ(var->function(&p), 3.0);
1140 TEST_F(MetaVariableTest, useCMSFrame)
1142 Gearbox& gearbox = Gearbox::getInstance();
1143 gearbox.setBackends({std::string(
"file:")});
1145 gearbox.open(
"geometry/Belle2.xml",
false);
1147 Particle p({ 0.1 , -0.4, 0.8, 1.0 }, 11);
1148 p.setVertex(TVector3(1.0, 2.0, 2.0));
1150 const Manager::Var* var = Manager::Instance().getVariable(
"p");
1151 ASSERT_NE(var,
nullptr);
1152 EXPECT_FLOAT_EQ(var->function(&p), 0.9);
1154 var = Manager::Instance().getVariable(
"E");
1155 ASSERT_NE(var,
nullptr);
1156 EXPECT_FLOAT_EQ(var->function(&p), 1.0);
1158 var = Manager::Instance().getVariable(
"distance");
1159 ASSERT_NE(var,
nullptr);
1160 EXPECT_FLOAT_EQ(var->function(&p), 3.0);
1162 var = Manager::Instance().getVariable(
"useCMSFrame(p)");
1163 ASSERT_NE(var,
nullptr);
1164 EXPECT_FLOAT_EQ(var->function(&p), 0.68176979);
1166 var = Manager::Instance().getVariable(
"useCMSFrame(E)");
1167 ASSERT_NE(var,
nullptr);
1168 EXPECT_FLOAT_EQ(var->function(&p), 0.80920333);
1170 var = Manager::Instance().getVariable(
"useCMSFrame(distance)");
1171 ASSERT_NE(var,
nullptr);
1172 EXPECT_FLOAT_EQ(var->function(&p), 3.185117);
1175 TEST_F(MetaVariableTest, useTagSideRecoilRestFrame)
1177 DataStore::Instance().setInitializeActive(
true);
1179 particles.registerInDataStore();
1180 DataStore::Instance().setInitializeActive(
false);
1182 TLorentzVector vec0 = {0.0, 0.0, 0.0, T.
getCMSEnergy()};
1183 TLorentzVector vec1 = {0.0, +0.332174566, 0.0, T.
getCMSEnergy() / 2.};
1184 TLorentzVector vec2 = {0.0, -0.332174566, 0.0, T.
getCMSEnergy() / 2.};
1192 const Manager::Var* var = Manager::Instance().getVariable(
"useTagSideRecoilRestFrame(daughter(1, p), 0)");
1193 ASSERT_NE(var,
nullptr);
1194 EXPECT_NEAR(var->function(p0), 0., 1e-6);
1196 var = Manager::Instance().getVariable(
"useTagSideRecoilRestFrame(daughter(1, px), 0)");
1197 ASSERT_NE(var,
nullptr);
1198 EXPECT_NEAR(var->function(p0), 0., 1e-6);
1200 var = Manager::Instance().getVariable(
"useTagSideRecoilRestFrame(daughter(1, py), 0)");
1201 ASSERT_NE(var,
nullptr);
1202 EXPECT_NEAR(var->function(p0), 0., 1e-6);
1204 var = Manager::Instance().getVariable(
"useTagSideRecoilRestFrame(daughter(1, pz), 0)");
1205 ASSERT_NE(var,
nullptr);
1206 EXPECT_NEAR(var->function(p0), 0., 1e-6);
1208 var = Manager::Instance().getVariable(
"useTagSideRecoilRestFrame(daughter(1, E), 0)");
1209 ASSERT_NE(var,
nullptr);
1210 EXPECT_NEAR(var->function(p0), p1->getMass(), 1e-6);
1214 TEST_F(MetaVariableTest, extraInfo)
1216 Particle p({ 0.1 , -0.4, 0.8, 1.0 }, 11);
1217 p.addExtraInfo(
"pi", 3.14);
1219 const Manager::Var* var = Manager::Instance().getVariable(
"extraInfo(pi)");
1220 ASSERT_NE(var,
nullptr);
1221 EXPECT_FLOAT_EQ(var->function(&p), 3.14);
1224 EXPECT_TRUE(std::isnan(var->function(
nullptr)));
1227 TEST_F(MetaVariableTest, eventExtraInfo)
1230 if (not eventExtraInfo.isValid())
1231 eventExtraInfo.create();
1232 eventExtraInfo->addExtraInfo(
"pi", 3.14);
1233 const Manager::Var* var = Manager::Instance().getVariable(
"eventExtraInfo(pi)");
1234 ASSERT_NE(var,
nullptr);
1235 EXPECT_FLOAT_EQ(var->function(
nullptr), 3.14);
1238 TEST_F(MetaVariableTest, eventCached)
1240 const Manager::Var* var = Manager::Instance().getVariable(
"eventCached(constant(3.14))");
1241 ASSERT_NE(var,
nullptr);
1242 EXPECT_FLOAT_EQ(var->function(
nullptr), 3.14);
1244 EXPECT_TRUE(eventExtraInfo.isValid());
1245 EXPECT_TRUE(eventExtraInfo->hasExtraInfo(
"__constant__bo3__pt14__bc"));
1246 EXPECT_FLOAT_EQ(eventExtraInfo->getExtraInfo(
"__constant__bo3__pt14__bc"), 3.14);
1247 eventExtraInfo->addExtraInfo(
"__eventExtraInfo__bopi__bc", 3.14);
1248 var = Manager::Instance().getVariable(
"eventCached(eventExtraInfo(pi))");
1249 ASSERT_NE(var,
nullptr);
1250 EXPECT_FLOAT_EQ(var->function(
nullptr), 3.14);
1253 TEST_F(MetaVariableTest, particleCached)
1255 Particle p({ 0.1 , -0.4, 0.8, 2.0 }, 11);
1256 const Manager::Var* var = Manager::Instance().getVariable(
"particleCached(px)");
1257 ASSERT_NE(var,
nullptr);
1258 EXPECT_FLOAT_EQ(var->function(&p), 0.1);
1259 EXPECT_TRUE(p.hasExtraInfo(
"__px"));
1260 EXPECT_FLOAT_EQ(p.getExtraInfo(
"__px"), 0.1);
1261 p.addExtraInfo(
"__py", -0.5);
1262 var = Manager::Instance().getVariable(
"particleCached(py)");
1263 ASSERT_NE(var,
nullptr);
1264 EXPECT_FLOAT_EQ(var->function(&p), -0.5);
1267 TEST_F(MetaVariableTest, basicMathTest)
1269 Particle p({ 0.1 , -0.4, 0.8, 2.0 }, 11);
1271 const Manager::Var* var = Manager::Instance().getVariable(
"abs(py)");
1272 ASSERT_NE(var,
nullptr);
1273 EXPECT_FLOAT_EQ(var->function(&p), 0.4);
1275 var = Manager::Instance().getVariable(
"min(E, pz)");
1276 ASSERT_NE(var,
nullptr);
1277 EXPECT_FLOAT_EQ(var->function(&p), 0.8);
1279 var = Manager::Instance().getVariable(
"max(E, pz)");
1280 ASSERT_NE(var,
nullptr);
1281 EXPECT_FLOAT_EQ(var->function(&p), 2.0);
1283 var = Manager::Instance().getVariable(
"log10(px)");
1284 ASSERT_NE(var,
nullptr);
1285 EXPECT_FLOAT_EQ(var->function(&p), -1.0);
1288 TEST_F(MetaVariableTest, formula)
1295 Particle p({ 0.1 , -0.4, 0.8, 2.0 }, 11);
1297 const Manager::Var* var = Manager::Instance().getVariable(
"formula(px + py)");
1298 ASSERT_NE(var,
nullptr);
1299 EXPECT_FLOAT_EQ(var->function(&p), -0.3);
1301 var = Manager::Instance().getVariable(
"formula(px - py)");
1302 ASSERT_NE(var,
nullptr);
1303 EXPECT_FLOAT_EQ(var->function(&p), 0.5);
1305 var = Manager::Instance().getVariable(
"formula(px * py)");
1306 ASSERT_NE(var,
nullptr);
1307 EXPECT_FLOAT_EQ(var->function(&p), -0.04);
1309 var = Manager::Instance().getVariable(
"formula(py / px)");
1310 ASSERT_NE(var,
nullptr);
1311 EXPECT_FLOAT_EQ(var->function(&p), -4.0);
1313 var = Manager::Instance().getVariable(
"formula(px ^ E)");
1314 ASSERT_NE(var,
nullptr);
1315 EXPECT_FLOAT_EQ(var->function(&p), 0.01);
1317 var = Manager::Instance().getVariable(
"formula(px * py + pz)");
1318 ASSERT_NE(var,
nullptr);
1319 EXPECT_ALL_NEAR(var->function(&p), 0.76, 1e-6);
1321 var = Manager::Instance().getVariable(
"formula(pz + px * py)");
1322 ASSERT_NE(var,
nullptr);
1323 EXPECT_ALL_NEAR(var->function(&p), 0.76, 1e-6);
1325 var = Manager::Instance().getVariable(
"formula(pt)");
1326 ASSERT_NE(var,
nullptr);
1327 EXPECT_FLOAT_EQ(var->function(&p), 0.41231057);
1328 double pt = var->function(&p);
1330 var = Manager::Instance().getVariable(
"formula((px**2 + py**2)**(1/2))");
1331 ASSERT_NE(var,
nullptr);
1332 EXPECT_FLOAT_EQ(var->function(&p), pt);
1334 var = Manager::Instance().getVariable(
"formula(charge)");
1335 ASSERT_NE(var,
nullptr);
1336 EXPECT_FLOAT_EQ(var->function(&p), -1.0);
1338 var = Manager::Instance().getVariable(
"formula(charge**2)");
1339 ASSERT_NE(var,
nullptr);
1340 EXPECT_FLOAT_EQ(var->function(&p), 1.0);
1342 var = Manager::Instance().getVariable(
"formula(charge^2)");
1343 ASSERT_NE(var,
nullptr);
1344 EXPECT_FLOAT_EQ(var->function(&p), 1.0);
1346 var = Manager::Instance().getVariable(
"formula(PDG * charge)");
1347 ASSERT_NE(var,
nullptr);
1348 EXPECT_FLOAT_EQ(var->function(&p), -11.0);
1350 var = Manager::Instance().getVariable(
"formula(PDG**2 * charge)");
1351 ASSERT_NE(var,
nullptr);
1352 EXPECT_FLOAT_EQ(var->function(&p), -121.0);
1354 var = Manager::Instance().getVariable(
"formula(10.58 - (px + py + pz - E)**2)");
1355 ASSERT_NE(var,
nullptr);
1356 EXPECT_FLOAT_EQ(var->function(&p), 8.33);
1358 var = Manager::Instance().getVariable(
"formula(-10.58 + (px + py + pz - E)**2)");
1359 ASSERT_NE(var,
nullptr);
1360 EXPECT_FLOAT_EQ(var->function(&p), -8.33);
1362 var = Manager::Instance().getVariable(
"formula(-1.0 * PDG)");
1363 ASSERT_NE(var,
nullptr);
1364 EXPECT_FLOAT_EQ(var->function(&p), -11);
1367 TEST_F(MetaVariableTest, passesCut)
1369 Particle p({ 0.1 , -0.4, 0.8, 2.0 }, 11);
1370 Particle p2({ 0.1 , -0.4, 0.8, 4.0 }, 11);
1372 const Manager::Var* var = Manager::Instance().getVariable(
"passesCut(E < 3)");
1373 ASSERT_NE(var,
nullptr);
1374 EXPECT_FLOAT_EQ(var->function(&p), 1);
1375 EXPECT_FLOAT_EQ(var->function(&p2), 0);
1376 EXPECT_TRUE(std::isnan(var->function(
nullptr)));
1380 TEST_F(MetaVariableTest, unmask)
1382 DataStore::Instance().setInitializeActive(
true);
1385 particles.registerInDataStore();
1386 mcParticles.registerInDataStore();
1387 particles.registerRelationTo(mcParticles);
1388 DataStore::Instance().setInitializeActive(
false);
1401 graphParticleGrandMother.
setPDG(-521);
1402 graphParticleMother.
setPDG(13);
1403 graphParticleAunt.
setPDG(-14);
1404 graphParticleDaughter1.
setPDG(11);
1405 graphParticleDaughter2.
setPDG(14);
1407 graphParticleMother.
comesFrom(graphParticleGrandMother);
1408 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1409 graphParticleDaughter1.
comesFrom(graphParticleMother);
1410 graphParticleDaughter2.
comesFrom(graphParticleMother);
1415 auto* mcGrandMother = mcParticles[0];
1416 mcGrandMother->setStatus(MCParticle::c_PrimaryParticle);
1418 auto* mcMother = mcParticles[1];
1419 mcMother->setStatus(MCParticle::c_PrimaryParticle);
1421 auto* mcAunt = mcParticles[2];
1422 mcAunt->setStatus(MCParticle::c_PrimaryParticle);
1424 auto* mcDaughter1 = mcParticles[3];
1425 mcDaughter1->setStatus(MCParticle::c_PrimaryParticle);
1427 auto* mcDaughter2 = mcParticles[4];
1428 mcDaughter2->setStatus(MCParticle::c_PrimaryParticle);
1430 auto* pGrandMother = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), -521);
1431 pGrandMother->addRelationTo(mcGrandMother);
1433 auto* pMother = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 13);
1434 pMother->addRelationTo(mcMother);
1437 pMother->writeExtraInfo(
"mcErrors", 8);
1438 pGrandMother->writeExtraInfo(
"mcErrors", 8 | 16);
1439 const Manager::Var* var1 = Manager::Instance().getVariable(
"unmask(mcErrors, 8)");
1440 const Manager::Var* var2 = Manager::Instance().getVariable(
"unmask(mcErrors, 8, 16, 32, 64)");
1441 ASSERT_NE(var1,
nullptr);
1442 EXPECT_FLOAT_EQ(var1->function(pMother), 0);
1443 EXPECT_FLOAT_EQ(var1->function(pGrandMother), 16);
1444 ASSERT_NE(var2,
nullptr);
1445 EXPECT_FLOAT_EQ(var2->
function(pMother), 0);
1446 EXPECT_FLOAT_EQ(var2->
function(pGrandMother), 0);
1449 pMother->writeExtraInfo(
"mcErrors", 8 | 128);
1450 pGrandMother->writeExtraInfo(
"mcErrors", 8 | 16 | 512);
1451 ASSERT_NE(var1,
nullptr);
1452 EXPECT_FLOAT_EQ(var1->function(pMother), 128);
1453 EXPECT_FLOAT_EQ(var1->function(pGrandMother), 16 | 512);
1454 ASSERT_NE(var2,
nullptr);
1455 EXPECT_FLOAT_EQ(var2->
function(pMother), 128);
1456 EXPECT_FLOAT_EQ(var2->
function(pGrandMother), 512);
1459 EXPECT_B2FATAL(Manager::Instance().getVariable(
"unmask(mcErrors)"));
1462 EXPECT_B2FATAL(Manager::Instance().getVariable(
"unmask(mcErrors, NOTINT)"));
1465 TEST_F(MetaVariableTest, conditionalVariableSelector)
1467 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 11);
1469 const Manager::Var* var = Manager::Instance().getVariable(
"conditionalVariableSelector(E>1, px, py)");
1470 ASSERT_NE(var,
nullptr);
1471 EXPECT_FLOAT_EQ(var->function(&p), 0.1);
1473 var = Manager::Instance().getVariable(
"conditionalVariableSelector(E<1, px, py)");
1474 ASSERT_NE(var,
nullptr);
1475 EXPECT_FLOAT_EQ(var->function(&p), -0.4);
1479 TEST_F(MetaVariableTest, nCleanedTracks)
1481 DataStore::Instance().setInitializeActive(
true);
1484 track_fit_results.registerInDataStore();
1485 tracks.registerInDataStore();
1486 DataStore::Instance().setInitializeActive(
false);
1488 Particle p({ 0.1 , -0.4, 0.8, 2.0 }, 11);
1489 Particle p2({ 0.1 , -0.4, 0.8, 4.0 }, 11);
1491 track_fit_results.
appendNew(TVector3(0.1, 0.1, 0.1), TVector3(0.1, 0.0, 0.0),
1492 TMatrixDSym(6), 1, Const::pion, 0.01, 1.5, 0, 0, 0);
1493 track_fit_results.
appendNew(TVector3(0.1, 0.1, 0.1), TVector3(0.15, 0.0, 0.0),
1494 TMatrixDSym(6), 1, Const::pion, 0.01, 1.5, 0, 0, 0);
1495 track_fit_results.
appendNew(TVector3(0.1, 0.1, 0.1), TVector3(0.4, 0.0, 0.0),
1496 TMatrixDSym(6), 1, Const::pion, 0.01, 1.5, 0, 0, 0);
1497 track_fit_results.
appendNew(TVector3(0.1, 0.1, 0.1), TVector3(0.6, 0.0, 0.0),
1498 TMatrixDSym(6), 1, Const::pion, 0.01, 1.5, 0, 0, 0);
1500 tracks.appendNew()->setTrackFitResultIndex(Const::pion, 0);
1501 tracks.appendNew()->setTrackFitResultIndex(Const::pion, 1);
1502 tracks.appendNew()->setTrackFitResultIndex(Const::pion, 2);
1503 tracks.appendNew()->setTrackFitResultIndex(Const::pion, 3);
1505 const Manager::Var* var1 = Manager::Instance().getVariable(
"nCleanedTracks(p > 0.5)");
1506 EXPECT_FLOAT_EQ(var1->function(
nullptr), 1);
1508 const Manager::Var* var2 = Manager::Instance().getVariable(
"nCleanedTracks(p > 0.2)");
1509 EXPECT_FLOAT_EQ(var2->
function(
nullptr), 2);
1511 const Manager::Var* var3 = Manager::Instance().getVariable(
"nCleanedTracks()");
1512 EXPECT_FLOAT_EQ(var3->
function(
nullptr), 4);
1517 TEST_F(MetaVariableTest, NumberOfMCParticlesInEvent)
1519 Particle p({ 0.1 , -0.4, 0.8, 2.0 }, 11);
1520 Particle p2({ 0.1 , -0.4, 0.8, 4.0 }, 11);
1523 auto* mcParticle = mcParticles.
appendNew();
1525 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
1526 mcParticle = mcParticles.appendNew();
1527 mcParticle->setPDG(22);
1528 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
1529 mcParticle = mcParticles.appendNew();
1530 mcParticle->setPDG(-11);
1531 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
1532 mcParticle = mcParticles.appendNew();
1533 mcParticle->setPDG(11);
1536 const Manager::Var* var = Manager::Instance().getVariable(
"NumberOfMCParticlesInEvent(11)");
1537 ASSERT_NE(var,
nullptr);
1538 EXPECT_FLOAT_EQ(var->function(
nullptr), 2);
1542 TEST_F(MetaVariableTest, daughterInvM)
1544 TLorentzVector momentum;
1545 const int nDaughters = 6;
1547 std::vector<int> daughterIndices;
1548 for (
int i = 0; i < nDaughters; i++) {
1549 Particle d(TLorentzVector(2, 2, 2, 4.0), (i % 2) ? 211 : -211);
1550 momentum += d.get4Vector();
1551 Particle* newDaughters = particles.appendNew(d);
1554 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
1556 const Manager::Var* var = Manager::Instance().getVariable(
"daughterInvM(6,5)");
1557 ASSERT_NE(var,
nullptr);
1558 EXPECT_TRUE(std::isnan(var->function(p)));
1560 var = Manager::Instance().getVariable(
"daughterInvM(0, 1)");
1561 ASSERT_NE(var,
nullptr);
1562 EXPECT_FLOAT_EQ(var->function(p), 4.0);
1564 var = Manager::Instance().getVariable(
"daughterInvM(0, 1, 2)");
1565 ASSERT_NE(var,
nullptr);
1566 EXPECT_FLOAT_EQ(var->function(p), 6.0);
1569 TEST_F(MetaVariableTest, daughter)
1571 TLorentzVector momentum;
1572 const int nDaughters = 6;
1574 std::vector<int> daughterIndices;
1575 for (
int i = 0; i < nDaughters; i++) {
1576 Particle d(TLorentzVector(i * 1.0, 1, 1, 1), (i % 2) ? 211 : -211);
1577 momentum += d.get4Vector();
1578 Particle* newDaughters = particles.appendNew(d);
1581 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
1583 const Manager::Var* var = Manager::Instance().getVariable(
"daughter(6, px)");
1584 ASSERT_NE(var,
nullptr);
1585 EXPECT_TRUE(std::isnan(var->function(p)));
1587 var = Manager::Instance().getVariable(
"daughter(0, px)");
1588 ASSERT_NE(var,
nullptr);
1589 EXPECT_ALL_NEAR(var->function(p), 0.0, 1e-6);
1591 var = Manager::Instance().getVariable(
"daughter(1, px)");
1592 ASSERT_NE(var,
nullptr);
1593 EXPECT_FLOAT_EQ(var->function(p), 1.0);
1595 var = Manager::Instance().getVariable(
"daughter(2, px)");
1596 ASSERT_NE(var,
nullptr);
1597 EXPECT_FLOAT_EQ(var->function(p), 2.0);
1600 TEST_F(MetaVariableTest, mcDaughter)
1602 DataStore::Instance().setInitializeActive(
true);
1605 particles.registerInDataStore();
1606 mcParticles.registerInDataStore();
1607 particles.registerRelationTo(mcParticles);
1608 DataStore::Instance().setInitializeActive(
false);
1621 graphParticleGrandMother.
setPDG(-521);
1622 graphParticleMother.
setPDG(13);
1623 graphParticleAunt.
setPDG(-14);
1624 graphParticleDaughter1.
setPDG(11);
1625 graphParticleDaughter2.
setPDG(14);
1627 graphParticleMother.
comesFrom(graphParticleGrandMother);
1628 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1629 graphParticleDaughter1.
comesFrom(graphParticleMother);
1630 graphParticleDaughter2.
comesFrom(graphParticleMother);
1634 auto* mcGrandMother = mcParticles[0];
1635 mcGrandMother->setStatus(MCParticle::c_PrimaryParticle);
1637 auto* mcMother = mcParticles[1];
1638 mcMother->setStatus(MCParticle::c_PrimaryParticle);
1640 auto* mcAunt = mcParticles[2];
1641 mcAunt->setStatus(MCParticle::c_PrimaryParticle);
1643 auto* mcDaughter1 = mcParticles[3];
1644 mcDaughter1->setStatus(MCParticle::c_PrimaryParticle);
1646 auto* mcDaughter2 = mcParticles[4];
1647 mcDaughter2->setStatus(MCParticle::c_PrimaryParticle);
1649 auto* pGrandMother = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), -521);
1650 pGrandMother->addRelationTo(mcGrandMother);
1652 auto* pMother = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 13);
1653 pMother->addRelationTo(mcMother);
1656 auto* p_noMC = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 13);
1659 auto* p_noDaughter = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
1660 p_noDaughter->addRelationTo(mcDaughter1);
1662 const Manager::Var* var = Manager::Instance().getVariable(
"mcDaughter(0, PDG)");
1663 ASSERT_NE(var,
nullptr);
1664 EXPECT_FLOAT_EQ(var->function(pGrandMother), 13);
1665 EXPECT_FLOAT_EQ(var->function(pMother), 11);
1666 EXPECT_TRUE(std::isnan(var->function(p_noMC)));
1667 EXPECT_TRUE(std::isnan(var->function(p_noDaughter)));
1668 var = Manager::Instance().getVariable(
"mcDaughter(1, PDG)");
1669 EXPECT_FLOAT_EQ(var->function(pGrandMother), -14);
1670 EXPECT_FLOAT_EQ(var->function(pMother), 14);
1672 var = Manager::Instance().getVariable(
"mcDaughter(2, PDG)");
1673 EXPECT_TRUE(std::isnan(var->function(pGrandMother)));
1674 EXPECT_TRUE(std::isnan(var->function(pMother)));
1676 var = Manager::Instance().getVariable(
"mcDaughter(0, mcDaughter(0, PDG))");
1677 EXPECT_FLOAT_EQ(var->function(pGrandMother), 11);
1678 EXPECT_TRUE(std::isnan(var->function(pMother)));
1679 var = Manager::Instance().getVariable(
"mcDaughter(0, mcDaughter(1, PDG))");
1680 EXPECT_FLOAT_EQ(var->function(pGrandMother), 14);
1681 var = Manager::Instance().getVariable(
"mcDaughter(0, mcDaughter(2, PDG))");
1682 EXPECT_TRUE(std::isnan(var->function(pGrandMother)));
1683 var = Manager::Instance().getVariable(
"mcDaughter(1, mcDaughter(0, PDG))");
1684 EXPECT_TRUE(std::isnan(var->function(pGrandMother)));
1687 TEST_F(MetaVariableTest, mcMother)
1689 DataStore::Instance().setInitializeActive(
true);
1692 particles.registerInDataStore();
1693 mcParticles.registerInDataStore();
1694 particles.registerRelationTo(mcParticles);
1695 DataStore::Instance().setInitializeActive(
false);
1708 graphParticleGrandMother.
setPDG(-521);
1709 graphParticleMother.
setPDG(13);
1710 graphParticleAunt.
setPDG(-14);
1711 graphParticleDaughter1.
setPDG(11);
1712 graphParticleDaughter2.
setPDG(14);
1714 graphParticleMother.
comesFrom(graphParticleGrandMother);
1715 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1716 graphParticleDaughter1.
comesFrom(graphParticleMother);
1717 graphParticleDaughter2.
comesFrom(graphParticleMother);
1722 auto* mcGrandMother = mcParticles[0];
1723 mcGrandMother->setStatus(MCParticle::c_PrimaryParticle);
1725 auto* mcMother = mcParticles[1];
1726 mcMother->setStatus(MCParticle::c_PrimaryParticle);
1728 auto* mcAunt = mcParticles[2];
1729 mcAunt->setStatus(MCParticle::c_PrimaryParticle);
1731 auto* mcDaughter1 = mcParticles[3];
1732 mcDaughter1->setStatus(MCParticle::c_PrimaryParticle);
1734 auto* mcDaughter2 = mcParticles[4];
1735 mcDaughter2->setStatus(MCParticle::c_PrimaryParticle);
1737 auto* p1 = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
1738 p1->addRelationTo(mcDaughter1);
1740 auto* p2 = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 14);
1741 p2->addRelationTo(mcDaughter2);
1743 auto* pMother = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 13);
1744 pMother->addRelationTo(mcMother);
1747 auto* p_noMC = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
1750 auto* p_noMother = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), -521);
1751 p_noMother->addRelationTo(mcGrandMother);
1753 const Manager::Var* var = Manager::Instance().getVariable(
"mcMother(PDG)");
1754 ASSERT_NE(var,
nullptr);
1755 EXPECT_FLOAT_EQ(var->function(p1), 13);
1756 EXPECT_FLOAT_EQ(var->function(p2), 13);
1757 EXPECT_FLOAT_EQ(var->function(pMother), -521);
1758 EXPECT_TRUE(std::isnan(var->function(p_noMC)));
1759 EXPECT_TRUE(std::isnan(var->function(p_noMother)));
1762 var = Manager::Instance().getVariable(
"mcMother(mcMother(PDG))");
1763 EXPECT_FLOAT_EQ(var->function(p1), -521);
1766 TEST_F(MetaVariableTest, genParticle)
1768 DataStore::Instance().setInitializeActive(
true);
1771 particles.registerInDataStore();
1772 mcParticles.registerInDataStore();
1773 particles.registerRelationTo(mcParticles);
1774 DataStore::Instance().setInitializeActive(
false);
1787 graphParticleGrandMother.
setPDG(300553);
1788 graphParticleMother.
setPDG(-521);
1789 graphParticleAunt.
setPDG(521);
1790 graphParticleDaughter1.
setPDG(11);
1791 graphParticleDaughter2.
setPDG(-12);
1793 graphParticleGrandMother.
setMomentum(0.0, 0.0, 0.4);
1796 graphParticleMother.
comesFrom(graphParticleGrandMother);
1797 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1798 graphParticleDaughter1.
comesFrom(graphParticleMother);
1799 graphParticleDaughter2.
comesFrom(graphParticleMother);
1804 auto* mcGrandMother = mcParticles[0];
1805 mcGrandMother->setStatus(MCParticle::c_PrimaryParticle);
1807 auto* mcMother = mcParticles[1];
1808 mcMother->setStatus(MCParticle::c_PrimaryParticle);
1810 auto* mcAunt = mcParticles[2];
1811 mcAunt->setStatus(MCParticle::c_PrimaryParticle);
1813 auto* mcDaughter1 = mcParticles[3];
1814 mcDaughter1->setStatus(MCParticle::c_PrimaryParticle);
1816 auto* mcDaughter2 = mcParticles[4];
1817 mcDaughter2->setStatus(MCParticle::c_PrimaryParticle);
1819 auto* p1 = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
1820 p1->addRelationTo(mcDaughter1);
1823 auto* p_noMC = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 211);
1825 const Manager::Var* var = Manager::Instance().getVariable(
"genParticle(0, PDG)");
1826 ASSERT_NE(var,
nullptr);
1827 EXPECT_FLOAT_EQ(var->function(p1), 300553);
1828 EXPECT_FLOAT_EQ(var->function(p_noMC), 300553);
1830 var = Manager::Instance().getVariable(
"genParticle(0, matchedMC(pz))");
1831 ASSERT_NE(var,
nullptr);
1832 EXPECT_FLOAT_EQ(var->function(p1), 0.4);
1833 EXPECT_FLOAT_EQ(var->function(p_noMC), 0.4);
1835 var = Manager::Instance().getVariable(
"genParticle(0, mcDaughter(0, PDG))");
1836 ASSERT_NE(var,
nullptr);
1837 EXPECT_FLOAT_EQ(var->function(p1), -521);
1838 EXPECT_FLOAT_EQ(var->function(p_noMC), -521);
1840 var = Manager::Instance().getVariable(
"genParticle(0, mcDaughter(0, matchedMC(px)))");
1841 ASSERT_NE(var,
nullptr);
1842 EXPECT_FLOAT_EQ(var->function(p1), 1.1);
1843 EXPECT_FLOAT_EQ(var->function(p_noMC), 1.1);
1845 var = Manager::Instance().getVariable(
"genParticle(1, PDG)");
1846 ASSERT_NE(var,
nullptr);
1847 EXPECT_FLOAT_EQ(var->function(p1), -521);
1848 EXPECT_FLOAT_EQ(var->function(p_noMC), -521);
1850 var = Manager::Instance().getVariable(
"genParticle(4, PDG)");
1851 ASSERT_NE(var,
nullptr);
1852 EXPECT_FLOAT_EQ(var->function(p1), -12);
1853 EXPECT_FLOAT_EQ(var->function(p_noMC), -12);
1855 var = Manager::Instance().getVariable(
"genParticle(5, PDG)");
1856 ASSERT_NE(var,
nullptr);
1857 EXPECT_TRUE(std::isnan(var->function(p1)));
1858 EXPECT_TRUE(std::isnan(var->function(p_noMC)));
1861 TEST_F(MetaVariableTest, genUpsilon4S)
1863 DataStore::Instance().setInitializeActive(
true);
1866 particles.registerInDataStore();
1867 mcParticles.registerInDataStore();
1868 particles.registerRelationTo(mcParticles);
1869 DataStore::Instance().setInitializeActive(
false);
1882 graphParticleGrandMother.
setPDG(300553);
1883 graphParticleMother.
setPDG(-521);
1884 graphParticleAunt.
setPDG(521);
1885 graphParticleDaughter1.
setPDG(11);
1886 graphParticleDaughter2.
setPDG(-12);
1888 graphParticleGrandMother.
setMomentum(0.0, 0.0, 0.4);
1891 graphParticleMother.
comesFrom(graphParticleGrandMother);
1892 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1893 graphParticleDaughter1.
comesFrom(graphParticleMother);
1894 graphParticleDaughter2.
comesFrom(graphParticleMother);
1899 auto* mcGrandMother = mcParticles[0];
1900 mcGrandMother->setStatus(MCParticle::c_PrimaryParticle);
1902 auto* mcMother = mcParticles[1];
1903 mcMother->setStatus(MCParticle::c_PrimaryParticle);
1905 auto* mcAunt = mcParticles[2];
1906 mcAunt->setStatus(MCParticle::c_PrimaryParticle);
1908 auto* mcDaughter1 = mcParticles[3];
1909 mcDaughter1->setStatus(MCParticle::c_PrimaryParticle);
1911 auto* mcDaughter2 = mcParticles[4];
1912 mcDaughter2->setStatus(MCParticle::c_PrimaryParticle);
1914 auto* p1 = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
1915 p1->addRelationTo(mcDaughter1);
1918 auto* p_noMC = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 211);
1920 const Manager::Var* var = Manager::Instance().getVariable(
"genUpsilon4S(PDG)");
1921 ASSERT_NE(var,
nullptr);
1922 EXPECT_FLOAT_EQ(var->function(p1), 300553);
1923 EXPECT_FLOAT_EQ(var->function(p_noMC), 300553);
1925 var = Manager::Instance().getVariable(
"genUpsilon4S(matchedMC(pz))");
1926 ASSERT_NE(var,
nullptr);
1927 EXPECT_FLOAT_EQ(var->function(p1), 0.4);
1928 EXPECT_FLOAT_EQ(var->function(p_noMC), 0.4);
1930 var = Manager::Instance().getVariable(
"genUpsilon4S(mcDaughter(0, PDG))");
1931 ASSERT_NE(var,
nullptr);
1932 EXPECT_FLOAT_EQ(var->function(p1), -521);
1933 EXPECT_FLOAT_EQ(var->function(p_noMC), -521);
1935 var = Manager::Instance().getVariable(
"genUpsilon4S(mcDaughter(0, matchedMC(px)))");
1936 ASSERT_NE(var,
nullptr);
1937 EXPECT_FLOAT_EQ(var->function(p1), 1.1);
1938 EXPECT_FLOAT_EQ(var->function(p_noMC), 1.1);
1941 mcParticles.
clear();
1948 graphParticle1.
setPDG(11);
1949 graphParticle2.
setPDG(-11);
1956 auto* mcP1 = mcParticles[0];
1957 mcP1->setStatus(MCParticle::c_PrimaryParticle);
1959 auto* mcP2 = mcParticles[1];
1960 mcP2->setStatus(MCParticle::c_PrimaryParticle);
1962 auto* someParticle = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
1963 someParticle->addRelationTo(mcP1);
1965 var = Manager::Instance().getVariable(
"genUpsilon4S(PDG)");
1966 ASSERT_NE(var,
nullptr);
1967 EXPECT_TRUE(std::isnan(var->function(someParticle)));
1970 TEST_F(MetaVariableTest, daughterProductOf)
1972 TLorentzVector momentum;
1973 const int nDaughters = 4;
1975 std::vector<int> daughterIndices;
1976 for (
int i = 0; i < nDaughters; i++) {
1977 Particle d(TLorentzVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? 211 : -211);
1978 momentum += d.get4Vector();
1979 Particle* newDaughters = particles.appendNew(d);
1982 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
1984 const Manager::Var* var = Manager::Instance().getVariable(
"daughterProductOf(E)");
1985 ASSERT_NE(var,
nullptr);
1986 EXPECT_FLOAT_EQ(var->function(p), 24.0);
1989 TEST_F(MetaVariableTest, daughterSumOf)
1991 TLorentzVector momentum;
1992 const int nDaughters = 4;
1994 std::vector<int> daughterIndices;
1995 for (
int i = 0; i < nDaughters; i++) {
1996 Particle d(TLorentzVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? 211 : -211);
1997 momentum += d.get4Vector();
1998 Particle* newDaughters = particles.appendNew(d);
2001 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
2003 const Manager::Var* var = Manager::Instance().getVariable(
"daughterSumOf(E)");
2004 ASSERT_NE(var,
nullptr);
2005 EXPECT_FLOAT_EQ(var->function(p), 10.0);
2009 TEST_F(MetaVariableTest, daughterLowest)
2011 TLorentzVector momentum;
2012 const int nDaughters = 4;
2014 std::vector<int> daughterIndices;
2015 for (
int i = 0; i < nDaughters; i++) {
2016 Particle d(TLorentzVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? 211 : -211);
2017 momentum += d.get4Vector();
2018 Particle* newDaughters = particles.appendNew(d);
2021 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
2023 const Manager::Var* var = Manager::Instance().getVariable(
"daughterLowest(E)");
2024 ASSERT_NE(var,
nullptr);
2025 EXPECT_FLOAT_EQ(var->function(p), 1.0);
2028 TEST_F(MetaVariableTest, daughterHighest)
2030 TLorentzVector momentum;
2031 const int nDaughters = 4;
2033 std::vector<int> daughterIndices;
2034 for (
int i = 0; i < nDaughters; i++) {
2035 Particle d(TLorentzVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? 211 : -211);
2036 momentum += d.get4Vector();
2037 Particle* newDaughters = particles.appendNew(d);
2040 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
2042 const Manager::Var* var = Manager::Instance().getVariable(
"daughterHighest(E)");
2043 ASSERT_NE(var,
nullptr);
2044 EXPECT_FLOAT_EQ(var->function(p), 4.0);
2047 TEST_F(MetaVariableTest, daughterDiffOf)
2049 TLorentzVector momentum;
2050 const int nDaughters = 4;
2052 std::vector<int> daughterIndices;
2053 for (
int i = 0; i < nDaughters; i++) {
2054 Particle d(TLorentzVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? -11 : 211);
2055 momentum += d.get4Vector();
2056 Particle* newDaughters = particles.appendNew(d);
2059 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
2061 const Manager::Var* var = Manager::Instance().getVariable(
"daughterDiffOf(0, 1, PDG)");
2062 ASSERT_NE(var,
nullptr);
2063 EXPECT_FLOAT_EQ(var->function(p), -222);
2065 var = Manager::Instance().getVariable(
"daughterDiffOf(1, 0, PDG)");
2066 ASSERT_NE(var,
nullptr);
2067 EXPECT_FLOAT_EQ(var->function(p), 222);
2069 var = Manager::Instance().getVariable(
"daughterDiffOf(0, 1, abs(PDG))");
2070 ASSERT_NE(var,
nullptr);
2071 EXPECT_FLOAT_EQ(var->function(p), -200);
2073 var = Manager::Instance().getVariable(
"daughterDiffOf(1, 1, PDG)");
2074 ASSERT_NE(var,
nullptr);
2075 EXPECT_FLOAT_EQ(var->function(p), 0);
2077 var = Manager::Instance().getVariable(
"daughterDiffOf(1, 3, abs(PDG))");
2078 ASSERT_NE(var,
nullptr);
2079 EXPECT_FLOAT_EQ(var->function(p), 0);
2081 var = Manager::Instance().getVariable(
"daughterDiffOf(0, 2, PDG)");
2082 ASSERT_NE(var,
nullptr);
2083 EXPECT_FLOAT_EQ(var->function(p), 0);
2085 EXPECT_B2FATAL(Manager::Instance().getVariable(
"daughterDiffOf(0, NOTINT, PDG)"));
2088 TEST_F(MetaVariableTest, daughterClusterAngleInBetween)
2092 std::vector<int> daughterIndices, daughterIndices_noclst;
2095 DataStore::Instance().setInitializeActive(
true);
2097 eclclusters.registerInDataStore();
2098 particles.registerRelationTo(eclclusters);
2099 DataStore::Instance().setInitializeActive(
false);
2102 const float px_CM = 2.;
2103 const float py_CM = 1.;
2104 const float pz_CM = 3.;
2106 E_CM = sqrt(pow(px_CM, 2) + pow(py_CM, 2) + pow(pz_CM, 2));
2107 TLorentzVector momentum, momentum_noclst;
2108 TLorentzVector dau0_4vec_CM(px_CM, py_CM, pz_CM, E_CM), dau1_4vec_CM(-px_CM, -py_CM, -pz_CM, E_CM);
2109 TLorentzVector dau0_4vec_Lab, dau1_4vec_Lab;
2110 dau0_4vec_Lab = PCmsLabTransform::cmsToLab(
2112 dau1_4vec_Lab = PCmsLabTransform::cmsToLab(dau1_4vec_CM);
2115 Particle dau0_noclst(dau0_4vec_Lab, 22);
2116 momentum += dau0_noclst.get4Vector();
2117 Particle* newDaughter0_noclst = particles.appendNew(dau0_noclst);
2118 daughterIndices_noclst.push_back(newDaughter0_noclst->
getArrayIndex());
2119 Particle dau1_noclst(dau1_4vec_Lab, 22);
2120 momentum += dau1_noclst.get4Vector();
2121 Particle* newDaughter1_noclst = particles.appendNew(dau1_noclst);
2122 daughterIndices_noclst.push_back(newDaughter1_noclst->
getArrayIndex());
2123 const Particle* par_noclst = particles.appendNew(momentum, 111, Particle::c_Unflavored, daughterIndices_noclst);
2126 const Manager::Var* var = Manager::Instance().getVariable(
"daughterClusterAngleInBetween(0, 1)");
2127 const Manager::Var* varCMS = Manager::Instance().getVariable(
"useCMSFrame(daughterClusterAngleInBetween(0, 1))");
2130 ASSERT_NE(var,
nullptr);
2131 EXPECT_TRUE(std::isnan(var->function(par_noclst)));
2136 eclst0->
setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
2138 eclst0->
setTheta(dau0_4vec_Lab.Theta());
2139 eclst0->
setPhi(dau0_4vec_Lab.Phi());
2140 eclst0->
setR(148.4);
2143 eclst1->
setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
2145 eclst1->
setTheta(dau1_4vec_Lab.Theta());
2146 eclst1->
setPhi(dau1_4vec_Lab.Phi());
2147 eclst1->
setR(148.5);
2149 const Particle* newDaughter0 = particles.appendNew(
Particle(eclclusters[0]));
2151 const Particle* newDaughter1 = particles.appendNew(
Particle(eclclusters[1]));
2154 const Particle* par = particles.appendNew(momentum, 111, Particle::c_Unflavored, daughterIndices);
2157 EXPECT_FLOAT_EQ(var->function(par), 2.8638029);
2158 EXPECT_FLOAT_EQ(varCMS->
function(par), M_PI);
2161 TEST_F(MetaVariableTest, grandDaughterDiffOfs)
2165 std::vector<int> daughterIndices0_noclst, daughterIndices1_noclst, daughterIndices2_noclst;
2166 std::vector<int> daughterIndices0, daughterIndices1, daughterIndices2;
2169 DataStore::Instance().setInitializeActive(
true);
2171 eclclusters.registerInDataStore();
2172 particles.registerRelationTo(eclclusters);
2173 DataStore::Instance().setInitializeActive(
false);
2176 const float px_0 = 2.;
2177 const float py_0 = 1.;
2178 const float pz_0 = 3.;
2179 const float px_1 = 1.5;
2180 const float py_1 = 1.5;
2181 const float pz_1 = 2.5;
2183 E_0 = sqrt(pow(px_0, 2) + pow(py_0, 2) + pow(pz_0, 2));
2184 E_1 = sqrt(pow(px_1, 2) + pow(py_1, 2) + pow(pz_1, 2));
2185 TLorentzVector momentum_0, momentum_1, momentum;
2186 TLorentzVector dau0_4vec(px_0, py_0, pz_0, E_0), dau1_4vec(px_1, py_1, pz_1, E_1);
2199 Particle dau0_noclst(dau0_4vec, 22);
2200 momentum_0 = dau0_4vec;
2201 Particle* newDaughter0_noclst = particles.appendNew(dau0_noclst);
2202 daughterIndices0_noclst.push_back(newDaughter0_noclst->
getArrayIndex());
2203 const Particle* par0_noclst = particles.appendNew(momentum_0, 111, Particle::c_Unflavored, daughterIndices0_noclst);
2204 Particle dau1_noclst(dau1_4vec, 22);
2205 momentum_1 = dau1_4vec;
2206 Particle* newDaughter1_noclst = particles.appendNew(dau1_noclst);
2207 daughterIndices1_noclst.push_back(newDaughter1_noclst->
getArrayIndex());
2208 const Particle* par1_noclst = particles.appendNew(momentum_1, 111, Particle::c_Unflavored, daughterIndices1_noclst);
2210 momentum = momentum_0 + momentum_1;
2211 daughterIndices2_noclst.push_back(par0_noclst->
getArrayIndex());
2212 daughterIndices2_noclst.push_back(par1_noclst->
getArrayIndex());
2213 const Particle* parGranny_noclst = particles.appendNew(momentum, 111, Particle::c_Unflavored, daughterIndices2_noclst);
2216 const Manager::Var* var_Theta = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,0,0,theta)");
2217 const Manager::Var* var_ClusterTheta = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,0,0,clusterTheta)");
2218 const Manager::Var* var_E = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,0,0,E)");
2219 const Manager::Var* var_ClusterE = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,0,0,clusterE)");
2220 const Manager::Var* var_E_wrongIndexes = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,2,3,E)");
2221 const Manager::Var* var_ClusterE_wrongIndexes = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,2,3,clusterE)");
2223 const Manager::Var* var_ClusterPhi = Manager::Instance().getVariable(
"grandDaughterDiffOfClusterPhi(0,1,0,0)");
2224 const Manager::Var* var_Phi = Manager::Instance().getVariable(
"grandDaughterDiffOfPhi(0,1,0,0)");
2225 const Manager::Var* var_ClusterPhi_wrongIndexes = Manager::Instance().getVariable(
"grandDaughterDiffOfClusterPhi(0,1,2,3)");
2226 const Manager::Var* var_Phi_wrongIndexes = Manager::Instance().getVariable(
"grandDaughterDiffOfPhi(0,1,2,3)");
2231 ASSERT_NE(var_ClusterPhi,
nullptr);
2232 EXPECT_TRUE(std::isnan(var_ClusterPhi->
function(parGranny_noclst)));
2233 EXPECT_TRUE(std::isnan(var_ClusterTheta->
function(parGranny_noclst)));
2234 EXPECT_TRUE(std::isnan(var_ClusterE->
function(parGranny_noclst)));
2235 EXPECT_FLOAT_EQ(var_Phi->
function(parGranny_noclst), 0.32175055);
2236 EXPECT_FLOAT_EQ(var_Theta->
function(parGranny_noclst), 0.06311664);
2237 EXPECT_FLOAT_EQ(var_E->
function(parGranny_noclst), -0.46293831);
2238 EXPECT_TRUE(std::isnan(var_ClusterPhi_wrongIndexes->
function(parGranny_noclst)));
2239 EXPECT_TRUE(std::isnan(var_Phi_wrongIndexes->
function(parGranny_noclst)));
2240 EXPECT_TRUE(std::isnan(var_ClusterE_wrongIndexes->
function(parGranny_noclst)));
2241 EXPECT_TRUE(std::isnan(var_E_wrongIndexes->
function(parGranny_noclst)));
2246 eclst0->
setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
2248 eclst0->
setTheta(dau0_4vec.Theta());
2249 eclst0->
setPhi(dau0_4vec.Phi());
2250 eclst0->
setR(148.4);
2253 eclst1->
setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
2255 eclst1->
setTheta(dau1_4vec.Theta());
2256 eclst1->
setPhi(dau1_4vec.Phi());
2257 eclst1->
setR(148.5);
2259 const Particle* newDaughter0 = particles.appendNew(
Particle(eclclusters[0]));
2261 const Particle* par0 = particles.appendNew(momentum_0, 111, Particle::c_Unflavored, daughterIndices0);
2263 const Particle* newDaughter1 = particles.appendNew(
Particle(eclclusters[1]));
2265 const Particle* par1 = particles.appendNew(momentum_1, 111, Particle::c_Unflavored, daughterIndices1);
2269 const Particle* parGranny = particles.appendNew(momentum, 111, Particle::c_Unflavored, daughterIndices2);
2273 EXPECT_FLOAT_EQ(var_ClusterPhi->
function(parGranny), 0.32175055);
2274 EXPECT_FLOAT_EQ(var_Phi->
function(parGranny), 0.32175055);
2275 EXPECT_FLOAT_EQ(var_ClusterTheta->
function(parGranny), 0.06311664);
2276 EXPECT_FLOAT_EQ(var_Theta->
function(parGranny), 0.06311664);
2277 EXPECT_FLOAT_EQ(var_ClusterE->
function(parGranny), -0.46293831);
2278 EXPECT_FLOAT_EQ(var_E->
function(parGranny), -0.46293813);
2281 TEST_F(MetaVariableTest, daughterNormDiffOf)
2283 TLorentzVector momentum;
2284 const int nDaughters = 4;
2286 std::vector<int> daughterIndices;
2287 for (
int i = 0; i < nDaughters; i++) {
2288 Particle d(TLorentzVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? -11 : 211);
2289 momentum += d.get4Vector();
2290 Particle* newDaughters = particles.appendNew(d);
2293 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
2295 const Manager::Var* var = Manager::Instance().getVariable(
"daughterNormDiffOf(0, 1, PDG)");
2296 ASSERT_NE(var,
nullptr);
2297 EXPECT_FLOAT_EQ(var->function(p), -222 / 200.);
2299 var = Manager::Instance().getVariable(
"daughterNormDiffOf(1, 0, PDG)");
2300 ASSERT_NE(var,
nullptr);
2301 EXPECT_FLOAT_EQ(var->function(p), 222 / 200.);
2303 var = Manager::Instance().getVariable(
"daughterNormDiffOf(0, 1, abs(PDG))");
2304 ASSERT_NE(var,
nullptr);
2305 EXPECT_FLOAT_EQ(var->function(p), -200 / 222.);
2307 var = Manager::Instance().getVariable(
"daughterNormDiffOf(1, 1, PDG)");
2308 ASSERT_NE(var,
nullptr);
2309 EXPECT_FLOAT_EQ(var->function(p), -0 / 22.);
2311 var = Manager::Instance().getVariable(
"daughterNormDiffOf(1, 3, abs(PDG))");
2312 ASSERT_NE(var,
nullptr);
2313 EXPECT_FLOAT_EQ(var->function(p), 0 / 22.);
2315 var = Manager::Instance().getVariable(
"daughterNormDiffOf(0, 2, PDG)");
2316 ASSERT_NE(var,
nullptr);
2317 EXPECT_FLOAT_EQ(var->function(p), 0 / 422.);
2321 TEST_F(MetaVariableTest, daughterMotherDiffOf)
2323 TLorentzVector momentum;
2324 const int nDaughters = 4;
2326 std::vector<int> daughterIndices;
2327 for (
int i = 0; i < nDaughters; i++) {
2328 Particle d(TLorentzVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? -11 : 211);
2329 momentum += d.get4Vector();
2330 Particle* newDaughters = particles.appendNew(d);
2333 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
2335 const Manager::Var* var = Manager::Instance().getVariable(
"daughterMotherDiffOf(1, PDG)");
2336 ASSERT_NE(var,
nullptr);
2337 EXPECT_FLOAT_EQ(var->function(p), 422);
2339 var = Manager::Instance().getVariable(
"daughterMotherDiffOf(1, abs(PDG))");
2340 ASSERT_NE(var,
nullptr);
2341 EXPECT_FLOAT_EQ(var->function(p), 400);
2343 var = Manager::Instance().getVariable(
"daughterMotherDiffOf(0, PDG)");
2344 ASSERT_NE(var,
nullptr);
2345 EXPECT_FLOAT_EQ(var->function(p), 200);
2349 TEST_F(MetaVariableTest, daughterMotherNormDiffOf)
2351 TLorentzVector momentum;
2352 const int nDaughters = 4;
2354 std::vector<int> daughterIndices;
2355 for (
int i = 0; i < nDaughters; i++) {
2356 Particle d(TLorentzVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? -11 : 211);
2357 momentum += d.get4Vector();
2358 Particle* newDaughters = particles.appendNew(d);
2361 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
2363 const Manager::Var* var = Manager::Instance().getVariable(
"daughterMotherNormDiffOf(1, PDG)");
2364 ASSERT_NE(var,
nullptr);
2365 EXPECT_FLOAT_EQ(var->function(p), 422 / 400.);
2367 var = Manager::Instance().getVariable(
"daughterMotherNormDiffOf(1, abs(PDG))");
2368 ASSERT_NE(var,
nullptr);
2369 EXPECT_FLOAT_EQ(var->function(p), 400 / 422.);
2371 var = Manager::Instance().getVariable(
"daughterMotherNormDiffOf(0, PDG)");
2372 ASSERT_NE(var,
nullptr);
2373 EXPECT_FLOAT_EQ(var->function(p), 200 / 622.);
2377 TEST_F(MetaVariableTest, constant)
2380 const Manager::Var* var = Manager::Instance().getVariable(
"constant(1)");
2381 ASSERT_NE(var,
nullptr);
2382 EXPECT_FLOAT_EQ(var->function(
nullptr), 1.0);
2384 var = Manager::Instance().getVariable(
"constant(0)");
2385 ASSERT_NE(var,
nullptr);
2386 EXPECT_FLOAT_EQ(var->function(
nullptr), 0.0);
2390 TEST_F(MetaVariableTest, abs)
2392 Particle p({ 0.1 , -0.4, 0.8, 2.0 }, 11);
2393 Particle p2({ -0.1 , -0.4, 0.8, 4.0 }, -11);
2395 const Manager::Var* var = Manager::Instance().getVariable(
"abs(px)");
2396 ASSERT_NE(var,
nullptr);
2397 EXPECT_FLOAT_EQ(var->function(&p), 0.1);
2398 EXPECT_FLOAT_EQ(var->function(&p2), 0.1);
2402 TEST_F(MetaVariableTest, sin)
2404 Particle p({ 3.14159265359 / 2.0 , -0.4, 0.8, 1.0}, 11);
2405 Particle p2({ 0.0 , -0.4, 0.8, 1.0 }, -11);
2407 const Manager::Var* var = Manager::Instance().getVariable(
"sin(px)");
2408 ASSERT_NE(var,
nullptr);
2409 EXPECT_FLOAT_EQ(var->function(&p), 1.0);
2410 EXPECT_ALL_NEAR(var->function(&p2), 0.0, 1e-6);
2414 TEST_F(MetaVariableTest, cos)
2416 Particle p({ 3.14159265359 / 2.0 , -0.4, 0.8, 1.0}, 11);
2417 Particle p2({ 0.0 , -0.4, 0.8, 1.0 }, -11);
2419 const Manager::Var* var = Manager::Instance().getVariable(
"cos(px)");
2420 ASSERT_NE(var,
nullptr);
2421 EXPECT_ALL_NEAR(var->function(&p), 0.0, 1e-6);
2422 EXPECT_FLOAT_EQ(var->function(&p2), 1.0);
2426 TEST_F(MetaVariableTest, NBDeltaIfMissingDeathTest)
2429 EXPECT_B2FATAL(Manager::Instance().getVariable(
"NBDeltaIfMissing(TOP, 11)"));
2430 EXPECT_B2FATAL(Manager::Instance().getVariable(
"NBDeltaIfMissing(ARICH, 11)"));
2433 TEST_F(MetaVariableTest, matchedMC)
2435 DataStore::Instance().setInitializeActive(
true);
2438 particles.registerRelationTo(mcParticles);
2439 DataStore::Instance().setInitializeActive(
false);
2441 auto* mcParticle = mcParticles.
appendNew();
2443 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
2444 auto* p1 = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
2445 p1->addRelationTo(mcParticle);
2449 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
2450 auto* p2 = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
2451 p2->addRelationTo(mcParticle);
2455 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
2456 auto* p3 = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 11);
2457 p3->addRelationTo(mcParticle);
2460 auto* p4 = particles.appendNew(mcParticle);
2462 const Manager::Var* var = Manager::Instance().getVariable(
"matchedMC(charge)");
2463 ASSERT_NE(var,
nullptr);
2464 EXPECT_FLOAT_EQ(var->function(p1), -1);
2465 EXPECT_FLOAT_EQ(var->function(p2), 1);
2466 EXPECT_FLOAT_EQ(var->function(p3), 0);
2467 EXPECT_FLOAT_EQ(var->function(p4), 0);
2470 TEST_F(MetaVariableTest, countInList)
2476 DataStore::Instance().setInitializeActive(
true);
2477 outputList.registerInDataStore(flags);
2478 DataStore::Instance().setInitializeActive(
false);
2479 outputList.create();
2480 outputList->initialize(22,
"pList1");
2482 particles.appendNew(
Particle({0.5 , 0.4 , 0.5 , 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2));
2483 particles.appendNew(
Particle({0.5 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3));
2484 particles.appendNew(
Particle({0.4 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4));
2485 particles.appendNew(
Particle({0.5 , 0.4 , 0.8 , 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 5));
2486 particles.appendNew(
Particle({0.3 , 0.3 , 0.4 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 6));
2488 outputList->addParticle(0, 22, Particle::c_Unflavored);
2489 outputList->addParticle(1, 22, Particle::c_Unflavored);
2490 outputList->addParticle(2, 22, Particle::c_Unflavored);
2491 outputList->addParticle(3, 22, Particle::c_Unflavored);
2492 outputList->addParticle(4, 22, Particle::c_Unflavored);
2494 const Manager::Var* var = Manager::Instance().getVariable(
"countInList(pList1, E < 0.85)");
2495 ASSERT_NE(var,
nullptr);
2496 EXPECT_DOUBLE_EQ(var->function(
nullptr), 2);
2498 var = Manager::Instance().getVariable(
"countInList(pList1)");
2499 ASSERT_NE(var,
nullptr);
2500 EXPECT_DOUBLE_EQ(var->function(
nullptr), 5);
2502 var = Manager::Instance().getVariable(
"countInList(pList1, E > 5)");
2503 ASSERT_NE(var,
nullptr);
2504 EXPECT_DOUBLE_EQ(var->function(
nullptr), 0);
2506 var = Manager::Instance().getVariable(
"countInList(pList1, E < 5)");
2507 ASSERT_NE(var,
nullptr);
2508 EXPECT_DOUBLE_EQ(var->function(
nullptr), 5);
2511 TEST_F(MetaVariableTest, isInList)
2519 DataStore::Instance().setInitializeActive(
true);
2520 gammalist.registerInDataStore(flags);
2521 DataStore::Instance().setInitializeActive(
false);
2523 gammalist->initialize(22,
"testGammaList");
2526 Particle goingin({0.5 , 0.4 , 0.5 , 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0);
2527 Particle notgoingin({0.3 , 0.3 , 0.4 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1);
2528 auto* inthelist = particles.appendNew(goingin);
2529 auto* notinthelist = particles.appendNew(notgoingin);
2532 gammalist->addParticle(0, 22, Particle::c_Unflavored);
2535 const Manager::Var* vnonsense = Manager::Instance().getVariable(
"isInList(NONEXISTANTLIST)");
2536 const Manager::Var* vsensible = Manager::Instance().getVariable(
"isInList(testGammaList)");
2539 EXPECT_B2FATAL(vnonsense->
function(notinthelist));
2540 EXPECT_FLOAT_EQ(vsensible->
function(inthelist), 1.0);
2541 EXPECT_FLOAT_EQ(vsensible->
function(notinthelist), 0.0);
2544 TEST_F(MetaVariableTest, sourceObjectIsInList)
2547 DataStore::Instance().reset();
2548 DataStore::Instance().setInitializeActive(
true);
2555 clusters.registerInDataStore();
2556 particles.registerInDataStore();
2558 gammalist.registerInDataStore(flags);
2561 DataStore::Instance().setInitializeActive(
false);
2565 gammalist->initialize(22,
"testGammaList");
2571 cl0->setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
2572 cl0->addHypothesis(ECLCluster::EHypothesisBit::c_neutralHadron);
2573 cl0->setClusterId(0);
2576 cl1->setHypothesis(ECLCluster::EHypothesisBit::c_neutralHadron);
2577 cl1->setClusterId(1);
2580 Particle myphoton(cl0, Const::photon);
2581 Particle iscopiedin(cl0, Const::Klong);
2582 Particle notcopiedin(cl1, Const::Klong);
2585 auto* myphoton_ = particles.appendNew(myphoton);
2586 gammalist->addParticle(myphoton_);
2588 auto* iscopied = particles.appendNew(iscopiedin);
2589 auto* notcopied = particles.appendNew(notcopiedin);
2592 const Manager::Var* vnonsense = Manager::Instance().getVariable(
"sourceObjectIsInList(NONEXISTANTLIST)");
2593 const Manager::Var* vsensible = Manager::Instance().getVariable(
"sourceObjectIsInList(testGammaList)");
2596 EXPECT_B2FATAL(vnonsense->
function(iscopied));
2597 EXPECT_FLOAT_EQ(vsensible->
function(iscopied), 1.0);
2598 EXPECT_FLOAT_EQ(vsensible->
function(notcopied), 0.0);
2601 Particle composite({0.5 , 0.4 , 0.5 , 0.8}, 512, Particle::c_Unflavored, Particle::c_Composite, 0);
2602 Particle undefined({0.3 , 0.3 , 0.4 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1);
2603 auto* composite_ = particles.appendNew(undefined);
2604 auto* undefined_ = particles.appendNew(composite);
2605 EXPECT_FLOAT_EQ(vsensible->
function(composite_), -1.0);
2606 EXPECT_FLOAT_EQ(vsensible->
function(undefined_), -1.0);
2609 TEST_F(MetaVariableTest, mcParticleIsInMCList)
2612 DataStore::Instance().reset();
2613 DataStore::Instance().setInitializeActive(
true);
2621 mcparticles.registerInDataStore();
2622 particles.registerInDataStore();
2623 particles.registerRelationTo(mcparticles);
2625 list.registerInDataStore(flags);
2626 anotherlist.registerInDataStore(flags);
2628 DataStore::Instance().setInitializeActive(
false);
2632 list->initialize(22,
"testList");
2634 anotherlist.create();
2635 anotherlist->initialize(22,
"supplimentaryList");
2638 auto* mcphoton = mcparticles.
appendNew();
2640 mcphoton->setStatus(MCParticle::c_PrimaryParticle);
2642 auto* mcelectron = mcparticles.
appendNew();
2644 mcelectron->setStatus(MCParticle::c_PrimaryParticle);
2646 auto* mcanotherelectron = mcparticles.
appendNew();
2647 mcanotherelectron->
setPDG(22);
2648 mcanotherelectron->setStatus(MCParticle::c_PrimaryParticle);
2650 auto* mcyetanotherelectron = mcparticles.
appendNew();
2651 mcyetanotherelectron->
setPDG(22);
2652 mcyetanotherelectron->setStatus(MCParticle::c_PrimaryParticle);
2655 auto* photon = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 22);
2656 photon->addRelationTo(mcphoton);
2657 list->addParticle(photon);
2659 auto* electron = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 22);
2660 electron->addRelationTo(mcelectron);
2661 list->addParticle(electron);
2663 auto* other = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 22);
2664 other->addRelationTo(mcanotherelectron);
2666 auto* yetanotherelectron = particles.appendNew(TLorentzVector({ 0.0 , -0.4, 0.8, 1.0}), 22);
2667 yetanotherelectron->addRelationTo(mcyetanotherelectron);
2668 anotherlist->addParticle(yetanotherelectron);
2672 const Manager::Var* vnonsense = Manager::Instance().getVariable(
"mcParticleIsInMCList(NONEXISTANTLIST)");
2673 const Manager::Var* vsensible = Manager::Instance().getVariable(
"mcParticleIsInMCList(testList)");
2676 EXPECT_B2FATAL(vnonsense->
function(photon));
2677 EXPECT_FLOAT_EQ(vsensible->
function(photon), 1.0);
2678 EXPECT_FLOAT_EQ(vsensible->
function(electron), 1.0);
2679 EXPECT_FLOAT_EQ(vsensible->
function(other), 0.0);
2680 EXPECT_FLOAT_EQ(vsensible->
function(yetanotherelectron), 0.0);
2683 Particle composite({0.5 , 0.4 , 0.5 , 0.8}, 512, Particle::c_Unflavored, Particle::c_Composite, 0);
2684 Particle undefined({0.3 , 0.3 , 0.4 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1);
2685 auto* composite_ = particles.appendNew(undefined);
2686 auto* undefined_ = particles.appendNew(composite);
2687 EXPECT_FLOAT_EQ(vsensible->
function(composite_), 0.0);
2688 EXPECT_FLOAT_EQ(vsensible->
function(undefined_), 0.0);
2691 TEST_F(MetaVariableTest, mostB2BAndClosestParticles)
2700 Gearbox& gearbox = Gearbox::getInstance();
2701 gearbox.setBackends({std::string(
"file:")});
2703 gearbox.open(
"geometry/Belle2.xml",
false);
2712 DataStore::Instance().setInitializeActive(
true);
2713 gammalist.registerInDataStore(flags);
2714 emptylist.registerInDataStore(flags);
2715 DataStore::Instance().setInitializeActive(
false);
2717 gammalist->initialize(22,
"testGammaList");
2719 emptylist->initialize(22,
"testEmptyList");
2722 std::vector<Particle> gammavector = {
2723 Particle({ -1.0 , -1.0 , 0.8, 1.2},
2724 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
2726 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
2729 for (
const auto& g : gammavector)
2730 particles.appendNew(g);
2733 for (
size_t i = 0; i < gammavector.size(); i++)
2734 gammalist->addParticle(i, 22, Particle::c_Unflavored);
2737 const auto* electron = particles.appendNew(
2739 11, Particle::c_Unflavored, Particle::c_Undefined, 2)
2743 EXPECT_B2FATAL(Manager::Instance().getVariable(
"angleToClosestInList"));
2744 EXPECT_B2FATAL(Manager::Instance().getVariable(
"angleToClosestInList(A, B)"));
2746 const auto* nonexistant = Manager::Instance().getVariable(
"angleToClosestInList(NONEXISTANTLIST)");
2747 EXPECT_B2FATAL(nonexistant->function(electron));
2749 const auto* empty = Manager::Instance().getVariable(
"angleToClosestInList(testEmptyList)");
2750 EXPECT_TRUE(std::isnan(empty->function(electron)));
2752 const auto* closest = Manager::Instance().getVariable(
"angleToClosestInList(testGammaList)");
2753 EXPECT_FLOAT_EQ(closest->function(electron), 0.68014491);
2755 const auto* closestCMS = Manager::Instance().getVariable(
"useCMSFrame(angleToClosestInList(testGammaList))");
2756 EXPECT_FLOAT_EQ(closestCMS->function(electron), 0.72592634);
2760 EXPECT_B2FATAL(Manager::Instance().getVariable(
"closestInList"));
2761 EXPECT_B2FATAL(Manager::Instance().getVariable(
"closestInList(A, B, C)"));
2763 const auto* nonexistant = Manager::Instance().getVariable(
"closestInList(NONEXISTANTLIST, E)");
2764 EXPECT_B2FATAL(nonexistant->function(electron));
2766 const auto* empty = Manager::Instance().getVariable(
"closestInList(testEmptyList, E)");
2767 EXPECT_TRUE(std::isnan(empty->function(electron)));
2769 const auto* closest = Manager::Instance().getVariable(
"closestInList(testGammaList, E)");
2770 EXPECT_FLOAT_EQ(closest->function(electron), 3.4);
2772 const auto* closestCMS = Manager::Instance().getVariable(
"useCMSFrame(closestInList(testGammaList, E))");
2773 EXPECT_FLOAT_EQ(closestCMS->function(electron), 3.2732551);
2775 const auto* closestCMSLabE = Manager::Instance().getVariable(
"useCMSFrame(closestInList(testGammaList, useLabFrame(E)))");
2776 EXPECT_FLOAT_EQ(closestCMSLabE->function(electron), 3.4);
2780 EXPECT_B2FATAL(Manager::Instance().getVariable(
"angleToMostB2BInList"));
2781 EXPECT_B2FATAL(Manager::Instance().getVariable(
"angleToMostB2BInList(A, B)"));
2783 const auto* nonexistant = Manager::Instance().getVariable(
"angleToMostB2BInList(NONEXISTANTLIST)");
2784 EXPECT_B2FATAL(nonexistant->function(electron));
2786 const auto* empty = Manager::Instance().getVariable(
"angleToMostB2BInList(testEmptyList)");
2787 EXPECT_TRUE(std::isnan(empty->function(electron)));
2789 const auto* mostB2B = Manager::Instance().getVariable(
"angleToMostB2BInList(testGammaList)");
2790 EXPECT_FLOAT_EQ(mostB2B->function(electron), 2.2869499);
2792 const auto* mostB2BCMS = Manager::Instance().getVariable(
"useCMSFrame(angleToMostB2BInList(testGammaList))");
2793 EXPECT_FLOAT_EQ(mostB2BCMS->function(electron), 2.6054888);
2797 EXPECT_B2FATAL(Manager::Instance().getVariable(
"mostB2BInList"));
2798 EXPECT_B2FATAL(Manager::Instance().getVariable(
"mostB2BInList(A, B, C)"));
2800 const auto* nonexistant = Manager::Instance().getVariable(
"mostB2BInList(NONEXISTANTLIST, E)");
2801 EXPECT_B2FATAL(nonexistant->function(electron));
2803 const auto* empty = Manager::Instance().getVariable(
"mostB2BInList(testEmptyList, E)");
2804 EXPECT_TRUE(std::isnan(empty->function(electron)));
2806 const auto* mostB2B = Manager::Instance().getVariable(
"mostB2BInList(testGammaList, E)");
2807 EXPECT_FLOAT_EQ(mostB2B->function(electron), 1.2);
2809 const auto* mostB2BCMS = Manager::Instance().getVariable(
"useCMSFrame(mostB2BInList(testGammaList, E))");
2810 EXPECT_FLOAT_EQ(mostB2BCMS->function(electron), 1.0647389);
2812 const auto* mostB2BCMSLabE = Manager::Instance().getVariable(
"useCMSFrame(mostB2BInList(testGammaList, useLabFrame(E)))");
2813 EXPECT_FLOAT_EQ(mostB2BCMSLabE->function(electron), 1.2);
2817 TEST_F(MetaVariableTest, totalEnergyOfParticlesInList)
2825 DataStore::Instance().setInitializeActive(
true);
2826 gammalist.registerInDataStore(flags);
2827 DataStore::Instance().setInitializeActive(
false);
2829 gammalist->initialize(22,
"testGammaList");
2832 std::vector<Particle> gammavector = {
2833 Particle({0.5 , 0.4 , 0.5 , 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
2834 Particle({0.5 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
2835 Particle({0.4 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
2836 Particle({0.5 , 0.4 , 0.8 , 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
2837 Particle({0.3 , 0.3 , 0.4 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
2841 for (
const auto& g : gammavector)
2842 particles.appendNew(g);
2845 for (
size_t i = 0; i < gammavector.size(); i++)
2846 gammalist->addParticle(i, 22, Particle::c_Unflavored);
2849 const Manager::Var* vnonsense = Manager::Instance().getVariable(
2850 "totalEnergyOfParticlesInList(NONEXISTANTLIST)");
2851 const Manager::Var* vsensible = Manager::Instance().getVariable(
2852 "totalEnergyOfParticlesInList(testGammaList)");
2855 EXPECT_B2FATAL(vnonsense->
function(
nullptr));
2856 EXPECT_FLOAT_EQ(vsensible->
function(
nullptr), 4.3);
2858 TEST_F(MetaVariableTest, totalPxOfParticlesInList)
2866 DataStore::Instance().setInitializeActive(
true);
2867 gammalist.registerInDataStore(flags);
2868 DataStore::Instance().setInitializeActive(
false);
2870 gammalist->initialize(22,
"testGammaList");
2873 std::vector<Particle> gammavector = {
2874 Particle({0.5 , 0.4 , 0.5 , 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
2875 Particle({0.5 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
2876 Particle({0.4 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
2877 Particle({0.5 , 0.4 , 0.8 , 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
2878 Particle({0.3 , 0.3 , 0.4 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
2882 for (
const auto& g : gammavector)
2883 particles.appendNew(g);
2886 for (
size_t i = 0; i < gammavector.size(); i++)
2887 gammalist->addParticle(i, 22, Particle::c_Unflavored);
2890 const Manager::Var* vnonsense = Manager::Instance().getVariable(
2891 "totalPxOfParticlesInList(NONEXISTANTLIST)");
2892 const Manager::Var* vsensible = Manager::Instance().getVariable(
2893 "totalPxOfParticlesInList(testGammaList)");
2896 EXPECT_B2FATAL(vnonsense->
function(
nullptr));
2897 EXPECT_FLOAT_EQ(vsensible->
function(
nullptr), 2.2);
2899 TEST_F(MetaVariableTest, totalPyOfParticlesInList)
2907 DataStore::Instance().setInitializeActive(
true);
2908 gammalist.registerInDataStore(flags);
2909 DataStore::Instance().setInitializeActive(
false);
2911 gammalist->initialize(22,
"testGammaList");
2914 std::vector<Particle> gammavector = {
2915 Particle({0.5 , 0.4 , 0.5 , 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
2916 Particle({0.5 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
2917 Particle({0.4 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
2918 Particle({0.5 , 0.4 , 0.8 , 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
2919 Particle({0.3 , 0.3 , 0.4 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
2923 for (
const auto& g : gammavector)
2924 particles.appendNew(g);
2927 for (
size_t i = 0; i < gammavector.size(); i++)
2928 gammalist->addParticle(i, 22, Particle::c_Unflavored);
2931 const Manager::Var* vnonsense = Manager::Instance().getVariable(
2932 "totalPyOfParticlesInList(NONEXISTANTLIST)");
2933 const Manager::Var* vsensible = Manager::Instance().getVariable(
2934 "totalPyOfParticlesInList(testGammaList)");
2937 EXPECT_B2FATAL(vnonsense->
function(
nullptr));
2938 EXPECT_FLOAT_EQ(vsensible->
function(
nullptr), 1.5);
2940 TEST_F(MetaVariableTest, totalPzOfParticlesInList)
2948 DataStore::Instance().setInitializeActive(
true);
2949 gammalist.registerInDataStore(flags);
2950 DataStore::Instance().setInitializeActive(
false);
2952 gammalist->initialize(22,
"testGammaList");
2955 std::vector<Particle> gammavector = {
2956 Particle({0.5 , 0.4 , 0.5 , 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
2957 Particle({0.5 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
2958 Particle({0.4 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
2959 Particle({0.5 , 0.4 , 0.8 , 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
2960 Particle({0.3 , 0.3 , 0.4 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
2964 for (
const auto& g : gammavector)
2965 particles.appendNew(g);
2968 for (
size_t i = 0; i < gammavector.size(); i++)
2969 gammalist->addParticle(i, 22, Particle::c_Unflavored);
2972 const Manager::Var* vnonsense = Manager::Instance().getVariable(
2973 "totalPzOfParticlesInList(NONEXISTANTLIST)");
2974 const Manager::Var* vsensible = Manager::Instance().getVariable(
2975 "totalPzOfParticlesInList(testGammaList)");
2978 EXPECT_B2FATAL(vnonsense->
function(
nullptr));
2979 EXPECT_FLOAT_EQ(vsensible->
function(
nullptr), 3.1);
2981 TEST_F(MetaVariableTest, maxPtInList)
2989 DataStore::Instance().setInitializeActive(
true);
2990 gammalist.registerInDataStore(flags);
2991 DataStore::Instance().setInitializeActive(
false);
2993 gammalist->initialize(22,
"testGammaList");
2996 std::vector<Particle> gammavector = {
2997 Particle({0.5 , 0.4 , 0.5 , 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
2998 Particle({0.5 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
2999 Particle({0.4 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
3000 Particle({0.5 , 0.4 , 0.8 , 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
3001 Particle({0.3 , 0.3 , 0.4 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
3005 for (
const auto& g : gammavector)
3006 particles.appendNew(g);
3009 for (
size_t i = 0; i < gammavector.size(); i++)
3010 gammalist->addParticle(i, 22, Particle::c_Unflavored);
3013 const Manager::Var* vnonsense = Manager::Instance().getVariable(
3014 "maxPtInList(NONEXISTANTLIST)");
3015 const Manager::Var* vsensible = Manager::Instance().getVariable(
3016 "maxPtInList(testGammaList)");
3019 EXPECT_B2FATAL(vnonsense->
function(
nullptr));
3020 EXPECT_FLOAT_EQ(vsensible->
function(
nullptr), sqrt(0.5 * 0.5 + 0.4 * 0.4));
3024 TEST_F(MetaVariableTest, numberOfNonOverlappingParticles)
3030 DataStore::Instance().setInitializeActive(
true);
3031 outputList.registerInDataStore(flags);
3032 DataStore::Instance().setInitializeActive(
false);
3033 outputList.create();
3034 outputList->initialize(22,
"pList1");
3036 auto* p1 = particles.appendNew(
Particle({0.5 , 0.4 , 0.5 , 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2));
3037 auto* p2 = particles.appendNew(
Particle({0.5 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3));
3038 auto* p3 = particles.appendNew(
Particle({0.5 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4));
3040 outputList->addParticle(0, 22, Particle::c_Unflavored);
3041 outputList->addParticle(1, 22, Particle::c_Unflavored);
3043 const Manager::Var* var = Manager::Instance().getVariable(
"numberOfNonOverlappingParticles(pList1)");
3044 ASSERT_NE(var,
nullptr);
3045 EXPECT_DOUBLE_EQ(var->function(p1), 1);
3046 EXPECT_DOUBLE_EQ(var->function(p2), 1);
3047 EXPECT_DOUBLE_EQ(var->function(p3), 2);
3051 TEST_F(MetaVariableTest, veto)
3056 const Particle* p = particles.appendNew(
Particle({0.8 , 0.8 , 1.131370849898476039041351 , 1.6}, 22,
3057 Particle::c_Unflavored, Particle::c_Undefined, 1));
3060 DataStore::Instance().setInitializeActive(
true);
3061 outputList.registerInDataStore(flags);
3062 DataStore::Instance().setInitializeActive(
false);
3063 outputList.create();
3064 outputList->initialize(22,
"pList1");
3066 particles.appendNew(
Particle({0.5 , 0.4953406774856531014212777 , 0.5609256753154148484773173 , 0.9}, 22,
3067 Particle::c_Unflavored, Particle::c_Undefined, 2));
3068 particles.appendNew(
Particle({0.5 , 0.2 , 0.72111 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3));
3069 particles.appendNew(
Particle({0.4 , 0.2 , 0.78102 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4));
3070 particles.appendNew(
Particle({0.5 , 0.4 , 0.89443 , 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 5));
3071 particles.appendNew(
Particle({0.3 , 0.3 , 0.42426 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 6));
3073 outputList->addParticle(1, 22, Particle::c_Unflavored);
3074 outputList->addParticle(2, 22, Particle::c_Unflavored);
3075 outputList->addParticle(3, 22, Particle::c_Unflavored);
3076 outputList->addParticle(4, 22, Particle::c_Unflavored);
3077 outputList->addParticle(5, 22, Particle::c_Unflavored);
3080 DataStore::Instance().setInitializeActive(
true);
3081 outputList2.registerInDataStore(flags);
3082 DataStore::Instance().setInitializeActive(
false);
3083 outputList2.create();
3084 outputList2->initialize(22,
"pList2");
3086 particles.appendNew(
Particle({0.5 , -0.4 , 0.63246 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 7));
3087 particles.appendNew(
Particle({0.5 , 0.2 , 0.72111 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 8));
3088 particles.appendNew(
Particle({0.4 , 0.2 , 0.78102 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 9));
3089 particles.appendNew(
Particle({0.5 , 0.4 , 0.89443 , 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 10));
3090 particles.appendNew(
Particle({0.3 , 0.3 , 0.42426 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 11));
3092 outputList2->addParticle(6, 22, Particle::c_Unflavored);
3093 outputList2->addParticle(7, 22, Particle::c_Unflavored);
3094 outputList2->addParticle(8, 22, Particle::c_Unflavored);
3095 outputList2->addParticle(9, 22, Particle::c_Unflavored);
3096 outputList2->addParticle(10, 22, Particle::c_Unflavored);
3098 const Manager::Var* var = Manager::Instance().getVariable(
"veto(pList1, 0.130 < M < 0.140)");
3099 ASSERT_NE(var,
nullptr);
3100 EXPECT_DOUBLE_EQ(var->function(p), 1);
3102 var = Manager::Instance().getVariable(
"veto(pList2, 0.130 < M < 0.140)");
3103 ASSERT_NE(var,
nullptr);
3104 EXPECT_DOUBLE_EQ(var->function(p), 0);
3108 TEST_F(MetaVariableTest, averageValueInList)
3116 DataStore::Instance().setInitializeActive(
true);
3117 gammalist.registerInDataStore(flags);
3118 DataStore::Instance().setInitializeActive(
false);
3120 gammalist->initialize(22,
"testGammaList");
3123 std::vector<Particle> gammavector = {
3124 Particle({0.5 , 0.4 , 0.5 , 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
3125 Particle({0.5 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
3126 Particle({0.4 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
3127 Particle({0.5 , 0.4 , 0.8 , 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
3128 Particle({0.3 , 0.3 , 0.4 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
3132 for (
const auto& g : gammavector)
3133 particles.appendNew(g);
3136 for (
size_t i = 0; i < gammavector.size(); i++)
3137 gammalist->addParticle(i, 22, Particle::c_Unflavored);
3140 const Manager::Var* vmeanpx = Manager::Instance().getVariable(
3141 "averageValueInList(testGammaList, px)");
3142 const Manager::Var* vmeanpy = Manager::Instance().getVariable(
3143 "averageValueInList(testGammaList, py)");
3144 const Manager::Var* vmeanpz = Manager::Instance().getVariable(
3145 "averageValueInList(testGammaList, pz)");
3146 const Manager::Var* vmeanE = Manager::Instance().getVariable(
3147 "averageValueInList(testGammaList, E)");
3149 EXPECT_FLOAT_EQ(vmeanpx->
function(
nullptr), 0.44);
3150 EXPECT_FLOAT_EQ(vmeanpy->
function(
nullptr), 0.3);
3151 EXPECT_FLOAT_EQ(vmeanpz->
function(
nullptr), 0.62);
3152 EXPECT_FLOAT_EQ(vmeanE->
function(
nullptr), 0.86);
3155 EXPECT_B2FATAL(Manager::Instance().getVariable(
"averageValueInList(testGammaList)"));
3158 EXPECT_B2FATAL(Manager::Instance().getVariable(
"averageValueInList(testGammaList, NONEXISTANTVARIABLE)"));
3161 const Manager::Var* vnolist = Manager::Instance().getVariable(
3162 "averageValueInList(NONEXISTANTLIST, px)");
3164 EXPECT_B2FATAL(vnolist->
function(
nullptr));
3167 TEST_F(MetaVariableTest, medianValueInList)
3175 DataStore::Instance().setInitializeActive(
true);
3176 oddgammalist.registerInDataStore(flags);
3177 DataStore::Instance().setInitializeActive(
false);
3178 oddgammalist.create();
3179 oddgammalist->initialize(22,
"oddGammaList");
3181 DataStore::Instance().setInitializeActive(
true);
3182 evengammalist.registerInDataStore(flags);
3183 DataStore::Instance().setInitializeActive(
false);
3184 evengammalist.create();
3185 evengammalist->initialize(22,
"evenGammaList");
3188 std::vector<Particle> gammavector = {
3189 Particle({0.5 , 0.4 , 0.5 , 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
3190 Particle({0.5 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
3191 Particle({0.4 , 0.2 , 0.7 , 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
3192 Particle({0.5 , 0.4 , 0.8 , 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
3193 Particle({0.3 , 0.3 , 0.4 , 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
3197 for (
const auto& g : gammavector)
3198 particles.appendNew(g);
3201 if (gammavector.size() % 2 == 0) {
3202 evengammalist->addParticle(0, 22, Particle::c_Unflavored);
3204 oddgammalist->addParticle(0, 22, Particle::c_Unflavored);
3205 for (
size_t i = 1; i < gammavector.size(); i++) {
3206 oddgammalist->addParticle(i, 22, Particle::c_Unflavored);
3207 evengammalist->addParticle(i, 22, Particle::c_Unflavored);
3211 const Manager::Var* voddmedianpx = Manager::Instance().getVariable(
3212 "medianValueInList(oddGammaList, px)");
3213 const Manager::Var* voddmedianpy = Manager::Instance().getVariable(
3214 "medianValueInList(oddGammaList, py)");
3215 const Manager::Var* voddmedianpz = Manager::Instance().getVariable(
3216 "medianValueInList(oddGammaList, pz)");
3217 const Manager::Var* voddmedianE = Manager::Instance().getVariable(
3218 "medianValueInList(oddGammaList, E)");
3220 EXPECT_FLOAT_EQ(voddmedianpx->
function(
nullptr), 0.5);
3221 EXPECT_FLOAT_EQ(voddmedianpy->
function(
nullptr), 0.3);
3222 EXPECT_FLOAT_EQ(voddmedianpz->
function(
nullptr), 0.7);
3223 EXPECT_FLOAT_EQ(voddmedianE->
function(
nullptr), 0.9);
3226 const Manager::Var* vevenmedianpx = Manager::Instance().getVariable(
3227 "medianValueInList(evenGammaList, px)");
3228 const Manager::Var* vevenmedianpy = Manager::Instance().getVariable(
3229 "medianValueInList(evenGammaList, py)");
3230 const Manager::Var* vevenmedianpz = Manager::Instance().getVariable(
3231 "medianValueInList(evenGammaList, pz)");
3232 const Manager::Var* vevenmedianE = Manager::Instance().getVariable(
3233 "medianValueInList(evenGammaList, E)");
3235 EXPECT_FLOAT_EQ(vevenmedianpx->
function(
nullptr), 0.45);
3236 EXPECT_FLOAT_EQ(vevenmedianpy->
function(
nullptr), 0.25);
3237 EXPECT_FLOAT_EQ(vevenmedianpz->
function(
nullptr), 0.7);
3238 EXPECT_FLOAT_EQ(vevenmedianE->
function(
nullptr), 0.9);
3241 EXPECT_B2FATAL(Manager::Instance().getVariable(
"medianValueInList(oddGammaList)"));
3244 EXPECT_B2FATAL(Manager::Instance().getVariable(
"medianValueInList(oddGammaList, NONEXISTANTVARIABLE)"));
3247 const Manager::Var* vnolist = Manager::Instance().getVariable(
3248 "medianValueInList(NONEXISTANTLIST, px)");
3250 EXPECT_B2FATAL(vnolist->
function(
nullptr));
3253 TEST_F(MetaVariableTest, pValueCombination)
3255 TLorentzVector momentum;
3257 std::vector<int> daughterIndices;
3258 Particle KS(TLorentzVector(1.164, 1.55200, 0, 2), 310, Particle::c_Unflavored, Particle::c_Composite, 0);
3260 momentum += KS.get4Vector();
3261 Particle* newDaughters = particles.appendNew(KS);
3263 Particle Jpsi(TLorentzVector(-1, 1, 1, 3.548), 443, Particle::c_Unflavored, Particle::c_Composite, 1);
3264 Jpsi.setPValue(0.9);
3265 momentum += Jpsi.get4Vector();
3266 newDaughters = particles.appendNew(Jpsi);
3268 Particle* B = particles.appendNew(momentum, 521, Particle::c_Flavored, daughterIndices);
3271 const Manager::Var* singlePvalue = Manager::Instance().getVariable(
"pValueCombination(chiProb)");
3272 ASSERT_NE(singlePvalue,
nullptr);
3273 EXPECT_FLOAT_EQ(singlePvalue->
function(B), 0.5);
3275 const Manager::Var* twoPvalues = Manager::Instance().getVariable(
"pValueCombination(chiProb, daughter(0, chiProb))");
3276 ASSERT_NE(twoPvalues,
nullptr);
3277 EXPECT_FLOAT_EQ(twoPvalues->
function(B), 0.05 * (1 - log(0.05)));
3280 Manager::Instance().getVariable(
"pValueCombination(chiProb, daughter(0, chiProb), daughter(1, chiProb))");
3281 ASSERT_NE(threePvalues,
nullptr);
3282 EXPECT_FLOAT_EQ(threePvalues->
function(B), 0.045 * (1 - log(0.045) + 0.5 * log(0.045) * log(0.045)));
3285 EXPECT_B2FATAL(Manager::Instance().getVariable(
"pValueCombination()"));
3288 EXPECT_B2FATAL(Manager::Instance().getVariable(
"pValueCombination(chiProb, NONEXISTANTVARIABLE)"));
3292 TEST_F(MetaVariableTest, daughterCombinationOneGeneration)
3294 const int nDaughters = 5;
3295 TLorentzVector momentum(0, 0, 0, 0);
3297 std::vector<int> daughterIndices;
3298 std::vector<TLorentzVector> daughterMomenta;
3300 for (
int i = 0; i < nDaughters; i++) {
3301 TLorentzVector mom(1, i * 0.5, 1, i * 1.0 + 2.0);
3302 Particle d(mom, (i % 2) ? -11 : 211);
3303 Particle* newDaughters = particles.appendNew(d);
3305 daughterMomenta.push_back(mom);
3306 momentum = momentum + mom;
3308 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Flavored, daughterIndices);
3311 const Manager::Var* var = Manager::Instance().getVariable(
"daughterCombination(M, 0,1,2)");
3312 double M_test = (daughterMomenta[0] + daughterMomenta[1] + daughterMomenta[2]).Mag();
3313 EXPECT_FLOAT_EQ(var->function(p), M_test);
3315 var = Manager::Instance().getVariable(
"daughterCombination(M, 0,4)");
3316 M_test = (daughterMomenta[0] + daughterMomenta[4]).Mag();
3317 EXPECT_FLOAT_EQ(var->function(p), M_test);
3321 var = Manager::Instance().getVariable(
"daughterCombination(p, 1, 0, 4)");
3322 double p_test = (daughterMomenta[0] + daughterMomenta[1] + daughterMomenta[4]).Vect().Mag();
3323 EXPECT_FLOAT_EQ(var->function(p), p_test);
3327 EXPECT_B2FATAL(Manager::Instance().getVariable(
"daughterCombination(aVeryNonExistingVariableSillyName, 1, 0, 4)"));
3329 var = Manager::Instance().getVariable(
"daughterCombination(M, 1, 0, 100)");
3330 EXPECT_B2WARNING(var->function(p));
3331 EXPECT_TRUE(std::isnan(var->function(p)));
3334 var = Manager::Instance().getVariable(
"daughterCombination(M, 1, -1)");
3335 EXPECT_B2WARNING(var->function(p));
3336 EXPECT_TRUE(std::isnan(var->function(p)));
3339 var = Manager::Instance().getVariable(
"daughterCombination(M, 1, 0:1:0:0:1)");
3340 EXPECT_B2WARNING(var->function(p));
3341 EXPECT_TRUE(std::isnan(var->function(p)));
3346 TEST_F(MetaVariableTest, daughterCombinationTwoGenerations)
3352 TLorentzVector momentum_1(0, 0, 0, 0);
3353 std::vector<TLorentzVector> daughterMomenta_1;
3354 std::vector<int> daughterIndices_1;
3356 for (
int i = 0; i < 3; i++) {
3357 TLorentzVector mom(i * 0.2, 1, 1, i * 1.0 + 2.0);
3358 Particle d(mom, (i % 2) ? -11 : 211);
3359 Particle* newDaughters = particles.appendNew(d);
3361 daughterMomenta_1.push_back(mom);
3362 momentum_1 = momentum_1 + mom;
3365 const Particle* compositeDau_1 = particles.appendNew(momentum_1, 411, Particle::c_Flavored, daughterIndices_1);
3370 TLorentzVector momentum_2(0, 0, 0, 0);
3371 std::vector<TLorentzVector> daughterMomenta_2;
3372 std::vector<int> daughterIndices_2;
3374 for (
int i = 0; i < 2; i++) {
3375 TLorentzVector mom(1, 1, i * 0.3, i * 1.0 + 2.0);
3376 Particle d(mom, (i % 2) ? -11 : 211);
3377 Particle* newDaughters = particles.appendNew(d);
3379 daughterMomenta_2.push_back(mom);
3380 momentum_2 = momentum_2 + mom;
3383 const Particle* compositeDau_2 = particles.appendNew(momentum_2, 411, Particle::c_Flavored, daughterIndices_2);
3388 const Particle* p = particles.appendNew(momentum_2 + momentum_1, 111, Particle::c_Unflavored, daughterIndices);
3392 const Manager::Var* var = Manager::Instance().getVariable(
"daughterCombination(M, 0,1)");
3393 double M_test = (momentum_1 + momentum_2).Mag();
3394 EXPECT_FLOAT_EQ(var->function(p), M_test);
3397 var = Manager::Instance().getVariable(
"daughterCombination(M, 0:0, 0:1, 0:2)");
3398 M_test = (momentum_1).Mag();
3399 EXPECT_FLOAT_EQ(var->function(p), M_test);
3402 var = Manager::Instance().getVariable(
"daughterCombination(M, 0:0, 0:1, 1:0)");
3403 M_test = (daughterMomenta_1[0] + daughterMomenta_1[1] + daughterMomenta_2[0]).Mag();
3404 EXPECT_FLOAT_EQ(var->function(p), M_test);
3409 TEST_F(MetaVariableTest, useAlternativeDaughterHypothesis)
3411 const int nDaughters = 5;
3415 TLorentzVector momentum(0, 0, 0, 0);
3416 std::vector<int> daughterIndices;
3417 for (
int i = 0; i < nDaughters; i++) {
3418 double px = i * 0.1;
3419 double py = i * 0.3;
3420 double pz = -i * 0.1 - 0.2;
3422 TLorentzVector mom(px, py, pz, 1);
3424 int pdgCode = Const::pion.getPDGCode();
3426 d.updateMass(pdgCode);
3427 mom.SetXYZM(px, py, pz, d.getMass());
3429 Particle* daughters = particles.appendNew(d);
3431 momentum = momentum + mom;
3433 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Flavored, daughterIndices);
3437 TLorentzVector momentumAlt(0, 0, 0, 0);
3438 std::vector<int> daughterIndicesAlt;
3439 for (
int i = 0; i < nDaughters; i++) {
3440 double px = i * 0.1;
3441 double py = i * 0.3;
3442 double pz = -i * 0.1 - 0.2;
3444 TLorentzVector mom(px, py, pz, 1);
3446 int pdgCode = Const::pion.getPDGCode();
3448 pdgCode = Const::proton.getPDGCode();
3450 pdgCode = Const::kaon.getPDGCode();
3452 d.updateMass(pdgCode);
3453 mom.SetXYZM(px, py, pz, d.getMass());
3455 Particle* daughters = particles.appendNew(d);
3457 momentumAlt = momentumAlt + mom;
3459 const Particle* pAlt = particles.appendNew(momentumAlt, 411, Particle::c_Flavored, daughterIndicesAlt);
3463 std::cout <<
"mass test" << std::endl;
3464 const Manager::Var* var = Manager::Instance().getVariable(
"useAlternativeDaughterHypothesis(M, 0:p+,1:K+)");
3465 const Manager::Var* varAlt = Manager::Instance().getVariable(
"M");
3466 EXPECT_FLOAT_EQ(var->function(p), varAlt->
function(pAlt));
3469 std::cout <<
"charge test" << std::endl;
3470 var = Manager::Instance().getVariable(
"useAlternativeDaughterHypothesis(M, 0:p+,1:K-)");
3471 EXPECT_FLOAT_EQ(var->function(p), varAlt->
function(pAlt));
3474 std::cout <<
"momentum test" << std::endl;
3475 var = Manager::Instance().getVariable(
"useAlternativeDaughterHypothesis(p, 0:p+,1:K-)");
3476 varAlt = Manager::Instance().getVariable(
"p");
3477 EXPECT_FLOAT_EQ(var->function(p), varAlt->
function(pAlt));
3478 EXPECT_FLOAT_EQ(var->function(p), varAlt->
function(p));
3479 EXPECT_FLOAT_EQ(var->function(pAlt), varAlt->
function(pAlt));
3485 TEST_F(MetaVariableTest, daughterAngle)
3491 TLorentzVector momentum_1(0, 0, 0, 0);
3492 std::vector<TLorentzVector> daughterMomenta_1;
3493 std::vector<int> daughterIndices_1;
3495 for (
int i = 0; i < 3; i++) {
3496 TLorentzVector mom(i * 0.2, 1, 1, i * 1.0 + 2.0);
3497 Particle d(mom, (i % 2) ? -11 : 211);
3498 Particle* newDaughters = particles.appendNew(d);
3500 daughterMomenta_1.push_back(mom);
3501 momentum_1 = momentum_1 + mom;
3504 const Particle* compositeDau_1 = particles.appendNew(momentum_1, 411, Particle::c_Flavored, daughterIndices_1);
3509 TLorentzVector momentum_2(0, 0, 0, 0);
3510 std::vector<TLorentzVector> daughterMomenta_2;
3511 std::vector<int> daughterIndices_2;
3513 for (
int i = 0; i < 2; i++) {
3514 TLorentzVector mom(1, 1, i * 0.3, i * 1.0 + 2.0);
3515 Particle d(mom, (i % 2) ? -11 : 211);
3516 Particle* newDaughters = particles.appendNew(d);
3518 daughterMomenta_2.push_back(mom);
3519 momentum_2 = momentum_2 + mom;
3522 const Particle* compositeDau_2 = particles.appendNew(momentum_2, 411, Particle::c_Flavored, daughterIndices_2);
3527 const Particle* p = particles.appendNew(momentum_2 + momentum_1, 111, Particle::c_Unflavored, daughterIndices);
3531 const Manager::Var* var = Manager::Instance().getVariable(
"daughterAngle(0, 1)");
3532 double v_test = momentum_1.Vect().Angle(momentum_2.Vect());
3533 EXPECT_FLOAT_EQ(var->function(p), v_test);
3536 var = Manager::Instance().getVariable(
"daughterAngle(0:0, 1:0)");
3537 v_test = daughterMomenta_1[0].Vect().Angle(daughterMomenta_2[0].Vect());
3538 EXPECT_FLOAT_EQ(var->function(p), v_test);
3540 var = Manager::Instance().getVariable(
"daughterAngle( 1, -1)");
3541 EXPECT_B2WARNING(var->function(p));
3542 EXPECT_TRUE(std::isnan(var->function(p)));
3544 var = Manager::Instance().getVariable(
"daughterAngle(1, 0:1:0:0:1)");
3545 EXPECT_B2WARNING(var->function(p));
3546 EXPECT_TRUE(std::isnan(var->function(p)));
3551 TEST_F(MetaVariableTest, varForFirstMCAncestorOfType)
3553 DataStore::Instance().setInitializeActive(
true);
3556 particles.registerInDataStore();
3557 mcParticles.registerInDataStore();
3558 particles.registerRelationTo(mcParticles);
3560 DList.registerInDataStore();
3562 DList->initialize(421,
"D0:vartest");
3563 DataStore::Instance().setInitializeActive(
false);
3564 TLorentzVector momentum;
3565 TLorentzVector momentum_0;
3566 TLorentzVector momentum_1;
3567 std::vector<int> D_daughterIndices;
3568 std::vector<int> D_grandDaughterIndices_0;
3569 std::vector<int> D_grandDaughterIndices_1;
3585 mcg_m.
set4Vector(TLorentzVector(7, 7, 7, 7));
3587 mcg_d_0.
set4Vector(TLorentzVector(6, 6, 6, 6));
3589 mcg_d_1.
set4Vector(TLorentzVector(5, 5, 5, 5));
3591 mcg_gd_0_0.
set4Vector(TLorentzVector(4, 4, 4, 4));
3593 mcg_gd_0_1.
set4Vector(TLorentzVector(3, 3, 3, 3));
3595 mcg_gd_1_0.
set4Vector(TLorentzVector(2, 1, 2, 2));
3597 mcg_gd_1_1.
set4Vector(TLorentzVector(1, 1, 1, 1));
3598 mcg_not_child.
setPDG(211);
3599 mcg_not_child.
set4Vector(TLorentzVector(10, 10, 10, 10));
3611 auto* mc_not_child = mcParticles[0];
3612 auto* mc_m = mcParticles[1];
3613 auto* mc_d_0 = mcParticles[2];
3614 auto* mc_d_1 = mcParticles[3];
3615 auto* mc_gd_0_0 = mcParticles[4];
3616 auto* mc_gd_0_1 = mcParticles[5];
3617 auto* mc_gd_1_0 = mcParticles[6];
3618 auto* mc_gd_1_1 = mcParticles[7];
3621 mc_m->setStatus(MCParticle::c_PrimaryParticle);
3622 mc_d_0->setStatus(MCParticle::c_PrimaryParticle);
3623 mc_d_1->setStatus(MCParticle::c_PrimaryParticle);
3624 mc_gd_0_0->setStatus(MCParticle::c_PrimaryParticle);
3625 mc_gd_0_1->setStatus(MCParticle::c_PrimaryParticle);
3626 mc_gd_1_0->setStatus(MCParticle::c_PrimaryParticle);
3627 mc_gd_1_1->setStatus(MCParticle::c_PrimaryParticle);
3628 mc_not_child->setStatus(MCParticle::c_PrimaryParticle);
3632 const Particle* D_gd_0_0 = particles.appendNew(TLorentzVector(0.0, 1, 1, 1), 211);
3633 const Particle* D_gd_0_1 = particles.appendNew(TLorentzVector(1.0, 1, 1, 1), -211);
3634 const Particle* D_gd_1_0 = particles.appendNew(TLorentzVector(2.0, 1, 1, 1), 211);
3635 const Particle* D_gd_1_1 = particles.appendNew(TLorentzVector(3.0, 1, 1, 1), -211);
3637 D_grandDaughterIndices_0.push_back(D_gd_0_0->
getArrayIndex());
3638 D_grandDaughterIndices_0.push_back(D_gd_0_1->
getArrayIndex());
3639 D_grandDaughterIndices_1.push_back(D_gd_1_0->
getArrayIndex());
3640 D_grandDaughterIndices_1.push_back(D_gd_1_1->
getArrayIndex());
3645 const Particle* D_d_0 = particles.appendNew(momentum_0, 310, Particle::c_Unflavored, D_grandDaughterIndices_0);
3646 const Particle* D_d_1 = particles.appendNew(momentum_1, 310, Particle::c_Unflavored, D_grandDaughterIndices_1);
3653 const Particle* D_m = particles.appendNew(momentum, 421, Particle::c_Unflavored, D_daughterIndices);
3654 DList->addParticle(D_m);
3657 const Particle* not_child = particles.appendNew(TLorentzVector(5.0, 1, 1, 1), 211);
3660 const Particle* not_child_2 = particles.appendNew(TLorentzVector(6.0, 1, 1, 1), 211);
3673 const Manager::Var* var_d = Manager::Instance().getVariable(
"varForFirstMCAncestorOfType(D0, mdstIndex)");
3674 ASSERT_NE(var_d,
nullptr);
3675 EXPECT_TRUE(var_d->
function(D_gd_0_0) >= 0);
3680 EXPECT_TRUE(std::isnan(var_d->
function(not_child)));
3681 EXPECT_TRUE(std::isnan(var_d->
function(not_child_2)));
3685 const Manager::Var* var_310 = Manager::Instance().getVariable(
"varForFirstMCAncestorOfType(310, mdstIndex)");
3686 ASSERT_NE(var_310,
nullptr);
3691 EXPECT_TRUE(std::isnan(var_310->
function(not_child)));
3692 EXPECT_TRUE(std::isnan(var_310->
function(not_child_2)));
3693 EXPECT_FLOAT_EQ(
int(Manager::Instance().getVariable(
"varForFirstMCAncestorOfType(310, E)")->
function(D_gd_0_0)), 10);
3696 TEST_F(MetaVariableTest, isDescendantOfList)
3698 DataStore::Instance().setInitializeActive(
true);
3700 DList.registerInDataStore();
3702 DList->initialize(421,
"D0:vartest");
3704 BList.registerInDataStore();
3706 BList->initialize(521,
"B:vartest");
3707 DataStore::Instance().setInitializeActive(
false);
3709 TLorentzVector momentum;
3710 TLorentzVector momentum_0;
3711 TLorentzVector momentum_1;
3713 std::vector<int> D_daughterIndices;
3714 std::vector<int> D_grandDaughterIndices_0;
3715 std::vector<int> D_grandDaughterIndices_1;
3716 std::vector<int> B_daughterIndices;
3717 std::vector<int> B_grandDaughterIndices;
3718 std::vector<int> B_grandGrandDaughterIndices;
3722 const Particle* D_gd_0_0 = particles.appendNew(TLorentzVector(0.0, 1, 1, 1), 211, Particle::c_Flavored, Particle::c_Track, 0);
3723 const Particle* D_gd_0_1 = particles.appendNew(TLorentzVector(1.0, 1, 1, 1), -211, Particle::c_Flavored, Particle::c_Track, 1);
3724 const Particle* D_gd_1_0 = particles.appendNew(TLorentzVector(2.0, 1, 1, 1), 211, Particle::c_Flavored, Particle::c_Track, 2);
3725 const Particle* D_gd_1_1 = particles.appendNew(TLorentzVector(3.0, 1, 1, 1), -211, Particle::c_Flavored, Particle::c_Track, 3);
3727 D_grandDaughterIndices_0.push_back(D_gd_0_0->
getArrayIndex());
3728 D_grandDaughterIndices_0.push_back(D_gd_0_1->
getArrayIndex());
3729 D_grandDaughterIndices_1.push_back(D_gd_1_0->
getArrayIndex());
3730 D_grandDaughterIndices_1.push_back(D_gd_1_1->
getArrayIndex());
3735 const Particle* D_d_0 = particles.appendNew(momentum_0, 310, Particle::c_Unflavored, D_grandDaughterIndices_0);
3736 const Particle* D_d_1 = particles.appendNew(momentum_1, 310, Particle::c_Unflavored, D_grandDaughterIndices_1);
3743 const Particle* D_m = particles.appendNew(momentum, 421, Particle::c_Unflavored, D_daughterIndices);
3744 DList->addParticle(D_m);
3748 const Particle* B_d_1 = particles.appendNew(TLorentzVector(0.0, 1, 1, 1), 211, Particle::c_Flavored, Particle::c_Track, 4);
3749 const Particle* B_gd_0_1 = particles.appendNew(TLorentzVector(1.0, 1, 1, 1), -211, Particle::c_Flavored, Particle::c_Track, 5);
3750 const Particle* B_ggd_0_0_0 = particles.appendNew(TLorentzVector(2.0, 1, 1, 1), 211, Particle::c_Flavored, Particle::c_Track, 6);
3751 const Particle* B_ggd_0_0_1 = particles.appendNew(TLorentzVector(3.0, 1, 1, 1), -211, Particle::c_Flavored, Particle::c_Track, 7);
3753 B_grandGrandDaughterIndices.push_back(B_ggd_0_0_0->
getArrayIndex());
3754 B_grandGrandDaughterIndices.push_back(B_ggd_0_0_1->
getArrayIndex());
3756 const Particle* B_gd_0_0 = particles.appendNew(momentum_0, 310, Particle::c_Unflavored, B_grandGrandDaughterIndices);
3758 B_grandDaughterIndices.push_back(B_gd_0_0->
getArrayIndex());
3759 B_grandDaughterIndices.push_back(B_gd_0_1->
getArrayIndex());
3761 const Particle* B_d_0 = particles.appendNew(momentum_1, -411, Particle::c_Unflavored, B_grandDaughterIndices);
3766 const Particle* B_m = particles.appendNew(momentum, 521, Particle::c_Unflavored, B_daughterIndices);
3767 BList->addParticle(B_m);
3770 const Particle* not_child = particles.appendNew(TLorentzVector(5.0, 1, 1, 1), 211, Particle::c_Flavored, Particle::c_Track, 8);
3773 const Manager::Var* var_0 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest)");
3774 ASSERT_NE(var_0,
nullptr);
3775 EXPECT_FLOAT_EQ(var_0->
function(D_gd_0_0), 1.);
3776 EXPECT_FLOAT_EQ(var_0->
function(D_gd_0_1), 1.);
3777 EXPECT_FLOAT_EQ(var_0->
function(D_gd_1_0), 1.);
3778 EXPECT_FLOAT_EQ(var_0->
function(D_gd_1_1), 1.);
3779 EXPECT_FLOAT_EQ(var_0->
function(D_d_0), 1.);
3780 EXPECT_FLOAT_EQ(var_0->
function(D_d_1), 1.);
3781 EXPECT_FLOAT_EQ(var_0->
function(B_ggd_0_0_0), 0.);
3782 EXPECT_FLOAT_EQ(var_0->
function(B_ggd_0_0_1), 0.);
3783 EXPECT_FLOAT_EQ(var_0->
function(B_gd_0_0), 0.);
3784 EXPECT_FLOAT_EQ(var_0->
function(B_gd_0_1), 0.);
3785 EXPECT_FLOAT_EQ(var_0->
function(B_d_0), 0.);
3786 EXPECT_FLOAT_EQ(var_0->
function(B_d_1), 0.);
3787 EXPECT_FLOAT_EQ(var_0->
function(not_child), 0.);
3789 const Manager::Var* var_0a = Manager::Instance().getVariable(
"isDaughterOfList(D0:vartest)");
3790 ASSERT_NE(var_0a,
nullptr);
3791 EXPECT_FLOAT_EQ(var_0a->
function(D_gd_0_0), 0.);
3792 EXPECT_FLOAT_EQ(var_0a->
function(D_gd_0_1), 0.);
3793 EXPECT_FLOAT_EQ(var_0a->
function(D_gd_1_0), 0.);
3794 EXPECT_FLOAT_EQ(var_0a->
function(D_gd_1_1), 0.);
3795 EXPECT_FLOAT_EQ(var_0a->
function(D_d_0), 1.);
3796 EXPECT_FLOAT_EQ(var_0a->
function(D_d_1), 1.);
3797 EXPECT_FLOAT_EQ(var_0a->
function(B_ggd_0_0_0), 0.);
3798 EXPECT_FLOAT_EQ(var_0a->
function(B_ggd_0_0_1), 0.);
3799 EXPECT_FLOAT_EQ(var_0a->
function(B_gd_0_0), 0.);
3800 EXPECT_FLOAT_EQ(var_0a->
function(B_gd_0_1), 0.);
3801 EXPECT_FLOAT_EQ(var_0a->
function(B_d_0), 0.);
3802 EXPECT_FLOAT_EQ(var_0a->
function(B_d_1), 0.);
3803 EXPECT_FLOAT_EQ(var_0a->
function(not_child), 0.);
3805 const Manager::Var* var_0b = Manager::Instance().getVariable(
"isGrandDaughterOfList(D0:vartest)");
3806 ASSERT_NE(var_0b,
nullptr);
3807 EXPECT_FLOAT_EQ(var_0b->
function(D_gd_0_0), 1.);
3808 EXPECT_FLOAT_EQ(var_0b->
function(D_gd_0_1), 1.);
3809 EXPECT_FLOAT_EQ(var_0b->
function(D_gd_1_0), 1.);
3810 EXPECT_FLOAT_EQ(var_0b->
function(D_gd_1_1), 1.);
3811 EXPECT_FLOAT_EQ(var_0b->
function(D_d_0), 0.);
3812 EXPECT_FLOAT_EQ(var_0b->
function(D_d_1), 0.);
3813 EXPECT_FLOAT_EQ(var_0b->
function(B_ggd_0_0_0), 0.);
3814 EXPECT_FLOAT_EQ(var_0b->
function(B_ggd_0_0_1), 0.);
3815 EXPECT_FLOAT_EQ(var_0b->
function(B_gd_0_0), 0.);
3816 EXPECT_FLOAT_EQ(var_0b->
function(B_gd_0_1), 0.);
3817 EXPECT_FLOAT_EQ(var_0b->
function(B_d_0), 0.);
3818 EXPECT_FLOAT_EQ(var_0b->
function(B_d_1), 0.);
3819 EXPECT_FLOAT_EQ(var_0b->
function(not_child), 0.);
3821 const Manager::Var* var_1 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, 1)");
3822 ASSERT_NE(var_1,
nullptr);
3823 EXPECT_FLOAT_EQ(var_1->
function(D_gd_0_0), 0.);
3824 EXPECT_FLOAT_EQ(var_1->
function(D_gd_0_1), 0.);
3825 EXPECT_FLOAT_EQ(var_1->
function(D_gd_1_0), 0.);
3826 EXPECT_FLOAT_EQ(var_1->
function(D_gd_1_1), 0.);
3827 EXPECT_FLOAT_EQ(var_1->
function(D_d_0), 1.);
3828 EXPECT_FLOAT_EQ(var_1->
function(D_d_1), 1.);
3829 EXPECT_FLOAT_EQ(var_1->
function(B_ggd_0_0_0), 0.);
3830 EXPECT_FLOAT_EQ(var_1->
function(B_ggd_0_0_1), 0.);
3831 EXPECT_FLOAT_EQ(var_1->
function(B_gd_0_0), 0.);
3832 EXPECT_FLOAT_EQ(var_1->
function(B_gd_0_1), 0.);
3833 EXPECT_FLOAT_EQ(var_1->
function(B_d_0), 0.);
3834 EXPECT_FLOAT_EQ(var_1->
function(B_d_1), 0.);
3835 EXPECT_FLOAT_EQ(var_1->
function(not_child), 0.);
3837 const Manager::Var* var_2 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, 2)");
3838 ASSERT_NE(var_2,
nullptr);
3839 EXPECT_FLOAT_EQ(var_2->
function(D_gd_0_0), 1.);
3840 EXPECT_FLOAT_EQ(var_2->
function(D_gd_0_1), 1.);
3841 EXPECT_FLOAT_EQ(var_2->
function(D_gd_1_0), 1.);
3842 EXPECT_FLOAT_EQ(var_2->
function(D_gd_1_1), 1.);
3843 EXPECT_FLOAT_EQ(var_2->
function(D_d_0), 0.);
3844 EXPECT_FLOAT_EQ(var_2->
function(D_d_1), 0.);
3845 EXPECT_FLOAT_EQ(var_2->
function(B_ggd_0_0_0), 0.);
3846 EXPECT_FLOAT_EQ(var_2->
function(B_ggd_0_0_1), 0.);
3847 EXPECT_FLOAT_EQ(var_2->
function(B_gd_0_0), 0.);
3848 EXPECT_FLOAT_EQ(var_2->
function(B_gd_0_1), 0.);
3849 EXPECT_FLOAT_EQ(var_2->
function(B_d_0), 0.);
3850 EXPECT_FLOAT_EQ(var_2->
function(B_d_1), 0.);
3851 EXPECT_FLOAT_EQ(var_2->
function(not_child), 0.);
3853 const Manager::Var* var_3 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, B:vartest)");
3854 ASSERT_NE(var_3,
nullptr);
3855 EXPECT_FLOAT_EQ(var_3->
function(D_gd_0_0), 1.);
3856 EXPECT_FLOAT_EQ(var_3->
function(D_gd_0_1), 1.);
3857 EXPECT_FLOAT_EQ(var_3->
function(D_gd_1_0), 1.);
3858 EXPECT_FLOAT_EQ(var_3->
function(D_gd_1_1), 1.);
3859 EXPECT_FLOAT_EQ(var_3->
function(D_d_0), 1.);
3860 EXPECT_FLOAT_EQ(var_3->
function(D_d_1), 1.);
3861 EXPECT_FLOAT_EQ(var_3->
function(B_ggd_0_0_0), 1.);
3862 EXPECT_FLOAT_EQ(var_3->
function(B_ggd_0_0_1), 1.);
3863 EXPECT_FLOAT_EQ(var_3->
function(B_gd_0_0), 1.);
3864 EXPECT_FLOAT_EQ(var_3->
function(B_gd_0_1), 1.);
3865 EXPECT_FLOAT_EQ(var_3->
function(B_d_0), 1.);
3866 EXPECT_FLOAT_EQ(var_3->
function(B_d_1), 1.);
3867 EXPECT_FLOAT_EQ(var_3->
function(not_child), 0.);
3869 const Manager::Var* var_4 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, B:vartest, -1)");
3870 ASSERT_NE(var_4,
nullptr);
3871 EXPECT_FLOAT_EQ(var_4->
function(D_gd_0_0), 1.);
3872 EXPECT_FLOAT_EQ(var_4->
function(D_gd_0_1), 1.);
3873 EXPECT_FLOAT_EQ(var_4->
function(D_gd_1_0), 1.);
3874 EXPECT_FLOAT_EQ(var_4->
function(D_gd_1_1), 1.);
3875 EXPECT_FLOAT_EQ(var_4->
function(D_d_0), 1.);
3876 EXPECT_FLOAT_EQ(var_4->
function(D_d_1), 1.);
3877 EXPECT_FLOAT_EQ(var_4->
function(B_ggd_0_0_0), 1.);
3878 EXPECT_FLOAT_EQ(var_4->
function(B_ggd_0_0_1), 1.);
3879 EXPECT_FLOAT_EQ(var_4->
function(B_gd_0_0), 1.);
3880 EXPECT_FLOAT_EQ(var_4->
function(B_gd_0_1), 1.);
3881 EXPECT_FLOAT_EQ(var_4->
function(B_d_0), 1.);
3882 EXPECT_FLOAT_EQ(var_4->
function(B_d_1), 1.);
3883 EXPECT_FLOAT_EQ(var_4->
function(not_child), 0.);
3886 const Manager::Var* var_5 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, B:vartest, 1)");
3887 ASSERT_NE(var_5,
nullptr);
3888 EXPECT_FLOAT_EQ(var_5->
function(D_gd_0_0), 0.);
3889 EXPECT_FLOAT_EQ(var_5->
function(D_gd_0_1), 0.);
3890 EXPECT_FLOAT_EQ(var_5->
function(D_gd_1_0), 0.);
3891 EXPECT_FLOAT_EQ(var_5->
function(D_gd_1_1), 0.);
3892 EXPECT_FLOAT_EQ(var_5->
function(D_d_0), 1.);
3893 EXPECT_FLOAT_EQ(var_5->
function(D_d_1), 1.);
3894 EXPECT_FLOAT_EQ(var_5->
function(B_ggd_0_0_0), 0.);
3895 EXPECT_FLOAT_EQ(var_5->
function(B_ggd_0_0_1), 0.);
3896 EXPECT_FLOAT_EQ(var_5->
function(B_gd_0_0), 0.);
3897 EXPECT_FLOAT_EQ(var_5->
function(B_gd_0_1), 0.);
3898 EXPECT_FLOAT_EQ(var_5->
function(B_d_0), 1.);
3899 EXPECT_FLOAT_EQ(var_5->
function(B_d_1), 1.);
3900 EXPECT_FLOAT_EQ(var_5->
function(not_child), 0.);
3903 const Manager::Var* var_6 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, B:vartest, 2)");
3904 ASSERT_NE(var_6,
nullptr);
3905 EXPECT_FLOAT_EQ(var_6->
function(D_gd_0_0), 1.);
3906 EXPECT_FLOAT_EQ(var_6->
function(D_gd_0_1), 1.);
3907 EXPECT_FLOAT_EQ(var_6->
function(D_gd_1_0), 1.);
3908 EXPECT_FLOAT_EQ(var_6->
function(D_gd_1_1), 1.);
3909 EXPECT_FLOAT_EQ(var_6->
function(D_d_0), 0.);
3910 EXPECT_FLOAT_EQ(var_6->
function(D_d_1), 0.);
3911 EXPECT_FLOAT_EQ(var_6->
function(B_ggd_0_0_0), 0.);
3912 EXPECT_FLOAT_EQ(var_6->
function(B_ggd_0_0_1), 0.);
3913 EXPECT_FLOAT_EQ(var_6->
function(B_gd_0_0), 1.);
3914 EXPECT_FLOAT_EQ(var_6->
function(B_gd_0_1), 1.);
3915 EXPECT_FLOAT_EQ(var_6->
function(B_d_0), 0.);
3916 EXPECT_FLOAT_EQ(var_6->
function(B_d_1), 0.);
3917 EXPECT_FLOAT_EQ(var_6->
function(not_child), 0.);
3919 const Manager::Var* var_7 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, B:vartest, 3)");
3920 ASSERT_NE(var_7,
nullptr);
3921 EXPECT_FLOAT_EQ(var_7->
function(D_gd_0_0), 0.);
3922 EXPECT_FLOAT_EQ(var_7->
function(D_gd_0_1), 0.);
3923 EXPECT_FLOAT_EQ(var_7->
function(D_gd_1_0), 0.);
3924 EXPECT_FLOAT_EQ(var_7->
function(D_gd_1_1), 0.);
3925 EXPECT_FLOAT_EQ(var_7->
function(D_d_0), 0.);
3926 EXPECT_FLOAT_EQ(var_7->
function(D_d_1), 0.);
3927 EXPECT_FLOAT_EQ(var_7->
function(B_ggd_0_0_0), 1.);
3928 EXPECT_FLOAT_EQ(var_7->
function(B_ggd_0_0_1), 1.);
3929 EXPECT_FLOAT_EQ(var_7->
function(B_gd_0_0), 0.);
3930 EXPECT_FLOAT_EQ(var_7->
function(B_gd_0_1), 0.);
3931 EXPECT_FLOAT_EQ(var_7->
function(B_d_0), 0.);
3932 EXPECT_FLOAT_EQ(var_7->
function(B_d_1), 0.);
3933 EXPECT_FLOAT_EQ(var_7->
function(not_child), 0.);
3937 TEST_F(MetaVariableTest, isMCDescendantOfList)
3939 DataStore::Instance().setInitializeActive(
true);
3942 particles.registerInDataStore();
3943 mcParticles.registerInDataStore();
3944 particles.registerRelationTo(mcParticles);
3946 BList.registerInDataStore();
3948 BList->initialize(521,
"B:vartest");
3950 DList.registerInDataStore();
3952 DList->initialize(421,
"D0:vartest");
3953 DataStore::Instance().setInitializeActive(
false);
3954 TLorentzVector momentum;
3955 TLorentzVector momentum_0;
3956 TLorentzVector momentum_1;
3957 std::vector<int> daughterIndices;
3958 std::vector<int> grandDaughterIndices;
3959 std::vector<int> grandGrandDaughterIndices;
3960 std::vector<int> D_daughterIndices;
3961 std::vector<int> D_grandDaughterIndices_0;
3962 std::vector<int> D_grandDaughterIndices_1;
3982 mcg_ggd_0_0_0.
setPDG(211);
3983 mcg_ggd_0_0_1.
setPDG(-211);
3984 mcg_not_child.
setPDG(211);
3996 auto* mc_m = mcParticles[0];
3997 auto* mc_d_0 = mcParticles[1];
3998 auto* mc_d_1 = mcParticles[2];
3999 auto* mc_gd_0_0 = mcParticles[3];
4000 auto* mc_gd_0_1 = mcParticles[4];
4001 auto* mc_ggd_0_0_0 = mcParticles[5];
4002 auto* mc_ggd_0_0_1 = mcParticles[6];
4003 auto* mc_not_child = mcParticles[7];
4005 mc_m->setStatus(MCParticle::c_PrimaryParticle);
4006 mc_d_0->setStatus(MCParticle::c_PrimaryParticle);
4007 mc_d_1->setStatus(MCParticle::c_PrimaryParticle);
4008 mc_gd_0_0->setStatus(MCParticle::c_PrimaryParticle);
4009 mc_gd_0_1->setStatus(MCParticle::c_PrimaryParticle);
4010 mc_ggd_0_0_0->setStatus(MCParticle::c_PrimaryParticle);
4011 mc_ggd_0_0_1->setStatus(MCParticle::c_PrimaryParticle);
4012 mc_not_child->setStatus(MCParticle::c_PrimaryParticle);
4016 const Particle* D_gd_0_0 = particles.appendNew(TLorentzVector(0.0, 1, 1, 1), 211);
4017 const Particle* D_gd_0_1 = particles.appendNew(TLorentzVector(1.0, 1, 1, 1), -211);
4018 const Particle* D_gd_1_0 = particles.appendNew(TLorentzVector(2.0, 1, 1, 1), 211);
4019 const Particle* D_gd_1_1 = particles.appendNew(TLorentzVector(3.0, 1, 1, 1), -211);
4021 D_grandDaughterIndices_0.push_back(D_gd_0_0->
getArrayIndex());
4022 D_grandDaughterIndices_0.push_back(D_gd_0_1->
getArrayIndex());
4023 D_grandDaughterIndices_1.push_back(D_gd_1_0->
getArrayIndex());
4024 D_grandDaughterIndices_1.push_back(D_gd_1_1->
getArrayIndex());
4029 const Particle* D_d_0 = particles.appendNew(momentum_0, 310, Particle::c_Unflavored, D_grandDaughterIndices_0);
4030 const Particle* D_d_1 = particles.appendNew(momentum_1, 310, Particle::c_Unflavored, D_grandDaughterIndices_1);
4037 const Particle* D_m = particles.appendNew(momentum, 421, Particle::c_Unflavored, D_daughterIndices);
4038 DList->addParticle(D_m);
4041 const Particle* d_1 = particles.appendNew(TLorentzVector(0.0, 1, 1, 1), 211);
4042 const Particle* gd_0_1 = particles.appendNew(TLorentzVector(1.0, 1, 1, 1), -211);
4043 const Particle* ggd_0_0_0 = particles.appendNew(TLorentzVector(2.0, 1, 1, 1), 211);
4044 const Particle* ggd_0_0_1 = particles.appendNew(TLorentzVector(3.0, 1, 1, 1), -211);
4046 grandGrandDaughterIndices.push_back(ggd_0_0_0->
getArrayIndex());
4047 grandGrandDaughterIndices.push_back(ggd_0_0_1->
getArrayIndex());
4049 const Particle* gd_0_0 = particles.appendNew(momentum_0, 310, Particle::c_Unflavored, grandGrandDaughterIndices);
4054 const Particle* d_0 = particles.appendNew(momentum_1, -411, Particle::c_Unflavored, grandDaughterIndices);
4059 const Particle* m = particles.appendNew(momentum, 521, Particle::c_Unflavored, daughterIndices);
4060 BList->addParticle(m);
4063 const Particle* not_child = particles.appendNew(TLorentzVector(5.0, 1, 1, 1), 211);
4066 const Particle* not_child_2 = particles.appendNew(TLorentzVector(6.0, 1, 1, 1), 211);
4074 m->addRelationTo(mc_m);
4077 const Manager::Var* var_0 = Manager::Instance().getVariable(
"isMCDescendantOfList(B:vartest)");
4078 ASSERT_NE(var_0,
nullptr);
4079 EXPECT_FLOAT_EQ(var_0->
function(D_gd_0_0), 0.);
4080 EXPECT_FLOAT_EQ(var_0->
function(D_gd_0_1), 0.);
4081 EXPECT_FLOAT_EQ(var_0->
function(D_gd_1_0), 0.);
4082 EXPECT_FLOAT_EQ(var_0->
function(D_gd_1_1), 0.);
4083 EXPECT_FLOAT_EQ(var_0->
function(D_d_0), 0.);
4084 EXPECT_FLOAT_EQ(var_0->
function(D_d_1), 0.);
4085 EXPECT_FLOAT_EQ(var_0->
function(ggd_0_0_0), 1.);
4086 EXPECT_FLOAT_EQ(var_0->
function(ggd_0_0_1), 1.);
4087 EXPECT_FLOAT_EQ(var_0->
function(gd_0_0), 1.);
4088 EXPECT_FLOAT_EQ(var_0->
function(gd_0_1), 1.);
4089 EXPECT_FLOAT_EQ(var_0->
function(d_0), 1.);
4090 EXPECT_FLOAT_EQ(var_0->
function(d_1), 1.);
4091 EXPECT_FLOAT_EQ(var_0->
function(not_child), 0.);
4092 EXPECT_FLOAT_EQ(var_0->
function(not_child_2), 0.);
4094 const Manager::Var* var_1 = Manager::Instance().getVariable(
"isMCDescendantOfList(B:vartest, D0:vartest)");
4095 ASSERT_NE(var_1,
nullptr);
4096 EXPECT_FLOAT_EQ(var_1->
function(D_gd_0_0), 0.);
4097 EXPECT_FLOAT_EQ(var_1->
function(D_gd_0_1), 0.);
4098 EXPECT_FLOAT_EQ(var_1->
function(D_gd_1_0), 0.);
4099 EXPECT_FLOAT_EQ(var_1->
function(D_gd_1_1), 0.);
4100 EXPECT_FLOAT_EQ(var_1->
function(D_d_0), 0.);
4101 EXPECT_FLOAT_EQ(var_1->
function(D_d_1), 0.);
4102 EXPECT_FLOAT_EQ(var_1->
function(ggd_0_0_0), 1.);
4103 EXPECT_FLOAT_EQ(var_1->
function(ggd_0_0_1), 1.);
4104 EXPECT_FLOAT_EQ(var_1->
function(gd_0_0), 1.);
4105 EXPECT_FLOAT_EQ(var_1->
function(gd_0_1), 1.);
4106 EXPECT_FLOAT_EQ(var_1->
function(d_0), 1.);
4107 EXPECT_FLOAT_EQ(var_1->
function(d_1), 1.);
4108 EXPECT_FLOAT_EQ(var_1->
function(not_child), 0.);
4109 EXPECT_FLOAT_EQ(var_1->
function(not_child_2), 0.);
4111 const Manager::Var* var_2 = Manager::Instance().getVariable(
"isMCDescendantOfList(B:vartest, -1)");
4112 ASSERT_NE(var_2,
nullptr);
4113 EXPECT_FLOAT_EQ(var_2->
function(D_gd_0_0), 0.);
4114 EXPECT_FLOAT_EQ(var_2->
function(D_gd_0_1), 0.);
4115 EXPECT_FLOAT_EQ(var_2->
function(D_gd_1_0), 0.);
4116 EXPECT_FLOAT_EQ(var_2->
function(D_gd_1_1), 0.);
4117 EXPECT_FLOAT_EQ(var_2->
function(D_d_0), 0.);
4118 EXPECT_FLOAT_EQ(var_2->
function(D_d_1), 0.);
4119 EXPECT_FLOAT_EQ(var_2->
function(ggd_0_0_0), 1.);
4120 EXPECT_FLOAT_EQ(var_2->
function(ggd_0_0_1), 1.);
4121 EXPECT_FLOAT_EQ(var_2->
function(gd_0_0), 1.);
4122 EXPECT_FLOAT_EQ(var_2->
function(gd_0_1), 1.);
4123 EXPECT_FLOAT_EQ(var_2->
function(d_0), 1.);
4124 EXPECT_FLOAT_EQ(var_2->
function(d_1), 1.);
4125 EXPECT_FLOAT_EQ(var_2->
function(not_child), 0.);
4126 EXPECT_FLOAT_EQ(var_2->
function(not_child_2), 0.);
4128 const Manager::Var* var_3 = Manager::Instance().getVariable(
"isMCDescendantOfList(B:vartest, 1)");
4129 ASSERT_NE(var_3,
nullptr);
4130 EXPECT_FLOAT_EQ(var_3->
function(D_gd_0_0), 0.);
4131 EXPECT_FLOAT_EQ(var_3->
function(D_gd_0_1), 0.);
4132 EXPECT_FLOAT_EQ(var_3->
function(D_gd_1_0), 0.);
4133 EXPECT_FLOAT_EQ(var_3->
function(D_gd_1_1), 0.);
4134 EXPECT_FLOAT_EQ(var_3->
function(D_d_0), 0.);
4135 EXPECT_FLOAT_EQ(var_3->
function(D_d_1), 0.);
4136 EXPECT_FLOAT_EQ(var_3->
function(ggd_0_0_0), 0.);
4137 EXPECT_FLOAT_EQ(var_3->
function(ggd_0_0_1), 0.);
4138 EXPECT_FLOAT_EQ(var_3->
function(gd_0_0), 0.);
4139 EXPECT_FLOAT_EQ(var_3->
function(gd_0_1), 0.);
4140 EXPECT_FLOAT_EQ(var_3->
function(d_0), 1.);
4141 EXPECT_FLOAT_EQ(var_3->
function(d_1), 1.);
4142 EXPECT_FLOAT_EQ(var_3->
function(not_child), 0.);
4143 EXPECT_FLOAT_EQ(var_3->
function(not_child_2), 0.);
4145 const Manager::Var* var_4 = Manager::Instance().getVariable(
"isMCDescendantOfList(B:vartest, 2)");
4146 ASSERT_NE(var_4,
nullptr);
4147 EXPECT_FLOAT_EQ(var_4->
function(D_gd_0_0), 0.);
4148 EXPECT_FLOAT_EQ(var_4->
function(D_gd_0_1), 0.);
4149 EXPECT_FLOAT_EQ(var_4->
function(D_gd_1_0), 0.);
4150 EXPECT_FLOAT_EQ(var_4->
function(D_gd_1_1), 0.);
4151 EXPECT_FLOAT_EQ(var_4->
function(D_d_0), 0.);
4152 EXPECT_FLOAT_EQ(var_4->
function(D_d_1), 0.);
4153 EXPECT_FLOAT_EQ(var_4->
function(ggd_0_0_0), 0.);
4154 EXPECT_FLOAT_EQ(var_4->
function(ggd_0_0_1), 0.);
4155 EXPECT_FLOAT_EQ(var_4->
function(gd_0_0), 1.);
4156 EXPECT_FLOAT_EQ(var_4->
function(gd_0_1), 1.);
4157 EXPECT_FLOAT_EQ(var_4->
function(d_0), 0.);
4158 EXPECT_FLOAT_EQ(var_4->
function(d_1), 0.);
4159 EXPECT_FLOAT_EQ(var_4->
function(not_child), 0.);
4160 EXPECT_FLOAT_EQ(var_4->
function(not_child_2), 0.);
4163 const Manager::Var* var_5 = Manager::Instance().getVariable(
"isMCDescendantOfList(B:vartest, 3)");
4164 ASSERT_NE(var_5,
nullptr);
4165 EXPECT_FLOAT_EQ(var_5->
function(D_gd_0_0), 0.);
4166 EXPECT_FLOAT_EQ(var_5->
function(D_gd_0_1), 0.);
4167 EXPECT_FLOAT_EQ(var_5->
function(D_gd_1_0), 0.);
4168 EXPECT_FLOAT_EQ(var_5->
function(D_gd_1_1), 0.);
4169 EXPECT_FLOAT_EQ(var_5->
function(D_d_0), 0.);
4170 EXPECT_FLOAT_EQ(var_5->
function(D_d_1), 0.);
4171 EXPECT_FLOAT_EQ(var_5->
function(ggd_0_0_0), 1.);
4172 EXPECT_FLOAT_EQ(var_5->
function(ggd_0_0_1), 1.);
4173 EXPECT_FLOAT_EQ(var_5->
function(gd_0_0), 0.);
4174 EXPECT_FLOAT_EQ(var_5->
function(gd_0_1), 0.);
4175 EXPECT_FLOAT_EQ(var_5->
function(d_0), 0.);
4176 EXPECT_FLOAT_EQ(var_5->
function(d_1), 0.);
4177 EXPECT_FLOAT_EQ(var_5->
function(not_child), 0.);
4178 EXPECT_FLOAT_EQ(var_5->
function(not_child_2), 0.);
4185 class PIDVariableTest :
public ::testing::Test {
4188 void SetUp()
override
4190 DataStore::Instance().setInitializeActive(
true);
4197 peim.registerInDataStore();
4198 tfrs.registerInDataStore();
4199 mcparticles.registerInDataStore();
4200 likelihood.registerInDataStore();
4201 particles.registerInDataStore();
4202 tracks.registerInDataStore();
4203 particles.registerRelationTo(likelihood);
4204 tracks.registerRelationTo(likelihood);
4205 DataStore::Instance().setInitializeActive(
false);
4209 void TearDown()
override
4211 DataStore::Instance().reset();
4215 TEST_F(PIDVariableTest, LogLikelihood)
4224 const float pValue = 0.5;
4225 const float bField = 1.5;
4227 TMatrixDSym cov6(6);
4229 TVector2 d(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
4230 TVector2 pt(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
4231 d.Set(d.X(), -(d.X()*pt.Px()) / pt.Py());
4233 TVector3 position(d.X(), d.Y(), generator.Uniform(-1, 1));
4234 TVector3 momentum(pt.Px(), pt.Py(), generator.Uniform(-1, 1));
4236 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
4237 tfrs.
appendNew(position, momentum, cov6, charge, Const::electron, pValue, bField, CDCValue, 16777215, 0);
4240 Track* allTrack = tracks.appendNew(mytrack);
4241 Track* noSVDTrack = tracks.appendNew(mytrack);
4242 Track* noSVDNoTOPTrack = tracks.appendNew(mytrack);
4243 Track* noPIDTrack = tracks.appendNew(mytrack);
4244 Track* dEdxTrack = tracks.appendNew(mytrack);
4251 lAll->setLogLikelihood(Const::ARICH, Const::electron, 0.16);
4252 lAll->setLogLikelihood(Const::ECL, Const::electron, 0.14);
4253 lAll->setLogLikelihood(Const::CDC, Const::electron, 0.12);
4254 lAll->setLogLikelihood(Const::SVD, Const::electron, 0.1);
4255 lAll->setLogLikelihood(Const::KLM, Const::electron, 0.01);
4257 lAll->setLogLikelihood(Const::TOP, Const::muon, 0.5);
4258 lAll->setLogLikelihood(Const::ARICH, Const::muon, 0.52);
4259 lAll->setLogLikelihood(Const::ECL, Const::muon, 0.54);
4260 lAll->setLogLikelihood(Const::CDC, Const::muon, 0.56);
4261 lAll->setLogLikelihood(Const::SVD, Const::muon, 0.58);
4262 lAll->setLogLikelihood(Const::KLM, Const::muon, 0.8);
4264 lAll->setLogLikelihood(Const::TOP, Const::pion, 0.2);
4265 lAll->setLogLikelihood(Const::ARICH, Const::pion, 0.22);
4266 lAll->setLogLikelihood(Const::ECL, Const::pion, 0.24);
4267 lAll->setLogLikelihood(Const::CDC, Const::pion, 0.26);
4268 lAll->setLogLikelihood(Const::SVD, Const::pion, 0.28);
4269 lAll->setLogLikelihood(Const::KLM, Const::pion, 0.2);
4271 lAll->setLogLikelihood(Const::TOP, Const::kaon, 0.3);
4272 lAll->setLogLikelihood(Const::ARICH, Const::kaon, 0.32);
4273 lAll->setLogLikelihood(Const::ECL, Const::kaon, 0.34);
4274 lAll->setLogLikelihood(Const::CDC, Const::kaon, 0.36);
4275 lAll->setLogLikelihood(Const::SVD, Const::kaon, 0.38);
4276 lAll->setLogLikelihood(Const::KLM, Const::kaon, 0.2);
4278 lAll->setLogLikelihood(Const::TOP, Const::proton, 0.4);
4279 lAll->setLogLikelihood(Const::ARICH, Const::proton, 0.42);
4280 lAll->setLogLikelihood(Const::ECL, Const::proton, 0.44);
4281 lAll->setLogLikelihood(Const::CDC, Const::proton, 0.46);
4282 lAll->setLogLikelihood(Const::SVD, Const::proton, 0.48);
4283 lAll->setLogLikelihood(Const::KLM, Const::proton, 0.02);
4285 lAll->setLogLikelihood(Const::TOP, Const::deuteron, 0.6);
4286 lAll->setLogLikelihood(Const::ARICH, Const::deuteron, 0.62);
4287 lAll->setLogLikelihood(Const::ECL, Const::deuteron, 0.64);
4288 lAll->setLogLikelihood(Const::CDC, Const::deuteron, 0.66);
4289 lAll->setLogLikelihood(Const::SVD, Const::deuteron, 0.68);
4290 lAll->setLogLikelihood(Const::KLM, Const::deuteron, 0.02);
4293 auto* lAllNoSVD = likelihood.
appendNew();
4295 auto* lAllNoSVDNoTOP = likelihood.
appendNew();
4297 for (
unsigned int iDet(0); iDet < Const::PIDDetectors::c_size; iDet++) {
4298 const auto det = Const::PIDDetectors::c_set[iDet];
4299 for (
const auto& hypo : Const::chargedStableSet) {
4300 if (det != Const::SVD) {
4302 if (det != Const::TOP) {
4303 lAllNoSVDNoTOP->setLogLikelihood(det, hypo, lAll->getLogL(hypo, det));
4312 ldEdx->setLogLikelihood(Const::SVD, Const::electron, 0.1);
4314 ldEdx->setLogLikelihood(Const::CDC, Const::pion, 0.26);
4315 ldEdx->setLogLikelihood(Const::SVD, Const::pion, 0.28);
4317 ldEdx->setLogLikelihood(Const::CDC, Const::kaon, 0.36);
4318 ldEdx->setLogLikelihood(Const::SVD, Const::kaon, 0.38);
4320 ldEdx->setLogLikelihood(Const::CDC, Const::proton, 0.46);
4321 ldEdx->setLogLikelihood(Const::SVD, Const::proton, 0.48);
4323 ldEdx->setLogLikelihood(Const::CDC, Const::muon, 0.56);
4324 ldEdx->setLogLikelihood(Const::SVD, Const::muon, 0.58);
4326 ldEdx->setLogLikelihood(Const::CDC, Const::deuteron, 0.66);
4327 ldEdx->setLogLikelihood(Const::SVD, Const::deuteron, 0.68);
4343 auto* particleAll = particles.appendNew(allTrack, Const::pion);
4344 auto* particleNoSVD = particles.appendNew(noSVDTrack, Const::pion);
4345 auto* particleNoSVDNoTOP = particles.appendNew(noSVDNoTOPTrack, Const::pion);
4346 auto* particledEdx = particles.appendNew(dEdxTrack, Const::pion);
4347 auto* particleNoID = particles.appendNew(noPIDTrack, Const::pion);
4349 double numsumexp = std::exp(0.71) + std::exp(3.5) + std::exp(1.4) + std::exp(1.9) + std::exp(2.22) + std::exp(3.22);
4350 double numsumexp_noSVD = std::exp(0.61) + std::exp(2.92) + std::exp(1.12) + std::exp(1.52) + std::exp(1.74) + std::exp(2.54);
4351 double numsumexp_noSVDNoTOP = std::exp(0.43) + std::exp(2.42) + std::exp(0.92) + std::exp(1.22) + std::exp(1.34) + std::exp(1.94);
4354 EXPECT_FLOAT_EQ(electronID(particleNoSVD), std::exp(0.61) / numsumexp_noSVD);
4355 EXPECT_FLOAT_EQ(muonID(particleNoSVD), std::exp(2.92) / numsumexp_noSVD);
4356 EXPECT_FLOAT_EQ(pionID(particleNoSVD), std::exp(1.12) / numsumexp_noSVD);
4357 EXPECT_FLOAT_EQ(kaonID(particleNoSVD), std::exp(1.52) / numsumexp_noSVD);
4358 EXPECT_FLOAT_EQ(protonID(particleNoSVD), std::exp(1.74) / numsumexp_noSVD);
4359 EXPECT_FLOAT_EQ(deuteronID(particleNoSVD), std::exp(2.54) / numsumexp_noSVD);
4362 auto* particleElectronNoSVD = particles.appendNew(noSVDTrack, Const::electron);
4363 auto* particleMuonNoSVD = particles.appendNew(noSVDTrack, Const::muon);
4364 auto* particleKaonNoSVD = particles.appendNew(noSVDTrack, Const::kaon);
4365 auto* particleProtonNoSVD = particles.appendNew(noSVDTrack, Const::proton);
4366 auto* particleDeuteronNoSVD = particles.appendNew(noSVDTrack, Const::deuteron);
4368 EXPECT_FLOAT_EQ(particleID(particleNoSVD), std::exp(1.12) / numsumexp_noSVD);
4369 EXPECT_FLOAT_EQ(particleID(particleElectronNoSVD), std::exp(0.61) / numsumexp_noSVD);
4370 EXPECT_FLOAT_EQ(particleID(particleMuonNoSVD), std::exp(2.92) / numsumexp_noSVD);
4371 EXPECT_FLOAT_EQ(particleID(particleKaonNoSVD), std::exp(1.52) / numsumexp_noSVD);
4372 EXPECT_FLOAT_EQ(particleID(particleProtonNoSVD), std::exp(1.74) / numsumexp_noSVD);
4373 EXPECT_FLOAT_EQ(particleID(particleDeuteronNoSVD), std::exp(2.54) / numsumexp_noSVD);
4376 EXPECT_FLOAT_EQ(electronID_noTOP(particleNoSVDNoTOP), std::exp(0.43) / numsumexp_noSVDNoTOP);
4379 double numsumexp_had = std::exp(1.4) + std::exp(1.9) + std::exp(2.22);
4380 EXPECT_FLOAT_EQ(pionID_SVD(particleAll), std::exp(1.4) / numsumexp_had);
4381 EXPECT_FLOAT_EQ(kaonID_SVD(particleAll), std::exp(1.9) / numsumexp_had);
4382 EXPECT_FLOAT_EQ(protonID_SVD(particleAll), std::exp(2.22) / numsumexp_had);
4383 std::vector<double> v_pi_K {211., 321.};
4384 std::vector<double> v_pi_p {211., 2212.};
4385 std::vector<double> v_K_p {321., 2212.};
4386 EXPECT_FLOAT_EQ(binaryPID_SVD(particleAll, v_pi_K), std::exp(1.4) / (std::exp(1.4) + std::exp(1.9)));
4387 EXPECT_FLOAT_EQ(binaryPID_SVD(particleAll, v_pi_p), std::exp(1.4) / (std::exp(1.4) + std::exp(2.22)));
4388 EXPECT_FLOAT_EQ(binaryPID_SVD(particleAll, v_K_p), std::exp(1.9) / (std::exp(1.9) + std::exp(2.22)));
4391 EXPECT_TRUE(std::isnan(electronID(particleNoID)));
4392 EXPECT_TRUE(std::isnan(muonID(particleNoID)));
4393 EXPECT_TRUE(std::isnan(pionID(particleNoID)));
4394 EXPECT_TRUE(std::isnan(kaonID(particleNoID)));
4395 EXPECT_TRUE(std::isnan(protonID(particleNoID)));
4396 EXPECT_TRUE(std::isnan(deuteronID(particleNoID)));
4399 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(11, TOP)")->
function(particleAll), 0.18);
4400 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(11, ALL)")->
function(particleAll), 0.71);
4401 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(2212, TOP, CDC)")->
function(particleAll), 0.86);
4404 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidProbabilityExpert(1000010020, ALL)")->
function(particleAll),
4405 std::exp(3.22) / numsumexp);
4406 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidProbabilityExpert(2212, ALL)")->
function(particleAll),
4407 std::exp(2.22) / numsumexp);
4408 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidProbabilityExpert(211, ALL)")->
function(particleAll),
4409 std::exp(1.4) / numsumexp);
4410 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidProbabilityExpert(321, ALL)")->
function(particleAll),
4411 std::exp(1.9) / numsumexp);
4412 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidProbabilityExpert(13, ALL)")->
function(particleAll),
4413 std::exp(3.5) / numsumexp);
4414 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidProbabilityExpert(11, ALL)")->
function(particleAll),
4415 std::exp(0.71) / numsumexp);
4416 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidProbabilityExpert(211, ALL)")->
function(particledEdx),
4417 std::exp(0.54) / (std::exp(0.22) + std::exp(1.14) + std::exp(0.54) + std::exp(0.74) + std::exp(0.94) + std::exp(1.34)));
4418 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidProbabilityExpert(211, ALL)")->
function(particledEdx),
4419 Manager::Instance().getVariable(
"pidProbabilityExpert(211, CDC, SVD)")->
function(particleAll));
4420 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidProbabilityExpert(211, CDC)")->
function(particledEdx),
4421 Manager::Instance().getVariable(
"pidProbabilityExpert(211, CDC)")->
function(particleAll));
4422 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidProbabilityExpert(321, CDC)")->
function(particleAll),
4423 std::exp(0.36) / (std::exp(0.12) + std::exp(0.26) + std::exp(0.36) + std::exp(0.46) + std::exp(0.56) + std::exp(0.66)));
4426 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, ALL)")->
function(particleAll),
4427 1.0 / (1.0 + std::exp(2.22 - 1.9)));
4428 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, ALL)")->
function(particledEdx),
4429 1.0 / (1.0 + std::exp(0.94 - 0.74)));
4430 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, CDC, SVD)")->
function(particleAll),
4431 1.0 / (1.0 + std::exp(0.94 - 0.74)));
4434 EXPECT_TRUE(std::isnan(Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, KLM)")->
function(particledEdx)));
4435 EXPECT_TRUE(std::isnan(Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(11, TOP, CDC, SVD)")->
function(particleNoID)));
4436 EXPECT_TRUE(std::isnan(Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(11, TOP)")->
function(particledEdx)));
4437 EXPECT_TRUE(std::isnan(Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, KLM)")->
function(particledEdx)));
4438 EXPECT_TRUE(std::isnan(Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, ECL, TOP, ARICH)")->
function(
4440 EXPECT_FALSE(std::isnan(Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, ECL, TOP, ARICH, SVD)")->
function(
4443 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidMostLikelyPDG()")->
function(particledEdx), 1.00001e+09);
4444 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidMostLikelyPDG(0.5, 0.1, 0.1, 0.1, 0.1, 0.1)")->
function(particledEdx), 11);
4445 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidMostLikelyPDG(0.1, 0.5, 0.1, 0.1, 0.1, 0.1)")->
function(particledEdx), 13);
4446 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidMostLikelyPDG(0.1, 0.1, 0.5, 0.1, 0.1, 0.1)")->
function(particledEdx), 211);
4447 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidMostLikelyPDG(0.1, 0.1, 0.1, 0.5, 0.1, 0.1)")->
function(particledEdx), 321);
4448 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidMostLikelyPDG(0.1, 0.1, 0.1, 0.1, 0.5, 0.1)")->
function(particledEdx), 2212);
4449 EXPECT_FLOAT_EQ(Manager::Instance().getVariable(
"pidMostLikelyPDG(0, 1., 0, 0, 0, 0)")->
function(particledEdx), 13);
4452 TEST_F(PIDVariableTest, MissingLikelihood)
4461 const float pValue = 0.5;
4462 const float bField = 1.5;
4464 TMatrixDSym cov6(6);
4466 TVector2 d(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
4467 TVector2 pt(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
4468 d.Set(d.X(), -(d.X()*pt.Px()) / pt.Py());
4470 TVector3 position(d.X(), d.Y(), generator.Uniform(-1, 1));
4471 TVector3 momentum(pt.Px(), pt.Py(), generator.Uniform(-1, 1));
4473 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
4474 tfrs.
appendNew(position, momentum, cov6, charge, Const::electron, pValue, bField, CDCValue, 16777215, 0);
4477 Track* savedTrack1 = tracks.appendNew(mytrack);
4478 Track* savedTrack2 = tracks.appendNew(mytrack);
4479 Track* savedTrack3 = tracks.appendNew(mytrack);
4480 Track* savedTrack4 = tracks.appendNew(mytrack);
4483 l1->setLogLikelihood(Const::TOP, Const::electron, 0.18);
4484 l1->setLogLikelihood(Const::ECL, Const::electron, 0.14);
4487 auto* electron = particles.appendNew(savedTrack1, Const::electron);
4491 l2->setLogLikelihood(Const::ARICH, Const::pion, 0.22);
4492 l2->setLogLikelihood(Const::ECL, Const::pion, 0.24);
4493 l2->setLogLikelihood(Const::CDC, Const::pion, 0.26);
4494 l2->setLogLikelihood(Const::SVD, Const::pion, 0.28);
4497 auto* pion = particles.appendNew(savedTrack2, Const::pion);
4501 l3->setLogLikelihood(Const::ARICH, Const::kaon, 0.32);
4504 auto* kaon = particles.appendNew(savedTrack3, Const::kaon);
4508 l4->setLogLikelihood(Const::ECL, Const::proton, 0.44);
4509 l4->setLogLikelihood(Const::CDC, Const::proton, 0.46);
4510 l4->setLogLikelihood(Const::SVD, Const::proton, 0.48);
4513 auto* proton = particles.appendNew(savedTrack4, Const::proton);
4515 const Manager::Var* varMissECL = Manager::Instance().getVariable(
"pidMissingProbabilityExpert(ECL)");
4516 const Manager::Var* varMissTOP = Manager::Instance().getVariable(
"pidMissingProbabilityExpert(TOP)");
4517 const Manager::Var* varMissARICH = Manager::Instance().getVariable(
"pidMissingProbabilityExpert(ARICH)");
4520 EXPECT_FLOAT_EQ(varMissTOP->
function(electron), 0.0);
4521 EXPECT_FLOAT_EQ(varMissTOP->
function(pion), 0.0);
4522 EXPECT_FLOAT_EQ(varMissTOP->
function(kaon), 0.0);
4523 EXPECT_FLOAT_EQ(varMissTOP->
function(proton), 1.0);
4525 EXPECT_FLOAT_EQ(varMissARICH->
function(electron), 1.0);
4526 EXPECT_FLOAT_EQ(varMissARICH->
function(pion), 0.0);
4527 EXPECT_FLOAT_EQ(varMissARICH->
function(kaon), 0.0);
4528 EXPECT_FLOAT_EQ(varMissARICH->
function(proton), 0.0);
4530 EXPECT_FLOAT_EQ(varMissECL->
function(electron), 0.0);
4531 EXPECT_FLOAT_EQ(varMissECL->
function(pion), 0.0);
4532 EXPECT_FLOAT_EQ(varMissECL->
function(kaon), 1.0);
4533 EXPECT_FLOAT_EQ(varMissECL->
function(proton), 0.0);
4536 class FlightInfoTest :
public ::testing::Test {
4539 void SetUp()
override
4541 DataStore::Instance().setInitializeActive(
true);
4546 particles.registerRelationTo(mcParticles);
4548 DataStore::Instance().setInitializeActive(
false);
4561 mcKs.
setStatus(MCParticle::c_PrimaryParticle);
4570 mcDp.
setStatus(MCParticle::c_PrimaryParticle);
4574 TLorentzVector momentum;
4575 TMatrixFSym error(7);
4582 error(5, 5) = 0.00875;
4584 Particle pi(TLorentzVector(1.59607, 1.19705, 0, 2), 211);
4585 momentum += pi.get4Vector();
4586 Particle* newpi = particles.appendNew(pi);
4589 Particle Ks(TLorentzVector(1.164, 1.55200, 0, 2), 310, Particle::c_Unflavored, Particle::c_Composite, 0);
4590 Ks.setVertex(TVector3(4.0, 5.0, 0.0));
4591 Ks.setMomentumVertexErrorMatrix(error);
4592 momentum += Ks.get4Vector();
4593 Ks.addExtraInfo(
"prodVertX", 1.0);
4594 Ks.addExtraInfo(
"prodVertY", 1.0);
4595 Ks.addExtraInfo(
"prodVertZ", 0.0);
4596 Ks.addExtraInfo(
"prodVertSxx", 0.04);
4597 Ks.addExtraInfo(
"prodVertSxy", 0.0);
4598 Ks.addExtraInfo(
"prodVertSxz", 0.0);
4599 Ks.addExtraInfo(
"prodVertSyx", 0.0);
4600 Ks.addExtraInfo(
"prodVertSyy", 0.00875);
4601 Ks.addExtraInfo(
"prodVertSyz", 0.0);
4602 Ks.addExtraInfo(
"prodVertSzx", 0.0);
4603 Ks.addExtraInfo(
"prodVertSzy", 0.0);
4604 Ks.addExtraInfo(
"prodVertSzz", 0.01);
4605 Particle* newKs = particles.appendNew(Ks);
4609 Particle Dp(momentum, 411, Particle::c_Flavored, Particle::c_Composite, 0);
4610 Dp.appendDaughter(newpi);
4611 Dp.appendDaughter(newKs);
4612 TVector3 motherVtx(1.0, 1.0, 0.0);
4613 Dp.setVertex(motherVtx);
4614 Dp.setMomentumVertexErrorMatrix(error);
4615 Dp.addExtraInfo(
"prodVertX", 0.0);
4616 Dp.addExtraInfo(
"prodVertY", 1.0);
4617 Dp.addExtraInfo(
"prodVertZ", -2.0);
4618 Dp.addExtraInfo(
"prodVertSxx", 0.04);
4619 Dp.addExtraInfo(
"prodVertSxy", 0.0);
4620 Dp.addExtraInfo(
"prodVertSxz", 0.0);
4621 Dp.addExtraInfo(
"prodVertSyx", 0.0);
4622 Dp.addExtraInfo(
"prodVertSyy", 0.01);
4623 Dp.addExtraInfo(
"prodVertSyz", 0.0);
4624 Dp.addExtraInfo(
"prodVertSzx", 0.0);
4625 Dp.addExtraInfo(
"prodVertSzy", 0.0);
4626 Dp.addExtraInfo(
"prodVertSzz", 0.1575);
4627 Particle* newDp = particles.appendNew(Dp);
4633 void TearDown()
override
4635 DataStore::Instance().reset();
4638 TEST_F(FlightInfoTest, flightDistance)
4641 const Particle* newKs = particles[1];
4643 const Manager::Var* var = Manager::Instance().getVariable(
"flightDistance");
4644 ASSERT_NE(var,
nullptr);
4645 EXPECT_FLOAT_EQ(var->function(newKs), 5.0);
4647 TEST_F(FlightInfoTest, flightDistanceErr)
4650 const Particle* newKs = particles[1];
4652 const Manager::Var* var = Manager::Instance().getVariable(
"flightDistanceErr");
4653 ASSERT_NE(var,
nullptr);
4654 EXPECT_GT(var->function(newKs), 0.0);
4656 TEST_F(FlightInfoTest, flightTime)
4659 const Particle* newKs = particles[1];
4661 const Manager::Var* var = Manager::Instance().getVariable(
"flightTime");
4662 ASSERT_NE(var,
nullptr);
4663 EXPECT_FLOAT_EQ(var->function(newKs), 5.0 / Const::speedOfLight * newKs->
getPDGMass() / newKs->
getP());
4666 TEST_F(FlightInfoTest, flightTimeErr)
4669 const Particle* newKs = particles[1];
4671 const Manager::Var* var = Manager::Instance().getVariable(
"flightTimeErr");
4672 ASSERT_NE(var,
nullptr);
4673 EXPECT_GT(var->function(newKs), 0.0);
4677 TEST_F(FlightInfoTest, flightDistanceOfDaughter)
4680 const Particle* newDp = particles[2];
4682 const Manager::Var* var = Manager::Instance().getVariable(
"flightDistanceOfDaughter(1)");
4683 ASSERT_NE(var,
nullptr);
4684 EXPECT_FLOAT_EQ(var->function(newDp), 5.0);
4686 var = Manager::Instance().getVariable(
"flightDistanceOfDaughter(3)");
4687 ASSERT_NE(var,
nullptr);
4688 EXPECT_TRUE(std::isnan(var->function(newDp)));
4690 TEST_F(FlightInfoTest, flightDistanceOfDaughterErr)
4693 const Particle* newDp = particles[2];
4695 const Manager::Var* var = Manager::Instance().getVariable(
"flightDistanceOfDaughterErr(1)");
4696 ASSERT_NE(var,
nullptr);
4697 EXPECT_GT(var->function(newDp), 0.0);
4699 var = Manager::Instance().getVariable(
"flightDistanceOfDaughterErr(3)");
4700 ASSERT_NE(var,
nullptr);
4701 EXPECT_TRUE(std::isnan(var->function(newDp)));
4703 TEST_F(FlightInfoTest, flightTimeOfDaughter)
4706 const Particle* newDp = particles[2];
4708 const Manager::Var* var = Manager::Instance().getVariable(
"flightTimeOfDaughter(1)");
4709 ASSERT_NE(var,
nullptr);
4712 EXPECT_FLOAT_EQ(var->function(newDp), 5.0 / Const::speedOfLight * Ks->
getPDGMass() / Ks->
getP());
4714 var = Manager::Instance().getVariable(
"flightTimeOfDaughter(3)");
4715 ASSERT_NE(var,
nullptr);
4716 EXPECT_TRUE(std::isnan(var->function(newDp)));
4718 TEST_F(FlightInfoTest, flightTimeOfDaughterErr)
4721 const Particle* newDp = particles[2];
4723 const Manager::Var* var = Manager::Instance().getVariable(
"flightTimeOfDaughterErr(1)");
4724 ASSERT_NE(var,
nullptr);
4725 EXPECT_GT(var->function(newDp), 0.0);
4727 var = Manager::Instance().getVariable(
"flightTimeOfDaughterErr(3)");
4728 ASSERT_NE(var,
nullptr);
4729 EXPECT_TRUE(std::isnan(var->function(newDp)));
4731 TEST_F(FlightInfoTest, mcFlightDistanceOfDaughter)
4734 const Particle* newDp = particles[2];
4736 const Manager::Var* var = Manager::Instance().getVariable(
"mcFlightDistanceOfDaughter(1)");
4737 ASSERT_NE(var,
nullptr);
4739 EXPECT_FLOAT_EQ(var->function(newDp), 5.0);
4741 var = Manager::Instance().getVariable(
"mcFlightDistanceOfDaughter(3)");
4742 ASSERT_NE(var,
nullptr);
4743 EXPECT_TRUE(std::isnan(var->function(newDp)));
4745 TEST_F(FlightInfoTest, mcFlightTimeOfDaughter)
4748 const Particle* newDp = particles[2];
4750 const Manager::Var* var = Manager::Instance().getVariable(
"mcFlightTimeOfDaughter(1)");
4751 ASSERT_NE(var,
nullptr);
4756 EXPECT_FLOAT_EQ(var->function(newDp), Ks->getLifetime() / Ks->
getEnergy()*Ks->
getMass());
4758 var = Manager::Instance().getVariable(
"mcFlightTimeOfDaughter(3)");
4759 ASSERT_NE(var,
nullptr);
4760 EXPECT_TRUE(std::isnan(var->function(newDp)));
4763 TEST_F(FlightInfoTest, vertexDistance)
4766 const Particle* newKS = particles[1];
4768 const Manager::Var* var = Manager::Instance().getVariable(
"vertexDistance");
4769 ASSERT_NE(var,
nullptr);
4770 EXPECT_FLOAT_EQ(var->function(newKS), 5.0);
4773 TEST_F(FlightInfoTest, vertexDistanceError)
4776 const Particle* newKS = particles[1];
4778 const Manager::Var* var = Manager::Instance().getVariable(
"vertexDistanceErr");
4779 ASSERT_NE(var,
nullptr);
4780 EXPECT_FLOAT_EQ(var->function(newKS), 0.2);
4783 TEST_F(FlightInfoTest, vertexDistanceSignificance)
4786 const Particle* newKS = particles[1];
4788 const Manager::Var* var = Manager::Instance().getVariable(
"vertexDistanceSignificance");
4789 ASSERT_NE(var,
nullptr);
4790 EXPECT_FLOAT_EQ(var->function(newKS), 25);
4793 TEST_F(FlightInfoTest, vertexDistanceOfDaughter)
4796 const Particle* newDp = particles[2];
4798 const Manager::Var* var = Manager::Instance().getVariable(
"vertexDistanceOfDaughter(1, noIP)");
4799 ASSERT_NE(var,
nullptr);
4800 EXPECT_FLOAT_EQ(var->function(newDp), 5.0);
4802 var = Manager::Instance().getVariable(
"vertexDistanceOfDaughter(1)");
4803 ASSERT_NE(var,
nullptr);
4804 EXPECT_FLOAT_EQ(var->function(newDp), 6.0);
4806 var = Manager::Instance().getVariable(
"vertexDistanceOfDaughter(2)");
4807 ASSERT_NE(var,
nullptr);
4808 EXPECT_TRUE(std::isnan(var->function(newDp)));
4811 TEST_F(FlightInfoTest, vertexDistanceOfDaughterError)
4814 const Particle* newDp = particles[2];
4816 const Manager::Var* var = Manager::Instance().getVariable(
"vertexDistanceOfDaughterErr(1, noIP)");
4817 ASSERT_NE(var,
nullptr);
4818 EXPECT_FLOAT_EQ(var->function(newDp), 0.2);
4820 var = Manager::Instance().getVariable(
"vertexDistanceOfDaughterErr(1)");
4821 ASSERT_NE(var,
nullptr);
4822 EXPECT_FLOAT_EQ(var->function(newDp), 0.25);
4825 TEST_F(FlightInfoTest, vertexDistanceOfDaughterSignificance)
4828 const Particle* newDp = particles[2];
4830 const Manager::Var* var = Manager::Instance().getVariable(
"vertexDistanceOfDaughterSignificance(1, noIP)");
4831 ASSERT_NE(var,
nullptr);
4832 EXPECT_FLOAT_EQ(var->function(newDp), 25);
4834 var = Manager::Instance().getVariable(
"vertexDistanceOfDaughterSignificance(1)");
4835 ASSERT_NE(var,
nullptr);
4836 EXPECT_FLOAT_EQ(var->function(newDp), 24);
4839 class VertexVariablesTest :
public ::testing::Test {
4842 void SetUp()
override
4844 DataStore::Instance().setInitializeActive(
true);
4849 particles.registerRelationTo(mcParticles);
4851 DataStore::Instance().setInitializeActive(
false);
4861 mcKs.
setStatus(MCParticle::c_PrimaryParticle);
4864 Particle Ks(TLorentzVector(1.164, 1.55200, 0, 2), 310);
4878 Particle* newKs = particles.appendNew(Ks);
4883 void TearDown()
override
4885 DataStore::Instance().reset();
4890 TEST_F(VertexVariablesTest, mcDecayVertexX)
4893 const Particle* newKs = particles[0];
4895 const Manager::Var* var = Manager::Instance().getVariable(
"mcDecayVertexX");
4896 ASSERT_NE(var,
nullptr);
4897 EXPECT_FLOAT_EQ(var->function(newKs), 4.0);
4900 TEST_F(VertexVariablesTest, mcDecayVertexY)
4903 const Particle* newKs = particles[0];
4905 const Manager::Var* var = Manager::Instance().getVariable(
"mcDecayVertexY");
4906 ASSERT_NE(var,
nullptr);
4907 EXPECT_FLOAT_EQ(var->function(newKs), 5.0);
4910 TEST_F(VertexVariablesTest, mcDecayVertexZ)
4913 const Particle* newKs = particles[0];
4915 const Manager::Var* var = Manager::Instance().getVariable(
"mcDecayVertexZ");
4916 ASSERT_NE(var,
nullptr);
4917 EXPECT_FLOAT_EQ(var->function(newKs), 0.0);
4921 TEST_F(VertexVariablesTest, mcDecayVertexFromIPDistance)
4924 const Particle* newKs = particles[0];
4926 const Manager::Var* var = Manager::Instance().getVariable(
"mcDecayVertexFromIPDistance");
4927 ASSERT_NE(var,
nullptr);
4928 EXPECT_FLOAT_EQ(var->function(newKs), sqrt(4.0 * 4.0 + 5.0 * 5.0));
4931 TEST_F(VertexVariablesTest, mcDecayVertexRho)
4934 const Particle* newKs = particles[0];
4936 const Manager::Var* var = Manager::Instance().getVariable(
"mcDecayVertexRho");
4937 ASSERT_NE(var,
nullptr);
4938 EXPECT_FLOAT_EQ(var->function(newKs), sqrt(4.0 * 4.0 + 5.0 * 5.0));
4941 TEST_F(VertexVariablesTest, mcProductionVertexX)
4944 const Particle* newKs = particles[0];
4946 const Manager::Var* var = Manager::Instance().getVariable(
"mcProductionVertexX");
4947 ASSERT_NE(var,
nullptr);
4948 EXPECT_FLOAT_EQ(var->function(newKs), 1.0);
4951 TEST_F(VertexVariablesTest, mcProductionVertexY)
4954 const Particle* newKs = particles[0];
4956 const Manager::Var* var = Manager::Instance().getVariable(
"mcProductionVertexY");
4957 ASSERT_NE(var,
nullptr);
4958 EXPECT_FLOAT_EQ(var->function(newKs), 2.0);
4961 TEST_F(VertexVariablesTest, mcProductionVertexZ)
4964 const Particle* newKs = particles[0];
4966 const Manager::Var* var = Manager::Instance().getVariable(
"mcProductionVertexZ");
4967 ASSERT_NE(var,
nullptr);
4968 EXPECT_FLOAT_EQ(var->function(newKs), 3.0);
4973 TEST_F(VertexVariablesTest, prodVertexX)
4976 const Particle* newKs = particles[0];
4978 const Manager::Var* var = Manager::Instance().getVariable(
"prodVertexX");
4979 ASSERT_NE(var,
nullptr);
4980 EXPECT_FLOAT_EQ(var->function(newKs), 1.0);
4982 TEST_F(VertexVariablesTest, prodVertexY)
4985 const Particle* newKs = particles[0];
4987 const Manager::Var* var = Manager::Instance().getVariable(
"prodVertexY");
4988 ASSERT_NE(var,
nullptr);
4989 EXPECT_FLOAT_EQ(var->function(newKs), 2.0);
4991 TEST_F(VertexVariablesTest, prodVertexZ)
4994 const Particle* newKs = particles[0];
4996 const Manager::Var* var = Manager::Instance().getVariable(
"prodVertexZ");
4997 ASSERT_NE(var,
nullptr);
4998 EXPECT_FLOAT_EQ(var->function(newKs), 3.0);
5003 TEST_F(VertexVariablesTest, prodVertexCov)
5006 const Particle* newKs = particles[0];
5009 const Manager::Var* var = Manager::Instance().getVariable(
"prodVertexCov(0,0)");
5010 ASSERT_NE(var,
nullptr);
5011 EXPECT_FLOAT_EQ(var->function(newKs), 0.1);
5012 var = Manager::Instance().getVariable(
"prodVertexCov(0,1)");
5013 EXPECT_FLOAT_EQ(var->function(newKs), 0.2);
5014 var = Manager::Instance().getVariable(
"prodVertexCov(0,2)");
5015 EXPECT_FLOAT_EQ(var->function(newKs), 0.3);
5016 var = Manager::Instance().getVariable(
"prodVertexCov(1,0)");
5017 EXPECT_FLOAT_EQ(var->function(newKs), 0.4);
5018 var = Manager::Instance().getVariable(
"prodVertexCov(1,1)");
5019 EXPECT_FLOAT_EQ(var->function(newKs), 0.5);
5020 var = Manager::Instance().getVariable(
"prodVertexCov(1,2)");
5021 EXPECT_FLOAT_EQ(var->function(newKs), 0.6);
5022 var = Manager::Instance().getVariable(
"prodVertexCov(2,0)");
5023 EXPECT_FLOAT_EQ(var->function(newKs), 0.7);
5024 var = Manager::Instance().getVariable(
"prodVertexCov(2,1)");
5025 EXPECT_FLOAT_EQ(var->function(newKs), 0.8);
5026 var = Manager::Instance().getVariable(
"prodVertexCov(2,2)");
5027 EXPECT_FLOAT_EQ(var->function(newKs), 0.9);
5028 var = Manager::Instance().getVariable(
"prodVertexXErr");
5029 ASSERT_NE(var,
nullptr);
5030 EXPECT_FLOAT_EQ(var->function(newKs), sqrt(0.1));
5031 var = Manager::Instance().getVariable(
"prodVertexYErr");
5032 ASSERT_NE(var,
nullptr);
5033 EXPECT_FLOAT_EQ(var->function(newKs), sqrt(0.5));
5034 var = Manager::Instance().getVariable(
"prodVertexZErr");
5035 ASSERT_NE(var,
nullptr);
5036 EXPECT_FLOAT_EQ(var->function(newKs), sqrt(0.9));
5041 TEST_F(MetaVariableTest, KSFWVariables)
5046 EXPECT_B2FATAL(Manager::Instance().getVariable(
"KSFWVariables(NONSENSE)"));
5051 const Manager::Var* var = Manager::Instance().getVariable(
"KSFWVariables(mm2)");
5052 EXPECT_TRUE(std::isnan(var->function(particle_with_no_cs)));
5055 TEST_F(MetaVariableTest, CleoConeCS)
5060 EXPECT_B2FATAL(Manager::Instance().getVariable(
"CleoConeCS(NONSENSE)"));
5063 EXPECT_B2FATAL(Manager::Instance().getVariable(
"CleoConeCS(0, NOTROE)"));
5068 const Manager::Var* var = Manager::Instance().getVariable(
"CleoConeCS(0)");
5069 EXPECT_TRUE(std::isnan(var->function(particle_with_no_cs)));
5072 TEST_F(MetaVariableTest, TransformedNetworkOutput)
5075 EXPECT_B2FATAL(Manager::Instance().getVariable(
"transformedNetworkOutput(NONSENSE)"));
5078 EXPECT_B2FATAL(Manager::Instance().getVariable(
"transformedNetworkOutput(NONEXISTANT, 0, NOTDOUBLE)"));
5079 EXPECT_B2FATAL(Manager::Instance().getVariable(
"transformedNetworkOutput(NONEXISTANT, NOTDOUBLE, 1)"));
5084 const Manager::Var* var = Manager::Instance().getVariable(
"transformedNetworkOutput(NONEXISTANT, 0, 1)");
5085 EXPECT_TRUE(std::isnan(var->function(particle)));
5087 if (not eventExtraInfo.isValid())
5088 eventExtraInfo.create();
5089 var = Manager::Instance().getVariable(
"transformedNetworkOutput(NONEXISTANT, 0, 1)");
5090 EXPECT_TRUE(std::isnan(var->function(
nullptr)));