ATLAS Offline Software
GlobalTimeFitter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3 */
4 
7 #include <sstream>
8 #include <string>
9 namespace {
10  constexpr double tdc_bc_conv = 25. / 32.;
11  constexpr double max_drift_time_30mm = 750;
12 } // namespace
13 
14 namespace MuonCalib {
15 
17  double timeShift = 0;
18  float tdcmin = FLT_MAX;
19  double timeoffset = 0.;
20  int stepf, stepff[13], stepl, stepr, dtt, dttbuono(0);
21  double chi2r, chi2l;
22  double chi2min = FLT_MAX;
23  double bestchi2 = FLT_MAX;
24 
25  stepff[0] = 512;
26  stepff[1] = 256;
27  stepff[2] = 128;
28  stepff[3] = 64;
29  stepff[4] = 32;
30  stepff[5] = 16;
31  stepff[6] = 8;
32  stepff[7] = 4;
33  stepff[8] = 2;
34  stepff[9] = 1;
35  stepff[10] = 1;
36  stepff[11] = 1;
37  stepff[12] = 1;
38 
39  for (const MuonCalibSegment::MdtHitPtr& mdt_hit : seg->mdtHOT()) {
40  if (mdt_hit->tdcCount() < tdcmin) tdcmin = mdt_hit->tdcCount();
41  }
42 
43  stepl = 512;
44  stepr = 512;
45  stepf = 512;
46  for (int jj = 0; jj < 11; jj++) {
47  bool outofrange{false};
48  for (const MuonCalibSegment::MdtHitPtr& mdt_hit : seg->mdtHOT()) {
49  double newtime = (mdt_hit->tdcCount() - tdcmin + stepl) * tdc_bc_conv;
51  if (newtime < 0. || newtime > max_drift_time_30mm) { outofrange = true; }
52  mdt_hit->setDriftTime(newtime);
53  double r = m_rtRel->radius(newtime);
54  double dr = getDefaultResolution(r); // get H8 resolution
55  mdt_hit->setDriftRadius(r, dr);
56  }
57  if (!outofrange) {
58  m_fitter->fit(*seg);
59  chi2l = seg->chi2();
60  } else {
61  chi2l = FLT_MAX;
62  }
63  outofrange = false;
64  for (const MuonCalibSegment::MdtHitPtr& mdt_hit : seg->mdtHOT()) {
65  double newtime = (mdt_hit->tdcCount() - tdcmin + stepr) * tdc_bc_conv;
66 
67  if (newtime < 0. || newtime > max_drift_time_30mm) { outofrange = true; }
68  mdt_hit->setDriftTime(newtime);
69  double r = m_rtRel->radius(newtime);
70  double dr = getDefaultResolution(r); // get H8 resolution
71  mdt_hit->setDriftRadius(r, dr);
72  }
73  if (!outofrange) {
74  m_fitter->fit(*seg);
75  chi2r = seg->chi2();
76  } else {
77  chi2r = FLT_MAX;
78  }
79  chi2min = chi2l;
80  stepf = stepl;
81  dtt = stepl;
82  if (chi2r < chi2l) {
83  chi2min = chi2r;
84  stepf = stepr;
85  dtt = stepr;
86  }
87  if (chi2min < bestchi2) {
88  bestchi2 = chi2min;
89  dttbuono = dtt;
90  stepl = stepf - stepff[jj];
91  stepr = stepff[jj] + stepf;
92  if (stepl < 0) stepl = 0;
93  if (stepr < 0) stepr = 0;
94  } else {
95  stepl = stepf - stepff[jj];
96  stepr = stepff[jj] + stepf;
97  if (stepl < 0) stepl = 0;
98  if (stepr < 0) stepr = 0;
99  }
100  timeoffset = dttbuono;
101  }
102 
103  for (const MuonCalibSegment::MdtHitPtr& mdt_hit : seg->mdtHOT()) {
104  double newtime = (mdt_hit->tdcCount() - tdcmin + timeoffset) * tdc_bc_conv;
105  mdt_hit->setDriftTime(newtime);
106  double r = m_rtRel->radius(newtime);
107  double dr = getDefaultResolution(r); // get H8 resolution
108  mdt_hit->setDriftRadius(r, dr);
109  }
110  m_fitter->fit(*seg);
111 
112  timeShift = -(timeoffset - tdcmin) * tdc_bc_conv;
113  return timeShift;
114  }
115 
117  double timeShift = 999.;
118  for (const MuonCalibSegment::MdtHitPtr& mdt_hit : seg->mdtHOT()) {
119  mdt_hit->setDriftTime(400.);
120  double t = mdt_hit->driftTime();
121  double r = m_rtRel->radius(t);
122  double dr = mdt_hit->sigmaDriftRadius();
123  mdt_hit->setDriftRadius(r, dr);
124 
125  timeShift = t;
126  }
127 
128  return timeShift;
129  }
130 
132  static const MuonCalib::CalibFunc::ParVec rtPars{
133 
134  -50., // t_Start
135  8., // t_binSize
136 
137  0.2, // r(-50)
138  0.2, // r(-50+8)
139  0.2, // ...
140  0.25, 0.294403, 0.311703, 0.485873, 0.804235, 1.19624, 1.5562, 1.91466, 2.3147, 2.66996, 3.05436, 3.40371, 3.80574,
141  4.13506, 4.45473, 4.77338, 5.05294, 5.33755, 5.58459, 5.8718, 6.09389, 6.37129, 6.56824, 6.73359, 6.96923, 7.16944,
142  7.38872, 7.55627, 7.73885, 7.86403, 8.07223, 8.26818, 8.39531, 8.54069, 8.69377, 8.86487, 9.01724, 9.16516, 9.24791,
143  9.45596, 9.56237, 9.69553, 9.80647, 9.9432, 10.039, 10.207, 10.2884, 10.3977, 10.6045, 10.6181, 10.7883, 10.9057,
144  10.9908, 11.1615, 11.2359, 11.3409, 11.4451, 11.5412, 11.6896, 11.7487, 11.8853, 11.9571, 12.0381, 12.1739, 12.2601,
145  12.3892, 12.4406, 12.5809, 12.6297, 12.7495, 12.8314, 12.9463, 13.0487, 13.1337, 13.2417, 13.2706, 13.3917, 13.5107,
146  13.60, 13.69, 13.71, 13.8088, 13.8577, 14.0212, 14.0671, 14.1225, 14.2112, 14.3113, 14.3747, 14.3531, 14.4799,
147  14.458, 14.516, 14.8312, 14.85, 14.86, 14.87
148 
149  };
150 
151  IRtRelation* rt = MuonCalib::MdtCalibrationFactory::createRtRelation("RtRelationLookUp", rtPars);
152 
153  return rt;
154  }
155 
156 } // namespace MuonCalib
MuonCalib::IMdtSegmentFitter::fit
virtual bool fit(MuonCalibSegment &seg) const =0
fit using all hits
beamspotman.r
def r
Definition: beamspotman.py:676
MuonCalib::GlobalTimeFitter::GTFit2
double GTFit2(MuonCalibSegment *seg)
Definition: GlobalTimeFitter.cxx:116
TBH6ByteStream-Monitor-EventStorage.tdcmin
tdcmin
Definition: TBH6ByteStream-Monitor-EventStorage.py:143
MuonCalib::MuonCalibSegment
Definition: MuonCalibSegment.h:39
python.TurnDataReader.dr
dr
Definition: TurnDataReader.py:112
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
GlobalTimeFitter.h
MuonCalib::CalibFunc::ParVec
std::vector< double > ParVec
Definition: CalibFunc.h:36
MuonCalib::GlobalTimeFitter::getDefaultResolution
double getDefaultResolution(double r)
Definition: GlobalTimeFitter.h:35
MuonCalib::GlobalTimeFitter::m_fitter
const IMdtSegmentFitter * m_fitter
Definition: GlobalTimeFitter.h:46
MuonCalib
CscCalcPed - algorithm that finds the Cathode Strip Chamber pedestals from an RDO.
Definition: CscCalcPed.cxx:22
MuonCalib::GlobalTimeFitter::GTFit
double GTFit(MuonCalibSegment *seg)
Definition: GlobalTimeFitter.cxx:16
MuonCalib::GlobalTimeFitter::getDefaultRtRelation
IRtRelation * getDefaultRtRelation()
Definition: GlobalTimeFitter.cxx:131
MuonCalib::MdtCalibrationFactory::createRtRelation
static IRtRelation * createRtRelation(const std::string &name, const ParVec &pars)
Definition: MdtCalibrationFactory.cxx:71
MuonCalib::GlobalTimeFitter::m_rtRel
const IRtRelation * m_rtRel
Definition: GlobalTimeFitter.h:47
MuonCalib::IRtRelation::radius
virtual double radius(double t) const =0
returns drift radius for a given time
MuonCalib::MuonCalibSegment::chi2
double chi2() const
retrieve chi2
Definition: MuonCalibSegment.cxx:183
MdtCalibrationFactory.h
MuonCalib::MuonCalibSegment::mdtHOT
const MdtHitVec & mdtHOT() const
retrieve the full set of MdtCalibHitBase s assigned to this segment
Definition: MuonCalibSegment.cxx:148
MuonCalib::IRtRelation
generic interface for a rt-relation
Definition: IRtRelation.h:14
MuonCalib::MuonCalibSegment::MdtHitPtr
std::shared_ptr< MdtCalibHitBase > MdtHitPtr
typedef for a collection of MdtCalibHitBase s
Definition: MuonCalibSegment.h:44