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