14 #include <gtest/gtest.h>
17 #include <analysis/ParticleCombiner/ParticleCombiner.h>
20 #include <analysis/VariableManager/Manager.h>
21 #include <analysis/dataobjects/Particle.h>
22 #include <analysis/dataobjects/ParticleList.h>
25 #include <mdst/dataobjects/ECLCluster.h>
26 #include <mdst/dataobjects/KLMCluster.h>
27 #include <mdst/dataobjects/Track.h>
30 #include <framework/datastore/StoreArray.h>
31 #include <framework/datastore/StoreObjPtr.h>
32 #include <framework/utilities/TestHelpers.h>
33 #include <framework/gearbox/Const.h>
34 #include <framework/gearbox/Gearbox.h>
37 using namespace Belle2::Variable;
42 class ECLVariableTest :
public ::testing::Test {
52 particles.registerInDataStore();
56 tracks.registerInDataStore();
58 trackFits.registerInDataStore();
60 eclclusters.registerInDataStore();
63 tracks.registerRelationTo(eclclusters);
69 tracks.appendNew(
Track());
74 tracks.appendNew(
Track());
75 tracks.appendNew(
Track());
80 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
82 for (
int i = 0; i < tracks.getEntries(); ++i) {
83 int charge = (i % 2 == 0) ? +1 : -1;
84 TVector2 d(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
85 TVector2 pt(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
86 d.Set(d.X(), -(d.X()*pt.Px()) / pt.Py());
87 TVector3 position(d.X(), d.Y(), generator.Uniform(-1, 1));
88 TVector3 momentum(pt.Px(), pt.Py(), generator.Uniform(-1, 1));
89 trackFits.
appendNew(position, momentum, cov6, charge,
Const::pion, 0.5, 1.5, CDCValue, 16777215, 0);
129 t1->addRelationTo(e4);
136 t2->addRelationTo(e5);
143 t3->addRelationTo(e6);
152 void TearDown()
override
158 TEST_F(ECLVariableTest, b2bKinematicsTest)
167 gearbox.setBackends({std::string(
"file:")});
169 gearbox.open(
"geometry/Belle2.xml",
false);
179 gammalist->initialize(22, gammalist.getName());
182 for (
int i = 0; i < eclclusters.
getEntries(); ++i) {
183 if (!eclclusters[i]->isTrack()) {
185 gammalist->addParticle(p);
196 EXPECT_EQ(gammalist->getListSize(), 3);
198 EXPECT_FLOAT_EQ(b2bClusterTheta->function(gammalist->getParticle(0)), 3.0276606);
199 EXPECT_FLOAT_EQ(b2bClusterPhi->function(gammalist->getParticle(0)), 0.0);
200 EXPECT_FLOAT_EQ(b2bClusterTheta->function(gammalist->getParticle(1)), 1.6036042);
201 EXPECT_FLOAT_EQ(b2bClusterPhi->function(gammalist->getParticle(1)), -1.0607308);
202 EXPECT_FLOAT_EQ(b2bClusterTheta->function(gammalist->getParticle(2)), 2.7840068);
203 EXPECT_FLOAT_EQ(b2bClusterPhi->function(gammalist->getParticle(2)), -1.3155469);
206 ASSERT_TRUE(std::isnan(b2bClusterTheta->function(noclustertrack)));
207 ASSERT_TRUE(std::isnan(b2bClusterPhi->function(noclustertrack)));
214 EXPECT_FLOAT_EQ(b2bClusterTheta->function(gammalist->getParticle(0)),
215 b2bTheta->function(gammalist->getParticle(0)));
216 EXPECT_FLOAT_EQ(b2bClusterPhi->function(gammalist->getParticle(0)),
217 b2bPhi->function(gammalist->getParticle(0)));
220 TEST_F(ECLVariableTest, clusterKinematicsTest)
229 gearbox.setBackends({std::string(
"file:")});
231 gearbox.open(
"geometry/Belle2.xml",
false);
241 gammalist->initialize(22, gammalist.getName());
244 for (
int i = 0; i < eclclusters.
getEntries(); ++i) {
245 if (!eclclusters[i]->isTrack()) {
247 gammalist->addParticle(p);
257 EXPECT_FLOAT_EQ(clusterPhi->
function(gammalist->getParticle(1)), 2.0);
258 EXPECT_FLOAT_EQ(clusterPhiCMS->
function(gammalist->getParticle(1)), 2.042609);
259 EXPECT_FLOAT_EQ(clusterTheta->
function(gammalist->getParticle(1)), 1.0);
260 EXPECT_FLOAT_EQ(clusterThetaCMS->
function(gammalist->getParticle(1)), 1.2599005);
263 EXPECT_FLOAT_EQ(clusterPhi->
function(gammalist->getParticle(0)), eclclusters[0]->getPhi());
264 EXPECT_FLOAT_EQ(clusterTheta->
function(gammalist->getParticle(0)), eclclusters[0]->getTheta());
267 TEST_F(ECLVariableTest, HypothesisVariables)
281 gammalist->initialize(22, gammalist.getName());
284 for (
int i = 0; i < eclclusters.
getEntries(); ++i)
285 if (!eclclusters[i]->isTrack()) {
287 gammalist->addParticle(p);
295 for (
size_t i = 0; i < gammalist->getListSize(); ++i) {
296 EXPECT_FLOAT_EQ(vHasNPhotons->
function(gammalist->getParticle(i)), 1.0);
298 EXPECT_FLOAT_EQ(vHasNeutHadr->
function(gammalist->getParticle(i)), 1.0);
300 EXPECT_FLOAT_EQ(vHasNeutHadr->
function(gammalist->getParticle(i)), 0.0);
305 TEST_F(ECLVariableTest, IsFromECL)
315 for (
int i = 0; i < eclclusters.
getEntries(); ++i)
316 if (!eclclusters[i]->isTrack()) {
318 EXPECT_TRUE(vIsFromECL->
function(p));
319 EXPECT_FALSE(vIsFromKLM->
function(p));
320 EXPECT_FALSE(vIsFromTrack->
function(p));
321 EXPECT_FALSE(vIsFromV0->
function(p));
325 TEST_F(ECLVariableTest, WholeEventClosure)
346 gammalist->initialize(22, gammalist.getName());
348 pionslist->initialize(211, pionslist.getName());
350 apionslist->initialize(-211, apionslist.getName());
351 apionslist->bindAntiParticleList(*(pionslist));
354 double eclEnergy = 0.0;
355 for (
int i = 0; i < eclclusters.
getEntries(); ++i) {
357 if (!eclclusters[i]->isTrack()) {
359 gammalist->addParticle(p);
365 for (
int i = 0; i < tracks.getEntries(); ++i) {
367 pionslist->addParticle(p);
375 double totalNeutralClusterE = 0.0;
376 for (
size_t i = 0; i < gammalist->getListSize(); ++i)
377 totalNeutralClusterE += vClusterE->
function(gammalist->getParticle(i));
380 double totalTrackClusterE = 0.0;
381 for (
size_t i = 0; i < pionslist->getListSize(); ++i) {
382 double clusterE = vClusterE->
function(pionslist->getParticle(i));
383 double nOtherCl = vClNTrack->
function(pionslist->getParticle(i));
385 totalTrackClusterE += clusterE / nOtherCl;
388 EXPECT_FLOAT_EQ(totalNeutralClusterE + totalTrackClusterE, eclEnergy);
391 TEST_F(ECLVariableTest, eclClusterOnlyInvariantMass)
395 std::vector<int> daughterIndices, daughterIndices_noclst;
400 eclclusters_new.registerInDataStore();
401 particles.registerRelationTo(eclclusters_new);
405 const float px_0 = 2.;
406 const float py_0 = 1.;
407 const float pz_0 = 3.;
408 const float px_1 = 1.5;
409 const float py_1 = 1.5;
410 const float pz_1 = 2.5;
412 E_0 = sqrt(pow(px_0, 2) + pow(py_0, 2) + pow(pz_0, 2));
413 E_1 = sqrt(pow(px_1, 2) + pow(py_1, 2) + pow(pz_1, 2));
414 TLorentzVector momentum;
415 TLorentzVector dau0_4vec(px_0, py_0, pz_0, E_0), dau1_4vec(px_1, py_1, pz_1, E_1);
418 Particle dau0_noclst(dau0_4vec, 22);
419 momentum += dau0_noclst.get4Vector();
420 Particle* newDaughter0_noclst = particles.appendNew(dau0_noclst);
421 daughterIndices_noclst.push_back(newDaughter0_noclst->
getArrayIndex());
422 Particle dau1_noclst(dau1_4vec, 22);
423 momentum += dau1_noclst.get4Vector();
424 Particle* newDaughter1_noclst = particles.appendNew(dau1_noclst);
425 daughterIndices_noclst.push_back(newDaughter1_noclst->
getArrayIndex());
432 ASSERT_NE(var,
nullptr);
433 EXPECT_TRUE(std::isnan(var->function(par_noclst)));
440 eclst0->
setTheta(dau0_4vec.Theta());
441 eclst0->
setPhi(dau0_4vec.Phi());
447 eclst1->
setTheta(dau1_4vec.Theta());
448 eclst1->
setPhi(dau1_4vec.Phi());
452 const Particle* newDaughter0 = particles.appendNew(
Particle(eclclusters_new[6]));
454 const Particle* newDaughter1 = particles.appendNew(
Particle(eclclusters_new[7]));
460 EXPECT_FLOAT_EQ(var->function(par), 0.73190731);
463 TEST_F(ECLVariableTest, averageECLTimeQuantities)
481 gammalist->initialize(22, gammalist.getName());
483 pionslist->initialize(111, pionslist.getName());
486 for (
int i = 0; i < eclclusters.
getEntries(); ++i) {
487 if (!eclclusters[i]->isTrack()) {
489 gammalist->addParticle(p);
494 ParticleGenerator combiner_pi0(
"pi0:testPizAllList -> gamma:testGammaAllList gamma:testGammaAllList");
496 while (combiner_pi0.loadNext()) {
497 const Particle& particle = combiner_pi0.getCurrentParticle();
499 particles.appendNew(particle);
500 int iparticle = particles.getEntries() - 1;
502 pionslist->addParticle(iparticle, particle.getPDGCode(), particle.getFlavorType());
510 EXPECT_TRUE(std::isnan(weightedAverageECLTime->function(gammalist->getParticle(0))));
513 EXPECT_FLOAT_EQ(weightedAverageECLTime->function(pionslist->getParticle(0)), 1.2);
516 EXPECT_FLOAT_EQ(maxDist->
function(pionslist->getParticle(0)), 4.0);
519 class KLMVariableTest :
public ::testing::Test {
522 void SetUp()
override
529 particles.registerInDataStore();
533 tracks.registerInDataStore();
535 trackFits.registerInDataStore();
537 klmClusters.registerInDataStore();
540 tracks.registerRelationTo(klmClusters);
547 void TearDown()
override
553 TEST_F(KLMVariableTest, WholeEventClosure)
575 kLongList->initialize(130, kLongList.getName());
577 muonsList->initialize(13, muonsList.getName());
579 amuonsList->initialize(-13, amuonsList.getName());
580 amuonsList->bindAntiParticleList(*(muonsList));
586 tracks.appendNew(
Track());
587 tracks.appendNew(
Track());
592 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
594 for (
int i = 0; i < tracks.getEntries(); ++i) {
595 int charge = (i % 2 == 0) ? +1 : -1;
596 TVector2 d(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
597 TVector2 pt(generator.Uniform(-1, 1), generator.Uniform(-1, 1));
598 d.Set(d.X(), -(d.X()*pt.Px()) / pt.Py());
599 TVector3 position(d.X(), d.Y(), generator.Uniform(-1, 1));
600 TVector3 momentum(pt.Px(), pt.Py(), generator.Uniform(-1, 1));
601 trackFits.
appendNew(position, momentum, cov6, charge,
Const::muon, 0.5, 1.5, CDCValue, 16777215, 0);
633 t1->addRelationTo(klm4);
642 t2->addRelationTo(klm5);
643 t3->addRelationTo(klm5);
649 double klmMomentum = 0.0;
650 for (
int i = 0; i < klmClusters.
getEntries(); ++i) {
651 klmMomentum += klmClusters[i]->getMomentumMag();
652 if (!klmClusters[i]->getAssociatedTrackFlag()) {
654 kLongList->addParticle(p);
659 for (
int i = 0; i < tracks.getEntries(); ++i) {
661 muonsList->addParticle(p);
669 double totalKLongMomentum = 0.0;
670 for (
size_t i = 0; i < kLongList->getListSize(); ++i)
671 totalKLongMomentum += vClusterP->
function(kLongList->getParticle(i));
674 double totalMuonMomentum = 0.0;
675 for (
size_t i = 0; i < muonsList->getListSize(); ++i) {
676 double muonMomentum = vClusterP->
function(muonsList->getParticle(i));
677 double nOtherCl = vClNTrack->
function(muonsList->getParticle(i));
679 totalMuonMomentum += muonMomentum / nOtherCl;
682 EXPECT_FLOAT_EQ(5.0, klmMomentum);
683 EXPECT_FLOAT_EQ(totalKLongMomentum + totalMuonMomentum, klmMomentum);
686 TEST_F(KLMVariableTest, TrackToKLMClusterMatchingTest)
694 TVector3 position(1.0, 0, 0);
695 TVector3 momentum(0, 1.0, 0);
698 const float pValue = 0.5;
699 const float bField = 1.5;
700 auto CDCValue =
static_cast<unsigned long long int>(0x300000000000000);
701 trackFits.
appendNew(position, momentum, cov6, charge,
Const::muon, pValue, bField, CDCValue, 16777215, 0);
706 Track* muonTrack = tracks.appendNew(myTrack);
727 float distance1 = 11.1;
729 float distance2 = 2.2;
740 EXPECT_POSITIVE(vTrNClusters->
function(muon));
741 EXPECT_FLOAT_EQ(1.0, vClusterInnermostLayer->
function(muon));
742 EXPECT_FLOAT_EQ(distance1, vClusterTrackDistance->
function(muon));
745 trackFits.
appendNew(position, momentum, cov6, charge,
Const::pion, pValue, bField, CDCValue, 16777215, 0);
748 Track* pionTrack = tracks.appendNew(mySecondTrack);
751 EXPECT_FLOAT_EQ(0.0, vTrNClusters->
function(pion));