29 return StatusCode::SUCCESS;
53 return StatusCode::FAILURE;
72 return StatusCode::FAILURE;
78 return StatusCode::FAILURE;
85 return StatusCode::FAILURE;
93 return StatusCode::SUCCESS;
100 auto fn = [
this,
fun, my_slopeCalculated, my_positionCalculated](
double x,
const Measurement&
m, std::vector<double>&
s, std::vector<double>&
p) {
return (this->*fun)(
x,
m,
s,
p); };
102 constexpr
double tol = 1
e-3;
106 if (
fn(eMax, my_measAFP, my_slopeCalculated, my_positionCalculated) *
fn(eMin, my_measAFP, my_slopeCalculated, my_positionCalculated) >= 0) {
111 return (
fn(eMin, my_measAFP, my_slopeCalculated, my_positionCalculated) < 0) ?
std::max(
fn(eMin, my_measAFP, my_slopeCalculated, my_positionCalculated),
fn(eMax, my_measAFP, my_slopeCalculated, my_positionCalculated)) :
std::min(
fn(eMin, my_measAFP, my_slopeCalculated, my_positionCalculated),
fn(eMax, my_measAFP, my_slopeCalculated, my_positionCalculated));
114 ATH_MSG_VERBOSE(
"==== eMin\teMax\te\tfun(eMin)\tfun(eMax)\tfun(E) ====");
119 while (eMax - eMin > tol) {
120 e = (eMin + eMax)/2.0;
121 ATH_MSG_VERBOSE(
"* " << eMin <<
"\t" << eMax <<
"\t" <<
e <<
"\t" <<
fn(
e, my_measAFP, my_slopeCalculated, my_positionCalculated) <<
"\t" <<
fn(eMin, my_measAFP, my_slopeCalculated, my_positionCalculated) <<
"\t" <<
fn(eMax, my_measAFP, my_slopeCalculated, my_positionCalculated));
122 if (
fn(eMax, my_measAFP, my_slopeCalculated, my_positionCalculated) *
fn(
e, my_measAFP, my_slopeCalculated, my_positionCalculated) < 0)
124 else if (
fn(eMin, my_measAFP, my_slopeCalculated, my_positionCalculated) *
fn(
e, my_measAFP, my_slopeCalculated, my_positionCalculated) < 0)
143 std::vector<double> my_slopeCalculated = {0, 0};
144 std::vector<double> my_positionCalculated = {0, 0};
151 ATH_MSG_DEBUG(
"Reconstructing proton with bisection method...");
152 ATH_MSG_DEBUG(
"Tracks (xNear, yNear; xFar, yFar): " << my_measAFP.
xN <<
", " << my_measAFP.
yN <<
"; "
153 << my_measAFP.
xF <<
", " << my_measAFP.
yF);
161 const double pz =
energy * sqrt(1. - slopeX*slopeX - slopeY*slopeY);
171 ATH_MSG_DEBUG(
"Reconstructing proton with bisection method (single station)...");
172 ATH_MSG_DEBUG(
"Tracks (xFar, yFar): " << my_measAFP.
xF <<
", " << my_measAFP.
yF);
174 std::vector<double> my_slopeCalculated = {0, 0};
175 std::vector<double> my_positionCalculated = {0, 0};
188 (my_positionCalculated.at(0)
198 my_slopeCalculated.at(0)
227 const double Ax =
m_parametrization->getEquation(2 + XorY)->getPolynomial(0)->Eval(xi);
228 const double Bx =
m_parametrization->getEquation(2 + XorY)->getPolynomial(4 + XorY)->Eval(xi);
229 const double Cx =
m_parametrization->getEquation(2 + XorY)->getPolynomial(1 + XorY)->Eval(xi);
230 const double Dx =
m_parametrization->getEquation(2 + XorY)->getPolynomial(6 + XorY)->Eval(xi);
231 const double Ex =
m_parametrization->getEquation(2 + XorY)->getPolynomial(3)->Eval(xi);
233 const double Fx = my_slopeCalculated.at(0 + XorY) - Ax - Cx*
m_vertexIP.at(0 + XorY) - Ex*
m_vertexIP.at(2);
235 const double slp = (Gx == 0) ? 0. :
Fx/Gx;
265 const double dx2 = my_measAFP.
xF - xFar;
266 const double dy2 = my_measAFP.
yF - yFar;
271 return chi2x2 + chi2y2;
274 const double dx1 = my_measAFP.
xN - xNear;
275 const double dx2 = my_measAFP.
xF - xFar;
276 const double dy1 = my_measAFP.
yN - yNear;
277 const double dy2 = my_measAFP.
yF - yFar;
284 return chi2x1 + chi2y1 + chi2x2 + chi2y2;