17 unsigned int N = dcs.size();
27 for (
unsigned int i = 0;
i <
N; ++
i) {
36 double S{0}, Sz{0}, Sy{0};
39 std::vector<FitData>
data;
42 for (
const DCOnTrack&
it : dcs) {
46 datum.r = std::abs(
it.r());
51 Sz += datum.w * datum.z;
52 Sy += datum.w * datum.y;
54 data.push_back(std::move(datum));
61 throw std::runtime_error(
"DCSLFitter::fit: S is approx. zero!");
69 double Syy{0}, Szy{0}, Syyzz{0};
71 for (
unsigned int i = 0;
i <
N; ++
i) {
72 FitData& datum =
data[
i];
80 datum.rw = datum.r * datum.w;
81 datum.ryw = datum.rw * datum.y;
82 datum.rzw = datum.rw * datum.z;
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;
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};
99 }
else if (
sc.sn == 0.0 &&
sc.cs < 0.0) {
104 double d =
line.y0() +
sc.apply (Zc, -Yc);
106 while (
count < 100) {
109 for (
unsigned int i = 0;
i <
N; ++
i) {
113 FitData& datum =
data[
i];
115 double dist =
sc.apply (-datum.z, datum.y);;
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;
130 if (
data.capacity() > 100) {
132 result.dcs().reserve(100);
142 sc.sn = std::abs(
sc.sn);
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);
156 double yl{0},
chi2{0};
162 result.clusters().clear();
163 result.emptyTubes().clear();
165 unsigned int nhits{0};
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;
177 chi2 += residuals * residuals * datum.w;
179 result.dcs().emplace_back(dcs[
i]);
180 result.dcs().back().residual(residuals);
181 result.dcs().back().errorTrack(errorResiduals);