Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
FPGATrackSimKeyLayerTool.cxx
Go to the documentation of this file.
1 // Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2 
4 
5 //
6 //
7 // Tool for doing Key Layer Math
8 //
9 //
10 
11 std::pair<double, double> FPGATrackSimKeyLayerTool::getXY(double r, double phi) const
12 {
13  return std::pair<double, double>(r * cos(phi), r * sin(phi));
14 }
15 
16 std::pair<double, double> FPGATrackSimKeyLayerTool::getRotationAngles(const std::pair<double, double>& xy1, const std::pair<double, double>& xy2) const
17 {
18  double dr12x = xy2.first - xy1.first;
19  double dr12y = xy2.second - xy1.second;
20  double dr12mag = std::hypot(dr12x, dr12y);
21  double cos_rot = dr12y / dr12mag;
22  double sin_rot = -dr12x / dr12mag;
23  return std::pair<double, double>(cos_rot, sin_rot);
24 }
25 
26 std::pair<double, double> FPGATrackSimKeyLayerTool::rotateXY(const std::pair<double, double>& xy, const std::pair<double, double>& ang) const
27 {
28  return std::pair<double, double>(xy.first * ang.first + xy.second * ang.second,
29  -xy.first * ang.second + xy.second * ang.first);
30 }
31 
33 {
35 
36  auto xy1 = getXY(m_R1, keypars.phi1);
37  auto xy2 = getXY(m_R2, keypars.phi2);
38 
39  result.rotang = getRotationAngles(xy1, xy2);
40  result.xy1p = rotateXY(xy1, result.rotang);
41  result.xy2p = rotateXY(xy2, result.rotang);
42  result.y = result.xy2p.second - result.xy1p.second;
43 
44  return result;
45 }
46 
47 std::pair<double, double> FPGATrackSimKeyLayerTool::getRotatedHit(const std::pair<double, double>& rotang, const FPGATrackSimHit *hit) const
48 {
49  auto xyh = getXY(hit->getR(), hit->getGPhi());
50  return rotateXY(xyh, rotang);
51 }
52 
54 {
55  KeyLyrPars retv;
60 
62  if (Rinv != 0)
63  {
64  double R = 1 / Rinv;
65  auto xy1 = getXY(m_R1, retv.phi1);
66  auto xy2 = getXY(m_R2, retv.phi2);
67  double ysqr = (xy2.first - xy1.first) * (xy2.first - xy1.first) + (xy2.second - xy1.second) * (xy2.second - xy1.second);
68  double sign = (R > 0) - (R < 0);
69  retv.xm = -1 * sign * (std::abs(R) - sqrt(R * R - ysqr / 4.0));
70  }
71  else
72  {
73  retv.xm = 0;
74  }
75 
76  return retv;
77 }
78 
80 {
81 
83  pars[FPGATrackSimTrackPars::IZ0] = (keypars.z1 * m_R2 - keypars.z2 * m_R1) / (m_R2 - m_R1);
85 
86  // This is the exact math which is a bit messy
87  // if you want the math contact lipeles@sas.upenn.edu
88 
89  double xm = keypars.xm;
90 
91  auto rotated_coords = getRotatedConfig(keypars);
92  auto xy1p = rotated_coords.xy1p;
93  auto rotang = rotated_coords.rotang;
94  auto y = rotated_coords.y;
95 
96  // reverse rotation
97  auto revang = rotang;
98  revang.second = -rotang.second;
99 
100  if (xm != 0)
101  {
102  double Rinv = 2 * xm / (xm * xm + (y / 2) * (y / 2));
103  double d = (y * y / 4.0 - xm * xm) / (2.0 * xm);
104  double sign = (xm > 0) - (xm < 0);
105 
107 
108  std::pair<double, double> xycp(-d + xy1p.first, y / 2.0 + xy1p.second);
109 
110  pars[FPGATrackSimTrackPars::ID0] = -1 * sign * (std::abs(1 / Rinv) - std::hypot(xycp.first, xycp.second));
111 
112  auto xyc = rotateXY(xycp, revang);
113 
114  pars[FPGATrackSimTrackPars::IPHI] = std::atan2(sign * -xyc.first, sign * xyc.second);
115  }
116  else
117  {
119  pars[FPGATrackSimTrackPars::ID0] = -1 * xy1p.first;
120  pars[FPGATrackSimTrackPars::IPHI] = std::atan2(rotang.first, -rotang.second);
121  }
122 
123  return pars;
124 }
125 
126 double FPGATrackSimKeyLayerTool::zExpected(const KeyLyrPars& keypars, double r) const
127 {
128  return (keypars.z2 - keypars.z1) / (m_R2 - m_R1) * (r - m_R1) + keypars.z1;
129 }
130 
131 // takes hit position and calculated what xm should be for that hit
132 double FPGATrackSimKeyLayerTool::xmForHit(const KeyLyrPars& keypars, const FPGATrackSimHit *hit) const
133 {
134  auto rotated_coords = getRotatedConfig(keypars);
135  auto xy1p = rotated_coords.xy1p;
136  auto rotang = rotated_coords.rotang;
137  auto y = rotated_coords.y;
138 
139  auto xyhp = getRotatedHit(rotang, hit);
140  double xh = xyhp.first - xy1p.first;
141  double yh = xyhp.second - xy1p.second;
142 
143  // use taylor expanded xm calculation
144  double sign = ((yh > 0) && (yh < y)) ? 1 : -1;
145  if ((std::abs(yh) < std::abs(xh)) || (std::abs(y - yh) < std::abs(xh)))
146  {
147  return ((xh > 0) ? 1 : -1) * 100000;
148  }
149 
150  double xm_taylor = sign * y * y / (y * y - 4 * xh * xh - 4 * (yh - y / 2.0) * (yh - y / 2.0)) * xh;
151 
152  return xm_taylor;
153 }
154 
155 // Find shift from nominal track to hit in the "x" direction
156 double FPGATrackSimKeyLayerTool::deltaX(const KeyLyrPars& keypars, const FPGATrackSimHit *hit) const
157 {
158  auto rotated_coords = getRotatedConfig(keypars);
159 
160  auto rotang = rotated_coords.rotang;
161 
162  auto xyhp = getRotatedHit(rotang, hit);
163 
164  double xh = xyhp.first-rotated_coords.xy1p.first;
165 
166  return xh - xExpected(keypars,hit);
167 }
168 
169 // Find shift from nominal track to hit in the "x" direction
170 double FPGATrackSimKeyLayerTool::xExpected(const KeyLyrPars& keypars, const FPGATrackSimHit *hit) const
171 {
172  auto rotated_coords = getRotatedConfig(keypars);
173 
174  auto rotang = rotated_coords.rotang;
175  auto y = rotated_coords.y;
176 
177  auto xyhp = getRotatedHit(rotang, hit);
178 
179  double yh = xyhp.second-rotated_coords.xy1p.second;
180 
181  return keypars.xm * (keypars.xm * keypars.xm + yh * (y - yh)) / (keypars.xm * keypars.xm + (y / 2) * (y / 2));
182 }
183 
184 
make_hlt_rep.pars
pars
Definition: make_hlt_rep.py:90
FPGATrackSimTrackPars::IHIP
@ IHIP
Definition: FPGATrackSimTrackPars.h:49
beamspotman.r
def r
Definition: beamspotman.py:676
FPGATrackSimTrackPars::ID0
@ ID0
Definition: FPGATrackSimTrackPars.h:49
FPGATrackSimKeyLayerTool::getRotatedHit
std::pair< double, double > getRotatedHit(const std::pair< double, double > &rotang, const FPGATrackSimHit *hit) const
Definition: FPGATrackSimKeyLayerTool.cxx:47
get_generator_info.result
result
Definition: get_generator_info.py:21
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
FPGATrackSimBinUtil::GeomHelpers::phiFromPars
static double phiFromPars(double r, const FPGATrackSimTrackPars &pars)
Definition: FPGATrackSimBinUtil.cxx:167
FPGATrackSimTrackPars
Definition: FPGATrackSimTrackPars.h:22
FPGATrackSimKeyLayerTool.h
Binning Classes for BinTool.
hist_file_dump.d
d
Definition: hist_file_dump.py:143
FPGATrackSimTrackPars::IZ0
@ IZ0
Definition: FPGATrackSimTrackPars.h:49
FPGATrackSimKeyLayerTool::rotatedConfig
Definition: FPGATrackSimKeyLayerTool.h:75
FPGATrackSimKeyLayerTool::rotateXY
std::pair< double, double > rotateXY(const std::pair< double, double > &xy, const std::pair< double, double > &ang) const
Definition: FPGATrackSimKeyLayerTool.cxx:26
FPGATrackSimKeyLayerTool::xmForHit
double xmForHit(const KeyLyrPars &keypars, const FPGATrackSimHit *hit) const
Definition: FPGATrackSimKeyLayerTool.cxx:132
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
FPGATrackSimKeyLayerTool::KeyLyrPars::xm
double xm
Definition: FPGATrackSimKeyLayerTool.h:60
FPGATrackSimKeyLayerTool::KeyLyrPars::phi2
double phi2
Definition: FPGATrackSimKeyLayerTool.h:59
FPGATrackSimKeyLayerTool::m_R2
double m_R2
Definition: FPGATrackSimKeyLayerTool.h:110
FPGATrackSimHit
Definition: FPGATrackSimHit.h:41
FPGATrackSimHit::getGPhi
float getGPhi() const
Definition: FPGATrackSimHit.h:144
FPGATrackSimBinUtil::GeomHelpers::CurvatureConstant
static constexpr double CurvatureConstant
Definition: FPGATrackSimBinUtil.h:111
FPGATrackSimKeyLayerTool::deltaX
double deltaX(const KeyLyrPars &keypars, const FPGATrackSimHit *hit) const
Definition: FPGATrackSimKeyLayerTool.cxx:156
sign
int sign(int a)
Definition: TRT_StrawNeighbourSvc.h:107
AnalysisUtils::Delta::R
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
Definition: AnalysisMisc.h:49
FPGATrackSimKeyLayerTool::KeyLyrPars::z2
double z2
Definition: FPGATrackSimKeyLayerTool.h:57
FPGATrackSimKeyLayerTool::KeyLyrPars::phi1
double phi1
Definition: FPGATrackSimKeyLayerTool.h:58
FPGATrackSimKeyLayerTool::trackParsToKeyPars
KeyLyrPars trackParsToKeyPars(const FPGATrackSimTrackPars &pars) const
Definition: FPGATrackSimKeyLayerTool.cxx:53
FPGATrackSimKeyLayerTool::getRotatedConfig
rotatedConfig getRotatedConfig(const KeyLyrPars &keypars) const
Definition: FPGATrackSimKeyLayerTool.cxx:32
FPGATrackSimBinUtil::GeomHelpers::EtaFromTheta
static double EtaFromTheta(double theta)
Definition: FPGATrackSimBinUtil.cxx:151
FPGATrackSimTrackPars::IPHI
@ IPHI
Definition: FPGATrackSimTrackPars.h:49
FPGATrackSimKeyLayerTool::KeyLyrPars::z1
double z1
Definition: FPGATrackSimKeyLayerTool.h:56
FPGATrackSimHit::getR
float getR() const
Definition: FPGATrackSimHit.h:143
FPGATrackSimKeyLayerTool::xExpected
double xExpected(const KeyLyrPars &keypars, const FPGATrackSimHit *hit) const
Definition: FPGATrackSimKeyLayerTool.cxx:170
y
#define y
FPGATrackSimKeyLayerTool::zExpected
double zExpected(const KeyLyrPars &keypars, double r) const
Definition: FPGATrackSimKeyLayerTool.cxx:126
FPGATrackSimBinUtil::GeomHelpers::zFromPars
static double zFromPars(double r, const FPGATrackSimTrackPars &pars)
Definition: FPGATrackSimBinUtil.cxx:156
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
FPGATrackSimKeyLayerTool::getRotationAngles
std::pair< double, double > getRotationAngles(const std::pair< double, double > &xy1, const std::pair< double, double > &xy2) const
Definition: FPGATrackSimKeyLayerTool.cxx:16
FPGATrackSimKeyLayerTool::getXY
std::pair< double, double > getXY(double r, double phi) const
Definition: FPGATrackSimKeyLayerTool.cxx:11
FPGATrackSimKeyLayerTool::keyParsToTrackPars
FPGATrackSimTrackPars keyParsToTrackPars(const KeyLyrPars &keypars) const
Definition: FPGATrackSimKeyLayerTool.cxx:79
FPGATrackSimKeyLayerTool::KeyLyrPars
Definition: FPGATrackSimKeyLayerTool.h:52
FPGATrackSimKeyLayerTool::m_R1
double m_R1
Definition: FPGATrackSimKeyLayerTool.h:109
FPGATrackSimTrackPars::IETA
@ IETA
Definition: FPGATrackSimTrackPars.h:49