ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
ForwardDetectors
FPTracker
src
FPTracker/src/Magnet.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
#include "
FPTracker/Magnet.h
"
6
#include "
FPTracker/Particle.h
"
7
#include "
FPTracker/TransversePoint.h
"
8
#include "
FPTracker/IBender.h
"
9
#include <sstream>
10
#include <cmath>
11
#include <cassert>
12
13
namespace
FPTracker
{
14
15
std::string
Magnet::label
()
const
{
16
return
m_label
+
":"
+
m_bender
->label();
17
}
18
19
Magnet::Magnet
(
20
double
x
,
21
double
y
,
22
double
center,
23
double
strength,
24
double
length
,
25
int
apertype,
26
double
aper_A1,
27
double
aper_A2,
28
double
aper_A3,
29
double
aper_A4,
30
double
xb,
31
Side
side
,
32
IBender
* bender,
33
const
std::string&
label
):
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),
46
m_label
(
label
){
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
}
50
IBeamElement::ConstPtr_t
Magnet::clone
()
const
{
51
IBeamElement::ConstPtr_t
pm(
new
Magnet
(*
this
));
52
return
pm;
53
}
54
55
double
Magnet::frontFace
()
const
{
return
m_frontFace
;}
56
double
Magnet::rearFace
()
const
{
return
m_rearFace
;}
57
double
Magnet::zsignedpos
()
const
{
return
m_center
.z();}
58
double
Magnet::zabspos
()
const
{
return
std::fabs(
m_center
.z());}
59
Point
Magnet::position
()
const
{
return
m_center
;}
60
Side
Magnet::side
()
const
{
return
m_side
;}
61
62
bool
Magnet::isEndElement
()
const
{
return
false
;}
63
64
void
Magnet::track
(
IParticle
& particle)
const
{
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
}
97
98
void
Magnet::calibrate
(
IParticle
& particle)
99
{
100
return
this->
track
(particle);
101
}
102
103
bool
Magnet::isOutOfAperture
(
IParticle
& particle)
const
{
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
}
210
211
212
std::string
Magnet::str
()
const
{
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
}
229
std::ostream&
operator<<
(std::ostream& os,
const
Magnet
&
mag
){
230
os <<
mag
.str();
231
return
os;
232
}
233
}
234
mag
Scalar mag() const
mag method
Definition
AmgMatrixBasePlugin.h:26
length
double length(const pvec &v)
Definition
FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
IBender.h
Magnet.h
TransversePoint.h
Particle.h
y
#define y
x
#define x
FPTracker::IBeamElement::ConstPtr_t
std::shared_ptr< const IBeamElement > ConstPtr_t
Definition
FPTracker/FPTracker/IBeamElement.h:40
FPTracker::IBender
Definition
FPTracker/FPTracker/IBender.h:13
FPTracker::IParticle
Definition
ForwardDetectors/FPTracker/FPTracker/IParticle.h:17
FPTracker::Magnet
Definition
FPTracker/FPTracker/Magnet.h:20
FPTracker::Magnet::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
FPTracker/src/Magnet.cxx:19
FPTracker::Magnet::m_apertype
int m_apertype
Definition
FPTracker/FPTracker/Magnet.h:75
FPTracker::Magnet::m_center
Point m_center
Definition
FPTracker/FPTracker/Magnet.h:71
FPTracker::Magnet::m_strength
double m_strength
Definition
FPTracker/FPTracker/Magnet.h:74
FPTracker::Magnet::m_frontFace
double m_frontFace
Definition
FPTracker/FPTracker/Magnet.h:72
FPTracker::Magnet::m_aper_A4
double m_aper_A4
Definition
FPTracker/FPTracker/Magnet.h:79
FPTracker::Magnet::m_aper_A2
double m_aper_A2
Definition
FPTracker/FPTracker/Magnet.h:77
FPTracker::Magnet::calibrate
void calibrate(IParticle &)
Definition
FPTracker/src/Magnet.cxx:98
FPTracker::Magnet::clone
IBeamElement::ConstPtr_t clone() const
Definition
FPTracker/src/Magnet.cxx:50
FPTracker::Magnet::track
void track(IParticle &) const
Definition
FPTracker/src/Magnet.cxx:64
FPTracker::Magnet::m_aper_A3
double m_aper_A3
Definition
FPTracker/FPTracker/Magnet.h:78
FPTracker::Magnet::side
Side side() const
Definition
FPTracker/src/Magnet.cxx:60
FPTracker::Magnet::frontFace
double frontFace() const
Definition
FPTracker/src/Magnet.cxx:55
FPTracker::Magnet::m_side
Side m_side
Definition
FPTracker/FPTracker/Magnet.h:81
FPTracker::Magnet::str
std::string str() const
Definition
FPTracker/src/Magnet.cxx:212
FPTracker::Magnet::position
Point position() const
Definition
FPTracker/src/Magnet.cxx:59
FPTracker::Magnet::label
std::string label() const
Definition
FPTracker/src/Magnet.cxx:15
FPTracker::Magnet::rearFace
double rearFace() const
Definition
FPTracker/src/Magnet.cxx:56
FPTracker::Magnet::m_bender
IBender * m_bender
Definition
FPTracker/FPTracker/Magnet.h:82
FPTracker::Magnet::m_label
std::string m_label
Definition
FPTracker/FPTracker/Magnet.h:83
FPTracker::Magnet::isEndElement
bool isEndElement() const
Definition
FPTracker/src/Magnet.cxx:62
FPTracker::Magnet::m_aper_A1
double m_aper_A1
Definition
FPTracker/FPTracker/Magnet.h:76
FPTracker::Magnet::m_rearFace
double m_rearFace
Definition
FPTracker/FPTracker/Magnet.h:73
FPTracker::Magnet::m_xb
double m_xb
Definition
FPTracker/FPTracker/Magnet.h:80
FPTracker::Magnet::isOutOfAperture
bool isOutOfAperture(IParticle &) const
Definition
FPTracker/src/Magnet.cxx:103
FPTracker::Magnet::zsignedpos
double zsignedpos() const
Definition
FPTracker/src/Magnet.cxx:57
FPTracker::Magnet::zabspos
double zabspos() const
Definition
FPTracker/src/Magnet.cxx:58
FPTracker::Point
Definition
FPTracker/FPTracker/Point.h:14
FPTracker::TransversePoint
Definition
FPTracker/FPTracker/TransversePoint.h:12
FPTracker::TransversePoint::mag2
double mag2() const
Definition
FPTracker/src/TransversePoint.cxx:25
FPTracker::TransversePoint::y
double y() const
Definition
FPTracker/src/TransversePoint.cxx:17
FPTracker::TransversePoint::x
double x() const
Definition
FPTracker/src/TransversePoint.cxx:16
FPTracker
Definition
FPTracker/FPTracker/Beamline.h:12
FPTracker::operator<<
std::ostream & operator<<(std::ostream &os, const Beamline &bl)
Definition
FPTracker/src/Beamline.cxx:163
FPTracker::Side
Side
Definition
FPTrackerConstants.h:12
Generated on
for ATLAS Offline Software by
1.17.0