8 #include <gtest/gtest.h>
9 #include "utilities/TestParticleFactory.h"
10 #include <analysis/dataobjects/Particle.h>
11 #include <analysis/VariableManager/Manager.h>
12 #include <analysis/dataobjects/RestOfEvent.h>
14 #include <analysis/VariableManager/Utility.h>
15 #include <analysis/utility/PCmsLabTransform.h>
16 #include <analysis/utility/ReferenceFrame.h>
18 #include <framework/datastore/StoreArray.h>
19 #include <framework/logging/Logger.h>
20 #include <mdst/dataobjects/Track.h>
21 #include <mdst/dataobjects/ECLCluster.h>
22 #include <mdst/dataobjects/KLMCluster.h>
23 #include <framework/gearbox/Gearbox.h>
24 #include <TLorentzVector.h>
28 using namespace Belle2::Variable;
30 class ROETest :
public ::testing::Test {
36 DataStore::Instance().setInitializeActive(
true);
53 DataStore::Instance().setInitializeActive(
false);
56 TVector3 ipposition(0, 0, 0);
57 TLorentzVector ksmomentum(1, 0, 0, 3);
58 TVector3 ksposition(1.0, 0, 0);
62 auto* ksParticle = factory.
produceParticle(
string(
"^K_S0 -> ^pi+ ^pi-"), ksmomentum, ksposition);
63 TLorentzVector d0momentum(-2, 0, 0, 4);
64 auto* d0Particle = factory.
produceParticle(
string(
"^D0 -> ^K+ ^pi-"), d0momentum, ipposition);
65 TLorentzVector pi0momentum(-0.2, 0, 0, 1);
66 auto* pi0Particle = factory.
produceParticle(
string(
"^pi0 -> ^gamma ^gamma"), pi0momentum, ipposition);
67 TLorentzVector b0momentum(3, 0, 0, 5);
68 factory.
produceParticle(
string(
"^B0 -> [^K_S0 -> ^pi+ ^pi-] [^pi0 -> ^gamma ^gamma] ^gamma"), b0momentum, ipposition);
71 vector<const Particle*> roeParticles;
72 roeParticles.push_back(ksParticle->getDaughter(0));
73 roeParticles.push_back(ksParticle->getDaughter(1));
74 roeParticles.push_back(d0Particle->getDaughter(0));
75 roeParticles.push_back(d0Particle->getDaughter(1));
76 roeParticles.push_back(pi0Particle->getDaughter(0));
77 roeParticles.push_back(pi0Particle->getDaughter(1));
81 std::shared_ptr<Variable::Cut> trackSelection = std::shared_ptr<Variable::Cut>(Variable::Cut::compile(
"p > 1.5"));
83 std::shared_ptr<Variable::Cut> eclSelection = std::shared_ptr<Variable::Cut>(Variable::Cut::compile(
"p > 1"));
86 vector<const Particle*> excludeParticles = {ksParticle->getDaughter(1), d0Particle->getDaughter(0)};
99 void TearDown()
override
101 DataStore::Instance().reset();
105 TEST_F(ROETest, hasParticle)
107 Gearbox& gearbox = Gearbox::getInstance();
108 gearbox.setBackends({std::string(
"file:")});
110 gearbox.open(
"geometry/Belle2.xml",
false);
128 TEST_F(ROETest, useROERecoilFrame)
130 Gearbox& gearbox = Gearbox::getInstance();
131 gearbox.setBackends({std::string(
"file:")});
133 gearbox.open(
"geometry/Belle2.xml",
false);
138 DataStore::Instance().setInitializeActive(
true);
140 DataStore::Instance().setInitializeActive(
false);
141 myParticles[14]->addRelationTo(myROEs[0]);
142 myROEObject.
assign(myROEs[0]);
151 const Manager::Var* var = Manager::Instance().getVariable(
"useROERecoilFrame(p)");
152 ASSERT_NE(var,
nullptr);
153 EXPECT_FLOAT_EQ(var->function(myParticles[5]), frame.getMomentum(myParticles[5]->get4Vector()).P());
154 EXPECT_FLOAT_EQ(var->function(myParticles[14]), frame.getMomentum(myParticles[14]->get4Vector()).P());
155 var = Manager::Instance().getVariable(
"useROERecoilFrame(E)");
156 ASSERT_NE(var,
nullptr);
157 EXPECT_FLOAT_EQ(var->function(myParticles[5]), frame.getMomentum(myParticles[5]->get4Vector()).E());
158 EXPECT_FLOAT_EQ(var->function(myParticles[14]), frame.getMomentum(myParticles[14]->get4Vector()).E());
160 DataStore::Instance().setInitializeActive(
true);
161 DataStore::Instance().getEntry(myROEObject)->object =
nullptr;
162 DataStore::Instance().setInitializeActive(
false);
165 TEST_F(ROETest, getParticles)
178 TEST_F(ROETest, updateMaskWithCuts)
184 EXPECT_FALSE(roe->
hasParticle(myParticles[0],
"cutMask"));
185 EXPECT_FALSE(roe->
hasParticle(myParticles[1],
"cutMask"));
186 EXPECT_TRUE(roe->
hasParticle(myParticles[3],
"cutMask"));
187 EXPECT_TRUE(roe->
hasParticle(myParticles[4],
"cutMask"));
188 EXPECT_FALSE(roe->
hasParticle(myParticles[6],
"cutMask"));
189 EXPECT_FALSE(roe->
hasParticle(myParticles[7],
"cutMask"));
191 TEST_F(ROETest, excludeParticlesFromMask)
197 EXPECT_TRUE(roe->
hasParticle(myParticles[0],
"excludeMask"));
198 EXPECT_FALSE(roe->
hasParticle(myParticles[1],
"excludeMask"));
199 EXPECT_FALSE(roe->
hasParticle(myParticles[3],
"excludeMask"));
200 EXPECT_TRUE(roe->
hasParticle(myParticles[4],
"excludeMask"));
201 EXPECT_TRUE(roe->
hasParticle(myParticles[6],
"excludeMask"));
202 EXPECT_TRUE(roe->
hasParticle(myParticles[7],
"excludeMask"));
204 EXPECT_TRUE(!roe->
hasParticle(myParticles[0],
"keepMask"));
205 EXPECT_FALSE(!roe->
hasParticle(myParticles[1],
"keepMask"));
206 EXPECT_FALSE(!roe->
hasParticle(myParticles[3],
"keepMask"));
207 EXPECT_TRUE(!roe->
hasParticle(myParticles[4],
"keepMask"));
209 EXPECT_TRUE(roe->
hasParticle(myParticles[6],
"keepMask"));
210 EXPECT_TRUE(roe->
hasParticle(myParticles[7],
"keepMask"));
212 TEST_F(ROETest, updateMaskWithV0)
218 EXPECT_TRUE(roe->
hasParticle(myParticles[0],
"V0Mask"));
219 EXPECT_TRUE(roe->
hasParticle(myParticles[1],
"V0Mask"));
220 EXPECT_TRUE(roe->
hasParticle(myParticles[3],
"V0Mask"));
221 EXPECT_TRUE(roe->
hasParticle(myParticles[4],
"V0Mask"));
222 EXPECT_TRUE(roe->
hasParticle(myParticles[6],
"V0Mask"));
223 EXPECT_TRUE(roe->
hasParticle(myParticles[7],
"V0Mask"));
225 auto v0maskParticles = roe->
getParticles(
"V0Mask",
false);
227 auto v0maskParticlesUnpacked = roe->
getParticles(
"V0Mask",
true);
228 B2INFO(
"packed size is " << v0maskParticles.size());
229 for (
auto* particle : v0maskParticles) {
230 B2INFO(
"My pdg: " << particle->getPDGCode());
232 B2INFO(
"unpacked size is " << v0maskParticlesUnpacked.size());
233 for (
auto* particle : v0maskParticlesUnpacked) {
234 B2INFO(
"My pdg: " << particle->getPDGCode());
236 EXPECT_FLOAT_EQ(v0maskParticles.size() , 5);
237 EXPECT_FLOAT_EQ(v0maskParticlesUnpacked.size() , 6);
Singleton class responsible for loading detector parameters from an XML file.
Class to store reconstructed particles.
Rest frame of a particle.
This is a general purpose class for collecting reconstructed MDST data objects that are not used in r...
void initializeMask(const std::string &name, const std::string &origin="unknown")
Initialize new mask.
bool hasParticle(const Particle *particle, const std::string &maskName="") const
Check if ROE has StoreArray index of given to the list of unused tracks in the event.
void updateMaskWithCuts(const std::string &name, const std::shared_ptr< Variable::Cut > &trackCut=nullptr, const std::shared_ptr< Variable::Cut > &eclCut=nullptr, const std::shared_ptr< Variable::Cut > &klmCut=nullptr, bool updateExisting=false)
Update mask with cuts.
void print(const std::string &maskName="", bool unpackComposite=true) const
Prints the contents of a RestOfEvent object to screen.
std::vector< const Particle * > getChargedParticles(const std::string &maskName="", unsigned int pdg=0, bool unpackComposite=true) const
Get charged particles from ROE mask.
std::vector< const Particle * > getHadrons(const std::string &maskName="", bool unpackComposite=true) const
Get hadrons from ROE mask.
std::vector< const Particle * > getParticles(const std::string &maskName="", bool unpackComposite=true) const
Get all Particles from ROE mask.
void addParticles(const std::vector< const Particle * > &particle)
Add StoreArray indices of given Particles to the list of unused particles in the event.
void updateMaskWithV0(const std::string &name, const Particle *particleV0)
Update mask with composite particle.
void excludeParticlesFromMask(const std::string &maskName, const std::vector< const Particle * > &particles, Particle::EParticleSourceObject listType, bool discard)
Update mask by keeping or excluding particles.
std::vector< const Particle * > getPhotons(const std::string &maskName="", bool unpackComposite=true) const
Get photons from ROE mask.
bool assign(TObject *object, bool replace=false)
Assign 'object' to this accessor.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Accessor to arrays stored in the data store.
T * appendNew()
Construct a new T object at the end of the 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.
This is a class, which generates DataStore particles, according to the provided decay string e....
const Belle2::Particle * produceParticle(const std::string &decayString, const TLorentzVector &momentum, const TVector3 &vertex)
Main method to produce particles.
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
Abstract base class for different kinds of events.
A variable returning a floating-point value for a given Particle.