8#include "CLHEP/GenericFunctions/CumulativeChiSquare.hh"
9#include "CLHEP/Matrix/Matrix.h"
10#include "GaudiKernel/MsgStream.h"
36 init(0.5 * CLHEP::mm, 1, 15,
true,
false, 15,
false,
false,
false);
40 const unsigned int &ord,
const bool &fix_min,
const bool &fix_max,
const int &max_it,
41 bool do_parabolic_extrapolation,
bool do_smoothing,
bool do_multilayer_rt_scale) :
43 init(rt_accuracy, func_type, ord, fix_min, fix_max, max_it, do_parabolic_extrapolation, do_smoothing, do_multilayer_rt_scale);
69 m_tfile = std::make_unique<TFile>(file_name.c_str(),
"RECREATE");
71 m_cut_evolution = std::make_unique<TH1F>(
"m_cut_evolution",
"CUT EVOLUTION", 11, -0.5, 10.5);
72 m_nb_segment_hits = std::make_unique<TH1F>(
"m_nb_segment_hits",
"NUMBER OF HITS ON THE REFITTED SEGMENTS", 11, -0.5, 10.5);
73 m_pull_initial = std::make_unique<TH1F>(
"m_pull_initial",
"INITIAL PULL DISTRIBUTION", 200, -5.05, 5.05);
75 std::make_unique<TH2F>(
"m_residuals_initial",
"INITIAL OF THE REFITTED SEGMENTS", 100, -0.5, 15.0, 300, -1.5, 1.5);
76 m_residuals_initial_all = std::make_unique<TH2F>(
"m_residuals_initial_all",
"INITIAL OF THE REFITTED SEGMENTS BEFORE CONVERGENCE", 300,
77 -15.0, 15.0, 1000, -5, 5);
78 m_residuals_final = std::make_unique<TH2F>(
"m_residuals_final",
"FINAL OF THE REFITTED SEGMENTS", 100, -0.5, 15.0, 300, -1.5, 1.5);
80 std::make_unique<TH2F>(
"m_driftTime_final",
"FINAL DRIFTTIME OF THE REFITTED SEGMENTS", 300, -15.0, 15.0, 300, -15.0, 15.0);
82 std::make_unique<TH2F>(
"m_driftTime_initial",
"FINAL DRIFTTIME OF THE REFITTED SEGMENTS", 300, -15.0, 15.0, 1300, -100, 1200);
84 std::make_unique<TH2F>(
"m_adc_resi_initial",
"FINAL ADC VS RESIDUAL OF THE REFITTED SEGMENTS", 1350, 0, 1350, 300, -15, 15);
102 std::shared_ptr<const IRtRelation> tmp_rt;
107 for (
const auto & k : seg) {
108 for (
unsigned int l = 0; l < k->hitsOnTrack(); l++) {
109 double rr = (k->mdtHOT())[l]->driftRadius();
110 double dd = (k->mdtHOT())[l]->signedDistanceToTrack();
123 log << MSG::WARNING <<
"analyseSegments() - analyse failed, segments:" <<
endmsg;
124 for (
unsigned int i = 0; i < seg.size(); i++) {
125 log << MSG::WARNING << i <<
" " << seg[i]->direction() <<
" " << seg[i]->position() <<
endmsg;
133 tmp_rt = rtOut->
rt();
139 m_output = std::make_shared<RtCalibrationOutput>(
150 double r{0}, d{0}, adc{0};
151 for (
const auto & k : seg) {
152 for (
unsigned int l = 0; l < k->hitsOnTrack(); l++) {
153 adc = (k->mdtHOT())[l]->adcCount();
154 r = (k->mdtHOT())[l]->driftRadius();
155 d = (k->mdtHOT())[l]->signedDistanceToTrack();
165 int max_smoothing_iterations(
static_cast<int>(
m_max_it));
166 if (max_smoothing_iterations == 0) { max_smoothing_iterations = 1; }
169 double convergence_RMS(0.002);
178 while (it < max_smoothing_iterations && RMS > convergence_RMS) {
183 unsigned int counter{0};
185 for (
const auto & k : seg) {
186 if (k->mdtHitsOnTrack() < 4) {
continue; }
188 for (
unsigned int h = 0;
h < k->mdtHitsOnTrack();
h++) {
189 k->mdtHOT()[
h]->setDriftRadius(tmp_rt->radius(k->mdtHOT()[
h]->driftTime()),
190 k->mdtHOT()[
h]->sigmaDriftRadius());
191 if (k->mdtHOT()[
h]->sigmaDriftRadius() < 0.5 *
m_r_max) {
192 avres = avres + k->mdtHOT()[
h]->sigma2DriftRadius();
194 avres = avres + 0.01;
197 avres = avres /
static_cast<double>(k->mdtHitsOnTrack());
198 avres = std::sqrt(avres);
199 if (
smoothing.addResidualsFromSegment(*k,
true, 5.0 * avres)) { counter++; }
203 if (counter < 1000) {
205 log << MSG::WARNING <<
"analyseSegments() - too small number of reconstructed segments!" <<
endmsg;
207 for (
const auto & k : seg) {
208 for (
unsigned int l = 0; l < k->hitsOnTrack(); l++) {
209 double r = (k->mdtHOT())[l]->driftRadius();
210 double d = (k->mdtHOT())[l]->signedDistanceToTrack();
222 double bin_width(0.01 * (smooth_rt.
tUpper() - smooth_rt.
tLower()));
223 for (
double t = smooth_rt.
tLower(); t <= smooth_rt.
tUpper(); t = t + bin_width) {
224 RMS = RMS + std::pow(smooth_rt.
radius(t) - tmp_rt->radius(t), 2);
226 RMS = std::sqrt(0.01 * RMS);
232 tmp_rt = std::make_shared<RtRelationLookUp>(smooth_rt);
238 m_output = std::make_shared<RtCalibrationOutput>(
244 for (
const auto & k : seg) {
245 for (
unsigned int l = 0; l < k->hitsOnTrack(); l++) {
246 double adc = (k->mdtHOT())[l]->adcCount();
247 double r = (k->mdtHOT())[l]->driftRadius();
248 double d = (k->mdtHOT())[l]->signedDistanceToTrack();
282 if (std::abs(seg.
direction().y()) > 100) {
return true; }
291 double chi2_scale_factor;
296 unsigned int nb_hits_in_ml;
298 std::vector<double> d_track;
300 std::vector<MTStraightLine> w;
305 std::vector<CLHEP::HepVector>
F;
307 CLHEP::HepVector residual_value;
308 CLHEP::HepVector weighted_residual;
323 aux_res = seg.
mdtHOT()[k]->sigmaDriftRadius();
324 if (
m_rt->radius(seg.
mdtHOT()[k]->driftTime()) < 0.75) {
325 if (aux_res < 0.5 - m_rt->radius(seg.
mdtHOT()[k]->driftTime())) { aux_res = 0.5 -
m_rt->radius(seg.
mdtHOT()[k]->driftTime()); }
329 seg.
mdtHOT()[k]->setDriftRadius(
m_rt->radius(seg.
mdtHOT()[k]->driftTime()), aux_res);
332 hit_selection[k] = 0;
337 hit_selection[k] = 1;
341 if (hit_selection[k] == 0) {
343 av_res = av_res + std::pow(seg.
mdtHOT()[k]->sigmaDriftRadius(), 2);
345 av_res = av_res + 0.01;
350 nb_hits_in_ml = nb_hits_in_ml + (1 - hit_selection[k]);
354 av_res = std::sqrt(av_res /
static_cast<double>(seg.
mdtHitsOnTrack()));
355 chi2_scale_factor = std::hypot(av_res,
m_rt_accuracy) / av_res;
365 if (nb_hits_in_ml < 4) {
return true; }
370 if (!
m_tracker->fit(seg, hit_selection, track)) {
return true; }
372 if (std::isnan(track.chi2())) {
return true; }
375 if (track.chi2PerDegreesOfFreedom() > 5 * chi2_scale_factor) {
return true; }
379 if (track.numberOfTrackHits() < 4) {
return true; }
384 if (std::abs(track.getTangent(seg.
mdtHOT()[0]->localPosition().z()).a_x2()) > 8.0e8) {
return true; }
387 m_chi2 += track.chi2PerDegreesOfFreedom();
393 F = std::vector<CLHEP::HepVector>(track.numberOfTrackHits());
394 for (
unsigned int h = 0;
h < track.numberOfTrackHits();
h++) {
399 for (
int p = 0; p <
F[
h].num_row(); p++) {
400 double x = std::sqrt(1.0 + std::pow(track.getTangent((track.trackHits()[
h]->localPosition()).z()).a_x2(), 2));
402 (
F[
h])[p] = std::legendre(p, (track.trackHits()[
h]->localPosition()).z()) /
x;
408 for (
int p = 0; p <
m_M_track.num_row(); p++) {
409 for (
int q = p; q <
m_M_track.num_row(); q++) {
411 for (
unsigned int h = 0;
h < track.numberOfTrackHits();
h++) {
421 log << MSG::WARNING <<
"handleSegment() - Could not invert track matrix!" <<
endmsg;
427 d_track = std::vector<double>(track.numberOfTrackHits());
428 w = std::vector<MTStraightLine>(track.numberOfTrackHits());
429 residual_value = CLHEP::HepVector(track.numberOfTrackHits());
430 weighted_residual = CLHEP::HepVector(track.numberOfTrackHits());
431 for (
unsigned int l = 0; l <
m_order; l++) {
432 m_U[l] = CLHEP::HepVector(track.numberOfTrackHits());
433 m_U_weighted[l] = CLHEP::HepVector(track.numberOfTrackHits());
435 for (
unsigned int h = 0;
h < track.numberOfTrackHits();
h++) {
438 d_track[
h] = track.getTangent((track.trackHits()[
h]->localPosition()).z()).signDistFrom(w[
h]);
439 residual_value[
h] = (track.trackHits()[
h])->driftRadius() - std::abs(d_track[
h]);
443 for (
unsigned int l = 0; l <
m_order; l++) {
444 x = (track.trackHits()[
h]->driftRadius() - 0.5 *
m_r_max) / (0.5 *
m_r_max);
450 D = CLHEP::HepMatrix(track.numberOfTrackHits(), track.numberOfTrackHits());
451 for (
unsigned int h = 0;
h < track.numberOfTrackHits();
h++) {
452 for (
unsigned int hp = 0; hp < track.numberOfTrackHits(); hp++) {
454 (track.trackHits()[hp])->sigma2DriftRadius();
460 std::vector<double> sigma_residual(track.numberOfTrackHits(), 0.0);
461 for (
unsigned int h = 0;
h < track.numberOfTrackHits();
h++) {
462 for (
unsigned int hp = 0; hp < track.numberOfTrackHits(); hp++) {
463 sigma_residual[
h] = sigma_residual[
h] + std::pow(D[
h][hp] * (track.trackHits()[hp])->sigmaDriftRadius(), 2);
465 sigma_residual[
h] = std::sqrt(sigma_residual[
h]);
466 if (sigma_residual[
h] < av_res / track.numberOfTrackHits()) { sigma_residual[
h] = av_res / std::sqrt(track.numberOfTrackHits()); }
470 for (
unsigned int h = 0;
h < track.numberOfTrackHits();
h++) {
471 weighted_residual[
h] = residual_value[
h] / sigma_residual[
h];
479 CLHEP::HepSymMatrix A_tmp(
m_A);
482 for (
unsigned int p = 0; p <
m_order; p++) {
483 for (
unsigned int pp = p; pp <
m_order; pp++) {
485 if (std::isnan(A_tmp[p][pp])) {
return true; }
489 CLHEP::HepVector b_tmp(
m_b);
490 for (
unsigned int p = 0; p <
m_order; p++) {
492 if (std::isnan(b_tmp[p])) {
return true; }
515 if (input ==
nullptr) {
516 throw std::runtime_error(
517 Form(
"File: %s, Line: %d\nRtCalibrationCurved::setInput - Calibration input class not supported.", __FILE__, __LINE__));
539 if (!rt_Chebyshev && !rt_LookUp) {
540 throw std::runtime_error(Form(
"File: %s, Line: %d\nRtCalibrationCurved::setInput - r-t class not supported.", __FILE__, __LINE__));
545 m_t_length = rt_Chebyshev->tUpper() - rt_Chebyshev->tLower();
546 m_t_mean = 0.5 * (rt_Chebyshev->tLower() + rt_Chebyshev->tUpper());
551 m_t_length = rt_LookUp->par(1) * (rt_LookUp->nPar() - 2) - rt_LookUp->par(0);
552 m_t_mean = 0.5 * (rt_LookUp->par(1) * (rt_LookUp->nPar() - 2) + rt_LookUp->par(0));
568 unsigned int nb_points(30);
573 std::vector<double> rt_param(
m_rt->nPar());
583 log << MSG::WARNING <<
"analyse() - Could not solve the autocalibration equation!" <<
endmsg;
594 if (rt_Chebyshev->nDoF() > 30) { nb_points = rt_Chebyshev->nDoF(); }
597 step =
m_r_max /
static_cast<double>(nb_points);
600 std::vector<SamplePoint> x_r(nb_points + 1);
605 for (
unsigned int k = 0; k < nb_points + 1; k++) {
607 x_r[k].set_x2(rt_Chebyshev->radius(x_r[k].x1()));
608 x_r[k].set_x1(rt_Chebyshev->getReducedTime(x_r[k].x1()));
609 x_r[k].set_error(1.0);
612 for (
unsigned int l = 0; l <
m_order; l++) {
621 x_r[k].set_error(0.01);
623 x_r[k].set_x2(x_r[k].x2() - r_corr);
628 for (
unsigned int k = 0; k < nb_points; k++) {
629 if (x_r[k].x2() > x_r[k + 1].x2()) { x_r[k + 1].set_x2(x_r[k].x2()); }
634 fitter.fit_parameters(x_r, 1, nb_points + 1, chebyshev);
635 rt_param[0] = rt_Chebyshev->tLower();
636 rt_param[1] = rt_Chebyshev->tUpper();
637 for (
unsigned int k = 0; k < rt_Chebyshev->nDoF(); k++) { rt_param[k + 2] = fitter.coefficients()[k]; }
639 m_rt_new = std::make_shared<RtChebyshev>(rt_param);
645 rt_param = rt_LookUp->parameters();
646 unsigned int min_k(2), max_k(rt_param.size());
648 if (
m_fix_max) { max_k = rt_param.size() - 1; }
649 for (
unsigned int k = min_k; k < max_k; k++) {
653 rt_param[k] = rt_param[k] - r_corr;
655 if (rt_param[k] < rt_param[k - 1]) { rt_param[k] = rt_param[k - 1]; }
659 m_rt_new = std::make_shared<RtRelationLookUp>(rt_param);
670 double r_corr_max = 0.0;
672 for (
unsigned int k = 0; k < 100; k++) {
675 if (std::abs(r_corr) > r_corr_max) { r_corr_max = std::abs(r_corr); }
712 m_output = std::make_shared<RtCalibrationOutput>(
726 const bool &fix_max,
const int &max_it,
bool do_parabolic_extrapolation,
bool do_smoothing,
727 bool do_multilayer_rt_scale) {
750 m_tracker = std::make_unique<CurvedPatRec>();
753 throw std::runtime_error(
754 Form(
"File: %s, Line: %d\nRtCalibrationCurved::init - Order of the correction polynomial must be >0!", __FILE__, __LINE__));
769 if (func_type < 1 || func_type > 3) {
770 throw std::runtime_error(
771 Form(
"File: %s, Line: %d\nRtCalibrationCurved::init - Illegal correction function type!", __FILE__, __LINE__));
774 case 1:
m_base_function = std::make_unique<LegendrePolynomial>();
break;
775 case 2:
m_base_function = std::make_unique<ChebyshevPolynomial>();
break;
778 throw std::runtime_error(
779 Form(
"File: %s, Line: %d\nRtCalibrationCurved::init - Order must be >2 for polygons! It is set to %i by the user.",
783 double bin_width = 2.0 /
static_cast<double>(
m_order - 1);
784 for (
unsigned int k = 0; k <
m_order; k++) {
x[k] = -1 + k * bin_width; }
807 double precision(0.001);
814 while (t_max - t_min > 0.1 && std::abs(
m_rt->radius(0.5 * (t_min + t_max)) -
r) > precision) {
815 if (
m_rt->radius(0.5 * (t_min + t_max)) >
r) {
816 t_max = 0.5 * (t_min + t_max);
818 t_min = 0.5 * (t_min + t_max);
822 return 0.5 * (t_min + t_max);
828 double y_min, y_max, z_min, z_max;
835 y_min = (segment->
mdtHOT()[0])->localPosition().y();
837 z_min = (segment->
mdtHOT()[0])->localPosition().z();
840 if ((segment->
mdtHOT()[k])->localPosition().y() < y_min) { y_min = (segment->
mdtHOT()[k])->localPosition().y(); }
841 if ((segment->
mdtHOT()[k])->localPosition().y() > y_max) { y_max = (segment->
mdtHOT()[k])->localPosition().y(); }
842 if ((segment->
mdtHOT()[k])->localPosition().z() < z_min) { z_min = (segment->
mdtHOT()[k])->localPosition().z(); }
843 if ((segment->
mdtHOT()[k])->localPosition().z() > z_max) { z_max = (segment->
mdtHOT()[k])->localPosition().z(); }
845 for (
unsigned int k = 0; k < segment->
mdtCloseHits(); k++) {
846 if ((segment->
mdtClose()[k])->localPosition().y() < y_min) { y_min = (segment->
mdtClose()[k])->localPosition().y(); }
847 if ((segment->
mdtClose()[k])->localPosition().y() > y_max) { y_max = (segment->
mdtClose()[k])->localPosition().y(); }
848 if ((segment->
mdtClose()[k])->localPosition().z() < z_min) { z_min = (segment->
mdtClose()[k])->localPosition().z(); }
849 if ((segment->
mdtClose()[k])->localPosition().z() > z_max) { z_max = (segment->
mdtClose()[k])->localPosition().z(); }
853 if (y_max - y_min > z_max - z_min) {
854 outfile <<
"nullptr " << y_min - 30.0 <<
" " << y_max + 30.0 <<
" " << 0.5 * (z_min + z_max) - 0.5 * (y_max - y_min) - 30.0 <<
" "
855 << 0.5 * (z_min + z_max) + 0.5 * (y_max - y_min) + 30.0 <<
"\n";
857 outfile <<
"nullptr " << 0.5 * (y_min + y_max) - 0.5 * (z_max - z_min) - 30.0 <<
" "
858 << 0.5 * (y_min + y_max) + 0.5 * (z_max - z_min) + 30.0 <<
" " << z_min - 30.0 <<
" " << z_max + 30.0 <<
"\n";
864 outfile <<
"SET PLCI 1\n"
865 <<
"ARC " << (segment->
mdtHOT()[k])->localPosition().y() <<
" " << (segment->
mdtHOT()[k])->localPosition().z() <<
" 15.0\n";
868 outfile <<
"SET PLCI 3\n"
869 <<
"ARC " << (segment->
mdtHOT()[k])->localPosition().y() <<
" " << (segment->
mdtHOT()[k])->localPosition().z() <<
" "
870 << (segment->
mdtHOT()[k])->driftRadius() <<
"\n";
874 for (
unsigned int k = 0; k < segment->
mdtCloseHits(); k++) {
876 outfile <<
"SET PLCI 1\n"
877 <<
"ARC " << (segment->
mdtClose()[k])->localPosition().y() <<
" " << (segment->
mdtClose()[k])->localPosition().z()
881 outfile <<
"SET PLCI 2\n"
882 <<
"ARC " << (segment->
mdtClose()[k])->localPosition().y() <<
" " << (segment->
mdtClose()[k])->localPosition().z() <<
" "
883 << (segment->
mdtClose()[k])->driftRadius() <<
"\n";
888 if (curved_segment ==
nullptr) {
890 outfile <<
"SET PLCI 4\n"
891 <<
"LINE " << aux_track.
a_x2() * (z_min - 30.0) + aux_track.
b_x2() <<
" " << z_min - 30.0 <<
" "
892 << aux_track.
a_x2() * (z_max + 30.0) + aux_track.
b_x2() <<
" " << z_max + 30.0 <<
"\n";
896 if (curved_segment !=
nullptr) {
897 double step_size((60.0 + z_max - z_min) / 50.0);
898 for (
double aux_z = z_min; aux_z <= z_max; aux_z = aux_z + step_size) {
899 outfile <<
"SET PLCI 4\n"
900 <<
"LINE " << curved_segment->
getPointOnLine(aux_z).y() <<
" " << aux_z <<
" "
901 << curved_segment->
getPointOnLine(aux_z + step_size).y() <<
" " << aux_z + step_size <<
"\n";
916 std::shared_ptr<RtRelationLookUp> rt_low, rt_high;
917 std::vector<SamplePoint> add_fit_point;
923 add_fit_point.clear();
939 add_fit_point.clear();
const boost::regex rr(r_r)
Double_t RtCalibrationCurved_polfun(Double_t *x, Double_t *par)
This class performs a fit of a linear combination of base functions to a set of sample points.
This class class provides a Chebyshev polynomial of order k.
Amg::Vector3D getPointOnLine(const double loc_z) const
get the point on the line a the local z coordinate "loc_z"
Interface to pass calibration output during calibration.
IMdtCalibration(const std::string &name)
constructor, string used to identify the instance
virtual std::string name() const
returns name (region) of instance
std::shared_ptr< IMdtCalibrationOutput > MdtCalibOutputPtr
std::vector< std::shared_ptr< MuonCalibSegment > > MuonSegVec
std::vector< unsigned int > HitSelection
generic interface for a rt-relation
virtual double radius(double t) const =0
returns drift radius for a given time
double GetTmaxDiff() const
return the difference in total dirft time between the two multilayers (ML1 - ML2)
virtual double tUpper() const =0
Returns the upper time covered by the r-t.
double b_x2() const
get the intercept of the straight line in the x2-x3 plane
double a_x2() const
get the slope of the straight line in the x2-x3 plane
Athena-independent part of the MdtCalibHit.
A MuonCalibSegment is a reconstructed three dimensional track segment in the MuonSpectrometer.
unsigned int mdtHitsOnTrack() const
retrieve the number of MdtCalibHitBase s assigned to this segment
const MdtHitVec & mdtClose() const
retrieve the full set of nearby mdt hits of this segment.
const Amg::Vector3D & direction() const
retrieve local direction of segment (on station level) retrieve the transformation from local chamber...
unsigned int mdtCloseHits() const
retrieve the number of nearby mdt hits.
const MdtHitVec & mdtHOT() const
retrieve the full set of MdtCalibHitBase s assigned to this segment
const Amg::Vector3D & position() const
retrieve local position of segment (on station level)
std::unique_ptr< TH2F > m_residuals_initial_all
std::unique_ptr< TH2F > m_driftTime_initial
bool converged() const
returns true, if the autocalibration has converged
int iteration() const
get the number of the current iteration
virtual MdtCalibOutputPtr getResults() const override
returns the final r-t relationship
bool m_do_parabolic_extrapolation
double t_from_r(const double r)
void setEstimateRtAccuracy(const double acc)
set the estimated r-t accuracy =acc
std::unique_ptr< MultilayerRtDifference > m_multilayer_rt_difference
void setInput(const IMdtCalibrationOutput *rt_input) override
set the r-t relationship, the internal autocalibration objects are reset
int numberOfSegments() const
get the number of segments which were passed to the algorithm
bool m_do_multilayer_rt_scale
~RtCalibrationCurved()
Destructor.
bool m_control_histograms
std::unique_ptr< TH1F > m_pull_initial
bool smoothing() const
returns true, if the r-t relationship will be smoothened using the conventional autocalibration after...
void switch_off_control_histograms()
the algorithm does not produce controll histograms (this is the default)
std::unique_ptr< BaseFunction > m_base_function
CLHEP::HepSymMatrix m_M_track
bool handleSegment(MuonCalibSegment &seg)
analyse the segment "seg" (this method was required before MdtCalibInterfaces-00-01-06)
double m_rt_accuracy_previous
std::shared_ptr< RtCalibrationOutput > m_output
std::array< bool, 2 > m_multilayer
std::unique_ptr< TH2F > m_residuals_final
std::unique_ptr< TFile > m_tfile
double estimatedRtAccuracy() const
get the estimated r-t quality (CLHEP::mm), the accuracy of the input r-t is computed at the end of th...
void noSmoothing()
do not smoothen the r-t relationship after convergence
void doNotForceMonotony()
do not force r(t) to be monotonically increasing
void init(const double rt_accuracy, const unsigned int &func_type, const unsigned int &ord, const bool &fix_min, const bool &fix_max, const int &max_it, bool do_parabolic_extrapolation, bool do_smoothing, bool do_multilayer_rt_scale)
std::vector< CLHEP::HepVector > m_U
CLHEP::HepSymMatrix m_M_track_inverse
std::unique_ptr< TH2F > m_residuals_initial
double reliability() const
get the reliability of the final r-t relationship: 0: no convergence yet 1: convergence,...
bool analyse(const MuonSegVec &seg)
perform the autocalibration with the segments acquired so far
void forceMonotony()
force r(t) to be monotonically increasing (this is default)
std::shared_ptr< RtRelationLookUp > performParabolicExtrapolation(const bool &min, const bool &max, const IRtRelation &in_rt)
std::unique_ptr< TH1F > m_nb_segment_hits
MdtCalibOutputPtr analyseSegments(const MuonSegVec &seg) override
perform the full autocalibration including iterations (required since MdtCalibInterfaces-00-01-06)
void switch_on_control_histograms(const std::string &file_name)
this methods requests control histograms from the algorithms; the algorithm will write them to ROOT f...
std::unique_ptr< TH2F > m_driftTime_final
void doParabolicExtrapolation()
requires that parabolic extrapolation will be used for small and large radii
void doSmoothing()
requires that the r-t relationship will be smoothened using the conventional autocalibration after co...
std::unique_ptr< TH1F > m_cut_evolution
std::unique_ptr< CurvedPatRec > m_tracker
RtCalibrationCurved(const std::string &name)
Default constructor: r-t accuracy is set to 0.5 mm.
int numberOfSegmentsUsed() const
get the number of segments which are used in the autocalibration
void display_segment(MuonCalibSegment *segment, std::ofstream &outfile, const CurvedLine *curved_segment)
std::vector< CLHEP::HepVector > m_U_weighted
std::unique_ptr< TH2F > m_adc_vs_residual_final
std::shared_ptr< const IRtRelation > m_rt
std::shared_ptr< IRtRelation > m_rt_new
Class for communication between event loop and rt calibration algorithm contains only a rt relation f...
std::shared_ptr< const IRtRelation > rt() const
access to private attributes
This class contains the implementation of an r(t) relationship parametrized by a linear combination o...
Equidistant look up table for rt-relations with the time as key.
virtual double radius(double t) const override final
returns drift radius for a given time
virtual double tLower() const override final
return rt range
virtual double tUpper() const override final
Returns the upper time covered by the r-t.
This class provides a sample point for the BaseFunctionFitter.
singleton-like access to IMessageSvc via open function and helper
Eigen::Matrix< double, 3, 1 > Vector3D
IMessageSvc * getMessageSvc(bool quiet=false)
CscCalcPed - algorithm that finds the Cathode Strip Chamber pedestals from an RDO.
float RtScalePolynomial(const float r)