2#include "gtest/gtest.h"
13#include "Utility/Inform.h"
20 constexpr double tol = 1
e-12;
22 using Vector3 = ippl::Vector<double, 3>;
25 return Quaternion(std::cos(0.5 * angle), 0.0, std::sin(0.5 * angle), 0.0);
28 void expectVectorNear(
const Vector3& actual,
const Vector3& expected) {
29 EXPECT_NEAR(actual(0), expected(0), tol);
30 EXPECT_NEAR(actual(1), expected(1), tol);
31 EXPECT_NEAR(actual(2), expected(2), tol);
54 char** argv =
nullptr;
56 ippl::initialize(argc, argv);
57 gmsg =
new Inform(
nullptr, -1);
91 std::shared_ptr<PartBunch_t>
makeBunch(
const size_t numParticles) {
93 const auto fsCmd = std::make_shared<TestableFieldSolverCmd>();
95 fsCmd->setType(
"NONE");
99 fsCmd->setBCX(
"PERIODIC");
100 fsCmd->setBCY(
"PERIODIC");
101 fsCmd->setBCZ(
"PERIODIC");
103 auto beam = std::make_shared<Beam>();
105 EXPECT_NE(opBeam,
nullptr);
107 auto bunch = std::make_shared<PartBunch_t>(
108 std::vector{1.0}, std::vector{1.0}, std::vector<Beam*>{opBeam},
110 bunch->getParticleContainer()->createParticles(numParticles);
120 auto drift = std::make_shared<DriftRep>(
"D2");
121 drift->setElementLength(2.0);
122 drift->setCSTrafoGlobal2Local(
127 const Vector3 point(1.0, 2.0, 3.0);
157 auto drift = std::make_shared<DriftRep>(
"D3");
160 drift->fixPosition();
177 auto bunch = makeBunch(0);
181 beamline.
visit(drift, visitor, *bunch);
189 expectVectorNear(placed.getNominalBodyTransform().getOrigin(), Vector3(0.0, 0.0, 1.25));
190 expectVectorNear(placed.getNominalEntryTransform().getOrigin(), Vector3(0.0, 0.0, 1.25));
191 expectVectorNear(placed.getNominalExitTransform().getOrigin(), Vector3(0.0, 0.0, 1.65));
199 auto bunch = makeBunch(0);
203 beamline.
visit(drift, visitor, *bunch);
208 const auto component = *
elements.begin();
210 const Vector3 assembledOrigin =
212 expectVectorNear(assembledOrigin, Vector3(0.0, 0.0, 0.75));
214 component->setPlacementPose(
TEST_F(OpalBeamlinePlacementTest, BridgeReturnsPlacedElementViewAndPreservesNominalQueries)
Abstract base class for accelerator geometry classes.
static Beam * find(const std::string &name)
Find named BEAM.
virtual void visitBeamline(const Beamline &)=0
Apply the algorithm to a beam line.
An abstract sequence of beam line components.
Rigid spatial transform between a parent frame and a local frame.
ippl::Vector< double, 3 > getOrigin() const
ippl::Vector< double, 3 > transformFrom(const ippl::Vector< double, 3 > &r) const
Map a point from the local frame back to the parent frame.
ippl::Vector< double, 3 > rotateFrom(const ippl::Vector< double, 3 > &r) const
Rotate a vector from the local frame back into the parent frame.
ippl::Vector< double, 3 > rotateTo(const ippl::Vector< double, 3 > &r) const
Rotate a vector from the parent frame into the local frame.
ippl::Vector< double, 3 > transformTo(const ippl::Vector< double, 3 > &r) const
Map a point from the parent frame to the local frame.
ElementType getType() const override
Get element type std::string.
ElementBase * clone() const override
Return clone.
BGeometryBase & getGeometry() override
Get geometry.
void accept(BeamlineVisitor &visitor) const override
Apply visitor.
void iterate(BeamlineVisitor &, bool) const override
Apply visitor to all elements of the line.
void setElementPosition(double elemedge)
Access to ELEMEDGE attribute.
virtual void setElementLength(double length)
Set design length.
const CoordinateSystemTrafo & getNominalToActual() const
Geometry representing an identity transform.
std::vector< Attribute > itsAttr
The object attributes.
void setBCZ(const std::string &bc)
void setBCX(const std::string &bc)
void setBCY(const std::string &bc)
void setType(const std::string &t)
static void TearDownTestSuite()
std::shared_ptr< FieldSolverCmd > fsCmdBase_m
static void SetUpTestSuite()
std::shared_ptr< DataSink > dataSink_m
std::shared_ptr< PartBunch_t > makeBunch(const size_t numParticles)
Vector_t< double, 3 > rotateToLocalCS(const std::shared_ptr< Component > &comp, const Vector_t< double, 3 > &r) const
void positionElementRelative(std::shared_ptr< ElementBase >)
CoordinateSystemTrafo getMisalignment(const std::shared_ptr< Component > &comp) const
Vector_t< double, 3 > transformFromLocalCS(const std::shared_ptr< Component > &comp, const Vector_t< double, 3 > &r) const
CoordinateSystemTrafo getNominalExitTransform(const std::shared_ptr< Component > &comp) const
CoordinateSystemTrafo getNominalEntryTransform(const std::shared_ptr< Component > &comp) const
PlacedElement getPlacedElement(const std::shared_ptr< Component > &comp) const
Return the placed-element view used by the bridge stage.
CoordinateSystemTrafo getCSTrafoLab2Local(const std::shared_ptr< Component > &comp) const
Return the nominal rigid placement transform .
Vector_t< double, 3 > transformToLocalCS(const std::shared_ptr< Component > &comp, const Vector_t< double, 3 > &r) const
std::set< std::shared_ptr< Component > > getElements(const Vector_t< double, 3 > &x)
void visit(const T &, BeamlineVisitor &, PartBunch_t &)
Vector_t< double, 3 > rotateFromLocalCS(const std::shared_ptr< Component > &comp, const Vector_t< double, 3 > &r) const
void storeInputFn(const std::string &fn)
store opals input filename
static OpalData * getInstance()
void setOpenMode(OpenMode openMode)
Geometric placement record for an element instance.
const Misalignment & getMisalignment() const
CoordinateSystemTrafo getNominalEntryTransform() const
CoordinateSystemTrafo getNominalExitTransform() const
CoordinateSystemTrafo getNominalBodyTransform() const
Nominal rigid placement transform.
Quaternion storage and rotation algebra used by OPALX geometry code.
void setPredefinedString(Attribute &attr, const std::string &val)
Set predefined string value.
bool enableHDF5
If true HDF5 files are written.
constexpr double e
The value of.