OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
TestBeam.cpp
Go to the documentation of this file.
1#include <gtest/gtest.h>
2
5#include "Structure/Beam.h"
7#include "Utilities/Options.h"
8
9#include <vector>
10
11namespace {
12
13 class BeamPhotonTest : public ::testing::Test {
14 protected:
15 void setParticle(Beam& beam, const std::string& name) {
16 Attributes::setPredefinedString(*beam.findAttribute("PARTICLE"), name);
17 }
18
19 void setEnergy(Beam& beam, double value) {
20 Attributes::setReal(*beam.findAttribute("ENERGY"), value);
21 }
22
23 void setGamma(Beam& beam, double value) {
24 Attributes::setReal(*beam.findAttribute("GAMMA"), value);
25 }
26
27 void setPC(Beam& beam, double value) {
28 Attributes::setReal(*beam.findAttribute("PC"), value);
29 }
30
31 void setMass(Beam& beam, double value) {
32 Attributes::setReal(*beam.findAttribute("MASS"), value);
33 }
34
35 void setCharge(Beam& beam, double value) {
36 Attributes::setReal(*beam.findAttribute("CHARGE"), value);
37 }
38
39 void setSources(Beam& beam, const std::string& value) {
40 Attributes::setString(*beam.findAttribute("SOURCES"), value);
41 }
42
43 void setNALLOC(Beam& beam, double value) {
44 Attributes::setReal(*beam.findAttribute("NALLOC"), value);
45 }
46
47 void makeValidPhotonBeam(Beam& beam) {
48 setParticle(beam, "PHOTON");
49 setEnergy(beam, 5.0);
50 setNALLOC(beam, 1.0);
51 }
52 };
53
54 TEST_F(BeamPhotonTest, PhotonParticlePropertiesAreRegistered) {
59 }
60
61 TEST_F(BeamPhotonTest, PhotonBeamAcceptsEnergyOnlyDefinition) {
62 Beam beam;
63 makeValidPhotonBeam(beam);
64
65 EXPECT_NO_THROW(beam.execute());
66 EXPECT_TRUE(beam.isPhoton());
67 EXPECT_DOUBLE_EQ(beam.getMass(), 0.0);
68 EXPECT_DOUBLE_EQ(beam.getCharge(), 0.0);
69 }
70
71 TEST_F(BeamPhotonTest, PhotonBeamRequiresEnergy) {
72 Beam beam;
73 setParticle(beam, "PHOTON");
74 setNALLOC(beam, 1.0);
75
76 EXPECT_THROW(beam.execute(), OpalException);
77 }
78
79 TEST_F(BeamPhotonTest, PhotonBeamRejectsGamma) {
80 Beam beam;
81 makeValidPhotonBeam(beam);
82 setGamma(beam, 10.0);
83
84 EXPECT_THROW(beam.execute(), OpalException);
85 }
86
87 TEST_F(BeamPhotonTest, PhotonBeamRejectsMomentum) {
88 Beam beam;
89 makeValidPhotonBeam(beam);
90 setPC(beam, 1.0);
91
92 EXPECT_THROW(beam.execute(), OpalException);
93 }
94
95 TEST_F(BeamPhotonTest, PhotonBeamRejectsExplicitMassAndCharge) {
96 Beam beam;
97 makeValidPhotonBeam(beam);
98 setMass(beam, 1.0);
99
100 EXPECT_THROW(beam.execute(), OpalException);
101
102 Beam beam2;
103 makeValidPhotonBeam(beam2);
104 setCharge(beam2, 1.0);
105
106 EXPECT_THROW(beam2.execute(), OpalException);
107 }
108
109 TEST_F(BeamPhotonTest, PhotonBeamRejectsSources) {
110 Beam beam;
111 makeValidPhotonBeam(beam);
112 setSources(beam, "srcs");
113
114 EXPECT_THROW(beam.execute(), OpalException);
115 }
116
117 class BeamPolarizationTest : public BeamPhotonTest {
118 protected:
119 void setPolarization(Beam& beam, const std::vector<double>& pol) {
120 Attributes::setRealArray(*beam.findAttribute("POLARIZATION"), pol);
121 }
122 void makeMuonBeam(Beam& beam) {
123 setParticle(beam, "MUON");
124 setEnergy(beam, 0.5); // GeV, well above muon mass
125 setNALLOC(beam, 1.0);
126 setSources(beam, "src");
127 }
128 };
129
130 TEST_F(BeamPolarizationTest, MuonBeamDefaultPolarizationIsZero) {
131 Beam beam;
132 makeMuonBeam(beam); // POLARIZATION unset: getPolarization() defaults to {0,0,0}.
133
134 EXPECT_NO_THROW(beam.execute());
135 const std::vector<double> pol = beam.getPolarization();
136 ASSERT_EQ(pol.size(), 3u);
137 EXPECT_DOUBLE_EQ(pol[0], 0.0);
138 EXPECT_DOUBLE_EQ(pol[1], 0.0);
139 EXPECT_DOUBLE_EQ(pol[2], 0.0);
140 }
141
142 TEST_F(BeamPolarizationTest, MuonNonzeroPolarizationAccepted) {
143 // Setting POLARIZATION on a muon is accepted and enables spin tracking.
144 Beam beam;
145 makeMuonBeam(beam);
146 setPolarization(beam, {0.0, 0.0, 1.0});
147
148 EXPECT_NO_THROW(beam.execute());
149 EXPECT_TRUE(beam.hasPolarization());
150 }
151
152 TEST_F(BeamPolarizationTest, MuonZeroPolarizationEnablesSpinTracking) {
153 // An explicit {0,0,0} still counts as "set" and enables spin tracking.
154 Beam beam;
155 makeMuonBeam(beam);
156 setPolarization(beam, {0.0, 0.0, 0.0});
157
158 EXPECT_NO_THROW(beam.execute());
159 EXPECT_TRUE(beam.hasPolarization());
160 }
161
162 TEST_F(BeamPolarizationTest, MuonWithoutPolarizationHasSpinOff) {
163 // Leaving POLARIZATION unset is valid and disables spin tracking.
164 Beam beam;
165 makeMuonBeam(beam);
166
167 EXPECT_NO_THROW(beam.execute());
168 EXPECT_FALSE(beam.hasPolarization());
169 }
170
171 TEST_F(BeamPolarizationTest, PolarizationMagnitudeGreaterThanOneIsRejected) {
172 Beam beam;
173 makeMuonBeam(beam);
174 setPolarization(beam, {0.8, 0.8, 0.8}); // |P| ~ 1.39
175
176 EXPECT_THROW(beam.execute(), OpalException);
177 }
178
179 TEST_F(BeamPolarizationTest, PolarizationWrongLengthIsRejected) {
180 Beam beam;
181 makeMuonBeam(beam);
182 setPolarization(beam, {0.0, 1.0}); // length 2, not 3
183
184 EXPECT_THROW(beam.execute(), OpalException);
185 }
186
187 TEST_F(BeamPolarizationTest, NonMuonSpeciesRejectsNonzeroPolarization) {
188 Beam beam;
189 setParticle(beam, "PION");
190 setEnergy(beam, 1.0);
191 setNALLOC(beam, 1.0);
192 setSources(beam, "src");
193 setPolarization(beam, {0.0, 0.0, 1.0});
194
195 EXPECT_THROW(beam.execute(), OpalException);
196 }
197
198 TEST_F(BeamPolarizationTest, NonMuonSpeciesRejectsZeroPolarization) {
199 // POLARIZATION is not valid on non-muon species, even at magnitude 0.
200 Beam beam;
201 setParticle(beam, "PION");
202 setEnergy(beam, 1.0);
203 setNALLOC(beam, 1.0);
204 setSources(beam, "src");
205 setPolarization(beam, {0.0, 0.0, 0.0});
206
207 EXPECT_THROW(beam.execute(), OpalException);
208 }
209
210 TEST_F(BeamPolarizationTest, NonMuonSpeciesAcceptedWhenPolarizationUnset) {
211 // Leaving POLARIZATION unspecified is fine on any species.
212 Beam beam;
213 setParticle(beam, "PION");
214 setEnergy(beam, 1.0);
215 setNALLOC(beam, 1.0);
216 setSources(beam, "src");
217
218 EXPECT_NO_THROW(beam.execute());
219 }
220
221} // namespace
TEST_F(MonitorTest, GetType)
Definition Beam.h:32
bool hasPolarization() const
Definition Beam.cpp:286
virtual void execute()
Check the BEAM data.
Definition Beam.cpp:139
double getCharge() const
Return the charge number in elementary charge.
Definition Beam.cpp:320
bool isPhoton() const
True if this beam is configured as a photon beam.
Definition Beam.cpp:328
double getMass() const
Return Particle's rest mass in GeV.
Definition Beam.cpp:322
std::vector< double > getPolarization() const
Definition Beam.cpp:278
virtual Attribute * findAttribute(const std::string &name)
Find an attribute by name.
Definition Object.cpp:56
static std::string getParticleTypeString(const ParticleType &type)
static double getParticleMass(const ParticleType &type)
static double getParticleCharge(const ParticleType &type)
static ParticleType getParticleType(const std::string &str)
void setRealArray(Attribute &attr, const std::vector< double > &value)
Set array value.
void setString(Attribute &attr, const std::string &val)
Set string value.
void setReal(Attribute &attr, double val)
Set real value.
void setPredefinedString(Attribute &attr, const std::string &val)
Set predefined string value.