8 #include <gtest/gtest.h>
9 #include "utilities/TestParticleFactory.h"
11 #include <analysis/VariableManager/Manager.h>
12 #include <analysis/variables/SpecificKinematicVariables.h>
13 #include <analysis/variables/Variables.h>
14 #include <analysis/variables/ROEVariables.h>
15 #include <analysis/dataobjects/Particle.h>
16 #include <analysis/dataobjects/ParticleList.h>
17 #include <analysis/utility/PCmsLabTransform.h>
19 #include <mdst/dataobjects/Track.h>
20 #include <mdst/dataobjects/ECLCluster.h>
21 #include <mdst/dataobjects/KLMCluster.h>
23 #include <framework/datastore/StoreArray.h>
24 #include <framework/logging/Logger.h>
25 #include <framework/gearbox/Gearbox.h>
26 #include <framework/utilities/TestHelpers.h>
28 #include <TLorentzVector.h>
32 using namespace Belle2::Variable;
35 class ROEVariablesTest :
public ::testing::Test {
43 DataStore::Instance().setInitializeActive(
true);
44 pi0ParticleList.registerInDataStore(DataStore::c_DontWriteOut);
45 b0ParticleList.registerInDataStore(DataStore::c_DontWriteOut);
64 DataStore::Instance().setInitializeActive(
false);
66 pi0ParticleList.create();
67 pi0ParticleList->initialize(111,
"pi0:vartest");
68 b0ParticleList.create();
69 b0ParticleList->initialize(521,
"B0:vartest");
74 TVector3 ipposition(0, 0, 0);
77 TLorentzVector e_momentum(0., 0, halfEcms / 2, halfEcms / 2);
79 TLorentzVector p_momentum(0., 0, -halfEcms / 2, halfEcms / 2);
82 TLorentzVector b0_momentum(0, 0, 0, halfEcms);
84 factory.
produceParticle(
string(
"^B0 -> e- e+"), b0_momentum, ipposition);
86 myParticles[0]->set4Vector(e_momentum);
87 myParticles[1]->set4Vector(p_momentum);
89 myParticles[0]->print();
90 TLorentzVector fsp1_momentum(0., 0, halfEcms / 4, halfEcms / 4);
92 TLorentzVector fsp2_momentum(0., 0, -halfEcms / 4, halfEcms / 4);
94 TLorentzVector kl_momentum(0., 0, 0.1, 0.5);
96 factory.
produceParticle(
string(
"^B0 -> [pi0 -> gamma gamma] [K_S0 -> pi+ pi-]"), b0_momentum, ipposition);
102 myParticles[3]->set4Vector(fsp1_momentum);
103 myParticles[4]->set4Vector(fsp2_momentum);
104 myECLClusters[0]->setEnergy(fsp1_momentum.E());
105 myECLClusters[1]->setEnergy(fsp2_momentum.E());
106 myParticles[6]->set4Vector(fsp1_momentum);
107 myParticles[7]->set4Vector(fsp2_momentum);
108 myParticles[3]->print();
109 myParticles[4]->print();
110 myParticles[7]->set4Vector(kl_momentum);
111 myParticles[7]->print();
114 vector<const Particle*> roeParticlesToAdd;
116 roeParticlesToAdd.push_back(myParticles[3]);
117 roeParticlesToAdd.push_back(myParticles[4]);
118 roeParticlesToAdd.push_back(myParticles[6]);
119 roeParticlesToAdd.push_back(myParticles[7]);
120 roeParticlesToAdd.push_back(roeKLMParticle);
124 myParticles[2]->addRelationTo(savedROE);
127 std::shared_ptr<Variable::Cut> chargedSelection = std::shared_ptr<Variable::Cut>
128 (Variable::Cut::compile(
"charge > 0"));
129 std::shared_ptr<Variable::Cut> photonSelection = std::shared_ptr<Variable::Cut>
130 (Variable::Cut::compile(
"p > 1.5"));
131 std::shared_ptr<Variable::Cut> klSelection = std::shared_ptr<Variable::Cut>
132 (Variable::Cut::compile(
"E < 0"));
134 savedROE->
updateMaskWithCuts(
"my_mask", chargedSelection, photonSelection, klSelection);
135 savedROE->
print(
"my_mask");
137 pi0ParticleList->addParticle(5, 111, Particle::c_Unflavored);
138 b0ParticleList->addParticle(2, 521, Particle::c_Unflavored);
142 void TearDown()
override
144 DataStore::Instance().reset();
151 TEST_F(ROEVariablesTest, ROEParticleCompositionVariables)
154 auto part = myParticles[2];
155 auto* var = Manager::Instance().getVariable(
"nROE_Charged()");
156 ASSERT_NE(var,
nullptr);
157 EXPECT_FLOAT_EQ(var->function(part), 2.0);
159 var = Manager::Instance().getVariable(
"nROE_Charged(my_mask)");
160 ASSERT_NE(var,
nullptr);
161 EXPECT_FLOAT_EQ(var->function(part), 1.0);
163 var = Manager::Instance().getVariable(
"nROE_Charged(my_mask, 13)");
164 ASSERT_NE(var,
nullptr);
165 EXPECT_FLOAT_EQ(var->function(part), 0.0);
167 var = Manager::Instance().getVariable(
"nROE_Charged(my_mask, 211)");
168 ASSERT_NE(var,
nullptr);
169 EXPECT_FLOAT_EQ(var->function(part), 1.0);
171 var = Manager::Instance().getVariable(
"nROE_Photons()");
172 ASSERT_NE(var,
nullptr);
173 EXPECT_FLOAT_EQ(var->function(part), 2.0);
175 var = Manager::Instance().getVariable(
"nROE_Photons(my_mask)");
176 ASSERT_NE(var,
nullptr);
177 EXPECT_FLOAT_EQ(var->function(part), 1.0);
179 var = Manager::Instance().getVariable(
"nROE_NeutralHadrons()");
180 ASSERT_NE(var,
nullptr);
181 EXPECT_FLOAT_EQ(var->function(part), 1.0);
183 var = Manager::Instance().getVariable(
"nROE_NeutralHadrons(my_mask)");
184 ASSERT_NE(var,
nullptr);
185 EXPECT_FLOAT_EQ(var->function(part), 0.0);
191 TEST_F(ROEVariablesTest, ROETrackClusterCompositionVariables)
194 auto part = myParticles[2];
196 auto* var = Manager::Instance().getVariable(
"nROE_Tracks()");
197 ASSERT_NE(var,
nullptr);
198 EXPECT_FLOAT_EQ(var->function(part), 2.0);
200 var = Manager::Instance().getVariable(
"nROE_Tracks(my_mask)");
201 ASSERT_NE(var,
nullptr);
202 EXPECT_FLOAT_EQ(var->function(part), 1.0);
204 var = Manager::Instance().getVariable(
"nROE_ECLClusters()");
205 ASSERT_NE(var,
nullptr);
206 EXPECT_FLOAT_EQ(var->function(part), 2.0);
208 var = Manager::Instance().getVariable(
"nROE_ECLClusters(my_mask)");
209 ASSERT_NE(var,
nullptr);
210 EXPECT_FLOAT_EQ(var->function(part), 1.0);
212 var = Manager::Instance().getVariable(
"nROE_NeutralECLClusters()");
213 ASSERT_NE(var,
nullptr);
214 EXPECT_FLOAT_EQ(var->function(part), 2.0);
216 var = Manager::Instance().getVariable(
"nROE_NeutralECLClusters(my_mask)");
217 ASSERT_NE(var,
nullptr);
218 EXPECT_FLOAT_EQ(var->function(part), 1.0);
220 var = Manager::Instance().getVariable(
"nROE_KLMClusters");
221 ASSERT_NE(var,
nullptr);
222 EXPECT_FLOAT_EQ(var->function(part), 1.0);
227 TEST_F(ROEVariablesTest, ROERecoilFrameVariable)
231 auto part = myParticles[2];
232 auto partNotROE = myParticles[0];
234 auto* var = Manager::Instance().getVariable(
"useROERecoilFrame(E)");
235 ASSERT_NE(var,
nullptr);
236 EXPECT_FLOAT_EQ(var->function(part), 5.2959199);
238 DataStore::StoreEntry& roeobjptr = DataStore::Instance().getStoreEntryMap(DataStore::c_Event).at(
"RestOfEvent");
239 roeobjptr.
object = myROEs[0];
240 roeobjptr.
ptr = myROEs[0];
242 var = Manager::Instance().getVariable(
"useROERecoilFrame(E)");
243 ASSERT_NE(var,
nullptr);
244 EXPECT_FLOAT_EQ(var->function(partNotROE), 2.8002837);
247 roeobjptr.
object =
nullptr;
248 roeobjptr.
ptr =
nullptr;
253 TEST_F(ROEVariablesTest, ROEKinematicsVariables)
256 auto part = myParticles[2];
259 TLorentzVector roe4Vec(0, 0, 0, 0);
260 roe4Vec += myParticles[3]->get4Vector();
261 roe4Vec += myParticles[4]->get4Vector();
262 roe4Vec += myParticles[6]->get4Vector();
263 roe4Vec += myParticles[7]->get4Vector();
265 TLorentzVector mask4Vec(0, 0, 0, 0);
266 mask4Vec += myParticles[3]->get4Vector();
267 mask4Vec += myParticles[6]->get4Vector();
269 TLorentzVector sig4Vec = part->get4Vector();
277 auto* var = Manager::Instance().getVariable(
"roeCharge()");
278 ASSERT_NE(var,
nullptr);
279 EXPECT_FLOAT_EQ(var->function(part), 0.0);
281 var = Manager::Instance().getVariable(
"roeCharge(my_mask)");
282 ASSERT_NE(var,
nullptr);
283 EXPECT_FLOAT_EQ(var->function(part), 1.0);
285 var = Manager::Instance().getVariable(
"roeEextra()");
286 ASSERT_NE(var,
nullptr);
287 EXPECT_FLOAT_EQ(var->function(part), myParticles[3]->getEnergy() + myParticles[4]->getEnergy());
289 var = Manager::Instance().getVariable(
"roeE()");
290 ASSERT_NE(var,
nullptr);
291 EXPECT_FLOAT_EQ(var->function(part), roe4Vec.E());
293 var = Manager::Instance().getVariable(
"useCMSFrame(roeE())");
294 ASSERT_NE(var,
nullptr);
295 EXPECT_FLOAT_EQ(var->function(part), roe4VecCMS.E());
297 var = Manager::Instance().getVariable(
"roeM()");
298 ASSERT_NE(var,
nullptr);
299 EXPECT_FLOAT_EQ(var->function(part), roe4Vec.Mag());
301 var = Manager::Instance().getVariable(
"roeP()");
302 ASSERT_NE(var,
nullptr);
303 EXPECT_FLOAT_EQ(var->function(part), roe4Vec.P());
305 var = Manager::Instance().getVariable(
"useCMSFrame(roeP())");
306 ASSERT_NE(var,
nullptr);
307 EXPECT_FLOAT_EQ(var->function(part), roe4VecCMS.P());
309 var = Manager::Instance().getVariable(
"roePTheta()");
310 ASSERT_NE(var,
nullptr);
311 EXPECT_FLOAT_EQ(var->function(part), roe4Vec.Theta());
313 var = Manager::Instance().getVariable(
"useCMSFrame(roePTheta())");
314 ASSERT_NE(var,
nullptr);
315 EXPECT_FLOAT_EQ(var->function(part), roe4VecCMS.Theta());
317 var = Manager::Instance().getVariable(
"roeDeltae()");
318 ASSERT_NE(var,
nullptr);
319 EXPECT_FLOAT_EQ(var->function(part), roe4VecCMS.E() - E0);
321 var = Manager::Instance().getVariable(
"roeDeltae(my_mask)");
322 ASSERT_NE(var,
nullptr);
323 EXPECT_FLOAT_EQ(var->function(part), mask4VecCMS.E() - E0);
325 var = Manager::Instance().getVariable(
"roeMbc()");
326 ASSERT_NE(var,
nullptr);
327 EXPECT_FLOAT_EQ(var->function(part), TMath::Sqrt(E0 * E0 - roe4VecCMS.Vect().Mag2()));
329 var = Manager::Instance().getVariable(
"roeMbc(my_mask)");
330 ASSERT_NE(var,
nullptr);
331 EXPECT_FLOAT_EQ(var->function(part), TMath::Sqrt(E0 * E0 - mask4VecCMS.Vect().Mag2()));
333 var = Manager::Instance().getVariable(
"weDeltae(my_mask,0)");
334 ASSERT_NE(var,
nullptr);
335 EXPECT_FLOAT_EQ(var->function(part), mask4VecCMS.E() + sig4VecCMS.E() - E0);
337 var = Manager::Instance().getVariable(
"weMbc(my_mask,0)");
338 ASSERT_NE(var,
nullptr);
339 EXPECT_FLOAT_EQ(var->function(part), TMath::Sqrt(E0 * E0 - mask4VecCMS.Vect().Mag2()));
341 TLorentzVector miss4VecCMS(0, 0, 0, 0);
342 miss4VecCMS.SetVect(- (sig4VecCMS.Vect() + mask4VecCMS.Vect()));
343 miss4VecCMS.SetE(2 * E0 - (sig4VecCMS.E() + mask4VecCMS.E()));
345 var = Manager::Instance().getVariable(
"weMissM2(my_mask,0)");
346 ASSERT_NE(var,
nullptr);
347 EXPECT_FLOAT_EQ(var->function(part), miss4VecCMS.Mag2());
349 var = Manager::Instance().getVariable(
"weMissP(my_mask,0)");
350 ASSERT_NE(var,
nullptr);
351 EXPECT_FLOAT_EQ(var->function(part), miss4VecCMS.P());
353 var = Manager::Instance().getVariable(
"weMissE(my_mask,0)");
354 ASSERT_NE(var,
nullptr);
355 EXPECT_FLOAT_EQ(var->function(part), miss4VecCMS.E());
361 TEST_F(ROEVariablesTest, ROESpecificKinematicVariables)
364 auto part = myParticles[2];
366 TLorentzVector sig4Vec = part->get4Vector();
368 auto* var = Manager::Instance().getVariable(
"bssMassDifference()");
369 ASSERT_NE(var,
nullptr);
370 EXPECT_FLOAT_EQ(var->function(part), sig4Vec.M());
372 var = Manager::Instance().getVariable(
"weCosThetaEll()");
373 ASSERT_NE(var,
nullptr);
374 EXPECT_FLOAT_EQ(var->function(part), -0.99858648);
376 var = Manager::Instance().getVariable(
"weXiZ()");
377 ASSERT_NE(var,
nullptr);
378 EXPECT_FLOAT_EQ(var->function(part), 0.31121328);
380 var = Manager::Instance().getVariable(
"weQ2lnuSimple(my_mask,0)");
381 ASSERT_NE(var,
nullptr);
382 EXPECT_FLOAT_EQ(var->function(part), -2.1852231e-06);
386 var = Manager::Instance().getVariable(
"weQ2lnu(my_mask,0)");
387 ASSERT_NE(var,
nullptr);
388 EXPECT_FLOAT_EQ(var->function(part), -2.1852231e-06);
393 TEST_F(ROEVariablesTest, IsInROEVariables)
396 auto part = myParticles[2];
399 DataStore::StoreEntry& roeobjptr = DataStore::Instance().getStoreEntryMap(DataStore::c_Event).at(
"RestOfEvent");
400 roeobjptr.
object = myROEs[0];
401 roeobjptr.
ptr = myROEs[0];
403 auto partROE1 = myParticles[3];
404 auto partROE2 = myParticles[5];
405 auto partROE3 = myParticles[10];
406 auto partROEnotFromMask = myParticles[7];
407 partROEnotFromMask->print();
409 auto partNotROE = myParticles[0];
411 auto* var = Manager::Instance().getVariable(
"isInRestOfEvent");
412 ASSERT_NE(var,
nullptr);
413 EXPECT_FLOAT_EQ(var->function(partROE1), 1.0);
415 var = Manager::Instance().getVariable(
"isInRestOfEvent");
416 ASSERT_NE(var,
nullptr);
417 EXPECT_FLOAT_EQ(var->function(partROE2), 1.0);
419 var = Manager::Instance().getVariable(
"isInRestOfEvent");
420 ASSERT_NE(var,
nullptr);
421 EXPECT_FLOAT_EQ(var->function(partROE3), 1.0);
423 var = Manager::Instance().getVariable(
"isInRestOfEvent");
424 ASSERT_NE(var,
nullptr);
425 EXPECT_FLOAT_EQ(var->function(partNotROE), 0.0);
427 var = Manager::Instance().getVariable(
"isInRestOfEvent");
428 ASSERT_NE(var,
nullptr);
429 EXPECT_FLOAT_EQ(var->function(partNotROE), 0.0);
431 var = Manager::Instance().getVariable(
"passesROEMask(my_mask)");
432 ASSERT_NE(var,
nullptr);
433 EXPECT_FLOAT_EQ(var->function(partROE1), 1.0);
435 var = Manager::Instance().getVariable(
"passesROEMask(my_mask)");
436 ASSERT_NE(var,
nullptr);
437 EXPECT_FLOAT_EQ(var->function(partROEnotFromMask), 0.0);
439 var = Manager::Instance().getVariable(
"nROE_ParticlesInList(pi0:vartest)");
440 ASSERT_NE(var,
nullptr);
441 EXPECT_FLOAT_EQ(var->function(part), 1.0);
443 var = Manager::Instance().getVariable(
"currentROEIsInList(B0:vartest)");
444 ASSERT_NE(var,
nullptr);
445 EXPECT_FLOAT_EQ(var->function(partROE1), 1.0);
447 var = Manager::Instance().getVariable(
"currentROEIsInList(pi0:vartest)");
448 ASSERT_NE(var,
nullptr);
449 EXPECT_FLOAT_EQ(var->function(partROE1), 0.0);
451 var = Manager::Instance().getVariable(
"particleRelatedToCurrentROE(PDG)");
452 ASSERT_NE(var,
nullptr);
453 EXPECT_FLOAT_EQ(var->function(partROE1), 511.0);
456 roeobjptr.
object =
nullptr;
457 roeobjptr.
ptr =
nullptr;
Class to store reconstructed particles.
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.
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.
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.
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.
Wraps a stored array/object, stored under unique (name, durability) key.
TObject * ptr
The pointer to the returned object, either equal to 'object' or null, depending on wether the object ...
TObject * object
The pointer to the actual object.