ATLAS Offline Software
Loading...
Searching...
No Matches
FPTracker::Magnet Class Reference

#include <Magnet.h>

Inheritance diagram for FPTracker::Magnet:
Collaboration diagram for FPTracker::Magnet:

Public Types

enum  Type {
  hbDipole , hfQuadrupole , vfQuadrupole , vbDipole ,
  notAMagnet
}
typedef std::shared_ptr< MagnetPtr_t
typedef std::vector< Ptr_tContainer_t
typedef std::shared_ptr< const IBeamElementConstPtr_t
typedef Container_t::iterator Iter_t
typedef Container_t::const_iterator ConstIter_t
typedef std::list< Ptr_tList_t
typedef List_t::iterator ListIter_t
typedef List_t::const_iterator ConstListIter_t

Public Member Functions

 Magnet (double x, double y, double center, double strength, double length, int apertype, double aper_A1, double aper_A2, double aper_A3, double aper_A4, double xb, Side side, IBender *bender, const std::string &label)
double frontFace () const
double rearFace () const
double zabspos () const
double zsignedpos () const
double centerZ () const
Point position () const
Side side () const
bool isEndElement () const
std::string str () const
std::string label () const
void track (IParticle &) const
void calibrate (IParticle &)
IBeamElement::ConstPtr_t clone () const

Private Member Functions

bool isOutOfAperture (IParticle &) const
double frontface () const
void swap (Magnet &)

Private Attributes

Point m_center
double m_frontFace
double m_rearFace
double m_strength
int m_apertype
double m_aper_A1
double m_aper_A2
double m_aper_A3
double m_aper_A4
double m_xb
Side m_side
IBenderm_bender {}
std::string m_label

Detailed Description

Definition at line 20 of file FPTracker/FPTracker/Magnet.h.

Member Typedef Documentation

◆ ConstIter_t

typedef Container_t::const_iterator FPTracker::IBeamElement::ConstIter_t
inherited

Definition at line 45 of file FPTracker/FPTracker/IBeamElement.h.

◆ ConstListIter_t

typedef List_t::const_iterator FPTracker::IBeamElement::ConstListIter_t
inherited

Definition at line 49 of file FPTracker/FPTracker/IBeamElement.h.

◆ ConstPtr_t

typedef std::shared_ptr< const IBeamElement > FPTracker::IBeamElement::ConstPtr_t
inherited

Definition at line 40 of file FPTracker/FPTracker/IBeamElement.h.

◆ Container_t

typedef std::vector< Ptr_t > FPTracker::Magnet::Container_t

Definition at line 62 of file FPTracker/FPTracker/Magnet.h.

◆ Iter_t

typedef Container_t::iterator FPTracker::IBeamElement::Iter_t
inherited

Definition at line 44 of file FPTracker/FPTracker/IBeamElement.h.

◆ List_t

typedef std::list< Ptr_t > FPTracker::IBeamElement::List_t
inherited

Definition at line 47 of file FPTracker/FPTracker/IBeamElement.h.

◆ ListIter_t

typedef List_t::iterator FPTracker::IBeamElement::ListIter_t
inherited

Definition at line 48 of file FPTracker/FPTracker/IBeamElement.h.

◆ Ptr_t

typedef std::shared_ptr< Magnet > FPTracker::Magnet::Ptr_t

Definition at line 61 of file FPTracker/FPTracker/Magnet.h.

Member Enumeration Documentation

◆ Type

Constructor & Destructor Documentation

◆ Magnet()

FPTracker::Magnet::Magnet ( double x,
double y,
double center,
double strength,
double length,
int apertype,
double aper_A1,
double aper_A2,
double aper_A3,
double aper_A4,
double xb,
Side side,
IBender * bender,
const std::string & label )

Definition at line 19 of file FPTracker/src/Magnet.cxx.

33 :
34 m_center(x, y, center),
35 m_frontFace(center>0 ? center-0.5*length:center+0.5*length),
36 m_rearFace(center>0 ? center+0.5*length:center-0.5*length),
37 m_strength(strength),
38 m_apertype(apertype),
39 m_aper_A1(aper_A1),
40 m_aper_A2(aper_A2),
41 m_aper_A3(aper_A3),
42 m_aper_A4(aper_A4),
43 m_xb(xb),
44 m_side(side),
45 m_bender(bender),
47 if (m_apertype == 1){ assert(m_aper_A1 != 0.);}
48 if (m_apertype == 2 || m_apertype == 3){ assert(m_aper_A3 != 0. and m_aper_A4 != 0.);}
49 }
double length(const pvec &v)
#define y
#define x
std::string label() const

Member Function Documentation

◆ calibrate()

void FPTracker::Magnet::calibrate ( IParticle & particle)
virtual

Implements FPTracker::IBeamElement.

Definition at line 98 of file FPTracker/src/Magnet.cxx.

99 {
100 return this->track(particle);
101 }
void track(IParticle &) const

◆ centerZ()

double FPTracker::Magnet::centerZ ( ) const

◆ clone()

IBeamElement::ConstPtr_t FPTracker::Magnet::clone ( ) const
virtual

Implements FPTracker::IBeamElement.

Definition at line 50 of file FPTracker/src/Magnet.cxx.

50 {
51 IBeamElement::ConstPtr_t pm(new Magnet(*this));
52 return pm;
53 }
std::shared_ptr< const IBeamElement > ConstPtr_t
Magnet(double x, double y, double center, double strength, double length, int apertype, double aper_A1, double aper_A2, double aper_A3, double aper_A4, double xb, Side side, IBender *bender, const std::string &label)

◆ frontFace()

double FPTracker::Magnet::frontFace ( ) const
virtual

Implements FPTracker::IBeamElement.

Definition at line 55 of file FPTracker/src/Magnet.cxx.

55{return m_frontFace;}

◆ frontface()

double FPTracker::Magnet::frontface ( ) const
private

◆ isEndElement()

bool FPTracker::Magnet::isEndElement ( ) const
virtual

Implements FPTracker::IBeamElement.

Definition at line 62 of file FPTracker/src/Magnet.cxx.

62{return false;}

◆ isOutOfAperture()

bool FPTracker::Magnet::isOutOfAperture ( IParticle & particle) const
private

Definition at line 103 of file FPTracker/src/Magnet.cxx.

103 {
104
105 TransversePoint offCenter = particle.displacement();
106 if(m_apertype == 1)
107 {
108
109 double radius = m_aper_A1;
110 bool out = offCenter.mag2() > radius*radius;
111
112 if(out)
113 {
114 std::ostringstream ost;
115 ost<<"pos "<<offCenter.mag2()<<" radiusSq "<<radius*radius<<'\n';
116 particle.addMsg( ost.str() );
117 return true;
118 }
119
120 return false;
121 }
122
123 if(m_apertype == 2)
124 {
125 double part_x = offCenter.x();
126 double part_y = offCenter.y();
127
128 double xx = part_x/m_aper_A3;
129 double yy = part_y/m_aper_A4;
130
131 bool out = xx*xx + yy*yy >1.;
132 if(out)
133 {
134 std::ostringstream ost;
135 ost<<"outside for aperture type 2 x xx, xaper "<<part_x<<" "<<xx<<" "<<m_aper_A3<<" y yy yaper "<<part_y<<" "<<yy<<" "<<m_aper_A4<<'\n';
136 particle.addMsg( ost.str() );
137 return true;
138 }
139
140
141 if ( m_aper_A1>0.)
142 {
143 if( std::fabs(part_x)>m_aper_A1 )
144 {
145 std::ostringstream ost;
146 ost<<"outside for aperture type 2 x test: particle x "<<part_x<<" m_aper_A1 "<<m_aper_A1<<"\n";
147 particle.addMsg( ost.str() );
148 return true;
149 }
150 }
151 if ( m_aper_A2>0.)
152 {
153 if( std::fabs(part_y)>m_aper_A2)
154 {
155 std::ostringstream ost;
156 ost<<"outside for aperture type 2 y test: particle y "<<part_y<<" m_aper_A2 "<<m_aper_A2<<"\n";
157 particle.addMsg( ost.str() );
158 return true;
159 }
160 }
161
162 return false;
163 }
164 if(m_apertype == 3)
165 {
166 double part_x = offCenter.x();
167 double part_y = offCenter.y();
168
169 if ( m_aper_A1 > 0. )
170 {
171 if( std::fabs(part_x)>m_aper_A1 )
172 {
173 std::ostringstream ost;
174 ost<<"outside for aperture type 3 x test: particle x "<<part_x<<" m_aper_A1 "<<m_aper_A1<<"\n";
175 particle.addMsg( ost.str() );
176 return true;
177 }
178 }
179 if ( m_aper_A2 > 0. )
180 {
181 if( std::fabs(part_y)>m_aper_A2)
182 {
183 std::ostringstream ost;
184 ost<<"outside for aperture type 3 y test: particle y "<<part_y<<" m_aper_A2 "<<m_aper_A2<<"\n";
185 particle.addMsg( ost.str() );
186 return true;
187 }
188 }
189 if ( m_aper_A3 > 0. && m_aper_A4 > 0. )
190 {
191 float B3=std::tan(m_aper_A3)*m_aper_A1;
192 float B4=m_aper_A2/std::tan(m_aper_A4);
193 float d=(m_aper_A1-std::fabs(part_x))/(m_aper_A1-B4)+(m_aper_A2-std::fabs(part_y))/(m_aper_A2-B3);
194
195 if(d<1.)
196 {
197 std::ostringstream ost;
198 ost<<"outside for aperture type 3 test: particle x "<<part_x<<" particle y "<<part_y<<"; m_aper_A1 "<<m_aper_A1<<" m_aper_A2 "<<m_aper_A2<<" m_aper_A3 "<<m_aper_A3<<" m_aper_A4 "<<m_aper_A4<<"\n";
199 particle.addMsg( ost.str() );
200 return true;
201 }
202 }
203
204 return false;
205 }
206
207 // aperture is checked anly if aperture type i s 1, 2, or 3
208 return false;
209 }
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses

◆ label()

std::string FPTracker::Magnet::label ( ) const
virtual

Implements FPTracker::IBeamElement.

Definition at line 15 of file FPTracker/src/Magnet.cxx.

15 {
16 return m_label+":"+m_bender->label();
17 }

◆ position()

Point FPTracker::Magnet::position ( ) const
virtual

Implements FPTracker::IBeamElement.

Definition at line 59 of file FPTracker/src/Magnet.cxx.

59{return m_center;}

◆ rearFace()

double FPTracker::Magnet::rearFace ( ) const
virtual

Implements FPTracker::IBeamElement.

Definition at line 56 of file FPTracker/src/Magnet.cxx.

56{return m_rearFace;}

◆ side()

Side FPTracker::Magnet::side ( ) const
virtual

Implements FPTracker::IBeamElement.

Definition at line 60 of file FPTracker/src/Magnet.cxx.

60{return m_side;}

◆ str()

std::string FPTracker::Magnet::str ( ) const
virtual

Implements FPTracker::IBeamElement.

Definition at line 212 of file FPTracker/src/Magnet.cxx.

212 {
213 std::ostringstream ost;
214 ost <<" \n\n-- Magnet --\n"
215 << "label " << m_label <<'\n'
216 << "center " << m_center <<'\n'
217 << "frontFace " << m_frontFace <<'\n'
218 << "rearFace " << m_rearFace <<'\n'
219 << "m_strength " << m_strength <<'\n'
220 << "m_apertyp " << m_apertype <<'\n'
221 << "m_aper_A1 " << m_aper_A1 <<'\n'
222 << "m_aper_A2 " << m_aper_A2 <<'\n'
223 << "m_aper_A3 " << m_aper_A3 <<'\n'
224 << "m_aper_A4 " << m_aper_A4 <<'\n'
225 << "m_xb " << m_xb <<'\n'
226 << "m_side " << m_side <<'\n';
227 return ost.str();
228 }

◆ swap()

void FPTracker::Magnet::swap ( Magnet & )
private

◆ track()

void FPTracker::Magnet::track ( IParticle & particle) const
virtual

Implements FPTracker::IBeamElement.

Definition at line 64 of file FPTracker/src/Magnet.cxx.

64 {
65
66 particle.setBeamCoordinateShift(this);
67 if ( particle.isOutOfAperture() ){return;}
68
69
70 // check if particle x,y coordinates wrt to the magnet are in the aperture.
71 if( this->isOutOfAperture( particle ) ){
72 //std::cout<<"lost at front face "<<std::endl;
73 particle.setOutOfAperture(true);
74 return;
75 }
76
77 // update the particle position and direction affected by the bending of the magnet.
78 m_bender->bend(particle);
79 particle.z() = m_rearFace;
80
81 /*
82 std::cout<<"Magnet::track after bend "<<this->m_frontFace<<" "<<this->label()<<'\n'
83 <<"\n position "<<particle.position()
84 <<"\n p dir "<<particle.direction()
85 <<"\n m pos "<<this->position()<<'\n'<<std::endl;
86
87
88 std::cout<<particle<<'\n';
89 */
90
91 if ( this->isOutOfAperture( particle ) )
92 {
93 particle.setOutOfAperture(true);
94 }
95
96 }
bool isOutOfAperture(IParticle &) const

◆ zabspos()

double FPTracker::Magnet::zabspos ( ) const
virtual

Implements FPTracker::IBeamElement.

Definition at line 58 of file FPTracker/src/Magnet.cxx.

58{return std::fabs(m_center.z());}

◆ zsignedpos()

double FPTracker::Magnet::zsignedpos ( ) const
virtual

Implements FPTracker::IBeamElement.

Definition at line 57 of file FPTracker/src/Magnet.cxx.

57{return m_center.z();}

Member Data Documentation

◆ m_aper_A1

double FPTracker::Magnet::m_aper_A1
private

Definition at line 76 of file FPTracker/FPTracker/Magnet.h.

◆ m_aper_A2

double FPTracker::Magnet::m_aper_A2
private

Definition at line 77 of file FPTracker/FPTracker/Magnet.h.

◆ m_aper_A3

double FPTracker::Magnet::m_aper_A3
private

Definition at line 78 of file FPTracker/FPTracker/Magnet.h.

◆ m_aper_A4

double FPTracker::Magnet::m_aper_A4
private

Definition at line 79 of file FPTracker/FPTracker/Magnet.h.

◆ m_apertype

int FPTracker::Magnet::m_apertype
private

Definition at line 75 of file FPTracker/FPTracker/Magnet.h.

◆ m_bender

IBender* FPTracker::Magnet::m_bender {}
private

Definition at line 82 of file FPTracker/FPTracker/Magnet.h.

82{};

◆ m_center

Point FPTracker::Magnet::m_center
private

Definition at line 71 of file FPTracker/FPTracker/Magnet.h.

◆ m_frontFace

double FPTracker::Magnet::m_frontFace
private

Definition at line 72 of file FPTracker/FPTracker/Magnet.h.

◆ m_label

std::string FPTracker::Magnet::m_label
private

Definition at line 83 of file FPTracker/FPTracker/Magnet.h.

◆ m_rearFace

double FPTracker::Magnet::m_rearFace
private

Definition at line 73 of file FPTracker/FPTracker/Magnet.h.

◆ m_side

Side FPTracker::Magnet::m_side
private

Definition at line 81 of file FPTracker/FPTracker/Magnet.h.

◆ m_strength

double FPTracker::Magnet::m_strength
private

Definition at line 74 of file FPTracker/FPTracker/Magnet.h.

◆ m_xb

double FPTracker::Magnet::m_xb
private

Definition at line 80 of file FPTracker/FPTracker/Magnet.h.


The documentation for this class was generated from the following files: