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 12 of file Tracking/TrkUtilityPackages/TrkDriftCircleMath/src/DCSLFitter.cxx.

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

◆ 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
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
jobOption.theta
theta
Definition: jobOption.ParticleGun_fwd_sequence.py:13
selection
const std::string selection
Definition: fbtTestBasics.cxx:75
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