8 #include "GaudiKernel/MsgStream.h"
25 const double r_max)
const {
30 double t_min(
t_from_r(r_min, in_rt));
31 double t_max(
t_from_r(r_max, in_rt));
32 std::vector<SamplePoint> t_r(10);
35 std::vector<double> rt_param(102);
42 double step_size((t_max - t_min) /
static_cast<double>(t_r.size() - 1));
43 for (
unsigned int k = 0;
k < t_r.size();
k++) {
44 t_r[
k].set_x1(t_min +
k * step_size);
45 t_r[
k].set_x2(in_rt.
radius(t_min +
k * step_size));
46 t_r[
k].set_error(1.0);
48 fitter.fit_parameters(t_r, 1, t_r.size(), pol);
50 rt_param[0] = in_rt.
tLower();
52 for (
unsigned int k = 0;
k < 100;
k++) {
53 t = rt_param[0] + rt_param[1] *
k;
58 rt_param[
k + 2] = 0.0;
59 for (
unsigned int l = 0;
l < 3;
l++) { rt_param[
k + 2] = rt_param[
k + 2] +
fitter.coefficients()[
l] * pol.
value(
l,
t); }
73 const double r_max,
const double r_ext,
74 const std::vector<SamplePoint>& add_fit_points)
const {
81 double t_max(
t_from_r(r_max, in_rt));
82 std::vector<SamplePoint> t_r(10);
85 std::vector<double> rt_param(102);
92 double step_size((t_max - t_min) /
static_cast<double>(t_r.size() - 1));
95 for (
unsigned int k = 0;
k < t_r.size();
k++) {
96 t_r[
k].set_x1(t_min +
k * step_size);
97 t_r[
k].set_x2(in_rt.
radius(t_min +
k * step_size));
98 t_r[
k].set_error(1.0);
102 for (
const auto & add_fit_point : add_fit_points) { t_r.push_back(add_fit_point); }
105 fitter.fit_parameters(t_r, 1, t_r.size(), pol);
109 rt_param[0] = in_rt.
tLower();
111 for (
unsigned int k = 0;
k < 100;
k++) {
112 t = rt_param[0] + rt_param[1] *
k;
117 if (
r > r_min &&
t > t_min) {
120 rt_param[
k + 2] = 0.0;
121 for (
unsigned int l = 0;
l < 3;
l++) {
122 rt_param[
k + 2] = rt_param[
k + 2] +
fitter.coefficients()[
l] * pol.
value(
l,
t);
124 if (rt_param[
k + 2] < 0.0) { rt_param[
k + 2] = 0.0; }
126 }
else if (r_ext > r_max) {
130 rt_param[
k + 2] = 0.0;
131 for (
unsigned int l = 0;
l < 3;
l++) {
132 rt_param[
k + 2] = rt_param[
k + 2] +
fitter.coefficients()[
l] * pol.
value(
l,
t);
138 else if (r_ext <= r_max && r_ext >= r_min) {
141 log << MSG::WARNING <<
"getRtWithParabolicExtrapolation() - Extrapolated radius withing fit region - Nothing to be done."
160 double precision(0.010);
161 double t_max(in_rt.
tUpper());
162 double t_min(in_rt.
tLower());
168 while (t_max - t_min > 0.1 && std::abs(in_rt.
radius(0.5 * (t_min + t_max)) -
r) > precision) {
169 if (in_rt.
radius(0.5 * (t_min + t_max)) >
r) {
170 t_max = 0.5 * (t_min + t_max);
172 t_min = 0.5 * (t_min + t_max);
176 return 0.5 * (t_min + t_max);
187 if (in_rt.
radius(
t) <
r) {
return t + 1.0; }