14#include "gtest/gtest.h"
19 void setValidLaserAttributes(
OpalLaser& laser) {
30 explicit DispatchRecordingVisitor(
const Beamline& beamline)
38 bool sawComponent =
false;
39 bool sawLaser =
false;
40 bool sawSBend =
false;
41 bool sawRBend =
false;
45TEST(TestLaser, UpdateStoresValidatedParameters) {
47 setValidLaserAttributes(laser);
51 EXPECT_NO_THROW(laser.
update());
54 ASSERT_NE(rep,
nullptr);
55 EXPECT_DOUBLE_EQ(rep->getElementLength(), 0.01);
56 EXPECT_DOUBLE_EQ(rep->getWavelength(), 1.03e-6);
57 EXPECT_DOUBLE_EQ(rep->getPulseEnergy(), 1.0);
58 EXPECT_DOUBLE_EQ(rep->getPulseLength(), 2.0e-12);
59 EXPECT_DOUBLE_EQ(rep->getWaistX(), 5.0e-6);
60 EXPECT_DOUBLE_EQ(rep->getWaistY(), 6.0e-6);
61 EXPECT_NEAR(rep->getDirection()(0), 0.0, 1.0e-15);
62 EXPECT_NEAR(rep->getDirection()(1), 0.0, 1.0e-15);
63 EXPECT_NEAR(rep->getDirection()(2), -1.0, 1.0e-15);
64 EXPECT_DOUBLE_EQ(rep->getStokes()(2), 1.0);
67TEST(TestLaser, UpdateDefaultsStokesToZero) {
69 setValidLaserAttributes(laser);
71 EXPECT_NO_THROW(laser.
update());
74 ASSERT_NE(rep,
nullptr);
75 EXPECT_DOUBLE_EQ(rep->getStokes()(0), 0.0);
76 EXPECT_DOUBLE_EQ(rep->getStokes()(1), 0.0);
77 EXPECT_DOUBLE_EQ(rep->getStokes()(2), 0.0);
80TEST(TestLaser, UpdateRequiresWavelength) {
91TEST(TestLaser, UpdateRejectsNonPositivePulseEnergy) {
93 setValidLaserAttributes(laser);
99TEST(TestLaser, UpdateRejectsBadDirectionSize) {
101 setValidLaserAttributes(laser);
107TEST(TestLaser, UpdateRejectsZeroDirection) {
109 setValidLaserAttributes(laser);
115TEST(TestLaser, UpdateRejectsBadStokesSize) {
117 setValidLaserAttributes(laser);
123TEST(TestLaser, UpdateRejectsStokesNormAboveOne) {
125 setValidLaserAttributes(laser);
131TEST(TestLaser, UpdateRejectsNegativeLength) {
133 setValidLaserAttributes(laser);
167TEST(TestLaser, LinearComptonForwardPhotonEnergyMatchesExactNinetyDegreeKinematics) {
169 setValidLaserAttributes(laser);
172 ASSERT_NO_THROW(laser.
update());
175 ASSERT_NE(rep,
nullptr);
178 beamDirection(2) = 1.0;
180 const double electronTotalEnergyGeV = 1.0;
181 const double laserPhotonEnergyGeV = rep->getPhotonEnergyGeV();
182 const double electronMomentumGeV = std::sqrt(
184 const double expectedInvariantX =
186 const double stableEnergyMinusMomentum =
188 const double expectedForwardPhotonEnergyGeV =
189 laserPhotonEnergyGeV * electronTotalEnergyGeV
190 / (stableEnergyMinusMomentum + laserPhotonEnergyGeV);
193 rep->getLinearComptonInvariantX(electronTotalEnergyGeV, beamDirection),
194 expectedInvariantX, expectedInvariantX * 1.0e-12);
196 rep->getLinearComptonForwardPhotonEnergyGeV(electronTotalEnergyGeV, beamDirection),
197 expectedForwardPhotonEnergyGeV, expectedForwardPhotonEnergyGeV * 1.0e-12);
200TEST(TestLaser, BeamlineVisitorDispatchesLaserAndBendsToSpecificHooks) {
204 DispatchRecordingVisitor visitor(beamline);
207 EXPECT_TRUE(visitor.sawLaser);
208 EXPECT_FALSE(visitor.sawSBend);
209 EXPECT_FALSE(visitor.sawRBend);
210 EXPECT_FALSE(visitor.sawComponent);
214 DispatchRecordingVisitor visitor(beamline);
217 EXPECT_FALSE(visitor.sawLaser);
218 EXPECT_TRUE(visitor.sawSBend);
219 EXPECT_FALSE(visitor.sawRBend);
220 EXPECT_FALSE(visitor.sawComponent);
224 DispatchRecordingVisitor visitor(beamline);
227 EXPECT_FALSE(visitor.sawLaser);
228 EXPECT_FALSE(visitor.sawSBend);
229 EXPECT_TRUE(visitor.sawRBend);
230 EXPECT_FALSE(visitor.sawComponent);
ippl::Vector< T, Dim > Vector_t
Visitor-based parallel tracker with time as the independent variable.
TEST(TestLaser, UpdateStoresValidatedParameters)
An abstract sequence of beam line components.
void visitComponent(const Component &) override
Apply the algorithm to an arbitrary component.
void visitRBend(const RBend &) override
Apply the algorithm to a rectangular bend.
void visitSBend(const SBend &) override
Apply the algorithm to a sector bend.
void visitLaser(const Laser &) override
Apply the algorithm to a laser.
ElementBase * getElement() const
Return the embedded OPALX element.
Passive OPALX laser element.
void accept(BeamlineVisitor &) const override
Accept a beamline visitor through the laser-specific interface.
std::vector< Attribute > itsAttr
The object attributes.
void update() override
Update the embedded OPALX element.
Concrete OPALX representation of an analytic rectangular bend.
Abstract rectangular bend with straight body and curved reference path.
void accept(BeamlineVisitor &visitor) const override
Apply visitor.
Concrete OPALX representation of an analytic sector bend.
Abstract sector bend with planar-arc body geometry.
void accept(BeamlineVisitor &visitor) const override
Apply visitor.
void setRealArray(Attribute &attr, const std::vector< double > &value)
Set array value.
void setReal(Attribute &attr, double val)
Set real value.
constexpr double m_e
The electron rest mass in GeV.