8#include <gtest/gtest.h>
9#include "utilities/TestParticleFactory.h"
11#include <analysis/VariableManager/Manager.h>
12#include <analysis/dataobjects/Particle.h>
13#include <analysis/dataobjects/ParticleList.h>
14#include <analysis/dataobjects/RestOfEvent.h>
15#include <analysis/utility/PCmsLabTransform.h>
17#include <mdst/dataobjects/Track.h>
18#include <mdst/dataobjects/ECLCluster.h>
19#include <mdst/dataobjects/KLMCluster.h>
21#include <framework/datastore/StoreArray.h>
25using namespace Belle2::Variable;
26using namespace ROOT::Math;
29 class ROEVariablesTest :
public ::testing::Test {
35 StoreObjPtr<ParticleList> pi0ParticleList(
"pi0:vartest");
36 StoreObjPtr<ParticleList> b0ParticleList(
"B0:vartest");
40 StoreArray<ECLCluster> myECLClusters;
41 StoreArray<KLMCluster> myKLMClusters;
42 StoreArray<TrackFitResult> myTFRs;
43 StoreArray<Track> myTracks;
44 StoreArray<Particle> myParticles;
45 StoreArray<RestOfEvent> myROEs;
46 StoreObjPtr<RestOfEvent> roeobjptr;
47 StoreArray<PIDLikelihood> myPIDLikelihoods;
60 pi0ParticleList.create();
61 pi0ParticleList->initialize(111,
"pi0:vartest");
62 b0ParticleList.create();
63 b0ParticleList->initialize(521,
"B0:vartest");
67 TestUtilities::TestParticleFactory factory;
68 ROOT::Math::XYZVector ipposition(0, 0, 0);
71 PxPyPzEVector e_momentum(0., 0, halfEcms / 2, halfEcms / 2);
73 PxPyPzEVector p_momentum(0., 0, -halfEcms / 2, halfEcms / 2);
76 PxPyPzEVector b0_momentum(0, 0, 0, halfEcms);
78 factory.
produceParticle(
string(
"^B0 -> e- e+"), b0_momentum, ipposition);
80 myParticles[0]->set4Vector(e_momentum);
81 myParticles[1]->set4Vector(p_momentum);
83 myParticles[0]->print();
84 PxPyPzEVector fsp1_momentum(0., 0, halfEcms / 4, halfEcms / 4);
86 PxPyPzEVector fsp2_momentum(0., 0, -halfEcms / 4, halfEcms / 4);
88 PxPyPzEVector kl_momentum(0., 0, 0.1, 0.5);
90 factory.
produceParticle(
string(
"^B0 -> [pi0 -> gamma gamma] [K_S0 -> pi+ pi-]"), b0_momentum, ipposition);
92 KLMCluster* savedROEKLM = myKLMClusters.
appendNew(myROEKLM);
93 Particle* roeKLMParticle = myParticles.
appendNew(savedROEKLM);
96 myParticles[3]->set4Vector(fsp1_momentum);
97 myParticles[4]->set4Vector(fsp2_momentum);
98 myECLClusters[0]->setEnergy(fsp1_momentum.E());
99 myECLClusters[1]->setEnergy(fsp2_momentum.E());
100 myParticles[6]->set4Vector(fsp1_momentum);
101 myParticles[7]->set4Vector(fsp2_momentum);
102 myParticles[3]->print();
103 myParticles[4]->print();
104 myParticles[7]->set4Vector(kl_momentum);
105 myParticles[7]->print();
108 vector<const Particle*> roeParticlesToAdd;
110 roeParticlesToAdd.push_back(myParticles[3]);
111 roeParticlesToAdd.push_back(myParticles[4]);
112 roeParticlesToAdd.push_back(myParticles[6]);
113 roeParticlesToAdd.push_back(myParticles[7]);
114 roeParticlesToAdd.push_back(roeKLMParticle);
116 RestOfEvent* savedROE = myROEs.
appendNew(roe);
118 myParticles[2]->addRelationTo(savedROE);
121 std::shared_ptr<Variable::Cut> chargedSelection = std::shared_ptr<Variable::Cut>
123 std::shared_ptr<Variable::Cut> photonSelection = std::shared_ptr<Variable::Cut>
125 std::shared_ptr<Variable::Cut> klSelection = std::shared_ptr<Variable::Cut>
128 savedROE->
updateMaskWithCuts(
"my_mask", chargedSelection, photonSelection, klSelection);
129 savedROE->
print(
"my_mask");
136 void TearDown()
override
145 TEST_F(ROEVariablesTest, ROEParticleCompositionVariables)
148 auto part = myParticles[2];
150 ASSERT_NE(var,
nullptr);
151 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 2);
154 ASSERT_NE(var,
nullptr);
155 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 1);
158 ASSERT_NE(var,
nullptr);
159 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 2);
162 ASSERT_NE(var,
nullptr);
163 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 0);
166 ASSERT_NE(var,
nullptr);
167 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 0);
170 ASSERT_NE(var,
nullptr);
171 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 1);
174 ASSERT_NE(var,
nullptr);
175 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 2);
178 ASSERT_NE(var,
nullptr);
179 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 1);
182 ASSERT_NE(var,
nullptr);
183 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 1);
186 ASSERT_NE(var,
nullptr);
187 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 0);
193 TEST_F(ROEVariablesTest, ROETrackClusterCompositionVariables)
196 auto part = myParticles[2];
199 ASSERT_NE(var,
nullptr);
200 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 2);
203 ASSERT_NE(var,
nullptr);
204 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 1);
207 ASSERT_NE(var,
nullptr);
208 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 2);
211 ASSERT_NE(var,
nullptr);
212 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 2);
215 ASSERT_NE(var,
nullptr);
216 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 1);
219 ASSERT_NE(var,
nullptr);
220 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 2);
223 ASSERT_NE(var,
nullptr);
224 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 1);
227 ASSERT_NE(var,
nullptr);
228 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 1);
233 TEST_F(ROEVariablesTest, ROERecoilFrameVariable)
237 auto part = myParticles[2];
238 auto partNotROE = myParticles[0];
241 ASSERT_NE(var,
nullptr);
242 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 5.2986979);
245 roeobjptr.
object = myROEs[0];
246 roeobjptr.
ptr = myROEs[0];
249 ASSERT_NE(var,
nullptr);
250 EXPECT_FLOAT_EQ(std::get<double>(var->function(partNotROE)), 2.801749);
253 roeobjptr.
object =
nullptr;
254 roeobjptr.
ptr =
nullptr;
259 TEST_F(ROEVariablesTest, ROEKinematicsVariables)
262 auto part = myParticles[2];
265 PxPyPzEVector roe4Vec(0, 0, 0, 0);
266 roe4Vec += myParticles[3]->get4Vector();
267 roe4Vec += myParticles[4]->get4Vector();
268 roe4Vec += myParticles[6]->get4Vector();
269 roe4Vec += myParticles[7]->get4Vector();
271 PxPyPzEVector mask4Vec(0, 0, 0, 0);
272 mask4Vec += myParticles[3]->get4Vector();
273 mask4Vec += myParticles[6]->get4Vector();
275 PxPyPzEVector sig4Vec = part->get4Vector();
279 auto roe4VecCMS = T.rotateLabToCms() * roe4Vec;
280 auto mask4VecCMS = T.rotateLabToCms() * mask4Vec;
281 auto sig4VecCMS = T.rotateLabToCms() * sig4Vec;
284 ASSERT_NE(var,
nullptr);
285 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
288 ASSERT_NE(var,
nullptr);
289 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.0);
292 ASSERT_NE(var,
nullptr);
293 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 1.0);
296 ASSERT_NE(var,
nullptr);
297 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), myParticles[3]->getEnergy() + myParticles[4]->getEnergy());
300 ASSERT_NE(var,
nullptr);
301 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), roe4Vec.E());
304 ASSERT_NE(var,
nullptr);
305 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), roe4VecCMS.E());
308 ASSERT_NE(var,
nullptr);
309 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), roe4Vec.mag());
312 ASSERT_NE(var,
nullptr);
313 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), roe4Vec.P());
316 ASSERT_NE(var,
nullptr);
317 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), roe4VecCMS.P());
320 ASSERT_NE(var,
nullptr);
321 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), roe4Vec.Theta());
324 ASSERT_NE(var,
nullptr);
325 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), roe4VecCMS.Theta());
328 ASSERT_NE(var,
nullptr);
329 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), roe4VecCMS.E() - E0);
332 ASSERT_NE(var,
nullptr);
333 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), mask4VecCMS.E() - E0);
336 ASSERT_NE(var,
nullptr);
337 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), TMath::Sqrt(E0 * E0 - roe4VecCMS.P2()));
340 ASSERT_NE(var,
nullptr);
341 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), TMath::Sqrt(E0 * E0 - mask4VecCMS.P2()));
344 ASSERT_NE(var,
nullptr);
345 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), mask4VecCMS.E() + sig4VecCMS.E() - E0);
348 ASSERT_NE(var,
nullptr);
349 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), TMath::Sqrt(E0 * E0 - mask4VecCMS.P2()));
352 ASSERT_NE(var,
nullptr);
353 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), TMath::Sqrt(E0 * E0 - roe4VecCMS.P2()));
355 PxPyPzEVector miss4VecCMS = - (sig4VecCMS + mask4VecCMS);
356 miss4VecCMS.SetE(2 * E0 - (sig4VecCMS.E() + mask4VecCMS.E()));
359 ASSERT_NE(var,
nullptr);
360 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 5.3290705e-15);
363 ASSERT_NE(var,
nullptr);
364 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), miss4VecCMS.P());
367 ASSERT_NE(var,
nullptr);
368 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.);
371 ASSERT_NE(var,
nullptr);
372 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.);
375 ASSERT_NE(var,
nullptr);
376 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), - E0 / 2);
379 ASSERT_NE(var,
nullptr);
380 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), miss4VecCMS.E());
386 TEST_F(ROEVariablesTest, ROESpecificKinematicVariables)
389 auto part = myParticles[2];
392 ASSERT_NE(var,
nullptr);
393 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), -0.99899036);
396 ASSERT_NE(var,
nullptr);
397 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.31122509);
400 ASSERT_NE(var,
nullptr);
401 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 0.);
405 ASSERT_NE(var,
nullptr);
406 EXPECT_FLOAT_EQ(std::get<double>(var->function(part)), 1.9539925e-14);
411 TEST_F(ROEVariablesTest, IsInROEVariables)
414 auto part = myParticles[2];
418 roeobjptr.
object = myROEs[0];
419 roeobjptr.
ptr = myROEs[0];
421 auto partROE1 = myParticles[3];
422 auto partROE2 = myParticles[5];
423 auto partROE3 = myParticles[10];
424 auto partROEnotFromMask = myParticles[7];
425 partROEnotFromMask->print();
427 auto partNotROE = myParticles[0];
430 ASSERT_NE(var,
nullptr);
431 EXPECT_EQ(std::get<bool>(var->function(partROE1)), 1);
434 ASSERT_NE(var,
nullptr);
435 EXPECT_EQ(std::get<bool>(var->function(partROE2)), 1);
438 ASSERT_NE(var,
nullptr);
439 EXPECT_EQ(std::get<bool>(var->function(partROE3)), 1);
442 ASSERT_NE(var,
nullptr);
443 EXPECT_EQ(std::get<bool>(var->function(partNotROE)), 0);
446 ASSERT_NE(var,
nullptr);
447 EXPECT_EQ(std::get<bool>(var->function(partNotROE)), 0);
450 ASSERT_NE(var,
nullptr);
451 EXPECT_FLOAT_EQ(std::get<bool>(var->function(partROE1)), 1);
454 ASSERT_NE(var,
nullptr);
455 EXPECT_FLOAT_EQ(std::get<bool>(var->function(partROE1)), 1);
458 ASSERT_NE(var,
nullptr);
459 EXPECT_FLOAT_EQ(std::get<bool>(var->function(partNotROE)), 0);
462 ASSERT_NE(var,
nullptr);
463 EXPECT_FLOAT_EQ(std::get<bool>(var->function(partROEnotFromMask)), 0);
466 ASSERT_NE(var,
nullptr);
467 EXPECT_FLOAT_EQ(std::get<int>(var->function(part)), 1);
470 ASSERT_NE(var,
nullptr);
471 EXPECT_FLOAT_EQ(std::get<bool>(var->function(partROE1)), 1);
474 ASSERT_NE(var,
nullptr);
475 EXPECT_FLOAT_EQ(std::get<bool>(var->function(partROE1)), 0);
478 ASSERT_NE(var,
nullptr);
479 EXPECT_FLOAT_EQ(std::get<double>(var->function(partROE1)), 511.0);
482 roeobjptr.
object =
nullptr;
483 roeobjptr.
ptr =
nullptr;
@ c_DontWriteOut
Object/array should be NOT saved by output modules.
StoreEntryMap & getStoreEntryMap(EDurability durability)
Get a reference to the object/array map.
@ c_Event
Different object in each event, all objects/arrays are invalidated after event() function has been ca...
Belle2::StoreEntry StoreEntry
Wraps a stored array/object, stored under unique (name, durability) key.
static DataStore & Instance()
Instance of singleton Store.
void setInitializeActive(bool active)
Setter for m_initializeActive.
void reset(EDurability durability)
Frees memory occupied by data store items and removes all objects from the map.
static std::unique_ptr< GeneralCut > compile(const std::string &cut)
@ c_Unflavored
Is its own antiparticle or we don't know whether it is a particle/antiparticle.
void print(const std::string &maskName=c_defaultMaskName, bool unpackComposite=true) const
Prints the contents of a RestOfEvent object to screen.
void initializeMask(const std::string &name, const std::string &origin="unknown")
Initialize new mask.
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 addParticles(const std::vector< const Particle * > &particle)
Add StoreArray indices of given Particles to the list of unused particles in the event.
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.
const Var * getVariable(std::string name)
Get the variable belonging to the given key.
static Manager & Instance()
get singleton instance.
const Belle2::Particle * produceParticle(const std::string &decayString, const ROOT::Math::PxPyPzEVector &momentum, const ROOT::Math::XYZVector &vertex)
Main method to produce particles.
Abstract base class for different kinds of events.
TObject * ptr
The pointer to the returned object, either equal to 'object' or null, depending on whether the object...
TObject * object
The pointer to the actual object.