46 constexpr int BinsX{10};
47 constexpr int BinsY{20};
48 constexpr double MaxExtrapolationStep{10.};
52 auto stations = std::vector<kf::ActiveLayer<double>>{};
55 stations.emplace_back(layer);
62 double zFstSta = Cast<F, double>(actSetup.
GetActiveLayer(0).GetZref());
63 if (zFstSta - target.GetZ() < 1.e-2) {
64 throw std::runtime_error(fmt::format(
"The first station (z={}) is too close to or before the target (z={})",
65 zFstSta, target.GetZ()));
72 for (
int iStaM = 0; iStaM < actSetup.
GetNofLayers(); ++iStaM) {
73 const auto& staM = stations[iStaM];
74 for (
int iGap = 0; iGap < MaxNofTripletGaps; ++iGap) {
75 auto& swMap = res.
DoubletSw(iIter, iStaM, iGap);
76 swMap.
Init(target.GetX(), target.GetY(), target.GetZ(),
78 staM.GetXmin(), staM.GetXmax(), BinsX,
79 staM.GetYmin(), staM.GetYmax(), BinsY);
82 int iStaL = iStaM - iGap - 1;
83 if (iStaL < 0)
continue;
84 if (iGap > iter.GetMaxStationGap())
continue;
85 const auto& staL = stations[iStaL];
88 double stepXm = 0.3 * (staM.GetXmax() - staM.GetXmin()) / BinsX;
89 double stepYm = 0.3 * (staM.GetYmax() - staM.GetYmin()) / BinsY;
90 for (
double xm = staM.GetXmin(); xm <= staM.GetXmax(); xm += stepXm) {
91 for (
double ym = staM.GetYmin(); ym <= staM.GetYmax(); ym += stepYm) {
93 const double dzm = staM.GetZref() - target.GetZ();
102 T.
X() = target.GetX();
103 T.Y() = target.GetY();
104 T.Z() = target.GetZ();
105 T.Tx() = (xm - target.GetX()) / dzm;
106 T.Ty() = (ym - target.GetY()) / dzm;
111 const double slopeVar = iter.GetMaxSlopePV() * iter.GetMaxSlopePV() / 9.;
112 const double maxQp = iter.GetMaxQp();
113 const double qpVar = maxQp * maxQp / 9.;
115 T.ResetErrors(0., 0., slopeVar, slopeVar, qpVar, 0., 1.e+10);
116 T.InitVelocityRange(1. / iter.GetMaxQp());
117 T.C00() = iter.GetTargetPosSigmaX() * iter.GetTargetPosSigmaX();
119 T.C11() = iter.GetTargetPosSigmaY() * iter.GetTargetPosSigmaY();
135 double dxM = 3.5 * std::sqrt(T.C00());
136 double dyM = 3.5 * std::sqrt(T.C11());
137 assert(std::isfinite(dxM));
138 assert(std::isfinite(dyM));
139 swMap.GetMap().Update(xm, ym, dxM, dyM, 0.);
150 for (
int iStaR = 0; iStaR < actSetup.
GetNofLayers(); ++iStaR) {
151 const auto& staR = stations[iStaR];
152 for (
int iGapL = 0; iGapL < MaxNofTripletGaps; ++iGapL) {
153 for (
int iGapM = 0; iGapM < MaxNofTripletGaps; ++iGapM) {
154 auto& swMap = res.
TripletSw(iIter, iStaR, iGapL, iGapM);
155 swMap.
Init(target.GetX(), target.GetY(), target.GetZ(),
157 staR.GetXmin(), staR.GetXmax(), BinsX,
158 staR.GetYmin(), staR.GetYmax(), BinsY);
160 int iStaL = iStaR - iGapL - 2;
161 int iStaM = iStaR - iGapM - 1;
162 if (iStaL < 0 || iStaL >= iStaM)
continue;
163 if (iGapL > iter.GetMaxStationGap() || iGapM > iter.GetMaxStationGap())
continue;
165 const auto& staL = stations[iStaL];
166 const auto& staM = stations[iStaM];
169 double stepXr = 0.3 * (staR.GetXmax() - staR.GetXmin()) / BinsX;
170 double stepYr = 0.3 * (staR.GetYmax() - staR.GetYmin()) / BinsY;
172 for (
double xr = staR.GetXmin(); xr <= staR.GetXmax(); xr += stepXr) {
173 for (
double yr = staR.GetYmin(); yr <= staR.GetYmax(); yr += stepYr) {
175 const double dzr = staR.GetZref() - target.GetZ();
185 T.
X() = target.GetX();
186 T.Y() = target.GetY();
187 T.Z() = target.GetZ();
188 T.Tx() = (xr - target.GetX()) / dzr;
189 T.Ty() = (yr - target.GetY()) / dzr;
194 const double slopeVar = iter.GetMaxSlopePV() * iter.GetMaxSlopePV() / 9.;
195 const double maxQp = iter.GetMaxQp();
196 const double qpVar = maxQp * maxQp / 9.;
198 T.ResetErrors(0., 0., slopeVar, slopeVar, qpVar, 0., 1.e+10);
199 T.InitVelocityRange(1. / maxQp);
200 T.C00() = iter.GetTargetPosSigmaX() * iter.GetTargetPosSigmaX();
202 T.C11() = iter.GetTargetPosSigmaY() * iter.GetTargetPosSigmaY();
226 double dz = staR.GetZref() - staM.GetZref();
227 double rX = T.GetX() + dz * T.Tx();
228 double rY = T.GetY() + dz * T.Ty();
237 double t =
sqrt(1. + tx * tx + ty * ty);
238 double lg = 0.0136 * (1. + 0.038 *
log(radThick * t));
239 if (lg < 0.) lg = 0.;
240 double qp = maxQp / 7.;
241 double s0 = lg * qp * t;
243 ms = (1. + mass * mass * qp * qp) * s0 * s0 * t * radThick;
251 double dxR = 3.5 * std::sqrt(T.C00());
252 double dyR = 3.5 * std::sqrt(T.C11());
253 assert(std::isfinite(dxR));
254 assert(std::isfinite(dyR));
255 swMap.GetMap().Update(xr, yr, dxR, dyR, ms);