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>
15 #include <gtest/gtest.h>
24 class InitialParticleGenerationTests :
public ::testing::Test {
30 DataStore::Instance().setInitializeActive(
true);
31 generator.initialize();
32 DataStore::Instance().setInitializeActive(
false);
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});
41 virtual void TearDown()
43 DataStore::Instance().reset();
44 DBStore::Instance().reset();
52 TEST_F(InitialParticleGenerationTests, TestCMSGeneration)
54 beamparams.setGenerationFlags(BeamParameters::c_generateCMS);
55 DBStore::Instance().addConstantOverride(
"BeamParameters",
new BeamParameters(beamparams));
56 auto initialCMS = generator.generate();
58 EXPECT_EQ(initialCMS.getLabToCMS(), TLorentzRotation());
60 EXPECT_NEAR(initialCMS.getHER().Theta(), 0, 1e-15);
62 EXPECT_NEAR(initialCMS.getLER().Theta(), M_PI, 1e-15);
64 EXPECT_NEAR(initialCMS.getHER().E(), initialCMS.getLER().E(), 1e-15);
66 EXPECT_EQ(initialCMS.getMass(), beamparams.getMass());
69 beamparams.setGenerationFlags(0);
70 DBStore::Instance().addConstantOverride(
"BeamParameters",
new BeamParameters(beamparams));
71 auto initialLAB = generator.generate();
73 EXPECT_EQ(initialLAB.getMass(), beamparams.getMass());
75 EXPECT_EQ(initialLAB.getHER(), beamparams.getHER());
76 EXPECT_EQ(initialLAB.getLER(), beamparams.getLER());
78 EXPECT_EQ(initialCMS.getHER(), initialLAB.getLabToCMS() * initialLAB.getHER());
79 EXPECT_EQ(initialCMS.getLER(), initialLAB.getLabToCMS() * initialLAB.getLER());
83 TEST_F(InitialParticleGenerationTests, TestEnergySmear)
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));
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());
102 EXPECT_NEAR(mean.getStddev(), 0.1, 0.0005);
103 EXPECT_NEAR(mean.getMean(), 20, 0.001);
107 beamparams.setLER(10, M_PI, 0, {0.01});
108 beamparams.setGenerationFlags(BeamParameters::c_smearBeamEnergy);
109 DBStore::Instance().addConstantOverride(
"BeamParameters",
new BeamParameters(beamparams));
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());
117 EXPECT_NEAR(mean.getStddev(), std::sqrt(2) * 0.1, 0.0005);
118 EXPECT_NEAR(mean.getMean(), 20, 0.001);
126 TEST_F(InitialParticleGenerationTests, TestVertexSmear)
128 beamparams.setGenerationFlags(BeamParameters::c_smearVertex);
129 DBStore::Instance().addConstantOverride(
"BeamParameters",
new BeamParameters(beamparams));
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());
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);
154 TEST_F(InitialParticleGenerationTests, TestFlags)
157 for (
int flag = 0; flag <= BeamParameters::c_smearALL; ++flag) {
159 beamparams.setGenerationFlags(flag);
160 DBStore::Instance().addConstantOverride(
"BeamParameters",
new BeamParameters(beamparams));
164 for (
int i = 0; i < 5; ++i) {
165 auto& initial = generator.generate();
166 EXPECT_EQ(flag, initial.getGenerationFlags());
168 const std::string flags = initial.getGenerationFlagString();
169 if (flag & BeamParameters::c_smearBeam) {
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)) {
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;
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;
192 EXPECT_EQ(initial.getHER(), last.
getHER()) << flags <<
" " << i;
193 EXPECT_EQ(initial.getLER(), last.
getLER()) << flags <<
" " << i;
196 if (flag & BeamParameters::c_smearVertex) {
198 EXPECT_NE(initial.getVertex(), beamparams.getVertex());
199 EXPECT_NE(initial.getVertex(), last.
getVertex());
202 EXPECT_EQ(initial.getVertex(), beamparams.getVertex());
203 EXPECT_EQ(initial.getVertex(), last.
getVertex());
211 TEST_F(InitialParticleGenerationTests, TestValidFlag)
213 beamparams.setGenerationFlags(0);
214 DBStore::Instance().addConstantOverride(
"BeamParameters",
new BeamParameters(beamparams));
217 TLorentzVector her = initial.
getHER();
218 TLorentzVector ler = initial.
getLER();
220 for (
int i = 0; i < 10; ++i) {
221 initial = generator.generate();
222 EXPECT_EQ(her, initial.
getHER());
223 EXPECT_EQ(ler, initial.
getLER());
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());
239 TEST_F(InitialParticleGenerationTests, UpdateVertex)
241 beamparams.setGenerationFlags(BeamParameters::c_smearBeam);
242 DBStore::Instance().addConstantOverride(
"BeamParameters",
new BeamParameters(beamparams));
244 TVector3 shift = generator.updateVertex();
245 EXPECT_EQ(shift, TVector3(0, 1, 2));
249 shift = generator.updateVertex();
250 EXPECT_EQ(shift, TVector3(0, 0, 0));
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());
258 shift = generator.updateVertex();
259 EXPECT_EQ(shift, TVector3(0, 0, 0));
262 shift = generator.updateVertex(
true);
263 EXPECT_NE(shift, TVector3(0, 0, 0));
264 EXPECT_EQ(previous + shift, initial.
getVertex());
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...
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.
Abstract base class for different kinds of events.