ATLAS Offline Software
Loading...
Searching...
No Matches
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

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();
93 CxxUtils::sincos sc (theta);
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;
141 sc = CxxUtils::sincos (theta);
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}
#define M_PI
Scalar theta() const
theta method
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
bool close_to_zero(T value, T eps=std::numeric_limits< T >::epsilon())
static Double_t sc
double chi2(TH1 *h0, TH1 *h1)
const std::string selection
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)

◆ 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}
virtual bool fit(Segment &result, const Line &line, const DCOnTrackVec &dcs, double t0Seed=-99999.) const
std::vector< bool > HitSelection
Definition HitSelection.h:9

The documentation for this class was generated from the following files: