ATLAS Offline Software
MdtAnalyticRtCalibAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
5 
8 
12 
14 #include "TGraph.h"
15 #include "TGraphErrors.h"
16 #include "TH1F.h"
17 #include "TCanvas.h"
18 #include "TLegend.h"
19 #include "TROOT.h"
20 
21 #include <format>
22 
23 using namespace MuonCalib;
24 using namespace Acts;
25 namespace MuonCalibR4{
26 
28  ATH_CHECK(m_idHelperSvc.retrieve());
29  ATH_CHECK(m_readKey.initialize());
30  ATH_CHECK(m_writeKey.initialize());
31  if (m_saveDiagnostic) {
32  ATH_CHECK(m_visualSvc.retrieve());
33  m_clientToken.canvasLimit = -1;
34  m_clientToken.preFixName = "AnalyticMdtCalib";
35  ATH_CHECK(m_visualSvc->registerClient(m_clientToken));
36  }
37  return StatusCode::SUCCESS;
38  }
39  StatusCode MdtAnalyticRtCalibAlg::execute(const EventContext& ctx) const {
40  SG::WriteCondHandle writeHandle{m_writeKey, ctx};
41  if(writeHandle.isValid()) {
42  ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid.");
43  return StatusCode::SUCCESS;
44  }
46  SG::ReadCondHandle readHandle{m_readKey, ctx};
47  ATH_CHECK(readHandle.isValid());
48  writeHandle.addDependency(readHandle);
50  auto writeCdo = std::make_unique<MdtCalibDataContainer>(m_idHelperSvc.get(), readHandle->granularity());
52  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
53  std::map<RtRelationPtr, RtRelationPtr, CalibParamSorter> translatedRts{CalibParamSorter{std::pow(0.1, m_precCutOff)}};
54 
55  RtRelationPtr dummyFillerRt{};
56  MdtFullCalibData::CorrectionPtr dummyFillerCorr{};
57  std::unordered_set<Identifier> missedElements{};
58  for (auto itr = idHelper.detectorElement_begin(); itr != idHelper.detectorElement_end(); ++itr){
59  const Identifier& detId{*itr};
60  if (!readHandle->hasDataForChannel(detId, msgStream())){
61  ATH_MSG_VERBOSE("There's no calibration data available for "<<m_idHelperSvc->toStringDetEl(detId));
62  missedElements.insert(detId);
63  continue;
64  }
65  const MdtFullCalibData* copyMe = readHandle->getCalibData(detId, msgStream());
66 
67  if (copyMe->corrections && !writeCdo->storeData(detId, copyMe->corrections, msgStream())) {
68  return StatusCode::FAILURE;
69  }
71  const std::vector<Identifier> tubes = tubeIds(detId);
72  if (std::ranges::none_of(tubes, [copyMe](const Identifier& tubeId){
73  return !copyMe->tubeCalib->getCalib(tubeId);
74  })) {
76  if (!writeCdo->storeData(detId, copyMe->tubeCalib, msgStream())) {
77  return StatusCode::FAILURE;
78  }
79  } else {
80  ATH_MSG_VERBOSE("Tube calibration constants invalid for: "<<m_idHelperSvc->toStringDetEl(detId));
81  missedElements.insert(detId);
82  }
83 
84  RtRelationPtr& translated = translatedRts[copyMe->rtRelation];
85  if (!translated) {
86  translated = translateRt(ctx, detId, *copyMe->rtRelation);
87  }
88  if (!dummyFillerRt) {
89  dummyFillerRt = translated;
90  dummyFillerCorr = copyMe->corrections;
91  }
92  if (!writeCdo->storeData(detId, translated, msgStream())) {
93  ATH_MSG_FATAL("Failed to store rt relation for "<<m_idHelperSvc->toStringDetEl(detId));
94  return StatusCode::FAILURE;
95  }
96  }
97  if (!m_fillMissingCh) {
98  missedElements.clear();
99  }
100  for (const Identifier& detId: missedElements) {
101  ATH_MSG_WARNING("Initial container did not contain any constants for "<<m_idHelperSvc->toString(detId)
102  <<". Insert instead the first translated rt-relation for those channels");
103  const bool fillRt = !writeCdo->hasDataForChannel(detId, msgStream()) ||
104  !writeCdo->getCalibData(detId, msgStream())->rtRelation;
105  if(fillRt) {
106  if (!writeCdo->storeData(detId, dummyFillerRt, msgStream())) {
107  ATH_MSG_FATAL("Failed to store rt relation for "<<m_idHelperSvc->toStringDetEl(detId));
108  return StatusCode::FAILURE;
109  }
110  if (dummyFillerCorr && !writeCdo->storeData(detId, dummyFillerCorr, msgStream())) {
111  return StatusCode::FAILURE;
112  }
113  }
114  if (writeCdo->getCalibData(detId, msgStream())->tubeCalib) {
115  continue;
116  }
117  MdtCalibDataContainer::TubeContainerPtr dummyT0cont = std::make_unique<MdtTubeCalibContainer>(m_idHelperSvc.get(), detId);
119  dummyT0Calib.t0 = m_missingT0;
120  for (const Identifier& tubeId : tubeIds(detId)) {
121  if (!dummyT0cont->setCalib(dummyT0Calib, tubeId, msgStream())) {
122  return StatusCode::FAILURE;
123  }
124  }
125  if (!writeCdo->storeData(detId, std::move(dummyT0cont), msgStream())) {
126  return StatusCode::FAILURE;
127  }
128  }
129  ATH_CHECK(writeHandle.record(std::move(writeCdo)));
130  return StatusCode::SUCCESS;
131  }
132  std::vector<Identifier> MdtAnalyticRtCalibAlg::tubeIds(const Identifier& chId) const {
133  std::vector<Identifier> tubes{};
134  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
135  for (int ml = 1; ml <= idHelper.multilayerMax(chId); ++ml) {
136  const Identifier detId = idHelper.multilayerID(chId, ml);
137  for (int layer = 1; layer <= idHelper.tubeLayerMax(detId); ++layer) {
138  for (int tube = 1; tube <= idHelper.tubeMax(detId); ++tube) {
139  tubes.emplace_back(idHelper.channelID(detId, ml, layer, tube));
140  }
141  }
142  }
143  return tubes;
144  }
145 
147  MdtAnalyticRtCalibAlg::translateRt(const EventContext& ctx,
148  const Identifier& detId,
149  const MdtRtRelation& inRel) const {
150 
151  const std::vector<SamplePoint> rtPoints = fetchDataPoints(*inRel.rt(), *inRel.rtRes());
152  IRtRelationPtr rt{};
153  ITrRelationPtr tr{};
154  unsigned int order{0};
155  while (order++ <= m_maxOrder && !rt) {
156  ATH_MSG_DEBUG("Attempt to fit rt relation for "<<m_idHelperSvc->toStringDetEl(detId)
157  <<" using a polynomial of order "<<order);
158  switch(m_polyTypeRt) {
159  case toUnderlying(PolyType::ChebyChev):
160  rt = RtFromPoints::getRtChebyshev(rtPoints, order);
161  break;
162  case toUnderlying(PolyType::Legendre):
163  rt = RtFromPoints::getRtLegendre(rtPoints, order);
164  break;
165  case toUnderlying(PolyType::Simple):
166  rt = RtFromPoints::getRtSimplePoly(rtPoints, order);
167  break;
168  default:
169  break;
170  }
171  const unsigned rtNdoF = rtPoints.size() - rt->nDoF();
172  const double rtChi2 = calculateChi2(rtPoints, *rt) / rtNdoF;
173  ATH_MSG_VERBOSE("Fit has a chi2 of "<<rtChi2<<". Cut off at "<<m_chiCutOff);
174  if (rtChi2 > m_chiCutOff) {
175  rt.reset();
176  }
177  }
178  if (!rt) {
179  ATH_MSG_ERROR("Failed to fit rt relation for "<<m_idHelperSvc->toStringDetEl(detId));
180  return nullptr;
181  }
182  const std::vector<SamplePoint> trPoints = swapCoordinates(rtPoints, *rt);
183  order = 0;
184  while (order++ <= m_maxOrder && !tr) {
185  ATH_MSG_DEBUG("Now continue with tr fit for "<<m_idHelperSvc->toStringDetEl(detId)
186  <<" using a polynomial of order "<<order);
187  switch(m_polyTypeTr) {
188  case toUnderlying(PolyType::Legendre):
189  tr = RtFromPoints::getTrLegendre(trPoints, order);
190  break;
191  case toUnderlying(PolyType::ChebyChev):
192  tr = RtFromPoints::getTrChebyshev(trPoints, order);
193  break;
194  case toUnderlying(PolyType::Simple):
195  tr = RtFromPoints::getTrSimplePoly(trPoints, order);
196  break;
197  default:
198  break;
199  }
200  const unsigned trNdoF = rtPoints.size() - tr->nDoF();
201  const double trChi2 = calculateChi2(trPoints, *tr) / trNdoF;
203  ATH_MSG_VERBOSE("T-R fit resulted in a chi2/nDoF for tr: "<<trChi2<<" ("<<trNdoF<<")");
204  if (trChi2 > m_chiCutOff) {
205  tr.reset();
206  }
207  }
208  if (!tr) {
209  ATH_MSG_FATAL("Failed to fit tr relation for "<<m_idHelperSvc->toStringDetEl(detId));
210  return nullptr;
211  }
212  auto rtReso = inRel.smartReso();
213  if (m_fitRtReso) {
214  std::unique_ptr<IRtResolution> fittedReso{};
215  std::vector<SamplePoint> rtResoPoints = fetchResolution(rtPoints, m_relUncReso);
216  order = 0;
217  while (order++ <= m_maxOrderReso && !fittedReso) {
218  ATH_MSG_VERBOSE("Finally fit the resolution function "<<m_idHelperSvc->toStringDetEl(detId)
219  <<" using a polynomial of order "<<order);
220  fittedReso = RtFromPoints::getResoChebyshev(rtPoints, rt, m_relUncReso, order);
221  const unsigned nDoF = rtResoPoints.size() - fittedReso->nDoF();
222  const double chi2 = calculateChi2(rtResoPoints, *fittedReso) / nDoF;
223  ATH_MSG_VERBOSE("Fit has a chi2 of "<<chi2<<". Cut off at "<<m_chiCutOff);
224  if (chi2 > m_chiCutOff) {
225  if (order == m_maxOrderReso) {
226  drawResoFunc(ctx, detId, rtResoPoints, *fittedReso);
227  }
228  fittedReso.reset();
229  }
230  }
231 
232  if (fittedReso) {
233  drawResoFunc(ctx, detId, rtResoPoints, *fittedReso);
234  rtReso = std::move(fittedReso);
235  } else {
236  ATH_MSG_WARNING("Despite of having a "<<m_maxOrderReso
237  <<" no rt resolution function could be fitted for "<<m_idHelperSvc->toStringDetEl(detId));
238  }
239  }
240  auto finalRt = std::make_unique<MdtRtRelation>(std::move(rt), rtReso, std::move(tr));
241  drawRt(ctx, detId, rtPoints, *finalRt);
242  return finalRt;
243  }
244  void MdtAnalyticRtCalibAlg::drawRt(const EventContext& ctx,
245  const Identifier& detId,
246  const std::vector<SamplePoint>& rtPoints,
247  const MdtRtRelation& inRel) const {
248  if (!m_saveDiagnostic) {
249  return;
250  }
251  const std::string chName = std::format("{:}{:d}{:}{:d}M{:1d}",
252  m_idHelperSvc->stationNameString(detId),
253  std::abs(m_idHelperSvc->stationEta(detId)),
254  m_idHelperSvc->stationEta(detId)> 0? 'A' : 'C',
255  m_idHelperSvc->stationPhi(detId),
256  m_idHelperSvc->mdtIdHelper().multilayer(detId));
257  auto canvas = m_visualSvc->prepareCanvas(ctx, m_clientToken, std::format("RtRelation_{:}", chName) );
258  canvas->setAxisTitles("drift time [ns]", "drift radius [mm]");
259  auto dataGraph = std::make_unique<TGraphErrors>();
260  for (const SamplePoint& dataPoint : rtPoints) {
261  dataGraph->SetPoint(dataGraph->GetN(), dataPoint.x1(), dataPoint.x2());
262  dataGraph->SetPointError(dataGraph->GetN()-1, 0., dataPoint.error());
263  canvas->expandPad(dataPoint.x1(), dataPoint.x2());
264  }
265 
267  auto rtGraph = std::make_unique<TGraph>();
268  auto trGraph = std::make_unique<TGraph>();
269 
270  double driftTime{inRel.rt()->tLower()};
271  while (driftTime <= inRel.rt()->tUpper()) {
272  const double radius = inRel.rt()->radius(driftTime);
273  const double backRadius = std::clamp(radius,inRel.tr()->minRadius(), inRel.tr()->maxRadius());
274  const double backTime = inRel.tr()->driftTime(backRadius).value_or(-666.);
275  rtGraph->SetPoint(rtGraph->GetN(), driftTime, radius);
276  trGraph->SetPoint(trGraph->GetN(), backTime, radius);
277  canvas->expandPad(driftTime, radius);
278  canvas->expandPad(backTime, radius);
279  driftTime+=1.;
280  }
281 
282  const unsigned rtNDoF= rtPoints.size() - inRel.rt()->nDoF();
283  const unsigned trNDoF= rtPoints.size() - inRel.tr()->nDoF();
284  const double rtChi2 = calculateChi2(rtPoints, *inRel.rt())/ rtNDoF;
285  const double trChi2 = calculateChi2(swapCoordinates(rtPoints, *inRel.rt()), *inRel.tr())/ trNDoF;
286 
287  auto legend = std::make_unique<TLegend>(0.2,0.7,0.6, 0.9,chName.c_str());
288  legend->SetFillStyle(0);
289  legend->SetBorderSize(0);
290  legend->AddEntry(rtGraph.get(),std::format("{:}, order: {:d}, #chi^{{2}}: {:.3f}({:d})",
291  inRel.rt()->name(), inRel.rt()->nDoF(), rtChi2, rtNDoF).c_str(),"L");
292 
293  legend->AddEntry(trGraph.get(),std::format("{:}, order: {:d}, #chi^{{2}}: {:.3f}({:d})",
294  inRel.tr()->name(), inRel.tr()->nDoF(), trChi2, trNDoF).c_str(),"L");
295 
296  dataGraph->SetMarkerSize(0);
297  rtGraph->SetLineColor(kRed);
298  trGraph->SetLineColor(kBlue);
299 
300  canvas->add(std::move(dataGraph), "P");
301  canvas->add(std::move(rtGraph), "C");
302  canvas->add(std::move(trGraph), "C");
303  canvas->add(std::move(legend));
304  }
305 
306  void MdtAnalyticRtCalibAlg::drawResoFunc(const EventContext& ctx,
307  const Identifier& detId,
308  const std::vector<SamplePoint>& resoPoints,
309  const IRtResolution& inReso) const{
310 
311  const std::string chName = std::format("{:}{:d}{:}{:d}M{:1d}",
312  m_idHelperSvc->stationNameString(detId),
313  std::abs(m_idHelperSvc->stationEta(detId)),
314  m_idHelperSvc->stationEta(detId)> 0? 'A' : 'C',
315  m_idHelperSvc->stationPhi(detId),
316  m_idHelperSvc->mdtIdHelper().multilayer(detId));
317 
318  auto canvas = m_visualSvc->prepareCanvas(ctx, m_clientToken, std::format("RtReso_{:}", chName) );
319  canvas->setAxisTitles("drift time [ns]", "#sigma(r_{drift}) [mm]");
320  auto dataGraph = std::make_unique<TGraphErrors>();
321  for (const SamplePoint& dataPoint : resoPoints) {
322  dataGraph->SetPoint(dataGraph->GetN(), dataPoint.x1(), dataPoint.x2());
323  dataGraph->SetPointError(dataGraph->GetN()-1, 0., dataPoint.error());
324  canvas->expandPad(dataPoint.x1(), dataPoint.x2());
325  }
326  auto resoGraph = std::make_unique<TGraph>();
327  const auto [tLow, tHigh] = interval(resoPoints);
328  const auto [resoLow, resoHigh] = minMax(resoPoints);
329  canvas->expandPad(tLow, resoLow);
330  canvas->expandPad(tHigh, resoHigh);
331  double driftTime{tLow};
332  while (driftTime <= tHigh) {
333  const double evalReso = inReso.resolution(driftTime);
334  resoGraph->SetPoint(resoGraph->GetN(), driftTime, evalReso);
335  driftTime+=0.5;
336  }
337  canvas->add(std::move(dataGraph), "P");
338  canvas->add(std::move(resoGraph), "C");
339 
340  const double chi2 = calculateChi2(resoPoints, inReso) / (resoPoints.size() - inReso.nDoF());
341  canvas->add(MuonValR4::drawLabel(std::format("{:}, {:}, order: {:1d} #chi^{{2}}: {:.3f}", chName, inReso.name(),
342  inReso.nDoF(), chi2), 0.2, 0.8));
343  }
344 }
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib::t0
float t0
< relative t0 in chamber (ns)
Definition: MdtTubeCalibContainer.h:21
MuonCalib::RtFromPoints::getTrChebyshev
static std::unique_ptr< ITrRelation > getTrChebyshev(const std::vector< SamplePoint > &dataPoints, const unsigned order)
Converts a list of r-t data points into a t(r) relation expressed as a series of chebychev polynomial...
Definition: RtFromPoints.cxx:82
GeoModel::TransientConstSharedPtr< MdtRtRelation >
MuonCalib::IRtResolution::resolution
virtual double resolution(double t, double bgRate=0.0) const =0
returns resolution for a give time and background rate
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
CalibParamSorter.h
vtune_athena.format
format
Definition: vtune_athena.py:14
SG::ReadCondHandle
Definition: ReadCondHandle.h:40
VisualizationHelpers.h
MuonCalib::fetchResolution
std::vector< SamplePoint > fetchResolution(const std::vector< SamplePoint > &points, const double uncert)
Creates a new vector of sample points where the x2 is assigned to the uncertainty and the uncertainty...
Definition: SamplePointUtils.cxx:50
MuonCalib::CalibParamSorter
Helper struct to group Mdt calibration constants which are equivalent within the target precision.
Definition: CalibParamSorter.h:12
MuonCalib::calculateChi2
double calculateChi2(const std::vector< SamplePoint > &dataPoints, const IRtRelation &rtRel)
Returns the chi2 of the rt-relation w.r.t.
Definition: SamplePointUtils.cxx:102
initialize
void initialize()
Definition: run_EoverP.cxx:894
MuonCalib::MdtFullCalibData::rtRelation
RtRelationPtr rtRelation
Definition: MdtFullCalibData.h:21
MuonCalib::interval
std::pair< double, double > interval(const std::vector< SamplePoint > &points)
Returns the interval covered by the sample points.
Definition: SamplePointUtils.cxx:94
MuonCalib::minMax
std::pair< double, double > minMax(const std::vector< SamplePoint > &points)
Returns the minimum & maximum values covered by the sample points.
Definition: SamplePointUtils.cxx:86
MuonCalib::ITrRelation::driftTime
virtual std::optional< double > driftTime(const double r) const =0
Interface method for fetching the drift-time from the radius Returns a nullopt if the time is out of ...
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
MuonCalib::MdtTubeCalibContainer::getCalib
const SingleTubeCalib * getCalib(const Identifier &tubeId) const
return calibration constants of a single tube
Definition: MdtTubeCalibContainer.h:35
MuonValR4::drawLabel
std::unique_ptr< TLatex > drawLabel(const std::string &text, const double xPos, const double yPos, const unsigned int fontSize=18)
Create a TLatex label,.
Definition: VisualizationHelpers.cxx:40
MuonCalib::MdtFullCalibData
class which holds the full set of calibration constants for a given tube
Definition: MdtFullCalibData.h:15
MuonCalib::MdtRtRelation
class which holds calibration constants per rt-region
Definition: MdtRtRelation.h:19
MuonCalib::MdtRtRelation::rtRes
const IRtResolution * rtRes() const
resolution
Definition: MdtRtRelation.h:24
ReadCondHandle.h
MuonCalib::MdtFullCalibData::corrections
CorrectionPtr corrections
Definition: MdtFullCalibData.h:20
LArG4FSStartPointFilterLegacy.execute
execute
Definition: LArG4FSStartPointFilterLegacy.py:20
MuonCalib::RtFromPoints::getResoChebyshev
static std::unique_ptr< IRtResolution > getResoChebyshev(const std::vector< SamplePoint > &dataPoints, const unsigned order)
Converts a list of reso - t into a reso(t) relation expressed as a series of chebychev polynomials.
Definition: RtFromPoints.cxx:85
MuonCalib::CalibFunc::name
virtual std::string name() const =0
MuonCalib::MdtFullCalibData::tubeCalib
TubeContainerPtr tubeCalib
Definition: MdtFullCalibData.h:22
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
TRT::Hit::driftTime
@ driftTime
Definition: HitInfo.h:43
MuonCalib::ITrRelation::maxRadius
virtual double maxRadius() const =0
Returns the maximum drift-radius.
MuonCalib::RtFromPoints::getRtChebyshev
static std::unique_ptr< IRtRelation > getRtChebyshev(const std::vector< SamplePoint > &dataPoints, const unsigned order)
Converts a list of r-t data points into a r(t) relation expressed as a series of chebychev polynomial...
Definition: RtFromPoints.cxx:79
Acts
Definition: MuonSpectrometer/MuonPhaseII/Event/xAOD/xAODMuonPrepData/xAODMuonPrepData/UtilFunctions.h:20
DeMoAtlasDataLoss.canvas
dictionary canvas
Definition: DeMoAtlasDataLoss.py:187
MuonCalib::RtFromPoints::getRtSimplePoly
static std::unique_ptr< IRtRelation > getRtSimplePoly(const std::vector< SamplePoint > &dataPoints, const unsigned order)
Converts a list of r(t) data points into a r(t) relation expressed as a series of elementary monomoni...
Definition: RtFromPoints.cxx:101
RtFromPoints.h
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
Muon::MuonStationIndex::chName
const std::string & chName(ChIndex index)
convert ChIndex into a string
Definition: MuonStationIndex.cxx:119
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
mc.order
order
Configure Herwig7.
Definition: mc.Herwig7_Dijet.py:12
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
MuonCalib::RtFromPoints::getTrSimplePoly
static std::unique_ptr< ITrRelation > getTrSimplePoly(const std::vector< SamplePoint > &dataPoints, const unsigned order)
Converts a list of t(r) data points into a t(r) relation expressed as a series of elementary monomoni...
Definition: RtFromPoints.cxx:104
WriteCondHandle.h
MdtAnalyticRtCalibAlg.h
MuonCalib::ITrRelation::minRadius
virtual double minRadius() const =0
Returns the minimum drift-radius.
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:525
MdtIdHelper
Definition: MdtIdHelper.h:61
MuonCalib
CscCalcPed - algorithm that finds the Cathode Strip Chamber pedestals from an RDO.
Definition: CscCalcPed.cxx:22
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonCalib::IRtRelation::tUpper
virtual double tUpper() const =0
Returns the upper time covered by the r-t.
MuonCalib::fetchDataPoints
std::vector< SamplePoint > fetchDataPoints(const IRtRelation &rtRel, const double relUnc)
Constructs a list of sample points from the rt-relation.
Definition: SamplePointUtils.cxx:19
MuonCalibR4
Definition: MdtAnalyticRtCalibAlg.cxx:25
MuonCalib::RtFromPoints::getTrLegendre
static std::unique_ptr< ITrRelation > getTrLegendre(const std::vector< SamplePoint > &dataPoints, const unsigned order)
Converts a list of t(r) data points into a t(r) relation expressed as a series of legendre polynomial...
Definition: RtFromPoints.cxx:98
MuonCalib::MdtRtRelation::tr
const ITrRelation * tr() const
t(r) relationship
Definition: MdtRtRelation.h:25
plotBeamSpotVxVal.legend
legend
Definition: plotBeamSpotVxVal.py:97
MuonCalib::IRtRelation::radius
virtual double radius(double t) const =0
returns drift radius for a given time
MuonCalib::SamplePoint
Definition: SamplePoint.h:15
MuonCalib::MdtRtRelation::smartReso
const IRtResolutionPtr & smartReso() const
Definition: MdtRtRelation.h:30
ParticleGun_SamplingFraction.radius
radius
Definition: ParticleGun_SamplingFraction.py:96
MuonCalib::MdtTubeCalibContainer::setCalib
bool setCalib(SingleTubeCalib val, const Identifier &tubeId, MsgStream &msg)
set the calibration constants of a single tube
Definition: MdtTubeCalibContainer.cxx:19
MuonCalib::IRtResolution
Generic interface to retrieve the resolution on the drift radius as a function of the drift time.
Definition: IRtResolution.h:20
MuonCalib::IRtRelation::tLower
virtual double tLower() const =0
Returns the lower time covered by the r-t.
MuonCalib::MdtRtRelation::rt
const IRtRelation * rt() const
rt relation
Definition: MdtRtRelation.h:23
MuonCalib::RtFromPoints::getRtLegendre
static std::unique_ptr< IRtRelation > getRtLegendre(const std::vector< SamplePoint > &dataPoints, const unsigned order)
Converts a list of r-t data points into a r(t) relation expressed as a series of legendre polynomials...
Definition: RtFromPoints.cxx:95
MuonCalib::ITrRelation::nDoF
virtual unsigned nDoF() const =0
Returns the number of degrees of freedom of the tr relation.
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
MuonCalib::swapCoordinates
std::vector< SamplePoint > swapCoordinates(const std::vector< SamplePoint > &points, const IRtRelation &rtRel)
Creates a new vector of samples points with x1 exchanged by x2 and vice-versa.
Definition: SamplePointUtils.cxx:61
SamplePointUtils.h
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib
Definition: MdtTubeCalibContainer.h:19
MuonCalib::IRtRelation::nDoF
virtual unsigned nDoF() const =0
Returns the number of degrees of freedom of the relation function
MuonCalib::IRtResolution::nDoF
virtual unsigned nDoF() const =0
Returns the number of degrees of freedom of the relation function
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
calibdata.tube
tube
Definition: calibdata.py:30
Identifier
Definition: IdentifierFieldParser.cxx:14