ATLAS Offline Software
Classes | Public Member Functions | List of all members
TrkDriftCircleMath::DCSLFitter Class Reference

#include <DCSLFitter.h>

Inheritance diagram for TrkDriftCircleMath::DCSLFitter:
Collaboration diagram for TrkDriftCircleMath::DCSLFitter:

Classes

struct  FitData
 

Public Member Functions

 DCSLFitter ()=default
 
virtual ~DCSLFitter ()=default
 
virtual bool fit (Segment &result, const Line &line, const DCOnTrackVec &dcs, double t0Seed=-99999.) const
 
virtual bool fit (Segment &result, const Line &line, const DCOnTrackVec &dcs, const HitSelection &selection, double t0Seed=-99999.) const
 

Detailed Description

Definition at line 17 of file Tracking/TrkUtilityPackages/TrkDriftCircleMath/TrkDriftCircleMath/DCSLFitter.h.

Constructor & Destructor Documentation

◆ DCSLFitter()

TrkDriftCircleMath::DCSLFitter::DCSLFitter ( )
default

◆ ~DCSLFitter()

virtual TrkDriftCircleMath::DCSLFitter::~DCSLFitter ( )
virtualdefault

Member Function Documentation

◆ fit() [1/2]

bool TrkDriftCircleMath::DCSLFitter::fit ( Segment result,
const Line line,
const DCOnTrackVec dcs,
const HitSelection selection,
double  t0Seed = -99999. 
) const
virtual

Reimplemented in TrkDriftCircleMath::MdtSegmentT0Fitter.

Definition at line 14 of file Tracking/TrkUtilityPackages/TrkDriftCircleMath/src/DCSLFitter.cxx.

15  {
16 
17  unsigned int N = dcs.size();
18 
19  if (N < 2) {
20  return false;
21  }
22 
23  if (selection.size() != N) {
24  return false;
25  } else {
26  int used(0);
27  for (unsigned int i = 0; i < N; ++i) {
28  if (selection[i] == 0)
29  ++used;
30  }
31  if (used < 2) {
32  return false;
33  }
34  }
35 
36  double S{0}, Sz{0}, Sy{0};
37  double Zc{0}, Yc{0};
38  // reserve enough space for hits
39  std::vector<FitData> data;
40  data.reserve(N);
41  unsigned int ii = 0;
42  for (const DCOnTrack& it : dcs) {
43  FitData datum{};
44  datum.y = it.y();
45  datum.z = it.x();
46  datum.r = std::abs(it.r());
47  datum.w = std::pow(it.dr() > 0. ? 1. / it.dr() : 0., 2);
48 
49  if (selection[ii] == 0) {
50  S += datum.w;
51  Sz += datum.w * datum.z;
52  Sy += datum.w * datum.y;
53  }
54  data.push_back(std::move(datum));
55  ++ii;
56  }
57  if (not close_to_zero(S)){
58  Zc = Sz / S;
59  Yc = Sy / S;
60  } else{
61  throw std::runtime_error("DCSLFitter::fit: S is approx. zero!");
62  }
63 
64  //
65  // shift hits
66  //
67  Sy = 0;
68  Sz = 0;
69  double Syy{0}, Szy{0}, Syyzz{0};
70 
71  for (unsigned int i = 0; i < N; ++i) {
72  FitData& datum = data[i];
73 
74  datum.y -= Yc;
75  datum.z -= Zc;
76 
77  if (selection[i])
78  continue;
79 
80  datum.rw = datum.r * datum.w;
81  datum.ryw = datum.rw * datum.y;
82  datum.rzw = datum.rw * datum.z;
83 
84  Syy += datum.y * datum.y * datum.w;
85  Szy += datum.y * datum.z * datum.w;
86  Syyzz += (datum.y - datum.z) * (datum.y + datum.z) * datum.w;
87  }
88 
89  unsigned int count{0};
90  double R{0}, Ry{0}, Rz{0}, Att{0}, Add{S}, Bt{0}, Bd{0}, Stt{0}, Sd{0};
91 
92  double theta = line.phi();
94 
95  // make sure 0 <= theta < PI
96  if (sc.sn < 0.0) {
97  sc.sn = -sc.sn;
98  sc.cs = -sc.cs;
99  } else if (sc.sn == 0.0 && sc.cs < 0.0) {
100  sc.cs = -sc.cs;
101  }
102  //
103  // calculate shift
104  double d = line.y0() + sc.apply (Zc, -Yc);
105 
106  while (count < 100) {
107  R = Ry = Rz = 0;
108 
109  for (unsigned int i = 0; i < N; ++i) {
110  if (selection[i])
111  continue;
112 
113  FitData& datum = data[i];
114 
115  double dist = sc.apply (-datum.z, datum.y);;
116  if (dist > d) {
117  R -= datum.rw;
118  Ry -= datum.ryw;
119  Rz -= datum.rzw;
120  } else {
121  R += datum.rw;
122  Ry += datum.ryw;
123  Rz += datum.rzw;
124  }
125  }
126  Att = Syy + sc.cs * (2 * sc.sn * Szy - sc.cs * Syyzz);
127  Bt = -Szy + sc.cs * (sc.sn * Syyzz + 2 * sc.cs * Szy + Rz) + sc.sn * Ry;
128  Bd = -S * d + R;
129  if (Att == 0) {
130  if (data.capacity() > 100) {
131  data.reserve(100);
132  result.dcs().reserve(100);
133  }
134  return false;
135  }
136  theta += Bt / Att;
137  if (theta < 0.0)
138  theta += M_PI;
139  if (theta >= M_PI)
140  theta -= M_PI;
142  sc.sn = std::abs(sc.sn);
143  d = R / S;
144  if (std::abs(Bt / Att) < 0.001 && std::abs(Bd / Add) < 0.001) {
145  Stt = std::sqrt(1 / Att);
146  Sd = std::sqrt(1 / Add);
147  break;
148  }
149  ++count;
150  }
151  // Fit did not converge
152  if (count >= 100) {
153  return false;
154  }
155 
156  double yl{0}, chi2{0};
157 
158  double dtheta = Stt;
159  double dy0 = Sd;
160 
161  result.dcs().clear();
162  result.clusters().clear();
163  result.emptyTubes().clear();
164 
165  unsigned int nhits{0};
166 
167  // calculate predicted hit positions from track parameters
168  result.dcs().reserve(N);
169  for (unsigned int i = 0; i < N; ++i) {
170  FitData& datum = data[i];
171  yl = sc.apply (-datum.z, datum.y) - d;
172  double dth = -sc.apply (datum.y, datum.z) * Stt;
173  double errorResiduals = std::hypot(dth, Sd);
174  double residuals = std::abs(yl) - datum.r;
175  if (selection[i] == 0) {
176  ++nhits;
177  chi2 += residuals * residuals * datum.w;
178  }
179  result.dcs().emplace_back(dcs[i]);
180  result.dcs().back().residual(residuals);
181  result.dcs().back().errorTrack(errorResiduals);
182  }
183  if (nhits>=2){
184  result.set(chi2, nhits - 2, dtheta, dy0);
185  result.line().set(LocVec2D(Zc - sc.sn * d, Yc + sc.cs * d), theta);
186  }
187 
188  return true;
189 }

◆ fit() [2/2]

bool TrkDriftCircleMath::DCSLFitter::fit ( Segment result,
const Line line,
const DCOnTrackVec dcs,
double  t0Seed = -99999. 
) const
inlinevirtual

Reimplemented in TrkDriftCircleMath::MdtSegmentT0Fitter.

Definition at line 38 of file Tracking/TrkUtilityPackages/TrkDriftCircleMath/TrkDriftCircleMath/DCSLFitter.h.

39  {
40  HitSelection selection(dcs.size(), 0);
41  return fit(result, line, dcs, selection);
42 }

The documentation for this class was generated from the following files:
used
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
get_generator_info.result
result
Definition: get_generator_info.py:21
TrkDriftCircleMath::DCSLFitter::fit
virtual bool fit(Segment &result, const Line &line, const DCOnTrackVec &dcs, double t0Seed=-99999.) const
Definition: Tracking/TrkUtilityPackages/TrkDriftCircleMath/TrkDriftCircleMath/DCSLFitter.h:38
hist_file_dump.d
d
Definition: hist_file_dump.py:142
theta
Scalar theta() const
theta method
Definition: AmgMatrixBasePlugin.h:75
TrkDriftCircleMath::HitSelection
std::vector< bool > HitSelection
Definition: HitSelection.h:9
skel.it
it
Definition: skel.GENtoEVGEN.py:407
M_PI
#define M_PI
Definition: ActiveFraction.h:11
JetTiledMap::N
@ N
Definition: TiledEtaPhiMap.h:44
JetTiledMap::S
@ S
Definition: TiledEtaPhiMap.h:44
dq_defect_bulk_create_defects.line
line
Definition: dq_defect_bulk_create_defects.py:27
XMLtoHeader.count
count
Definition: XMLtoHeader.py:84
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
lumiFormat.i
int i
Definition: lumiFormat.py:85
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:525
AnalysisUtils::Delta::R
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
Definition: AnalysisMisc.h:49
selection
const std::string selection
Definition: fbtTestBasics.cxx:75
CxxUtils::close_to_zero
bool close_to_zero(T value, T eps=std::numeric_limits< T >::epsilon())
Definition: close_to_zero.h:48
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
CxxUtils::sincos
Helper to simultaneously calculate sin and cos of the same angle.
Definition: sincos.h:39
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15