ATLAS Offline Software
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"
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 
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  }
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 
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.
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 
99  {
100  return this->track(particle);
101  }
102 
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 
cmd-l1calo-dq-test.xx
xx
Definition: cmd-l1calo-dq-test.py:16
Trk::ParticleSwitcher::particle
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
Definition: ParticleHypothesis.h:79
python.trigbs_prescaleL1.ost
ost
Definition: trigbs_prescaleL1.py:104
FPTracker::operator<<
std::ostream & operator<<(std::ostream &os, const Beamline &bl)
Definition: FPTracker/src/Beamline.cxx:163
FPTracker::TransversePoint::mag2
double mag2() const
Definition: FPTracker/src/TransversePoint.cxx:25
PlotCalibFromCool.yy
yy
Definition: PlotCalibFromCool.py:714
FPTracker::Magnet::rearFace
double rearFace() const
Definition: FPTracker/src/Magnet.cxx:56
FPTracker::Magnet
Definition: FPTracker/FPTracker/Magnet.h:20
hist_file_dump.d
d
Definition: hist_file_dump.py:142
FPTracker::Magnet::clone
IBeamElement::ConstPtr_t clone() const
Definition: FPTracker/src/Magnet.cxx:50
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:70
TransversePoint.h
FPTracker::IBender
Definition: FPTracker/FPTracker/IBender.h:13
FPTracker::Magnet::side
Side side() const
Definition: FPTracker/src/Magnet.cxx:60
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
x
#define x
FPTracker::Magnet::m_label
std::string m_label
Definition: FPTracker/FPTracker/Magnet.h:83
FPTracker::Magnet::m_xb
double m_xb
Definition: FPTracker/FPTracker/Magnet.h:80
TRT::Hit::side
@ side
Definition: HitInfo.h:83
IBender.h
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_rearFace
double m_rearFace
Definition: FPTracker/FPTracker/Magnet.h:73
FPTracker::Magnet::position
Point position() const
Definition: FPTracker/src/Magnet.cxx:59
FPTracker::IBeamElement::ConstPtr_t
std::shared_ptr< const IBeamElement > ConstPtr_t
Definition: FPTracker/FPTracker/IBeamElement.h:40
add-xsec-uncert-quadrature-N.label
label
Definition: add-xsec-uncert-quadrature-N.py:104
Side
Definition: WaferTree.h:36
FPTracker::Magnet::zsignedpos
double zsignedpos() const
Definition: FPTracker/src/Magnet.cxx:57
FPTracker::Magnet::isOutOfAperture
bool isOutOfAperture(IParticle &) const
Definition: FPTracker/src/Magnet.cxx:103
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
FPTracker::Magnet::m_aper_A1
double m_aper_A1
Definition: FPTracker/FPTracker/Magnet.h:76
FPTracker::Point::z
double z() const
Definition: FPTracker/src/Point.cxx:19
ReadFromCoolCompare.os
os
Definition: ReadFromCoolCompare.py:231
FPTracker::Magnet::track
void track(IParticle &) const
Definition: FPTracker/src/Magnet.cxx:64
FPTracker::Point
Definition: FPTracker/FPTracker/Point.h:14
ParticleGun_SamplingFraction.radius
radius
Definition: ParticleGun_SamplingFraction.py:96
FPTracker::Magnet::zabspos
double zabspos() const
Definition: FPTracker/src/Magnet.cxx:58
DataModelTestDataCommonDict::xb
DMTest::CView::Pers_t xb
Definition: DataModelTestDataCommonDict.h:55
FPTracker::Magnet::label
std::string label() const
Definition: FPTracker/src/Magnet.cxx:15
FPTracker::Magnet::m_aper_A2
double m_aper_A2
Definition: FPTracker/FPTracker/Magnet.h:77
FPTracker::TransversePoint::x
double x() const
Definition: FPTracker/src/TransversePoint.cxx:16
FPTracker::Magnet::m_aper_A3
double m_aper_A3
Definition: FPTracker/FPTracker/Magnet.h:78
FPTracker::Magnet::m_apertype
int m_apertype
Definition: FPTracker/FPTracker/Magnet.h:75
y
#define y
FPTracker::Magnet::m_frontFace
double m_frontFace
Definition: FPTracker/FPTracker/Magnet.h:72
FPTracker::Magnet::m_side
Side m_side
Definition: FPTracker/FPTracker/Magnet.h:81
FPTracker::Magnet::m_bender
IBender * m_bender
Definition: FPTracker/FPTracker/Magnet.h:82
FPTracker::IBender::label
virtual std::string label() const =0
Particle.h
FPTracker::Magnet::m_aper_A4
double m_aper_A4
Definition: FPTracker/FPTracker/Magnet.h:79
FPTracker::IBender::bend
virtual void bend(IParticle &) const =0
FPTracker
Definition: FPTracker/FPTracker/Beamline.h:12
Magnet.h
FPTracker::Magnet::str
std::string str() const
Definition: FPTracker/src/Magnet.cxx:212
FPTracker::Magnet::frontFace
double frontFace() const
Definition: FPTracker/src/Magnet.cxx:55
FPTracker::TransversePoint::y
double y() const
Definition: FPTracker/src/TransversePoint.cxx:17
FPTracker::IParticle
Definition: ForwardDetectors/FPTracker/FPTracker/IParticle.h:17
FPTracker::Magnet::isEndElement
bool isEndElement() const
Definition: FPTracker/src/Magnet.cxx:62
FPTracker::TransversePoint
Definition: FPTracker/FPTracker/TransversePoint.h:12
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
mag
Scalar mag() const
mag method
Definition: AmgMatrixBasePlugin.h:26
FPTracker::Magnet::calibrate
void calibrate(IParticle &)
Definition: FPTracker/src/Magnet.cxx:98