OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
OpalBeamline.h
Go to the documentation of this file.
1 #ifndef OPAL_BEAMLINE_H
2 #define OPAL_BEAMLINE_H
3 
4 #include <set>
5 #include <string>
6 
7 #include "Beamlines/Beamline.h"
9 #include "AbsBeamline/BeamBeam.h"
10 #include "AbsBeamline/Corrector.h"
11 #include "AbsBeamline/Degrader.h"
12 #include "AbsBeamline/Diagnostic.h"
13 #include "AbsBeamline/Lambertson.h"
14 #include "AbsBeamline/Marker.h"
16 #include "AbsBeamline/Separator.h"
17 #include "AbsBeamline/Septum.h"
18 #include "AbsBeamline/Source.h"
19 
20 #include "Utilities/ClassicField.h"
21 
23 
24 template <class T, unsigned Dim>
25 class PartBunchBase;
27 class BoundaryGeometry;
28 
29 //#define BEAMLINE_EOL 0x80000000 // end of line
30 //#define BEAMLINE_PARTICLEMATTERINTERACTION 0x08000000 // has particle matter interaction
31 
32 class OpalBeamline {
33 
34 public:
35  OpalBeamline();
36  OpalBeamline(const Vector_t& origin,
37  const Quaternion& rotation);
38  ~OpalBeamline();
39 
40  void activateElements();
41  std::set<std::shared_ptr<Component>> getElements(const Vector_t &x);
42  Vector_t transformTo(const Vector_t &r) const;
43  Vector_t transformFrom(const Vector_t &r) const;
44  Vector_t rotateTo(const Vector_t &r) const;
45  Vector_t rotateFrom(const Vector_t &r) const;
46 
47  Vector_t transformToLocalCS(const std::shared_ptr<Component> &comp,
48  const Vector_t &r) const;
49  Vector_t transformFromLocalCS(const std::shared_ptr<Component> &comp,
50  const Vector_t &r) const;
51  Vector_t rotateToLocalCS(const std::shared_ptr<Component> &comp,
52  const Vector_t &r) const;
53  Vector_t rotateFromLocalCS(const std::shared_ptr<Component> &comp,
54  const Vector_t &r) const;
55  CoordinateSystemTrafo getCSTrafoLab2Local(const std::shared_ptr<Component> &comp) const;
57  CoordinateSystemTrafo getMisalignment(const std::shared_ptr<Component> &comp) const;
58 
59  double getStart(const Vector_t &) const;
60  double getEnd(const Vector_t &) const;
61 
62  void switchElements(const double &, const double &, const double &kineticEnergy, const bool &nomonitors = false);
63 
64  void switchElementsOff(const double &, ElementBase::ElementType eltype = ElementBase::ANY);
65  void switchElementsOff();
66 
68 
69  BoundaryGeometry *getBoundaryGeometry(const unsigned int &);
70 
71  unsigned long getFieldAt(const unsigned int &, const Vector_t &, const long &, const double &, Vector_t &, Vector_t &);
72  unsigned long getFieldAt(const Vector_t &, const Vector_t &, const double &, Vector_t &, Vector_t &);
73 
74  template<class T>
75  void visit(const T &, BeamlineVisitor &, PartBunchBase<double, 3> *);
76 
77  void prepareSections();
78  void compute3DLattice();
79  void save3DLattice();
80  void save3DInput();
81  void print(Inform &) const;
82 
84 
85  void swap(OpalBeamline & rhs);
86  void merge(OpalBeamline &rhs);
87 
88  bool containsSource();
89 private:
91  bool prepared_m;
93 
95 };
96 
97 template<class T> inline
99  Inform msg("OPAL ");
100  double startField = 0.0;
101  double endField = 0.0;
102  std::shared_ptr<T> elptr(dynamic_cast<T *>(element.removeWrappers()->clone()));
103 
104  if (elptr->isElementPositionSet())
105  startField = elptr->getElementPosition();
106 
107  elptr->initialise(bunch, startField, endField);
108  elements_m.push_back(ClassicField(elptr, startField, endField));
109 }
110 
111 template<> inline
112 void OpalBeamline::visit<Source>(const Source &element, BeamlineVisitor &, PartBunchBase<double, 3> *bunch) {
113  containsSource_m = true;
114  double startField = 0.0;
115  double endField = 0.0;
116  std::shared_ptr<Source> elptr(dynamic_cast<Source *>(element.removeWrappers()->clone()));
117 
118  if (elptr->isElementPositionSet())
119  startField = elptr->getElementPosition();
120 
121  elptr->initialise(bunch, startField, endField);
122  elements_m.push_back(ClassicField(elptr, startField, endField));
123 }
124 
125 template<> inline
126 void OpalBeamline::visit<AlignWrapper>(const AlignWrapper &wrap, BeamlineVisitor &visitor, PartBunchBase<double, 3> *) {
127  wrap.getElement()->accept(visitor);
128 }
129 
130 template<> inline
131 void OpalBeamline::visit<BeamBeam>(const BeamBeam &element, BeamlineVisitor &, PartBunchBase<double, 3> *) {
132  WARNMSG(element.getTypeString() << " not implemented yet!" << endl);
133 }
134 
135 template<> inline
136 void OpalBeamline::visit<Diagnostic>(const Diagnostic &element, BeamlineVisitor &, PartBunchBase<double, 3> *) {
137  WARNMSG(element.getTypeString() << " not implemented yet!" << endl);
138 }
139 
140 template<> inline
141 void OpalBeamline::visit<Lambertson>(const Lambertson &element, BeamlineVisitor &, PartBunchBase<double, 3> *) {
142  WARNMSG(element.getTypeString() << " not implemented yet!" << endl);
143 }
144 
145 template<> inline
146 void OpalBeamline::visit<Marker>(const Marker &element, BeamlineVisitor &, PartBunchBase<double, 3> *) {
147 }
148 
149 template<> inline
150 void OpalBeamline::visit<RFQuadrupole>(const RFQuadrupole &element, BeamlineVisitor &, PartBunchBase<double, 3> *) {
151  WARNMSG(element.getTypeString() << " not implemented yet!" << endl);
152 }
153 
154 template<> inline
155 void OpalBeamline::visit<Separator>(const Separator &element, BeamlineVisitor &, PartBunchBase<double, 3> *) {
156  WARNMSG(element.getTypeString() << " not implemented yet!" << endl);
157 }
158 
159 template<> inline
160 void OpalBeamline::visit<Septum>(const Septum &element, BeamlineVisitor &, PartBunchBase<double, 3> *) {
161  WARNMSG(element.getTypeString() << " not implemented yet!" << endl);
162 }
163 
164 inline
167 }
168 
169 inline
172 }
173 
174 inline
177 }
178 
179 inline
182 }
183 
184 inline
185 Vector_t OpalBeamline::transformToLocalCS(const std::shared_ptr<Component> &comp,
186  const Vector_t &r) const {
187  return comp->getCSTrafoGlobal2Local().transformTo(r);
188 }
189 
190 inline
191 Vector_t OpalBeamline::transformFromLocalCS(const std::shared_ptr<Component> &comp,
192  const Vector_t &r) const {
193  return comp->getCSTrafoGlobal2Local().transformFrom(r);
194 }
195 
196 inline
197 Vector_t OpalBeamline::rotateToLocalCS(const std::shared_ptr<Component> &comp,
198  const Vector_t &r) const {
199  return comp->getCSTrafoGlobal2Local().rotateTo(r);
200 }
201 
202 inline
203 Vector_t OpalBeamline::rotateFromLocalCS(const std::shared_ptr<Component> &comp,
204  const Vector_t &r) const {
205  return comp->getCSTrafoGlobal2Local().rotateFrom(r);
206 }
207 
208 inline
209 CoordinateSystemTrafo OpalBeamline::getCSTrafoLab2Local(const std::shared_ptr<Component> &comp) const {
210  return comp->getCSTrafoGlobal2Local();
211 }
212 
213 inline
216 }
217 
218 inline
219 CoordinateSystemTrafo OpalBeamline::getMisalignment(const std::shared_ptr<Component> &comp) const {
220  return comp->getMisalignment();
221 }
222 
223 inline
225  return containsSource_m;
226 }
227 #endif // OPAL_BEAMLINE_H
Definition: Source.h:12
void merge(OpalBeamline &rhs)
void prepareSections()
void switchElementsOff()
Definition: rbendmap.h:8
Interface for septum magnet.
Definition: Septum.h:11
Vector_t rotateTo(const Vector_t &r) const
void switchElements(const double &, const double &, const double &kineticEnergy, const bool &nomonitors=false)
Interface for electrostatic separator.
Definition: Separator.h:33
Vector_t transformFromLocalCS(const std::shared_ptr< Component > &comp, const Vector_t &r) const
Definition: OpalBeamline.h:191
Vector_t rotateFrom(const Vector_t &r) const
Definition: OpalBeamline.h:180
Interface for RF Quadrupole.
Definition: RFQuadrupole.h:30
void compute3DLattice()
std::list< ClassicField > FieldList
Definition: ClassicField.h:47
Define the position of a misaligned element.
Definition: AlignWrapper.h:39
CoordinateSystemTrafo coordTransformationTo_m
Definition: OpalBeamline.h:94
Interface for beam diagnostics.
Definition: Diagnostic.h:32
Interface for a marker.
Definition: Marker.h:32
Vector_t transformTo(const Vector_t &r) const
Vector_t rotateFromLocalCS(const std::shared_ptr< Component > &comp, const Vector_t &r) const
Definition: OpalBeamline.h:203
unsigned long getFieldAt(const unsigned int &, const Vector_t &, const long &, const double &, Vector_t &, Vector_t &)
BoundaryGeometry * getBoundaryGeometry(const unsigned int &)
bool containsSource()
Definition: OpalBeamline.h:224
Vector_t transformToLocalCS(const std::shared_ptr< Component > &comp, const Vector_t &r) const
Definition: OpalBeamline.h:185
void activateElements()
Class: DataSink.
Definition: OpalData.h:29
double getStart(const Vector_t &) const
bool containsSource_m
Definition: OpalBeamline.h:92
ParticleMatterInteractionHandler * getParticleMatterInteractionHandler(const unsigned int &)
Abstract beam-beam interaction.
Definition: BeamBeam.h:37
void visit(const T &, BeamlineVisitor &, PartBunchBase< double, 3 > *)
Definition: OpalBeamline.h:98
void print(Inform &) const
FieldList getElementByType(ElementBase::ElementType)
#define WARNMSG(msg)
Definition: IpplInfo.h:398
Vector_t transformTo(const Vector_t &r) const
Definition: OpalBeamline.h:165
void swap(OpalBeamline &rhs)
Vector_t rotateToLocalCS(const std::shared_ptr< Component > &comp, const Vector_t &r) const
Definition: OpalBeamline.h:197
std::set< std::shared_ptr< Component > > getElements(const Vector_t &x)
Vector_t rotateFrom(const Vector_t &r) const
CoordinateSystemTrafo getMisalignment(const std::shared_ptr< Component > &comp) const
Definition: OpalBeamline.h:219
CoordinateSystemTrafo getCSTrafoLab2Local() const
Definition: OpalBeamline.h:214
Vector_t rotateTo(const Vector_t &r) const
Definition: OpalBeamline.h:175
FieldList elements_m
Definition: OpalBeamline.h:90
void save3DLattice()
Vector_t transformFrom(const Vector_t &r) const
Definition: OpalBeamline.h:170
Abstract algorithm.
Definition: Inform.h:41
double getEnd(const Vector_t &) const
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
Interface for a Lambertson septum.
Definition: Lambertson.h:33
Vector_t transformFrom(const Vector_t &r) const
void save3DInput()