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>
16 #include <analysis/VariableManager/Utility.h>
18 #include <analysis/dataobjects/Particle.h>
19 #include <analysis/dataobjects/ParticleExtraInfoMap.h>
20 #include <analysis/dataobjects/ParticleList.h>
21 #include <framework/dataobjects/EventExtraInfo.h>
22 #include <analysis/dataobjects/RestOfEvent.h>
23 #include <analysis/utility/ReferenceFrame.h>
25 #include <framework/datastore/StoreArray.h>
26 #include <framework/datastore/StoreObjPtr.h>
27 #include <framework/utilities/TestHelpers.h>
28 #include <framework/logging/Logger.h>
29 #include <framework/gearbox/Gearbox.h>
30 #include <framework/gearbox/Const.h>
32 #include <mdst/dataobjects/MCParticle.h>
33 #include <mdst/dataobjects/MCParticleGraph.h>
34 #include <mdst/dataobjects/PIDLikelihood.h>
35 #include <mdst/dataobjects/Track.h>
36 #include <mdst/dataobjects/V0.h>
37 #include <mdst/dataobjects/ECLCluster.h>
38 #include <mdst/dataobjects/KLMCluster.h>
40 #include <gtest/gtest.h>
42 #include <TMatrixFSym.h>
44 #include <Math/Cartesian2D.h>
45 #include <Math/Vector3D.h>
46 #include <Math/Vector4D.h>
52 using namespace Belle2::Variable;
53 using namespace ROOT::Math;
58 TEST(KinematicVariableTest, Variable)
63 Gearbox& gearbox = Gearbox::getInstance();
64 gearbox.setBackends({std::string(
"file:")});
66 gearbox.open(
"geometry/Belle2.xml",
false);
69 Particle pH({0.290582573157898, 0, 6.99796952744559, 7.004}, 11);
70 Particle pL({0.166035330010433, 0, -3.99855423973071, 4.002}, -11);
72 Particle p({0, 0.999999869440028, 0, 1.0}, -11);
73 const double eps = 1e-15;
76 EXPECT_NEAR(0.0, particlePx(&pH), eps);
77 EXPECT_NEAR(0.0, particlePy(&pH), eps);
78 EXPECT_NEAR(0.0, particlePx(&pL), eps);
79 EXPECT_NEAR(0.0, particlePy(&pL), eps);
80 EXPECT_FLOAT_EQ(5.289778893721573, particlePz(&pH));
81 EXPECT_FLOAT_EQ(-5.289778893721573, particlePz(&pL));
82 EXPECT_FLOAT_EQ(10.579557836806245064 / 2, particleE(&pH));
83 EXPECT_FLOAT_EQ(10.579557836806245064 / 2, particleE(&pL));
85 EXPECT_FLOAT_EQ(0.999999869440028, particlePy(&p));
89 Particle p({ 0.1, -0.4, 0.8, 1.0 }, 411);
98 p.setMomentumVertexErrorMatrix(error);
100 EXPECT_FLOAT_EQ(0.9, particleP(&p));
101 EXPECT_FLOAT_EQ(1.0, particleE(&p));
102 EXPECT_FLOAT_EQ(0.1, particlePx(&p));
103 EXPECT_FLOAT_EQ(-0.4, particlePy(&p));
104 EXPECT_FLOAT_EQ(0.8, particlePz(&p));
105 EXPECT_FLOAT_EQ(0.412310562, particlePt(&p));
106 EXPECT_FLOAT_EQ(0.8 / 0.9, particleCosTheta(&p));
107 EXPECT_FLOAT_EQ(-1.325817664, particlePhi(&p));
109 EXPECT_FLOAT_EQ(0.737446378, particlePErr(&p));
110 EXPECT_FLOAT_EQ(
sqrt(0.05), particlePxErr(&p));
111 EXPECT_FLOAT_EQ(
sqrt(0.2), particlePyErr(&p));
112 EXPECT_FLOAT_EQ(
sqrt(0.4), particlePzErr(&p));
113 EXPECT_FLOAT_EQ(0.488093530, particlePtErr(&p));
114 EXPECT_FLOAT_EQ(0.156402664, particleCosThetaErr(&p));
115 EXPECT_FLOAT_EQ(0.263066820, particlePhiErr(&p));
120 EXPECT_FLOAT_EQ(0.68174648, particleP(&p));
121 EXPECT_FLOAT_EQ(0.80918372, particleE(&p));
122 EXPECT_FLOAT_EQ(0.058562335, particlePx(&p));
123 EXPECT_FLOAT_EQ(-0.40000001, particlePy(&p));
124 EXPECT_FLOAT_EQ(0.5489524, particlePz(&p));
125 EXPECT_FLOAT_EQ(0.40426421, particlePt(&p));
126 EXPECT_FLOAT_EQ(0.80521482, particleCosTheta(&p));
127 EXPECT_FLOAT_EQ(-1.4254233, particlePhi(&p));
129 EXPECT_FLOAT_EQ(
sqrt(0.2), particlePyErr(&p));
134 EXPECT_ALL_NEAR(particleP(&p), 0.0, 1e-9);
135 EXPECT_FLOAT_EQ(0.4358899, particleE(&p));
136 EXPECT_ALL_NEAR(0.0, particlePx(&p), 1e-9);
137 EXPECT_ALL_NEAR(0.0, particlePy(&p), 1e-9);
138 EXPECT_ALL_NEAR(0.0, particlePz(&p), 1e-9);
139 EXPECT_ALL_NEAR(0.0, particlePt(&p), 1e-9);
145 EXPECT_FLOAT_EQ(0.9, particleP(&p));
146 EXPECT_FLOAT_EQ(1.0, particleE(&p));
147 EXPECT_FLOAT_EQ(0.1, particlePx(&p));
148 EXPECT_FLOAT_EQ(-0.4, particlePy(&p));
149 EXPECT_FLOAT_EQ(0.8, particlePz(&p));
150 EXPECT_FLOAT_EQ(0.412310562, particlePt(&p));
151 EXPECT_FLOAT_EQ(0.8 / 0.9, particleCosTheta(&p));
152 EXPECT_FLOAT_EQ(-1.325817664, particlePhi(&p));
154 EXPECT_FLOAT_EQ(0.737446378, particlePErr(&p));
155 EXPECT_FLOAT_EQ(
sqrt(0.05), particlePxErr(&p));
156 EXPECT_FLOAT_EQ(
sqrt(0.2), particlePyErr(&p));
157 EXPECT_FLOAT_EQ(
sqrt(0.4), particlePzErr(&p));
158 EXPECT_FLOAT_EQ(0.488093530, particlePtErr(&p));
159 EXPECT_FLOAT_EQ(0.156402664, particleCosThetaErr(&p));
160 EXPECT_FLOAT_EQ(0.263066820, particlePhiErr(&p));
165 EXPECT_FLOAT_EQ(0.9, particleP(&p));
166 EXPECT_FLOAT_EQ(1.0, particleE(&p));
167 EXPECT_FLOAT_EQ(0.1, particlePx(&p));
168 EXPECT_FLOAT_EQ(-0.4, particlePy(&p));
169 EXPECT_FLOAT_EQ(0.8, particlePz(&p));
170 EXPECT_FLOAT_EQ(0.412310562, particlePt(&p));
171 EXPECT_FLOAT_EQ(0.8 / 0.9, particleCosTheta(&p));
172 EXPECT_FLOAT_EQ(-1.325817664, particlePhi(&p));
174 EXPECT_FLOAT_EQ(0.737446378, particlePErr(&p));
175 EXPECT_FLOAT_EQ(
sqrt(0.05), particlePxErr(&p));
176 EXPECT_FLOAT_EQ(
sqrt(0.2), particlePyErr(&p));
177 EXPECT_FLOAT_EQ(
sqrt(0.4), particlePzErr(&p));
178 EXPECT_FLOAT_EQ(0.488093530, particlePtErr(&p));
179 EXPECT_FLOAT_EQ(0.156402664, particleCosThetaErr(&p));
180 EXPECT_FLOAT_EQ(0.263066820, particlePhiErr(&p));
182 const auto& frame = ReferenceFrame::GetCurrent();
183 EXPECT_FLOAT_EQ(-0.1, frame.getMomentumErrorMatrix(&p)(0, 1));
184 EXPECT_FLOAT_EQ(0.9, frame.getMomentumErrorMatrix(&p)(0, 2));
189 EXPECT_FLOAT_EQ(0.9, particleP(&p));
190 EXPECT_FLOAT_EQ(1.0, particleE(&p));
191 EXPECT_FLOAT_EQ(0.1, particlePx(&p));
192 EXPECT_FLOAT_EQ(-0.8, particlePy(&p));
193 EXPECT_FLOAT_EQ(-0.4, particlePz(&p));
195 EXPECT_FLOAT_EQ(0.737446378, particlePErr(&p));
196 EXPECT_FLOAT_EQ(
sqrt(0.05), particlePxErr(&p));
197 EXPECT_FLOAT_EQ(
sqrt(0.4), particlePyErr(&p));
198 EXPECT_FLOAT_EQ(
sqrt(0.2), particlePzErr(&p));
200 const auto& frame = ReferenceFrame::GetCurrent();
201 EXPECT_FLOAT_EQ(-0.9, frame.getMomentumErrorMatrix(&p)(0, 1));
202 EXPECT_FLOAT_EQ(-0.1, frame.getMomentumErrorMatrix(&p)(0, 2));
207 EXPECT_FLOAT_EQ(0.68174648, particleP(&p));
208 EXPECT_FLOAT_EQ(0.80918372, particleE(&p));
209 EXPECT_FLOAT_EQ(0.058562335, particlePx(&p));
210 EXPECT_FLOAT_EQ(-0.40000001, particlePy(&p));
211 EXPECT_FLOAT_EQ(0.5489524, particlePz(&p));
212 EXPECT_FLOAT_EQ(0.40426421, particlePt(&p));
213 EXPECT_FLOAT_EQ(0.80521482, particleCosTheta(&p));
214 EXPECT_FLOAT_EQ(-1.4254233, particlePhi(&p));
216 EXPECT_FLOAT_EQ(
sqrt(0.2), particlePyErr(&p));
220 Particle pinv({ -0.1, 0.4, -0.8, 1.0 }, 411);
222 Particle p2({ 0.0, 0.0, 0.0, 0.4358899}, 411);
223 EXPECT_FLOAT_EQ(0.9, particleP(&p2));
224 EXPECT_FLOAT_EQ(1.0, particleE(&p2));
225 EXPECT_FLOAT_EQ(0.1, particlePx(&p2));
226 EXPECT_FLOAT_EQ(-0.4, particlePy(&p2));
227 EXPECT_FLOAT_EQ(0.8, particlePz(&p2));
228 EXPECT_FLOAT_EQ(0.412310562, particlePt(&p2));
229 EXPECT_FLOAT_EQ(0.8 / 0.9, particleCosTheta(&p2));
230 EXPECT_FLOAT_EQ(-1.325817664, particlePhi(&p2));
235 Particle p({ 0.0, 0.0, 0.0, 0.0 }, 411);
236 EXPECT_FLOAT_EQ(0.0, particleP(&p));
237 EXPECT_FLOAT_EQ(0.0, particleE(&p));
238 EXPECT_FLOAT_EQ(0.0, particlePx(&p));
239 EXPECT_FLOAT_EQ(0.0, particlePy(&p));
240 EXPECT_FLOAT_EQ(0.0, particlePz(&p));
241 EXPECT_FLOAT_EQ(0.0, particlePt(&p));
242 EXPECT_FLOAT_EQ(1.0, particleCosTheta(&p));
243 EXPECT_FLOAT_EQ(0.0, particlePhi(&p));
246 EXPECT_FLOAT_EQ(0.0, particleP(&p));
247 EXPECT_FLOAT_EQ(0.0, particleE(&p));
248 EXPECT_FLOAT_EQ(0.0, particlePx(&p));
249 EXPECT_FLOAT_EQ(0.0, particlePy(&p));
250 EXPECT_FLOAT_EQ(0.0, particlePz(&p));
251 EXPECT_FLOAT_EQ(0.0, particlePt(&p));
252 EXPECT_FLOAT_EQ(1.0, particleCosTheta(&p));
253 EXPECT_FLOAT_EQ(0.0, particlePhi(&p));
257 DataStore::Instance().setInitializeActive(
true);
259 particles.registerInDataStore();
260 DataStore::Instance().setInitializeActive(
false);
263 PxPyPzEVector vec1 = {0.0, +0.332174566, 0.0, T.
getCMSEnergy() / 2.};
264 PxPyPzEVector vec2 = {0.0, -0.332174566, 0.0, T.
getCMSEnergy() / 2.};
272 EXPECT_ALL_NEAR(m2RecoilSignalSide(p0), 0.0, 1e-7);
279 TEST(VertexVariableTest, Variable)
284 Gearbox& gearbox = Gearbox::getInstance();
285 gearbox.setBackends({std::string(
"file:")});
287 gearbox.open(
"geometry/Belle2.xml",
false);
289 Particle p({ 0.1, -0.4, 0.8, 1.0 }, 11);
291 p.setVertex(XYZVector(1.0, 2.0, 2.0));
293 EXPECT_FLOAT_EQ(1.0, particleDX(&p));
294 EXPECT_FLOAT_EQ(2.0, particleDY(&p));
295 EXPECT_FLOAT_EQ(2.0, particleDZ(&p));
296 EXPECT_FLOAT_EQ(
std::sqrt(5.0), particleDRho(&p));
297 EXPECT_FLOAT_EQ(3.0, particleDistance(&p));
298 EXPECT_FLOAT_EQ(0.5, particlePvalue(&p));
302 EXPECT_FLOAT_EQ(1.026177, particleDX(&p));
303 EXPECT_FLOAT_EQ(2.0, particleDY(&p));
304 EXPECT_FLOAT_EQ(2.2568872, particleDZ(&p));
305 EXPECT_FLOAT_EQ(hypot(2.0, 1.026177), particleDRho(&p));
306 EXPECT_FLOAT_EQ(3.1853695, particleDistance(&p));
307 EXPECT_FLOAT_EQ(0.5, particlePvalue(&p));
311 Particle p2({ 0.1, -0.4, 0.8, 1.0 }, 11);
313 p2.setVertex(XYZVector(1.0, 2.0, 2.0));
316 EXPECT_FLOAT_EQ(0.0, particleDX(&p));
317 EXPECT_FLOAT_EQ(0.0, particleDY(&p));
318 EXPECT_FLOAT_EQ(0.0, particleDZ(&p));
319 EXPECT_FLOAT_EQ(0.0, particleDRho(&p));
320 EXPECT_FLOAT_EQ(0.0, particleDistance(&p));
321 EXPECT_FLOAT_EQ(0.5, particlePvalue(&p));
344 TEST(TrackVariablesTest, Variable)
346 DataStore::Instance().setInitializeActive(
true);
355 DataStore::Instance().setInitializeActive(
false);
359 const float pValue = 0.5;
360 const float bField = 1.5;
365 ROOT::Math::Cartesian2D d(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
366 ROOT::Math::Cartesian2D pt(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
367 d.SetXY(d.X(), -(d.X()*pt.X()) / pt.Y());
370 ROOT::Math::XYZVector position(d.X(), d.Y(), generator.Uniform(-1, 1));
371 ROOT::Math::XYZVector momentum(pt.X(), pt.Y(), generator.Uniform(-1, 1));
373 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
375 myResults.
appendNew(position, momentum, cov6, charge, Const::electron, pValue, bField, CDCValue, 16777215, 0);
382 const Manager::Var* vIsFromECL = Manager::Instance().getVariable(
"isFromECL");
383 const Manager::Var* vIsFromKLM = Manager::Instance().getVariable(
"isFromKLM");
384 const Manager::Var* vIsFromTrack = Manager::Instance().getVariable(
"isFromTrack");
385 const Manager::Var* vIsFromV0 = Manager::Instance().getVariable(
"isFromV0");
387 EXPECT_TRUE(std::get<bool>(vIsFromTrack->
function(part)));
388 EXPECT_FALSE(std::get<bool>(vIsFromECL->
function(part)));
389 EXPECT_FALSE(std::get<bool>(vIsFromKLM->
function(part)));
390 EXPECT_FALSE(std::get<bool>(vIsFromV0->
function(part)));
391 EXPECT_FLOAT_EQ(0.5, trackPValue(part));
392 EXPECT_FLOAT_EQ(position.Z(), trackZ0(part));
393 EXPECT_FLOAT_EQ(position.Rho(), trackD0(part));
394 EXPECT_FLOAT_EQ(3, trackNCDCHits(part));
395 EXPECT_FLOAT_EQ(24, trackNSVDHits(part));
396 EXPECT_FLOAT_EQ(12, trackNPXDHits(part));
400 myResults.
appendNew(position, momentum, cov6, charge * -1,
401 Const::electron, pValue, bField, CDCValue, 16777215, 0);
406 myV0s.
appendNew(
V0(std::pair(savedTrack, myResults[0]), std::pair(savedTrack2, myResults[1]), 0.0, 0.0, 0.0));
407 const PxPyPzEVector v0Momentum(2 * momentum.X(), 2 * momentum.Y(), 2 * momentum.Z(), (momentum * 2).R());
408 auto v0particle = myParticles.
appendNew(v0Momentum, 22,
409 Particle::c_Unflavored, Particle::c_V0, 0);
410 v0particle->appendDaughter(0,
false);
411 v0particle->appendDaughter(1,
false);
414 EXPECT_FALSE(std::get<bool>(vIsFromTrack->
function(v0particle)));
415 EXPECT_FALSE(std::get<bool>(vIsFromECL->
function(v0particle)));
416 EXPECT_FALSE(std::get<bool>(vIsFromKLM->
function(v0particle)));
417 EXPECT_TRUE(std::get<bool>(vIsFromV0->
function(v0particle)));
419 const Manager::Var* vNDaughters = Manager::Instance().getVariable(
"nDaughters");
420 EXPECT_EQ(std::get<int>(vNDaughters->
function(v0particle)), 2);
423 class MCTruthVariablesTest :
public ::testing::Test {
428 DataStore::Instance().reset();
429 DataStore::Instance().setInitializeActive(
true);
441 tracks.registerInDataStore();
443 particles.registerInDataStore();
447 tracks.registerRelationTo(mcparticles);
448 particles.registerRelationTo(mcparticles);
452 tracks.registerRelationTo(clusters);
455 DataStore::Instance().setInitializeActive(
false);
468 true_photon->
setPDG(Const::photon.getPDGCode());
470 true_electron->
setPDG(Const::electron.getPDGCode());
472 true_pion->
setPDG(-Const::pion.getPDGCode());
477 cl0->setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
478 cl0->setClusterId(0);
482 cl1->setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
483 cl1->setClusterId(1);
488 ROOT::Math::XYZVector(), ROOT::Math::XYZVector(), cov, -1, Const::electron, 0.5, 1.5,
489 static_cast<unsigned long long int>(0x300000000000000), 16777215, 0);
490 auto* electron_tr = tracks.appendNew(
Track());
491 electron_tr->setTrackFitResultIndex(Const::electron, 0);
492 electron_tr->addRelationTo(cl1);
496 ROOT::Math::XYZVector(), ROOT::Math::XYZVector(), cov1, -1, Const::pion, 0.51, 1.5,
497 static_cast<unsigned long long int>(0x300000000000000), 16777215, 0);
498 auto* pion_tr = tracks.appendNew(
Track());
499 pion_tr->setTrackFitResultIndex(Const::pion, 0);
500 pion_tr->addRelationTo(cl1);
503 cl0->addRelationTo(true_photon, 12.3);
504 cl0->addRelationTo(true_electron, 2.3);
505 cl1->addRelationTo(true_electron, 45.6);
506 cl1->addRelationTo(true_photon, 5.6);
507 cl1->addRelationTo(true_pion, 15.6);
509 electron_tr->addRelationTo(true_electron);
510 pion_tr->addRelationTo(true_pion);
513 const auto* photon = particles.appendNew(
Particle(cl0));
514 const auto* electron = particles.appendNew(
Particle(electron_tr, Const::electron));
515 const auto* pion = particles.appendNew(
Particle(pion_tr, Const::pion));
516 const auto* misid_photon = particles.appendNew(
Particle(cl1));
519 photon->addRelationTo(true_photon);
520 electron->addRelationTo(true_electron);
521 pion->addRelationTo(true_pion);
522 misid_photon->addRelationTo(true_electron);
525 virtual void TearDown()
527 DataStore::Instance().reset();
531 TEST_F(MCTruthVariablesTest, mcCosThetaBetweenParticleAndNominalB)
533 DataStore::Instance().reset();
534 DataStore::Instance().setInitializeActive(
true);
537 particles.registerInDataStore();
539 particles.registerRelationTo(mcParticles);
540 DataStore::Instance().setInitializeActive(
false);
552 graphParticleDaughter1.
comesFrom(graphParticleMother);
553 graphParticleDaughter2.
comesFrom(graphParticleMother);
554 graphParticleGranddaughter1.
comesFrom(graphParticleDaughter1);
555 graphParticleGranddaughter2.
comesFrom(graphParticleDaughter1);
556 graphParticleGranddaughter3.
comesFrom(graphParticleDaughter1);
558 graphParticleMother.
setPDG(-521);
559 graphParticleDaughter1.
setPDG(421);
560 graphParticleDaughter2.
setPDG(-Const::pion.getPDGCode());
561 graphParticleGranddaughter1.
setPDG(-Const::kaon.getPDGCode());
562 graphParticleGranddaughter2.
setPDG(-Const::electron.getPDGCode());
563 graphParticleGranddaughter3.
setPDG(12);
570 graphParticleMother.
setMass(16.55294535724685);
573 PxPyPzEVector dummyP4(1, 2, 1, 5);
574 double dummyM = 4.3589;
576 graphParticleDaughter1.
setMass(dummyM);
578 graphParticleDaughter2.
setMass(dummyM);
579 graphParticleGranddaughter1.
set4Vector(dummyP4);
580 graphParticleGranddaughter1.
setMass(dummyM);
581 graphParticleGranddaughter2.
set4Vector(dummyP4);
582 graphParticleGranddaughter2.
setMass(dummyM);
587 auto* pMother = particles.appendNew(dummyP4, -521);
588 pMother->addRelationTo(mcParticles[0]);
590 particles.appendNew(dummyP4, 421)->addRelationTo(mcParticles[1]);
591 particles.appendNew(dummyP4, -211)->addRelationTo(mcParticles[2]);
592 particles.appendNew(dummyP4, -321)->addRelationTo(mcParticles[3]);
593 particles.appendNew(dummyP4, -11)->addRelationTo(mcParticles[4]);
594 particles.appendNew(dummyP4, 12)->addRelationTo(mcParticles[5]);
597 double M_B = pMother->getPDGMass();
598 double p_B =
std::sqrt(E_B * E_B - M_B * M_B);
601 double E_Y = p4_Y_CMS.E();
602 double p_Y = p4_Y_CMS.P();
603 double M_Y = p4_Y_CMS.M();
605 double expectedCosBY = (2 * E_B * E_Y - M_B * M_B - M_Y * M_Y) / (2 * p_B * p_Y);
607 const auto* mcCosBY = Manager::Instance().getVariable(
"mcCosThetaBetweenParticleAndNominalB");
609 EXPECT_NEAR(std::get<double>(mcCosBY->function(pMother)), expectedCosBY, 1e-4);
612 TEST_F(MCTruthVariablesTest, ECLMCMatchWeightVariable)
615 const auto* photon = particles[0];
616 const auto* electron = particles[1];
617 const auto* pion = particles[2];
619 const auto* weight = Manager::Instance().getVariable(
"clusterMCMatchWeight");
620 EXPECT_FLOAT_EQ(std::get<double>(weight->function(photon)), 12.3);
621 EXPECT_FLOAT_EQ(std::get<double>(weight->function(electron)), 45.6);
622 EXPECT_FLOAT_EQ(std::get<double>(weight->function(pion)), 15.6);
625 TEST_F(MCTruthVariablesTest, ECLBestMCMatchVariables)
628 const auto* photon = particles[0];
629 const auto* electron = particles[1];
630 const auto* pion = particles[2];
631 const auto* misid_photon = particles[3];
634 const auto* pdgcode = Manager::Instance().getVariable(
"clusterBestMCPDG");
635 EXPECT_EQ(std::get<double>(pdgcode->function(photon)), Const::photon.getPDGCode());
636 EXPECT_EQ(std::get<double>(pdgcode->function(electron)), Const::electron.getPDGCode());
637 EXPECT_EQ(std::get<double>(pdgcode->function(pion)), Const::electron.getPDGCode());
638 EXPECT_EQ(std::get<double>(pdgcode->function(misid_photon)), Const::electron.getPDGCode());
640 const auto* weight = Manager::Instance().getVariable(
"clusterBestMCMatchWeight");
641 EXPECT_FLOAT_EQ(std::get<double>(weight->function(photon)), 12.3);
642 EXPECT_FLOAT_EQ(std::get<double>(weight->function(electron)), 45.6);
643 EXPECT_FLOAT_EQ(std::get<double>(weight->function(pion)), 45.6);
644 EXPECT_FLOAT_EQ(std::get<double>(weight->function(misid_photon)), 45.6);
648 class EventVariableTest :
public ::testing::Test {
651 void SetUp()
override
653 DataStore::Instance().setInitializeActive(
true);
656 DataStore::Instance().setInitializeActive(
false);
661 void TearDown()
override
663 DataStore::Instance().reset();
667 TEST_F(EventVariableTest, ExperimentRunEventDateAndTime)
669 const Manager::Var* exp = Manager::Instance().getVariable(
"expNum");
670 const Manager::Var* run = Manager::Instance().getVariable(
"runNum");
671 const Manager::Var* evt = Manager::Instance().getVariable(
"evtNum");
672 const Manager::Var* date = Manager::Instance().getVariable(
"date");
673 const Manager::Var* year = Manager::Instance().getVariable(
"year");
674 const Manager::Var* time = Manager::Instance().getVariable(
"eventTimeSeconds");
677 EXPECT_FALSE(std::get<double>(date->function(
nullptr)) == std::get<double>(date->function(
nullptr)));
678 EXPECT_FALSE(std::get<double>(year->
function(
nullptr)) == std::get<double>(year->
function(
nullptr)));
679 EXPECT_FALSE(std::get<double>(time->function(
nullptr)) == std::get<double>(time->function(
nullptr)));
681 DataStore::Instance().setInitializeActive(
true);
684 DataStore::Instance().setInitializeActive(
false);
686 evtMetaData->setExperiment(1337);
687 evtMetaData->setRun(12345);
688 evtMetaData->setEvent(54321);
689 evtMetaData->setTime(1288569600e9);
694 EXPECT_EQ(std::get<int>(exp->function(
nullptr)), 1337);
695 EXPECT_EQ(std::get<int>(run->function(
nullptr)), 12345);
696 EXPECT_EQ(std::get<int>(evt->
function(
nullptr)), 54321);
697 EXPECT_FLOAT_EQ(std::get<double>(date->function(
nullptr)), 20101101.);
698 EXPECT_FLOAT_EQ(std::get<double>(year->
function(
nullptr)), 2010.);
699 EXPECT_FLOAT_EQ(std::get<double>(time->function(
nullptr)), 1288569600);
702 TEST_F(EventVariableTest, TestGlobalCounters)
705 const Manager::Var* var = Manager::Instance().getVariable(
"nMCParticles");
706 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 0);
708 for (
unsigned i = 0; i < 10; ++i)
711 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 10);
716 TEST_F(EventVariableTest, TestIfContinuumEvent_ForContinuumEvent)
718 DataStore::Instance().setInitializeActive(
true);
721 particles.registerRelationTo(mcParticles);
722 DataStore::Instance().setInitializeActive(
false);
724 auto* mcParticle = mcParticles.
appendNew();
725 mcParticle->
setPDG(Const::electron.getPDGCode());
726 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
727 auto* p1 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
728 p1->addRelationTo(mcParticle);
731 mcParticle->
setPDG(-Const::electron.getPDGCode());
732 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
733 auto* p2 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
734 p2->addRelationTo(mcParticle);
736 const Manager::Var* var = Manager::Instance().getVariable(
"isContinuumEvent");
737 ASSERT_NE(var,
nullptr);
738 EXPECT_TRUE(std::get<bool>(var->function(p1)));
739 EXPECT_TRUE(std::get<bool>(var->function(p2)));
740 const Manager::Var* varN = Manager::Instance().getVariable(
"isNotContinuumEvent");
741 ASSERT_NE(varN,
nullptr);
742 EXPECT_FALSE(std::get<bool>(varN->
function(p1)));
743 EXPECT_FALSE(std::get<bool>(varN->
function(p2)));
746 TEST_F(EventVariableTest, TestIfContinuumEvent_ForUpsilon4SEvent)
748 DataStore::Instance().setInitializeActive(
true);
752 DataStore::Instance().setInitializeActive(
false);
754 auto* mcParticle = mcParticles2.
appendNew();
755 mcParticle->
setPDG(Const::photon.getPDGCode());
756 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
757 auto* p3 = particles2.
appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
758 p3->addRelationTo(mcParticle);
761 mcParticle->
setPDG(300553);
762 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
763 auto* p4 = particles2.
appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 300553);
764 p4->addRelationTo(mcParticle);
766 const Manager::Var* var2 = Manager::Instance().getVariable(
"isContinuumEvent");
767 ASSERT_NE(var2,
nullptr);
768 EXPECT_FALSE(std::get<bool>(var2->
function(p3)));
769 EXPECT_FALSE(std::get<bool>(var2->
function(p4)));
770 const Manager::Var* var2N = Manager::Instance().getVariable(
"isNotContinuumEvent");
771 ASSERT_NE(var2N,
nullptr);
772 EXPECT_TRUE(std::get<bool>(var2N->
function(p3)));
773 EXPECT_TRUE(std::get<bool>(var2N->
function(p4)));
776 TEST_F(EventVariableTest, TestIfContinuumEvent_ForWrongReconstructedUpsilon4SEvent)
778 DataStore::Instance().setInitializeActive(
true);
782 DataStore::Instance().setInitializeActive(
false);
784 auto* mcParticle = mcParticles3.
appendNew();
785 mcParticle->
setPDG(Const::photon.getPDGCode());
786 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
787 auto* p5 = particles3.
appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
788 p5->addRelationTo(mcParticle);
791 mcParticle->
setPDG(300553);
792 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
793 auto* p6 = particles3.
appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 15);
794 p6->addRelationTo(mcParticle);
796 const Manager::Var* var3 = Manager::Instance().getVariable(
"isContinuumEvent");
797 ASSERT_NE(var3,
nullptr);
798 EXPECT_FALSE(std::get<bool>(var3->
function(p5)));
799 EXPECT_FALSE(std::get<bool>(var3->
function(p6)));
800 const Manager::Var* var3N = Manager::Instance().getVariable(
"isNotContinuumEvent");
801 ASSERT_NE(var3N,
nullptr);
802 EXPECT_TRUE(std::get<bool>(var3N->
function(p5)));
803 EXPECT_TRUE(std::get<bool>(var3N->
function(p6)));
807 class MetaVariableTest :
public ::testing::Test {
810 void SetUp()
override
812 DataStore::Instance().setInitializeActive(
true);
817 DataStore::Instance().setInitializeActive(
false);
821 void TearDown()
override
823 DataStore::Instance().reset();
827 TEST_F(MetaVariableTest, countDaughters)
829 PxPyPzEVector momentum;
830 const int nDaughters = 6;
832 std::vector<int> daughterIndices;
833 for (
int i = 0; i < nDaughters; i++) {
834 Particle d(PxPyPzEVector(1, 0, 0, 3.0), (i % 2) ? 211 : -211);
835 momentum += d.get4Vector();
836 Particle* newDaughters = particles.appendNew(d);
839 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
841 const Manager::Var* var = Manager::Instance().getVariable(
"countDaughters(charge > 0)");
842 ASSERT_NE(var,
nullptr);
843 EXPECT_EQ(std::get<int>(var->function(p)), 3);
845 var = Manager::Instance().getVariable(
"countDaughters(abs(charge) > 0)");
846 ASSERT_NE(var,
nullptr);
847 EXPECT_EQ(std::get<int>(var->function(p)), 6);
851 TEST_F(MetaVariableTest, useRestFrame)
853 Gearbox& gearbox = Gearbox::getInstance();
854 gearbox.setBackends({std::string(
"file:")});
856 gearbox.open(
"geometry/Belle2.xml",
false);
858 Particle p({ 0.1, -0.4, 0.8, 1.0 }, 411);
859 p.setVertex(XYZVector(1.0, 2.0, 2.0));
861 const Manager::Var* var = Manager::Instance().getVariable(
"p");
862 ASSERT_NE(var,
nullptr);
863 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.9);
865 var = Manager::Instance().getVariable(
"E");
866 ASSERT_NE(var,
nullptr);
867 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
869 var = Manager::Instance().getVariable(
"distance");
870 ASSERT_NE(var,
nullptr);
871 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 3.0);
873 var = Manager::Instance().getVariable(
"useRestFrame(p)");
874 ASSERT_NE(var,
nullptr);
875 EXPECT_NEAR(std::get<double>(var->function(&p)), 0.0, 1e-9);
877 var = Manager::Instance().getVariable(
"useRestFrame(E)");
878 ASSERT_NE(var,
nullptr);
879 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.4358899);
881 var = Manager::Instance().getVariable(
"useRestFrame(distance)");
882 ASSERT_NE(var,
nullptr);
883 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.0);
886 TEST_F(MetaVariableTest, useLabFrame)
888 Particle p({ 0.1, -0.4, 0.8, 1.0 }, 411);
889 p.setVertex(XYZVector(1.0, 2.0, 2.0));
891 const Manager::Var* var = Manager::Instance().getVariable(
"p");
892 ASSERT_NE(var,
nullptr);
893 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.9);
895 var = Manager::Instance().getVariable(
"E");
896 ASSERT_NE(var,
nullptr);
897 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
899 var = Manager::Instance().getVariable(
"distance");
900 ASSERT_NE(var,
nullptr);
901 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 3.0);
903 var = Manager::Instance().getVariable(
"useLabFrame(p)");
904 ASSERT_NE(var,
nullptr);
905 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.9);
907 var = Manager::Instance().getVariable(
"useLabFrame(E)");
908 ASSERT_NE(var,
nullptr);
909 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
911 var = Manager::Instance().getVariable(
"useLabFrame(distance)");
912 ASSERT_NE(var,
nullptr);
913 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 3.0);
916 TEST_F(MetaVariableTest, useCMSFrame)
918 Gearbox& gearbox = Gearbox::getInstance();
919 gearbox.setBackends({std::string(
"file:")});
921 gearbox.open(
"geometry/Belle2.xml",
false);
923 Particle p({ 0.1, -0.4, 0.8, 1.0 }, 411);
924 p.setVertex(XYZVector(1.0, 2.0, 2.0));
926 const Manager::Var* var = Manager::Instance().getVariable(
"p");
927 ASSERT_NE(var,
nullptr);
928 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.9);
930 var = Manager::Instance().getVariable(
"E");
931 ASSERT_NE(var,
nullptr);
932 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
934 var = Manager::Instance().getVariable(
"distance");
935 ASSERT_NE(var,
nullptr);
936 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 3.0);
938 var = Manager::Instance().getVariable(
"useCMSFrame(p)");
939 ASSERT_NE(var,
nullptr);
940 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.68174650327489894064);
942 var = Manager::Instance().getVariable(
"useCMSFrame(E)");
943 ASSERT_NE(var,
nullptr);
944 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.80918372124478121776);
946 var = Manager::Instance().getVariable(
"useCMSFrame(distance)");
947 ASSERT_NE(var,
nullptr);
948 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 3.1853695);
951 TEST_F(MetaVariableTest, useTagSideRecoilRestFrame)
953 DataStore::Instance().setInitializeActive(
true);
955 particles.registerInDataStore();
956 DataStore::Instance().setInitializeActive(
false);
959 PxPyPzEVector vec1 = {0.0, +0.332174566, 0.0, T.
getCMSEnergy() / 2.};
960 PxPyPzEVector vec2 = {0.0, -0.332174566, 0.0, T.
getCMSEnergy() / 2.};
968 const Manager::Var* var = Manager::Instance().getVariable(
"useTagSideRecoilRestFrame(daughter(1, p), 0)");
969 ASSERT_NE(var,
nullptr);
970 EXPECT_NEAR(std::get<double>(var->function(p0)), 0., 1e-6);
972 var = Manager::Instance().getVariable(
"useTagSideRecoilRestFrame(daughter(1, px), 0)");
973 ASSERT_NE(var,
nullptr);
974 EXPECT_NEAR(std::get<double>(var->function(p0)), 0., 1e-6);
976 var = Manager::Instance().getVariable(
"useTagSideRecoilRestFrame(daughter(1, py), 0)");
977 ASSERT_NE(var,
nullptr);
978 EXPECT_NEAR(std::get<double>(var->function(p0)), 0., 1e-6);
980 var = Manager::Instance().getVariable(
"useTagSideRecoilRestFrame(daughter(1, pz), 0)");
981 ASSERT_NE(var,
nullptr);
982 EXPECT_NEAR(std::get<double>(var->function(p0)), 0., 1e-6);
984 var = Manager::Instance().getVariable(
"useTagSideRecoilRestFrame(daughter(1, E), 0)");
985 ASSERT_NE(var,
nullptr);
986 EXPECT_NEAR(std::get<double>(var->function(p0)), p1->getMass(), 1e-6);
990 TEST_F(MetaVariableTest, extraInfo)
992 Particle p({ 0.1, -0.4, 0.8, 1.0 }, 11);
993 p.addExtraInfo(
"pi", 3.14);
995 const Manager::Var* var = Manager::Instance().getVariable(
"extraInfo(pi)");
996 ASSERT_NE(var,
nullptr);
997 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 3.14);
1000 EXPECT_TRUE(std::isnan(std::get<double>(var->function(
nullptr))));
1003 TEST_F(MetaVariableTest, eventExtraInfo)
1006 if (not eventExtraInfo.isValid())
1007 eventExtraInfo.create();
1008 eventExtraInfo->addExtraInfo(
"pi", 3.14);
1009 const Manager::Var* var = Manager::Instance().getVariable(
"eventExtraInfo(pi)");
1010 ASSERT_NE(var,
nullptr);
1011 EXPECT_FLOAT_EQ(std::get<double>(var->function(
nullptr)), 3.14);
1014 TEST_F(MetaVariableTest, eventCached)
1016 const Manager::Var* var = Manager::Instance().getVariable(
"eventCached(constant(3.14))");
1017 ASSERT_NE(var,
nullptr);
1018 EXPECT_FLOAT_EQ(std::get<double>(var->function(
nullptr)), 3.14);
1020 EXPECT_TRUE(eventExtraInfo.isValid());
1021 EXPECT_TRUE(eventExtraInfo->hasExtraInfo(
"__constant__bo3__pt14__bc"));
1022 EXPECT_FLOAT_EQ(eventExtraInfo->getExtraInfo(
"__constant__bo3__pt14__bc"), 3.14);
1023 eventExtraInfo->addExtraInfo(
"__eventExtraInfo__bopi__bc", 3.14);
1024 var = Manager::Instance().getVariable(
"eventCached(eventExtraInfo(pi))");
1025 ASSERT_NE(var,
nullptr);
1026 EXPECT_FLOAT_EQ(std::get<double>(var->function(
nullptr)), 3.14);
1029 TEST_F(MetaVariableTest, particleCached)
1031 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 11);
1032 const Manager::Var* var = Manager::Instance().getVariable(
"particleCached(px)");
1033 ASSERT_NE(var,
nullptr);
1034 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.1);
1035 EXPECT_TRUE(p.hasExtraInfo(
"__px"));
1036 EXPECT_FLOAT_EQ(p.getExtraInfo(
"__px"), 0.1);
1037 p.addExtraInfo(
"__py", -0.5);
1038 var = Manager::Instance().getVariable(
"particleCached(py)");
1039 ASSERT_NE(var,
nullptr);
1040 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -0.5);
1043 TEST_F(MetaVariableTest, basicMathTest)
1045 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 411);
1047 const Manager::Var* var = Manager::Instance().getVariable(
"abs(py)");
1048 ASSERT_NE(var,
nullptr);
1049 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.4);
1051 var = Manager::Instance().getVariable(
"min(E, pz)");
1052 ASSERT_NE(var,
nullptr);
1053 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.8);
1055 var = Manager::Instance().getVariable(
"max(E, pz)");
1056 ASSERT_NE(var,
nullptr);
1057 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 2.0);
1059 var = Manager::Instance().getVariable(
"log10(px)");
1060 ASSERT_NE(var,
nullptr);
1061 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -1.0);
1064 var = Manager::Instance().getVariable(
"sin(0.5235987755983)");
1065 ASSERT_NE(var,
nullptr);
1066 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.5);
1069 var = Manager::Instance().getVariable(
"sin(1.5707963267948966)");
1070 ASSERT_NE(var,
nullptr);
1071 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
1074 var = Manager::Instance().getVariable(
"asin(1.0)");
1075 ASSERT_NE(var,
nullptr);
1076 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.5707963267948966);
1079 var = Manager::Instance().getVariable(
"cos(1.0471975511965976)");
1080 ASSERT_NE(var,
nullptr);
1081 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.5);
1084 var = Manager::Instance().getVariable(
"acos(0)");
1085 ASSERT_NE(var,
nullptr);
1086 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.5707963267948966);
1090 TEST_F(MetaVariableTest, formula)
1097 Particle p({ 0.1, -0.4, 0.8, 2.0 }, -411);
1099 const Manager::Var* var = Manager::Instance().getVariable(
"formula(px + py)");
1100 ASSERT_NE(var,
nullptr);
1101 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -0.3);
1103 var = Manager::Instance().getVariable(
"formula(px - py)");
1104 ASSERT_NE(var,
nullptr);
1105 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.5);
1107 var = Manager::Instance().getVariable(
"formula(px * py)");
1108 ASSERT_NE(var,
nullptr);
1109 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -0.04);
1111 var = Manager::Instance().getVariable(
"formula(py / px)");
1112 ASSERT_NE(var,
nullptr);
1113 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -4.0);
1115 var = Manager::Instance().getVariable(
"formula(px ^ E)");
1116 ASSERT_NE(var,
nullptr);
1117 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.01);
1119 var = Manager::Instance().getVariable(
"formula(px * py + pz)");
1120 ASSERT_NE(var,
nullptr);
1121 EXPECT_NEAR(std::get<double>(var->function(&p)), 0.76, 1e-6);
1123 var = Manager::Instance().getVariable(
"formula(pz + px * py)");
1124 ASSERT_NE(var,
nullptr);
1125 EXPECT_NEAR(std::get<double>(var->function(&p)), 0.76, 1e-6);
1127 var = Manager::Instance().getVariable(
"formula(pt)");
1128 ASSERT_NE(var,
nullptr);
1129 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.41231057);
1130 double pt = std::get<double>(var->function(&p));
1132 var = Manager::Instance().getVariable(
"formula((px**2 + py**2)**(1/2))");
1133 ASSERT_NE(var,
nullptr);
1134 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), pt);
1136 var = Manager::Instance().getVariable(
"formula(charge)");
1137 ASSERT_NE(var,
nullptr);
1138 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -1.0);
1140 var = Manager::Instance().getVariable(
"formula(charge**2)");
1141 ASSERT_NE(var,
nullptr);
1142 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
1144 var = Manager::Instance().getVariable(
"formula(charge^2)");
1145 ASSERT_NE(var,
nullptr);
1146 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
1148 var = Manager::Instance().getVariable(
"formula(PDG * charge)");
1149 ASSERT_NE(var,
nullptr);
1150 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 411.0);
1152 var = Manager::Instance().getVariable(
"formula(PDG**2 * charge)");
1153 ASSERT_NE(var,
nullptr);
1154 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -168921.0);
1156 var = Manager::Instance().getVariable(
"formula(10.58 - (px + py + pz - E)**2)");
1157 ASSERT_NE(var,
nullptr);
1158 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 8.33);
1160 var = Manager::Instance().getVariable(
"formula(-10.58 + (px + py + pz - E)**2)");
1161 ASSERT_NE(var,
nullptr);
1162 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -8.33);
1164 var = Manager::Instance().getVariable(
"formula(-1.0 * PDG)");
1165 ASSERT_NE(var,
nullptr);
1166 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 411);
1169 TEST_F(MetaVariableTest, passesCut)
1171 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 411);
1172 Particle p2({ 0.1, -0.4, 0.8, 4.0 }, 411);
1174 const Manager::Var* var = Manager::Instance().getVariable(
"passesCut(E < 3)");
1175 ASSERT_NE(var,
nullptr);
1176 EXPECT_TRUE(std::get<bool>(var->function(&p)));
1177 EXPECT_FALSE(std::get<bool>(var->function(&p2)));
1182 TEST_F(MetaVariableTest, unmask)
1184 DataStore::Instance().setInitializeActive(
true);
1187 particles.registerInDataStore();
1189 particles.registerRelationTo(mcParticles);
1190 DataStore::Instance().setInitializeActive(
false);
1203 graphParticleGrandMother.
setPDG(-521);
1204 graphParticleMother.
setPDG(Const::muon.getPDGCode());
1205 graphParticleAunt.
setPDG(-14);
1206 graphParticleDaughter1.
setPDG(Const::electron.getPDGCode());
1207 graphParticleDaughter2.
setPDG(14);
1209 graphParticleMother.
comesFrom(graphParticleGrandMother);
1210 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1211 graphParticleDaughter1.
comesFrom(graphParticleMother);
1212 graphParticleDaughter2.
comesFrom(graphParticleMother);
1217 auto* mcGrandMother = mcParticles[0];
1218 mcGrandMother->setStatus(MCParticle::c_PrimaryParticle);
1220 auto* mcMother = mcParticles[1];
1221 mcMother->setStatus(MCParticle::c_PrimaryParticle);
1223 auto* mcAunt = mcParticles[2];
1224 mcAunt->setStatus(MCParticle::c_PrimaryParticle);
1226 auto* mcDaughter1 = mcParticles[3];
1227 mcDaughter1->setStatus(MCParticle::c_PrimaryParticle);
1229 auto* mcDaughter2 = mcParticles[4];
1230 mcDaughter2->setStatus(MCParticle::c_PrimaryParticle);
1232 auto* pGrandMother = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), -521);
1233 pGrandMother->addRelationTo(mcGrandMother);
1235 auto* pMother = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 13);
1236 pMother->addRelationTo(mcMother);
1239 pMother->writeExtraInfo(
"mcErrors", 8);
1240 pGrandMother->writeExtraInfo(
"mcErrors", 8 | 16);
1241 const Manager::Var* var1 = Manager::Instance().getVariable(
"unmask(mcErrors, 8)");
1242 const Manager::Var* var2 = Manager::Instance().getVariable(
"unmask(mcErrors, 8, 16, 32, 64)");
1243 ASSERT_NE(var1,
nullptr);
1244 EXPECT_FLOAT_EQ(std::get<double>(var1->function(pMother)), 0);
1245 EXPECT_FLOAT_EQ(std::get<double>(var1->function(pGrandMother)), 16);
1246 ASSERT_NE(var2,
nullptr);
1247 EXPECT_FLOAT_EQ(std::get<double>(var2->
function(pMother)), 0);
1248 EXPECT_FLOAT_EQ(std::get<double>(var2->
function(pGrandMother)), 0);
1251 pMother->writeExtraInfo(
"mcErrors", 8 | 128);
1252 pGrandMother->writeExtraInfo(
"mcErrors", 8 | 16 | 512);
1253 ASSERT_NE(var1,
nullptr);
1254 EXPECT_FLOAT_EQ(std::get<double>(var1->function(pMother)), 128);
1255 EXPECT_FLOAT_EQ(std::get<double>(var1->function(pGrandMother)), 16 | 512);
1256 ASSERT_NE(var2,
nullptr);
1257 EXPECT_FLOAT_EQ(std::get<double>(var2->
function(pMother)), 128);
1258 EXPECT_FLOAT_EQ(std::get<double>(var2->
function(pGrandMother)), 512);
1261 EXPECT_B2FATAL(Manager::Instance().getVariable(
"unmask(mcErrors)"));
1264 EXPECT_B2FATAL(Manager::Instance().getVariable(
"unmask(mcErrors, NOTINT)"));
1267 TEST_F(MetaVariableTest, conditionalVariableSelector)
1269 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 411);
1271 const Manager::Var* var = Manager::Instance().getVariable(
"conditionalVariableSelector(E>1, px, py)");
1272 ASSERT_NE(var,
nullptr);
1273 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.1);
1275 var = Manager::Instance().getVariable(
"conditionalVariableSelector(E<1, px, py)");
1276 ASSERT_NE(var,
nullptr);
1277 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), -0.4);
1281 TEST_F(MetaVariableTest, nCleanedTracks)
1283 DataStore::Instance().setInitializeActive(
true);
1287 tracks.registerInDataStore();
1288 DataStore::Instance().setInitializeActive(
false);
1290 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 11);
1291 Particle p2({ 0.1, -0.4, 0.8, 4.0 }, 11);
1293 track_fit_results.
appendNew(ROOT::Math::XYZVector(0.1, 0.1, 0.1), ROOT::Math::XYZVector(0.1, 0.0, 0.0),
1294 TMatrixDSym(6), 1, Const::pion, 0.01, 1.5, 0, 0, 0);
1295 track_fit_results.
appendNew(ROOT::Math::XYZVector(0.1, 0.1, 0.1), ROOT::Math::XYZVector(0.15, 0.0, 0.0),
1296 TMatrixDSym(6), 1, Const::pion, 0.01, 1.5, 0, 0, 0);
1297 track_fit_results.
appendNew(ROOT::Math::XYZVector(0.1, 0.1, 0.1), ROOT::Math::XYZVector(0.4, 0.0, 0.0),
1298 TMatrixDSym(6), 1, Const::pion, 0.01, 1.5, 0, 0, 0);
1299 track_fit_results.
appendNew(ROOT::Math::XYZVector(0.1, 0.1, 0.1), ROOT::Math::XYZVector(0.6, 0.0, 0.0),
1300 TMatrixDSym(6), 1, Const::pion, 0.01, 1.5, 0, 0, 0);
1302 tracks.appendNew()->setTrackFitResultIndex(Const::pion, 0);
1303 tracks.appendNew()->setTrackFitResultIndex(Const::pion, 1);
1304 tracks.appendNew()->setTrackFitResultIndex(Const::pion, 2);
1305 tracks.appendNew()->setTrackFitResultIndex(Const::pion, 3);
1307 const Manager::Var* var1 = Manager::Instance().getVariable(
"nCleanedTracks(p > 0.5)");
1308 EXPECT_FLOAT_EQ(std::get<int>(var1->function(
nullptr)), 1);
1310 const Manager::Var* var2 = Manager::Instance().getVariable(
"nCleanedTracks(p > 0.2)");
1311 EXPECT_FLOAT_EQ(std::get<int>(var2->
function(
nullptr)), 2);
1313 const Manager::Var* var3 = Manager::Instance().getVariable(
"nCleanedTracks()");
1314 EXPECT_FLOAT_EQ(std::get<int>(var3->
function(
nullptr)), 4);
1319 TEST_F(MetaVariableTest, NumberOfMCParticlesInEvent)
1321 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 11);
1322 Particle p2({ 0.1, -0.4, 0.8, 4.0 }, 11);
1325 auto* mcParticle = mcParticles.
appendNew();
1326 mcParticle->
setPDG(Const::electron.getPDGCode());
1327 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
1328 mcParticle = mcParticles.appendNew();
1329 mcParticle->setPDG(Const::photon.getPDGCode());
1330 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
1331 mcParticle = mcParticles.appendNew();
1332 mcParticle->setPDG(-Const::electron.getPDGCode());
1333 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
1334 mcParticle = mcParticles.appendNew();
1335 mcParticle->setPDG(Const::electron.getPDGCode());
1338 const Manager::Var* var = Manager::Instance().getVariable(
"NumberOfMCParticlesInEvent(11)");
1339 ASSERT_NE(var,
nullptr);
1340 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 2);
1344 TEST_F(MetaVariableTest, daughterInvM)
1346 PxPyPzEVector momentum;
1347 const int nDaughters = 6;
1349 std::vector<int> daughterIndices;
1350 for (
int i = 0; i < nDaughters; i++) {
1351 Particle d(PxPyPzEVector(2, 2, 2, 4.0), (i % 2) ? 213 : -213);
1352 momentum += d.get4Vector();
1353 Particle* newDaughters = particles.appendNew(d);
1356 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
1358 const Manager::Var* var = Manager::Instance().getVariable(
"daughterInvM(6,5)");
1359 ASSERT_NE(var,
nullptr);
1360 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
1362 var = Manager::Instance().getVariable(
"daughterInvM(0, 1)");
1363 ASSERT_NE(var,
nullptr);
1364 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 4.0);
1366 var = Manager::Instance().getVariable(
"daughterInvM(0, 1, 2)");
1367 ASSERT_NE(var,
nullptr);
1368 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 6.0);
1371 TEST_F(MetaVariableTest, daughter)
1373 PxPyPzEVector momentum;
1374 const int nDaughters = 6;
1376 std::vector<int> daughterIndices;
1377 for (
int i = 0; i < nDaughters; i++) {
1378 Particle d(PxPyPzEVector(i * 1.0, 1, 1, 1), (i % 2) ? 211 : -211);
1379 momentum += d.get4Vector();
1380 Particle* newDaughters = particles.appendNew(d);
1383 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
1385 const Manager::Var* var = Manager::Instance().getVariable(
"daughter(6, px)");
1386 ASSERT_NE(var,
nullptr);
1387 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
1389 var = Manager::Instance().getVariable(
"daughter(0, px)");
1390 ASSERT_NE(var,
nullptr);
1391 EXPECT_NEAR(std::get<double>(var->function(p)), 0.0, 1e-6);
1393 var = Manager::Instance().getVariable(
"daughter(1, px)");
1394 ASSERT_NE(var,
nullptr);
1395 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 1.0);
1397 var = Manager::Instance().getVariable(
"daughter(2, px)");
1398 ASSERT_NE(var,
nullptr);
1399 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 2.0);
1402 TEST_F(MetaVariableTest, mcDaughter)
1404 DataStore::Instance().setInitializeActive(
true);
1407 particles.registerInDataStore();
1409 particles.registerRelationTo(mcParticles);
1410 DataStore::Instance().setInitializeActive(
false);
1423 graphParticleGrandMother.
setPDG(-521);
1424 graphParticleMother.
setPDG(Const::muon.getPDGCode());
1425 graphParticleAunt.
setPDG(-14);
1426 graphParticleDaughter1.
setPDG(Const::electron.getPDGCode());
1427 graphParticleDaughter2.
setPDG(14);
1429 graphParticleMother.
comesFrom(graphParticleGrandMother);
1430 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1431 graphParticleDaughter1.
comesFrom(graphParticleMother);
1432 graphParticleDaughter2.
comesFrom(graphParticleMother);
1436 auto* mcGrandMother = mcParticles[0];
1437 mcGrandMother->setStatus(MCParticle::c_PrimaryParticle);
1439 auto* mcMother = mcParticles[1];
1440 mcMother->setStatus(MCParticle::c_PrimaryParticle);
1442 auto* mcAunt = mcParticles[2];
1443 mcAunt->setStatus(MCParticle::c_PrimaryParticle);
1445 auto* mcDaughter1 = mcParticles[3];
1446 mcDaughter1->setStatus(MCParticle::c_PrimaryParticle);
1448 auto* mcDaughter2 = mcParticles[4];
1449 mcDaughter2->setStatus(MCParticle::c_PrimaryParticle);
1451 auto* pGrandMother = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), -521);
1452 pGrandMother->addRelationTo(mcGrandMother);
1454 auto* pMother = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 13);
1455 pMother->addRelationTo(mcMother);
1458 auto* p_noMC = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 13);
1461 auto* p_noDaughter = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
1462 p_noDaughter->addRelationTo(mcDaughter1);
1464 const Manager::Var* var = Manager::Instance().getVariable(
"mcDaughter(0, PDG)");
1465 ASSERT_NE(var,
nullptr);
1466 EXPECT_FLOAT_EQ(std::get<double>(var->function(pGrandMother)), 13);
1467 EXPECT_FLOAT_EQ(std::get<double>(var->function(pMother)), 11);
1468 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p_noMC))));
1469 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p_noDaughter))));
1470 var = Manager::Instance().getVariable(
"mcDaughter(1, PDG)");
1471 EXPECT_FLOAT_EQ(std::get<double>(var->function(pGrandMother)), -14);
1472 EXPECT_FLOAT_EQ(std::get<double>(var->function(pMother)), 14);
1474 var = Manager::Instance().getVariable(
"mcDaughter(2, PDG)");
1475 EXPECT_TRUE(std::isnan(std::get<double>(var->function(pGrandMother))));
1476 EXPECT_TRUE(std::isnan(std::get<double>(var->function(pMother))));
1478 var = Manager::Instance().getVariable(
"mcDaughter(0, mcDaughter(0, PDG))");
1479 EXPECT_FLOAT_EQ(std::get<double>(var->function(pGrandMother)), 11);
1480 EXPECT_TRUE(std::isnan(std::get<double>(var->function(pMother))));
1481 var = Manager::Instance().getVariable(
"mcDaughter(0, mcDaughter(1, PDG))");
1482 EXPECT_FLOAT_EQ(std::get<double>(var->function(pGrandMother)), 14);
1483 var = Manager::Instance().getVariable(
"mcDaughter(0, mcDaughter(2, PDG))");
1484 EXPECT_TRUE(std::isnan(std::get<double>(var->function(pGrandMother))));
1485 var = Manager::Instance().getVariable(
"mcDaughter(1, mcDaughter(0, PDG))");
1486 EXPECT_TRUE(std::isnan(std::get<double>(var->function(pGrandMother))));
1489 TEST_F(MetaVariableTest, mcMother)
1491 DataStore::Instance().setInitializeActive(
true);
1494 particles.registerInDataStore();
1496 particles.registerRelationTo(mcParticles);
1497 DataStore::Instance().setInitializeActive(
false);
1510 graphParticleGrandMother.
setPDG(-521);
1511 graphParticleMother.
setPDG(Const::muon.getPDGCode());
1512 graphParticleAunt.
setPDG(-14);
1513 graphParticleDaughter1.
setPDG(Const::electron.getPDGCode());
1514 graphParticleDaughter2.
setPDG(14);
1516 graphParticleMother.
comesFrom(graphParticleGrandMother);
1517 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1518 graphParticleDaughter1.
comesFrom(graphParticleMother);
1519 graphParticleDaughter2.
comesFrom(graphParticleMother);
1524 auto* mcGrandMother = mcParticles[0];
1525 mcGrandMother->setStatus(MCParticle::c_PrimaryParticle);
1527 auto* mcMother = mcParticles[1];
1528 mcMother->setStatus(MCParticle::c_PrimaryParticle);
1530 auto* mcAunt = mcParticles[2];
1531 mcAunt->setStatus(MCParticle::c_PrimaryParticle);
1533 auto* mcDaughter1 = mcParticles[3];
1534 mcDaughter1->setStatus(MCParticle::c_PrimaryParticle);
1536 auto* mcDaughter2 = mcParticles[4];
1537 mcDaughter2->setStatus(MCParticle::c_PrimaryParticle);
1539 auto* p1 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
1540 p1->addRelationTo(mcDaughter1);
1542 auto* p2 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 14);
1543 p2->addRelationTo(mcDaughter2);
1545 auto* pMother = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 13);
1546 pMother->addRelationTo(mcMother);
1549 auto* p_noMC = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
1552 auto* p_noMother = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), -521);
1553 p_noMother->addRelationTo(mcGrandMother);
1555 const Manager::Var* var = Manager::Instance().getVariable(
"mcMother(PDG)");
1556 ASSERT_NE(var,
nullptr);
1557 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 13);
1558 EXPECT_FLOAT_EQ(std::get<double>(var->function(p2)), 13);
1559 EXPECT_FLOAT_EQ(std::get<double>(var->function(pMother)), -521);
1560 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p_noMC))));
1561 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p_noMother))));
1564 var = Manager::Instance().getVariable(
"mcMother(mcMother(PDG))");
1565 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), -521);
1568 TEST_F(MetaVariableTest, genParticle)
1570 DataStore::Instance().setInitializeActive(
true);
1573 particles.registerInDataStore();
1575 particles.registerRelationTo(mcParticles);
1576 DataStore::Instance().setInitializeActive(
false);
1589 graphParticleGrandMother.
setPDG(300553);
1590 graphParticleMother.
setPDG(-521);
1591 graphParticleAunt.
setPDG(521);
1592 graphParticleDaughter1.
setPDG(Const::electron.getPDGCode());
1593 graphParticleDaughter2.
setPDG(-12);
1595 graphParticleGrandMother.
setMomentum(0.0, 0.0, 0.4);
1598 graphParticleMother.
comesFrom(graphParticleGrandMother);
1599 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1600 graphParticleDaughter1.
comesFrom(graphParticleMother);
1601 graphParticleDaughter2.
comesFrom(graphParticleMother);
1606 auto* mcGrandMother = mcParticles[0];
1607 mcGrandMother->setStatus(MCParticle::c_PrimaryParticle);
1609 auto* mcMother = mcParticles[1];
1610 mcMother->setStatus(MCParticle::c_PrimaryParticle);
1612 auto* mcAunt = mcParticles[2];
1613 mcAunt->setStatus(MCParticle::c_PrimaryParticle);
1615 auto* mcDaughter1 = mcParticles[3];
1616 mcDaughter1->setStatus(MCParticle::c_PrimaryParticle);
1618 auto* mcDaughter2 = mcParticles[4];
1619 mcDaughter2->setStatus(MCParticle::c_PrimaryParticle);
1621 auto* p1 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
1622 p1->addRelationTo(mcDaughter1);
1625 auto* p_noMC = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 211);
1627 const Manager::Var* var = Manager::Instance().getVariable(
"genParticle(0, PDG)");
1628 ASSERT_NE(var,
nullptr);
1629 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 300553);
1630 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), 300553);
1632 var = Manager::Instance().getVariable(
"genParticle(0, matchedMC(pz))");
1633 ASSERT_NE(var,
nullptr);
1634 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 0.4);
1635 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), 0.4);
1637 var = Manager::Instance().getVariable(
"genParticle(0, mcDaughter(0, PDG))");
1638 ASSERT_NE(var,
nullptr);
1639 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), -521);
1640 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), -521);
1642 var = Manager::Instance().getVariable(
"genParticle(0, mcDaughter(0, matchedMC(px)))");
1643 ASSERT_NE(var,
nullptr);
1644 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 1.1);
1645 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), 1.1);
1647 var = Manager::Instance().getVariable(
"genParticle(1, PDG)");
1648 ASSERT_NE(var,
nullptr);
1649 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), -521);
1650 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), -521);
1652 var = Manager::Instance().getVariable(
"genParticle(4, PDG)");
1653 ASSERT_NE(var,
nullptr);
1654 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), -12);
1655 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), -12);
1657 var = Manager::Instance().getVariable(
"genParticle(5, PDG)");
1658 ASSERT_NE(var,
nullptr);
1659 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p1))));
1660 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p_noMC))));
1663 TEST_F(MetaVariableTest, genUpsilon4S)
1665 DataStore::Instance().setInitializeActive(
true);
1668 particles.registerInDataStore();
1670 particles.registerRelationTo(mcParticles);
1671 DataStore::Instance().setInitializeActive(
false);
1684 graphParticleGrandMother.
setPDG(300553);
1685 graphParticleMother.
setPDG(-521);
1686 graphParticleAunt.
setPDG(521);
1687 graphParticleDaughter1.
setPDG(Const::electron.getPDGCode());
1688 graphParticleDaughter2.
setPDG(-12);
1690 graphParticleGrandMother.
setMomentum(0.0, 0.0, 0.4);
1693 graphParticleMother.
comesFrom(graphParticleGrandMother);
1694 graphParticleAunt.
comesFrom(graphParticleGrandMother);
1695 graphParticleDaughter1.
comesFrom(graphParticleMother);
1696 graphParticleDaughter2.
comesFrom(graphParticleMother);
1701 auto* mcGrandMother = mcParticles[0];
1702 mcGrandMother->setStatus(MCParticle::c_PrimaryParticle);
1704 auto* mcMother = mcParticles[1];
1705 mcMother->setStatus(MCParticle::c_PrimaryParticle);
1707 auto* mcAunt = mcParticles[2];
1708 mcAunt->setStatus(MCParticle::c_PrimaryParticle);
1710 auto* mcDaughter1 = mcParticles[3];
1711 mcDaughter1->setStatus(MCParticle::c_PrimaryParticle);
1713 auto* mcDaughter2 = mcParticles[4];
1714 mcDaughter2->setStatus(MCParticle::c_PrimaryParticle);
1716 auto* p1 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
1717 p1->addRelationTo(mcDaughter1);
1720 auto* p_noMC = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 211);
1722 const Manager::Var* var = Manager::Instance().getVariable(
"genUpsilon4S(PDG)");
1723 ASSERT_NE(var,
nullptr);
1724 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 300553);
1725 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), 300553);
1727 var = Manager::Instance().getVariable(
"genUpsilon4S(matchedMC(pz))");
1728 ASSERT_NE(var,
nullptr);
1729 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 0.4);
1730 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), 0.4);
1732 var = Manager::Instance().getVariable(
"genUpsilon4S(mcDaughter(0, PDG))");
1733 ASSERT_NE(var,
nullptr);
1734 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), -521);
1735 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), -521);
1737 var = Manager::Instance().getVariable(
"genUpsilon4S(mcDaughter(0, matchedMC(px)))");
1738 ASSERT_NE(var,
nullptr);
1739 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), 1.1);
1740 EXPECT_FLOAT_EQ(std::get<double>(var->function(p_noMC)), 1.1);
1743 mcParticles.
clear();
1750 graphParticle1.
setPDG(Const::electron.getPDGCode());
1751 graphParticle2.
setPDG(-Const::electron.getPDGCode());
1758 auto* mcP1 = mcParticles[0];
1759 mcP1->setStatus(MCParticle::c_PrimaryParticle);
1761 auto* mcP2 = mcParticles[1];
1762 mcP2->setStatus(MCParticle::c_PrimaryParticle);
1764 auto* someParticle = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
1765 someParticle->addRelationTo(mcP1);
1767 var = Manager::Instance().getVariable(
"genUpsilon4S(PDG)");
1768 ASSERT_NE(var,
nullptr);
1769 EXPECT_TRUE(std::isnan(std::get<double>(var->function(someParticle))));
1772 TEST_F(MetaVariableTest, daughterProductOf)
1774 PxPyPzEVector momentum;
1775 const int nDaughters = 4;
1777 std::vector<int> daughterIndices;
1778 for (
int i = 0; i < nDaughters; i++) {
1779 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 2.0), (i % 2) ? 213 : -213);
1780 momentum += d.get4Vector();
1781 Particle* newDaughters = particles.appendNew(d);
1784 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
1786 const Manager::Var* var = Manager::Instance().getVariable(
"daughterProductOf(E)");
1787 ASSERT_NE(var,
nullptr);
1788 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 120.0);
1791 TEST_F(MetaVariableTest, daughterSumOf)
1793 PxPyPzEVector momentum;
1794 const int nDaughters = 4;
1796 std::vector<int> daughterIndices;
1797 for (
int i = 0; i < nDaughters; i++) {
1798 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 2.0), (i % 2) ? 213 : -213);
1799 momentum += d.get4Vector();
1800 Particle* newDaughters = particles.appendNew(d);
1803 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
1805 const Manager::Var* var = Manager::Instance().getVariable(
"daughterSumOf(E)");
1806 ASSERT_NE(var,
nullptr);
1807 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 14.0);
1810 TEST_F(MetaVariableTest, daughterLowest)
1812 PxPyPzEVector momentum;
1813 const int nDaughters = 4;
1815 std::vector<int> daughterIndices;
1816 for (
int i = 0; i < nDaughters; i++) {
1817 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 2.0), (i % 2) ? 213 : -213);
1818 momentum += d.get4Vector();
1819 Particle* newDaughters = particles.appendNew(d);
1822 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
1824 const Manager::Var* var = Manager::Instance().getVariable(
"daughterLowest(E)");
1825 ASSERT_NE(var,
nullptr);
1826 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 2.0);
1829 TEST_F(MetaVariableTest, daughterHighest)
1831 PxPyPzEVector momentum;
1832 const int nDaughters = 4;
1834 std::vector<int> daughterIndices;
1835 for (
int i = 0; i < nDaughters; i++) {
1836 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? 213 : -213);
1837 momentum += d.get4Vector();
1838 Particle* newDaughters = particles.appendNew(d);
1841 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
1843 const Manager::Var* var = Manager::Instance().getVariable(
"daughterHighest(E)");
1844 ASSERT_NE(var,
nullptr);
1845 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 4.0);
1848 TEST_F(MetaVariableTest, daughterDiffOf)
1850 PxPyPzEVector momentum;
1851 const int nDaughters = 4;
1853 std::vector<int> daughterIndices;
1854 for (
int i = 0; i < nDaughters; i++) {
1855 Particle d(PxPyPzEVector(-1, 1.0 - 2 * (i % 2), 1, i * 1.0 + 2.0), (i % 2) ? -11 : 211);
1856 momentum += d.get4Vector();
1857 Particle* newDaughters = particles.appendNew(d);
1860 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
1862 const Manager::Var* var = Manager::Instance().getVariable(
"daughterDiffOf(0, 1, PDG)");
1863 ASSERT_NE(var,
nullptr);
1864 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -222);
1866 var = Manager::Instance().getVariable(
"daughterDiffOf(1, 0, PDG)");
1867 ASSERT_NE(var,
nullptr);
1868 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 222);
1870 var = Manager::Instance().getVariable(
"daughterDiffOf(0, 1, abs(PDG))");
1871 ASSERT_NE(var,
nullptr);
1872 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -200);
1874 var = Manager::Instance().getVariable(
"daughterDiffOf(1, 1, PDG)");
1875 ASSERT_NE(var,
nullptr);
1876 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
1878 var = Manager::Instance().getVariable(
"daughterDiffOf(1, 3, abs(PDG))");
1879 ASSERT_NE(var,
nullptr);
1880 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
1882 var = Manager::Instance().getVariable(
"daughterDiffOf(0, 2, PDG)");
1883 ASSERT_NE(var,
nullptr);
1884 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
1886 var = Manager::Instance().getVariable(
"daughterDiffOf(1, 0, phi)");
1887 ASSERT_NE(var,
nullptr);
1888 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -1.5707964);
1890 var = Manager::Instance().getVariable(
"daughterDiffOf(1, 0, useCMSFrame(phi))");
1891 ASSERT_NE(var,
nullptr);
1892 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -1.5004894);
1894 EXPECT_B2FATAL(Manager::Instance().getVariable(
"daughterDiffOf(0, NOTINT, PDG)"));
1898 TEST_F(MetaVariableTest, mcDaughterDiffOf)
1900 DataStore::Instance().setInitializeActive(
true);
1901 PxPyPzEVector momentum;
1902 const int nDaughters = 4;
1905 particles.registerRelationTo(mcParticles);
1906 std::vector<int> daughterIndices;
1907 DataStore::Instance().setInitializeActive(
false);
1909 for (
int i = 0; i < nDaughters; i++) {
1910 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? -11 : 211);
1911 momentum += d.get4Vector();
1912 Particle* newDaughters = particles.appendNew(d);
1914 auto* mcParticle = mcParticles.
appendNew();
1915 mcParticle->
setPDG((i % 2) ? -Const::electron.getPDGCode() : Const::pion.getPDGCode());
1916 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
1919 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
1921 const Manager::Var* var = Manager::Instance().getVariable(
"mcDaughterDiffOf(0, 1, PDG)");
1922 ASSERT_NE(var,
nullptr);
1923 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -222);
1925 var = Manager::Instance().getVariable(
"mcDaughterDiffOf(1, 0, PDG)");
1926 ASSERT_NE(var,
nullptr);
1927 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 222);
1929 var = Manager::Instance().getVariable(
"mcDaughterDiffOf(0, 1, abs(PDG))");
1930 ASSERT_NE(var,
nullptr);
1931 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -200);
1933 var = Manager::Instance().getVariable(
"mcDaughterDiffOf(1, 1, PDG)");
1934 ASSERT_NE(var,
nullptr);
1935 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
1937 var = Manager::Instance().getVariable(
"mcDaughterDiffOf(1, 3, abs(PDG))");
1938 ASSERT_NE(var,
nullptr);
1939 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
1941 var = Manager::Instance().getVariable(
"mcDaughterDiffOf(0, 2, PDG)");
1942 ASSERT_NE(var,
nullptr);
1943 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
1945 EXPECT_B2FATAL(Manager::Instance().getVariable(
"mcDaughterDiffOf(0, NOTINT, PDG)"));
1950 TEST_F(MetaVariableTest, daughterClusterAngleInBetween)
1954 std::vector<int> daughterIndices, daughterIndices_noclst;
1957 DataStore::Instance().setInitializeActive(
true);
1960 particles.registerRelationTo(eclclusters);
1961 DataStore::Instance().setInitializeActive(
false);
1964 const float px_CM = 2.;
1965 const float py_CM = 1.;
1966 const float pz_CM = 3.;
1968 E_CM =
sqrt(pow(px_CM, 2) + pow(py_CM, 2) + pow(pz_CM, 2));
1969 PxPyPzEVector momentum, momentum_noclst;
1970 PxPyPzEVector dau0_4vec_CM(px_CM, py_CM, pz_CM, E_CM), dau1_4vec_CM(-px_CM, -py_CM, -pz_CM, E_CM);
1971 PxPyPzEVector dau0_4vec_Lab, dau1_4vec_Lab;
1972 dau0_4vec_Lab = PCmsLabTransform::cmsToLab(
1974 dau1_4vec_Lab = PCmsLabTransform::cmsToLab(dau1_4vec_CM);
1977 Particle dau0_noclst(dau0_4vec_Lab, 22);
1978 momentum += dau0_noclst.get4Vector();
1979 Particle* newDaughter0_noclst = particles.appendNew(dau0_noclst);
1980 daughterIndices_noclst.push_back(newDaughter0_noclst->
getArrayIndex());
1981 Particle dau1_noclst(dau1_4vec_Lab, 22);
1982 momentum += dau1_noclst.get4Vector();
1983 Particle* newDaughter1_noclst = particles.appendNew(dau1_noclst);
1984 daughterIndices_noclst.push_back(newDaughter1_noclst->
getArrayIndex());
1985 const Particle* par_noclst = particles.appendNew(momentum, 111, Particle::c_Unflavored, daughterIndices_noclst);
1988 const Manager::Var* var = Manager::Instance().getVariable(
"daughterClusterAngleInBetween(0, 1)");
1989 const Manager::Var* varCMS = Manager::Instance().getVariable(
"useCMSFrame(daughterClusterAngleInBetween(0, 1))");
1992 ASSERT_NE(var,
nullptr);
1993 EXPECT_TRUE(std::isnan(std::get<double>(var->function(par_noclst))));
1998 eclst0->
setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
2000 eclst0->
setTheta(dau0_4vec_Lab.Theta());
2001 eclst0->
setPhi(dau0_4vec_Lab.Phi());
2002 eclst0->
setR(148.4);
2005 eclst1->
setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
2007 eclst1->
setTheta(dau1_4vec_Lab.Theta());
2008 eclst1->
setPhi(dau1_4vec_Lab.Phi());
2009 eclst1->
setR(148.5);
2011 const Particle* newDaughter0 = particles.appendNew(
Particle(eclclusters[0]));
2013 const Particle* newDaughter1 = particles.appendNew(
Particle(eclclusters[1]));
2016 const Particle* par = particles.appendNew(momentum, 111, Particle::c_Unflavored, daughterIndices);
2019 EXPECT_FLOAT_EQ(std::get<double>(var->function(par)), 2.8613892);
2020 EXPECT_FLOAT_EQ(std::get<double>(varCMS->
function(par)), M_PI);
2023 TEST_F(MetaVariableTest, grandDaughterDiffOfs)
2027 std::vector<int> daughterIndices0_noclst, daughterIndices1_noclst, daughterIndices2_noclst;
2028 std::vector<int> daughterIndices0, daughterIndices1, daughterIndices2;
2031 DataStore::Instance().setInitializeActive(
true);
2034 particles.registerRelationTo(eclclusters);
2035 DataStore::Instance().setInitializeActive(
false);
2038 const float px_0 = 2.;
2039 const float py_0 = 1.;
2040 const float pz_0 = 3.;
2041 const float px_1 = 1.5;
2042 const float py_1 = 1.5;
2043 const float pz_1 = 2.5;
2045 E_0 =
sqrt(pow(px_0, 2) + pow(py_0, 2) + pow(pz_0, 2));
2046 E_1 =
sqrt(pow(px_1, 2) + pow(py_1, 2) + pow(pz_1, 2));
2047 PxPyPzEVector momentum_0, momentum_1, momentum;
2048 PxPyPzEVector dau0_4vec(px_0, py_0, pz_0, E_0), dau1_4vec(px_1, py_1, pz_1, E_1);
2061 Particle dau0_noclst(dau0_4vec, 22);
2062 momentum_0 = dau0_4vec;
2063 Particle* newDaughter0_noclst = particles.appendNew(dau0_noclst);
2064 daughterIndices0_noclst.push_back(newDaughter0_noclst->
getArrayIndex());
2065 const Particle* par0_noclst = particles.appendNew(momentum_0, 111, Particle::c_Unflavored, daughterIndices0_noclst);
2066 Particle dau1_noclst(dau1_4vec, 22);
2067 momentum_1 = dau1_4vec;
2068 Particle* newDaughter1_noclst = particles.appendNew(dau1_noclst);
2069 daughterIndices1_noclst.push_back(newDaughter1_noclst->
getArrayIndex());
2070 const Particle* par1_noclst = particles.appendNew(momentum_1, 111, Particle::c_Unflavored, daughterIndices1_noclst);
2072 momentum = momentum_0 + momentum_1;
2073 daughterIndices2_noclst.push_back(par0_noclst->
getArrayIndex());
2074 daughterIndices2_noclst.push_back(par1_noclst->
getArrayIndex());
2075 const Particle* parGranny_noclst = particles.appendNew(momentum, 111, Particle::c_Unflavored, daughterIndices2_noclst);
2078 const Manager::Var* var_Theta = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,0,0,theta)");
2079 const Manager::Var* var_ClusterTheta = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,0,0,clusterTheta)");
2080 const Manager::Var* var_E = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,0,0,E)");
2081 const Manager::Var* var_ClusterE = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,0,0,clusterE)");
2082 const Manager::Var* var_E_wrongIndexes = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,2,3,E)");
2083 const Manager::Var* var_ClusterE_wrongIndexes = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,2,3,clusterE)");
2085 const Manager::Var* var_ClusterPhi = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,0,0,clusterPhi)");
2086 const Manager::Var* var_Phi = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,0,0,phi)");
2087 const Manager::Var* var_ClusterPhi_wrongIndexes = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,2,3,clusterPhi)");
2088 const Manager::Var* var_Phi_wrongIndexes = Manager::Instance().getVariable(
"grandDaughterDiffOf(0,1,2,3,phi)");
2093 ASSERT_NE(var_ClusterPhi,
nullptr);
2094 EXPECT_TRUE(std::isnan(std::get<double>(var_ClusterPhi->
function(parGranny_noclst))));
2095 EXPECT_TRUE(std::isnan(std::get<double>(var_ClusterTheta->
function(parGranny_noclst))));
2096 EXPECT_TRUE(std::isnan(std::get<double>(var_ClusterE->
function(parGranny_noclst))));
2097 EXPECT_FLOAT_EQ(std::get<double>(var_Phi->
function(parGranny_noclst)), 0.32175055);
2098 EXPECT_FLOAT_EQ(std::get<double>(var_Theta->
function(parGranny_noclst)), 0.06311664);
2099 EXPECT_FLOAT_EQ(std::get<double>(var_E->
function(parGranny_noclst)), -0.46293807);
2100 EXPECT_TRUE(std::isnan(std::get<double>(var_ClusterPhi_wrongIndexes->
function(parGranny_noclst))));
2101 EXPECT_TRUE(std::isnan(std::get<double>(var_Phi_wrongIndexes->
function(parGranny_noclst))));
2102 EXPECT_TRUE(std::isnan(std::get<double>(var_ClusterE_wrongIndexes->
function(parGranny_noclst))));
2103 EXPECT_TRUE(std::isnan(std::get<double>(var_E_wrongIndexes->
function(parGranny_noclst))));
2108 eclst0->
setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
2110 eclst0->
setTheta(dau0_4vec.Theta());
2111 eclst0->
setPhi(dau0_4vec.Phi());
2112 eclst0->
setR(148.4);
2115 eclst1->
setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
2117 eclst1->
setTheta(dau1_4vec.Theta());
2118 eclst1->
setPhi(dau1_4vec.Phi());
2119 eclst1->
setR(148.5);
2121 const Particle* newDaughter0 = particles.appendNew(
Particle(eclclusters[0]));
2123 const Particle* par0 = particles.appendNew(momentum_0, 111, Particle::c_Unflavored, daughterIndices0);
2125 const Particle* newDaughter1 = particles.appendNew(
Particle(eclclusters[1]));
2127 const Particle* par1 = particles.appendNew(momentum_1, 111, Particle::c_Unflavored, daughterIndices1);
2131 const Particle* parGranny = particles.appendNew(momentum, 111, Particle::c_Unflavored, daughterIndices2);
2135 EXPECT_FLOAT_EQ(std::get<double>(var_ClusterPhi->
function(parGranny)), 0.32175055);
2136 EXPECT_FLOAT_EQ(std::get<double>(var_Phi->
function(parGranny)), 0.32175055);
2137 EXPECT_FLOAT_EQ(std::get<double>(var_ClusterTheta->
function(parGranny)), 0.06311664);
2138 EXPECT_FLOAT_EQ(std::get<double>(var_Theta->
function(parGranny)), 0.06311664);
2139 EXPECT_FLOAT_EQ(std::get<double>(var_ClusterE->
function(parGranny)), -0.46293831);
2140 EXPECT_FLOAT_EQ(std::get<double>(var_E->
function(parGranny)), -0.46293831);
2143 TEST_F(MetaVariableTest, daughterNormDiffOf)
2145 PxPyPzEVector momentum;
2146 const int nDaughters = 4;
2148 std::vector<int> daughterIndices;
2149 for (
int i = 0; i < nDaughters; i++) {
2150 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? -11 : 211);
2151 momentum += d.get4Vector();
2152 Particle* newDaughters = particles.appendNew(d);
2155 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
2157 const Manager::Var* var = Manager::Instance().getVariable(
"daughterNormDiffOf(0, 1, PDG)");
2158 ASSERT_NE(var,
nullptr);
2159 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -222 / 200.);
2161 var = Manager::Instance().getVariable(
"daughterNormDiffOf(1, 0, PDG)");
2162 ASSERT_NE(var,
nullptr);
2163 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 222 / 200.);
2165 var = Manager::Instance().getVariable(
"daughterNormDiffOf(0, 1, abs(PDG))");
2166 ASSERT_NE(var,
nullptr);
2167 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -200 / 222.);
2169 var = Manager::Instance().getVariable(
"daughterNormDiffOf(1, 1, PDG)");
2170 ASSERT_NE(var,
nullptr);
2171 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), -0 / 22.);
2173 var = Manager::Instance().getVariable(
"daughterNormDiffOf(1, 3, abs(PDG))");
2174 ASSERT_NE(var,
nullptr);
2175 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0 / 22.);
2177 var = Manager::Instance().getVariable(
"daughterNormDiffOf(0, 2, PDG)");
2178 ASSERT_NE(var,
nullptr);
2179 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0 / 422.);
2183 TEST_F(MetaVariableTest, daughterMotherDiffOf)
2185 PxPyPzEVector momentum;
2186 const int nDaughters = 4;
2188 std::vector<int> daughterIndices;
2189 for (
int i = 0; i < nDaughters; i++) {
2190 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? -11 : 211);
2191 momentum += d.get4Vector();
2192 Particle* newDaughters = particles.appendNew(d);
2195 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
2197 const Manager::Var* var = Manager::Instance().getVariable(
"daughterMotherDiffOf(1, PDG)");
2198 ASSERT_NE(var,
nullptr);
2199 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 422);
2201 var = Manager::Instance().getVariable(
"daughterMotherDiffOf(1, abs(PDG))");
2202 ASSERT_NE(var,
nullptr);
2203 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 400);
2205 var = Manager::Instance().getVariable(
"daughterMotherDiffOf(0, PDG)");
2206 ASSERT_NE(var,
nullptr);
2207 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 200);
2211 TEST_F(MetaVariableTest, daughterMotherNormDiffOf)
2213 PxPyPzEVector momentum;
2214 const int nDaughters = 4;
2216 std::vector<int> daughterIndices;
2217 for (
int i = 0; i < nDaughters; i++) {
2218 Particle d(PxPyPzEVector(1, 1, 1, i * 1.0 + 1.0), (i % 2) ? -11 : 211);
2219 momentum += d.get4Vector();
2220 Particle* newDaughters = particles.appendNew(d);
2223 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Unflavored, daughterIndices);
2225 const Manager::Var* var = Manager::Instance().getVariable(
"daughterMotherNormDiffOf(1, PDG)");
2226 ASSERT_NE(var,
nullptr);
2227 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 422 / 400.);
2229 var = Manager::Instance().getVariable(
"daughterMotherNormDiffOf(1, abs(PDG))");
2230 ASSERT_NE(var,
nullptr);
2231 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 400 / 422.);
2233 var = Manager::Instance().getVariable(
"daughterMotherNormDiffOf(0, PDG)");
2234 ASSERT_NE(var,
nullptr);
2235 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 200 / 622.);
2239 TEST_F(MetaVariableTest, constant)
2242 const Manager::Var* var = Manager::Instance().getVariable(
"constant(1)");
2243 ASSERT_NE(var,
nullptr);
2244 EXPECT_FLOAT_EQ(std::get<double>(var->function(
nullptr)), 1.0);
2246 var = Manager::Instance().getVariable(
"constant(0)");
2247 ASSERT_NE(var,
nullptr);
2248 EXPECT_FLOAT_EQ(std::get<double>(var->function(
nullptr)), 0.0);
2252 TEST_F(MetaVariableTest, abs)
2254 Particle p({ 0.1, -0.4, 0.8, 2.0 }, 11);
2255 Particle p2({ -0.1, -0.4, 0.8, 4.0 }, -11);
2257 const Manager::Var* var = Manager::Instance().getVariable(
"abs(px)");
2258 ASSERT_NE(var,
nullptr);
2259 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 0.1);
2260 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p2)), 0.1);
2264 TEST_F(MetaVariableTest, sin)
2266 Particle p({ 3.14159265359 / 2.0, -0.4, 0.8, 1.0}, 11);
2267 Particle p2({ 0.0, -0.4, 0.8, 1.0 }, -11);
2269 const Manager::Var* var = Manager::Instance().getVariable(
"sin(px)");
2270 ASSERT_NE(var,
nullptr);
2271 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p)), 1.0);
2272 EXPECT_NEAR(std::get<double>(var->function(&p2)), 0.0, 1e-6);
2276 TEST_F(MetaVariableTest, cos)
2278 Particle p({ 3.14159265359 / 2.0, -0.4, 0.8, 1.0}, 11);
2279 Particle p2({ 0.0, -0.4, 0.8, 1.0 }, -11);
2281 const Manager::Var* var = Manager::Instance().getVariable(
"cos(px)");
2282 ASSERT_NE(var,
nullptr);
2283 EXPECT_NEAR(std::get<double>(var->function(&p)), 0.0, 1e-6);
2284 EXPECT_FLOAT_EQ(std::get<double>(var->function(&p2)), 1.0);
2288 TEST_F(MetaVariableTest, NBDeltaIfMissingDeathTest)
2291 EXPECT_B2FATAL(Manager::Instance().getVariable(
"NBDeltaIfMissing(TOP, 11)"));
2292 EXPECT_B2FATAL(Manager::Instance().getVariable(
"NBDeltaIfMissing(ARICH, 11)"));
2295 TEST_F(MetaVariableTest, matchedMC)
2297 DataStore::Instance().setInitializeActive(
true);
2300 particles.registerRelationTo(mcParticles);
2301 DataStore::Instance().setInitializeActive(
false);
2303 auto* mcParticle = mcParticles.
appendNew();
2304 mcParticle->
setPDG(Const::electron.getPDGCode());
2305 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
2306 auto* p1 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
2307 p1->addRelationTo(mcParticle);
2310 mcParticle->
setPDG(-Const::electron.getPDGCode());
2311 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
2312 auto* p2 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
2313 p2->addRelationTo(mcParticle);
2316 mcParticle->
setPDG(Const::photon.getPDGCode());
2317 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
2318 auto* p3 = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 11);
2319 p3->addRelationTo(mcParticle);
2322 auto* p4 = particles.appendNew(mcParticle);
2324 const Manager::Var* var = Manager::Instance().getVariable(
"matchedMC(charge)");
2325 ASSERT_NE(var,
nullptr);
2326 EXPECT_FLOAT_EQ(std::get<double>(var->function(p1)), -1);
2327 EXPECT_FLOAT_EQ(std::get<double>(var->function(p2)), 1);
2328 EXPECT_FLOAT_EQ(std::get<double>(var->function(p3)), 0);
2329 EXPECT_FLOAT_EQ(std::get<double>(var->function(p4)), 0);
2332 TEST_F(MetaVariableTest, countInList)
2338 DataStore::Instance().setInitializeActive(
true);
2339 outputList.registerInDataStore(flags);
2340 DataStore::Instance().setInitializeActive(
false);
2341 outputList.create();
2342 outputList->initialize(22,
"pList1");
2344 particles.appendNew(
Particle({0.5, 0.4, 0.5, 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2));
2345 particles.appendNew(
Particle({0.5, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3));
2346 particles.appendNew(
Particle({0.4, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4));
2347 particles.appendNew(
Particle({0.5, 0.4, 0.8, 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 5));
2348 particles.appendNew(
Particle({0.3, 0.3, 0.4, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 6));
2350 outputList->addParticle(0, 22, Particle::c_Unflavored);
2351 outputList->addParticle(1, 22, Particle::c_Unflavored);
2352 outputList->addParticle(2, 22, Particle::c_Unflavored);
2353 outputList->addParticle(3, 22, Particle::c_Unflavored);
2354 outputList->addParticle(4, 22, Particle::c_Unflavored);
2356 const Manager::Var* var = Manager::Instance().getVariable(
"countInList(pList1, E < 0.85)");
2357 ASSERT_NE(var,
nullptr);
2358 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 2);
2360 var = Manager::Instance().getVariable(
"countInList(pList1)");
2361 ASSERT_NE(var,
nullptr);
2362 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 5);
2364 var = Manager::Instance().getVariable(
"countInList(pList1, E > 5)");
2365 ASSERT_NE(var,
nullptr);
2366 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 0);
2368 var = Manager::Instance().getVariable(
"countInList(pList1, E < 5)");
2369 ASSERT_NE(var,
nullptr);
2370 EXPECT_EQ(std::get<int>(var->function(
nullptr)), 5);
2373 TEST_F(MetaVariableTest, isInList)
2381 DataStore::Instance().setInitializeActive(
true);
2382 gammalist.registerInDataStore(flags);
2383 DataStore::Instance().setInitializeActive(
false);
2385 gammalist->initialize(22,
"testGammaList");
2388 Particle goingin({0.5, 0.4, 0.5, 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0);
2389 Particle notgoingin({0.3, 0.3, 0.4, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1);
2390 auto* inthelist = particles.appendNew(goingin);
2391 auto* notinthelist = particles.appendNew(notgoingin);
2394 gammalist->addParticle(0, 22, Particle::c_Unflavored);
2397 const Manager::Var* vnonsense = Manager::Instance().getVariable(
"isInList(NONEXISTANTLIST)");
2398 const Manager::Var* vsensible = Manager::Instance().getVariable(
"isInList(testGammaList)");
2401 EXPECT_B2FATAL(std::get<bool>(vnonsense->
function(notinthelist)));
2402 EXPECT_TRUE(std::get<bool>(vsensible->
function(inthelist)));
2403 EXPECT_FALSE(std::get<bool>(vsensible->
function(notinthelist)));
2407 TEST_F(MetaVariableTest, cutIsInList)
2413 const std::string listname {
"wil/d(-+)'':l*"};
2416 DataStore::Instance().setInitializeActive(
true);
2417 particlelist.registerInDataStore(flags);
2418 DataStore::Instance().setInitializeActive(
false);
2419 particlelist.create();
2420 particlelist->initialize(22, listname);
2422 Particle goingin({0.5, 0.4, 0.5, 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0);
2423 Particle notgoingin({0.3, 0.3, 0.4, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1);
2424 auto* inthelist = particles.appendNew(goingin);
2425 auto* notinthelist = particles.appendNew(notgoingin);
2428 particlelist->addParticle(0, 22, Particle::c_Unflavored);
2431 const Manager::Var* nonexistlist = Manager::Instance().getVariable(
"passesCut(isInList(NONEXISTANTLIST))");
2432 const Manager::Var* existlist = Manager::Instance().getVariable(
"passesCut(isInList(" + listname +
"))");
2434 EXPECT_B2FATAL(std::get<bool>(nonexistlist->
function(inthelist)));
2435 EXPECT_FALSE(std::get<bool>(existlist->
function(notinthelist)));
2436 EXPECT_TRUE(std::get<bool>(existlist->
function(inthelist)));
2439 TEST_F(MetaVariableTest, sourceObjectIsInList)
2442 DataStore::Instance().reset();
2443 DataStore::Instance().setInitializeActive(
true);
2451 particles.registerInDataStore();
2453 gammalist.registerInDataStore(flags);
2456 DataStore::Instance().setInitializeActive(
false);
2460 gammalist->initialize(22,
"testGammaList");
2465 cl0->setEnergy(1.0);
2466 cl0->setHypothesis(ECLCluster::EHypothesisBit::c_nPhotons);
2467 cl0->addHypothesis(ECLCluster::EHypothesisBit::c_neutralHadron);
2468 cl0->setClusterId(0);
2470 cl1->setEnergy(1.0);
2471 cl1->setHypothesis(ECLCluster::EHypothesisBit::c_neutralHadron);
2472 cl1->setClusterId(1);
2475 Particle myphoton(cl0, Const::photon);
2476 Particle iscopiedin(cl0, Const::Klong);
2477 Particle notcopiedin(cl1, Const::Klong);
2480 auto* myphoton_ = particles.appendNew(myphoton);
2481 gammalist->addParticle(myphoton_);
2483 auto* iscopied = particles.appendNew(iscopiedin);
2484 auto* notcopied = particles.appendNew(notcopiedin);
2487 const Manager::Var* vnonsense = Manager::Instance().getVariable(
"sourceObjectIsInList(NONEXISTANTLIST)");
2488 const Manager::Var* vsensible = Manager::Instance().getVariable(
"sourceObjectIsInList(testGammaList)");
2491 EXPECT_B2FATAL(std::get<int>(vnonsense->
function(iscopied)));
2492 EXPECT_EQ(std::get<int>(vsensible->
function(iscopied)), 1);
2493 EXPECT_EQ(std::get<int>(vsensible->
function(notcopied)), 0);
2496 Particle composite({0.5, 0.4, 0.5, 0.8}, 512, Particle::c_Unflavored, Particle::c_Composite, 0);
2497 Particle undefined({0.3, 0.3, 0.4, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1);
2498 auto* composite_ = particles.appendNew(undefined);
2499 auto* undefined_ = particles.appendNew(composite);
2500 EXPECT_EQ(std::get<int>(vsensible->
function(composite_)), -1);
2501 EXPECT_EQ(std::get<int>(vsensible->
function(undefined_)), -1);
2504 TEST_F(MetaVariableTest, mcParticleIsInMCList)
2507 DataStore::Instance().reset();
2508 DataStore::Instance().setInitializeActive(
true);
2517 particles.registerInDataStore();
2518 particles.registerRelationTo(mcparticles);
2520 list.registerInDataStore(flags);
2521 anotherlist.registerInDataStore(flags);
2523 DataStore::Instance().setInitializeActive(
false);
2527 list->initialize(22,
"testList");
2529 anotherlist.create();
2530 anotherlist->initialize(22,
"supplimentaryList");
2533 auto* mcphoton = mcparticles.
appendNew();
2534 mcphoton->
setPDG(Const::photon.getPDGCode());
2535 mcphoton->setStatus(MCParticle::c_PrimaryParticle);
2537 auto* mcelectron = mcparticles.
appendNew();
2538 mcelectron->
setPDG(Const::electron.getPDGCode());
2539 mcelectron->setStatus(MCParticle::c_PrimaryParticle);
2541 auto* mcanotherelectron = mcparticles.
appendNew();
2542 mcanotherelectron->
setPDG(Const::photon.getPDGCode());
2543 mcanotherelectron->setStatus(MCParticle::c_PrimaryParticle);
2545 auto* mcyetanotherelectron = mcparticles.
appendNew();
2546 mcyetanotherelectron->
setPDG(Const::photon.getPDGCode());
2547 mcyetanotherelectron->setStatus(MCParticle::c_PrimaryParticle);
2550 auto* photon = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 22);
2551 photon->addRelationTo(mcphoton);
2552 list->addParticle(photon);
2554 auto* electron = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 22);
2555 electron->addRelationTo(mcelectron);
2556 list->addParticle(electron);
2558 auto* other = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 22);
2559 other->addRelationTo(mcanotherelectron);
2561 auto* yetanotherelectron = particles.appendNew(PxPyPzEVector({ 0.0, -0.4, 0.8, 1.0}), 22);
2562 yetanotherelectron->addRelationTo(mcyetanotherelectron);
2563 anotherlist->addParticle(yetanotherelectron);
2567 const Manager::Var* vnonsense = Manager::Instance().getVariable(
"mcParticleIsInMCList(NONEXISTANTLIST)");
2568 const Manager::Var* vsensible = Manager::Instance().getVariable(
"mcParticleIsInMCList(testList)");
2571 EXPECT_B2FATAL(std::get<bool>(vnonsense->
function(photon)));
2572 EXPECT_TRUE(std::get<bool>(vsensible->
function(photon)));
2573 EXPECT_TRUE(std::get<bool>(vsensible->
function(electron)));
2574 EXPECT_FALSE(std::get<bool>(vsensible->
function(other)));
2575 EXPECT_FALSE(std::get<bool>(vsensible->
function(yetanotherelectron)));
2578 Particle composite({0.5, 0.4, 0.5, 0.8}, 512, Particle::c_Unflavored, Particle::c_Composite, 0);
2579 Particle undefined({0.3, 0.3, 0.4, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1);
2580 auto* composite_ = particles.appendNew(undefined);
2581 auto* undefined_ = particles.appendNew(composite);
2582 EXPECT_FALSE(std::get<bool>(vsensible->
function(composite_)));
2583 EXPECT_FALSE(std::get<bool>(vsensible->
function(undefined_)));
2586 TEST_F(MetaVariableTest, mostB2BAndClosestParticles)
2595 Gearbox& gearbox = Gearbox::getInstance();
2596 gearbox.setBackends({std::string(
"file:")});
2598 gearbox.open(
"geometry/Belle2.xml",
false);
2607 DataStore::Instance().setInitializeActive(
true);
2608 gammalist.registerInDataStore(flags);
2609 emptylist.registerInDataStore(flags);
2610 DataStore::Instance().setInitializeActive(
false);
2612 gammalist->initialize(22,
"testGammaList");
2614 emptylist->initialize(22,
"testEmptyList");
2617 std::vector<Particle> gammavector = {
2619 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
2621 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
2624 for (
const auto& g : gammavector)
2625 particles.appendNew(g);
2628 for (
size_t i = 0; i < gammavector.size(); i++)
2629 gammalist->addParticle(i, 22, Particle::c_Unflavored);
2632 const auto* electron = particles.appendNew(
2634 11, Particle::c_Unflavored, Particle::c_Undefined, 2)
2638 EXPECT_B2FATAL(Manager::Instance().getVariable(
"angleToClosestInList"));
2639 EXPECT_B2FATAL(Manager::Instance().getVariable(
"angleToClosestInList(A, B)"));
2641 const auto* nonexistent = Manager::Instance().getVariable(
"angleToClosestInList(NONEXISTANTLIST)");
2642 EXPECT_B2FATAL(std::get<double>(nonexistent->function(electron)));
2644 const auto* empty = Manager::Instance().getVariable(
"angleToClosestInList(testEmptyList)");
2645 EXPECT_TRUE(std::isnan(std::get<double>(empty->function(electron))));
2647 const auto* closest = Manager::Instance().getVariable(
"angleToClosestInList(testGammaList)");
2648 EXPECT_FLOAT_EQ(std::get<double>(closest->function(electron)), 0.68014491);
2650 const auto* closestCMS = Manager::Instance().getVariable(
"useCMSFrame(angleToClosestInList(testGammaList))");
2651 EXPECT_FLOAT_EQ(std::get<double>(closestCMS->function(electron)), 0.67901474);
2655 EXPECT_B2FATAL(Manager::Instance().getVariable(
"closestInList"));
2656 EXPECT_B2FATAL(Manager::Instance().getVariable(
"closestInList(A, B, C)"));
2658 const auto* nonexistent = Manager::Instance().getVariable(
"closestInList(NONEXISTANTLIST, E)");
2659 EXPECT_B2FATAL(std::get<double>(nonexistent->function(electron)));
2661 const auto* empty = Manager::Instance().getVariable(
"closestInList(testEmptyList, E)");
2662 EXPECT_TRUE(std::isnan(std::get<double>(empty->function(electron))));
2664 const auto* closest = Manager::Instance().getVariable(
"closestInList(testGammaList, E)");
2665 EXPECT_FLOAT_EQ(std::get<double>(closest->function(electron)), 3.4);
2667 const auto* closestCMS = Manager::Instance().getVariable(
"useCMSFrame(closestInList(testGammaList, E))");
2668 EXPECT_FLOAT_EQ(std::get<double>(closestCMS->function(electron)), 3.2732551);
2670 const auto* closestCMSLabE = Manager::Instance().getVariable(
"useCMSFrame(closestInList(testGammaList, useLabFrame(E)))");
2671 EXPECT_FLOAT_EQ(std::get<double>(closestCMSLabE->function(electron)), 3.4);
2675 EXPECT_B2FATAL(Manager::Instance().getVariable(
"angleToMostB2BInList"));
2676 EXPECT_B2FATAL(Manager::Instance().getVariable(
"angleToMostB2BInList(A, B)"));
2678 const auto* nonexistent = Manager::Instance().getVariable(
"angleToMostB2BInList(NONEXISTANTLIST)");
2679 EXPECT_B2FATAL(std::get<double>(nonexistent->function(electron)));
2681 const auto* empty = Manager::Instance().getVariable(
"angleToMostB2BInList(testEmptyList)");
2682 EXPECT_TRUE(std::isnan(std::get<double>(empty->function(electron))));
2684 const auto* mostB2B = Manager::Instance().getVariable(
"angleToMostB2BInList(testGammaList)");
2685 EXPECT_FLOAT_EQ(std::get<double>(mostB2B->function(electron)), 2.2869499);
2687 const auto* mostB2BCMS = Manager::Instance().getVariable(
"useCMSFrame(angleToMostB2BInList(testGammaList))");
2688 EXPECT_FLOAT_EQ(std::get<double>(mostB2BCMS->function(electron)), 2.8312778);
2692 EXPECT_B2FATAL(Manager::Instance().getVariable(
"mostB2BInList"));
2693 EXPECT_B2FATAL(Manager::Instance().getVariable(
"mostB2BInList(A, B, C)"));
2695 const auto* nonexistent = Manager::Instance().getVariable(
"mostB2BInList(NONEXISTANTLIST, E)");
2696 EXPECT_B2FATAL(std::get<double>(nonexistent->function(electron)));
2698 const auto* empty = Manager::Instance().getVariable(
"mostB2BInList(testEmptyList, E)");
2699 EXPECT_TRUE(std::isnan(std::get<double>(empty->function(electron))));
2701 const auto* mostB2B = Manager::Instance().getVariable(
"mostB2BInList(testGammaList, E)");
2702 EXPECT_FLOAT_EQ(std::get<double>(mostB2B->function(electron)), 1.7);
2704 const auto* mostB2BCMS = Manager::Instance().getVariable(
"useCMSFrame(mostB2BInList(testGammaList, E))");
2705 EXPECT_FLOAT_EQ(std::get<double>(mostB2BCMS->function(electron)), 1.5848758);
2707 const auto* mostB2BCMSLabE = Manager::Instance().getVariable(
"useCMSFrame(mostB2BInList(testGammaList, useLabFrame(E)))");
2708 EXPECT_FLOAT_EQ(std::get<double>(mostB2BCMSLabE->function(electron)), 1.7);
2712 TEST_F(MetaVariableTest, totalEnergyOfParticlesInList)
2720 DataStore::Instance().setInitializeActive(
true);
2721 gammalist.registerInDataStore(flags);
2722 DataStore::Instance().setInitializeActive(
false);
2724 gammalist->initialize(22,
"testGammaList");
2727 std::vector<Particle> gammavector = {
2728 Particle({0.5, 0.4, 0.4, 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
2729 Particle({0.5, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
2730 Particle({0.4, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
2731 Particle({0.5, 0.4, 0.8, 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
2732 Particle({0.3, 0.3, 0.4, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
2736 for (
const auto& g : gammavector)
2737 particles.appendNew(g);
2740 for (
size_t i = 0; i < gammavector.size(); i++)
2741 gammalist->addParticle(i, 22, Particle::c_Unflavored);
2744 const Manager::Var* vnonsense = Manager::Instance().getVariable(
2745 "totalEnergyOfParticlesInList(NONEXISTANTLIST)");
2746 const Manager::Var* vsensible = Manager::Instance().getVariable(
2747 "totalEnergyOfParticlesInList(testGammaList)");
2750 EXPECT_B2FATAL(std::get<double>(vnonsense->
function(
nullptr)));
2751 EXPECT_FLOAT_EQ(std::get<double>(vsensible->
function(
nullptr)), 4.3);
2753 TEST_F(MetaVariableTest, totalPxOfParticlesInList)
2761 DataStore::Instance().setInitializeActive(
true);
2762 gammalist.registerInDataStore(flags);
2763 DataStore::Instance().setInitializeActive(
false);
2765 gammalist->initialize(22,
"testGammaList");
2768 std::vector<Particle> gammavector = {
2769 Particle({0.5, 0.4, 0.5, 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
2770 Particle({0.5, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
2771 Particle({0.4, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
2772 Particle({0.5, 0.4, 0.8, 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
2773 Particle({0.3, 0.3, 0.4, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
2777 for (
const auto& g : gammavector)
2778 particles.appendNew(g);
2781 for (
size_t i = 0; i < gammavector.size(); i++)
2782 gammalist->addParticle(i, 22, Particle::c_Unflavored);
2785 const Manager::Var* vnonsense = Manager::Instance().getVariable(
2786 "totalPxOfParticlesInList(NONEXISTANTLIST)");
2787 const Manager::Var* vsensible = Manager::Instance().getVariable(
2788 "totalPxOfParticlesInList(testGammaList)");
2791 EXPECT_B2FATAL(std::get<double>(vnonsense->
function(
nullptr)));
2792 EXPECT_FLOAT_EQ(std::get<double>(vsensible->
function(
nullptr)), 2.2);
2794 TEST_F(MetaVariableTest, totalPyOfParticlesInList)
2802 DataStore::Instance().setInitializeActive(
true);
2803 gammalist.registerInDataStore(flags);
2804 DataStore::Instance().setInitializeActive(
false);
2806 gammalist->initialize(22,
"testGammaList");
2809 std::vector<Particle> gammavector = {
2810 Particle({0.5, 0.4, 0.5, 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
2811 Particle({0.5, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
2812 Particle({0.4, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
2813 Particle({0.5, 0.4, 0.8, 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
2814 Particle({0.3, 0.3, 0.4, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
2818 for (
const auto& g : gammavector)
2819 particles.appendNew(g);
2822 for (
size_t i = 0; i < gammavector.size(); i++)
2823 gammalist->addParticle(i, 22, Particle::c_Unflavored);
2826 const Manager::Var* vnonsense = Manager::Instance().getVariable(
2827 "totalPyOfParticlesInList(NONEXISTANTLIST)");
2828 const Manager::Var* vsensible = Manager::Instance().getVariable(
2829 "totalPyOfParticlesInList(testGammaList)");
2832 EXPECT_B2FATAL(std::get<double>(vnonsense->
function(
nullptr)));
2833 EXPECT_FLOAT_EQ(std::get<double>(vsensible->
function(
nullptr)), 1.5);
2835 TEST_F(MetaVariableTest, totalPzOfParticlesInList)
2843 DataStore::Instance().setInitializeActive(
true);
2844 gammalist.registerInDataStore(flags);
2845 DataStore::Instance().setInitializeActive(
false);
2847 gammalist->initialize(22,
"testGammaList");
2850 std::vector<Particle> gammavector = {
2851 Particle({0.5, 0.4, 0.5, 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
2852 Particle({0.5, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
2853 Particle({0.4, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
2854 Particle({0.5, 0.4, 0.8, 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
2855 Particle({0.3, 0.3, 0.4, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
2859 for (
const auto& g : gammavector)
2860 particles.appendNew(g);
2863 for (
size_t i = 0; i < gammavector.size(); i++)
2864 gammalist->addParticle(i, 22, Particle::c_Unflavored);
2867 const Manager::Var* vnonsense = Manager::Instance().getVariable(
2868 "totalPzOfParticlesInList(NONEXISTANTLIST)");
2869 const Manager::Var* vsensible = Manager::Instance().getVariable(
2870 "totalPzOfParticlesInList(testGammaList)");
2873 EXPECT_B2FATAL(std::get<double>(vnonsense->
function(
nullptr)));
2874 EXPECT_FLOAT_EQ(std::get<double>(vsensible->
function(
nullptr)), 3.1);
2876 TEST_F(MetaVariableTest, maxPtInList)
2884 DataStore::Instance().setInitializeActive(
true);
2885 gammalist.registerInDataStore(flags);
2886 DataStore::Instance().setInitializeActive(
false);
2888 gammalist->initialize(22,
"testGammaList");
2891 std::vector<Particle> gammavector = {
2892 Particle({0.5, 0.4, 0.5, 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
2893 Particle({0.5, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
2894 Particle({0.4, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
2895 Particle({0.5, 0.4, 0.8, 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
2896 Particle({0.3, 0.3, 0.4, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
2900 for (
const auto& g : gammavector)
2901 particles.appendNew(g);
2904 for (
size_t i = 0; i < gammavector.size(); i++)
2905 gammalist->addParticle(i, 22, Particle::c_Unflavored);
2908 const Manager::Var* vnonsense = Manager::Instance().getVariable(
2909 "maxPtInList(NONEXISTANTLIST)");
2910 const Manager::Var* vsensible = Manager::Instance().getVariable(
2911 "maxPtInList(testGammaList)");
2914 EXPECT_B2FATAL(std::get<double>(vnonsense->
function(
nullptr)));
2915 EXPECT_FLOAT_EQ(std::get<double>(vsensible->
function(
nullptr)),
sqrt(0.5 * 0.5 + 0.4 * 0.4));
2919 TEST_F(MetaVariableTest, numberOfNonOverlappingParticles)
2925 DataStore::Instance().setInitializeActive(
true);
2926 outputList.registerInDataStore(flags);
2927 DataStore::Instance().setInitializeActive(
false);
2928 outputList.create();
2929 outputList->initialize(22,
"pList1");
2931 auto* p1 = particles.appendNew(
Particle({0.5, 0.4, 0.5, 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2));
2932 auto* p2 = particles.appendNew(
Particle({0.5, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3));
2933 auto* p3 = particles.appendNew(
Particle({0.5, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4));
2935 outputList->addParticle(0, 22, Particle::c_Unflavored);
2936 outputList->addParticle(1, 22, Particle::c_Unflavored);
2938 const Manager::Var* var = Manager::Instance().getVariable(
"numberOfNonOverlappingParticles(pList1)");
2939 ASSERT_NE(var,
nullptr);
2940 EXPECT_EQ(std::get<int>(var->function(p1)), 1);
2941 EXPECT_EQ(std::get<int>(var->function(p2)), 1);
2942 EXPECT_EQ(std::get<int>(var->function(p3)), 2);
2946 TEST_F(MetaVariableTest, veto)
2951 const Particle* p = particles.appendNew(
Particle({0.8, 0.8, 1.131370849898476039041351, 1.6}, 22,
2952 Particle::c_Unflavored, Particle::c_Undefined, 1));
2955 DataStore::Instance().setInitializeActive(
true);
2956 outputList.registerInDataStore(flags);
2957 DataStore::Instance().setInitializeActive(
false);
2958 outputList.create();
2959 outputList->initialize(22,
"pList1");
2961 particles.appendNew(
Particle({0.5, 0.4953406774856531014212777, 0.5609256753154148484773173, 0.9}, 22,
2962 Particle::c_Unflavored, Particle::c_Undefined, 2));
2963 particles.appendNew(
Particle({0.5, 0.2, 0.72111, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3));
2964 particles.appendNew(
Particle({0.4, 0.2, 0.78102, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4));
2965 particles.appendNew(
Particle({0.5, 0.4, 0.89443, 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 5));
2966 particles.appendNew(
Particle({0.3, 0.3, 0.42426, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 6));
2968 outputList->addParticle(1, 22, Particle::c_Unflavored);
2969 outputList->addParticle(2, 22, Particle::c_Unflavored);
2970 outputList->addParticle(3, 22, Particle::c_Unflavored);
2971 outputList->addParticle(4, 22, Particle::c_Unflavored);
2972 outputList->addParticle(5, 22, Particle::c_Unflavored);
2975 DataStore::Instance().setInitializeActive(
true);
2976 outputList2.registerInDataStore(flags);
2977 DataStore::Instance().setInitializeActive(
false);
2978 outputList2.create();
2979 outputList2->initialize(22,
"pList2");
2981 particles.appendNew(
Particle({0.5, -0.4, 0.63246, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 7));
2982 particles.appendNew(
Particle({0.5, 0.2, 0.72111, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 8));
2983 particles.appendNew(
Particle({0.4, 0.2, 0.78102, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 9));
2984 particles.appendNew(
Particle({0.5, 0.4, 0.89443, 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 10));
2985 particles.appendNew(
Particle({0.3, 0.3, 0.42426, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 11));
2987 outputList2->addParticle(6, 22, Particle::c_Unflavored);
2988 outputList2->addParticle(7, 22, Particle::c_Unflavored);
2989 outputList2->addParticle(8, 22, Particle::c_Unflavored);
2990 outputList2->addParticle(9, 22, Particle::c_Unflavored);
2991 outputList2->addParticle(10, 22, Particle::c_Unflavored);
2993 const Manager::Var* var = Manager::Instance().getVariable(
"veto(pList1, 0.130 < M < 0.140, 22)");
2994 ASSERT_NE(var,
nullptr);
2995 EXPECT_TRUE(std::get<bool>(var->function(p)));
2997 var = Manager::Instance().getVariable(
"veto(pList2, 0.130 < M < 0.140, 22)");
2998 ASSERT_NE(var,
nullptr);
2999 EXPECT_FALSE(std::get<bool>(var->function(p)));
3003 TEST_F(MetaVariableTest, averageValueInList)
3011 DataStore::Instance().setInitializeActive(
true);
3012 gammalist.registerInDataStore(flags);
3013 DataStore::Instance().setInitializeActive(
false);
3015 gammalist->initialize(22,
"testGammaList");
3018 std::vector<Particle> gammavector = {
3019 Particle({0.5, 0.4, 0.4, 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
3020 Particle({0.5, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
3021 Particle({0.4, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
3022 Particle({0.5, 0.4, 0.8, 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
3023 Particle({0.3, 0.3, 0.4, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
3027 for (
const auto& g : gammavector)
3028 particles.appendNew(g);
3031 for (
size_t i = 0; i < gammavector.size(); i++)
3032 gammalist->addParticle(i, 22, Particle::c_Unflavored);
3035 const Manager::Var* vmeanpx = Manager::Instance().getVariable(
3036 "averageValueInList(testGammaList, px)");
3037 const Manager::Var* vmeanpy = Manager::Instance().getVariable(
3038 "averageValueInList(testGammaList, py)");
3039 const Manager::Var* vmeanpz = Manager::Instance().getVariable(
3040 "averageValueInList(testGammaList, pz)");
3041 const Manager::Var* vmeanE = Manager::Instance().getVariable(
3042 "averageValueInList(testGammaList, E)");
3044 EXPECT_FLOAT_EQ(std::get<double>(vmeanpx->
function(
nullptr)), 0.44);
3045 EXPECT_FLOAT_EQ(std::get<double>(vmeanpy->
function(
nullptr)), 0.3);
3046 EXPECT_FLOAT_EQ(std::get<double>(vmeanpz->
function(
nullptr)), 0.6);
3047 EXPECT_FLOAT_EQ(std::get<double>(vmeanE->
function(
nullptr)), 0.86);
3050 EXPECT_B2FATAL(Manager::Instance().getVariable(
"averageValueInList(testGammaList)"));
3053 EXPECT_B2FATAL(Manager::Instance().getVariable(
"averageValueInList(testGammaList, NONEXISTANTVARIABLE)"));
3056 const Manager::Var* vnolist = Manager::Instance().getVariable(
3057 "averageValueInList(NONEXISTANTLIST, px)");
3059 EXPECT_B2FATAL(std::get<double>(vnolist->
function(
nullptr)));
3062 TEST_F(MetaVariableTest, medianValueInList)
3070 DataStore::Instance().setInitializeActive(
true);
3071 oddgammalist.registerInDataStore(flags);
3072 DataStore::Instance().setInitializeActive(
false);
3073 oddgammalist.create();
3074 oddgammalist->initialize(22,
"oddGammaList");
3076 DataStore::Instance().setInitializeActive(
true);
3077 evengammalist.registerInDataStore(flags);
3078 DataStore::Instance().setInitializeActive(
false);
3079 evengammalist.create();
3080 evengammalist->initialize(22,
"evenGammaList");
3083 std::vector<Particle> gammavector = {
3084 Particle({0.5, 0.4, 0.4, 0.8}, 22, Particle::c_Unflavored, Particle::c_Undefined, 0),
3085 Particle({0.5, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 1),
3086 Particle({0.4, 0.2, 0.7, 0.9}, 22, Particle::c_Unflavored, Particle::c_Undefined, 2),
3087 Particle({0.5, 0.4, 0.8, 1.1}, 22, Particle::c_Unflavored, Particle::c_Undefined, 3),
3088 Particle({0.3, 0.3, 0.4, 0.6}, 22, Particle::c_Unflavored, Particle::c_Undefined, 4)
3092 for (
const auto& g : gammavector)
3093 particles.appendNew(g);
3096 oddgammalist->addParticle(0, 22, Particle::c_Unflavored);
3097 for (
size_t i = 1; i < gammavector.size(); i++) {
3098 oddgammalist->addParticle(i, 22, Particle::c_Unflavored);
3099 evengammalist->addParticle(i, 22, Particle::c_Unflavored);
3103 const Manager::Var* voddmedianpx = Manager::Instance().getVariable(
3104 "medianValueInList(oddGammaList, px)");
3105 const Manager::Var* voddmedianpy = Manager::Instance().getVariable(
3106 "medianValueInList(oddGammaList, py)");
3107 const Manager::Var* voddmedianpz = Manager::Instance().getVariable(
3108 "medianValueInList(oddGammaList, pz)");
3109 const Manager::Var* voddmedianE = Manager::Instance().getVariable(
3110 "medianValueInList(oddGammaList, E)");
3112 EXPECT_FLOAT_EQ(std::get<double>(voddmedianpx->
function(
nullptr)), 0.5);
3113 EXPECT_FLOAT_EQ(std::get<double>(voddmedianpy->
function(
nullptr)), 0.3);
3114 EXPECT_FLOAT_EQ(std::get<double>(voddmedianpz->
function(
nullptr)), 0.7);
3115 EXPECT_FLOAT_EQ(std::get<double>(voddmedianE->
function(
nullptr)), 0.9);
3118 const Manager::Var* vevenmedianpx = Manager::Instance().getVariable(
3119 "medianValueInList(evenGammaList, px)");
3120 const Manager::Var* vevenmedianpy = Manager::Instance().getVariable(
3121 "medianValueInList(evenGammaList, py)");
3122 const Manager::Var* vevenmedianpz = Manager::Instance().getVariable(
3123 "medianValueInList(evenGammaList, pz)");
3124 const Manager::Var* vevenmedianE = Manager::Instance().getVariable(
3125 "medianValueInList(evenGammaList, E)");
3127 EXPECT_FLOAT_EQ(std::get<double>(vevenmedianpx->
function(
nullptr)), 0.45);
3128 EXPECT_FLOAT_EQ(std::get<double>(vevenmedianpy->
function(
nullptr)), 0.25);
3129 EXPECT_FLOAT_EQ(std::get<double>(vevenmedianpz->
function(
nullptr)), 0.7);
3130 EXPECT_FLOAT_EQ(std::get<double>(vevenmedianE->
function(
nullptr)), 0.9);
3133 EXPECT_B2FATAL(Manager::Instance().getVariable(
"medianValueInList(oddGammaList)"));
3136 EXPECT_B2FATAL(Manager::Instance().getVariable(
"medianValueInList(oddGammaList, NONEXISTANTVARIABLE)"));
3139 const Manager::Var* vnolist = Manager::Instance().getVariable(
3140 "medianValueInList(NONEXISTANTLIST, px)");
3142 EXPECT_B2FATAL(std::get<double>(vnolist->
function(
nullptr)));
3145 TEST_F(MetaVariableTest, pValueCombination)
3147 PxPyPzEVector momentum;
3149 std::vector<int> daughterIndices;
3150 Particle KS(PxPyPzEVector(1.164, 1.55200, 0, 2), 310, Particle::c_Unflavored, Particle::c_Composite, 0);
3152 momentum += KS.get4Vector();
3153 Particle* newDaughters = particles.appendNew(KS);
3155 Particle Jpsi(PxPyPzEVector(-1, 1, 1, 3.548), 443, Particle::c_Unflavored, Particle::c_Composite, 1);
3156 Jpsi.setPValue(0.9);
3157 momentum += Jpsi.get4Vector();
3158 newDaughters = particles.appendNew(Jpsi);
3160 Particle* B = particles.appendNew(momentum, 521, Particle::c_Flavored, daughterIndices);
3163 const Manager::Var* singlePvalue = Manager::Instance().getVariable(
"pValueCombination(chiProb)");
3164 ASSERT_NE(singlePvalue,
nullptr);
3165 EXPECT_FLOAT_EQ(std::get<double>(singlePvalue->
function(B)), 0.5);
3167 const Manager::Var* twoPvalues = Manager::Instance().getVariable(
"pValueCombination(chiProb, daughter(0, chiProb))");
3168 ASSERT_NE(twoPvalues,
nullptr);
3169 EXPECT_FLOAT_EQ(std::get<double>(twoPvalues->
function(B)), 0.05 * (1 - log(0.05)));
3172 Manager::Instance().getVariable(
"pValueCombination(chiProb, daughter(0, chiProb), daughter(1, chiProb))");
3173 ASSERT_NE(threePvalues,
nullptr);
3174 EXPECT_FLOAT_EQ(std::get<double>(threePvalues->
function(B)), 0.045 * (1 - log(0.045) + 0.5 * log(0.045) * log(0.045)));
3177 EXPECT_B2FATAL(Manager::Instance().getVariable(
"pValueCombination()"));
3180 EXPECT_B2FATAL(Manager::Instance().getVariable(
"pValueCombination(chiProb, NONEXISTANTVARIABLE)"));
3184 TEST_F(MetaVariableTest, daughterCombinationOneGeneration)
3186 const int nDaughters = 5;
3187 PxPyPzEVector momentum(0, 0, 0, 0);
3189 std::vector<int> daughterIndices;
3190 std::vector<PxPyPzEVector> daughterMomenta;
3192 for (
int i = 0; i < nDaughters; i++) {
3193 PxPyPzEVector mom(1, i * 0.5, 1, i * 1.0 + 2.0);
3194 Particle d(mom, (i % 2) ? 111 : 113);
3195 Particle* newDaughters = particles.appendNew(d);
3197 daughterMomenta.push_back(mom);
3198 momentum = momentum + mom;
3200 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Flavored, daughterIndices);
3203 const Manager::Var* var = Manager::Instance().getVariable(
"daughterCombination(M, 0,1,2)");
3204 double M_test = (daughterMomenta[0] + daughterMomenta[1] + daughterMomenta[2]).mag();
3205 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), M_test);
3207 var = Manager::Instance().getVariable(
"daughterCombination(M, 0,4)");
3208 M_test = (daughterMomenta[0] + daughterMomenta[4]).mag();
3209 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), M_test);
3213 var = Manager::Instance().getVariable(
"daughterCombination(p, 1, 0, 4)");
3214 double p_test = (daughterMomenta[0] + daughterMomenta[1] + daughterMomenta[4]).P();
3215 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), p_test);
3219 EXPECT_B2FATAL(Manager::Instance().getVariable(
"daughterCombination(aVeryNonExistingVariableSillyName, 1, 0, 4)"));
3221 var = Manager::Instance().getVariable(
"daughterCombination(M, 1, 0, 100)");
3222 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3223 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3226 var = Manager::Instance().getVariable(
"daughterCombination(M, 1, -1)");
3227 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3228 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3231 var = Manager::Instance().getVariable(
"daughterCombination(M, 1, 0:1:0:0:1)");
3232 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3233 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3238 TEST_F(MetaVariableTest, daughterCombinationTwoGenerations)
3244 PxPyPzEVector momentum_1(0, 0, 0, 0);
3245 std::vector<PxPyPzEVector> daughterMomenta_1;
3246 std::vector<int> daughterIndices_1;
3248 for (
int i = 0; i < 3; i++) {
3249 PxPyPzEVector mom(i * 0.2, 1, 1, i * 1.0 + 2.0);
3250 Particle d(mom, (i % 2) ? 111 : 113);
3251 Particle* newDaughters = particles.appendNew(d);
3253 daughterMomenta_1.push_back(mom);
3254 momentum_1 = momentum_1 + mom;
3257 const Particle* compositeDau_1 = particles.appendNew(momentum_1, 411, Particle::c_Flavored, daughterIndices_1);
3262 PxPyPzEVector momentum_2(0, 0, 0, 0);
3263 std::vector<PxPyPzEVector> daughterMomenta_2;
3264 std::vector<int> daughterIndices_2;
3266 for (
int i = 0; i < 2; i++) {
3267 PxPyPzEVector mom(1, 1, i * 0.3, i * 1.0 + 2.0);
3268 Particle d(mom, (i % 2) ? 111 : 113);
3269 Particle* newDaughters = particles.appendNew(d);
3271 daughterMomenta_2.push_back(mom);
3272 momentum_2 = momentum_2 + mom;
3275 const Particle* compositeDau_2 = particles.appendNew(momentum_2, 411, Particle::c_Flavored, daughterIndices_2);
3280 const Particle* p = particles.appendNew(momentum_2 + momentum_1, 111, Particle::c_Unflavored, daughterIndices);
3284 const Manager::Var* var = Manager::Instance().getVariable(
"daughterCombination(M, 0,1)");
3286 double M_test = (momentum_1 + momentum_2).mag();
3287 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), M_test);
3290 var = Manager::Instance().getVariable(
"daughterCombination(M, 0:0, 0:1, 0:2)");
3291 M_test = (momentum_1).mag();
3292 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), M_test);
3295 var = Manager::Instance().getVariable(
"daughterCombination(M, 0:0, 0:1, 1:0)");
3296 M_test = (daughterMomenta_1[0] + daughterMomenta_1[1] + daughterMomenta_2[0]).mag();
3297 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), M_test);
3302 TEST_F(MetaVariableTest, useAlternativeDaughterHypothesis)
3304 const int nDaughters = 5;
3308 PxPyPzEVector momentum(0, 0, 0, 0);
3309 std::vector<int> daughterIndices;
3310 for (
int i = 0; i < nDaughters; i++) {
3311 double px = i * 0.1;
3312 double py = i * 0.3;
3313 double pz = -i * 0.1 - 0.2;
3315 PxPyPzEVector mom(px, py, pz, 1);
3317 int pdgCode = Const::pion.getPDGCode();
3319 d.updateMass(pdgCode);
3320 mom = d.get4Vector();
3322 Particle* daughters = particles.appendNew(d);
3324 momentum = momentum + mom;
3326 const Particle* p = particles.appendNew(momentum, 411, Particle::c_Flavored, daughterIndices);
3330 PxPyPzEVector momentumAlt(0, 0, 0, 0);
3331 std::vector<int> daughterIndicesAlt;
3332 for (
int i = 0; i < nDaughters; i++) {
3333 double px = i * 0.1;
3334 double py = i * 0.3;
3335 double pz = -i * 0.1 - 0.2;
3337 PxPyPzEVector mom(px, py, pz, 1);
3339 int pdgCode = Const::pion.getPDGCode();
3341 pdgCode = Const::proton.getPDGCode();
3343 pdgCode = Const::kaon.getPDGCode();
3345 d.updateMass(pdgCode);
3346 mom = d.get4Vector();
3348 Particle* daughters = particles.appendNew(d);
3350 momentumAlt = momentumAlt + mom;
3352 const Particle* pAlt = particles.appendNew(momentumAlt, 411, Particle::c_Flavored, daughterIndicesAlt);
3356 std::cout <<
"mass test" << std::endl;
3357 const Manager::Var* var = Manager::Instance().getVariable(
"useAlternativeDaughterHypothesis(M, 0:p+,1:K+)");
3358 const Manager::Var* varAlt = Manager::Instance().getVariable(
"M");
3359 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), std::get<double>(varAlt->
function(pAlt)));
3362 std::cout <<
"charge test" << std::endl;
3363 var = Manager::Instance().getVariable(
"useAlternativeDaughterHypothesis(M, 0:p+,1:K-)");
3364 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), std::get<double>(varAlt->
function(pAlt)));
3367 std::cout <<
"momentum test" << std::endl;
3368 var = Manager::Instance().getVariable(
"useAlternativeDaughterHypothesis(p, 0:p+,1:K-)");
3369 varAlt = Manager::Instance().getVariable(
"p");
3370 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), std::get<double>(varAlt->
function(pAlt)));
3371 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), std::get<double>(varAlt->
function(p)));
3372 EXPECT_FLOAT_EQ(std::get<double>(var->function(pAlt)), std::get<double>(varAlt->
function(pAlt)));
3378 TEST_F(MetaVariableTest, daughterAngle)
3384 PxPyPzEVector momentum_1(0, 0, 0, 0);
3385 std::vector<PxPyPzEVector> daughterMomenta_1;
3386 std::vector<int> daughterIndices_1;
3388 for (
int i = 0; i < 3; i++) {
3389 PxPyPzEVector mom(i * 0.2, 1, 1, i * 1.0 + 2.0);
3390 Particle d(mom, (i % 2) ? -11 : 211);
3391 Particle* newDaughters = particles.appendNew(d);
3393 daughterMomenta_1.push_back(mom);
3394 momentum_1 = momentum_1 + mom;
3397 const Particle* compositeDau_1 = particles.appendNew(momentum_1, 411, Particle::c_Flavored, daughterIndices_1);
3402 PxPyPzEVector momentum_2(0, 0, 0, 0);
3403 std::vector<PxPyPzEVector> daughterMomenta_2;
3404 std::vector<int> daughterIndices_2;
3406 for (
int i = 0; i < 2; i++) {
3407 PxPyPzEVector mom(1, 1, i * 0.3, i * 1.0 + 2.0);
3408 Particle d(mom, (i % 2) ? -11 : 211);
3409 Particle* newDaughters = particles.appendNew(d);
3411 daughterMomenta_2.push_back(mom);
3412 momentum_2 = momentum_2 + mom;
3415 const Particle* compositeDau_2 = particles.appendNew(momentum_2, 411, Particle::c_Flavored, daughterIndices_2);
3420 const Particle* p = particles.appendNew(momentum_2 + momentum_1, 111, Particle::c_Unflavored, daughterIndices);
3424 const Manager::Var* var = Manager::Instance().getVariable(
"daughterAngle(0, 1)");
3425 double v_test = acos(momentum_1.Vect().Unit().Dot(momentum_2.Vect().Unit()));
3427 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), v_test);
3430 var = Manager::Instance().getVariable(
"daughterAngle(0:0, 1:0)");
3431 v_test = acos(daughterMomenta_1[0].Vect().
Unit().Dot(daughterMomenta_2[0].Vect().
Unit()));
3432 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), v_test);
3434 var = Manager::Instance().getVariable(
"daughterAngle( 1, -1)");
3435 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3436 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3438 var = Manager::Instance().getVariable(
"daughterAngle(1, 0:1:0:0:1)");
3439 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3440 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3444 TEST_F(MetaVariableTest, mcDaughterVariables)
3447 DataStore::Instance().setInitializeActive(
true);
3450 particles.registerRelationTo(mcParticles);
3451 DataStore::Instance().setInitializeActive(
true);
3454 PxPyPzEVector momentum_1(0, 0, 0, 0);
3455 std::vector<PxPyPzEVector> daughterMomenta_1;
3456 std::vector<int> daughterIndices_1;
3458 for (
int i = 0; i < 3; i++) {
3459 PxPyPzEVector mom(i * 0.2, 1, 1, i * 1.0 + 2.0);
3460 Particle d(mom, (i % 2) ? -11 : 211);
3461 Particle* newDaughters = particles.appendNew(d);
3463 daughterMomenta_1.push_back(mom);
3464 momentum_1 = momentum_1 + mom;
3466 auto* mcParticle = mcParticles.
appendNew();
3467 mcParticle->
setPDG((i % 2) ? -Const::electron.getPDGCode() : Const::pion.getPDGCode());
3468 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
3469 mcParticle->set4Vector(mom);
3473 const Particle* compositeDau_1 = particles.appendNew(momentum_1, 411, Particle::c_Flavored, daughterIndices_1);
3474 auto* mcCompositeDau_1 = mcParticles.
appendNew();
3475 mcCompositeDau_1->
setPDG(411);
3476 mcCompositeDau_1->setStatus(MCParticle::c_PrimaryParticle);
3477 mcCompositeDau_1->set4Vector(momentum_1);
3482 PxPyPzEVector momentum_2(0, 0, 0, 0);
3483 std::vector<PxPyPzEVector> daughterMomenta_2;
3484 std::vector<int> daughterIndices_2;
3486 for (
int i = 0; i < 2; i++) {
3487 PxPyPzEVector mom(1, 1, i * 0.3, i * 1.0 + 2.0);
3488 Particle d(mom, (i % 2) ? -11 : 211);
3489 Particle* newDaughters = particles.appendNew(d);
3491 daughterMomenta_2.push_back(mom);
3492 momentum_2 = momentum_2 + mom;
3494 auto* mcParticle = mcParticles.
appendNew();
3495 mcParticle->
setPDG((i % 2) ? -Const::electron.getPDGCode() : Const::pion.getPDGCode());
3496 mcParticle->setStatus(MCParticle::c_PrimaryParticle);
3497 mcParticle->set4Vector(mom);
3501 const Particle* compositeDau_2 = particles.appendNew(momentum_2, 411, Particle::c_Flavored, daughterIndices_2);
3502 auto* mcCompositeDau_2 = mcParticles.
appendNew();
3503 mcCompositeDau_2->
setPDG(411);
3504 mcCompositeDau_2->setStatus(MCParticle::c_PrimaryParticle);
3505 mcCompositeDau_2->set4Vector(momentum_2);
3510 const Particle* p = particles.appendNew(momentum_2 + momentum_1, 111, Particle::c_Unflavored, daughterIndices);
3514 const Manager::Var* var = Manager::Instance().getVariable(
"mcDaughterAngle(0, 1)");
3515 double v_test = acos(momentum_1.Vect().Unit().Dot(momentum_2.Vect().Unit()));
3516 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), v_test);
3518 var = Manager::Instance().getVariable(
"mcDaughterAngle(0:0, 1:0)");
3519 v_test = acos(daughterMomenta_1[0].Vect().
Unit().Dot(daughterMomenta_2[0].Vect().
Unit()));
3520 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), v_test);
3522 var = Manager::Instance().getVariable(
"mcDaughterAngle( 1, -1)");
3523 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3524 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3526 var = Manager::Instance().getVariable(
"mcDaughterAngle(1, 0:1:0:0:1)");
3527 EXPECT_B2WARNING(std::get<double>(var->function(p)));
3528 EXPECT_TRUE(std::isnan(std::get<double>(var->function(p))));
3531 var = Manager::Instance().getVariable(
"mcDaughterDiffOf(0, 1, PDG)");
3532 ASSERT_NE(var,
nullptr);
3533 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), 0);
3535 EXPECT_B2FATAL(Manager::Instance().getVariable(
"mcDaughterDiffOf(0, NOTINT, PDG)"));
3538 var = Manager::Instance().getVariable(
"mcDaughterDiffOf(0, 1, phi)");
3539 ASSERT_NE(var,
nullptr);
3540 v_test = momentum_2.Phi() - momentum_1.Phi();
3541 EXPECT_FLOAT_EQ(std::get<double>(var->function(p)), v_test);
3545 TEST_F(MetaVariableTest, varForFirstMCAncestorOfType)
3547 DataStore::Instance().setInitializeActive(
true);
3550 particles.registerInDataStore();
3552 particles.registerRelationTo(mcParticles);
3554 DList.registerInDataStore();
3556 DList->initialize(421,
"D0:vartest");
3557 DataStore::Instance().setInitializeActive(
false);
3558 PxPyPzEVector momentum;
3559 PxPyPzEVector momentum_0;
3560 PxPyPzEVector momentum_1;
3561 std::vector<int> D_daughterIndices;
3562 std::vector<int> D_grandDaughterIndices_0;
3563 std::vector<int> D_grandDaughterIndices_1;
3580 mcg_d_0.
setPDG(-Const::Kshort.getPDGCode());
3581 mcg_d_0.
set4Vector(PxPyPzEVector(6, 6, 6, 6));
3582 mcg_d_1.
setPDG(Const::Kshort.getPDGCode());
3583 mcg_d_1.
set4Vector(PxPyPzEVector(5, 5, 5, 5));
3584 mcg_gd_0_0.
setPDG(Const::pion.getPDGCode());
3585 mcg_gd_0_0.
set4Vector(PxPyPzEVector(4, 4, 4, 4));
3586 mcg_gd_0_1.
setPDG(-Const::pion.getPDGCode());
3587 mcg_gd_0_1.
set4Vector(PxPyPzEVector(3, 3, 3, 3));
3588 mcg_gd_1_0.
setPDG(Const::pion.getPDGCode());
3589 mcg_gd_1_0.
set4Vector(PxPyPzEVector(2, 1, 2, 2));
3590 mcg_gd_1_1.
setPDG(-Const::pion.getPDGCode());
3591 mcg_gd_1_1.
set4Vector(PxPyPzEVector(1, 1, 1, 1));
3592 mcg_not_child.
setPDG(Const::pion.getPDGCode());
3593 mcg_not_child.
set4Vector(PxPyPzEVector(10, 10, 10, 10));
3605 auto* mc_not_child = mcParticles[0];
3606 auto* mc_m = mcParticles[1];
3607 auto* mc_d_0 = mcParticles[2];
3608 auto* mc_d_1 = mcParticles[3];
3609 auto* mc_gd_0_0 = mcParticles[4];
3610 auto* mc_gd_0_1 = mcParticles[5];
3611 auto* mc_gd_1_0 = mcParticles[6];
3612 auto* mc_gd_1_1 = mcParticles[7];
3615 mc_m->setStatus(MCParticle::c_PrimaryParticle);
3616 mc_d_0->setStatus(MCParticle::c_PrimaryParticle);
3617 mc_d_1->setStatus(MCParticle::c_PrimaryParticle);
3618 mc_gd_0_0->setStatus(MCParticle::c_PrimaryParticle);
3619 mc_gd_0_1->setStatus(MCParticle::c_PrimaryParticle);
3620 mc_gd_1_0->setStatus(MCParticle::c_PrimaryParticle);
3621 mc_gd_1_1->setStatus(MCParticle::c_PrimaryParticle);
3622 mc_not_child->setStatus(MCParticle::c_PrimaryParticle);
3626 const Particle* D_gd_0_0 = particles.appendNew(PxPyPzEVector(0.0, 1, 1, 1), 211);
3627 const Particle* D_gd_0_1 = particles.appendNew(PxPyPzEVector(1.0, 1, 1, 1), -211);
3628 const Particle* D_gd_1_0 = particles.appendNew(PxPyPzEVector(2.0, 1, 1, 1), 211);
3629 const Particle* D_gd_1_1 = particles.appendNew(PxPyPzEVector(3.0, 1, 1, 1), -211);
3631 D_grandDaughterIndices_0.push_back(D_gd_0_0->
getArrayIndex());
3632 D_grandDaughterIndices_0.push_back(D_gd_0_1->
getArrayIndex());
3633 D_grandDaughterIndices_1.push_back(D_gd_1_0->
getArrayIndex());
3634 D_grandDaughterIndices_1.push_back(D_gd_1_1->
getArrayIndex());
3639 const Particle* D_d_0 = particles.appendNew(momentum_0, 310, Particle::c_Unflavored, D_grandDaughterIndices_0);
3640 const Particle* D_d_1 = particles.appendNew(momentum_1, 310, Particle::c_Unflavored, D_grandDaughterIndices_1);
3647 const Particle* D_m = particles.appendNew(momentum, 421, Particle::c_Unflavored, D_daughterIndices);
3648 DList->addParticle(D_m);
3651 const Particle* not_child = particles.appendNew(PxPyPzEVector(5.0, 1, 1, 1), 211);
3654 const Particle* not_child_2 = particles.appendNew(PxPyPzEVector(6.0, 1, 1, 1), 211);
3667 const Manager::Var* var_d = Manager::Instance().getVariable(
"varForFirstMCAncestorOfType(D0, mdstIndex)");
3668 ASSERT_NE(var_d,
nullptr);
3669 EXPECT_TRUE(std::get<double>(var_d->
function(D_gd_0_0)) >= 0);
3670 EXPECT_FLOAT_EQ(std::get<double>(var_d->
function(D_gd_0_0)), std::get<double>(var_d->
function(D_gd_0_1)));
3671 EXPECT_FLOAT_EQ(std::get<double>(var_d->
function(D_gd_1_0)), std::get<double>(var_d->
function(D_gd_1_1)));
3672 EXPECT_FLOAT_EQ(std::get<double>(var_d->
function(D_gd_0_0)), std::get<double>(var_d->
function(D_gd_1_0)));
3673 EXPECT_FLOAT_EQ(std::get<double>(var_d->
function(D_gd_0_1)), std::get<double>(var_d->
function(D_gd_1_1)));
3674 EXPECT_TRUE(std::isnan(std::get<double>(var_d->
function(not_child))));
3675 EXPECT_TRUE(std::isnan(std::get<double>(var_d->
function(not_child_2))));
3679 const Manager::Var* var_310 = Manager::Instance().getVariable(
"varForFirstMCAncestorOfType(310, mdstIndex)");
3680 ASSERT_NE(var_310,
nullptr);
3681 EXPECT_FLOAT_EQ(std::get<double>(var_310->
function(D_gd_0_0)), std::get<double>(var_310->
function(D_gd_0_1)));
3682 EXPECT_FLOAT_EQ(std::get<double>(var_310->
function(D_gd_1_0)), std::get<double>(var_310->
function(D_gd_1_1)));
3683 EXPECT_NE(std::get<double>(var_310->
function(D_gd_0_0)), std::get<double>(var_310->
function(D_gd_1_0)));
3684 EXPECT_NE(std::get<double>(var_310->
function(D_gd_0_1)), std::get<double>(var_310->
function(D_gd_1_1)));
3685 EXPECT_TRUE(std::isnan(std::get<double>(var_310->
function(not_child))));
3686 EXPECT_TRUE(std::isnan(std::get<double>(var_310->
function(not_child_2))));
3687 EXPECT_FLOAT_EQ(
int(std::get<double>(Manager::Instance().getVariable(
"varForFirstMCAncestorOfType(310, E)")->
function(D_gd_0_0))),
3691 TEST_F(MetaVariableTest, isDescendantOfList)
3693 DataStore::Instance().setInitializeActive(
true);
3695 DList.registerInDataStore();
3697 DList->initialize(421,
"D0:vartest");
3699 BList.registerInDataStore();
3701 BList->initialize(521,
"B:vartest");
3702 DataStore::Instance().setInitializeActive(
false);
3704 PxPyPzEVector momentum;
3705 PxPyPzEVector momentum_0;
3706 PxPyPzEVector momentum_1;
3708 std::vector<int> D_daughterIndices;
3709 std::vector<int> D_grandDaughterIndices_0;
3710 std::vector<int> D_grandDaughterIndices_1;
3711 std::vector<int> B_daughterIndices;
3712 std::vector<int> B_grandDaughterIndices;
3713 std::vector<int> B_grandGrandDaughterIndices;
3717 const Particle* D_gd_0_0 = particles.appendNew(PxPyPzEVector(0.0, 1, 1, 1), 211, Particle::c_Flavored, Particle::c_Track, 0);
3718 const Particle* D_gd_0_1 = particles.appendNew(PxPyPzEVector(1.0, 1, 1, 1), -211, Particle::c_Flavored, Particle::c_Track, 1);
3719 const Particle* D_gd_1_0 = particles.appendNew(PxPyPzEVector(2.0, 1, 1, 1), 211, Particle::c_Flavored, Particle::c_Track, 2);
3720 const Particle* D_gd_1_1 = particles.appendNew(PxPyPzEVector(3.0, 1, 1, 1), -211, Particle::c_Flavored, Particle::c_Track, 3);
3722 D_grandDaughterIndices_0.push_back(D_gd_0_0->
getArrayIndex());
3723 D_grandDaughterIndices_0.push_back(D_gd_0_1->
getArrayIndex());
3724 D_grandDaughterIndices_1.push_back(D_gd_1_0->
getArrayIndex());
3725 D_grandDaughterIndices_1.push_back(D_gd_1_1->
getArrayIndex());
3730 const Particle* D_d_0 = particles.appendNew(momentum_0, 310, Particle::c_Unflavored, D_grandDaughterIndices_0);
3731 const Particle* D_d_1 = particles.appendNew(momentum_1, 310, Particle::c_Unflavored, D_grandDaughterIndices_1);
3738 const Particle* D_m = particles.appendNew(momentum, 421, Particle::c_Unflavored, D_daughterIndices);
3739 DList->addParticle(D_m);
3743 const Particle* B_d_1 = particles.appendNew(PxPyPzEVector(0.0, 1, 1, 1), 211, Particle::c_Flavored, Particle::c_Track, 4);
3744 const Particle* B_gd_0_1 = particles.appendNew(PxPyPzEVector(1.0, 1, 1, 1), -211, Particle::c_Flavored, Particle::c_Track, 5);
3745 const Particle* B_ggd_0_0_0 = particles.appendNew(PxPyPzEVector(2.0, 1, 1, 1), 211, Particle::c_Flavored, Particle::c_Track, 6);
3746 const Particle* B_ggd_0_0_1 = particles.appendNew(PxPyPzEVector(3.0, 1, 1, 1), -211, Particle::c_Flavored, Particle::c_Track, 7);
3748 B_grandGrandDaughterIndices.push_back(B_ggd_0_0_0->
getArrayIndex());
3749 B_grandGrandDaughterIndices.push_back(B_ggd_0_0_1->
getArrayIndex());
3751 const Particle* B_gd_0_0 = particles.appendNew(momentum_0, 310, Particle::c_Unflavored, B_grandGrandDaughterIndices);
3753 B_grandDaughterIndices.push_back(B_gd_0_0->
getArrayIndex());
3754 B_grandDaughterIndices.push_back(B_gd_0_1->
getArrayIndex());
3756 const Particle* B_d_0 = particles.appendNew(momentum_1, -411, Particle::c_Unflavored, B_grandDaughterIndices);
3761 const Particle* B_m = particles.appendNew(momentum, 521, Particle::c_Unflavored, B_daughterIndices);
3762 BList->addParticle(B_m);
3765 const Particle* not_child = particles.appendNew(PxPyPzEVector(5.0, 1, 1, 1), 211, Particle::c_Flavored, Particle::c_Track, 8);
3768 const Manager::Var* var_0 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest)");
3769 ASSERT_NE(var_0,
nullptr);
3770 EXPECT_TRUE(std::get<bool>(var_0->
function(D_gd_0_0)));
3771 EXPECT_TRUE(std::get<bool>(var_0->
function(D_gd_0_1)));
3772 EXPECT_TRUE(std::get<bool>(var_0->
function(D_gd_1_0)));
3773 EXPECT_TRUE(std::get<bool>(var_0->
function(D_gd_1_1)));
3774 EXPECT_TRUE(std::get<bool>(var_0->
function(D_d_0)));
3775 EXPECT_TRUE(std::get<bool>(var_0->
function(D_d_1)));
3776 EXPECT_FALSE(std::get<bool>(var_0->
function(B_ggd_0_0_0)));
3777 EXPECT_FALSE(std::get<bool>(var_0->
function(B_ggd_0_0_1)));
3778 EXPECT_FALSE(std::get<bool>(var_0->
function(B_gd_0_0)));
3779 EXPECT_FALSE(std::get<bool>(var_0->
function(B_gd_0_1)));
3780 EXPECT_FALSE(std::get<bool>(var_0->
function(B_d_0)));
3781 EXPECT_FALSE(std::get<bool>(var_0->
function(B_d_1)));
3782 EXPECT_FALSE(std::get<bool>(var_0->
function(not_child)));
3784 const Manager::Var* var_0a = Manager::Instance().getVariable(
"isDaughterOfList(D0:vartest)");
3785 ASSERT_NE(var_0a,
nullptr);
3786 EXPECT_FALSE(std::get<bool>(var_0a->
function(D_gd_0_0)));
3787 EXPECT_FALSE(std::get<bool>(var_0a->
function(D_gd_0_1)));
3788 EXPECT_FALSE(std::get<bool>(var_0a->
function(D_gd_1_0)));
3789 EXPECT_FALSE(std::get<bool>(var_0a->
function(D_gd_1_1)));
3790 EXPECT_TRUE(std::get<bool>(var_0a->
function(D_d_0)));
3791 EXPECT_TRUE(std::get<bool>(var_0a->
function(D_d_1)));
3792 EXPECT_FALSE(std::get<bool>(var_0a->
function(B_ggd_0_0_0)));
3793 EXPECT_FALSE(std::get<bool>(var_0a->
function(B_ggd_0_0_1)));
3794 EXPECT_FALSE(std::get<bool>(var_0a->
function(B_gd_0_0)));
3795 EXPECT_FALSE(std::get<bool>(var_0a->
function(B_gd_0_1)));
3796 EXPECT_FALSE(std::get<bool>(var_0a->
function(B_d_0)));
3797 EXPECT_FALSE(std::get<bool>(var_0a->
function(B_d_1)));
3798 EXPECT_FALSE(std::get<bool>(var_0a->
function(not_child)));
3800 const Manager::Var* var_0b = Manager::Instance().getVariable(
"isGrandDaughterOfList(D0:vartest)");
3801 ASSERT_NE(var_0b,
nullptr);
3802 EXPECT_TRUE(std::get<bool>(var_0b->
function(D_gd_0_0)));
3803 EXPECT_TRUE(std::get<bool>(var_0b->
function(D_gd_0_1)));
3804 EXPECT_TRUE(std::get<bool>(var_0b->
function(D_gd_1_0)));
3805 EXPECT_TRUE(std::get<bool>(var_0b->
function(D_gd_1_1)));
3806 EXPECT_FALSE(std::get<bool>(var_0b->
function(D_d_0)));
3807 EXPECT_FALSE(std::get<bool>(var_0b->
function(D_d_1)));
3808 EXPECT_FALSE(std::get<bool>(var_0b->
function(B_ggd_0_0_0)));
3809 EXPECT_FALSE(std::get<bool>(var_0b->
function(B_ggd_0_0_1)));
3810 EXPECT_FALSE(std::get<bool>(var_0b->
function(B_gd_0_0)));
3811 EXPECT_FALSE(std::get<bool>(var_0b->
function(B_gd_0_1)));
3812 EXPECT_FALSE(std::get<bool>(var_0b->
function(B_d_0)));
3813 EXPECT_FALSE(std::get<bool>(var_0b->
function(B_d_1)));
3814 EXPECT_FALSE(std::get<bool>(var_0b->
function(not_child)));
3816 const Manager::Var* var_1 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, 1)");
3817 ASSERT_NE(var_1,
nullptr);
3818 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_0_0)));
3819 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_0_1)));
3820 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_1_0)));
3821 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_1_1)));
3822 EXPECT_TRUE(std::get<bool>(var_1->
function(D_d_0)));
3823 EXPECT_TRUE(std::get<bool>(var_1->
function(D_d_1)));
3824 EXPECT_FALSE(std::get<bool>(var_1->
function(B_ggd_0_0_0)));
3825 EXPECT_FALSE(std::get<bool>(var_1->
function(B_ggd_0_0_1)));
3826 EXPECT_FALSE(std::get<bool>(var_1->
function(B_gd_0_0)));
3827 EXPECT_FALSE(std::get<bool>(var_1->
function(B_gd_0_1)));
3828 EXPECT_FALSE(std::get<bool>(var_1->
function(B_d_0)));
3829 EXPECT_FALSE(std::get<bool>(var_1->
function(B_d_1)));
3830 EXPECT_FALSE(std::get<bool>(var_1->
function(not_child)));
3832 const Manager::Var* var_2 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, 2)");
3833 ASSERT_NE(var_2,
nullptr);
3834 EXPECT_TRUE(std::get<bool>(var_2->
function(D_gd_0_0)));
3835 EXPECT_TRUE(std::get<bool>(var_2->
function(D_gd_0_1)));
3836 EXPECT_TRUE(std::get<bool>(var_2->
function(D_gd_1_0)));
3837 EXPECT_TRUE(std::get<bool>(var_2->
function(D_gd_1_1)));
3838 EXPECT_FALSE(std::get<bool>(var_2->
function(D_d_0)));
3839 EXPECT_FALSE(std::get<bool>(var_2->
function(D_d_1)));
3840 EXPECT_FALSE(std::get<bool>(var_2->
function(B_ggd_0_0_0)));
3841 EXPECT_FALSE(std::get<bool>(var_2->
function(B_ggd_0_0_1)));
3842 EXPECT_FALSE(std::get<bool>(var_2->
function(B_gd_0_0)));
3843 EXPECT_FALSE(std::get<bool>(var_2->
function(B_gd_0_1)));
3844 EXPECT_FALSE(std::get<bool>(var_2->
function(B_d_0)));
3845 EXPECT_FALSE(std::get<bool>(var_2->
function(B_d_1)));
3846 EXPECT_FALSE(std::get<bool>(var_2->
function(not_child)));
3848 const Manager::Var* var_3 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, B:vartest)");
3849 ASSERT_NE(var_3,
nullptr);
3850 EXPECT_TRUE(std::get<bool>(var_3->
function(D_gd_0_0)));
3851 EXPECT_TRUE(std::get<bool>(var_3->
function(D_gd_0_1)));
3852 EXPECT_TRUE(std::get<bool>(var_3->
function(D_gd_1_0)));
3853 EXPECT_TRUE(std::get<bool>(var_3->
function(D_gd_1_1)));
3854 EXPECT_TRUE(std::get<bool>(var_3->
function(D_d_0)));
3855 EXPECT_TRUE(std::get<bool>(var_3->
function(D_d_1)));
3856 EXPECT_TRUE(std::get<bool>(var_3->
function(B_ggd_0_0_0)));
3857 EXPECT_TRUE(std::get<bool>(var_3->
function(B_ggd_0_0_1)));
3858 EXPECT_TRUE(std::get<bool>(var_3->
function(B_gd_0_0)));
3859 EXPECT_TRUE(std::get<bool>(var_3->
function(B_gd_0_1)));
3860 EXPECT_TRUE(std::get<bool>(var_3->
function(B_d_0)));
3861 EXPECT_TRUE(std::get<bool>(var_3->
function(B_d_1)));
3862 EXPECT_FALSE(std::get<bool>(var_3->
function(not_child)));
3864 const Manager::Var* var_4 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, B:vartest, -1)");
3865 ASSERT_NE(var_4,
nullptr);
3866 EXPECT_TRUE(std::get<bool>(var_4->
function(D_gd_0_0)));
3867 EXPECT_TRUE(std::get<bool>(var_4->
function(D_gd_0_1)));
3868 EXPECT_TRUE(std::get<bool>(var_4->
function(D_gd_1_0)));
3869 EXPECT_TRUE(std::get<bool>(var_4->
function(D_gd_1_1)));
3870 EXPECT_TRUE(std::get<bool>(var_4->
function(D_d_0)));
3871 EXPECT_TRUE(std::get<bool>(var_4->
function(D_d_1)));
3872 EXPECT_TRUE(std::get<bool>(var_4->
function(B_ggd_0_0_0)));
3873 EXPECT_TRUE(std::get<bool>(var_4->
function(B_ggd_0_0_1)));
3874 EXPECT_TRUE(std::get<bool>(var_4->
function(B_gd_0_0)));
3875 EXPECT_TRUE(std::get<bool>(var_4->
function(B_gd_0_1)));
3876 EXPECT_TRUE(std::get<bool>(var_4->
function(B_d_0)));
3877 EXPECT_TRUE(std::get<bool>(var_4->
function(B_d_1)));
3878 EXPECT_FALSE(std::get<bool>(var_4->
function(not_child)));
3880 const Manager::Var* var_5 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, B:vartest, 1)");
3881 ASSERT_NE(var_5,
nullptr);
3882 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_0_0)));
3883 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_0_1)));
3884 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_1_0)));
3885 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_1_1)));
3886 EXPECT_TRUE(std::get<bool>(var_5->
function(D_d_0)));
3887 EXPECT_TRUE(std::get<bool>(var_5->
function(D_d_1)));
3888 EXPECT_FALSE(std::get<bool>(var_5->
function(B_ggd_0_0_0)));
3889 EXPECT_FALSE(std::get<bool>(var_5->
function(B_ggd_0_0_1)));
3890 EXPECT_FALSE(std::get<bool>(var_5->
function(B_gd_0_0)));
3891 EXPECT_FALSE(std::get<bool>(var_5->
function(B_gd_0_1)));
3892 EXPECT_TRUE(std::get<bool>(var_5->
function(B_d_0)));
3893 EXPECT_TRUE(std::get<bool>(var_5->
function(B_d_1)));
3894 EXPECT_FALSE(std::get<bool>(var_5->
function(not_child)));
3896 const Manager::Var* var_6 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, B:vartest, 2)");
3897 ASSERT_NE(var_6,
nullptr);
3898 EXPECT_TRUE(std::get<bool>(var_6->
function(D_gd_0_0)));
3899 EXPECT_TRUE(std::get<bool>(var_6->
function(D_gd_0_1)));
3900 EXPECT_TRUE(std::get<bool>(var_6->
function(D_gd_1_0)));
3901 EXPECT_TRUE(std::get<bool>(var_6->
function(D_gd_1_1)));
3902 EXPECT_FALSE(std::get<bool>(var_6->
function(D_d_0)));
3903 EXPECT_FALSE(std::get<bool>(var_6->
function(D_d_1)));
3904 EXPECT_FALSE(std::get<bool>(var_6->
function(B_ggd_0_0_0)));
3905 EXPECT_FALSE(std::get<bool>(var_6->
function(B_ggd_0_0_1)));
3906 EXPECT_TRUE(std::get<bool>(var_6->
function(B_gd_0_0)));
3907 EXPECT_TRUE(std::get<bool>(var_6->
function(B_gd_0_1)));
3908 EXPECT_FALSE(std::get<bool>(var_6->
function(B_d_0)));
3909 EXPECT_FALSE(std::get<bool>(var_6->
function(B_d_1)));
3910 EXPECT_FALSE(std::get<bool>(var_6->
function(not_child)));
3912 const Manager::Var* var_7 = Manager::Instance().getVariable(
"isDescendantOfList(D0:vartest, B:vartest, 3)");
3913 ASSERT_NE(var_7,
nullptr);
3914 EXPECT_FALSE(std::get<bool>(var_7->
function(D_gd_0_0)));
3915 EXPECT_FALSE(std::get<bool>(var_7->
function(D_gd_0_1)));
3916 EXPECT_FALSE(std::get<bool>(var_7->
function(D_gd_1_0)));
3917 EXPECT_FALSE(std::get<bool>(var_7->
function(D_gd_1_1)));
3918 EXPECT_FALSE(std::get<bool>(var_7->
function(D_d_0)));
3919 EXPECT_FALSE(std::get<bool>(var_7->
function(D_d_1)));
3920 EXPECT_TRUE(std::get<bool>(var_7->
function(B_ggd_0_0_0)));
3921 EXPECT_TRUE(std::get<bool>(var_7->
function(B_ggd_0_0_1)));
3922 EXPECT_FALSE(std::get<bool>(var_7->
function(B_gd_0_0)));
3923 EXPECT_FALSE(std::get<bool>(var_7->
function(B_gd_0_1)));
3924 EXPECT_FALSE(std::get<bool>(var_7->
function(B_d_0)));
3925 EXPECT_FALSE(std::get<bool>(var_7->
function(B_d_1)));
3926 EXPECT_FALSE(std::get<bool>(var_7->
function(not_child)));
3930 TEST_F(MetaVariableTest, isMCDescendantOfList)
3932 DataStore::Instance().setInitializeActive(
true);
3935 particles.registerInDataStore();
3937 particles.registerRelationTo(mcParticles);
3939 BList.registerInDataStore();
3941 BList->initialize(521,
"B:vartest");
3943 DList.registerInDataStore();
3945 DList->initialize(421,
"D0:vartest");
3946 DataStore::Instance().setInitializeActive(
false);
3947 PxPyPzEVector momentum;
3948 PxPyPzEVector momentum_0;
3949 PxPyPzEVector momentum_1;
3950 std::vector<int> daughterIndices;
3951 std::vector<int> grandDaughterIndices;
3952 std::vector<int> grandGrandDaughterIndices;
3953 std::vector<int> D_daughterIndices;
3954 std::vector<int> D_grandDaughterIndices_0;
3955 std::vector<int> D_grandDaughterIndices_1;
3972 mcg_d_1.
setPDG(Const::pion.getPDGCode());
3973 mcg_gd_0_0.
setPDG(Const::Kshort.getPDGCode());
3974 mcg_gd_0_1.
setPDG(-Const::pion.getPDGCode());
3975 mcg_ggd_0_0_0.
setPDG(Const::pion.getPDGCode());
3976 mcg_ggd_0_0_1.
setPDG(-Const::pion.getPDGCode());
3977 mcg_not_child.
setPDG(Const::pion.getPDGCode());
3989 auto* mc_m = mcParticles[0];
3990 auto* mc_d_0 = mcParticles[1];
3991 auto* mc_d_1 = mcParticles[2];
3992 auto* mc_gd_0_0 = mcParticles[3];
3993 auto* mc_gd_0_1 = mcParticles[4];
3994 auto* mc_ggd_0_0_0 = mcParticles[5];
3995 auto* mc_ggd_0_0_1 = mcParticles[6];
3996 auto* mc_not_child = mcParticles[7];
3998 mc_m->setStatus(MCParticle::c_PrimaryParticle);
3999 mc_d_0->setStatus(MCParticle::c_PrimaryParticle);
4000 mc_d_1->setStatus(MCParticle::c_PrimaryParticle);
4001 mc_gd_0_0->setStatus(MCParticle::c_PrimaryParticle);
4002 mc_gd_0_1->setStatus(MCParticle::c_PrimaryParticle);
4003 mc_ggd_0_0_0->setStatus(MCParticle::c_PrimaryParticle);
4004 mc_ggd_0_0_1->setStatus(MCParticle::c_PrimaryParticle);
4005 mc_not_child->setStatus(MCParticle::c_PrimaryParticle);
4009 const Particle* D_gd_0_0 = particles.appendNew(PxPyPzEVector(0.0, 1, 1, 1), 211);
4010 const Particle* D_gd_0_1 = particles.appendNew(PxPyPzEVector(1.0, 1, 1, 1), -211);
4011 const Particle* D_gd_1_0 = particles.appendNew(PxPyPzEVector(2.0, 1, 1, 1), 211);
4012 const Particle* D_gd_1_1 = particles.appendNew(PxPyPzEVector(3.0, 1, 1, 1), -211);
4014 D_grandDaughterIndices_0.push_back(D_gd_0_0->
getArrayIndex());
4015 D_grandDaughterIndices_0.push_back(D_gd_0_1->
getArrayIndex());
4016 D_grandDaughterIndices_1.push_back(D_gd_1_0->
getArrayIndex());
4017 D_grandDaughterIndices_1.push_back(D_gd_1_1->
getArrayIndex());
4022 const Particle* D_d_0 = particles.appendNew(momentum_0, 310, Particle::c_Unflavored, D_grandDaughterIndices_0);
4023 const Particle* D_d_1 = particles.appendNew(momentum_1, 310, Particle::c_Unflavored, D_grandDaughterIndices_1);
4030 const Particle* D_m = particles.appendNew(momentum, 421, Particle::c_Unflavored, D_daughterIndices);
4031 DList->addParticle(D_m);
4034 const Particle* d_1 = particles.appendNew(PxPyPzEVector(0.0, 1, 1, 1), 211);
4035 const Particle* gd_0_1 = particles.appendNew(PxPyPzEVector(1.0, 1, 1, 1), -211);
4036 const Particle* ggd_0_0_0 = particles.appendNew(PxPyPzEVector(2.0, 1, 1, 1), 211);
4037 const Particle* ggd_0_0_1 = particles.appendNew(PxPyPzEVector(3.0, 1, 1, 1), -211);
4039 grandGrandDaughterIndices.push_back(ggd_0_0_0->
getArrayIndex());
4040 grandGrandDaughterIndices.push_back(ggd_0_0_1->
getArrayIndex());
4042 const Particle* gd_0_0 = particles.appendNew(momentum_0, 310, Particle::c_Unflavored, grandGrandDaughterIndices);
4047 const Particle* d_0 = particles.appendNew(momentum_1, -411, Particle::c_Unflavored, grandDaughterIndices);
4052 const Particle* m = particles.appendNew(momentum, 521, Particle::c_Unflavored, daughterIndices);
4053 BList->addParticle(m);
4056 const Particle* not_child = particles.appendNew(PxPyPzEVector(5.0, 1, 1, 1), 211);
4059 const Particle* not_child_2 = particles.appendNew(PxPyPzEVector(6.0, 1, 1, 1), 211);
4067 m->addRelationTo(mc_m);
4070 const Manager::Var* var_0 = Manager::Instance().getVariable(
"isMCDescendantOfList(B:vartest)");
4071 ASSERT_NE(var_0,
nullptr);
4072 EXPECT_FALSE(std::get<bool>(var_0->
function(D_gd_0_0)));
4073 EXPECT_FALSE(std::get<bool>(var_0->
function(D_gd_0_1)));
4074 EXPECT_FALSE(std::get<bool>(var_0->
function(D_gd_1_0)));
4075 EXPECT_FALSE(std::get<bool>(var_0->
function(D_gd_1_1)));
4076 EXPECT_FALSE(std::get<bool>(var_0->
function(D_d_0)));
4077 EXPECT_FALSE(std::get<bool>(var_0->
function(D_d_1)));
4078 EXPECT_TRUE(std::get<bool>(var_0->
function(ggd_0_0_0)));
4079 EXPECT_TRUE(std::get<bool>(var_0->
function(ggd_0_0_1)));
4080 EXPECT_TRUE(std::get<bool>(var_0->
function(gd_0_0)));
4081 EXPECT_TRUE(std::get<bool>(var_0->
function(gd_0_1)));
4082 EXPECT_TRUE(std::get<bool>(var_0->
function(d_0)));
4083 EXPECT_TRUE(std::get<bool>(var_0->
function(d_1)));
4084 EXPECT_FALSE(std::get<bool>(var_0->
function(not_child)));
4085 EXPECT_FALSE(std::get<bool>(var_0->
function(not_child_2)));
4087 const Manager::Var* var_1 = Manager::Instance().getVariable(
"isMCDescendantOfList(B:vartest, D0:vartest)");
4088 ASSERT_NE(var_1,
nullptr);
4089 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_0_0)));
4090 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_0_1)));
4091 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_1_0)));
4092 EXPECT_FALSE(std::get<bool>(var_1->
function(D_gd_1_1)));
4093 EXPECT_FALSE(std::get<bool>(var_1->
function(D_d_0)));
4094 EXPECT_FALSE(std::get<bool>(var_1->
function(D_d_1)));
4095 EXPECT_TRUE(std::get<bool>(var_1->
function(ggd_0_0_0)));
4096 EXPECT_TRUE(std::get<bool>(var_1->
function(ggd_0_0_1)));
4097 EXPECT_TRUE(std::get<bool>(var_1->
function(gd_0_0)));
4098 EXPECT_TRUE(std::get<bool>(var_1->
function(gd_0_1)));
4099 EXPECT_TRUE(std::get<bool>(var_1->
function(d_0)));
4100 EXPECT_TRUE(std::get<bool>(var_1->
function(d_1)));
4101 EXPECT_FALSE(std::get<bool>(var_1->
function(not_child)));
4102 EXPECT_FALSE(std::get<bool>(var_1->
function(not_child_2)));
4104 const Manager::Var* var_2 = Manager::Instance().getVariable(
"isMCDescendantOfList(B:vartest, -1)");
4105 ASSERT_NE(var_2,
nullptr);
4106 EXPECT_FALSE(std::get<bool>(var_2->
function(D_gd_0_0)));
4107 EXPECT_FALSE(std::get<bool>(var_2->
function(D_gd_0_1)));
4108 EXPECT_FALSE(std::get<bool>(var_2->
function(D_gd_1_0)));
4109 EXPECT_FALSE(std::get<bool>(var_2->
function(D_gd_1_1)));
4110 EXPECT_FALSE(std::get<bool>(var_2->
function(D_d_0)));
4111 EXPECT_FALSE(std::get<bool>(var_2->
function(D_d_1)));
4112 EXPECT_TRUE(std::get<bool>(var_2->
function(ggd_0_0_0)));
4113 EXPECT_TRUE(std::get<bool>(var_2->
function(ggd_0_0_1)));
4114 EXPECT_TRUE(std::get<bool>(var_2->
function(gd_0_0)));
4115 EXPECT_TRUE(std::get<bool>(var_2->
function(gd_0_1)));
4116 EXPECT_TRUE(std::get<bool>(var_2->
function(d_0)));
4117 EXPECT_TRUE(std::get<bool>(var_2->
function(d_1)));
4118 EXPECT_FALSE(std::get<bool>(var_2->
function(not_child)));
4119 EXPECT_FALSE(std::get<bool>(var_2->
function(not_child_2)));
4121 const Manager::Var* var_3 = Manager::Instance().getVariable(
"isMCDescendantOfList(B:vartest, 1)");
4122 ASSERT_NE(var_3,
nullptr);
4123 EXPECT_FALSE(std::get<bool>(var_3->
function(D_gd_0_0)));
4124 EXPECT_FALSE(std::get<bool>(var_3->
function(D_gd_0_1)));
4125 EXPECT_FALSE(std::get<bool>(var_3->
function(D_gd_1_0)));
4126 EXPECT_FALSE(std::get<bool>(var_3->
function(D_gd_1_1)));
4127 EXPECT_FALSE(std::get<bool>(var_3->
function(D_d_0)));
4128 EXPECT_FALSE(std::get<bool>(var_3->
function(D_d_1)));
4129 EXPECT_FALSE(std::get<bool>(var_3->
function(ggd_0_0_0)));
4130 EXPECT_FALSE(std::get<bool>(var_3->
function(ggd_0_0_1)));
4131 EXPECT_FALSE(std::get<bool>(var_3->
function(gd_0_0)));
4132 EXPECT_FALSE(std::get<bool>(var_3->
function(gd_0_1)));
4133 EXPECT_TRUE(std::get<bool>(var_3->
function(d_0)));
4134 EXPECT_TRUE(std::get<bool>(var_3->
function(d_1)));
4135 EXPECT_FALSE(std::get<bool>(var_3->
function(not_child)));
4136 EXPECT_FALSE(std::get<bool>(var_3->
function(not_child_2)));
4138 const Manager::Var* var_4 = Manager::Instance().getVariable(
"isMCDescendantOfList(B:vartest, 2)");
4139 ASSERT_NE(var_4,
nullptr);
4140 EXPECT_FALSE(std::get<bool>(var_4->
function(D_gd_0_0)));
4141 EXPECT_FALSE(std::get<bool>(var_4->
function(D_gd_0_1)));
4142 EXPECT_FALSE(std::get<bool>(var_4->
function(D_gd_1_0)));
4143 EXPECT_FALSE(std::get<bool>(var_4->
function(D_gd_1_1)));
4144 EXPECT_FALSE(std::get<bool>(var_4->
function(D_d_0)));
4145 EXPECT_FALSE(std::get<bool>(var_4->
function(D_d_1)));
4146 EXPECT_FALSE(std::get<bool>(var_4->
function(ggd_0_0_0)));
4147 EXPECT_FALSE(std::get<bool>(var_4->
function(ggd_0_0_1)));
4148 EXPECT_TRUE(std::get<bool>(var_4->
function(gd_0_0)));
4149 EXPECT_TRUE(std::get<bool>(var_4->
function(gd_0_1)));
4150 EXPECT_FALSE(std::get<bool>(var_4->
function(d_0)));
4151 EXPECT_FALSE(std::get<bool>(var_4->
function(d_1)));
4152 EXPECT_FALSE(std::get<bool>(var_4->
function(not_child)));
4153 EXPECT_FALSE(std::get<bool>(var_4->
function(not_child_2)));
4156 const Manager::Var* var_5 = Manager::Instance().getVariable(
"isMCDescendantOfList(B:vartest, 3)");
4157 ASSERT_NE(var_5,
nullptr);
4158 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_0_0)));
4159 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_0_1)));
4160 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_1_0)));
4161 EXPECT_FALSE(std::get<bool>(var_5->
function(D_gd_1_1)));
4162 EXPECT_FALSE(std::get<bool>(var_5->
function(D_d_0)));
4163 EXPECT_FALSE(std::get<bool>(var_5->
function(D_d_1)));
4164 EXPECT_TRUE(std::get<bool>(var_5->
function(ggd_0_0_0)));
4165 EXPECT_TRUE(std::get<bool>(var_5->
function(ggd_0_0_1)));
4166 EXPECT_FALSE(std::get<bool>(var_5->
function(gd_0_0)));
4167 EXPECT_FALSE(std::get<bool>(var_5->
function(gd_0_1)));
4168 EXPECT_FALSE(std::get<bool>(var_5->
function(d_0)));
4169 EXPECT_FALSE(std::get<bool>(var_5->
function(d_1)));
4170 EXPECT_FALSE(std::get<bool>(var_5->
function(not_child)));
4171 EXPECT_FALSE(std::get<bool>(var_5->
function(not_child_2)));
4178 class PIDVariableTest :
public ::testing::Test {
4181 void SetUp()
override
4183 DataStore::Instance().setInitializeActive(
true);
4194 particles.registerInDataStore();
4195 tracks.registerInDataStore();
4196 particles.registerRelationTo(likelihood);
4197 tracks.registerRelationTo(likelihood);
4198 DataStore::Instance().setInitializeActive(
false);
4202 void TearDown()
override
4204 DataStore::Instance().reset();
4208 TEST_F(PIDVariableTest, LogLikelihood)
4217 const float pValue = 0.5;
4218 const float bField = 1.5;
4220 TMatrixDSym cov6(6);
4222 ROOT::Math::Cartesian2D d(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
4223 ROOT::Math::Cartesian2D pt(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
4224 d.SetXY(d.X(), -(d.X()*pt.X()) / pt.Y());
4226 ROOT::Math::XYZVector position(d.X(), d.Y(), generator.Uniform(-1, 1));
4227 ROOT::Math::XYZVector momentum(pt.X(), pt.Y(), generator.Uniform(-1, 1));
4229 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
4230 tfrs.
appendNew(position, momentum, cov6, charge, Const::electron, pValue, bField, CDCValue, 16777215, 0);
4233 Track* allTrack = tracks.appendNew(mytrack);
4234 Track* noSVDTrack = tracks.appendNew(mytrack);
4235 Track* noPIDTrack = tracks.appendNew(mytrack);
4236 Track* dEdxTrack = tracks.appendNew(mytrack);
4242 lAll->setLogLikelihood(Const::TOP, Const::electron, 0.18);
4243 lAll->setLogLikelihood(Const::ARICH, Const::electron, 0.16);
4244 lAll->setLogLikelihood(Const::ECL, Const::electron, 0.14);
4245 lAll->setLogLikelihood(Const::CDC, Const::electron, 0.12);
4246 lAll->setLogLikelihood(Const::SVD, Const::electron, 0.1);
4247 lAll->setLogLikelihood(Const::KLM, Const::electron, 0.01);
4249 lAll->setLogLikelihood(Const::TOP, Const::muon, 0.5);
4250 lAll->setLogLikelihood(Const::ARICH, Const::muon, 0.52);
4251 lAll->setLogLikelihood(Const::ECL, Const::muon, 0.54);
4252 lAll->setLogLikelihood(Const::CDC, Const::muon, 0.56);
4253 lAll->setLogLikelihood(Const::SVD, Const::muon, 0.58);
4254 lAll->setLogLikelihood(Const::KLM, Const::muon, 0.8);
4256 lAll->setLogLikelihood(Const::TOP, Const::pion, 0.2);
4257 lAll->setLogLikelihood(Const::ARICH, Const::pion, 0.22);
4258 lAll->setLogLikelihood(Const::ECL, Const::pion, 0.24);
4259 lAll->setLogLikelihood(Const::CDC, Const::pion, 0.26);
4260 lAll->setLogLikelihood(Const::SVD, Const::pion, 0.28);
4261 lAll->setLogLikelihood(Const::KLM, Const::pion, 0.2);
4263 lAll->setLogLikelihood(Const::TOP, Const::kaon, 0.3);
4264 lAll->setLogLikelihood(Const::ARICH, Const::kaon, 0.32);
4265 lAll->setLogLikelihood(Const::ECL, Const::kaon, 0.34);
4266 lAll->setLogLikelihood(Const::CDC, Const::kaon, 0.36);
4267 lAll->setLogLikelihood(Const::SVD, Const::kaon, 0.38);
4268 lAll->setLogLikelihood(Const::KLM, Const::kaon, 0.2);
4270 lAll->setLogLikelihood(Const::TOP, Const::proton, 0.4);
4271 lAll->setLogLikelihood(Const::ARICH, Const::proton, 0.42);
4272 lAll->setLogLikelihood(Const::ECL, Const::proton, 0.44);
4273 lAll->setLogLikelihood(Const::CDC, Const::proton, 0.46);
4274 lAll->setLogLikelihood(Const::SVD, Const::proton, 0.48);
4275 lAll->setLogLikelihood(Const::KLM, Const::proton, 0.02);
4277 lAll->setLogLikelihood(Const::TOP, Const::deuteron, 0.6);
4278 lAll->setLogLikelihood(Const::ARICH, Const::deuteron, 0.62);
4279 lAll->setLogLikelihood(Const::ECL, Const::deuteron, 0.64);
4280 lAll->setLogLikelihood(Const::CDC, Const::deuteron, 0.66);
4281 lAll->setLogLikelihood(Const::SVD, Const::deuteron, 0.68);
4282 lAll->setLogLikelihood(Const::KLM, Const::deuteron, 0.02);
4285 auto* lAllNoSVD = likelihood.
appendNew();
4287 for (
const auto& det : Const::PIDDetectorSet::set()) {
4288 for (
const auto& hypo : Const::chargedStableSet) {
4289 if (det != Const::SVD) {
4290 lAllNoSVD->setLogLikelihood(det, hypo, lAll->getLogL(hypo, det));
4297 ldEdx->setLogLikelihood(Const::CDC, Const::electron, 0.12);
4298 ldEdx->setLogLikelihood(Const::SVD, Const::electron, 0.1);
4300 ldEdx->setLogLikelihood(Const::CDC, Const::pion, 0.26);
4301 ldEdx->setLogLikelihood(Const::SVD, Const::pion, 0.28);
4303 ldEdx->setLogLikelihood(Const::CDC, Const::kaon, 0.36);
4304 ldEdx->setLogLikelihood(Const::SVD, Const::kaon, 0.38);
4306 ldEdx->setLogLikelihood(Const::CDC, Const::proton, 0.46);
4307 ldEdx->setLogLikelihood(Const::SVD, Const::proton, 0.48);
4309 ldEdx->setLogLikelihood(Const::CDC, Const::muon, 0.56);
4310 ldEdx->setLogLikelihood(Const::SVD, Const::muon, 0.58);
4312 ldEdx->setLogLikelihood(Const::CDC, Const::deuteron, 0.66);
4313 ldEdx->setLogLikelihood(Const::SVD, Const::deuteron, 0.68);
4328 auto* particleAll = particles.appendNew(allTrack, Const::pion);
4329 auto* particleNoSVD = particles.appendNew(noSVDTrack, Const::pion);
4330 auto* particledEdx = particles.appendNew(dEdxTrack, Const::pion);
4331 auto* particleNoID = particles.appendNew(noPIDTrack, Const::pion);
4333 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);
4334 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);
4337 EXPECT_FLOAT_EQ(electronID(particleAll), std::exp(0.71) / numsumexp);
4338 EXPECT_FLOAT_EQ(muonID(particleAll), std::exp(3.5) / numsumexp);
4339 EXPECT_FLOAT_EQ(pionID(particleAll), std::exp(1.4) / numsumexp);
4340 EXPECT_FLOAT_EQ(kaonID(particleAll), std::exp(1.9) / numsumexp);
4341 EXPECT_FLOAT_EQ(protonID(particleAll), std::exp(2.22) / numsumexp);
4342 EXPECT_FLOAT_EQ(deuteronID(particleAll), std::exp(3.22) / numsumexp);
4345 auto* particleElectron = particles.appendNew(allTrack, Const::electron);
4346 auto* particleMuon = particles.appendNew(allTrack, Const::muon);
4347 auto* particleKaon = particles.appendNew(allTrack, Const::kaon);
4348 auto* particleProton = particles.appendNew(allTrack, Const::proton);
4349 auto* particleDeuteron = particles.appendNew(allTrack, Const::deuteron);
4351 EXPECT_FLOAT_EQ(particleID(particleAll), std::exp(1.4) / numsumexp);
4352 EXPECT_FLOAT_EQ(particleID(particleElectron), std::exp(0.71) / numsumexp);
4353 EXPECT_FLOAT_EQ(particleID(particleMuon), std::exp(3.5) / numsumexp);
4354 EXPECT_FLOAT_EQ(particleID(particleKaon), std::exp(1.9) / numsumexp);
4355 EXPECT_FLOAT_EQ(particleID(particleProton), std::exp(2.22) / numsumexp);
4356 EXPECT_FLOAT_EQ(particleID(particleDeuteron), std::exp(3.22) / numsumexp);
4359 EXPECT_FLOAT_EQ(electronID_noSVD(particleNoSVD), std::exp(0.61) / numsumexp_noSVD);
4360 EXPECT_FLOAT_EQ(muonID_noSVD(particleNoSVD), std::exp(2.92) / numsumexp_noSVD);
4361 EXPECT_FLOAT_EQ(pionID_noSVD(particleNoSVD), std::exp(1.12) / numsumexp_noSVD);
4362 EXPECT_FLOAT_EQ(kaonID_noSVD(particleNoSVD), std::exp(1.52) / numsumexp_noSVD);
4363 EXPECT_FLOAT_EQ(protonID_noSVD(particleNoSVD), std::exp(1.74) / numsumexp_noSVD);
4364 EXPECT_FLOAT_EQ(deuteronID_noSVD(particleNoSVD), std::exp(2.54) / numsumexp_noSVD);
4367 std::vector<double> v_pi_K {211., 321.};
4368 std::vector<double> v_pi_p {211., 2212.};
4369 std::vector<double> v_K_p {321., 2212.};
4370 EXPECT_FLOAT_EQ(binaryPID(particleAll, v_pi_K), std::exp(1.4) / (std::exp(1.4) + std::exp(1.9)));
4371 EXPECT_FLOAT_EQ(binaryPID(particleAll, v_pi_p), std::exp(1.4) / (std::exp(1.4) + std::exp(2.22)));
4372 EXPECT_FLOAT_EQ(binaryPID(particleAll, v_K_p), std::exp(1.9) / (std::exp(1.9) + std::exp(2.22)));
4375 EXPECT_TRUE(std::isnan(electronID(particleNoID)));
4376 EXPECT_TRUE(std::isnan(muonID(particleNoID)));
4377 EXPECT_TRUE(std::isnan(pionID(particleNoID)));
4378 EXPECT_TRUE(std::isnan(kaonID(particleNoID)));
4379 EXPECT_TRUE(std::isnan(protonID(particleNoID)));
4380 EXPECT_TRUE(std::isnan(deuteronID(particleNoID)));
4383 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(11, TOP)")->
function(particleAll)),
4385 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(11, ALL)")->
function(particleAll)),
4387 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(2212, TOP, CDC)")->
function(
4388 particleAll)), 0.86);
4391 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidProbabilityExpert(1000010020, ALL)")->
function(particleAll)),
4392 std::exp(3.22) / numsumexp);
4393 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidProbabilityExpert(2212, ALL)")->
function(particleAll)),
4394 std::exp(2.22) / numsumexp);
4395 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidProbabilityExpert(211, ALL)")->
function(particleAll)),
4396 std::exp(1.4) / numsumexp);
4397 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidProbabilityExpert(321, ALL)")->
function(particleAll)),
4398 std::exp(1.9) / numsumexp);
4399 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidProbabilityExpert(13, ALL)")->
function(particleAll)),
4400 std::exp(3.5) / numsumexp);
4401 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidProbabilityExpert(11, ALL)")->
function(particleAll)),
4402 std::exp(0.71) / numsumexp);
4403 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidProbabilityExpert(211, ALL)")->
function(particledEdx)),
4404 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)));
4405 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidProbabilityExpert(211, ALL)")->
function(particledEdx)),
4406 std::get<double>(Manager::Instance().getVariable(
"pidProbabilityExpert(211, CDC, SVD)")->
function(particleAll)));
4407 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidProbabilityExpert(211, CDC)")->
function(particledEdx)),
4408 std::get<double>(Manager::Instance().getVariable(
"pidProbabilityExpert(211, CDC)")->
function(particleAll)));
4409 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidProbabilityExpert(321, CDC)")->
function(particleAll)),
4410 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)));
4413 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, ALL)")->
function(
4415 1.0 / (1.0 + std::exp(2.22 - 1.9)));
4416 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, ALL)")->
function(
4418 1.0 / (1.0 + std::exp(0.94 - 0.74)));
4419 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, CDC, SVD)")->
function(
4421 1.0 / (1.0 + std::exp(0.94 - 0.74)));
4424 EXPECT_TRUE(std::isnan(std::get<double>(Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, KLM)")->
function(
4426 EXPECT_TRUE(std::isnan(std::get<double>(Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(11, TOP, CDC, SVD)")->
function(
4428 EXPECT_TRUE(std::isnan(std::get<double>(Manager::Instance().getVariable(
"pidLogLikelihoodValueExpert(11, TOP)")->
function(
4430 EXPECT_TRUE(std::isnan(std::get<double>(Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, KLM)")->
function(
4432 EXPECT_TRUE(std::isnan(std::get<double>
4433 (Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, ECL, TOP, ARICH)")->
function(
4435 EXPECT_FALSE(std::isnan(std::get<double>
4436 (Manager::Instance().getVariable(
"pidPairProbabilityExpert(321, 2212, ECL, TOP, ARICH, SVD)")->
function(
4439 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidMostLikelyPDG()")->
function(particledEdx)), 1.00001e+09);
4440 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidMostLikelyPDG(0.5, 0.1, 0.1, 0.1, 0.1, 0.1)")->
function(
4442 Const::electron.getPDGCode());
4443 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidMostLikelyPDG(0.1, 0.5, 0.1, 0.1, 0.1, 0.1)")->
function(
4445 Const::muon.getPDGCode());
4446 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidMostLikelyPDG(0.1, 0.1, 0.5, 0.1, 0.1, 0.1)")->
function(
4448 Const::pion.getPDGCode());
4449 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidMostLikelyPDG(0.1, 0.1, 0.1, 0.5, 0.1, 0.1)")->
function(
4451 Const::kaon.getPDGCode());
4452 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidMostLikelyPDG(0.1, 0.1, 0.1, 0.1, 0.5, 0.1)")->
function(
4454 Const::proton.getPDGCode());
4455 EXPECT_FLOAT_EQ(std::get<double>(Manager::Instance().getVariable(
"pidMostLikelyPDG(0, 1., 0, 0, 0, 0)")->
function(particledEdx)),
4456 Const::muon.getPDGCode());
4459 TEST_F(PIDVariableTest, MissingLikelihood)
4468 const float pValue = 0.5;
4469 const float bField = 1.5;
4471 TMatrixDSym cov6(6);
4473 ROOT::Math::Cartesian2D d(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
4474 ROOT::Math::Cartesian2D pt(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
4475 d.SetXY(d.X(), -(d.X()*pt.X()) / pt.Y());
4477 ROOT::Math::XYZVector position(d.X(), d.Y(), generator.Uniform(-1, 1));
4478 ROOT::Math::XYZVector momentum(pt.X(), pt.Y(), generator.Uniform(-1, 1));
4480 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
4481 tfrs.
appendNew(position, momentum, cov6, charge, Const::electron, pValue, bField, CDCValue, 16777215, 0);
4484 Track* savedTrack1 = tracks.appendNew(mytrack);
4485 Track* savedTrack2 = tracks.appendNew(mytrack);
4486 Track* savedTrack3 = tracks.appendNew(mytrack);
4487 Track* savedTrack4 = tracks.appendNew(mytrack);
4490 l1->setLogLikelihood(Const::TOP, Const::electron, 0.18);
4491 l1->setLogLikelihood(Const::ECL, Const::electron, 0.14);
4494 auto* electron = particles.appendNew(savedTrack1, Const::electron);
4497 l2->setLogLikelihood(Const::TOP, Const::pion, 0.2);
4498 l2->setLogLikelihood(Const::ARICH, Const::pion, 0.22);
4499 l2->setLogLikelihood(Const::ECL, Const::pion, 0.24);
4500 l2->setLogLikelihood(Const::CDC, Const::pion, 0.26);
4501 l2->setLogLikelihood(Const::SVD, Const::pion, 0.28);
4504 auto* pion = particles.appendNew(savedTrack2, Const::pion);
4507 l3->setLogLikelihood(Const::TOP, Const::kaon, 0.3);
4508 l3->setLogLikelihood(Const::ARICH, Const::kaon, 0.32);
4511 auto* kaon = particles.appendNew(savedTrack3, Const::kaon);
4514 l4->setLogLikelihood(Const::ARICH, Const::proton, 0.42);
4515 l4->setLogLikelihood(Const::ECL, Const::proton, 0.44);
4516 l4->setLogLikelihood(Const::CDC, Const::proton, 0.46);
4517 l4->setLogLikelihood(Const::SVD, Const::proton, 0.48);
4520 auto* proton = particles.appendNew(savedTrack4, Const::proton);
4522 const Manager::Var* varMissECL = Manager::Instance().getVariable(
"pidMissingProbabilityExpert(ECL)");
4523 const Manager::Var* varMissTOP = Manager::Instance().getVariable(
"pidMissingProbabilityExpert(TOP)");
4524 const Manager::Var* varMissARICH = Manager::Instance().getVariable(
"pidMissingProbabilityExpert(ARICH)");
4527 EXPECT_FLOAT_EQ(std::get<double>(varMissTOP->
function(electron)), 0.0);
4528 EXPECT_FLOAT_EQ(std::get<double>(varMissTOP->
function(pion)), 0.0);
4529 EXPECT_FLOAT_EQ(std::get<double>(varMissTOP->
function(kaon)), 0.0);
4530 EXPECT_FLOAT_EQ(std::get<double>(varMissTOP->
function(proton)), 1.0);
4532 EXPECT_FLOAT_EQ(std::get<double>(varMissARICH->
function(electron)), 1.0);
4533 EXPECT_FLOAT_EQ(std::get<double>(varMissARICH->
function(pion)), 0.0);
4534 EXPECT_FLOAT_EQ(std::get<double>(varMissARICH->
function(kaon)), 0.0);
4535 EXPECT_FLOAT_EQ(std::get<double>(varMissARICH->
function(proton)), 0.0);
4537 EXPECT_FLOAT_EQ(std::get<double>(varMissECL->
function(electron)), 0.0);
4538 EXPECT_FLOAT_EQ(std::get<double>(varMissECL->
function(pion)), 0.0);
4539 EXPECT_FLOAT_EQ(std::get<double>(varMissECL->
function(kaon)), 1.0);
4540 EXPECT_FLOAT_EQ(std::get<double>(varMissECL->
function(proton)), 0.0);
4543 class FlightInfoTest :
public ::testing::Test {
4546 void SetUp()
override
4548 DataStore::Instance().setInitializeActive(
true);
4553 particles.registerRelationTo(mcParticles);
4555 DataStore::Instance().setInitializeActive(
false);
4560 mcKs.
setPDG(Const::Kshort.getPDGCode());
4568 mcKs.
setStatus(MCParticle::c_PrimaryParticle);
4577 mcDp.
setStatus(MCParticle::c_PrimaryParticle);
4581 PxPyPzEVector momentum;
4582 TMatrixFSym error(7);
4589 error(5, 5) = 0.00875;
4591 Particle pi(PxPyPzEVector(1.59607, 1.19705, 0, 2), 211);
4592 momentum += pi.get4Vector();
4593 Particle* newpi = particles.appendNew(pi);
4596 Particle Ks(PxPyPzEVector(1.164, 1.55200, 0, 2), 310, Particle::c_Unflavored, Particle::c_Composite, 0);
4597 Ks.setVertex(XYZVector(4.0, 5.0, 0.0));
4598 Ks.setMomentumVertexErrorMatrix(error);
4599 momentum += Ks.get4Vector();
4600 Ks.addExtraInfo(
"prodVertX", 1.0);
4601 Ks.addExtraInfo(
"prodVertY", 1.0);
4602 Ks.addExtraInfo(
"prodVertZ", 0.0);
4603 Ks.addExtraInfo(
"prodVertSxx", 0.04);
4604 Ks.addExtraInfo(
"prodVertSxy", 0.0);
4605 Ks.addExtraInfo(
"prodVertSxz", 0.0);
4606 Ks.addExtraInfo(
"prodVertSyx", 0.0);
4607 Ks.addExtraInfo(
"prodVertSyy", 0.00875);
4608 Ks.addExtraInfo(
"prodVertSyz", 0.0);
4609 Ks.addExtraInfo(
"prodVertSzx", 0.0);
4610 Ks.addExtraInfo(
"prodVertSzy", 0.0);
4611 Ks.addExtraInfo(
"prodVertSzz", 0.01);
4612 Particle* newKs = particles.appendNew(Ks);
4616 Particle Dp(momentum, 411, Particle::c_Flavored, Particle::c_Composite, 0);
4617 Dp.appendDaughter(newpi);
4618 Dp.appendDaughter(newKs);
4619 XYZVector motherVtx(1.0, 1.0, 0.0);
4620 Dp.setVertex(motherVtx);
4621 Dp.setMomentumVertexErrorMatrix(error);
4622 Dp.addExtraInfo(
"prodVertX", 0.0);
4623 Dp.addExtraInfo(
"prodVertY", 1.0);
4624 Dp.addExtraInfo(
"prodVertZ", -2.0);
4625 Dp.addExtraInfo(
"prodVertSxx", 0.04);
4626 Dp.addExtraInfo(
"prodVertSxy", 0.0);
4627 Dp.addExtraInfo(
"prodVertSxz", 0.0);
4628 Dp.addExtraInfo(
"prodVertSyx", 0.0);
4629 Dp.addExtraInfo(
"prodVertSyy", 0.01);
4630 Dp.addExtraInfo(
"prodVertSyz", 0.0);
4631 Dp.addExtraInfo(
"prodVertSzx", 0.0);
4632 Dp.addExtraInfo(
"prodVertSzy", 0.0);
4633 Dp.addExtraInfo(
"prodVertSzz", 0.1575);
4634 Particle* newDp = particles.appendNew(Dp);
4640 void TearDown()
override
4642 DataStore::Instance().reset();
4645 TEST_F(FlightInfoTest, flightDistance)
4648 const Particle* newKs = particles[1];
4650 const Manager::Var* var = Manager::Instance().getVariable(
"flightDistance");
4651 ASSERT_NE(var,
nullptr);
4652 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 5.0);
4654 TEST_F(FlightInfoTest, flightDistanceErr)
4657 const Particle* newKs = particles[1];
4659 const Manager::Var* var = Manager::Instance().getVariable(
"flightDistanceErr");
4660 ASSERT_NE(var,
nullptr);
4661 EXPECT_GT(std::get<double>(var->function(newKs)), 0.0);
4663 TEST_F(FlightInfoTest, flightTime)
4666 const Particle* newKs = particles[1];
4668 const Manager::Var* var = Manager::Instance().getVariable(
"flightTime");
4669 ASSERT_NE(var,
nullptr);
4670 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 5.0 / Const::speedOfLight * newKs->
getPDGMass() / newKs->
getP());
4673 TEST_F(FlightInfoTest, flightTimeErr)
4676 const Particle* newKs = particles[1];
4678 const Manager::Var* var = Manager::Instance().getVariable(
"flightTimeErr");
4679 ASSERT_NE(var,
nullptr);
4680 EXPECT_GT(std::get<double>(var->function(newKs)), 0.0);
4683 TEST_F(FlightInfoTest, flightDistanceOfDaughter)
4686 const Particle* newDp = particles[2];
4688 const Manager::Var* var = Manager::Instance().getVariable(
"flightDistanceOfDaughter(1)");
4689 ASSERT_NE(var,
nullptr);
4690 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 5.0);
4692 var = Manager::Instance().getVariable(
"flightDistanceOfDaughter(3)");
4693 ASSERT_NE(var,
nullptr);
4694 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4696 TEST_F(FlightInfoTest, flightDistanceOfDaughterErr)
4699 const Particle* newDp = particles[2];
4701 const Manager::Var* var = Manager::Instance().getVariable(
"flightDistanceOfDaughterErr(1)");
4702 ASSERT_NE(var,
nullptr);
4703 EXPECT_GT(std::get<double>(var->function(newDp)), 0.0);
4705 var = Manager::Instance().getVariable(
"flightDistanceOfDaughterErr(3)");
4706 ASSERT_NE(var,
nullptr);
4707 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4709 TEST_F(FlightInfoTest, flightTimeOfDaughter)
4712 const Particle* newDp = particles[2];
4714 const Manager::Var* var = Manager::Instance().getVariable(
"flightTimeOfDaughter(1)");
4715 ASSERT_NE(var,
nullptr);
4718 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 5.0 / Const::speedOfLight * Ks->
getPDGMass() / Ks->
getP());
4720 var = Manager::Instance().getVariable(
"flightTimeOfDaughter(3)");
4721 ASSERT_NE(var,
nullptr);
4722 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4724 TEST_F(FlightInfoTest, flightTimeOfDaughterErr)
4727 const Particle* newDp = particles[2];
4729 const Manager::Var* var = Manager::Instance().getVariable(
"flightTimeOfDaughterErr(1)");
4730 ASSERT_NE(var,
nullptr);
4731 EXPECT_GT(std::get<double>(var->function(newDp)), 0.0);
4733 var = Manager::Instance().getVariable(
"flightTimeOfDaughterErr(3)");
4734 ASSERT_NE(var,
nullptr);
4735 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4737 TEST_F(FlightInfoTest, mcFlightDistanceOfDaughter)
4740 const Particle* newDp = particles[2];
4742 const Manager::Var* var = Manager::Instance().getVariable(
"mcFlightDistanceOfDaughter(1)");
4743 ASSERT_NE(var,
nullptr);
4745 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 5.0);
4747 var = Manager::Instance().getVariable(
"mcFlightDistanceOfDaughter(3)");
4748 ASSERT_NE(var,
nullptr);
4749 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4751 TEST_F(FlightInfoTest, mcFlightTimeOfDaughter)
4754 const Particle* newDp = particles[2];
4756 const Manager::Var* var = Manager::Instance().getVariable(
"mcFlightTimeOfDaughter(1)");
4757 ASSERT_NE(var,
nullptr);
4762 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), Ks->getLifetime() / Ks->
getEnergy()*Ks->
getMass());
4764 var = Manager::Instance().getVariable(
"mcFlightTimeOfDaughter(3)");
4765 ASSERT_NE(var,
nullptr);
4766 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4769 TEST_F(FlightInfoTest, vertexDistance)
4772 const Particle* newKS = particles[1];
4774 const Manager::Var* var = Manager::Instance().getVariable(
"vertexDistance");
4775 ASSERT_NE(var,
nullptr);
4776 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKS)), 5.0);
4779 TEST_F(FlightInfoTest, vertexDistanceError)
4782 const Particle* newKS = particles[1];
4784 const Manager::Var* var = Manager::Instance().getVariable(
"vertexDistanceErr");
4785 ASSERT_NE(var,
nullptr);
4786 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKS)), 0.2);
4789 TEST_F(FlightInfoTest, vertexDistanceSignificance)
4792 const Particle* newKS = particles[1];
4794 const Manager::Var* var = Manager::Instance().getVariable(
"vertexDistanceSignificance");
4795 ASSERT_NE(var,
nullptr);
4796 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKS)), 25);
4799 TEST_F(FlightInfoTest, vertexDistanceOfDaughter)
4802 const Particle* newDp = particles[2];
4804 const Manager::Var* var = Manager::Instance().getVariable(
"vertexDistanceOfDaughter(1, 0)");
4805 ASSERT_NE(var,
nullptr);
4806 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 5.0);
4808 var = Manager::Instance().getVariable(
"vertexDistanceOfDaughter(1)");
4809 ASSERT_NE(var,
nullptr);
4810 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 6.0);
4812 var = Manager::Instance().getVariable(
"vertexDistanceOfDaughter(2)");
4813 ASSERT_NE(var,
nullptr);
4814 EXPECT_TRUE(std::isnan(std::get<double>(var->function(newDp))));
4817 TEST_F(FlightInfoTest, vertexDistanceOfDaughterError)
4820 const Particle* newDp = particles[2];
4822 const Manager::Var* var = Manager::Instance().getVariable(
"vertexDistanceOfDaughterErr(1, 0)");
4823 ASSERT_NE(var,
nullptr);
4824 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 0.2);
4826 var = Manager::Instance().getVariable(
"vertexDistanceOfDaughterErr(1)");
4827 ASSERT_NE(var,
nullptr);
4828 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 0.25);
4831 TEST_F(FlightInfoTest, vertexDistanceOfDaughterSignificance)
4834 const Particle* newDp = particles[2];
4836 const Manager::Var* var = Manager::Instance().getVariable(
"vertexDistanceOfDaughterSignificance(1, 0)");
4837 ASSERT_NE(var,
nullptr);
4838 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 25);
4840 var = Manager::Instance().getVariable(
"vertexDistanceOfDaughterSignificance(1)");
4841 ASSERT_NE(var,
nullptr);
4842 EXPECT_FLOAT_EQ(std::get<double>(var->function(newDp)), 24);
4845 class VertexVariablesTest :
public ::testing::Test {
4848 void SetUp()
override
4850 DataStore::Instance().setInitializeActive(
true);
4855 particles.registerRelationTo(mcParticles);
4857 DataStore::Instance().setInitializeActive(
false);
4862 mcKs.
setPDG(Const::Kshort.getPDGCode());
4867 mcKs.
setStatus(MCParticle::c_PrimaryParticle);
4870 Particle Ks(PxPyPzEVector(1.164, 1.55200, 0, 2), 310);
4884 Particle* newKs = particles.appendNew(Ks);
4889 void TearDown()
override
4891 DataStore::Instance().reset();
4896 TEST_F(VertexVariablesTest, mcDecayVertexX)
4899 const Particle* newKs = particles[0];
4901 const Manager::Var* var = Manager::Instance().getVariable(
"mcDecayVertexX");
4902 ASSERT_NE(var,
nullptr);
4903 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 4.0);
4906 TEST_F(VertexVariablesTest, mcDecayVertexY)
4909 const Particle* newKs = particles[0];
4911 const Manager::Var* var = Manager::Instance().getVariable(
"mcDecayVertexY");
4912 ASSERT_NE(var,
nullptr);
4913 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 5.0);
4916 TEST_F(VertexVariablesTest, mcDecayVertexZ)
4919 const Particle* newKs = particles[0];
4921 const Manager::Var* var = Manager::Instance().getVariable(
"mcDecayVertexZ");
4922 ASSERT_NE(var,
nullptr);
4923 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.0);
4927 TEST_F(VertexVariablesTest, mcDecayVertexFromIPDistance)
4930 const Particle* newKs = particles[0];
4932 const Manager::Var* var = Manager::Instance().getVariable(
"mcDecayVertexFromIPDistance");
4933 ASSERT_NE(var,
nullptr);
4934 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)),
sqrt(4.0 * 4.0 + 5.0 * 5.0));
4937 TEST_F(VertexVariablesTest, mcDecayVertexRho)
4940 const Particle* newKs = particles[0];
4942 const Manager::Var* var = Manager::Instance().getVariable(
"mcDecayVertexRho");
4943 ASSERT_NE(var,
nullptr);
4944 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)),
sqrt(4.0 * 4.0 + 5.0 * 5.0));
4947 TEST_F(VertexVariablesTest, mcProductionVertexX)
4950 const Particle* newKs = particles[0];
4952 const Manager::Var* var = Manager::Instance().getVariable(
"mcProductionVertexX");
4953 ASSERT_NE(var,
nullptr);
4954 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 1.0);
4957 TEST_F(VertexVariablesTest, mcProductionVertexY)
4960 const Particle* newKs = particles[0];
4962 const Manager::Var* var = Manager::Instance().getVariable(
"mcProductionVertexY");
4963 ASSERT_NE(var,
nullptr);
4964 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 2.0);
4967 TEST_F(VertexVariablesTest, mcProductionVertexZ)
4970 const Particle* newKs = particles[0];
4972 const Manager::Var* var = Manager::Instance().getVariable(
"mcProductionVertexZ");
4973 ASSERT_NE(var,
nullptr);
4974 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 3.0);
4979 TEST_F(VertexVariablesTest, prodVertexX)
4982 const Particle* newKs = particles[0];
4984 const Manager::Var* var = Manager::Instance().getVariable(
"prodVertexX");
4985 ASSERT_NE(var,
nullptr);
4986 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 1.0);
4988 TEST_F(VertexVariablesTest, prodVertexY)
4991 const Particle* newKs = particles[0];
4993 const Manager::Var* var = Manager::Instance().getVariable(
"prodVertexY");
4994 ASSERT_NE(var,
nullptr);
4995 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 2.0);
4997 TEST_F(VertexVariablesTest, prodVertexZ)
5000 const Particle* newKs = particles[0];
5002 const Manager::Var* var = Manager::Instance().getVariable(
"prodVertexZ");
5003 ASSERT_NE(var,
nullptr);
5004 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 3.0);
5009 TEST_F(VertexVariablesTest, prodVertexCov)
5012 const Particle* newKs = particles[0];
5015 const Manager::Var* var = Manager::Instance().getVariable(
"prodVertexCov(0,0)");
5016 ASSERT_NE(var,
nullptr);
5017 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.1);
5018 var = Manager::Instance().getVariable(
"prodVertexCov(0,1)");
5019 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.2);
5020 var = Manager::Instance().getVariable(
"prodVertexCov(0,2)");
5021 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.3);
5022 var = Manager::Instance().getVariable(
"prodVertexCov(1,0)");
5023 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.4);
5024 var = Manager::Instance().getVariable(
"prodVertexCov(1,1)");
5025 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.5);
5026 var = Manager::Instance().getVariable(
"prodVertexCov(1,2)");
5027 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.6);
5028 var = Manager::Instance().getVariable(
"prodVertexCov(2,0)");
5029 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.7);
5030 var = Manager::Instance().getVariable(
"prodVertexCov(2,1)");
5031 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.8);
5032 var = Manager::Instance().getVariable(
"prodVertexCov(2,2)");
5033 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)), 0.9);
5034 var = Manager::Instance().getVariable(
"prodVertexXErr");
5035 ASSERT_NE(var,
nullptr);
5036 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)),
sqrt(0.1));
5037 var = Manager::Instance().getVariable(
"prodVertexYErr");
5038 ASSERT_NE(var,
nullptr);
5039 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)),
sqrt(0.5));
5040 var = Manager::Instance().getVariable(
"prodVertexZErr");
5041 ASSERT_NE(var,
nullptr);
5042 EXPECT_FLOAT_EQ(std::get<double>(var->function(newKs)),
sqrt(0.9));
5047 TEST_F(MetaVariableTest, KSFWVariables)
5052 EXPECT_B2FATAL(Manager::Instance().getVariable(
"KSFWVariables(NONSENSE)"));
5057 const Manager::Var* var = Manager::Instance().getVariable(
"KSFWVariables(mm2)");
5058 EXPECT_TRUE(std::isnan(std::get<double>(var->function(particle_with_no_cs))));
5061 EXPECT_B2ERROR(Manager::Instance().getVariable(
"KSFWVariables(et, mask, FS1)"));
5064 TEST_F(MetaVariableTest, CleoConeCS)
5069 EXPECT_B2FATAL(Manager::Instance().getVariable(
"CleoConeCS(NONSENSE)"));
5074 const Manager::Var* var = Manager::Instance().getVariable(
"CleoConeCS(0)");
5075 EXPECT_TRUE(std::isnan(std::get<double>(var->function(particle_with_no_cs))));
5078 var = Manager::Instance().getVariable(
"CleoConeCS(0, NOTROE)");
5079 EXPECT_TRUE(std::isnan(std::get<double>(var->function(particle_with_no_cs))));
5082 EXPECT_B2ERROR(Manager::Instance().getVariable(
"CleoConeCS(0, mask, ROE)"));
5085 TEST_F(MetaVariableTest, TransformedNetworkOutput)
5088 EXPECT_B2FATAL(Manager::Instance().getVariable(
"transformedNetworkOutput(NONSENSE)"));
5091 EXPECT_B2FATAL(Manager::Instance().getVariable(
"transformedNetworkOutput(NONEXISTENT, 0, NOTDOUBLE)"));
5092 EXPECT_B2FATAL(Manager::Instance().getVariable(
"transformedNetworkOutput(NONEXISTENT, NOTDOUBLE, 1)"));
5097 const Manager::Var* var = Manager::Instance().getVariable(
"transformedNetworkOutput(NONEXISTENT, 0, 1)");
5098 EXPECT_TRUE(std::isnan(std::get<double>(var->function(particle))));
5100 if (not eventExtraInfo.isValid())
5101 eventExtraInfo.create();
5102 var = Manager::Instance().getVariable(
"transformedNetworkOutput(NONEXISTENT, 0, 1)");
5103 EXPECT_TRUE(std::isnan(std::get<double>(var->function(
nullptr))));
Provides a type-safe way to pass members of the chargedStableSet set.
EStoreFlags
Flags describing behaviours of objects etc.
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).
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.
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.
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)
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.
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
TEST(TestgetDetectorRegion, TestgetDetectorRegion)
Test Constructors.
double sqrt(double a)
sqrt for double
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.