ATLAS Offline Software
RtCalibrationCurved.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #ifndef MuonCalib_RtCalibrationCurvedH
6 #define MuonCalib_RtCalibrationCurvedH
7 
14 
15 #include <list>
16 #include <memory>
17 #include <string>
18 #include <vector>
19 
20 // CLHEP //
21 #include "CLHEP/Matrix/SymMatrix.h"
22 #include "CLHEP/Matrix/Vector.h"
23 
24 // ROOT //
25 #include "TFile.h"
26 #include "TH1F.h"
27 #include "TH2F.h"
28 
29 // MuonCalib //
32 
33 namespace MuonCalib {
34 
35  class IMdtCalibrationOutput;
36  class IRtRelation;
37  class RtRelationLookUp;
38  class RtCalibrationOutput;
39  class CurvedPatRec;
40  class MuonCalibSegment;
41  class BaseFunction;
42  class Legendre_polynomial;
43  class CurvedLine;
44  class MultilayerRtDifference;
45 
47  public:
48  // Constructors //
49  RtCalibrationCurved(const std::string &name);
60 
61  RtCalibrationCurved(const std::string &name, const double &rt_accuracy, const unsigned int &func_type, const unsigned int &ord,
62  const bool &fix_min, const bool &fix_max, const int &max_it, bool do_parabolic_extrapolation = false,
63  bool do_smoothing = false, bool do_multilayer_rt_scale = false);
80 
81  // Destructor //
84 
85  // Methods //
86  // get-methods //
87  double reliability() const;
93  double estimatedRtAccuracy() const;
101  int numberOfSegments() const;
104  int numberOfSegmentsUsed() const;
107  int iteration() const;
110  bool smoothing() const;
116 
117  // set-method //
118  void setEstimateRtAccuracy(const double &acc);
120  void fullMatrix(const bool &yes_or_no);
129  void switch_on_control_histograms(const std::string &file_name);
138  void forceMonotony();
141  void doNotForceMonotony();
149  void doSmoothing();
154  void noSmoothing();
157 
158  // methods required by the base class "IMdtCalibration" //
159  MdtCalibOutputPtr analyseSegments(const MuonSegVec &seg) override;
164  bool handleSegment(MuonCalibSegment &seg);
168  void setInput(const IMdtCalibrationOutput *rt_input) override;
172  bool analyse(const MuonSegVec &seg);
175  bool converged() const;
178  virtual MdtCalibOutputPtr getResults() const override;
180 
181  private:
182  // options //
183  bool m_control_histograms = false; // = true, if control histograms should be
184  // produces
185  bool m_fix_min = false; // = true: fix r(t_min)
186  bool m_fix_max = false; // = true: fix r(t_max)
187  int m_max_it = 0; // maximum number of iterations
188  bool m_force_monotony = false; // = true if r(t) is forced to monotonically
189  // increasing, false otherwise
190  bool m_do_multilayer_rt_scale = false; // determine multilayer rt scaling
191 
192  // bookkeeping //
193  int m_nb_segments = 0; // number of segments passed to the algorithm
194  int m_nb_segments_used = 0; // number of segments used by the algorithm
195  int m_iteration = 0; // current iteration
196  std::array<bool, 2> m_multilayer{}; // m_multilayer[k] = true, if there was a segment
197  // extending to multilayer k+1
198 
199  // r-t quality //
200  int m_status = 0; // m_status: 0: no covergence yet,
201  // 1: convergence, r-t is reliable,
202  // 2: convergence, r-t is unreliable
203  double m_rt_accuracy = 0.0; // r-t accuracy (CLHEP::mm) of the input r-t
204  double m_rt_accuracy_previous; // r-t accuracy of the previous iteration
205  // (used in the convergence criterion)
206  double m_chi2_previous = 0.0;
207  // average chi^2 per degrees of freedom from the
208  // previous iteration (set to a large initial value
209  // to force at least two iterations);
210  // if an iteration gives a larger average than the
211  // pervious iteration, the algorithm has converged
212  double m_chi2 = 0.0; // average chi^2 per degrees of freedom,
213  // if an iteration gives a larger average than the
214  // pervious iteration, the algorithm has converged
215 
216  // r-t relationship //
217  std::shared_ptr<const IRtRelation> m_rt; // pointer to the input r-t relationship
218  double m_t_length = 0.0; // size of the drift time interval
219  double m_t_mean = 0.0; // mean value of the drift time interval
220 
221  // r-t output //
222  std::shared_ptr<IRtRelation> m_rt_new; // r-t as determined by the autocalibration
223  std::shared_ptr<RtCalibrationOutput> m_output; // class holding the results of the
224  // autocalibration
225  std::unique_ptr<MultilayerRtDifference> m_multilayer_rt_difference;
226  // curved-segment fitting //
227  double m_r_max = 0.0; // maximum value for accepted drift radii
228  std::unique_ptr<CurvedPatRec> m_tracker; // curved segment finder (used for track fitting)
229  // The following three objects are needed for autocalibration formulae.
230 
231  CLHEP::HepSymMatrix m_M_track; // segment parameters = m_M_track^-1*m_b_track
232  CLHEP::HepSymMatrix m_M_track_inverse; // inverse of m_M_track
233 
234  // autocalibration objects //
235  bool m_do_parabolic_extrapolation = false; // = true: parabolic extrapolation is
236  // done for small and large radii
237  // = false: no parabolic extrapolation is
238  // done
239  bool m_do_smoothing = false; // = true: the r-t relationship is smoothened after
240  // convergence, no smoothing is done
241  // otherwise
242  unsigned int m_order = 0U; // order of the polynomial describing the
243  // correction to the r-t relationship
244  std::vector<CLHEP::HepVector> m_U; // vector of base correction function values
245  std::vector<CLHEP::HepVector> m_U_weighted; // vector of base correction function
246  // values weighted by the inverse
247  // standard deviation of the radius
248  // measurements
249  CLHEP::HepSymMatrix m_A; // coefficient matrix of the final autocalibration
250  // equation
251  CLHEP::HepVector m_alpha; // vector of fit parameters, i.e. the coefficients
252  // of the correction polynomial
253  CLHEP::HepVector m_b; // m_A*m_alpha = m_b (final autocalibration equation)
254 
255  // correction functions //
256  std::unique_ptr<BaseFunction> m_base_function; // pointer to the base function u
257  const Legendre_polynomial *m_Legendre = nullptr; // pointer to the Legendre polynomial
258  // describing the curved line
259 
260  // control histograms //
261  std::unique_ptr<TFile> m_tfile; // ROOT file
262  std::unique_ptr<TH1F> m_cut_evolution; // cut evolution histogram
263  std::unique_ptr<TH1F> m_nb_segment_hits; // number of hits on the segments
264  std::unique_ptr<TH1F> m_pull_initial; // initial pull distribution
265  std::unique_ptr<TH1F> m_pull_final; // final pull distribution after convergence
266  std::unique_ptr<TH2F> m_residuals_initial; // initial residual distribution
267  std::unique_ptr<TH2F> m_residuals_initial_all; // initial residual distribution before convergence
268  std::unique_ptr<TH2F> m_residuals_final; // final residual distribution after convergence
269  std::unique_ptr<TH2F> m_driftTime_initial; // final residual distribution after convergence
270  std::unique_ptr<TH2F> m_driftTime_final; // final residual distribution after convergence
271  std::unique_ptr<TH2F> m_adc_vs_residual_final; // final residual distribution after convergence
272 
273  // private methods //
274  void init(const double &rt_accuracy, const unsigned int &func_type, const unsigned int &ord, const bool &fix_min,
275  const bool &fix_max, const int &max_it, bool do_parabolic_extrapolation, bool do_smoothing, bool do_multilayer_rt_scale);
276  // initialization method:
277  // rt_accuracy = estimated r-t accuracy,
278  // func_type: type of function to be used for
279  // the r-t correction;
280  // = 1: Legendre polynomial,
281  // = 2: Chebyshev polynomial,
282  // = 3: polygon
283  // ord = "order" ot the r-t correction function
284  // split = true forces the algorithm to restrict
285  // segments to multilayers;
286  // fix_min, fix_max=true: fix r(t_min), r(t_max)
287  // max_it: maximum number of iterations
288  // do_parabolic_extrapolation: do or do not use
289  // parabolic extrapolations for small and large
290  // radii;
291  // do_smoothing: smoothen the r-t relationship
292  // after convergence if do_smoothing = true
293  double t_from_r(const double &r);
294  // get t(r) for the input r-t relationship,
295  // the method is auxiliary and not optimized;
296  // it will disappear when the t(r) will be
297  // available in the MuonCalib framework
298  void display_segment(MuonCalibSegment *segment, std::ofstream &outfile, const CurvedLine *curved_segment);
299  // write out a simple PAW macro displaying the
300  // segment; if the pointer "curved_segment" equals
301  // 0, a straight line as stored in segment is drawn;
302  // the curved line is used otherwise
303  std::shared_ptr<RtRelationLookUp> performParabolicExtrapolation(const bool &min, const bool &max, const IRtRelation &in_rt);
304  // use parabolic extrapolations on the given r-t
305  // relationship in_rt;
306  // min: if true, use parabolic extrapolation towards
307  // r=0;
308  // max: if true, use parabolic extrapolation towards
309  // r=r_max;
310  };
311 
312 } // namespace MuonCalib
313 
314 #endif
MuonCalib::RtCalibrationCurved::m_driftTime_initial
std::unique_ptr< TH2F > m_driftTime_initial
Definition: RtCalibrationCurved.h:269
MuonCalib::RtCalibrationCurved::noSmoothing
void noSmoothing()
do not smoothen the r-t relationship after convergence
Definition: RtCalibrationCurved.cxx:100
MuonCalib::RtCalibrationCurved::m_base_function
std::unique_ptr< BaseFunction > m_base_function
Definition: RtCalibrationCurved.h:256
MuonCalib::RtCalibrationCurved::m_fix_max
bool m_fix_max
Definition: RtCalibrationCurved.h:186
beamspotman.r
def r
Definition: beamspotman.py:676
MuonCalib::RtCalibrationCurved::m_rt_new
std::shared_ptr< IRtRelation > m_rt_new
Definition: RtCalibrationCurved.h:222
MuonCalib::IMdtCalibration::MdtCalibOutputPtr
std::shared_ptr< IMdtCalibrationOutput > MdtCalibOutputPtr
Definition: IMdtCalibration.h:30
MuonCalib::RtCalibrationCurved::m_residuals_initial
std::unique_ptr< TH2F > m_residuals_initial
Definition: RtCalibrationCurved.h:266
max
#define max(a, b)
Definition: cfImp.cxx:41
MuonCalib::RtCalibrationCurved
Definition: RtCalibrationCurved.h:46
MuonCalib::RtCalibrationCurved::m_tfile
std::unique_ptr< TFile > m_tfile
Definition: RtCalibrationCurved.h:261
MuonCalib::RtCalibrationCurved::m_order
unsigned int m_order
Definition: RtCalibrationCurved.h:242
MuonCalib::RtCalibrationCurved::iteration
int iteration() const
get the number of the current iteration
Definition: RtCalibrationCurved.cxx:57
MuonCalib::RtCalibrationCurved::forceMonotony
void forceMonotony()
force r(t) to be monotonically increasing (this is default)
Definition: RtCalibrationCurved.cxx:96
MuonCalib::RtCalibrationCurved::m_do_smoothing
bool m_do_smoothing
Definition: RtCalibrationCurved.h:239
MuonCalib::RtCalibrationCurved::m_multilayer
std::array< bool, 2 > m_multilayer
Definition: RtCalibrationCurved.h:196
MuonCalib::RtCalibrationCurved::m_nb_segments
int m_nb_segments
Definition: RtCalibrationCurved.h:193
MuonCalib::CurvedLine
Definition: CurvedLine.h:31
MuonCalib::RtCalibrationCurved::m_pull_initial
std::unique_ptr< TH1F > m_pull_initial
Definition: RtCalibrationCurved.h:264
MuonCalib::IMdtCalibration
Definition: IMdtCalibration.h:25
MuonCalib::RtCalibrationCurved::RtCalibrationCurved
RtCalibrationCurved(const std::string &name)
Default constructor: r-t accuracy is set to 0.5 mm.
Definition: RtCalibrationCurved.cxx:35
MuonCalib::MuonCalibSegment
Definition: MuonCalibSegment.h:39
MuonCalib::RtCalibrationCurved::m_Legendre
const Legendre_polynomial * m_Legendre
Definition: RtCalibrationCurved.h:257
MuonCalib::RtCalibrationCurved::m_nb_segments_used
int m_nb_segments_used
Definition: RtCalibrationCurved.h:194
MuonCalib::RtCalibrationCurved::m_chi2
double m_chi2
Definition: RtCalibrationCurved.h:212
MuonCalib::RtCalibrationCurved::m_rt
std::shared_ptr< const IRtRelation > m_rt
Definition: RtCalibrationCurved.h:217
MuonCalib::RtCalibrationCurved::smoothing
bool smoothing() const
returns true, if the r-t relationship will be smoothened using the conventional autocalibration after...
Definition: RtCalibrationCurved.cxx:59
MuonCalib::RtCalibrationCurved::fullMatrix
void fullMatrix(const bool &yes_or_no)
yes_or_no=true: the full matrix relating the errors in the r-t relationship to the residuals is used ...
MuonCalib::RtCalibrationCurved::display_segment
void display_segment(MuonCalibSegment *segment, std::ofstream &outfile, const CurvedLine *curved_segment)
Definition: RtCalibrationCurved.cxx:827
MuonCalib::RtCalibrationCurved::doSmoothing
void doSmoothing()
requires that the r-t relationship will be smoothened using the conventional autocalibration after co...
Definition: RtCalibrationCurved.cxx:99
MuonCalib::RtCalibrationCurved::reliability
double reliability() const
get the reliability of the final r-t relationship: 0: no convergence yet 1: convergence,...
Definition: RtCalibrationCurved.cxx:49
MuonCalib::RtCalibrationCurved::m_fix_min
bool m_fix_min
Definition: RtCalibrationCurved.h:185
MuonCalib::RtCalibrationCurved::noParabolicExtrapolation
void noParabolicExtrapolation()
no parabolic extrapolation is done
MuonCalib::RtCalibrationCurved::m_do_parabolic_extrapolation
bool m_do_parabolic_extrapolation
Definition: RtCalibrationCurved.h:235
MuonCalib::RtCalibrationCurved::m_residuals_final
std::unique_ptr< TH2F > m_residuals_final
Definition: RtCalibrationCurved.h:268
physics_parameters.file_name
string file_name
Definition: physics_parameters.py:32
GeoPrimitives.h
MuonCalib::RtCalibrationCurved::m_r_max
double m_r_max
Definition: RtCalibrationCurved.h:227
CurvedLine
MuonCalib::RtCalibrationCurved::m_rt_accuracy
double m_rt_accuracy
Definition: RtCalibrationCurved.h:203
MuonCalib::RtCalibrationCurved::m_driftTime_final
std::unique_ptr< TH2F > m_driftTime_final
Definition: RtCalibrationCurved.h:270
MuonCalib::RtCalibrationCurved::m_status
int m_status
Definition: RtCalibrationCurved.h:200
MuonCalib::RtCalibrationCurved::m_control_histograms
bool m_control_histograms
Definition: RtCalibrationCurved.h:183
MuonCalib::RtCalibrationCurved::performParabolicExtrapolation
std::shared_ptr< RtRelationLookUp > performParabolicExtrapolation(const bool &min, const bool &max, const IRtRelation &in_rt)
Definition: RtCalibrationCurved.cxx:913
MuonCalib::RtCalibrationCurved::numberOfSegments
int numberOfSegments() const
get the number of segments which were passed to the algorithm
Definition: RtCalibrationCurved.cxx:53
MuonCalib::RtCalibrationCurved::switch_on_control_histograms
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...
Definition: RtCalibrationCurved.cxx:63
MuonCalib::RtCalibrationCurved::m_residuals_initial_all
std::unique_ptr< TH2F > m_residuals_initial_all
Definition: RtCalibrationCurved.h:267
MuonCalib::RtCalibrationCurved::estimatedRtAccuracy
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...
Definition: RtCalibrationCurved.cxx:51
MuonCalib::RtCalibrationCurved::m_t_mean
double m_t_mean
Definition: RtCalibrationCurved.h:219
MuonCalib::RtCalibrationCurved::m_force_monotony
bool m_force_monotony
Definition: RtCalibrationCurved.h:188
MuonCalib::RtCalibrationCurved::m_chi2_previous
double m_chi2_previous
Definition: RtCalibrationCurved.h:206
MuonCalib::RtCalibrationCurved::m_multilayer_rt_difference
std::unique_ptr< MultilayerRtDifference > m_multilayer_rt_difference
Definition: RtCalibrationCurved.h:225
MuonCalib::RtCalibrationCurved::m_M_track
CLHEP::HepSymMatrix m_M_track
Definition: RtCalibrationCurved.h:231
MuonCalib::RtCalibrationCurved::m_M_track_inverse
CLHEP::HepSymMatrix m_M_track_inverse
Definition: RtCalibrationCurved.h:232
MuonCalib::RtCalibrationCurved::m_cut_evolution
std::unique_ptr< TH1F > m_cut_evolution
Definition: RtCalibrationCurved.h:262
MuonCalib
CscCalcPed - algorithm that finds the Cathode Strip Chamber pedestals from an RDO.
Definition: CscCalcPed.cxx:22
AthenaPoolTestRead.acc
acc
Definition: AthenaPoolTestRead.py:16
MuonCalib::RtCalibrationCurved::m_output
std::shared_ptr< RtCalibrationOutput > m_output
Definition: RtCalibrationCurved.h:223
MuonCalib::RtCalibrationCurved::m_pull_final
std::unique_ptr< TH1F > m_pull_final
Definition: RtCalibrationCurved.h:265
MuonCalib::RtCalibrationCurved::m_nb_segment_hits
std::unique_ptr< TH1F > m_nb_segment_hits
Definition: RtCalibrationCurved.h:263
MuonCalib::RtCalibrationCurved::m_do_multilayer_rt_scale
bool m_do_multilayer_rt_scale
Definition: RtCalibrationCurved.h:190
MuonCalib::RtCalibrationCurved::m_t_length
double m_t_length
Definition: RtCalibrationCurved.h:218
min
#define min(a, b)
Definition: cfImp.cxx:40
MuonCalib::RtCalibrationCurved::m_max_it
int m_max_it
Definition: RtCalibrationCurved.h:187
CurvedPatRec
MuonCalib::IMdtCalibration::name
virtual std::string name() const
returns name (region) of instance
Definition: IMdtCalibration.h:49
MuonCalib::RtCalibrationCurved::m_iteration
int m_iteration
Definition: RtCalibrationCurved.h:195
MuonCalib::RtCalibrationCurved::init
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)
Definition: RtCalibrationCurved.cxx:726
MuonCalib::RtCalibrationCurved::m_adc_vs_residual_final
std::unique_ptr< TH2F > m_adc_vs_residual_final
Definition: RtCalibrationCurved.h:271
IMdtCalibration.h
MuonCalib::RtCalibrationCurved::setEstimateRtAccuracy
void setEstimateRtAccuracy(const double &acc)
set the estimated r-t accuracy =acc
Definition: RtCalibrationCurved.cxx:61
MuonCalib::IMdtCalibrationOutput
Definition: IMdtCalibrationOutput.h:28
MuonCalib::RtCalibrationCurved::setInput
void setInput(const IMdtCalibrationOutput *rt_input) override
set the r-t relationship, the internal autocalibration objects are reset
Definition: RtCalibrationCurved.cxx:506
MuonCalib::RtCalibrationCurved::analyseSegments
MdtCalibOutputPtr analyseSegments(const MuonSegVec &seg) override
perform the full autocalibration including iterations (required since MdtCalibInterfaces-00-01-06)
Definition: RtCalibrationCurved.cxx:101
MuonCalib::RtCalibrationCurved::converged
bool converged() const
returns true, if the autocalibration has converged
Definition: RtCalibrationCurved.cxx:718
MuonCalib::RtCalibrationCurved::analyse
bool analyse(const MuonSegVec &seg)
perform the autocalibration with the segments acquired so far
Definition: RtCalibrationCurved.cxx:563
MuonCalib::RtCalibrationCurved::numberOfSegmentsUsed
int numberOfSegmentsUsed() const
get the number of segments which are used in the autocalibration
Definition: RtCalibrationCurved.cxx:55
MuonCalib::RtCalibrationCurved::m_rt_accuracy_previous
double m_rt_accuracy_previous
Definition: RtCalibrationCurved.h:204
MuonCalib::RtCalibrationCurved::switch_off_control_histograms
void switch_off_control_histograms()
the algorithm does not produce controll histograms (this is the default)
Definition: RtCalibrationCurved.cxx:88
MuonCalib::RtCalibrationCurved::doNotForceMonotony
void doNotForceMonotony()
do not force r(t) to be monotonically increasing
Definition: RtCalibrationCurved.cxx:97
MuonCalib::RtCalibrationCurved::t_from_r
double t_from_r(const double &r)
Definition: RtCalibrationCurved.cxx:806
MuonCalib::RtCalibrationCurved::getResults
virtual MdtCalibOutputPtr getResults() const override
returns the final r-t relationship
Definition: RtCalibrationCurved.cxx:719
MuonCalib::RtCalibrationCurved::m_b
CLHEP::HepVector m_b
Definition: RtCalibrationCurved.h:253
MuonCalib::RtCalibrationCurved::m_A
CLHEP::HepSymMatrix m_A
Definition: RtCalibrationCurved.h:249
MuonCalib::RtCalibrationCurved::handleSegment
bool handleSegment(MuonCalibSegment &seg)
analyse the segment "seg" (this method was required before MdtCalibInterfaces-00-01-06)
Definition: RtCalibrationCurved.cxx:267
MuonCalib::RtCalibrationCurved::m_alpha
CLHEP::HepVector m_alpha
Definition: RtCalibrationCurved.h:251
MuonCalib::IMdtCalibration::MuonSegVec
std::vector< std::shared_ptr< MuonCalibSegment > > MuonSegVec
Definition: IMdtCalibration.h:27
MuonCalib::RtCalibrationCurved::~RtCalibrationCurved
~RtCalibrationCurved()
Destructor.
Definition: RtCalibrationCurved.cxx:46
MuonCalib::RtCalibrationCurved::m_U_weighted
std::vector< CLHEP::HepVector > m_U_weighted
Definition: RtCalibrationCurved.h:245
MuonCalib::RtCalibrationCurved::m_U
std::vector< CLHEP::HepVector > m_U
Definition: RtCalibrationCurved.h:244
PrepareReferenceFile.outfile
outfile
Definition: PrepareReferenceFile.py:42
MuonCalib::RtCalibrationCurved::m_tracker
std::unique_ptr< CurvedPatRec > m_tracker
Definition: RtCalibrationCurved.h:228
MuonCalib::RtCalibrationCurved::doParabolicExtrapolation
void doParabolicExtrapolation()
requires that parabolic extrapolation will be used for small and large radii
Definition: RtCalibrationCurved.cxx:98
MuonCalib::IRtRelation
generic interface for a rt-relation
Definition: IRtRelation.h:14
NSWL1::PadTriggerAdapter::segment
Muon::NSW_PadTriggerSegment segment(const NSWL1::PadTrigger &data)
Definition: PadTriggerAdapter.cxx:5
MuonCalib::Legendre_polynomial
Definition: Legendre_polynomial.h:45