1 | #ifndef _H_OpticalElement_
|
---|
2 | #define _H_OpticalElement_
|
---|
3 |
|
---|
4 | /*
|
---|
5 | ---- Hector the simulator ----
|
---|
6 | A fast simulator of particles through generic beamlines.
|
---|
7 | J. de Favereau, X. Rouby ~~~ hector_devel@cp3.phys.ucl.ac.be
|
---|
8 |
|
---|
9 | http://www.fynu.ucl.ac.be/hector.html
|
---|
10 |
|
---|
11 | Centre de Physique des Particules et de Phénoménologie (CP3)
|
---|
12 | Université Catholique de Louvain (UCL)
|
---|
13 | */
|
---|
14 |
|
---|
15 | /// \file H_OpticalElement.h
|
---|
16 | /// \brief Class aiming at describing any beam optical element.
|
---|
17 | ///
|
---|
18 | /// This is an abstract base class
|
---|
19 | /// subclass must define setTypeString() and setMatrix() methods.
|
---|
20 | /// Quadrupole, Dipole, Kickers and Drift inherit from this class.
|
---|
21 |
|
---|
22 | // c++ #includes
|
---|
23 | #include <iostream>
|
---|
24 | #include <string>
|
---|
25 |
|
---|
26 | // ROOT #includes
|
---|
27 | #include "TMatrix.h"
|
---|
28 |
|
---|
29 | // local #includes
|
---|
30 | #include "H_TransportMatrices.h"
|
---|
31 | #include "H_Parameters.h"
|
---|
32 | #include "H_Aperture.h"
|
---|
33 |
|
---|
34 | using namespace std;
|
---|
35 |
|
---|
36 | // type #defines
|
---|
37 | #define DRIFT 1
|
---|
38 | #define RDIPOLE 2
|
---|
39 | #define SDIPOLE 3
|
---|
40 | #define VQUADRUPOLE 4
|
---|
41 | #define HQUADRUPOLE 5
|
---|
42 | #define VKICKER 6
|
---|
43 | #define HKICKER 7
|
---|
44 | #define RCOLLIMATOR 8
|
---|
45 | #define ECOLLIMATOR 9
|
---|
46 | #define CCOLLIMATOR 10
|
---|
47 | #define RP 11
|
---|
48 | #define IP 12
|
---|
49 | #define MARKER 13
|
---|
50 |
|
---|
51 | // typestring[30] #defines
|
---|
52 | #define DRIFTNAME "Drift "
|
---|
53 | #define RDIPOLENAME "R-Dipole "
|
---|
54 | #define SDIPOLENAME "S-Dipole "
|
---|
55 | #define VQUADRUPOLENAME "V-Quadrupole "
|
---|
56 | #define HQUADRUPOLENAME "H-Quadrupole "
|
---|
57 | #define VKICKERNAME "V-Kicker "
|
---|
58 | #define HKICKERNAME "H-Kicker "
|
---|
59 | #define RCOLLIMATORNAME "R-Collimator "
|
---|
60 | #define ECOLLIMATORNAME "E-Collimator "
|
---|
61 | #define CCOLLIMATORNAME "C-Collimator "
|
---|
62 | #define RPNAME "Roman Pot "
|
---|
63 | #define IPNAME "IP "
|
---|
64 | #define MARKERNAME "Marker "
|
---|
65 |
|
---|
66 | /// Describes any beam optical element.
|
---|
67 | class H_OpticalElement {
|
---|
68 |
|
---|
69 | public:
|
---|
70 | /// init method for constructors
|
---|
71 | void init(const string, const int , const double , const double , const double, H_Aperture*);
|
---|
72 | /// Constructors and destructor
|
---|
73 | //@{
|
---|
74 | H_OpticalElement(const string, const int, const double, const double, const double, H_Aperture*);
|
---|
75 | H_OpticalElement(const int, const double, const double, const double, H_Aperture*);
|
---|
76 | H_OpticalElement(const string, const int, const double, const double, const double);
|
---|
77 | H_OpticalElement(const int, const double, const double, const double);
|
---|
78 | H_OpticalElement();
|
---|
79 | H_OpticalElement(const H_OpticalElement&);
|
---|
80 | virtual ~H_OpticalElement() {delete element_mat; delete element_aperture;};
|
---|
81 | //@}
|
---|
82 | /// Prints the element features
|
---|
83 | virtual void printProperties() const ;
|
---|
84 | /// Shows the element transport matrix
|
---|
85 | void showMatrix() const ;
|
---|
86 | /// Draws the aperture shape
|
---|
87 | void drawAperture() const ;
|
---|
88 | /// Sets the aperture of the element
|
---|
89 | void setAperture(H_Aperture *);
|
---|
90 | /// Ordering operator acting on the s coordinate
|
---|
91 | inline bool operator>(const H_OpticalElement tocomp) const {if(fs>tocomp.getS()) { return true; } else { return false; }};
|
---|
92 | /// Ordering operator acting on the s coordinate
|
---|
93 | inline bool operator<(const H_OpticalElement tocomp) const {if(fs<tocomp.getS()) { return true; } else { return false; }};
|
---|
94 | /// Copy operator
|
---|
95 | H_OpticalElement& operator=(const H_OpticalElement&);
|
---|
96 | /// Sets the element longitudinal (s), and horizontal (x) and vertical (y) coordinates.
|
---|
97 | //@{
|
---|
98 | inline void setS(const double new_s) {fs=new_s;};
|
---|
99 | inline void setX(const double new_pos) {
|
---|
100 | /// @param new_pos in [m]
|
---|
101 | element_aperture->setPosition(new_pos*URAD,ypos);
|
---|
102 | xpos = new_pos;
|
---|
103 | };
|
---|
104 | inline void setY(const double new_pos) {
|
---|
105 | /// @param new_pos in [m]
|
---|
106 | element_aperture->setPosition(xpos,new_pos*URAD);
|
---|
107 | ypos = new_pos;
|
---|
108 | };
|
---|
109 | inline void setTX(const double new_ang) {
|
---|
110 | txpos = new_ang;
|
---|
111 | };
|
---|
112 | inline void setTY(const double new_ang) {
|
---|
113 | typos = new_ang;
|
---|
114 | }
|
---|
115 | //@}
|
---|
116 | /// Returns the element longitudinal (s), horizontal (x) and vertical (y) coordinates, and corresponding angles.
|
---|
117 | //@{
|
---|
118 | inline double getS() const {return fs;};
|
---|
119 | inline double getX() const {return xpos;};
|
---|
120 | inline double getY() const {return ypos;};
|
---|
121 | inline double getTX() const {return txpos;};
|
---|
122 | inline double getTY() const {return typos;};
|
---|
123 | //@}
|
---|
124 | /// Returns the element length
|
---|
125 | inline double getLength() const { return element_length; };
|
---|
126 | /// Returns the element magnetic strength
|
---|
127 | inline double getK() const { return fk; };
|
---|
128 | /// Returns the element type, as (int) or (string)
|
---|
129 | //@{
|
---|
130 | inline int getType() const { return type; };
|
---|
131 | inline const string getTypeString() const { return typestring; };
|
---|
132 | //@}
|
---|
133 | /// Returns the element (string) name
|
---|
134 | inline const string getName() const { return name; };
|
---|
135 | /// Draws the element from min to max in the current pad
|
---|
136 | void draw(const float, const float) const;
|
---|
137 | /// Checks if the (x,y) coordinates are within the aperture acceptance
|
---|
138 | inline bool isInside(const double x, const double y) const { return (bool) element_aperture->isInside(x,y);};
|
---|
139 | /// Returns the element transport matrix
|
---|
140 | //@{
|
---|
141 | TMatrix getMatrix() const;
|
---|
142 | TMatrix getMatrix(const float, const float, const float) const;
|
---|
143 | //@}
|
---|
144 | /// Returns the element aperture
|
---|
145 | H_Aperture * getAperture() const {return element_aperture;};
|
---|
146 | /// Sets the beta functions
|
---|
147 | //@{
|
---|
148 | inline void setBetaX(const double beta) { betax = beta;};
|
---|
149 | inline void setBetaY(const double beta) { betay = beta;};
|
---|
150 | //@}
|
---|
151 | /// Returns the beta functions
|
---|
152 | //@{
|
---|
153 | inline double getBetaX() const {return betax;};
|
---|
154 | inline double getBetaY() const {return betay;};
|
---|
155 | //@}
|
---|
156 | /// Sets the dispersion functions
|
---|
157 | //@{
|
---|
158 | inline void setDX(const double disp) { dx = disp;};
|
---|
159 | inline void setDY(const double disp) { dy = disp;};
|
---|
160 | //@}
|
---|
161 | /// Returns the dispersion functions
|
---|
162 | //@{
|
---|
163 | inline double getDX() const {return dx;};
|
---|
164 | inline double getDY() const {return dy;};
|
---|
165 | //@}
|
---|
166 | //@}
|
---|
167 | /// Sets the relative position functions (from MAD), relative to the beamline reference frame
|
---|
168 | //@{
|
---|
169 | inline void setRelX(const double rel_x) { relx = rel_x;};
|
---|
170 | inline void setRelY(const double rel_y) { rely = rel_y;};
|
---|
171 | //@}
|
---|
172 | /// Returns the position functions (from MAD), relative to the beamline reference frame
|
---|
173 | //@{
|
---|
174 | inline double getRelX() const {return relx;};
|
---|
175 | inline double getRelY() const {return rely;};
|
---|
176 | //@}
|
---|
177 |
|
---|
178 |
|
---|
179 | protected:
|
---|
180 | /// Optical element coordinates : fs [m], xpos [m], ypos [m], txpos [rad], typos [rad].
|
---|
181 | //@{
|
---|
182 | double fs, xpos, ypos, txpos, typos;
|
---|
183 | //@}
|
---|
184 | /// Optical element lenght.
|
---|
185 | double element_length;
|
---|
186 | /// Magnetic field strength.
|
---|
187 | double fk;
|
---|
188 | /// Beam \f$ \beta \f$ functions.
|
---|
189 | //@{
|
---|
190 | double betax, betay;
|
---|
191 | //@}
|
---|
192 | /// Beam dispersion in position
|
---|
193 | //@{
|
---|
194 | double dx, dy;
|
---|
195 | //@}
|
---|
196 | /// Beam position, relative to the beam ideal path, from MAD
|
---|
197 | //@{
|
---|
198 | double relx, rely;
|
---|
199 | //@}
|
---|
200 | /// Optical element type (Dipole, drift, etc).
|
---|
201 | int type;
|
---|
202 | /// Optical element name and type.
|
---|
203 | //@{
|
---|
204 | string name, typestring;
|
---|
205 | //@}
|
---|
206 | virtual void setTypeString() {return;};
|
---|
207 | /// Optical element transport matrix.
|
---|
208 | virtual void setMatrix(const float, const float, const float) const {return;};
|
---|
209 | /// Optical element transport matrix.
|
---|
210 | TMatrix * element_mat;
|
---|
211 | /// Optical element aperture.
|
---|
212 | H_Aperture * element_aperture;
|
---|
213 | };
|
---|
214 |
|
---|
215 | #endif
|
---|