9#include <analysis/variables/Variables.h>
10#include <analysis/variables/BasicParticleInformation.h>
11#include <analysis/variables/VertexVariables.h>
12#include <analysis/variables/PIDVariables.h>
13#include <analysis/variables/TrackVariables.h>
15#include <analysis/VariableManager/Manager.h>
17#include <analysis/dataobjects/Particle.h>
18#include <analysis/dataobjects/ParticleExtraInfoMap.h>
19#include <analysis/dataobjects/ParticleList.h>
20#include <framework/dataobjects/EventExtraInfo.h>
21#include <analysis/utility/ReferenceFrame.h>
23#include <framework/datastore/StoreArray.h>
24#include <framework/datastore/StoreObjPtr.h>
25#include <framework/utilities/TestHelpers.h>
26#include <framework/gearbox/Gearbox.h>
27#include <framework/gearbox/Const.h>
29#include <mdst/dataobjects/MCParticle.h>
30#include <mdst/dataobjects/MCParticleGraph.h>
31#include <mdst/dataobjects/PIDLikelihood.h>
32#include <mdst/dataobjects/Track.h>
33#include <mdst/dataobjects/V0.h>
34#include <mdst/dataobjects/ECLCluster.h>
36#include <gtest/gtest.h>
38#include <TMatrixFSym.h>
40#include <Math/Cartesian2D.h>
41#include <Math/Vector3D.h>
42#include <Math/Vector4D.h>
47using namespace Belle2::Variable;
48using namespace ROOT::Math;
53 TEST(KinematicVariableTest, Variable)
59 gearbox.setBackends({std::string(
"file:")});
61 gearbox.open(
"geometry/Belle2.xml",
false);
64 Particle pH({0.290582573157898, 0, 6.99796952744559, 7.004}, 11);
65 Particle pL({0.166035330010433, 0, -3.99855423973071, 4.002}, -11);
67 Particle p({0, 0.999999869440028, 0, 1.0}, -11);
68 const double eps = 1e-15;
71 EXPECT_NEAR(0.0, particlePx(&pH), eps);
72 EXPECT_NEAR(0.0, particlePy(&pH), eps);
73 EXPECT_NEAR(0.0, particlePx(&pL), eps);
74 EXPECT_NEAR(0.0, particlePy(&pL), eps);
75 EXPECT_FLOAT_EQ(5.289778893721573, particlePz(&pH));
76 EXPECT_FLOAT_EQ(-5.289778893721573, particlePz(&pL));
77 EXPECT_FLOAT_EQ(10.579557836806245064 / 2, particleE(&pH));
78 EXPECT_FLOAT_EQ(10.579557836806245064 / 2, particleE(&pL));
80 EXPECT_FLOAT_EQ(0.999999869440028, particlePy(&p));
84 Particle p({ 0.1, -0.4, 0.8, 1.0 }, 411);
93 p.setMomentumVertexErrorMatrix(error);
95 EXPECT_FLOAT_EQ(0.9, particleP(&p));
96 EXPECT_FLOAT_EQ(1.0, particleE(&p));
97 EXPECT_FLOAT_EQ(0.1, particlePx(&p));
98 EXPECT_FLOAT_EQ(-0.4, particlePy(&p));
99 EXPECT_FLOAT_EQ(0.8, particlePz(&p));
100 EXPECT_FLOAT_EQ(0.412310562, particlePt(&p));
101 EXPECT_FLOAT_EQ(0.8 / 0.9, particleCosTheta(&p));
102 EXPECT_FLOAT_EQ(-1.325817664, particlePhi(&p));
104 EXPECT_FLOAT_EQ(0.737446378, particlePErr(&p));
105 EXPECT_FLOAT_EQ(sqrt(0.05), particlePxErr(&p));
106 EXPECT_FLOAT_EQ(sqrt(0.2), particlePyErr(&p));
107 EXPECT_FLOAT_EQ(sqrt(0.4), particlePzErr(&p));
108 EXPECT_FLOAT_EQ(0.488093530, particlePtErr(&p));
109 EXPECT_FLOAT_EQ(0.156402664, particleCosThetaErr(&p));
110 EXPECT_FLOAT_EQ(0.263066820, particlePhiErr(&p));
115 EXPECT_FLOAT_EQ(0.68174648, particleP(&p));
116 EXPECT_FLOAT_EQ(0.80918372, particleE(&p));
117 EXPECT_FLOAT_EQ(0.058562335, particlePx(&p));
118 EXPECT_FLOAT_EQ(-0.40000001, particlePy(&p));
119 EXPECT_FLOAT_EQ(0.5489524, particlePz(&p));
120 EXPECT_FLOAT_EQ(0.40426421, particlePt(&p));
121 EXPECT_FLOAT_EQ(0.80521482, particleCosTheta(&p));
122 EXPECT_FLOAT_EQ(-1.4254233, particlePhi(&p));
124 EXPECT_FLOAT_EQ(sqrt(0.2), particlePyErr(&p));
129 EXPECT_ALL_NEAR(particleP(&p), 0.0, 1e-9);
130 EXPECT_FLOAT_EQ(0.4358899, particleE(&p));
131 EXPECT_ALL_NEAR(0.0, particlePx(&p), 1e-9);
132 EXPECT_ALL_NEAR(0.0, particlePy(&p), 1e-9);
133 EXPECT_ALL_NEAR(0.0, particlePz(&p), 1e-9);
134 EXPECT_ALL_NEAR(0.0, particlePt(&p), 1e-9);
140 EXPECT_FLOAT_EQ(0.9, particleP(&p));
141 EXPECT_FLOAT_EQ(1.0, particleE(&p));
142 EXPECT_FLOAT_EQ(0.1, particlePx(&p));
143 EXPECT_FLOAT_EQ(-0.4, particlePy(&p));
144 EXPECT_FLOAT_EQ(0.8, particlePz(&p));
145 EXPECT_FLOAT_EQ(0.412310562, particlePt(&p));
146 EXPECT_FLOAT_EQ(0.8 / 0.9, particleCosTheta(&p));
147 EXPECT_FLOAT_EQ(-1.325817664, particlePhi(&p));
149 EXPECT_FLOAT_EQ(0.737446378, particlePErr(&p));
150 EXPECT_FLOAT_EQ(sqrt(0.05), particlePxErr(&p));
151 EXPECT_FLOAT_EQ(sqrt(0.2), particlePyErr(&p));
152 EXPECT_FLOAT_EQ(sqrt(0.4), particlePzErr(&p));
153 EXPECT_FLOAT_EQ(0.488093530, particlePtErr(&p));
154 EXPECT_FLOAT_EQ(0.156402664, particleCosThetaErr(&p));
155 EXPECT_FLOAT_EQ(0.263066820, particlePhiErr(&p));
160 EXPECT_FLOAT_EQ(0.9, particleP(&p));
161 EXPECT_FLOAT_EQ(1.0, particleE(&p));
162 EXPECT_FLOAT_EQ(0.1, particlePx(&p));
163 EXPECT_FLOAT_EQ(-0.4, particlePy(&p));
164 EXPECT_FLOAT_EQ(0.8, particlePz(&p));
165 EXPECT_FLOAT_EQ(0.412310562, particlePt(&p));
166 EXPECT_FLOAT_EQ(0.8 / 0.9, particleCosTheta(&p));
167 EXPECT_FLOAT_EQ(-1.325817664, particlePhi(&p));
169 EXPECT_FLOAT_EQ(0.737446378, particlePErr(&p));
170 EXPECT_FLOAT_EQ(sqrt(0.05), particlePxErr(&p));
171 EXPECT_FLOAT_EQ(sqrt(0.2), particlePyErr(&p));
172 EXPECT_FLOAT_EQ(sqrt(0.4), particlePzErr(&p));
173 EXPECT_FLOAT_EQ(0.488093530, particlePtErr(&p));
174 EXPECT_FLOAT_EQ(0.156402664, particleCosThetaErr(&p));
175 EXPECT_FLOAT_EQ(0.263066820, particlePhiErr(&p));
178 EXPECT_FLOAT_EQ(-0.1, frame.getMomentumErrorMatrix(&p)(0, 1));
179 EXPECT_FLOAT_EQ(0.9, frame.getMomentumErrorMatrix(&p)(0, 2));
184 EXPECT_FLOAT_EQ(0.9, particleP(&p));
185 EXPECT_FLOAT_EQ(1.0, particleE(&p));
186 EXPECT_FLOAT_EQ(0.1, particlePx(&p));
187 EXPECT_FLOAT_EQ(-0.8, particlePy(&p));
188 EXPECT_FLOAT_EQ(-0.4, particlePz(&p));
190 EXPECT_FLOAT_EQ(0.737446378, particlePErr(&p));
191 EXPECT_FLOAT_EQ(sqrt(0.05), particlePxErr(&p));
192 EXPECT_FLOAT_EQ(sqrt(0.4), particlePyErr(&p));
193 EXPECT_FLOAT_EQ(sqrt(0.2), particlePzErr(&p));
196 EXPECT_FLOAT_EQ(-0.9, frame.getMomentumErrorMatrix(&p)(0, 1));
197 EXPECT_FLOAT_EQ(-0.1, frame.getMomentumErrorMatrix(&p)(0, 2));
202 EXPECT_FLOAT_EQ(0.68174648, particleP(&p));
203 EXPECT_FLOAT_EQ(0.80918372, particleE(&p));
204 EXPECT_FLOAT_EQ(0.058562335, particlePx(&p));
205 EXPECT_FLOAT_EQ(-0.40000001, particlePy(&p));
206 EXPECT_FLOAT_EQ(0.5489524, particlePz(&p));
207 EXPECT_FLOAT_EQ(0.40426421, particlePt(&p));
208 EXPECT_FLOAT_EQ(0.80521482, particleCosTheta(&p));
209 EXPECT_FLOAT_EQ(-1.4254233, particlePhi(&p));
211 EXPECT_FLOAT_EQ(sqrt(0.2), particlePyErr(&p));
215 Particle pinv({ -0.1, 0.4, -0.8, 1.0 }, 411);
217 Particle p2({ 0.0, 0.0, 0.0, 0.4358899}, 411);
218 EXPECT_FLOAT_EQ(0.9, particleP(&p2));
219 EXPECT_FLOAT_EQ(1.0, particleE(&p2));
220 EXPECT_FLOAT_EQ(0.1, particlePx(&p2));
221 EXPECT_FLOAT_EQ(-0.4, particlePy(&p2));
222 EXPECT_FLOAT_EQ(0.8, particlePz(&p2));
223 EXPECT_FLOAT_EQ(0.412310562, particlePt(&p2));
224 EXPECT_FLOAT_EQ(0.8 / 0.9, particleCosTheta(&p2));
225 EXPECT_FLOAT_EQ(-1.325817664, particlePhi(&p2));
230 Particle p({ 0.0, 0.0, 0.0, 0.0 }, 411);
231 EXPECT_FLOAT_EQ(0.0, particleP(&p));
232 EXPECT_FLOAT_EQ(0.0, particleE(&p));
233 EXPECT_FLOAT_EQ(0.0, particlePx(&p));
234 EXPECT_FLOAT_EQ(0.0, particlePy(&p));
235 EXPECT_FLOAT_EQ(0.0, particlePz(&p));
236 EXPECT_FLOAT_EQ(0.0, particlePt(&p));
237 EXPECT_FLOAT_EQ(1.0, particleCosTheta(&p));
238 EXPECT_FLOAT_EQ(0.0, particlePhi(&p));
241 EXPECT_FLOAT_EQ(0.0, particleP(&p));
242 EXPECT_FLOAT_EQ(0.0, particleE(&p));
243 EXPECT_FLOAT_EQ(0.0, particlePx(&p));
244 EXPECT_FLOAT_EQ(0.0, particlePy(&p));
245 EXPECT_FLOAT_EQ(0.0, particlePz(&p));
246 EXPECT_FLOAT_EQ(0.0, particlePt(&p));
247 EXPECT_FLOAT_EQ(1.0, particleCosTheta(&p));
248 EXPECT_FLOAT_EQ(0.0, particlePhi(&p));
254 particles.registerInDataStore();
258 PxPyPzEVector vec1 = {0.0, +0.332174566, 0.0, T.
getCMSEnergy() / 2.};
259 PxPyPzEVector vec2 = {0.0, -0.332174566, 0.0, T.
getCMSEnergy() / 2.};
267 EXPECT_ALL_NEAR(m2RecoilSignalSide(p0), 0.0, 1e-7);
274 TEST(VertexVariableTest, Variable)
280 gearbox.setBackends({std::string(
"file:")});
282 gearbox.open(
"geometry/Belle2.xml",
false);
284 Particle p({ 0.1, -0.4, 0.8, 1.0 }, 11);
286 p.setVertex(XYZVector(1.0, 2.0, 2.0));
288 EXPECT_FLOAT_EQ(1.0, particleDX(&p));
289 EXPECT_FLOAT_EQ(2.0, particleDY(&p));
290 EXPECT_FLOAT_EQ(2.0, particleDZ(&p));
291 EXPECT_FLOAT_EQ(std::sqrt(5.0), particleDRho(&p));
292 EXPECT_FLOAT_EQ(3.0, particleDistance(&p));
293 EXPECT_FLOAT_EQ(0.5, particlePvalue(&p));
297 EXPECT_FLOAT_EQ(1.026177, particleDX(&p));
298 EXPECT_FLOAT_EQ(2.0, particleDY(&p));
299 EXPECT_FLOAT_EQ(2.2568872, particleDZ(&p));
300 EXPECT_FLOAT_EQ(hypot(2.0, 1.026177), particleDRho(&p));
301 EXPECT_FLOAT_EQ(3.1853695, particleDistance(&p));
302 EXPECT_FLOAT_EQ(0.5, particlePvalue(&p));
306 Particle p2({ 0.1, -0.4, 0.8, 1.0 }, 11);
308 p2.setVertex(XYZVector(1.0, 2.0, 2.0));
311 EXPECT_FLOAT_EQ(0.0, particleDX(&p));
312 EXPECT_FLOAT_EQ(0.0, particleDY(&p));
313 EXPECT_FLOAT_EQ(0.0, particleDZ(&p));
314 EXPECT_FLOAT_EQ(0.0, particleDRho(&p));
315 EXPECT_FLOAT_EQ(0.0, particleDistance(&p));
316 EXPECT_FLOAT_EQ(0.5, particlePvalue(&p));
339 TEST(TrackVariablesTest, Variable)
354 const float pValue = 0.5;
355 const float bField = 1.5;
360 ROOT::Math::Cartesian2D d(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
361 ROOT::Math::Cartesian2D pt(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
362 d.SetXY(d.X(), -(d.X()*pt.X()) / pt.Y());
365 ROOT::Math::XYZVector position(d.X(), d.Y(), generator.Uniform(-1, 1));
366 ROOT::Math::XYZVector momentum(pt.X(), pt.Y(), generator.Uniform(-1, 1));
368 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
382 EXPECT_TRUE(std::get<bool>(vIsFromTrack->
function(part)));
383 EXPECT_FALSE(std::get<bool>(vIsFromECL->
function(part)));
384 EXPECT_FALSE(std::get<bool>(vIsFromKLM->
function(part)));
385 EXPECT_FALSE(std::get<bool>(vIsFromV0->
function(part)));
386 EXPECT_FLOAT_EQ(0.5, trackPValue(part));
387 EXPECT_FLOAT_EQ(position.Z(), trackZ0(part));
388 EXPECT_FLOAT_EQ(position.Rho(), trackD0(part));
389 EXPECT_FLOAT_EQ(particleDRho(part), std::fabs(trackD0FromIP(part)));
390 EXPECT_FLOAT_EQ(particleDZ(part), trackZ0FromIP(part));
391 EXPECT_FLOAT_EQ(3, trackNCDCHits(part));
392 EXPECT_FLOAT_EQ(24, trackNSVDHits(part));
393 EXPECT_FLOAT_EQ(12, trackNPXDHits(part));
397 myResults.
appendNew(position, momentum, cov6, charge * -1,
403 myV0s.
appendNew(
V0(std::pair(savedTrack, myResults[0]), std::pair(savedTrack2, myResults[1]), 0.0, 0.0, 0.0));
404 const PxPyPzEVector v0Momentum(2 * momentum.X(), 2 * momentum.Y(), 2 * momentum.Z(), (momentum * 2).R());
405 auto v0particle = myParticles.
appendNew(v0Momentum, 22,
407 v0particle->appendDaughter(0,
false);
408 v0particle->appendDaughter(1,
false);
411 EXPECT_FALSE(std::get<bool>(vIsFromTrack->
function(v0particle)));
412 EXPECT_FALSE(std::get<bool>(vIsFromECL->
function(v0particle)));
413 EXPECT_FALSE(std::get<bool>(vIsFromKLM->
function(v0particle)));
414 EXPECT_TRUE(std::get<bool>(vIsFromV0->
function(v0particle)));
417 EXPECT_EQ(std::get<int>(vNDaughters->
function(v0particle)), 2);
420 class MCTruthVariablesTest :
public ::testing::Test {
422 void SetUp()
override
428 StoreArray<ECLCluster> clusters;
429 StoreArray<MCParticle> mcparticles;
430 StoreArray<Track> tracks;
431 StoreArray<TrackFitResult> trackfits;
432 StoreArray<Particle> particles;
439 particles.registerInDataStore();
444 particles.registerRelationTo(mcparticles);
463 auto* true_photon = mcparticles.
appendNew(MCParticle());
465 auto* true_electron = mcparticles.
appendNew(MCParticle());
467 auto* true_pion = mcparticles.
appendNew(MCParticle());
471 auto* cl0 = clusters.
appendNew(ECLCluster());
473 cl0->setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
474 cl0->setClusterId(0);
476 auto* cl1 = clusters.
appendNew(ECLCluster());
478 cl1->setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
479 cl1->setClusterId(1);
484 ROOT::Math::XYZVector(), ROOT::Math::XYZVector(), cov, -1,
Const::electron, 0.5, 1.5,
485 static_cast<unsigned long long int>(0x300000000000000), 16777215, 0);
486 auto* electron_tr = tracks.
appendNew(Track());
488 electron_tr->addRelationTo(cl1);
492 ROOT::Math::XYZVector(), ROOT::Math::XYZVector(), cov1, -1,
Const::pion, 0.51, 1.5,
493 static_cast<unsigned long long int>(0x300000000000000), 16777215, 0);
494 auto* pion_tr = tracks.
appendNew(Track());
496 pion_tr->addRelationTo(cl1);
499 cl0->addRelationTo(true_photon, 12.3);
500 cl0->addRelationTo(true_electron, 2.3);
501 cl1->addRelationTo(true_electron, 45.6);
502 cl1->addRelationTo(true_photon, 5.6);
503 cl1->addRelationTo(true_pion, 15.6);
505 electron_tr->addRelationTo(true_electron);
506 pion_tr->addRelationTo(true_pion);
509 const auto* photon = particles.appendNew(Particle(cl0));
510 const auto* electron = particles.appendNew(Particle(electron_tr,
Const::electron));
511 const auto* pion = particles.appendNew(Particle(pion_tr,
Const::pion));
512 const auto* misid_photon = particles.appendNew(Particle(cl1));
515 photon->addRelationTo(true_photon);
516 electron->addRelationTo(true_electron);
517 pion->addRelationTo(true_pion);
518 misid_photon->addRelationTo(true_electron);
521 void TearDown()
override
527 TEST_F(MCTruthVariablesTest, mcCosThetaBetweenParticleAndNominalB)
533 particles.registerInDataStore();
535 particles.registerRelationTo(mcParticles);
548 graphParticleDaughter1.
comesFrom(graphParticleMother);
549 graphParticleDaughter2.
comesFrom(graphParticleMother);
550 graphParticleGranddaughter1.
comesFrom(graphParticleDaughter1);
551 graphParticleGranddaughter2.
comesFrom(graphParticleDaughter1);
552 graphParticleGranddaughter3.
comesFrom(graphParticleDaughter1);
554 graphParticleMother.
setPDG(-521);
555 graphParticleDaughter1.
setPDG(421);
559 graphParticleGranddaughter3.
setPDG(12);
566 graphParticleMother.
setMass(16.55294535724685);
569 PxPyPzEVector dummyP4(1, 2, 1, 5);
570 double dummyM = 4.3589;
572 graphParticleDaughter1.
setMass(dummyM);
574 graphParticleDaughter2.
setMass(dummyM);
575 graphParticleGranddaughter1.
set4Vector(dummyP4);
576 graphParticleGranddaughter1.
setMass(dummyM);
577 graphParticleGranddaughter2.
set4Vector(dummyP4);
578 graphParticleGranddaughter2.
setMass(dummyM);
583 auto* pMother = particles.appendNew(dummyP4, -521);
584 pMother->addRelationTo(mcParticles[0]);
586 particles.appendNew(dummyP4, 421)->addRelationTo(mcParticles[1]);
587 particles.appendNew(dummyP4, -211)->addRelationTo(mcParticles[2]);
588 particles.appendNew(dummyP4, -321)->addRelationTo(mcParticles[3]);
589 particles.appendNew(dummyP4, -11)->addRelationTo(mcParticles[4]);
590 particles.appendNew(dummyP4, 12)->addRelationTo(mcParticles[5]);
593 double M_B = pMother->getPDGMass();
594 double p_B = std::sqrt(E_B * E_B - M_B * M_B);
597 double E_Y = p4_Y_CMS.E();
598 double p_Y = p4_Y_CMS.P();
599 double M_Y = p4_Y_CMS.M();
601 double expectedCosBY = (2 * E_B * E_Y - M_B * M_B - M_Y * M_Y) / (2 * p_B * p_Y);
605 EXPECT_NEAR(std::get<double>(mcCosBY->function(pMother)), expectedCosBY, 1e-4);
608 TEST_F(MCTruthVariablesTest, ECLMCMatchWeightVariable)
611 const auto* photon = particles[0];
612 const auto* electron = particles[1];
613 const auto* pion = particles[2];
616 EXPECT_FLOAT_EQ(std::get<double>(weight->function(photon)), 12.3);
617 EXPECT_FLOAT_EQ(std::get<double>(weight->function(electron)), 45.6);
618 EXPECT_FLOAT_EQ(std::get<double>(weight->function(pion)), 15.6);
621 TEST_F(MCTruthVariablesTest, ECLBestMCMatchVariables)
624 const auto* photon = particles[0];
625 const auto* electron = particles[1];
626 const auto* pion = particles[2];
627 const auto* misid_photon = particles[3];
631 EXPECT_EQ(std::get<double>(pdgcode->function(photon)),
Const::photon.getPDGCode());
632 EXPECT_EQ(std::get<double>(pdgcode->function(electron)),
Const::electron.getPDGCode());
633 EXPECT_EQ(std::get<double>(pdgcode->function(pion)),
Const::electron.getPDGCode());
634 EXPECT_EQ(std::get<double>(pdgcode->function(misid_photon)),
Const::electron.getPDGCode());
637 EXPECT_FLOAT_EQ(std::get<double>(weight->function(photon)), 12.3);
638 EXPECT_FLOAT_EQ(std::get<double>(weight->function(electron)), 45.6);
639 EXPECT_FLOAT_EQ(std::get<double>(weight->function(pion)), 45.6);
640 EXPECT_FLOAT_EQ(std::get<double>(weight->function(misid_photon)), 45.6);
644 class EventVariableTest :
public ::testing::Test {
647 void SetUp()
override
650 StoreArray<Particle>().registerInDataStore();
651 StoreArray<MCParticle>().registerInDataStore();
657 void TearDown()
override
663 TEST_F(EventVariableTest, ExperimentRunEventDateAndTime)
673 EXPECT_FALSE(std::get<double>(date->
function(
nullptr)) == std::get<double>(date->
function(
nullptr)));
674 EXPECT_FALSE(std::get<double>(year->
function(
nullptr)) == std::get<double>(year->
function(
nullptr)));
675 EXPECT_FALSE(std::get<double>(time->
function(
nullptr)) == std::get<double>(time->
function(
nullptr)));
682 evtMetaData->setExperiment(1337);
683 evtMetaData->setRun(12345);
684 evtMetaData->setEvent(54321);
685 evtMetaData->setTime(1288569600e9);
690 EXPECT_EQ(std::get<int>(exp->function(
nullptr)), 1337);
691 EXPECT_EQ(std::get<int>(run->function(
nullptr)), 12345);
692 EXPECT_EQ(std::get<int>(evt->
function(
nullptr)), 54321);
693 EXPECT_FLOAT_EQ(std::get<double>(date->
function(
nullptr)), 20101101.);
694 EXPECT_FLOAT_EQ(std::get<double>(year->
function(
nullptr)), 2010.);
695 EXPECT_FLOAT_EQ(std::get<double>(time->
function(
nullptr)), 1288569600);
698 TEST_F(EventVariableTest, TestGlobalCounters)
702 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 0);
704 for (
unsigned i = 0; i < 10; ++i)
707 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 10);
712 TEST_F(EventVariableTest, TestIfContinuumEvent_ForContinuumEvent)
717 particles.registerRelationTo(mcParticles);
720 auto* mcParticle = mcParticles.
appendNew();
723 auto* p1 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
724 p1->addRelationTo(mcParticle);
729 auto* p2 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
730 p2->addRelationTo(mcParticle);
733 ASSERT_NE(var,
nullptr);
734 EXPECT_TRUE(std::get<bool>(var->function(p1)));
735 EXPECT_TRUE(std::get<bool>(var->function(p2)));
737 ASSERT_NE(varN,
nullptr);
738 EXPECT_FALSE(std::get<bool>(varN->
function(p1)));
739 EXPECT_FALSE(std::get<bool>(varN->
function(p2)));
742 TEST_F(EventVariableTest, TestIfContinuumEvent_ForUpsilon4SEvent)
750 auto* mcParticle = mcParticles2.
appendNew();
753 auto* p3 = particles2.
appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
754 p3->addRelationTo(mcParticle);
757 mcParticle->setPDG(300553);
759 auto* p4 = particles2.
appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 300553);
760 p4->addRelationTo(mcParticle);
763 ASSERT_NE(var2,
nullptr);
764 EXPECT_FALSE(std::get<bool>(var2->
function(p3)));
765 EXPECT_FALSE(std::get<bool>(var2->
function(p4)));
767 ASSERT_NE(var2N,
nullptr);
768 EXPECT_TRUE(std::get<bool>(var2N->
function(p3)));
769 EXPECT_TRUE(std::get<bool>(var2N->
function(p4)));
772 TEST_F(EventVariableTest, TestIfContinuumEvent_ForWrongReconstructedUpsilon4SEvent)
780 auto* mcParticle = mcParticles3.
appendNew();
783 auto* p5 = particles3.
appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
784 p5->addRelationTo(mcParticle);
787 mcParticle->setPDG(300553);
789 auto* p6 = particles3.
appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 15);
790 p6->addRelationTo(mcParticle);
793 ASSERT_NE(var3,
nullptr);
794 EXPECT_FALSE(std::get<bool>(var3->
function(p5)));
795 EXPECT_FALSE(std::get<bool>(var3->
function(p6)));
797 ASSERT_NE(var3N,
nullptr);
798 EXPECT_TRUE(std::get<bool>(var3N->
function(p5)));
799 EXPECT_TRUE(std::get<bool>(var3N->
function(p6)));
803 class MetaVariableTest :
public ::testing::Test {
806 void SetUp()
override
809 StoreArray<Particle>().registerInDataStore();
810 StoreArray<MCParticle>().registerInDataStore();
815 void TearDown()
override
821 TEST_F(MetaVariableTest, countDaughters)
823 PxPyPzEVector momentum;
824 const int nDaughters = 6;
826 std::vector<int> daughterIndices;
827 for (
int i = 0; i < nDaughters; i++) {
828 Particle d(PxPyPzEVector(1, 0, 0, 3.0), (i % 2) ? 211 : -211);
829 momentum += d.get4Vector();
830 Particle* newDaughters = particles.appendNew(d);
836 ASSERT_NE(var,
nullptr);
837 EXPECT_EQ(std::get<int>(var->function(p)), 3);
840 ASSERT_NE(var,
nullptr);
841 EXPECT_EQ(std::get<int>(var->function(p)), 6);
845 TEST_F(MetaVariableTest, useRestFrame)
848 gearbox.setBackends({std::string(
"file:")});
850 gearbox.open(
"geometry/Belle2.xml",
false);
852 Particle p({ 0.1, -0.4, 0.8, 1.0 }, 411);
853 p.setVertex(XYZVector(1.0, 2.0, 2.0));
856 ASSERT_NE(var,
nullptr);
857 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.9);
860 ASSERT_NE(var,
nullptr);
861 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
864 ASSERT_NE(var,
nullptr);
865 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 3.0);
868 ASSERT_NE(var,
nullptr);
869 EXPECT_NEAR(std::get<double>(var->function(&p)), 0.0, 1e-9);
872 ASSERT_NE(var,
nullptr);
873 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.4358899);
876 ASSERT_NE(var,
nullptr);
877 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.0);
880 TEST_F(MetaVariableTest, useLabFrame)
882 Particle p({ 0.1, -0.4, 0.8, 1.0 }, 411);
883 p.setVertex(XYZVector(1.0, 2.0, 2.0));
886 ASSERT_NE(var,
nullptr);
887 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.9);
890 ASSERT_NE(var,
nullptr);
891 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
894 ASSERT_NE(var,
nullptr);
895 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 3.0);
898 ASSERT_NE(var,
nullptr);
899 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.9);
902 ASSERT_NE(var,
nullptr);
903 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
906 ASSERT_NE(var,
nullptr);
907 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 3.0);
910 TEST_F(MetaVariableTest, useCMSFrame)
913 gearbox.setBackends({std::string(
"file:")});
915 gearbox.open(
"geometry/Belle2.xml",
false);
917 Particle p({ 0.1, -0.4, 0.8, 1.0 }, 411);
918 p.setVertex(XYZVector(1.0, 2.0, 2.0));
921 ASSERT_NE(var,
nullptr);
922 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.9);
925 ASSERT_NE(var,
nullptr);
926 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
929 ASSERT_NE(var,
nullptr);
930 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 3.0);
933 ASSERT_NE(var,
nullptr);
934 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.68174650327489894064);
937 ASSERT_NE(var,
nullptr);
938 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.80918372124478121776);
941 ASSERT_NE(var,
nullptr);
942 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 3.1853695);
945 TEST_F(MetaVariableTest, useTagSideRecoilRestFrame)
952 PxPyPzEVector vec1 = {0.0, +0.332174566, 0.0, T.
getCMSEnergy() / 2.};
953 PxPyPzEVector vec2 = {0.0, -0.332174566, 0.0, T.
getCMSEnergy() / 2.};
962 ASSERT_NE(var,
nullptr);
963 EXPECT_NEAR(std::get<double>(var->function(p0)), 0., 1e-6);
966 ASSERT_NE(var,
nullptr);
967 EXPECT_NEAR(std::get<double>(var->function(p0)), 0., 1e-6);
970 ASSERT_NE(var,
nullptr);
971 EXPECT_NEAR(std::get<double>(var->function(p0)), 0., 1e-6);
974 ASSERT_NE(var,
nullptr);
975 EXPECT_NEAR(std::get<double>(var->function(p0)), 0., 1e-6);
978 ASSERT_NE(var,
nullptr);
979 EXPECT_NEAR(std::get<double>(var->function(p0)), p1->getMass(), 1e-6);
982 TEST_F(MetaVariableTest, useMCancestorBRestFrame)
987 particles.registerRelationTo(mcparticles);
996 Particle particle({ 0.1, -0.4, 0.8, 1.0 }, 411);
997 auto* p = particles.appendNew(particle);
998 p->setVertex(XYZVector(1.0, 2.0, 2.0));
999 p->addRelationTo(mcparticles[1]);
1001 mcparticles[1]->setPDG(411);
1004 mcparticles[0]->setMomentum(XYZVector(0.0, 0.0, 0.1));
1006 mcparticles[0]->setPDG(511);
1007 mcparticles[0]->setMassFromPDG();
1011 ASSERT_NE(var,
nullptr);
1012 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0.88333338);
1015 ASSERT_NE(var,
nullptr);
1016 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0.98502684);
1019 ASSERT_NE(var,
nullptr);
1020 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 3.0007174);
1023 TEST_F(MetaVariableTest, extraInfo)
1028 Particle p({ 0.1, -0.4, 0.8, 1.0 }, 11);
1029 p.addExtraInfo(
"pi", 3.14);
1032 ASSERT_NE(var,
nullptr);
1033 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 3.14);
1036 EXPECT_TRUE(std::isnan(std::get<double>(var->function(
nullptr))));
1039 TEST_F(MetaVariableTest, eventExtraInfo)
1045 if (not eventExtraInfo.isValid())
1046 eventExtraInfo.create();
1047 eventExtraInfo->addExtraInfo(
"pi", 3.14);
1049 ASSERT_NE(var,
nullptr);
1050 EXPECT_FLOAT_EQ(std::get<double>(var->function(
nullptr)), 3.14);
1053 TEST_F(MetaVariableTest, eventCached)
1060 ASSERT_NE(var,
nullptr);
1061 EXPECT_FLOAT_EQ(std::get<double>(var->function(
nullptr)), 3.14);
1062 EXPECT_TRUE(eventExtraInfo.isValid());
1063 EXPECT_TRUE(eventExtraInfo->hasExtraInfo(
"__constant__bo3__pt14__bc"));
1064 EXPECT_FLOAT_EQ(eventExtraInfo->getExtraInfo(
"__constant__bo3__pt14__bc"), 3.14);
1065 eventExtraInfo->addExtraInfo(
"__eventExtraInfo__bopi__bc", 3.14);
1067 ASSERT_NE(var,
nullptr);
1068 EXPECT_FLOAT_EQ(std::get<double>(var->function(
nullptr)), 3.14);
1071 TEST_F(MetaVariableTest, particleCached)
1076 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 11);
1078 ASSERT_NE(var,
nullptr);
1079 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.1);
1080 EXPECT_TRUE(p.hasExtraInfo(
"__px"));
1081 EXPECT_FLOAT_EQ(p.getExtraInfo(
"__px"), 0.1);
1082 p.addExtraInfo(
"__py", -0.5);
1084 ASSERT_NE(var,
nullptr);
1085 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -0.5);
1088 TEST_F(MetaVariableTest, basicMathTest)
1090 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 411);
1093 ASSERT_NE(var,
nullptr);
1094 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.4);
1097 ASSERT_NE(var,
nullptr);
1098 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.8);
1101 ASSERT_NE(var,
nullptr);
1102 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 2.0);
1105 ASSERT_NE(var,
nullptr);
1106 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -1.0);
1110 ASSERT_NE(var,
nullptr);
1111 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.5);
1115 ASSERT_NE(var,
nullptr);
1116 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
1120 ASSERT_NE(var,
nullptr);
1121 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.5707963267948966);
1125 ASSERT_NE(var,
nullptr);
1126 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.5);
1130 ASSERT_NE(var,
nullptr);
1131 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.5707963267948966);
1135 TEST_F(MetaVariableTest, formula)
1142 Particle p({ 0.1, -0.4, 0.8, 2.0 }, -411);
1145 ASSERT_NE(var,
nullptr);
1146 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -0.3);
1149 ASSERT_NE(var,
nullptr);
1150 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.5);
1153 ASSERT_NE(var,
nullptr);
1154 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -0.04);
1157 ASSERT_NE(var,
nullptr);
1158 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -4.0);
1161 ASSERT_NE(var,
nullptr);
1162 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.01);
1165 ASSERT_NE(var,
nullptr);
1166 EXPECT_NEAR(std::get<double>(var->function(&p)), 0.76, 1e-6);
1169 ASSERT_NE(var,
nullptr);
1170 EXPECT_NEAR(std::get<double>(var->function(&p)), 0.76, 1e-6);
1173 ASSERT_NE(var,
nullptr);
1174 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.41231057);
1175 double pt = std::get<double>(var->function(&p));
1178 ASSERT_NE(var,
nullptr);
1179 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), pt);
1182 ASSERT_NE(var,
nullptr);
1183 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -1.0);
1186 ASSERT_NE(var,
nullptr);
1187 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
1190 ASSERT_NE(var,
nullptr);
1191 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
1194 ASSERT_NE(var,
nullptr);
1195 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 411.0);
1198 ASSERT_NE(var,
nullptr);
1199 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -168921.0);
1202 ASSERT_NE(var,
nullptr);
1203 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 8.33);
1206 ASSERT_NE(var,
nullptr);
1207 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -8.33);
1210 ASSERT_NE(var,
nullptr);
1211 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 411);
1214 TEST_F(MetaVariableTest, passesCut)
1216 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 411);
1217 Particle p2({ 0.1, -0.4, 0.8, 4.0 }, 411);
1220 ASSERT_NE(var,
nullptr);
1221 EXPECT_TRUE(std::get<bool>(var->function(&p)));
1222 EXPECT_FALSE(std::get<bool>(var->function(&p2)));
1227 TEST_F(MetaVariableTest, unmask)
1232 particles.registerRelationTo(mcParticles);
1247 graphParticleGrandMother.
setPDG(-521);
1249 graphParticleAunt.
setPDG(-14);
1251 graphParticleDaughter2.
setPDG(14);
1253 graphParticleMother.
comesFrom(graphParticleGrandMother);
1254 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1255 graphParticleDaughter1.
comesFrom(graphParticleMother);
1256 graphParticleDaughter2.
comesFrom(graphParticleMother);
1261 auto* mcGrandMother = mcParticles[0];
1264 auto* mcMother = mcParticles[1];
1267 auto* mcAunt = mcParticles[2];
1270 auto* mcDaughter1 = mcParticles[3];
1273 auto* mcDaughter2 = mcParticles[4];
1276 auto* pGrandMother = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), -521);
1277 pGrandMother->addRelationTo(mcGrandMother);
1279 auto* pMother = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 13);
1280 pMother->addRelationTo(mcMother);
1283 pMother->writeExtraInfo(
"mcErrors", 8);
1284 pGrandMother->writeExtraInfo(
"mcErrors", 8 | 16);
1287 ASSERT_NE(var1,
nullptr);
1288 EXPECT_FLOAT_EQ(std::get<double>(var1->function(pMother)), 0);
1289 EXPECT_FLOAT_EQ(std::get<double>(var1->function(pGrandMother)), 16);
1290 ASSERT_NE(var2,
nullptr);
1291 EXPECT_FLOAT_EQ(std::get<double>(var2->
function(pMother)), 0);
1292 EXPECT_FLOAT_EQ(std::get<double>(var2->
function(pGrandMother)), 0);
1295 pMother->writeExtraInfo(
"mcErrors", 8 | 128);
1296 pGrandMother->writeExtraInfo(
"mcErrors", 8 | 16 | 512);
1297 ASSERT_NE(var1,
nullptr);
1298 EXPECT_FLOAT_EQ(std::get<double>(var1->function(pMother)), 128);
1299 EXPECT_FLOAT_EQ(std::get<double>(var1->function(pGrandMother)), 16 | 512);
1300 ASSERT_NE(var2,
nullptr);
1301 EXPECT_FLOAT_EQ(std::get<double>(var2->
function(pMother)), 128);
1302 EXPECT_FLOAT_EQ(std::get<double>(var2->
function(pGrandMother)), 512);
1311 TEST_F(MetaVariableTest, conditionalVariableSelector)
1313 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 411);
1316 ASSERT_NE(var,
nullptr);
1317 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.1);
1320 ASSERT_NE(var,
nullptr);
1321 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -0.4);
1325 TEST_F(MetaVariableTest, nCleanedTracks)
1334 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 11);
1335 Particle p2({ 0.1, -0.4, 0.8, 4.0 }, 11);
1337 track_fit_results.
appendNew(ROOT::Math::XYZVector(0.1, 0.1, 0.1), ROOT::Math::XYZVector(0.1, 0.0, 0.0),
1338 TMatrixDSym(6), 1,
Const::pion, 0.01, 1.5, 0, 0, 0);
1339 track_fit_results.
appendNew(ROOT::Math::XYZVector(0.1, 0.1, 0.1), ROOT::Math::XYZVector(0.15, 0.0, 0.0),
1340 TMatrixDSym(6), 1,
Const::pion, 0.01, 1.5, 0, 0, 0);
1341 track_fit_results.
appendNew(ROOT::Math::XYZVector(0.1, 0.1, 0.1), ROOT::Math::XYZVector(0.4, 0.0, 0.0),
1342 TMatrixDSym(6), 1,
Const::pion, 0.01, 1.5, 0, 0, 0);
1343 track_fit_results.
appendNew(ROOT::Math::XYZVector(0.1, 0.1, 0.1), ROOT::Math::XYZVector(0.6, 0.0, 0.0),
1344 TMatrixDSym(6), 1,
Const::pion, 0.01, 1.5, 0, 0, 0);
1352 EXPECT_FLOAT_EQ(std::get<int>(var1->function(
nullptr)), 1);
1355 EXPECT_FLOAT_EQ(std::get<int>(var2->
function(
nullptr)), 2);
1358 EXPECT_FLOAT_EQ(std::get<int>(var3->
function(
nullptr)), 4);
1363 TEST_F(MetaVariableTest, NumberOfMCParticlesInEvent)
1365 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 11);
1366 Particle p2({ 0.1, -0.4, 0.8, 4.0 }, 11);
1369 auto* mcParticle = mcParticles.appendNew();
1372 mcParticle = mcParticles.appendNew();
1375 mcParticle = mcParticles.appendNew();
1378 mcParticle = mcParticles.appendNew();
1383 ASSERT_NE(var,
nullptr);
1384 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 2);
1388 TEST_F(MetaVariableTest, daughterInvM)
1390 PxPyPzEVector momentum;
1391 const int nDaughters = 6;
1393 std::vector<int> daughterIndices;
1394 for (
int i = 0; i < nDaughters; i++) {
1395 Particle d(PxPyPzEVector(2, 2, 2, 4.0), (i % 2) ? 213 : -213);
1396 momentum += d.get4Vector();
1397 Particle* newDaughters = particles.appendNew(d);
1403 ASSERT_NE(var,
nullptr);
1404 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
1407 ASSERT_NE(var,
nullptr);
1408 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 4.0);
1411 ASSERT_NE(var,
nullptr);
1412 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 6.0);
1415 TEST_F(MetaVariableTest, daughter)
1417 PxPyPzEVector momentum;
1418 const int nDaughters = 6;
1420 std::vector<int> daughterIndices;
1421 for (
int i = 0; i < nDaughters; i++) {
1422 Particle d(PxPyPzEVector(i * 1.0, 1, 1, 1), (i % 2) ? 211 : -211);
1423 momentum += d.get4Vector();
1424 Particle* newDaughters = particles.appendNew(d);
1430 ASSERT_NE(var,
nullptr);
1431 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
1434 ASSERT_NE(var,
nullptr);
1435 EXPECT_NEAR(std::get<double>(var->function(p)), 0.0, 1e-6);
1438 ASSERT_NE(var,
nullptr);
1439 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 1.0);
1442 ASSERT_NE(var,
nullptr);
1443 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 2.0);
1446 TEST_F(MetaVariableTest, mcDaughter)
1451 particles.registerRelationTo(mcParticles);
1465 graphParticleGrandMother.
setPDG(-521);
1467 graphParticleAunt.
setPDG(-14);
1469 graphParticleDaughter2.
setPDG(14);
1471 graphParticleMother.
comesFrom(graphParticleGrandMother);
1472 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1473 graphParticleDaughter1.
comesFrom(graphParticleMother);
1474 graphParticleDaughter2.
comesFrom(graphParticleMother);
1478 auto* mcGrandMother = mcParticles[0];
1481 auto* mcMother = mcParticles[1];
1484 auto* mcAunt = mcParticles[2];
1487 auto* mcDaughter1 = mcParticles[3];
1490 auto* mcDaughter2 = mcParticles[4];
1493 auto* pGrandMother = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), -521);
1494 pGrandMother->addRelationTo(mcGrandMother);
1496 auto* pMother = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 13);
1497 pMother->addRelationTo(mcMother);
1500 auto* p_noMC = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 13);
1503 auto* p_noDaughter = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
1504 p_noDaughter->addRelationTo(mcDaughter1);
1507 ASSERT_NE(var,
nullptr);
1508 EXPECT_FLOAT_EQ(std::get<double>(var->function(pGrandMother)), 13);
1509 EXPECT_FLOAT_EQ(std::get<double>(var->function(pMother)), 11);
1510 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p_noMC))));
1511 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p_noDaughter))));
1513 EXPECT_FLOAT_EQ(std::get<double>(var->function(pGrandMother)), -14);
1514 EXPECT_FLOAT_EQ(std::get<double>(var->function(pMother)), 14);
1517 EXPECT_FLOAT_EQ(std::get<double>(var->function(pGrandMother)), -14);
1518 EXPECT_FLOAT_EQ(std::get<double>(var->function(pMother)), 14);
1521 EXPECT_TRUE(std::isnan(std::get<double>(var->function(pGrandMother))));
1522 EXPECT_TRUE(std::isnan(std::get<double>(var->function(pMother))));
1525 EXPECT_FLOAT_EQ(std::get<double>(var->function(pGrandMother)), 11);
1526 EXPECT_TRUE(std::isnan(std::get<double>(var->function(pMother))));
1528 EXPECT_FLOAT_EQ(std::get<double>(var->function(pGrandMother)), 14);
1530 EXPECT_TRUE(std::isnan(std::get<double>(var->function(pGrandMother))));
1532 EXPECT_TRUE(std::isnan(std::get<double>(var->function(pGrandMother))));
1535 TEST_F(MetaVariableTest, mcMother)
1540 particles.registerRelationTo(mcParticles);
1554 graphParticleGrandMother.
setPDG(-521);
1556 graphParticleAunt.
setPDG(-14);
1558 graphParticleDaughter2.
setPDG(14);
1560 graphParticleMother.
comesFrom(graphParticleGrandMother);
1561 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1562 graphParticleDaughter1.
comesFrom(graphParticleMother);
1563 graphParticleDaughter2.
comesFrom(graphParticleMother);
1568 auto* mcGrandMother = mcParticles[0];
1571 auto* mcMother = mcParticles[1];
1574 auto* mcAunt = mcParticles[2];
1577 auto* mcDaughter1 = mcParticles[3];
1580 auto* mcDaughter2 = mcParticles[4];
1583 auto* p1 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
1584 p1->addRelationTo(mcDaughter1);
1586 auto* p2 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 14);
1587 p2->addRelationTo(mcDaughter2);
1589 auto* pMother = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 13);
1590 pMother->addRelationTo(mcMother);
1593 auto* p_noMC = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
1596 auto* p_noMother = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), -521);
1597 p_noMother->addRelationTo(mcGrandMother);
1600 ASSERT_NE(var,
nullptr);
1601 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 13);
1602 EXPECT_FLOAT_EQ(std::get<double>(var->function(p2)), 13);
1603 EXPECT_FLOAT_EQ(std::get<double>(var->function(pMother)), -521);
1604 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p_noMC))));
1605 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p_noMother))));
1609 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), -521);
1612 TEST_F(MetaVariableTest, genParticle)
1617 particles.registerRelationTo(mcParticles);
1633 graphParticleGrandMother.
setPDG(300553);
1634 graphParticleMother.
setPDG(-521);
1635 graphParticleAunt.
setPDG(521);
1637 graphParticleDaughter2.
setPDG(-12);
1639 graphParticleGrandMother.
setMomentum(0.0, 0.0, 0.4);
1642 graphParticleMother.
comesFrom(graphParticleGrandMother);
1643 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1644 graphParticleDaughter1.
comesFrom(graphParticleMother);
1645 graphParticleDaughter2.
comesFrom(graphParticleMother);
1650 auto* mcGrandMother = mcParticles[0];
1653 auto* mcMother = mcParticles[1];
1656 auto* mcAunt = mcParticles[2];
1659 auto* mcDaughter1 = mcParticles[3];
1662 auto* mcDaughter2 = mcParticles[4];
1665 auto* p1 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
1666 p1->addRelationTo(mcDaughter1);
1669 auto* p_noMC = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 211);
1672 ASSERT_NE(var,
nullptr);
1673 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 300553);
1674 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), 300553);
1677 ASSERT_NE(var,
nullptr);
1678 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 0.4);
1679 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), 0.4);
1682 ASSERT_NE(var,
nullptr);
1683 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), -521);
1684 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), -521);
1687 ASSERT_NE(var,
nullptr);
1688 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 1.1);
1689 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), 1.1);
1692 ASSERT_NE(var,
nullptr);
1693 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), -521);
1694 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), -521);
1697 ASSERT_NE(var,
nullptr);
1698 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), -12);
1699 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), -12);
1702 ASSERT_NE(var,
nullptr);
1703 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p1))));
1704 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p_noMC))));
1707 TEST_F(MetaVariableTest, genUpsilon4S)
1712 particles.registerRelationTo(mcParticles);
1728 graphParticleGrandMother.
setPDG(300553);
1729 graphParticleMother.
setPDG(-521);
1730 graphParticleAunt.
setPDG(521);
1732 graphParticleDaughter2.
setPDG(-12);
1734 graphParticleGrandMother.
setMomentum(0.0, 0.0, 0.4);
1737 graphParticleMother.
comesFrom(graphParticleGrandMother);
1738 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1739 graphParticleDaughter1.
comesFrom(graphParticleMother);
1740 graphParticleDaughter2.
comesFrom(graphParticleMother);
1745 auto* mcGrandMother = mcParticles[0];
1748 auto* mcMother = mcParticles[1];
1751 auto* mcAunt = mcParticles[2];
1754 auto* mcDaughter1 = mcParticles[3];
1757 auto* mcDaughter2 = mcParticles[4];
1760 auto* p1 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
1761 p1->addRelationTo(mcDaughter1);
1764 auto* p_noMC = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 211);
1767 ASSERT_NE(var,
nullptr);
1768 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 300553);
1769 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), 300553);
1772 ASSERT_NE(var,
nullptr);
1773 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 0.4);
1774 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), 0.4);
1777 ASSERT_NE(var,
nullptr);
1778 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), -521);
1779 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), -521);
1782 ASSERT_NE(var,
nullptr);
1783 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 1.1);
1784 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), 1.1);
1787 mcParticles.
clear();
1802 auto* mcP1 = mcParticles[0];
1805 auto* mcP2 = mcParticles[1];
1808 auto* someParticle = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
1809 someParticle->addRelationTo(mcP1);
1812 ASSERT_NE(var,
nullptr);
1813 EXPECT_TRUE(std::isnan(std::get<double>(var->function(someParticle))));
1816 TEST_F(MetaVariableTest, daughterProductOf)
1818 PxPyPzEVector momentum;
1819 const int nDaughters = 4;
1821 std::vector<int> daughterIndices;
1822 for (
int i = 0; i < nDaughters; i++) {
1823 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 2.0), (i % 2) ? 213 : -213);
1824 momentum += d.get4Vector();
1825 Particle* newDaughters = particles.appendNew(d);
1831 ASSERT_NE(var,
nullptr);
1832 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 120.0);
1835 TEST_F(MetaVariableTest, daughterSumOf)
1837 PxPyPzEVector momentum;
1838 const int nDaughters = 4;
1840 std::vector<int> daughterIndices;
1841 for (
int i = 0; i < nDaughters; i++) {
1842 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 2.0), (i % 2) ? 213 : -213);
1843 momentum += d.get4Vector();
1844 Particle* newDaughters = particles.appendNew(d);
1850 ASSERT_NE(var,
nullptr);
1851 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 14.0);
1854 TEST_F(MetaVariableTest, daughterLowest)
1856 PxPyPzEVector momentum;
1857 const int nDaughters = 4;
1859 std::vector<int> daughterIndices;
1860 for (
int i = 0; i < nDaughters; i++) {
1861 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 2.0), (i % 2) ? 213 : -213);
1862 momentum += d.get4Vector();
1863 Particle* newDaughters = particles.appendNew(d);
1869 ASSERT_NE(var,
nullptr);
1870 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 2.0);
1873 TEST_F(MetaVariableTest, daughterHighest)
1875 PxPyPzEVector momentum;
1876 const int nDaughters = 4;
1878 std::vector<int> daughterIndices;
1879 for (
int i = 0; i < nDaughters; i++) {
1880 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? 213 : -213);
1881 momentum += d.get4Vector();
1882 Particle* newDaughters = particles.appendNew(d);
1888 ASSERT_NE(var,
nullptr);
1889 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 4.0);
1892 TEST_F(MetaVariableTest, daughterDiffOf)
1894 PxPyPzEVector momentum;
1895 const int nDaughters = 4;
1897 std::vector<int> daughterIndices;
1898 for (
int i = 0; i < nDaughters; i++) {
1899 Particle d(PxPyPzEVector(-1, 1.0 - 2 * (i % 2), 1, i * 1.0 + 2.0), (i % 2) ? -11 : 211);
1900 momentum += d.get4Vector();
1901 Particle* newDaughters = particles.appendNew(d);
1907 ASSERT_NE(var,
nullptr);
1908 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -222);
1911 ASSERT_NE(var,
nullptr);
1912 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 222);
1915 ASSERT_NE(var,
nullptr);
1916 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -200);
1919 ASSERT_NE(var,
nullptr);
1920 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
1923 ASSERT_NE(var,
nullptr);
1924 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
1927 ASSERT_NE(var,
nullptr);
1928 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
1931 ASSERT_NE(var,
nullptr);
1932 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -1.5707964);
1935 ASSERT_NE(var,
nullptr);
1936 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -1.5004894);
1939 ASSERT_NE(var,
nullptr);
1940 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
1944 TEST_F(MetaVariableTest, mcDaughterDiffOf)
1947 PxPyPzEVector momentum;
1948 const int nDaughters = 4;
1951 particles.registerRelationTo(mcParticles);
1952 std::vector<int> daughterIndices;
1955 for (
int i = 0; i < nDaughters; i++) {
1956 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? -11 : 211);
1957 momentum += d.get4Vector();
1958 Particle* newDaughters = particles.appendNew(d);
1960 auto* mcParticle = mcParticles.
appendNew();
1968 ASSERT_NE(var,
nullptr);
1969 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -222);
1972 ASSERT_NE(var,
nullptr);
1973 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 222);
1976 ASSERT_NE(var,
nullptr);
1977 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -200);
1980 ASSERT_NE(var,
nullptr);
1981 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
1984 ASSERT_NE(var,
nullptr);
1985 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
1988 ASSERT_NE(var,
nullptr);
1989 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
1992 ASSERT_NE(var,
nullptr);
1993 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
1998 TEST_F(MetaVariableTest, daughterClusterAngleInBetween)
2002 std::vector<int> daughterIndices, daughterIndices_noclst;
2008 particles.registerRelationTo(eclclusters);
2012 const float px_CM = 2.;
2013 const float py_CM = 1.;
2014 const float pz_CM = 3.;
2016 E_CM = sqrt(pow(px_CM, 2) + pow(py_CM, 2) + pow(pz_CM, 2));
2017 PxPyPzEVector momentum, momentum_noclst;
2018 PxPyPzEVector dau0_4vec_CM(px_CM, py_CM, pz_CM, E_CM), dau1_4vec_CM(-px_CM, -py_CM, -pz_CM, E_CM);
2019 PxPyPzEVector dau0_4vec_Lab, dau1_4vec_Lab;
2025 Particle dau0_noclst(dau0_4vec_Lab, 22);
2026 momentum += dau0_noclst.get4Vector();
2027 Particle* newDaughter0_noclst = particles.appendNew(dau0_noclst);
2028 daughterIndices_noclst.push_back(newDaughter0_noclst->
getArrayIndex());
2029 Particle dau1_noclst(dau1_4vec_Lab, 22);
2030 momentum += dau1_noclst.get4Vector();
2031 Particle* newDaughter1_noclst = particles.appendNew(dau1_noclst);
2032 daughterIndices_noclst.push_back(newDaughter1_noclst->
getArrayIndex());
2040 ASSERT_NE(var,
nullptr);
2041 EXPECT_TRUE(std::isnan(std::get<double>(var->function(par_noclst))));
2048 eclst0->
setTheta(dau0_4vec_Lab.Theta());
2049 eclst0->
setPhi(dau0_4vec_Lab.Phi());
2050 eclst0->
setR(148.4);
2055 eclst1->
setTheta(dau1_4vec_Lab.Theta());
2056 eclst1->
setPhi(dau1_4vec_Lab.Phi());
2057 eclst1->
setR(148.5);
2059 const Particle* newDaughter0 = particles.appendNew(
Particle(eclclusters[0]));
2061 const Particle* newDaughter1 = particles.appendNew(
Particle(eclclusters[1]));
2067 EXPECT_FLOAT_EQ(std::get<double>(var->function(par)), 2.8613892);
2068 EXPECT_FLOAT_EQ(std::get<double>(varCMS->
function(par)), M_PI);
2071 TEST_F(MetaVariableTest, grandDaughterDiffOfs)
2075 std::vector<int> daughterIndices0_noclst, daughterIndices1_noclst, daughterIndices2_noclst;
2076 std::vector<int> daughterIndices0, daughterIndices1, daughterIndices2;
2082 particles.registerRelationTo(eclclusters);
2086 const float px_0 = 2.;
2087 const float py_0 = 1.;
2088 const float pz_0 = 3.;
2089 const float px_1 = 1.5;
2090 const float py_1 = 1.5;
2091 const float pz_1 = 2.5;
2093 E_0 = sqrt(pow(px_0, 2) + pow(py_0, 2) + pow(pz_0, 2));
2094 E_1 = sqrt(pow(px_1, 2) + pow(py_1, 2) + pow(pz_1, 2));
2095 PxPyPzEVector momentum_0, momentum_1, momentum;
2096 PxPyPzEVector dau0_4vec(px_0, py_0, pz_0, E_0), dau1_4vec(px_1, py_1, pz_1, E_1);
2109 Particle dau0_noclst(dau0_4vec, 22);
2110 momentum_0 = dau0_4vec;
2111 Particle* newDaughter0_noclst = particles.appendNew(dau0_noclst);
2112 daughterIndices0_noclst.push_back(newDaughter0_noclst->
getArrayIndex());
2114 Particle dau1_noclst(dau1_4vec, 22);
2115 momentum_1 = dau1_4vec;
2116 Particle* newDaughter1_noclst = particles.appendNew(dau1_noclst);
2117 daughterIndices1_noclst.push_back(newDaughter1_noclst->
getArrayIndex());
2120 momentum = momentum_0 + momentum_1;
2121 daughterIndices2_noclst.push_back(par0_noclst->
getArrayIndex());
2122 daughterIndices2_noclst.push_back(par1_noclst->
getArrayIndex());
2141 ASSERT_NE(var_ClusterPhi,
nullptr);
2142 EXPECT_TRUE(std::isnan(std::get<double>(var_ClusterPhi->
function(parGranny_noclst))));
2143 EXPECT_TRUE(std::isnan(std::get<double>(var_ClusterTheta->
function(parGranny_noclst))));
2144 EXPECT_TRUE(std::isnan(std::get<double>(var_ClusterE->
function(parGranny_noclst))));
2145 EXPECT_FLOAT_EQ(std::get<double>(var_Phi->
function(parGranny_noclst)), 0.32175055);
2146 EXPECT_FLOAT_EQ(std::get<double>(var_Theta->
function(parGranny_noclst)), 0.06311664);
2147 EXPECT_FLOAT_EQ(std::get<double>(var_E->
function(parGranny_noclst)), -0.46293807);
2148 EXPECT_TRUE(std::isnan(std::get<double>(var_ClusterPhi_wrongIndexes->
function(parGranny_noclst))));
2149 EXPECT_TRUE(std::isnan(std::get<double>(var_Phi_wrongIndexes->
function(parGranny_noclst))));
2150 EXPECT_TRUE(std::isnan(std::get<double>(var_ClusterE_wrongIndexes->
function(parGranny_noclst))));
2151 EXPECT_TRUE(std::isnan(std::get<double>(var_E_wrongIndexes->
function(parGranny_noclst))));
2158 eclst0->
setTheta(dau0_4vec.Theta());
2159 eclst0->
setPhi(dau0_4vec.Phi());
2160 eclst0->
setR(148.4);
2165 eclst1->
setTheta(dau1_4vec.Theta());
2166 eclst1->
setPhi(dau1_4vec.Phi());
2167 eclst1->
setR(148.5);
2169 const Particle* newDaughter0 = particles.appendNew(
Particle(eclclusters[0]));
2173 const Particle* newDaughter1 = particles.appendNew(
Particle(eclclusters[1]));
2183 EXPECT_FLOAT_EQ(std::get<double>(var_ClusterPhi->
function(parGranny)), 0.32175055);
2184 EXPECT_FLOAT_EQ(std::get<double>(var_Phi->
function(parGranny)), 0.32175055);
2185 EXPECT_FLOAT_EQ(std::get<double>(var_ClusterTheta->
function(parGranny)), 0.06311664);
2186 EXPECT_FLOAT_EQ(std::get<double>(var_Theta->
function(parGranny)), 0.06311664);
2187 EXPECT_FLOAT_EQ(std::get<double>(var_ClusterE->
function(parGranny)), -0.46293831);
2188 EXPECT_FLOAT_EQ(std::get<double>(var_E->
function(parGranny)), -0.46293831);
2191 TEST_F(MetaVariableTest, daughterNormDiffOf)
2193 PxPyPzEVector momentum;
2194 const int nDaughters = 4;
2196 std::vector<int> daughterIndices;
2197 for (
int i = 0; i < nDaughters; i++) {
2198 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? -11 : 211);
2199 momentum += d.get4Vector();
2200 Particle* newDaughters = particles.appendNew(d);
2206 ASSERT_NE(var,
nullptr);
2207 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -222 / 200.);
2210 ASSERT_NE(var,
nullptr);
2211 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 222 / 200.);
2214 ASSERT_NE(var,
nullptr);
2215 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -200 / 222.);
2218 ASSERT_NE(var,
nullptr);
2219 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -0 / 22.);
2222 ASSERT_NE(var,
nullptr);
2223 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0 / 22.);
2226 ASSERT_NE(var,
nullptr);
2227 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0 / 422.);
2231 TEST_F(MetaVariableTest, daughterMotherDiffOf)
2233 PxPyPzEVector momentum;
2234 const int nDaughters = 4;
2236 std::vector<int> daughterIndices;
2237 for (
int i = 0; i < nDaughters; i++) {
2238 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? -11 : 211);
2239 momentum += d.get4Vector();
2240 Particle* newDaughters = particles.appendNew(d);
2246 ASSERT_NE(var,
nullptr);
2247 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 422);
2250 ASSERT_NE(var,
nullptr);
2251 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 400);
2254 ASSERT_NE(var,
nullptr);
2255 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 200);
2259 TEST_F(MetaVariableTest, daughterMotherNormDiffOf)
2261 PxPyPzEVector momentum;
2262 const int nDaughters = 4;
2264 std::vector<int> daughterIndices;
2265 for (
int i = 0; i < nDaughters; i++) {
2266 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? -11 : 211);
2267 momentum += d.get4Vector();
2268 Particle* newDaughters = particles.appendNew(d);
2274 ASSERT_NE(var,
nullptr);
2275 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 422 / 400.);
2278 ASSERT_NE(var,
nullptr);
2279 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 400 / 422.);
2282 ASSERT_NE(var,
nullptr);
2283 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 200 / 622.);
2287 TEST_F(MetaVariableTest, constant)
2291 ASSERT_NE(var,
nullptr);
2292 EXPECT_FLOAT_EQ(std::get<double>(var->function(
nullptr)), 1.0);
2295 ASSERT_NE(var,
nullptr);
2296 EXPECT_FLOAT_EQ(std::get<double>(var->function(
nullptr)), 0.0);
2300 TEST_F(MetaVariableTest, abs)
2302 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 11);
2303 Particle p2({ -0.1, -0.4, 0.8, 4.0 }, -11);
2306 ASSERT_NE(var,
nullptr);
2307 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.1);
2308 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p2)), 0.1);
2312 TEST_F(MetaVariableTest, sin)
2314 Particle p({ M_PI / 2.0, -0.4, 0.8, 1.0}, 11);
2315 Particle p2({ 0.0, -0.4, 0.8, 1.0 }, -11);
2318 ASSERT_NE(var,
nullptr);
2319 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
2320 EXPECT_NEAR(std::get<double>(var->function(&p2)), 0.0, 1e-6);
2324 TEST_F(MetaVariableTest, cos)
2326 Particle p({ M_PI / 2.0, -0.4, 0.8, 1.0}, 11);
2327 Particle p2({ 0.0, -0.4, 0.8, 1.0 }, -11);
2330 ASSERT_NE(var,
nullptr);
2331 EXPECT_NEAR(std::get<double>(var->function(&p)), 0.0, 1e-6);
2332 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p2)), 1.0);
2336 TEST_F(MetaVariableTest, NBDeltaIfMissingDeathTest)
2343 TEST_F(MetaVariableTest, matchedMC)
2348 particles.registerRelationTo(mcParticles);
2353 auto* mcParticle = mcParticles.
appendNew();
2356 auto* p1 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
2357 p1->addRelationTo(mcParticle);
2362 auto* p2 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
2363 p2->addRelationTo(mcParticle);
2368 auto* p3 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
2369 p3->addRelationTo(mcParticle);
2372 auto* p4 = particles.appendNew(mcParticle);
2375 ASSERT_NE(var,
nullptr);
2376 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), -1);
2377 EXPECT_FLOAT_EQ(std::get<double>(var->function(p2)), 1);
2378 EXPECT_FLOAT_EQ(std::get<double>(var->function(p3)), 0);
2379 EXPECT_FLOAT_EQ(std::get<double>(var->function(p4)), 0);
2382 TEST_F(MetaVariableTest, countInList)
2389 outputList.registerInDataStore(flags);
2391 outputList.create();
2392 outputList->initialize(22,
"pList1");
2407 ASSERT_NE(var,
nullptr);
2408 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 2);
2411 ASSERT_NE(var,
nullptr);
2412 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 5);
2415 ASSERT_NE(var,
nullptr);
2416 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 0);
2419 ASSERT_NE(var,
nullptr);
2420 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 5);
2423 TEST_F(MetaVariableTest, isInList)
2432 gammalist.registerInDataStore(flags);
2435 gammalist->initialize(22,
"testGammaList");
2440 auto* inthelist = particles.appendNew(goingin);
2441 auto* notinthelist = particles.appendNew(notgoingin);
2451 EXPECT_B2FATAL(std::get<bool>(vnonsense->
function(notinthelist)));
2452 EXPECT_TRUE(std::get<bool>(vsensible->
function(inthelist)));
2453 EXPECT_FALSE(std::get<bool>(vsensible->
function(notinthelist)));
2457 TEST_F(MetaVariableTest, cutIsInList)
2463 const std::string listname {
"wil/d(-+)'':l*"};
2467 particlelist.registerInDataStore(flags);
2469 particlelist.create();
2470 particlelist->initialize(22, listname);
2474 auto* inthelist = particles.appendNew(goingin);
2475 auto* notinthelist = particles.appendNew(notgoingin);
2484 EXPECT_B2FATAL(std::get<bool>(nonexistlist->
function(inthelist)));
2485 EXPECT_FALSE(std::get<bool>(existlist->
function(notinthelist)));
2486 EXPECT_TRUE(std::get<bool>(existlist->
function(inthelist)));
2489 TEST_F(MetaVariableTest, sourceObjectIsInList)
2501 gammalist.registerInDataStore(flags);
2508 gammalist->initialize(22,
"testGammaList");
2513 cl0->setEnergy(1.0);
2516 cl0->setClusterId(0);
2518 cl1->setEnergy(1.0);
2520 cl1->setClusterId(1);
2528 auto* myphoton_ = particles.appendNew(myphoton);
2529 gammalist->addParticle(myphoton_);
2531 auto* iscopied = particles.appendNew(iscopiedin);
2532 auto* notcopied = particles.appendNew(notcopiedin);
2539 EXPECT_B2FATAL(std::get<int>(vnonsense->
function(iscopied)));
2540 EXPECT_EQ(std::get<int>(vsensible->
function(iscopied)), 1);
2541 EXPECT_EQ(std::get<int>(vsensible->
function(notcopied)), 0);
2546 auto* composite_ = particles.appendNew(undefined);
2547 auto* undefined_ = particles.appendNew(composite);
2548 EXPECT_EQ(std::get<int>(vsensible->
function(composite_)), -1);
2549 EXPECT_EQ(std::get<int>(vsensible->
function(undefined_)), -1);
2552 TEST_F(MetaVariableTest, mcParticleIsInMCList)
2563 particles.registerRelationTo(mcparticles);
2565 list.registerInDataStore(flags);
2566 anotherlist.registerInDataStore(flags);
2572 list->initialize(22,
"testList");
2574 anotherlist.create();
2575 anotherlist->initialize(22,
"supplimentaryList");
2578 auto* mcphoton = mcparticles.
appendNew();
2582 auto* mcelectron = mcparticles.
appendNew();
2586 auto* mcanotherelectron = mcparticles.
appendNew();
2590 auto* mcyetanotherelectron = mcparticles.
appendNew();
2595 auto* photon = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 22);
2596 photon->addRelationTo(mcphoton);
2597 list->addParticle(photon);
2599 auto* electron = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 22);
2600 electron->addRelationTo(mcelectron);
2601 list->addParticle(electron);
2603 auto* other = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 22);
2604 other->addRelationTo(mcanotherelectron);
2606 auto* yetanotherelectron = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 22);
2607 yetanotherelectron->addRelationTo(mcyetanotherelectron);
2608 anotherlist->addParticle(yetanotherelectron);
2616 EXPECT_B2FATAL(std::get<bool>(vnonsense->
function(photon)));
2617 EXPECT_TRUE(std::get<bool>(vsensible->
function(photon)));
2618 EXPECT_TRUE(std::get<bool>(vsensible->
function(electron)));
2619 EXPECT_FALSE(std::get<bool>(vsensible->
function(other)));
2620 EXPECT_FALSE(std::get<bool>(vsensible->
function(yetanotherelectron)));
2625 auto* composite_ = particles.appendNew(undefined);
2626 auto* undefined_ = particles.appendNew(composite);
2627 EXPECT_FALSE(std::get<bool>(vsensible->
function(composite_)));
2628 EXPECT_FALSE(std::get<bool>(vsensible->
function(undefined_)));
2631 TEST_F(MetaVariableTest, mostB2BAndClosestParticles)
2641 gearbox.setBackends({std::string(
"file:")});
2643 gearbox.open(
"geometry/Belle2.xml",
false);
2653 gammalist.registerInDataStore(flags);
2654 emptylist.registerInDataStore(flags);
2657 gammalist->initialize(22,
"testGammaList");
2659 emptylist->initialize(22,
"testEmptyList");
2662 std::vector<Particle> gammavector = {
2669 for (
const auto& g : gammavector)
2670 particles.appendNew(g);
2673 for (
size_t i = 0; i < gammavector.size(); i++)
2677 const auto* electron = particles.appendNew(
2687 EXPECT_B2FATAL(std::get<double>(nonexistent->function(electron)));
2690 EXPECT_TRUE(std::isnan(std::get<double>(empty->function(electron))));
2693 EXPECT_FLOAT_EQ(std::get<double>(closest->function(electron)), 0.68014491);
2696 EXPECT_FLOAT_EQ(std::get<double>(closestCMS->function(electron)), 0.67901474);
2704 EXPECT_B2FATAL(std::get<double>(nonexistent->function(electron)));
2707 EXPECT_TRUE(std::isnan(std::get<double>(empty->function(electron))));
2710 EXPECT_FLOAT_EQ(std::get<double>(closest->function(electron)), 3.4);
2713 EXPECT_FLOAT_EQ(std::get<double>(closestCMS->function(electron)), 3.2732551);
2716 EXPECT_FLOAT_EQ(std::get<double>(closestCMSLabE->function(electron)), 3.4);
2724 EXPECT_B2FATAL(std::get<double>(nonexistent->function(electron)));
2727 EXPECT_TRUE(std::isnan(std::get<double>(empty->function(electron))));
2730 EXPECT_FLOAT_EQ(std::get<double>(mostB2B->function(electron)), 2.2869499);
2733 EXPECT_FLOAT_EQ(std::get<double>(mostB2BCMS->function(electron)), 2.8312778);
2741 EXPECT_B2FATAL(std::get<double>(nonexistent->function(electron)));
2744 EXPECT_TRUE(std::isnan(std::get<double>(empty->function(electron))));
2747 EXPECT_FLOAT_EQ(std::get<double>(mostB2B->function(electron)), 1.7);
2750 EXPECT_FLOAT_EQ(std::get<double>(mostB2BCMS->function(electron)), 1.5848758);
2753 EXPECT_FLOAT_EQ(std::get<double>(mostB2BCMSLabE->function(electron)), 1.7);
2757 TEST_F(MetaVariableTest, totalEnergyOfParticlesInList)
2766 gammalist.registerInDataStore(flags);
2769 gammalist->initialize(22,
"testGammaList");
2772 std::vector<Particle> gammavector = {
2781 for (
const auto& g : gammavector)
2782 particles.appendNew(g);
2785 for (
size_t i = 0; i < gammavector.size(); i++)
2790 "totalEnergyOfParticlesInList(NONEXISTANTLIST)");
2792 "totalEnergyOfParticlesInList(testGammaList)");
2795 EXPECT_B2FATAL(std::get<double>(vnonsense->
function(
nullptr)));
2796 EXPECT_FLOAT_EQ(std::get<double>(vsensible->
function(
nullptr)), 4.3);
2798 TEST_F(MetaVariableTest, totalPxOfParticlesInList)
2807 gammalist.registerInDataStore(flags);
2810 gammalist->initialize(22,
"testGammaList");
2813 std::vector<Particle> gammavector = {
2822 for (
const auto& g : gammavector)
2823 particles.appendNew(g);
2826 for (
size_t i = 0; i < gammavector.size(); i++)
2831 "totalPxOfParticlesInList(NONEXISTANTLIST)");
2833 "totalPxOfParticlesInList(testGammaList)");
2836 EXPECT_B2FATAL(std::get<double>(vnonsense->
function(
nullptr)));
2837 EXPECT_FLOAT_EQ(std::get<double>(vsensible->
function(
nullptr)), 2.2);
2839 TEST_F(MetaVariableTest, totalPyOfParticlesInList)
2848 gammalist.registerInDataStore(flags);
2851 gammalist->initialize(22,
"testGammaList");
2854 std::vector<Particle> gammavector = {
2863 for (
const auto& g : gammavector)
2864 particles.appendNew(g);
2867 for (
size_t i = 0; i < gammavector.size(); i++)
2872 "totalPyOfParticlesInList(NONEXISTANTLIST)");
2874 "totalPyOfParticlesInList(testGammaList)");
2877 EXPECT_B2FATAL(std::get<double>(vnonsense->
function(
nullptr)));
2878 EXPECT_FLOAT_EQ(std::get<double>(vsensible->
function(
nullptr)), 1.5);
2880 TEST_F(MetaVariableTest, totalPzOfParticlesInList)
2889 gammalist.registerInDataStore(flags);
2892 gammalist->initialize(22,
"testGammaList");
2895 std::vector<Particle> gammavector = {
2904 for (
const auto& g : gammavector)
2905 particles.appendNew(g);
2908 for (
size_t i = 0; i < gammavector.size(); i++)
2913 "totalPzOfParticlesInList(NONEXISTANTLIST)");
2915 "totalPzOfParticlesInList(testGammaList)");
2918 EXPECT_B2FATAL(std::get<double>(vnonsense->
function(
nullptr)));
2919 EXPECT_FLOAT_EQ(std::get<double>(vsensible->
function(
nullptr)), 3.1);
2921 TEST_F(MetaVariableTest, maxPtInList)
2930 gammalist.registerInDataStore(flags);
2933 gammalist->initialize(22,
"testGammaList");
2936 std::vector<Particle> gammavector = {
2945 for (
const auto& g : gammavector)
2946 particles.appendNew(g);
2949 for (
size_t i = 0; i < gammavector.size(); i++)
2954 "maxPtInList(NONEXISTANTLIST)");
2956 "maxPtInList(testGammaList)");
2959 EXPECT_B2FATAL(std::get<double>(vnonsense->
function(
nullptr)));
2960 EXPECT_FLOAT_EQ(std::get<double>(vsensible->
function(
nullptr)), sqrt(0.5 * 0.5 + 0.4 * 0.4));
2964 TEST_F(MetaVariableTest, numberOfNonOverlappingParticles)
2971 outputList.registerInDataStore(flags);
2973 outputList.create();
2974 outputList->initialize(22,
"pList1");
2984 ASSERT_NE(var,
nullptr);
2985 EXPECT_EQ(std::get<int>(var->function(p1)), 1);
2986 EXPECT_EQ(std::get<int>(var->function(p2)), 1);
2987 EXPECT_EQ(std::get<int>(var->function(p3)), 2);
2991 TEST_F(MetaVariableTest, veto)
2996 const Particle* p = particles.appendNew(
Particle({0.8, 0.8, 1.131370849898476039041351, 1.6}, 22,
3001 outputList.registerInDataStore(flags);
3003 outputList.create();
3004 outputList->initialize(22,
"pList1");
3006 particles.appendNew(
Particle({0.5, 0.4953406774856531014212777, 0.5609256753154148484773173, 0.9}, 22,
3021 outputList2.registerInDataStore(flags);
3023 outputList2.create();
3024 outputList2->initialize(22,
"pList2");
3039 ASSERT_NE(var,
nullptr);
3040 EXPECT_TRUE(std::get<bool>(var->function(p)));
3043 ASSERT_NE(var,
nullptr);
3044 EXPECT_FALSE(std::get<bool>(var->function(p)));
3048 TEST_F(MetaVariableTest, averageValueInList)
3057 gammalist.registerInDataStore(flags);
3060 gammalist->initialize(22,
"testGammaList");
3063 std::vector<Particle> gammavector = {
3072 for (
const auto& g : gammavector)
3073 particles.appendNew(g);
3076 for (
size_t i = 0; i < gammavector.size(); i++)
3081 "averageValueInList(testGammaList, px)");
3083 "averageValueInList(testGammaList, py)");
3085 "averageValueInList(testGammaList, pz)");
3087 "averageValueInList(testGammaList, E)");
3089 EXPECT_FLOAT_EQ(std::get<double>(vmeanpx->
function(
nullptr)), 0.44);
3090 EXPECT_FLOAT_EQ(std::get<double>(vmeanpy->
function(
nullptr)), 0.3);
3091 EXPECT_FLOAT_EQ(std::get<double>(vmeanpz->
function(
nullptr)), 0.6);
3092 EXPECT_FLOAT_EQ(std::get<double>(vmeanE->
function(
nullptr)), 0.86);
3095 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"averageValueInList(testGammaList)"));
3098 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"averageValueInList(testGammaList, NONEXISTANTVARIABLE)"));
3102 "averageValueInList(NONEXISTANTLIST, px)");
3104 EXPECT_B2FATAL(std::get<double>(vnolist->
function(
nullptr)));
3107 TEST_F(MetaVariableTest, medianValueInList)
3116 oddgammalist.registerInDataStore(flags);
3118 oddgammalist.create();
3119 oddgammalist->initialize(22,
"oddGammaList");
3122 evengammalist.registerInDataStore(flags);
3124 evengammalist.create();
3125 evengammalist->initialize(22,
"evenGammaList");
3128 std::vector<Particle> gammavector = {
3137 for (
const auto& g : gammavector)
3138 particles.appendNew(g);
3142 for (
size_t i = 1; i < gammavector.size(); i++) {
3149 "medianValueInList(oddGammaList, px)");
3151 "medianValueInList(oddGammaList, py)");
3153 "medianValueInList(oddGammaList, pz)");
3155 "medianValueInList(oddGammaList, E)");
3157 EXPECT_FLOAT_EQ(std::get<double>(voddmedianpx->
function(
nullptr)), 0.5);
3158 EXPECT_FLOAT_EQ(std::get<double>(voddmedianpy->
function(
nullptr)), 0.3);
3159 EXPECT_FLOAT_EQ(std::get<double>(voddmedianpz->
function(
nullptr)), 0.7);
3160 EXPECT_FLOAT_EQ(std::get<double>(voddmedianE->
function(
nullptr)), 0.9);
3164 "medianValueInList(evenGammaList, px)");
3166 "medianValueInList(evenGammaList, py)");
3168 "medianValueInList(evenGammaList, pz)");
3170 "medianValueInList(evenGammaList, E)");
3172 EXPECT_FLOAT_EQ(std::get<double>(vevenmedianpx->
function(
nullptr)), 0.45);
3173 EXPECT_FLOAT_EQ(std::get<double>(vevenmedianpy->
function(
nullptr)), 0.25);
3174 EXPECT_FLOAT_EQ(std::get<double>(vevenmedianpz->
function(
nullptr)), 0.7);
3175 EXPECT_FLOAT_EQ(std::get<double>(vevenmedianE->
function(
nullptr)), 0.9);
3178 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"medianValueInList(oddGammaList)"));
3181 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"medianValueInList(oddGammaList, NONEXISTANTVARIABLE)"));
3185 "medianValueInList(NONEXISTANTLIST, px)");
3187 EXPECT_B2FATAL(std::get<double>(vnolist->
function(
nullptr)));
3190 TEST_F(MetaVariableTest, productValueInList)
3199 gammalist.registerInDataStore(flags);
3202 gammalist->initialize(22,
"testGammaList");
3205 std::vector<Particle> gammavector = {
3214 for (
const auto& g : gammavector)
3215 particles.appendNew(g);
3218 for (
size_t i = 0; i < gammavector.size(); i++)
3223 "productValueInList(testGammaList, px)");
3225 "productValueInList(testGammaList, py)");
3227 "productValueInList(testGammaList, pz)");
3229 "productValueInList(testGammaList, E)");
3231 EXPECT_FLOAT_EQ(std::get<double>(vproductpx->
function(
nullptr)), 0.015);
3232 EXPECT_FLOAT_EQ(std::get<double>(vproductpy->
function(
nullptr)), 0.00192);
3233 EXPECT_FLOAT_EQ(std::get<double>(vproductpz->
function(
nullptr)), 0.06272);
3234 EXPECT_FLOAT_EQ(std::get<double>(vproductE->
function(
nullptr)), 0.42768);
3237 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"productValueInList(testGammaList)"));
3240 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"productValueInList(testGammaList, NONEXISTANTVARIABLE)"));
3244 "productValueInList(NONEXISTANTLIST, px)");
3246 EXPECT_B2FATAL(std::get<double>(vnolist->
function(
nullptr)));
3249 TEST_F(MetaVariableTest, sumValueInList)
3258 gammalist.registerInDataStore(flags);
3261 gammalist->initialize(22,
"testGammaList");
3264 std::vector<Particle> gammavector = {
3273 for (
const auto& g : gammavector)
3274 particles.appendNew(g);
3277 for (
size_t i = 0; i < gammavector.size(); i++)
3282 "sumValueInList(testGammaList, px)");
3284 "sumValueInList(testGammaList, py)");
3286 "sumValueInList(testGammaList, pz)");
3288 "sumValueInList(testGammaList, E)");
3290 EXPECT_FLOAT_EQ(std::get<double>(vsumpx->
function(
nullptr)), 2.2);
3291 EXPECT_FLOAT_EQ(std::get<double>(vsumpy->
function(
nullptr)), 1.5);
3292 EXPECT_FLOAT_EQ(std::get<double>(vsumpz->
function(
nullptr)), 3.0);
3293 EXPECT_FLOAT_EQ(std::get<double>(vsumE->
function(
nullptr)), 4.3);
3296 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"sumValueInList(testGammaList)"));
3299 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"sumValueInList(testGammaList, NONEXISTANTVARIABLE)"));
3303 "sumValueInList(NONEXISTANTLIST, px)");
3305 EXPECT_B2FATAL(std::get<double>(vnolist->
function(
nullptr)));
3308 TEST_F(MetaVariableTest, pValueCombination)
3310 PxPyPzEVector momentum;
3312 std::vector<int> daughterIndices;
3315 momentum += KS.get4Vector();
3316 Particle* newDaughters = particles.appendNew(KS);
3319 Jpsi.setPValue(0.9);
3320 momentum += Jpsi.get4Vector();
3321 newDaughters = particles.appendNew(Jpsi);
3327 ASSERT_NE(singlePvalue,
nullptr);
3328 EXPECT_FLOAT_EQ(std::get<double>(singlePvalue->
function(B)), 0.5);
3331 ASSERT_NE(twoPvalues,
nullptr);
3332 EXPECT_FLOAT_EQ(std::get<double>(twoPvalues->
function(B)), 0.05 * (1 - log(0.05)));
3336 ASSERT_NE(threePvalues,
nullptr);
3337 EXPECT_FLOAT_EQ(std::get<double>(threePvalues->
function(B)), 0.045 * (1 - log(0.045) + 0.5 * log(0.045) * log(0.045)));
3343 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"pValueCombination(chiProb, NONEXISTANTVARIABLE)"));
3347 TEST_F(MetaVariableTest, daughterCombinationOneGeneration)
3349 const int nDaughters = 5;
3350 PxPyPzEVector momentum(0, 0, 0, 0);
3352 std::vector<int> daughterIndices;
3353 std::vector<PxPyPzEVector> daughterMomenta;
3355 for (
int i = 0; i < nDaughters; i++) {
3356 PxPyPzEVector mom(1, i * 0.5, 1, i * 1.0 + 2.0);
3357 Particle d(mom, (i % 2) ? 111 : 113);
3358 Particle* newDaughters = particles.appendNew(d);
3360 daughterMomenta.push_back(mom);
3361 momentum = momentum + mom;
3367 double M_test = (daughterMomenta[0] + daughterMomenta[1] + daughterMomenta[2]).mag();
3368 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), M_test);
3371 M_test = (daughterMomenta[0] + daughterMomenta[4]).mag();
3372 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), M_test);
3377 double p_test = (daughterMomenta[0] + daughterMomenta[1] + daughterMomenta[4]).P();
3378 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), p_test);
3382 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"daughterCombination(aVeryNonExistingVariableSillyName, 1, 0, 4)"));
3385 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3386 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3390 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3391 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3395 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3396 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3401 TEST_F(MetaVariableTest, daughterCombinationTwoGenerations)
3407 PxPyPzEVector momentum_1(0, 0, 0, 0);
3408 std::vector<PxPyPzEVector> daughterMomenta_1;
3409 std::vector<int> daughterIndices_1;
3411 for (
int i = 0; i < 3; i++) {
3412 PxPyPzEVector mom(i * 0.2, 1, 1, i * 1.0 + 2.0);
3413 Particle d(mom, (i % 2) ? 111 : 113);
3414 Particle* newDaughters = particles.appendNew(d);
3416 daughterMomenta_1.push_back(mom);
3417 momentum_1 = momentum_1 + mom;
3425 PxPyPzEVector momentum_2(0, 0, 0, 0);
3426 std::vector<PxPyPzEVector> daughterMomenta_2;
3427 std::vector<int> daughterIndices_2;
3429 for (
int i = 0; i < 2; i++) {
3430 PxPyPzEVector mom(1, 1, i * 0.3, i * 1.0 + 2.0);
3431 Particle d(mom, (i % 2) ? 111 : 113);
3432 Particle* newDaughters = particles.appendNew(d);
3434 daughterMomenta_2.push_back(mom);
3435 momentum_2 = momentum_2 + mom;
3449 double M_test = (momentum_1 + momentum_2).mag();
3450 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), M_test);
3454 M_test = (momentum_1).mag();
3455 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), M_test);
3459 M_test = (daughterMomenta_1[0] + daughterMomenta_1[1] + daughterMomenta_2[0]).mag();
3460 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), M_test);
3465 TEST_F(MetaVariableTest, useAlternativeDaughterHypothesis)
3470 const int nDaughters = 5;
3474 PxPyPzEVector momentum(0, 0, 0, 0);
3475 std::vector<int> daughterIndices;
3476 for (
int i = 0; i < nDaughters; i++) {
3477 double px = i * 0.1;
3478 double py = i * 0.3;
3479 double pz = -i * 0.1 - 0.2;
3481 PxPyPzEVector mom(px, py, pz, 1);
3485 d.updateMass(pdgCode);
3486 mom = d.get4Vector();
3488 Particle* daughters = particles.appendNew(d);
3490 momentum = momentum + mom;
3496 PxPyPzEVector momentumAlt(0, 0, 0, 0);
3497 std::vector<int> daughterIndicesAlt;
3498 for (
int i = 0; i < nDaughters; i++) {
3499 double px = i * 0.1;
3500 double py = i * 0.3;
3501 double pz = -i * 0.1 - 0.2;
3503 PxPyPzEVector mom(px, py, pz, 1);
3511 d.updateMass(pdgCode);
3512 mom = d.get4Vector();
3514 Particle* daughters = particles.appendNew(d);
3516 momentumAlt = momentumAlt + mom;
3522 std::cout <<
"mass test" << std::endl;
3525 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), std::get<double>(varAlt->
function(pAlt)));
3528 std::cout <<
"charge test" << std::endl;
3530 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), std::get<double>(varAlt->
function(pAlt)));
3533 std::cout <<
"momentum test" << std::endl;
3536 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), std::get<double>(varAlt->
function(pAlt)));
3537 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), std::get<double>(varAlt->
function(p)));
3538 EXPECT_FLOAT_EQ(std::get<double>(var->function(pAlt)), std::get<double>(varAlt->
function(pAlt)));
3544 TEST_F(MetaVariableTest, daughterAngle)
3550 PxPyPzEVector momentum_1(0, 0, 0, 0);
3551 std::vector<PxPyPzEVector> daughterMomenta_1;
3552 std::vector<int> daughterIndices_1;
3554 for (
int i = 0; i < 3; i++) {
3555 PxPyPzEVector mom(i * 0.2, 1, 1, i * 1.0 + 2.0);
3556 Particle d(mom, (i % 2) ? -11 : 211);
3557 Particle* newDaughters = particles.appendNew(d);
3559 daughterMomenta_1.push_back(mom);
3560 momentum_1 = momentum_1 + mom;
3568 PxPyPzEVector momentum_2(0, 0, 0, 0);
3569 std::vector<PxPyPzEVector> daughterMomenta_2;
3570 std::vector<int> daughterIndices_2;
3572 for (
int i = 0; i < 2; i++) {
3573 PxPyPzEVector mom(1, 1, i * 0.3, i * 1.0 + 2.0);
3574 Particle d(mom, (i % 2) ? -11 : 211);
3575 Particle* newDaughters = particles.appendNew(d);
3577 daughterMomenta_2.push_back(mom);
3578 momentum_2 = momentum_2 + mom;
3591 double v_test = acos(momentum_1.Vect().Unit().Dot(momentum_2.Vect().Unit()));
3593 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), v_test);
3597 v_test = acos(daughterMomenta_1[0].Vect().
Unit().Dot(daughterMomenta_2[0].Vect().
Unit()));
3598 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), v_test);
3601 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3602 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3605 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3606 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3610 TEST_F(MetaVariableTest, mcDaughterVariables)
3616 particles.registerRelationTo(mcParticles);
3620 PxPyPzEVector momentum_1(0, 0, 0, 0);
3621 std::vector<PxPyPzEVector> daughterMomenta_1;
3622 std::vector<int> daughterIndices_1;
3624 for (
int i = 0; i < 3; i++) {
3625 PxPyPzEVector mom(i * 0.2, 1, 1, i * 1.0 + 2.0);
3626 Particle d(mom, (i % 2) ? -11 : 211);
3627 Particle* newDaughters = particles.appendNew(d);
3629 daughterMomenta_1.push_back(mom);
3630 momentum_1 = momentum_1 + mom;
3632 auto* mcParticle = mcParticles.
appendNew();
3640 auto* mcCompositeDau_1 = mcParticles.
appendNew();
3641 mcCompositeDau_1->setPDG(411);
3643 mcCompositeDau_1->set4Vector(momentum_1);
3648 PxPyPzEVector momentum_2(0, 0, 0, 0);
3649 std::vector<PxPyPzEVector> daughterMomenta_2;
3650 std::vector<int> daughterIndices_2;
3652 for (
int i = 0; i < 2; i++) {
3653 PxPyPzEVector mom(1, 1, i * 0.3, i * 1.0 + 2.0);
3654 Particle d(mom, (i % 2) ? -11 : 211);
3655 Particle* newDaughters = particles.appendNew(d);
3657 daughterMomenta_2.push_back(mom);
3658 momentum_2 = momentum_2 + mom;
3660 auto* mcParticle = mcParticles.
appendNew();
3668 auto* mcCompositeDau_2 = mcParticles.
appendNew();
3669 mcCompositeDau_2->setPDG(411);
3671 mcCompositeDau_2->set4Vector(momentum_2);
3681 double v_test = acos(momentum_1.Vect().Unit().Dot(momentum_2.Vect().Unit()));
3682 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), v_test);
3685 v_test = acos(daughterMomenta_1[0].Vect().
Unit().Dot(daughterMomenta_2[0].Vect().
Unit()));
3686 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), v_test);
3689 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3690 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3693 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3694 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3698 ASSERT_NE(var,
nullptr);
3699 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
3702 ASSERT_NE(var,
nullptr);
3703 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3707 ASSERT_NE(var,
nullptr);
3708 v_test = momentum_2.Phi() - momentum_1.Phi();
3709 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), v_test);
3713 TEST_F(MetaVariableTest, varForFirstMCAncestorOfType)
3718 particles.registerRelationTo(mcParticles);
3722 DList.registerInDataStore();
3724 DList->initialize(421,
"D0:vartest");
3726 PxPyPzEVector momentum;
3727 PxPyPzEVector momentum_0;
3728 PxPyPzEVector momentum_1;
3729 std::vector<int> D_daughterIndices;
3730 std::vector<int> D_grandDaughterIndices_0;
3731 std::vector<int> D_grandDaughterIndices_1;
3749 mcg_d_0.
set4Vector(PxPyPzEVector(6, 6, 6, 6));
3751 mcg_d_1.
set4Vector(PxPyPzEVector(5, 5, 5, 5));
3753 mcg_gd_0_0.
set4Vector(PxPyPzEVector(4, 4, 4, 4));
3755 mcg_gd_0_1.
set4Vector(PxPyPzEVector(3, 3, 3, 3));
3757 mcg_gd_1_0.
set4Vector(PxPyPzEVector(2, 1, 2, 2));
3759 mcg_gd_1_1.
set4Vector(PxPyPzEVector(1, 1, 1, 1));
3761 mcg_not_child.
set4Vector(PxPyPzEVector(10, 10, 10, 10));
3773 auto* mc_not_child = mcParticles[0];
3774 auto* mc_m = mcParticles[1];
3775 auto* mc_d_0 = mcParticles[2];
3776 auto* mc_d_1 = mcParticles[3];
3777 auto* mc_gd_0_0 = mcParticles[4];
3778 auto* mc_gd_0_1 = mcParticles[5];
3779 auto* mc_gd_1_0 = mcParticles[6];
3780 auto* mc_gd_1_1 = mcParticles[7];
3794 const Particle* D_gd_0_0 = particles.appendNew(PxPyPzEVector(0.0, 1, 1, 1), 211);
3795 const Particle* D_gd_0_1 = particles.appendNew(PxPyPzEVector(1.0, 1, 1, 1), -211);
3796 const Particle* D_gd_1_0 = particles.appendNew(PxPyPzEVector(2.0, 1, 1, 1), 211);
3797 const Particle* D_gd_1_1 = particles.appendNew(PxPyPzEVector(3.0, 1, 1, 1), -211);
3799 D_grandDaughterIndices_0.push_back(D_gd_0_0->
getArrayIndex());
3800 D_grandDaughterIndices_0.push_back(D_gd_0_1->
getArrayIndex());
3801 D_grandDaughterIndices_1.push_back(D_gd_1_0->
getArrayIndex());
3802 D_grandDaughterIndices_1.push_back(D_gd_1_1->
getArrayIndex());
3816 DList->addParticle(D_m);
3819 const Particle* not_child = particles.appendNew(PxPyPzEVector(5.0, 1, 1, 1), 211);
3822 const Particle* not_child_2 = particles.appendNew(PxPyPzEVector(6.0, 1, 1, 1), 211);
3836 ASSERT_NE(var_d,
nullptr);
3837 EXPECT_TRUE(std::get<double>(var_d->
function(D_gd_0_0)) >= 0);
3838 EXPECT_FLOAT_EQ(std::get<double>(var_d->
function(D_gd_0_0)), std::get<double>(var_d->
function(D_gd_0_1)));
3839 EXPECT_FLOAT_EQ(std::get<double>(var_d->
function(D_gd_1_0)), std::get<double>(var_d->
function(D_gd_1_1)));
3840 EXPECT_FLOAT_EQ(std::get<double>(var_d->
function(D_gd_0_0)), std::get<double>(var_d->
function(D_gd_1_0)));
3841 EXPECT_FLOAT_EQ(std::get<double>(var_d->
function(D_gd_0_1)), std::get<double>(var_d->
function(D_gd_1_1)));
3842 EXPECT_TRUE(std::isnan(std::get<double>(var_d->
function(not_child))));
3843 EXPECT_TRUE(std::isnan(std::get<double>(var_d->
function(not_child_2))));
3848 ASSERT_NE(var_310,
nullptr);
3849 EXPECT_FLOAT_EQ(std::get<double>(var_310->
function(D_gd_0_0)), std::get<double>(var_310->
function(D_gd_0_1)));
3850 EXPECT_FLOAT_EQ(std::get<double>(var_310->
function(D_gd_1_0)), std::get<double>(var_310->
function(D_gd_1_1)));
3851 EXPECT_NE(std::get<double>(var_310->
function(D_gd_0_0)), std::get<double>(var_310->
function(D_gd_1_0)));
3852 EXPECT_NE(std::get<double>(var_310->
function(D_gd_0_1)), std::get<double>(var_310->
function(D_gd_1_1)));
3853 EXPECT_TRUE(std::isnan(std::get<double>(var_310->
function(not_child))));
3854 EXPECT_TRUE(std::isnan(std::get<double>(var_310->
function(not_child_2))));
3855 EXPECT_FLOAT_EQ(
int(std::get<double>(
Manager::Instance().getVariable(
"varForFirstMCAncestorOfType(310, E)")->function(D_gd_0_0))),
3859 TEST_F(MetaVariableTest, isDescendantOfList)
3863 DList.registerInDataStore();
3865 DList->initialize(421,
"D0:vartest");
3867 BList.registerInDataStore();
3869 BList->initialize(521,
"B:vartest");
3872 PxPyPzEVector momentum;
3873 PxPyPzEVector momentum_0;
3874 PxPyPzEVector momentum_1;
3876 std::vector<int> D_daughterIndices;
3877 std::vector<int> D_grandDaughterIndices_0;
3878 std::vector<int> D_grandDaughterIndices_1;
3879 std::vector<int> B_daughterIndices;
3880 std::vector<int> B_grandDaughterIndices;
3881 std::vector<int> B_grandGrandDaughterIndices;
3890 D_grandDaughterIndices_0.push_back(D_gd_0_0->
getArrayIndex());
3891 D_grandDaughterIndices_0.push_back(D_gd_0_1->
getArrayIndex());
3892 D_grandDaughterIndices_1.push_back(D_gd_1_0->
getArrayIndex());
3893 D_grandDaughterIndices_1.push_back(D_gd_1_1->
getArrayIndex());
3907 DList->addParticle(D_m);
3916 B_grandGrandDaughterIndices.push_back(B_ggd_0_0_0->
getArrayIndex());
3917 B_grandGrandDaughterIndices.push_back(B_ggd_0_0_1->
getArrayIndex());
3921 B_grandDaughterIndices.push_back(B_gd_0_0->
getArrayIndex());
3922 B_grandDaughterIndices.push_back(B_gd_0_1->
getArrayIndex());
3930 BList->addParticle(B_m);
3937 ASSERT_NE(var_0,
nullptr);
3938 EXPECT_TRUE(std::get<bool>(var_0->
function(D_gd_0_0)));
3939 EXPECT_TRUE(std::get<bool>(var_0->
function(D_gd_0_1)));
3940 EXPECT_TRUE(std::get<bool>(var_0->
function(D_gd_1_0)));
3941 EXPECT_TRUE(std::get<bool>(var_0->
function(D_gd_1_1)));
3942 EXPECT_TRUE(std::get<bool>(var_0->
function(D_d_0)));
3943 EXPECT_TRUE(std::get<bool>(var_0->
function(D_d_1)));
3944 EXPECT_FALSE(std::get<bool>(var_0->
function(B_ggd_0_0_0)));
3945 EXPECT_FALSE(std::get<bool>(var_0->
function(B_ggd_0_0_1)));
3946 EXPECT_FALSE(std::get<bool>(var_0->
function(B_gd_0_0)));
3947 EXPECT_FALSE(std::get<bool>(var_0->
function(B_gd_0_1)));
3948 EXPECT_FALSE(std::get<bool>(var_0->
function(B_d_0)));
3949 EXPECT_FALSE(std::get<bool>(var_0->
function(B_d_1)));
3950 EXPECT_FALSE(std::get<bool>(var_0->
function(not_child)));
3953 ASSERT_NE(var_0a,
nullptr);
3954 EXPECT_FALSE(std::get<bool>(var_0a->
function(D_gd_0_0)));
3955 EXPECT_FALSE(std::get<bool>(var_0a->
function(D_gd_0_1)));
3956 EXPECT_FALSE(std::get<bool>(var_0a->
function(D_gd_1_0)));
3957 EXPECT_FALSE(std::get<bool>(var_0a->
function(D_gd_1_1)));
3958 EXPECT_TRUE(std::get<bool>(var_0a->
function(D_d_0)));
3959 EXPECT_TRUE(std::get<bool>(var_0a->
function(D_d_1)));
3960 EXPECT_FALSE(std::get<bool>(var_0a->
function(B_ggd_0_0_0)));
3961 EXPECT_FALSE(std::get<bool>(var_0a->
function(B_ggd_0_0_1)));
3962 EXPECT_FALSE(std::get<bool>(var_0a->
function(B_gd_0_0)));
3963 EXPECT_FALSE(std::get<bool>(var_0a->
function(B_gd_0_1)));
3964 EXPECT_FALSE(std::get<bool>(var_0a->
function(B_d_0)));
3965 EXPECT_FALSE(std::get<bool>(var_0a->
function(B_d_1)));
3966 EXPECT_FALSE(std::get<bool>(var_0a->
function(not_child)));
3969 ASSERT_NE(var_0b,
nullptr);
3970 EXPECT_TRUE(std::get<bool>(var_0b->
function(D_gd_0_0)));
3971 EXPECT_TRUE(std::get<bool>(var_0b->
function(D_gd_0_1)));
3972 EXPECT_TRUE(std::get<bool>(var_0b->
function(D_gd_1_0)));
3973 EXPECT_TRUE(std::get<bool>(var_0b->
function(D_gd_1_1)));
3974 EXPECT_FALSE(std::get<bool>(var_0b->
function(D_d_0)));
3975 EXPECT_FALSE(std::get<bool>(var_0b->
function(D_d_1)));
3976 EXPECT_FALSE(std::get<bool>(var_0b->
function(B_ggd_0_0_0)));
3977 EXPECT_FALSE(std::get<bool>(var_0b->
function(B_ggd_0_0_1)));
3978 EXPECT_FALSE(std::get<bool>(var_0b->
function(B_gd_0_0)));
3979 EXPECT_FALSE(std::get<bool>(var_0b->
function(B_gd_0_1)));
3980 EXPECT_FALSE(std::get<bool>(var_0b->
function(B_d_0)));
3981 EXPECT_FALSE(std::get<bool>(var_0b->
function(B_d_1)));
3982 EXPECT_FALSE(std::get<bool>(var_0b->
function(not_child)));
3985 ASSERT_NE(var_1,
nullptr);
3986 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_0_0)));
3987 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_0_1)));
3988 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_1_0)));
3989 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_1_1)));
3990 EXPECT_TRUE(std::get<bool>(var_1->
function(D_d_0)));
3991 EXPECT_TRUE(std::get<bool>(var_1->
function(D_d_1)));
3992 EXPECT_FALSE(std::get<bool>(var_1->
function(B_ggd_0_0_0)));
3993 EXPECT_FALSE(std::get<bool>(var_1->
function(B_ggd_0_0_1)));
3994 EXPECT_FALSE(std::get<bool>(var_1->
function(B_gd_0_0)));
3995 EXPECT_FALSE(std::get<bool>(var_1->
function(B_gd_0_1)));
3996 EXPECT_FALSE(std::get<bool>(var_1->
function(B_d_0)));
3997 EXPECT_FALSE(std::get<bool>(var_1->
function(B_d_1)));
3998 EXPECT_FALSE(std::get<bool>(var_1->
function(not_child)));
4001 ASSERT_NE(var_2,
nullptr);
4002 EXPECT_TRUE(std::get<bool>(var_2->
function(D_gd_0_0)));
4003 EXPECT_TRUE(std::get<bool>(var_2->
function(D_gd_0_1)));
4004 EXPECT_TRUE(std::get<bool>(var_2->
function(D_gd_1_0)));
4005 EXPECT_TRUE(std::get<bool>(var_2->
function(D_gd_1_1)));
4006 EXPECT_FALSE(std::get<bool>(var_2->
function(D_d_0)));
4007 EXPECT_FALSE(std::get<bool>(var_2->
function(D_d_1)));
4008 EXPECT_FALSE(std::get<bool>(var_2->
function(B_ggd_0_0_0)));
4009 EXPECT_FALSE(std::get<bool>(var_2->
function(B_ggd_0_0_1)));
4010 EXPECT_FALSE(std::get<bool>(var_2->
function(B_gd_0_0)));
4011 EXPECT_FALSE(std::get<bool>(var_2->
function(B_gd_0_1)));
4012 EXPECT_FALSE(std::get<bool>(var_2->
function(B_d_0)));
4013 EXPECT_FALSE(std::get<bool>(var_2->
function(B_d_1)));
4014 EXPECT_FALSE(std::get<bool>(var_2->
function(not_child)));
4017 ASSERT_NE(var_3,
nullptr);
4018 EXPECT_TRUE(std::get<bool>(var_3->
function(D_gd_0_0)));
4019 EXPECT_TRUE(std::get<bool>(var_3->
function(D_gd_0_1)));
4020 EXPECT_TRUE(std::get<bool>(var_3->
function(D_gd_1_0)));
4021 EXPECT_TRUE(std::get<bool>(var_3->
function(D_gd_1_1)));
4022 EXPECT_TRUE(std::get<bool>(var_3->
function(D_d_0)));
4023 EXPECT_TRUE(std::get<bool>(var_3->
function(D_d_1)));
4024 EXPECT_TRUE(std::get<bool>(var_3->
function(B_ggd_0_0_0)));
4025 EXPECT_TRUE(std::get<bool>(var_3->
function(B_ggd_0_0_1)));
4026 EXPECT_TRUE(std::get<bool>(var_3->
function(B_gd_0_0)));
4027 EXPECT_TRUE(std::get<bool>(var_3->
function(B_gd_0_1)));
4028 EXPECT_TRUE(std::get<bool>(var_3->
function(B_d_0)));
4029 EXPECT_TRUE(std::get<bool>(var_3->
function(B_d_1)));
4030 EXPECT_FALSE(std::get<bool>(var_3->
function(not_child)));
4033 ASSERT_NE(var_4,
nullptr);
4034 EXPECT_TRUE(std::get<bool>(var_4->
function(D_gd_0_0)));
4035 EXPECT_TRUE(std::get<bool>(var_4->
function(D_gd_0_1)));
4036 EXPECT_TRUE(std::get<bool>(var_4->
function(D_gd_1_0)));
4037 EXPECT_TRUE(std::get<bool>(var_4->
function(D_gd_1_1)));
4038 EXPECT_TRUE(std::get<bool>(var_4->
function(D_d_0)));
4039 EXPECT_TRUE(std::get<bool>(var_4->
function(D_d_1)));
4040 EXPECT_TRUE(std::get<bool>(var_4->
function(B_ggd_0_0_0)));
4041 EXPECT_TRUE(std::get<bool>(var_4->
function(B_ggd_0_0_1)));
4042 EXPECT_TRUE(std::get<bool>(var_4->
function(B_gd_0_0)));
4043 EXPECT_TRUE(std::get<bool>(var_4->
function(B_gd_0_1)));
4044 EXPECT_TRUE(std::get<bool>(var_4->
function(B_d_0)));
4045 EXPECT_TRUE(std::get<bool>(var_4->
function(B_d_1)));
4046 EXPECT_FALSE(std::get<bool>(var_4->
function(not_child)));
4049 ASSERT_NE(var_5,
nullptr);
4050 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_0_0)));
4051 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_0_1)));
4052 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_1_0)));
4053 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_1_1)));
4054 EXPECT_TRUE(std::get<bool>(var_5->
function(D_d_0)));
4055 EXPECT_TRUE(std::get<bool>(var_5->
function(D_d_1)));
4056 EXPECT_FALSE(std::get<bool>(var_5->
function(B_ggd_0_0_0)));
4057 EXPECT_FALSE(std::get<bool>(var_5->
function(B_ggd_0_0_1)));
4058 EXPECT_FALSE(std::get<bool>(var_5->
function(B_gd_0_0)));
4059 EXPECT_FALSE(std::get<bool>(var_5->
function(B_gd_0_1)));
4060 EXPECT_TRUE(std::get<bool>(var_5->
function(B_d_0)));
4061 EXPECT_TRUE(std::get<bool>(var_5->
function(B_d_1)));
4062 EXPECT_FALSE(std::get<bool>(var_5->
function(not_child)));
4065 ASSERT_NE(var_6,
nullptr);
4066 EXPECT_TRUE(std::get<bool>(var_6->
function(D_gd_0_0)));
4067 EXPECT_TRUE(std::get<bool>(var_6->
function(D_gd_0_1)));
4068 EXPECT_TRUE(std::get<bool>(var_6->
function(D_gd_1_0)));
4069 EXPECT_TRUE(std::get<bool>(var_6->
function(D_gd_1_1)));
4070 EXPECT_FALSE(std::get<bool>(var_6->
function(D_d_0)));
4071 EXPECT_FALSE(std::get<bool>(var_6->
function(D_d_1)));
4072 EXPECT_FALSE(std::get<bool>(var_6->
function(B_ggd_0_0_0)));
4073 EXPECT_FALSE(std::get<bool>(var_6->
function(B_ggd_0_0_1)));
4074 EXPECT_TRUE(std::get<bool>(var_6->
function(B_gd_0_0)));
4075 EXPECT_TRUE(std::get<bool>(var_6->
function(B_gd_0_1)));
4076 EXPECT_FALSE(std::get<bool>(var_6->
function(B_d_0)));
4077 EXPECT_FALSE(std::get<bool>(var_6->
function(B_d_1)));
4078 EXPECT_FALSE(std::get<bool>(var_6->
function(not_child)));
4081 ASSERT_NE(var_7,
nullptr);
4082 EXPECT_FALSE(std::get<bool>(var_7->
function(D_gd_0_0)));
4083 EXPECT_FALSE(std::get<bool>(var_7->
function(D_gd_0_1)));
4084 EXPECT_FALSE(std::get<bool>(var_7->
function(D_gd_1_0)));
4085 EXPECT_FALSE(std::get<bool>(var_7->
function(D_gd_1_1)));
4086 EXPECT_FALSE(std::get<bool>(var_7->
function(D_d_0)));
4087 EXPECT_FALSE(std::get<bool>(var_7->
function(D_d_1)));
4088 EXPECT_TRUE(std::get<bool>(var_7->
function(B_ggd_0_0_0)));
4089 EXPECT_TRUE(std::get<bool>(var_7->
function(B_ggd_0_0_1)));
4090 EXPECT_FALSE(std::get<bool>(var_7->
function(B_gd_0_0)));
4091 EXPECT_FALSE(std::get<bool>(var_7->
function(B_gd_0_1)));
4092 EXPECT_FALSE(std::get<bool>(var_7->
function(B_d_0)));
4093 EXPECT_FALSE(std::get<bool>(var_7->
function(B_d_1)));
4094 EXPECT_FALSE(std::get<bool>(var_7->
function(not_child)));
4098 TEST_F(MetaVariableTest, isMCDescendantOfList)
4103 particles.registerRelationTo(mcParticles);
4105 BList.registerInDataStore();
4107 BList->initialize(521,
"B:vartest");
4109 DList.registerInDataStore();
4111 DList->initialize(421,
"D0:vartest");
4113 PxPyPzEVector momentum;
4114 PxPyPzEVector momentum_0;
4115 PxPyPzEVector momentum_1;
4116 std::vector<int> daughterIndices;
4117 std::vector<int> grandDaughterIndices;
4118 std::vector<int> grandGrandDaughterIndices;
4119 std::vector<int> D_daughterIndices;
4120 std::vector<int> D_grandDaughterIndices_0;
4121 std::vector<int> D_grandDaughterIndices_1;
4155 auto* mc_m = mcParticles[0];
4156 auto* mc_d_0 = mcParticles[1];
4157 auto* mc_d_1 = mcParticles[2];
4158 auto* mc_gd_0_0 = mcParticles[3];
4159 auto* mc_gd_0_1 = mcParticles[4];
4160 auto* mc_ggd_0_0_0 = mcParticles[5];
4161 auto* mc_ggd_0_0_1 = mcParticles[6];
4162 auto* mc_not_child = mcParticles[7];
4175 const Particle* D_gd_0_0 = particles.appendNew(PxPyPzEVector(0.0, 1, 1, 1), 211);
4176 const Particle* D_gd_0_1 = particles.appendNew(PxPyPzEVector(1.0, 1, 1, 1), -211);
4177 const Particle* D_gd_1_0 = particles.appendNew(PxPyPzEVector(2.0, 1, 1, 1), 211);
4178 const Particle* D_gd_1_1 = particles.appendNew(PxPyPzEVector(3.0, 1, 1, 1), -211);
4180 D_grandDaughterIndices_0.push_back(D_gd_0_0->
getArrayIndex());
4181 D_grandDaughterIndices_0.push_back(D_gd_0_1->
getArrayIndex());
4182 D_grandDaughterIndices_1.push_back(D_gd_1_0->
getArrayIndex());
4183 D_grandDaughterIndices_1.push_back(D_gd_1_1->
getArrayIndex());
4197 DList->addParticle(D_m);
4200 const Particle* d_1 = particles.appendNew(PxPyPzEVector(0.0, 1, 1, 1), 211);
4201 const Particle* gd_0_1 = particles.appendNew(PxPyPzEVector(1.0, 1, 1, 1), -211);
4202 const Particle* ggd_0_0_0 = particles.appendNew(PxPyPzEVector(2.0, 1, 1, 1), 211);
4203 const Particle* ggd_0_0_1 = particles.appendNew(PxPyPzEVector(3.0, 1, 1, 1), -211);
4205 grandGrandDaughterIndices.push_back(ggd_0_0_0->
getArrayIndex());
4206 grandGrandDaughterIndices.push_back(ggd_0_0_1->
getArrayIndex());
4219 BList->addParticle(m);
4222 const Particle* not_child = particles.appendNew(PxPyPzEVector(5.0, 1, 1, 1), 211);
4225 const Particle* not_child_2 = particles.appendNew(PxPyPzEVector(6.0, 1, 1, 1), 211);
4233 m->addRelationTo(mc_m);
4237 ASSERT_NE(var_0,
nullptr);
4238 EXPECT_FALSE(std::get<bool>(var_0->
function(D_gd_0_0)));
4239 EXPECT_FALSE(std::get<bool>(var_0->
function(D_gd_0_1)));
4240 EXPECT_FALSE(std::get<bool>(var_0->
function(D_gd_1_0)));
4241 EXPECT_FALSE(std::get<bool>(var_0->
function(D_gd_1_1)));
4242 EXPECT_FALSE(std::get<bool>(var_0->
function(D_d_0)));
4243 EXPECT_FALSE(std::get<bool>(var_0->
function(D_d_1)));
4244 EXPECT_TRUE(std::get<bool>(var_0->
function(ggd_0_0_0)));
4245 EXPECT_TRUE(std::get<bool>(var_0->
function(ggd_0_0_1)));
4246 EXPECT_TRUE(std::get<bool>(var_0->
function(gd_0_0)));
4247 EXPECT_TRUE(std::get<bool>(var_0->
function(gd_0_1)));
4248 EXPECT_TRUE(std::get<bool>(var_0->
function(d_0)));
4249 EXPECT_TRUE(std::get<bool>(var_0->
function(d_1)));
4250 EXPECT_FALSE(std::get<bool>(var_0->
function(not_child)));
4251 EXPECT_FALSE(std::get<bool>(var_0->
function(not_child_2)));
4254 ASSERT_NE(var_1,
nullptr);
4255 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_0_0)));
4256 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_0_1)));
4257 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_1_0)));
4258 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_1_1)));
4259 EXPECT_FALSE(std::get<bool>(var_1->
function(D_d_0)));
4260 EXPECT_FALSE(std::get<bool>(var_1->
function(D_d_1)));
4261 EXPECT_TRUE(std::get<bool>(var_1->
function(ggd_0_0_0)));
4262 EXPECT_TRUE(std::get<bool>(var_1->
function(ggd_0_0_1)));
4263 EXPECT_TRUE(std::get<bool>(var_1->
function(gd_0_0)));
4264 EXPECT_TRUE(std::get<bool>(var_1->
function(gd_0_1)));
4265 EXPECT_TRUE(std::get<bool>(var_1->
function(d_0)));
4266 EXPECT_TRUE(std::get<bool>(var_1->
function(d_1)));
4267 EXPECT_FALSE(std::get<bool>(var_1->
function(not_child)));
4268 EXPECT_FALSE(std::get<bool>(var_1->
function(not_child_2)));
4271 ASSERT_NE(var_2,
nullptr);
4272 EXPECT_FALSE(std::get<bool>(var_2->
function(D_gd_0_0)));
4273 EXPECT_FALSE(std::get<bool>(var_2->
function(D_gd_0_1)));
4274 EXPECT_FALSE(std::get<bool>(var_2->
function(D_gd_1_0)));
4275 EXPECT_FALSE(std::get<bool>(var_2->
function(D_gd_1_1)));
4276 EXPECT_FALSE(std::get<bool>(var_2->
function(D_d_0)));
4277 EXPECT_FALSE(std::get<bool>(var_2->
function(D_d_1)));
4278 EXPECT_TRUE(std::get<bool>(var_2->
function(ggd_0_0_0)));
4279 EXPECT_TRUE(std::get<bool>(var_2->
function(ggd_0_0_1)));
4280 EXPECT_TRUE(std::get<bool>(var_2->
function(gd_0_0)));
4281 EXPECT_TRUE(std::get<bool>(var_2->
function(gd_0_1)));
4282 EXPECT_TRUE(std::get<bool>(var_2->
function(d_0)));
4283 EXPECT_TRUE(std::get<bool>(var_2->
function(d_1)));
4284 EXPECT_FALSE(std::get<bool>(var_2->
function(not_child)));
4285 EXPECT_FALSE(std::get<bool>(var_2->
function(not_child_2)));
4288 ASSERT_NE(var_3,
nullptr);
4289 EXPECT_FALSE(std::get<bool>(var_3->
function(D_gd_0_0)));
4290 EXPECT_FALSE(std::get<bool>(var_3->
function(D_gd_0_1)));
4291 EXPECT_FALSE(std::get<bool>(var_3->
function(D_gd_1_0)));
4292 EXPECT_FALSE(std::get<bool>(var_3->
function(D_gd_1_1)));
4293 EXPECT_FALSE(std::get<bool>(var_3->
function(D_d_0)));
4294 EXPECT_FALSE(std::get<bool>(var_3->
function(D_d_1)));
4295 EXPECT_FALSE(std::get<bool>(var_3->
function(ggd_0_0_0)));
4296 EXPECT_FALSE(std::get<bool>(var_3->
function(ggd_0_0_1)));
4297 EXPECT_FALSE(std::get<bool>(var_3->
function(gd_0_0)));
4298 EXPECT_FALSE(std::get<bool>(var_3->
function(gd_0_1)));
4299 EXPECT_TRUE(std::get<bool>(var_3->
function(d_0)));
4300 EXPECT_TRUE(std::get<bool>(var_3->
function(d_1)));
4301 EXPECT_FALSE(std::get<bool>(var_3->
function(not_child)));
4302 EXPECT_FALSE(std::get<bool>(var_3->
function(not_child_2)));
4305 ASSERT_NE(var_4,
nullptr);
4306 EXPECT_FALSE(std::get<bool>(var_4->
function(D_gd_0_0)));
4307 EXPECT_FALSE(std::get<bool>(var_4->
function(D_gd_0_1)));
4308 EXPECT_FALSE(std::get<bool>(var_4->
function(D_gd_1_0)));
4309 EXPECT_FALSE(std::get<bool>(var_4->
function(D_gd_1_1)));
4310 EXPECT_FALSE(std::get<bool>(var_4->
function(D_d_0)));
4311 EXPECT_FALSE(std::get<bool>(var_4->
function(D_d_1)));
4312 EXPECT_FALSE(std::get<bool>(var_4->
function(ggd_0_0_0)));
4313 EXPECT_FALSE(std::get<bool>(var_4->
function(ggd_0_0_1)));
4314 EXPECT_TRUE(std::get<bool>(var_4->
function(gd_0_0)));
4315 EXPECT_TRUE(std::get<bool>(var_4->
function(gd_0_1)));
4316 EXPECT_FALSE(std::get<bool>(var_4->
function(d_0)));
4317 EXPECT_FALSE(std::get<bool>(var_4->
function(d_1)));
4318 EXPECT_FALSE(std::get<bool>(var_4->
function(not_child)));
4319 EXPECT_FALSE(std::get<bool>(var_4->
function(not_child_2)));
4323 ASSERT_NE(var_5,
nullptr);
4324 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_0_0)));
4325 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_0_1)));
4326 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_1_0)));
4327 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_1_1)));
4328 EXPECT_FALSE(std::get<bool>(var_5->
function(D_d_0)));
4329 EXPECT_FALSE(std::get<bool>(var_5->
function(D_d_1)));
4330 EXPECT_TRUE(std::get<bool>(var_5->
function(ggd_0_0_0)));
4331 EXPECT_TRUE(std::get<bool>(var_5->
function(ggd_0_0_1)));
4332 EXPECT_FALSE(std::get<bool>(var_5->
function(gd_0_0)));
4333 EXPECT_FALSE(std::get<bool>(var_5->
function(gd_0_1)));
4334 EXPECT_FALSE(std::get<bool>(var_5->
function(d_0)));
4335 EXPECT_FALSE(std::get<bool>(var_5->
function(d_1)));
4336 EXPECT_FALSE(std::get<bool>(var_5->
function(not_child)));
4337 EXPECT_FALSE(std::get<bool>(var_5->
function(not_child_2)));
4344 class PIDVariableTest :
public ::testing::Test {
4347 void SetUp()
override
4350 StoreArray<TrackFitResult> tfrs;
4351 StoreArray<MCParticle> mcparticles;
4352 StoreArray<PIDLikelihood> likelihood;
4353 StoreArray<Particle> particles;
4354 StoreArray<Track> tracks;
4358 particles.registerInDataStore();
4360 particles.registerRelationTo(likelihood);
4366 void TearDown()
override
4372 TEST_F(PIDVariableTest, LogLikelihood)
4381 const float pValue = 0.5;
4382 const float bField = 1.5;
4384 TMatrixDSym cov6(6);
4386 ROOT::Math::Cartesian2D d(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
4387 ROOT::Math::Cartesian2D pt(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
4388 d.SetXY(d.X(), -(d.X()*pt.X()) / pt.Y());
4390 ROOT::Math::XYZVector position(d.X(), d.Y(), generator.Uniform(-1, 1));
4391 ROOT::Math::XYZVector momentum(pt.X(), pt.Y(), generator.Uniform(-1, 1));
4393 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
4413 lAll->setLogLikelihood(Const::TOP,
Const::muon, 0.5);
4414 lAll->setLogLikelihood(Const::ARICH,
Const::muon, 0.52);
4415 lAll->setLogLikelihood(Const::ECL,
Const::muon, 0.54);
4416 lAll->setLogLikelihood(Const::CDC,
Const::muon, 0.56);
4417 lAll->setLogLikelihood(Const::SVD,
Const::muon, 0.58);
4418 lAll->setLogLikelihood(Const::KLM,
Const::muon, 0.8);
4420 lAll->setLogLikelihood(Const::TOP,
Const::pion, 0.2);
4421 lAll->setLogLikelihood(Const::ARICH,
Const::pion, 0.22);
4422 lAll->setLogLikelihood(Const::ECL,
Const::pion, 0.24);
4423 lAll->setLogLikelihood(Const::CDC,
Const::pion, 0.26);
4424 lAll->setLogLikelihood(Const::SVD,
Const::pion, 0.28);
4425 lAll->setLogLikelihood(Const::KLM,
Const::pion, 0.2);
4427 lAll->setLogLikelihood(Const::TOP,
Const::kaon, 0.3);
4428 lAll->setLogLikelihood(Const::ARICH,
Const::kaon, 0.32);
4429 lAll->setLogLikelihood(Const::ECL,
Const::kaon, 0.34);
4430 lAll->setLogLikelihood(Const::CDC,
Const::kaon, 0.36);
4431 lAll->setLogLikelihood(Const::SVD,
Const::kaon, 0.38);
4432 lAll->setLogLikelihood(Const::KLM,
Const::kaon, 0.2);
4449 auto* lAllNoSVD = likelihood.
appendNew();
4453 if (det != Const::SVD) {
4454 lAllNoSVD->setLogLikelihood(det, hypo, lAll->getLogL(hypo, det));
4464 ldEdx->setLogLikelihood(Const::CDC,
Const::pion, 0.26);
4465 ldEdx->setLogLikelihood(Const::SVD,
Const::pion, 0.28);
4467 ldEdx->setLogLikelihood(Const::CDC,
Const::kaon, 0.36);
4468 ldEdx->setLogLikelihood(Const::SVD,
Const::kaon, 0.38);
4473 ldEdx->setLogLikelihood(Const::CDC,
Const::muon, 0.56);
4474 ldEdx->setLogLikelihood(Const::SVD,
Const::muon, 0.58);
4492 auto* particleAll = particles.appendNew(allTrack,
Const::pion);
4493 auto* particleNoSVD = particles.appendNew(noSVDTrack,
Const::pion);
4494 auto* particledEdx = particles.appendNew(dEdxTrack,
Const::pion);
4495 auto* particleNoID = particles.appendNew(noPIDTrack,
Const::pion);
4497 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);
4498 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);
4501 EXPECT_FLOAT_EQ(electronID(particleAll), std::exp(0.71) / numsumexp);
4502 EXPECT_FLOAT_EQ(muonID(particleAll), std::exp(3.5) / numsumexp);
4503 EXPECT_FLOAT_EQ(pionID(particleAll), std::exp(1.4) / numsumexp);
4504 EXPECT_FLOAT_EQ(kaonID(particleAll), std::exp(1.9) / numsumexp);
4505 EXPECT_FLOAT_EQ(protonID(particleAll), std::exp(2.22) / numsumexp);
4506 EXPECT_FLOAT_EQ(deuteronID(particleAll), std::exp(3.22) / numsumexp);
4509 auto* particleElectron = particles.appendNew(allTrack,
Const::electron);
4510 auto* particleMuon = particles.appendNew(allTrack,
Const::muon);
4511 auto* particleKaon = particles.appendNew(allTrack,
Const::kaon);
4512 auto* particleProton = particles.appendNew(allTrack,
Const::proton);
4513 auto* particleDeuteron = particles.appendNew(allTrack,
Const::deuteron);
4515 EXPECT_FLOAT_EQ(particleID(particleAll), std::exp(1.4) / numsumexp);
4516 EXPECT_FLOAT_EQ(particleID(particleElectron), std::exp(0.71) / numsumexp);
4517 EXPECT_FLOAT_EQ(particleID(particleMuon), std::exp(3.5) / numsumexp);
4518 EXPECT_FLOAT_EQ(particleID(particleKaon), std::exp(1.9) / numsumexp);
4519 EXPECT_FLOAT_EQ(particleID(particleProton), std::exp(2.22) / numsumexp);
4520 EXPECT_FLOAT_EQ(particleID(particleDeuteron), std::exp(3.22) / numsumexp);
4523 EXPECT_FLOAT_EQ(electronID_noSVD(particleNoSVD), std::exp(0.61) / numsumexp_noSVD);
4524 EXPECT_FLOAT_EQ(muonID_noSVD(particleNoSVD), std::exp(2.92) / numsumexp_noSVD);
4525 EXPECT_FLOAT_EQ(pionID_noSVD(particleNoSVD), std::exp(1.12) / numsumexp_noSVD);
4526 EXPECT_FLOAT_EQ(kaonID_noSVD(particleNoSVD), std::exp(1.52) / numsumexp_noSVD);
4527 EXPECT_FLOAT_EQ(protonID_noSVD(particleNoSVD), std::exp(1.74) / numsumexp_noSVD);
4528 EXPECT_FLOAT_EQ(deuteronID_noSVD(particleNoSVD), std::exp(2.54) / numsumexp_noSVD);
4531 std::vector<double> v_pi_K {211., 321.};
4532 std::vector<double> v_pi_p {211., 2212.};
4533 std::vector<double> v_K_p {321., 2212.};
4534 EXPECT_FLOAT_EQ(binaryPID(particleAll, v_pi_K), std::exp(1.4) / (std::exp(1.4) + std::exp(1.9)));
4535 EXPECT_FLOAT_EQ(binaryPID(particleAll, v_pi_p), std::exp(1.4) / (std::exp(1.4) + std::exp(2.22)));
4536 EXPECT_FLOAT_EQ(binaryPID(particleAll, v_K_p), std::exp(1.9) / (std::exp(1.9) + std::exp(2.22)));
4539 EXPECT_TRUE(std::isnan(electronID(particleNoID)));
4540 EXPECT_TRUE(std::isnan(muonID(particleNoID)));
4541 EXPECT_TRUE(std::isnan(pionID(particleNoID)));
4542 EXPECT_TRUE(std::isnan(kaonID(particleNoID)));
4543 EXPECT_TRUE(std::isnan(protonID(particleNoID)));
4544 EXPECT_TRUE(std::isnan(deuteronID(particleNoID)));
4547 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(11, TOP)")->function(particleAll)),
4549 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(11, ALL)")->function(particleAll)),
4551 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(2212, TOP, CDC)")->function(
4552 particleAll)), 0.86);
4555 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidProbabilityExpert(1000010020, ALL)")->function(particleAll)),
4556 std::exp(3.22) / numsumexp);
4557 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidProbabilityExpert(2212, ALL)")->function(particleAll)),
4558 std::exp(2.22) / numsumexp);
4559 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidProbabilityExpert(211, ALL)")->function(particleAll)),
4560 std::exp(1.4) / numsumexp);
4561 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidProbabilityExpert(321, ALL)")->function(particleAll)),
4562 std::exp(1.9) / numsumexp);
4563 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidProbabilityExpert(13, ALL)")->function(particleAll)),
4564 std::exp(3.5) / numsumexp);
4565 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidProbabilityExpert(11, ALL)")->function(particleAll)),
4566 std::exp(0.71) / numsumexp);
4567 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidProbabilityExpert(211, ALL)")->function(particledEdx)),
4568 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)));
4569 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidProbabilityExpert(211, ALL)")->function(particledEdx)),
4570 std::get<double>(
Manager::Instance().getVariable(
"pidProbabilityExpert(211, CDC, SVD)")->function(particleAll)));
4571 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidProbabilityExpert(211, CDC)")->function(particledEdx)),
4572 std::get<double>(
Manager::Instance().getVariable(
"pidProbabilityExpert(211, CDC)")->function(particleAll)));
4573 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidProbabilityExpert(321, CDC)")->function(particleAll)),
4574 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)));
4577 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, ALL)")->function(
4579 1.0 / (1.0 + std::exp(2.22 - 1.9)));
4580 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, ALL)")->function(
4582 1.0 / (1.0 + std::exp(0.94 - 0.74)));
4583 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, CDC, SVD)")->function(
4585 1.0 / (1.0 + std::exp(0.94 - 0.74)));
4588 EXPECT_TRUE(std::isnan(std::get<double>(
Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, KLM)")->function(
4590 EXPECT_TRUE(std::isnan(std::get<double>(
Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(11, TOP, CDC, SVD)")->function(
4592 EXPECT_TRUE(std::isnan(std::get<double>(
Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(11, TOP)")->function(
4594 EXPECT_TRUE(std::isnan(std::get<double>(
Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, KLM)")->function(
4596 EXPECT_TRUE(std::isnan(std::get<double>
4597 (
Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, ECL, TOP, ARICH)")->function(
4599 EXPECT_FALSE(std::isnan(std::get<double>
4600 (
Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, ECL, TOP, ARICH, SVD)")->function(
4603 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidMostLikelyPDG()")->function(particledEdx)), 1.00001e+09);
4604 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidMostLikelyPDG(0.5, 0.1, 0.1, 0.1, 0.1, 0.1)")->function(
4607 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidMostLikelyPDG(0.1, 0.5, 0.1, 0.1, 0.1, 0.1)")->function(
4610 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidMostLikelyPDG(0.1, 0.1, 0.5, 0.1, 0.1, 0.1)")->function(
4613 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidMostLikelyPDG(0.1, 0.1, 0.1, 0.5, 0.1, 0.1)")->function(
4616 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidMostLikelyPDG(0.1, 0.1, 0.1, 0.1, 0.5, 0.1)")->function(
4619 EXPECT_FLOAT_EQ(std::get<double>(
Manager::Instance().getVariable(
"pidMostLikelyPDG(0, 1., 0, 0, 0, 0)")->function(particledEdx)),
4623 TEST_F(PIDVariableTest, MissingLikelihood)
4632 const float pValue = 0.5;
4633 const float bField = 1.5;
4635 TMatrixDSym cov6(6);
4637 ROOT::Math::Cartesian2D d(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
4638 ROOT::Math::Cartesian2D pt(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
4639 d.SetXY(d.X(), -(d.X()*pt.X()) / pt.Y());
4641 ROOT::Math::XYZVector position(d.X(), d.Y(), generator.Uniform(-1, 1));
4642 ROOT::Math::XYZVector momentum(pt.X(), pt.Y(), generator.Uniform(-1, 1));
4644 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
4661 l2->setLogLikelihood(Const::TOP,
Const::pion, 0.2);
4662 l2->setLogLikelihood(Const::ARICH,
Const::pion, 0.22);
4663 l2->setLogLikelihood(Const::ECL,
Const::pion, 0.24);
4664 l2->setLogLikelihood(Const::CDC,
Const::pion, 0.26);
4665 l2->setLogLikelihood(Const::SVD,
Const::pion, 0.28);
4668 auto* pion = particles.appendNew(savedTrack2,
Const::pion);
4671 l3->setLogLikelihood(Const::TOP,
Const::kaon, 0.3);
4672 l3->setLogLikelihood(Const::ARICH,
Const::kaon, 0.32);
4675 auto* kaon = particles.appendNew(savedTrack3,
Const::kaon);
4684 auto* proton = particles.appendNew(savedTrack4,
Const::proton);
4691 EXPECT_FLOAT_EQ(std::get<double>(varMissTOP->
function(electron)), 0.0);
4692 EXPECT_FLOAT_EQ(std::get<double>(varMissTOP->
function(pion)), 0.0);
4693 EXPECT_FLOAT_EQ(std::get<double>(varMissTOP->
function(kaon)), 0.0);
4694 EXPECT_FLOAT_EQ(std::get<double>(varMissTOP->
function(proton)), 1.0);
4696 EXPECT_FLOAT_EQ(std::get<double>(varMissARICH->
function(electron)), 1.0);
4697 EXPECT_FLOAT_EQ(std::get<double>(varMissARICH->
function(pion)), 0.0);
4698 EXPECT_FLOAT_EQ(std::get<double>(varMissARICH->
function(kaon)), 0.0);
4699 EXPECT_FLOAT_EQ(std::get<double>(varMissARICH->
function(proton)), 0.0);
4701 EXPECT_FLOAT_EQ(std::get<double>(varMissECL->
function(electron)), 0.0);
4702 EXPECT_FLOAT_EQ(std::get<double>(varMissECL->
function(pion)), 0.0);
4703 EXPECT_FLOAT_EQ(std::get<double>(varMissECL->
function(kaon)), 1.0);
4704 EXPECT_FLOAT_EQ(std::get<double>(varMissECL->
function(proton)), 0.0);
4707 class FlightInfoTest :
public ::testing::Test {
4710 void SetUp()
override
4713 StoreArray<Particle>().registerInDataStore();
4714 StoreArray<MCParticle>().registerInDataStore();
4715 StoreArray<MCParticle> mcParticles;
4716 StoreArray<Particle> particles;
4717 particles.registerRelationTo(mcParticles);
4718 StoreObjPtr<ParticleExtraInfoMap>().registerInDataStore();
4733 MCParticle* newMCKs = mcParticles.
appendNew(mcKs);
4742 MCParticle* newMCDp = mcParticles.
appendNew(mcDp);
4745 PxPyPzEVector momentum;
4746 TMatrixFSym error(7);
4753 error(5, 5) = 0.00875;
4755 Particle pi(PxPyPzEVector(1.59607, 1.19705, 0, 2), 211);
4756 momentum += pi.get4Vector();
4757 Particle* newpi = particles.appendNew(pi);
4761 Ks.setVertex(XYZVector(4.0, 5.0, 0.0));
4762 Ks.setMomentumVertexErrorMatrix(error);
4763 momentum += Ks.get4Vector();
4764 Ks.addExtraInfo(
"prodVertX", 1.0);
4765 Ks.addExtraInfo(
"prodVertY", 1.0);
4766 Ks.addExtraInfo(
"prodVertZ", 0.0);
4767 Ks.addExtraInfo(
"prodVertSxx", 0.04);
4768 Ks.addExtraInfo(
"prodVertSxy", 0.0);
4769 Ks.addExtraInfo(
"prodVertSxz", 0.0);
4770 Ks.addExtraInfo(
"prodVertSyx", 0.0);
4771 Ks.addExtraInfo(
"prodVertSyy", 0.00875);
4772 Ks.addExtraInfo(
"prodVertSyz", 0.0);
4773 Ks.addExtraInfo(
"prodVertSzx", 0.0);
4774 Ks.addExtraInfo(
"prodVertSzy", 0.0);
4775 Ks.addExtraInfo(
"prodVertSzz", 0.01);
4776 Particle* newKs = particles.appendNew(Ks);
4781 Dp.appendDaughter(newpi);
4782 Dp.appendDaughter(newKs);
4783 XYZVector motherVtx(1.0, 1.0, 0.0);
4784 Dp.setVertex(motherVtx);
4785 Dp.setMomentumVertexErrorMatrix(error);
4786 Dp.addExtraInfo(
"prodVertX", 0.0);
4787 Dp.addExtraInfo(
"prodVertY", 1.0);
4788 Dp.addExtraInfo(
"prodVertZ", -2.0);
4789 Dp.addExtraInfo(
"prodVertSxx", 0.04);
4790 Dp.addExtraInfo(
"prodVertSxy", 0.0);
4791 Dp.addExtraInfo(
"prodVertSxz", 0.0);
4792 Dp.addExtraInfo(
"prodVertSyx", 0.0);
4793 Dp.addExtraInfo(
"prodVertSyy", 0.01);
4794 Dp.addExtraInfo(
"prodVertSyz", 0.0);
4795 Dp.addExtraInfo(
"prodVertSzx", 0.0);
4796 Dp.addExtraInfo(
"prodVertSzy", 0.0);
4797 Dp.addExtraInfo(
"prodVertSzz", 0.1575);
4798 Particle* newDp = particles.appendNew(Dp);
4804 void TearDown()
override
4809 TEST_F(FlightInfoTest, flightDistance)
4812 const Particle* newKs = particles[1];
4815 ASSERT_NE(var,
nullptr);
4816 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 5.0);
4818 TEST_F(FlightInfoTest, flightDistanceErr)
4821 const Particle* newKs = particles[1];
4824 ASSERT_NE(var,
nullptr);
4825 EXPECT_GT(std::get<double>(var->function(newKs)), 0.0);
4827 TEST_F(FlightInfoTest, flightTime)
4830 const Particle* newKs = particles[1];
4833 ASSERT_NE(var,
nullptr);
4837 TEST_F(FlightInfoTest, flightTimeErr)
4840 const Particle* newKs = particles[1];
4843 ASSERT_NE(var,
nullptr);
4844 EXPECT_GT(std::get<double>(var->function(newKs)), 0.0);
4847 TEST_F(FlightInfoTest, flightDistanceOfDaughter)
4850 const Particle* newDp = particles[2];
4853 ASSERT_NE(var,
nullptr);
4854 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 5.0);
4857 ASSERT_NE(var,
nullptr);
4858 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4860 TEST_F(FlightInfoTest, flightDistanceOfDaughterErr)
4863 const Particle* newDp = particles[2];
4866 ASSERT_NE(var,
nullptr);
4867 EXPECT_GT(std::get<double>(var->function(newDp)), 0.0);
4870 ASSERT_NE(var,
nullptr);
4871 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4873 TEST_F(FlightInfoTest, flightTimeOfDaughter)
4876 const Particle* newDp = particles[2];
4879 ASSERT_NE(var,
nullptr);
4885 ASSERT_NE(var,
nullptr);
4886 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4888 TEST_F(FlightInfoTest, flightTimeOfDaughterErr)
4891 const Particle* newDp = particles[2];
4894 ASSERT_NE(var,
nullptr);
4895 EXPECT_GT(std::get<double>(var->function(newDp)), 0.0);
4898 ASSERT_NE(var,
nullptr);
4899 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4901 TEST_F(FlightInfoTest, mcFlightDistanceOfDaughter)
4904 const Particle* newDp = particles[2];
4907 ASSERT_NE(var,
nullptr);
4909 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 5.0);
4912 ASSERT_NE(var,
nullptr);
4913 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4915 TEST_F(FlightInfoTest, mcFlightTimeOfDaughter)
4918 const Particle* newDp = particles[2];
4921 ASSERT_NE(var,
nullptr);
4926 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), Ks->getLifetime() / Ks->
getEnergy()*Ks->
getMass());
4929 ASSERT_NE(var,
nullptr);
4930 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4933 TEST_F(FlightInfoTest, vertexDistance)
4936 const Particle* newKS = particles[1];
4939 ASSERT_NE(var,
nullptr);
4940 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKS)), 5.0);
4943 TEST_F(FlightInfoTest, vertexDistanceError)
4946 const Particle* newKS = particles[1];
4949 ASSERT_NE(var,
nullptr);
4950 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKS)), 0.2);
4953 TEST_F(FlightInfoTest, vertexDistanceSignificance)
4956 const Particle* newKS = particles[1];
4959 ASSERT_NE(var,
nullptr);
4960 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKS)), 25);
4963 TEST_F(FlightInfoTest, vertexDistanceOfDaughter)
4966 const Particle* newDp = particles[2];
4969 ASSERT_NE(var,
nullptr);
4970 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 5.0);
4973 ASSERT_NE(var,
nullptr);
4974 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 6.0);
4977 ASSERT_NE(var,
nullptr);
4978 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4981 TEST_F(FlightInfoTest, vertexDistanceOfDaughterError)
4984 const Particle* newDp = particles[2];
4987 ASSERT_NE(var,
nullptr);
4988 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 0.2);
4991 ASSERT_NE(var,
nullptr);
4992 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 0.25);
4995 TEST_F(FlightInfoTest, vertexDistanceOfDaughterSignificance)
4998 const Particle* newDp = particles[2];
5001 ASSERT_NE(var,
nullptr);
5002 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 25);
5005 ASSERT_NE(var,
nullptr);
5006 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 24);
5009 class VertexVariablesTest :
public ::testing::Test {
5012 void SetUp()
override
5015 StoreArray<Particle>().registerInDataStore();
5016 StoreArray<MCParticle>().registerInDataStore();
5017 StoreArray<MCParticle> mcParticles;
5018 StoreArray<Particle> particles;
5019 particles.registerRelationTo(mcParticles);
5020 StoreObjPtr<ParticleExtraInfoMap>().registerInDataStore();
5032 MCParticle* newMCKs = mcParticles.
appendNew(mcKs);
5034 Particle Ks(PxPyPzEVector(1.164, 1.55200, 0, 2), 310);
5048 Particle* newKs = particles.appendNew(Ks);
5053 void TearDown()
override
5060 TEST_F(VertexVariablesTest, mcDecayVertexX)
5063 const Particle* newKs = particles[0];
5066 ASSERT_NE(var,
nullptr);
5067 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 4.0);
5070 TEST_F(VertexVariablesTest, mcDecayVertexY)
5073 const Particle* newKs = particles[0];
5076 ASSERT_NE(var,
nullptr);
5077 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 5.0);
5080 TEST_F(VertexVariablesTest, mcDecayVertexZ)
5083 const Particle* newKs = particles[0];
5086 ASSERT_NE(var,
nullptr);
5087 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.0);
5091 TEST_F(VertexVariablesTest, mcDecayVertexFromIPDistance)
5094 const Particle* newKs = particles[0];
5097 ASSERT_NE(var,
nullptr);
5098 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), sqrt(4.0 * 4.0 + 5.0 * 5.0));
5101 TEST_F(VertexVariablesTest, mcDecayVertexRho)
5104 const Particle* newKs = particles[0];
5107 ASSERT_NE(var,
nullptr);
5108 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), sqrt(4.0 * 4.0 + 5.0 * 5.0));
5111 TEST_F(VertexVariablesTest, mcProductionVertexX)
5114 const Particle* newKs = particles[0];
5117 ASSERT_NE(var,
nullptr);
5118 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 1.0);
5121 TEST_F(VertexVariablesTest, mcProductionVertexY)
5124 const Particle* newKs = particles[0];
5127 ASSERT_NE(var,
nullptr);
5128 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 2.0);
5131 TEST_F(VertexVariablesTest, mcProductionVertexZ)
5134 const Particle* newKs = particles[0];
5137 ASSERT_NE(var,
nullptr);
5138 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 3.0);
5143 TEST_F(VertexVariablesTest, prodVertexX)
5146 const Particle* newKs = particles[0];
5149 ASSERT_NE(var,
nullptr);
5150 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 1.0);
5152 TEST_F(VertexVariablesTest, prodVertexY)
5155 const Particle* newKs = particles[0];
5158 ASSERT_NE(var,
nullptr);
5159 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 2.0);
5161 TEST_F(VertexVariablesTest, prodVertexZ)
5164 const Particle* newKs = particles[0];
5167 ASSERT_NE(var,
nullptr);
5168 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 3.0);
5173 TEST_F(VertexVariablesTest, prodVertexCov)
5176 const Particle* newKs = particles[0];
5180 ASSERT_NE(var,
nullptr);
5181 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.1);
5183 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.2);
5185 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.3);
5187 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.4);
5189 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.5);
5191 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.6);
5193 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.7);
5195 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.8);
5197 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.9);
5199 ASSERT_NE(var,
nullptr);
5200 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), sqrt(0.1));
5202 ASSERT_NE(var,
nullptr);
5203 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), sqrt(0.5));
5205 ASSERT_NE(var,
nullptr);
5206 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), sqrt(0.9));
5211 TEST_F(MetaVariableTest, KSFWVariables)
5222 EXPECT_TRUE(std::isnan(std::get<double>(var->function(particle_with_no_cs))));
5225 EXPECT_B2ERROR(
Manager::Instance().getVariable(
"KSFWVariables(et, mask, FS1)"));
5228 TEST_F(MetaVariableTest, CleoConeCS)
5239 EXPECT_TRUE(std::isnan(std::get<double>(var->function(particle_with_no_cs))));
5243 EXPECT_TRUE(std::isnan(std::get<double>(var->function(particle_with_no_cs))));
5249 TEST_F(MetaVariableTest, TransformedNetworkOutput)
5252 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"transformedNetworkOutput(NONSENSE)"));
5255 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"transformedNetworkOutput(NONEXISTENT, 0, NOTDOUBLE)"));
5256 EXPECT_B2FATAL(
Manager::Instance().getVariable(
"transformedNetworkOutput(NONEXISTENT, NOTDOUBLE, 1)"));
5262 EXPECT_TRUE(std::isnan(std::get<double>(var->function(particle))));
5267 if (not eventExtraInfo.isValid())
5268 eventExtraInfo.create();
5270 EXPECT_TRUE(std::isnan(std::get<double>(var->function(
nullptr))));
Provides a type-safe way to pass members of the chargedStableSet set.
static const ChargedStable muon
muon particle
static const ParticleSet chargedStableSet
set of charged stable particles
static const ChargedStable pion
charged pion particle
static const ParticleType Klong
K^0_L particle.
static const double speedOfLight
[cm/ns]
static const ChargedStable proton
proton particle
static const ParticleType Kshort
K^0_S particle.
static const ChargedStable kaon
charged kaon particle
static const ParticleType photon
photon particle
static const ChargedStable electron
electron particle
static const ChargedStable deuteron
deuteron particle
EStoreFlags
Flags describing behaviours of objects etc.
@ c_DontWriteOut
Object/array should be NOT saved by output modules.
static DataStore & Instance()
Instance of singleton Store.
void setInitializeActive(bool active)
Setter for m_initializeActive.
void reset(EDurability durability)
Frees memory occupied by data store items and removes all objects from the map.
void setTheta(double theta)
Set Theta of Shower (radian).
void setPhi(double phi)
Set Phi of Shower (radian).
void setClusterId(int clusterid)
Set cluster id.
void setHypothesis(EHypothesisBit hypothesis)
Set hypotheses.
void setEnergy(double energy)
Set Corrected Energy (GeV).
@ c_nPhotons
CR is split into n photons (N1)
@ c_neutralHadron
CR is reconstructed as a neutral hadron (N2)
void setR(double r)
Set R (in cm).
Singleton class responsible for loading detector parameters from an XML file.
Class to represent Particle data in graph.
void comesFrom(GraphParticle &mother)
Tells the graph that this particle is a decay product of mother.
Class to build, validate and sort a particle decay chain.
void generateList(const std::string &name="", int options=c_setNothing)
Generates the MCParticle list and stores it in the StoreArray with the given name.
A Class to store the Monte Carlo particle information.
float getEnergy() const
Return particle energy in GeV.
@ c_PrimaryParticle
bit 0: Particle is primary particle.
void setDecayTime(float time)
Set decay time.
void setMass(float mass)
Set particle mass.
void setDecayVertex(const ROOT::Math::XYZVector &vertex)
Set decay vertex.
float getMass() const
Return the particle mass in GeV.
void setProductionVertex(const ROOT::Math::XYZVector &vertex)
Set production vertex position.
ROOT::Math::PxPyPzEVector get4Vector() const
Return 4Vector of particle.
void setPDG(int pdg)
Set PDG code of the particle.
void set4Vector(const ROOT::Math::PxPyPzEVector &p4)
Sets the 4Vector of particle.
void setMomentum(const ROOT::Math::XYZVector &momentum)
Set particle momentum.
void setStatus(unsigned short int status)
Set Status code for the particle.
void setProductionTime(float time)
Set production time.
void setMassFromPDG()
Sets the mass for the particle from the particle's PDG code.
Class to store reconstructed particles.
void appendDaughter(const Particle *daughter, const bool updateType=true, const int daughterProperty=c_Ordinary)
Appends index of daughter to daughters index array.
void setVertex(const ROOT::Math::XYZVector &vertex)
Sets position (decay vertex)
double getEnergy() const
Returns total energy.
double getPDGMass(void) const
Returns uncertainty on the invariant mass (requires valid momentum error matrix)
ROOT::Math::PxPyPzEVector get4Vector() const
Returns Lorentz vector.
void addExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
void setPValue(double pValue)
Sets chi^2 probability of fit.
@ c_Unflavored
Is its own antiparticle or we don't know whether it is a particle/antiparticle.
@ c_Flavored
Is either particle or antiparticle.
double getP() const
Returns momentum magnitude (same as getMomentumMagnitude but with shorter name)
const Particle * getDaughter(unsigned i) const
Returns a pointer to the i-th daughter particle.
double getMass() const
Returns invariant mass (= nominal for FS particles)
static const ReferenceFrame & GetCurrent()
Get current rest frame.
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
int getArrayIndex() const
Returns this object's array index (in StoreArray), or -1 if not found.
TO * getRelatedTo(const std::string &name="", const std::string &namedRelation="") const
Get the object to which this object has a relation.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
bool create(bool replace=false)
Create a default object in the data store.
Accessor to arrays stored in the data store.
T * appendNew()
Construct a new T object at the end of the array.
void clear() override
Delete all entries in this array.
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
Type-safe access to single objects in the data store.
Class that bundles various TrackFitResults.
void setTrackFitResultIndex(const Const::ChargedStable &chargedStable, short index)
Set an index (for positive values) or unavailability-code (index = -1) for a specific mass hypothesis...
A template class to apply the reference frame.
Object holding information for V0s.
const Var * getVariable(std::string name)
Get the variable belonging to the given key.
static Manager & Instance()
get singleton instance.
static Gearbox & getInstance()
Return reference to the Gearbox instance.
GraphParticle & addParticle()
Add new particle to the graph.
double charge(int pdgCode)
Returns electric charge of a particle with given pdg code.
Abstract base class for different kinds of events.
A variable returning a floating-point value for a given Particle.
FunctionPtr function
Pointer to function.