ATLAS Offline Software
Loading...
Searching...
No Matches
Parameterization.cxx
Go to the documentation of this file.
1/*
2Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7
8namespace AFP {
10 std::cout << "Reading parameterization from file: \"" << filename << "\"" << '\n';
11
12 std::ifstream file;
13 file.open(filename.data());
14 if(!file.is_open()) {
15 std::stringstream errorMsg;
16 errorMsg << "Parameterization::load(): \tCould not open parameterization file: \"" << filename << "\"";
17 throw std::runtime_error(errorMsg.str().data());
18 }
19
20 while (file.peek() == '#') {
21 char ch;
22 std::string name;
23 file >> ch >> name;
24
25 if (name == "m_xPositionInitIP") { double value; file >> value; std::cout << '\t' << name << ": " << value << '\n'; m_positionInitIP[0] = value; }
26 if (name == "m_yPositionInitIP") { double value; file >> value; std::cout << '\t' << name << ": " << value << '\n'; m_positionInitIP[1] = value; }
27 if (name == "m_zPositionInitIP") { double value; file >> value; std::cout << '\t' << name << ": " << value << '\n'; m_positionInitIP[2] = value; }
28 if (name == "m_xSlopeInitIP") { double value; file >> value; std::cout << '\t' << name << ": " << value << '\n'; m_slopeInitIP[0] = value; }
29 if (name == "m_ySlopeInitIP") { double value; file >> value; std::cout << '\t' << name << ": " << value << '\n'; m_slopeInitIP[1] = value; }
30 if (name == "m_detectorPosition") { double value; file >> value; std::cout << '\t' << name << ": " << value << '\n'; m_parametrizationPosition = value; }
31 if (name == "m_nominalEnergy") { double value; file >> value; std::cout << '\t' << name << ": " << value << '\n'; m_energy = value; }
32
33 file.ignore(1000, '\n');
34 }
35
36 std::vector<std::unique_ptr<TF1>> poly;
37
38 m_yIsUsed = false;
39
40 for (int iEqu = 0; iEqu < m_numberOfEquations; iEqu++) {
41 file.ignore(1000, '\n');
42 std::vector<double> coef;
43
44 for (int iPoly = 0; iPoly < m_numberOfPolynomials; iPoly++) {
45 int N = 0;
46 file >> N;
47 double value{};
48 //assume we trust the file source
49 //coverity[TAINTED_SCALAR]
50 for (int i = 0; i <= N; i++) {
51 if (file.eof()) {
52 std::stringstream errorMsg;
53 errorMsg << "Parameterization::load(): \tFile \"" << filename
54 << "\" does not contain a correct parameterization";
55 throw std::runtime_error(errorMsg.str().data());
56 }
57
58 file >> value;
59 coef.push_back(value);
60 }
61
62 file.ignore(1000, '\n');
63
64 TString name;
65 name.Form("pol%d", N);
66 auto temp = std::make_unique<TF1>(name, name);
67 for (int iCoef = 0; iCoef <= N; ++iCoef) {
68 temp->SetParameter(iCoef, coef.at(iCoef));
69 }
70
71 // For y-dependent equation check if polynomials are non-zero order
72 if (iEqu == 1 or iEqu == 3) {
73 m_yIsUsed = m_yIsUsed or not (N == 0 and coef[0] == 0);
74 }
75
76 poly.push_back(std::move(temp));
77 coef.clear();
78 }
79
80 m_equation.push_back(std::make_unique<Equation>(m_energy, std::move(poly)));
81 poly.clear();
82 }
83
84 std::cout << "Finished reading parameterization: \"" << filename << "\"\n\n";
85 }
86
87 double Parameterization::x(double x0, double y0, double z0, double sx0, double sy0, double E) const {
88 return getEquation(0)->evaluate(x0 + m_positionInitIP.at(0), y0 + m_positionInitIP.at(1), z0 + m_positionInitIP.at(2), sx0 + m_slopeInitIP.at(0), sy0 + m_slopeInitIP.at(1), E);
89 }
90
91 double Parameterization::y(double x0, double y0, double z0, double sx0, double sy0, double E) const {
92 return getEquation(1)->evaluate(x0 + m_positionInitIP.at(0), y0 + m_positionInitIP.at(1), z0 + m_positionInitIP.at(2), sx0 + m_slopeInitIP.at(0), sy0 + m_slopeInitIP.at(1), E);
93 }
94
95 double Parameterization::sx(double x0, double y0, double z0, double sx0, double sy0, double E) const {
96 return getEquation(2)->evaluate(x0 + m_positionInitIP.at(0), y0 + m_positionInitIP.at(1), z0 + m_positionInitIP.at(2), sx0 + m_slopeInitIP.at(0), sy0 + m_slopeInitIP.at(1), E);
97 }
98
99 double Parameterization::sy(double x0, double y0, double z0, double sx0, double sy0, double E) const {
100 return getEquation(3)->evaluate(x0 + m_positionInitIP.at(0), y0 + m_positionInitIP.at(1), z0 + m_positionInitIP.at(2), sx0 + m_slopeInitIP.at(0), sy0 + m_slopeInitIP.at(1), E);
101 }
102
103 double Parameterization::Equation::evaluate(double x, double y, double z, double sx, double sy, double E) const {
104 const double xi = (m_energy - E)/m_energy;
105
106 const double v0 = getPolynomial(0)->Eval(xi);
107 const double v1 = x * getPolynomial(1)->Eval(xi);
108 const double v2 = y * getPolynomial(2)->Eval(xi);
109 const double v3 = z * getPolynomial(3)->Eval(xi);
110 const double v4 = sx * getPolynomial(4)->Eval(xi);
111 const double v5 = sy * getPolynomial(5)->Eval(xi);
112 const double v6 = z*sx * getPolynomial(6)->Eval(xi);
113 const double v7 = z*sy * getPolynomial(7)->Eval(xi);
114
115 return v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7;
116 }
117}
#define z
const TF1 * getPolynomial(int iPoly) const
Returns const raw poiner to polynomial of number iPoly.
double m_energy
Nominal energy of proton.
double evaluate(double x, double y, double z, double sx, double sy, double E) const
Evaluates value of function with given initial positions, slopes and energy.
double sy(double x0, double y0, double z0, double sx0, double sy0, double E) const
Evaluates value of vertical slope equation.
Parameterization(std::string_view filename)
Takes filename of parametrization file as argument.
std::array< double, 2 > m_slopeInitIP
Crossing angles in rad.
double x(double x0, double y0, double z0, double sx0, double sy0, double E) const
Evaluates value of horizontal position equation.
std::vector< std::unique_ptr< Equation > > m_equation
Vector of equations: 0 - x, 1 - y, 2 - sx, 3 - sy.
static constexpr int m_numberOfEquations
Number of equations - each for one measured value.
const Equation * getEquation(int iEqu) const
Returns const raw pointer to equation of number iEqu.
static constexpr int m_numberOfPolynomials
Number of polynomials in equation.
double m_energy
Nominal beam energy.
bool m_yIsUsed
True if y measurements are used in reconstruction.
double sx(double x0, double y0, double z0, double sx0, double sy0, double E) const
Evaluates value of horizontal slope equation.
double y(double x0, double y0, double z0, double sx0, double sy0, double E) const
Evaluates value of vertical position equation.
double m_parametrizationPosition
Position for which the parameterisation was performed.
std::array< double, 3 > m_positionInitIP
Initial vertex postition.
Header file for interface of SiGlobAlignDBTool used to read global alignment for database.
TFile * file