Belle II Software  release-06-02-00
initialparticles.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <framework/datastore/DataStore.h>
10 #include <framework/database/DBStore.h>
11 #include <framework/dbobjects/BeamParameters.h>
12 #include <framework/utilities/CalcMeanCov.h>
13 #include <generators/utilities/InitialParticleGeneration.h>
14 
15 #include <gtest/gtest.h>
16 
17 using namespace std;
18 using namespace Belle2;
19 
20 namespace {
21 
24  class InitialParticleGenerationTests : public ::testing::Test {
25  protected:
26 
28  virtual void SetUp()
29  {
30  DataStore::Instance().setInitializeActive(true);
31  generator.initialize();
32  DataStore::Instance().setInitializeActive(false);
33 
34  // have some useful defaults for the beam parameters
35  beamparams.setHER(7.004, 0.0415, 0, {2.63169e-05, 1e-5, 1e-5});
36  beamparams.setLER(4.002, -0.0415, 0, {5.64063e-06, 1e-5, 1e-5});
37  beamparams.setVertex({0, 1, 2}, {4.10916e-07, 0, -2.64802e-06, 0, 1.7405e-11, 0, -2.64802e-06, 0, 0.000237962});
38  }
39 
41  virtual void TearDown()
42  {
43  DataStore::Instance().reset();
44  DBStore::Instance().reset();
45  }
46 
47  InitialParticleGeneration generator{BeamParameters::c_smearALL};
48  BeamParameters beamparams;
49  };
50 
52  TEST_F(InitialParticleGenerationTests, TestCMSGeneration)
53  {
54  beamparams.setGenerationFlags(BeamParameters::c_generateCMS);
55  DBStore::Instance().addConstantOverride("BeamParameters", new BeamParameters(beamparams));
56  auto initialCMS = generator.generate();
57  // transformation should be identity
58  EXPECT_EQ(initialCMS.getLabToCMS(), TLorentzRotation());
59  // her should be along z
60  EXPECT_NEAR(initialCMS.getHER().Theta(), 0, 1e-15);
61  // ler should be opposite z
62  EXPECT_NEAR(initialCMS.getLER().Theta(), M_PI, 1e-15);
63  // both should have the same energy
64  EXPECT_NEAR(initialCMS.getHER().E(), initialCMS.getLER().E(), 1e-15);
65  // and the invariant mass should of course be correct
66  EXPECT_EQ(initialCMS.getMass(), beamparams.getMass());
67 
68  // and now compare it to generation in Lab
69  beamparams.setGenerationFlags(0);
70  DBStore::Instance().addConstantOverride("BeamParameters", new BeamParameters(beamparams));
71  auto initialLAB = generator.generate();
72  // same invariant mass
73  EXPECT_EQ(initialLAB.getMass(), beamparams.getMass());
74  // no smearing so LER and HER need to be identical to beam parameters
75  EXPECT_EQ(initialLAB.getHER(), beamparams.getHER());
76  EXPECT_EQ(initialLAB.getLER(), beamparams.getLER());
77  // so check that the CMS beams are identical to the transformed lab ones
78  EXPECT_EQ(initialCMS.getHER(), initialLAB.getLabToCMS() * initialLAB.getHER());
79  EXPECT_EQ(initialCMS.getLER(), initialLAB.getLabToCMS() * initialLAB.getLER());
80  }
81 
83  TEST_F(InitialParticleGenerationTests, TestEnergySmear)
84  {
85  // two beams completely head on, one with energy uncertainty so invariant
86  // mass uncertainty should be exactly the same as single uncertainty. Here
87  // we give variance so we expect 0.1
88  beamparams.setHER(10, 0, 0, {0.01});
89  beamparams.setLER(10, M_PI, 0, {0});
90  beamparams.setGenerationFlags(BeamParameters::c_smearBeamEnergy);
91  DBStore::Instance().addConstantOverride("BeamParameters", new BeamParameters(beamparams));
92 
93  // so let's generate events with this and store all invariant masses
94  {
95  CalcMeanCov<1> mean;
96  for (int i = 0; i < 100000; ++i) {
97  auto& initial = generator.generate();
98  ASSERT_TRUE(initial.hasGenerationFlags(BeamParameters::c_smearBeamEnergy));
99  mean.add(initial.getMass());
100  }
101  // and compare with expectation
102  EXPECT_NEAR(mean.getStddev(), 0.1, 0.0005);
103  EXPECT_NEAR(mean.getMean(), 20, 0.001);
104  }
105 
106  // uncertainty on both so result should be sqrt(a^2 + b^2) = sqrt(2) * 0.1
107  beamparams.setLER(10, M_PI, 0, {0.01});
108  beamparams.setGenerationFlags(BeamParameters::c_smearBeamEnergy);
109  DBStore::Instance().addConstantOverride("BeamParameters", new BeamParameters(beamparams));
110  {
111  CalcMeanCov<1> mean;
112  for (int i = 0; i < 100000; ++i) {
113  auto& initial = generator.generate();
114  ASSERT_TRUE(initial.hasGenerationFlags(BeamParameters::c_smearBeamEnergy));
115  mean.add(initial.getMass());
116  }
117  EXPECT_NEAR(mean.getStddev(), std::sqrt(2) * 0.1, 0.0005);
118  EXPECT_NEAR(mean.getMean(), 20, 0.001);
119  }
120  }
121 
122 
126  TEST_F(InitialParticleGenerationTests, TestVertexSmear)
127  {
128  beamparams.setGenerationFlags(BeamParameters::c_smearVertex);
129  DBStore::Instance().addConstantOverride("BeamParameters", new BeamParameters(beamparams));
130 
131  CalcMeanCov<3> mean;
132  for (int i = 0; i < 100000; ++i) {
133  auto& initial = generator.generate();
134  mean.add(initial.getVertex().X(), initial.getVertex().Y(), initial.getVertex().Z());
135  }
136  auto cov = beamparams.getCovVertex();
137  auto pos = beamparams.getVertex();
138  for (int i = 0; i < 3; ++i) {
139  EXPECT_NEAR(mean.getMean(i), pos(i), 1e-4);
140  for (int j = 0; j < 3; ++j) {
141  EXPECT_NEAR(mean.getCovariance(i, j), cov(i, j), 1e-6);
142  }
143  }
144  }
145 
154  TEST_F(InitialParticleGenerationTests, TestFlags)
155  {
156  // so loop over all flags
157  for (int flag = 0; flag <= BeamParameters::c_smearALL; ++flag) {
158  // set the flag and overwrite dbstore
159  beamparams.setGenerationFlags(flag);
160  DBStore::Instance().addConstantOverride("BeamParameters", new BeamParameters(beamparams));
161  // rememeber last event and set it to the settings for initialization
162  MCInitialParticles last = beamparams;
163  // no generate a few events and check everything
164  for (int i = 0; i < 5; ++i) {
165  auto& initial = generator.generate();
166  EXPECT_EQ(flag, initial.getGenerationFlags());
167  // create text representation of flags
168  const std::string flags = initial.getGenerationFlagString();
169  if (flag & BeamParameters::c_smearBeam) {
170  // smearing of beam is active, check that the beams are actually
171  // different to the settings and the previous event
172  EXPECT_NE(initial.getHER(), beamparams.getHER()) << flags << " " << i;
173  EXPECT_NE(initial.getLER(), beamparams.getLER()) << flags << " " << i;
174  EXPECT_NE(initial.getHER(), last.getHER()) << flags << " " << i;
175  EXPECT_NE(initial.getLER(), last.getLER()) << flags << " " << i;
176  } else if (!(flag & BeamParameters::c_generateCMS)) {
177  // no smearing no cms generation, so everything should stay fixed.
178  EXPECT_EQ(initial.getHER(), beamparams.getHER()) << flags << " " << i;
179  EXPECT_EQ(initial.getLER(), beamparams.getLER()) << flags << " " << i;
180  EXPECT_EQ(initial.getHER(), last.getHER()) << flags << " " << i;
181  EXPECT_EQ(initial.getLER(), last.getLER()) << flags << " " << i;
182  } else {
183  // we want to compare CMS initial particles to lab beam energies
184  // but transformation is identity if c_generateCMS is set. Reset
185  // it so that the can boost beams to CMS for comparison
186  beamparams.setGenerationFlags(0);
187  EXPECT_EQ(initial.getHER(), beamparams.getLabToCMS() * beamparams.getHER()) << flags << " " << i;
188  EXPECT_EQ(initial.getLER(), beamparams.getLabToCMS() * beamparams.getLER()) << flags << " " << i;
189  // comparison to beamparameters fails in generateCMS so we just
190  // skip the first round here
191  if (i > 0) {
192  EXPECT_EQ(initial.getHER(), last.getHER()) << flags << " " << i;
193  EXPECT_EQ(initial.getLER(), last.getLER()) << flags << " " << i;
194  }
195  }
196  if (flag & BeamParameters::c_smearVertex) {
197  //smearing of the vertex is enabled, make sure the vertex changes
198  EXPECT_NE(initial.getVertex(), beamparams.getVertex());
199  EXPECT_NE(initial.getVertex(), last.getVertex());
200  } else {
201  //otherwise make sure it doesn't change.
202  EXPECT_EQ(initial.getVertex(), beamparams.getVertex());
203  EXPECT_EQ(initial.getVertex(), last.getVertex());
204  }
205  last = initial;
206  }
207  }
208  }
209 
211  TEST_F(InitialParticleGenerationTests, TestValidFlag)
212  {
213  beamparams.setGenerationFlags(0);
214  DBStore::Instance().addConstantOverride("BeamParameters", new BeamParameters(beamparams));
215 
216  MCInitialParticles& initial = generator.generate();
217  TLorentzVector her = initial.getHER();
218  TLorentzVector ler = initial.getLER();
219  TVector3 vertex = initial.getVertex();
220  for (int i = 0; i < 10; ++i) {
221  initial = generator.generate();
222  EXPECT_EQ(her, initial.getHER());
223  EXPECT_EQ(ler, initial.getLER());
224  EXPECT_EQ(vertex, initial.getVertex());
225  }
226  beamparams.setGenerationFlags(BeamParameters::c_smearALL);
227  DBStore::Instance().addConstantOverride("BeamParameters", new BeamParameters(beamparams));
228  for (int i = 0; i < 10; ++i) {
229  initial = generator.generate();
230  EXPECT_NE(her, initial.getHER());
231  EXPECT_NE(ler, initial.getLER());
232  EXPECT_NE(vertex, initial.getVertex());
233  her = initial.getHER();
234  ler = initial.getLER();
235  vertex = initial.getVertex();
236  }
237  }
238 
239  TEST_F(InitialParticleGenerationTests, UpdateVertex)
240  {
241  beamparams.setGenerationFlags(BeamParameters::c_smearBeam);
242  DBStore::Instance().addConstantOverride("BeamParameters", new BeamParameters(beamparams));
243  // first run but no smearing allowed, should return the nominal vertex
244  TVector3 shift = generator.updateVertex();
245  EXPECT_EQ(shift, TVector3(0, 1, 2));
246  // create a new initial particle. Particle exists now, no smearing allowed so no change in shift
247  const MCInitialParticles& initial = generator.generate();
248  auto nominal = initial.getVertex();
249  shift = generator.updateVertex();
250  EXPECT_EQ(shift, TVector3(0, 0, 0));
251  // ok, allow smearing, now we expect shift
252  beamparams.setGenerationFlags(BeamParameters::c_smearALL);
253  DBStore::Instance().addConstantOverride("BeamParameters", new BeamParameters(beamparams));
254  shift = generator.updateVertex();
255  EXPECT_NE(shift, TVector3(0, 0, 0));
256  EXPECT_EQ(nominal + shift, initial.getVertex());
257  // but running again should not shift again
258  shift = generator.updateVertex();
259  EXPECT_EQ(shift, TVector3(0, 0, 0));
260  // unless we force regeneration
261  auto previous = initial.getVertex();
262  shift = generator.updateVertex(true);
263  EXPECT_NE(shift, TVector3(0, 0, 0));
264  EXPECT_EQ(previous + shift, initial.getVertex());
265  }
266 }
This class contains the nominal beam parameters and the parameters used for smearing of the primary v...
Class to calculate mean and and covariance between a number of parameters on running data without sto...
Definition: CalcMeanCov.h:35
This class contains the initial state for the given event.
const TLorentzVector & getLER() const
Get 4vector of the low energy beam.
const TVector3 & getVertex() const
Get the position of the collision.
const TLorentzVector & getHER() const
Get 4vector of the high energy beam.
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
Definition: globalLabel.cc:72
Abstract base class for different kinds of events.