29 return StatusCode::SUCCESS;
53 return StatusCode::FAILURE;
72 return StatusCode::FAILURE;
78 return StatusCode::FAILURE;
82 if(parametrization.empty())
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 = 1e-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);
159 const double px = energy * slopeX;
160 const double py = energy * slopeY;
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;
255 const double energy = sqrt(px*px + py*py + pz*pz);
256 const double sx = px/energy;
257 const double sy = py/energy;
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;
#define ATH_MSG_VERBOSE(x)
#define CHECK(...)
Evaluate an expression and check for errors.
std::string PathResolverFindDataFile(const std::string &logical_file_name)
double m_parametrizationEnergy
Parameterization energy.
virtual double chi2(double energy, double sx, double sy, const Measurement &my_measAFP) const override
Calculates chi2 for reconstructed proton.
Gaudi::Property< std::string > m_parametrizationFileName
Name of the file containing parameterization.
double bothStations(double energy, const Measurement &my_measAFP, std::vector< double > &my_slopeCalculated, std::vector< double > &my_positionCalculated) const
Function obtained from parameterization equation.
double m_parametrizationPosition
Position for which parameterization was performed.
double calculateXslope(double energy, std::vector< double > &my_slopeCalculated) const
Calculates initial horizontal slope Calls calculateSlope(energy, 0)
StatusCode configInfo() const
double m_distanceBetweenStations
Distance between near and far station.
std::unique_ptr< AFP::Parameterization > m_parametrization
Pointer to parameterization.
double calculateSlope(double energy, int XorY, std::vector< double > &my_slopeCalculated) const
Calculates ininial slope based on measurements and reconstructed energy.
virtual xAOD::AFPProton * reco(const xAOD::AFPTrack *trkNear, const xAOD::AFPTrack *trkFar, std::unique_ptr< xAOD::AFPProtonContainer > &outputContainer) const override
Reconstructs single proton from pair of tracks.
double singleStation(double energy, const Measurement &my_measAFP, std::vector< double > &my_slopeCalculated, std::vector< double > &my_positionCalculated) const
Function obtained from parameterization equation.
AFP_ProtonRecoAnalytical(const std::string &type, const std::string &name, const IInterface *parent)
Default constructor.
double bisection(double(AFP_ProtonRecoAnalytical::*fun)(double, const Measurement &, std::vector< double > &, std::vector< double > &) const, const Measurement &my_measAFP, std::vector< double > &my_slopeCalculated, std::vector< double > &my_positionCalculated) const
Calculates root of given function.
double calculateYslope(double energy, std::vector< double > &my_slopeCalculated) const
Calculates initial vertical slope Calls calculateSlope(energy, 1)
StatusCode initialize() override
Loads parameterization.
double m_detectorPositionFar
Default position of AFP far station.
double m_detectorPositionNear
Default position of AFP near station.
Gaudi::Property< double > m_trackDistance
Gaudi::Property< bool > m_allowSingleStationReco
const std::vector< double > m_vertexIP
Vertex position.
Gaudi::Property< int > m_side
AFP_ProtonRecoBase(const std::string &type, const std::string &name, const IInterface *parent)
Default constructor.
static constexpr double m_ySigma
y-Sigma value
SG::ReadHandleKey< xAOD::AFPTrackContainer > m_trackContainerKey
Gaudi::Property< std::vector< double > > m_detectorPositions
static constexpr double m_xSigma
x-Sigma value
xAOD::AFPProton * createProton(const Momentum &momentum, const Measurement &my_measAFP, const int algID, std::unique_ptr< xAOD::AFPProtonContainer > &outputContainer) const
Creates and sets up a proton.
static constexpr int analytical
analytical algorithm id=0
float xLocal() const
Track position along X axis in station local coordinate system.
float yLocal() const
Track position along Y axis in station local coordinate system.
Local class for storing tracks positions.