ATLAS Offline Software
Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
MdtCalibrationTool Class Reference

#include <MdtCalibrationTool.h>

Inheritance diagram for MdtCalibrationTool:
Collaboration diagram for MdtCalibrationTool:

Public Types

using CorrectionPtr = MuonCalib::MdtFullCalibData::CorrectionPtr
 
using RtRelationPtr = MuonCalib::MdtFullCalibData::RtRelationPtr
 
using TubeContainerPtr = MuonCalib::MdtFullCalibData::TubeContainerPtr
 

Public Member Functions

 MdtCalibrationTool (const std::string &type, const std::string &name, const IInterface *parent)
 constructor More...
 
virtual ~MdtCalibrationTool ()=default
 destructor More...
 
virtual StatusCode initialize () override final
 initialization More...
 
virtual MdtCalibOutput calibrate (const EventContext &ctx, const MdtCalibInput &hit, bool resolFromRtrack=false) const override final
 Convert the raw MDT time (+charge) into a drift radius + error. More...
 
virtual MdtCalibTwinOutput calibrateTwinTubes (const EventContext &ctx, const MdtCalibInput &hit, const MdtCalibInput &twinHit) const override final
 Convert the raw MDT times of two twin hits into a Twin position (coordinate along tube) It returns whether the conversion was successful. More...
 
virtual double getResolutionFromRt (const EventContext &ctx, const Identifier &module, const double time) const override final
 
virtual ToolSettings getSettings () const override final
 

Private Member Functions

Muon::MdtDriftCircleStatus driftTimeStatus (double driftTime, const MuonCalib::MdtRtRelation &rtRelation) const
 

Private Attributes

Gaudi::Property< int > m_windowSetting {this, "TimeWindowSetting", timeWindowMode::Default}
 
Gaudi::Property< double > m_timeWindowLowerBound {this, "TimeWindowLowerBound", 0.}
 
Gaudi::Property< double > m_timeWindowUpperBound {this, "TimeWindowUpperBound", 0.}
 
Gaudi::Property< bool > m_doTof {this, "DoTofCorrection", true}
 
Gaudi::Property< bool > m_doProp {this, "DoPropagationCorrection", true}
 
Gaudi::Property< bool > m_doTemp {this, "DoTemperatureCorrection", false}
 
Gaudi::Property< bool > m_doField {this,"DoMagneticFieldCorrection", false}
 
Gaudi::Property< bool > m_doWireSag {this, "DoWireSagCorrection", false}
 
Gaudi::Property< bool > m_doSlew {this, "DoSlewingCorrection", false}
 
Gaudi::Property< bool > m_doBkg {this, "DoBackgroundCorrection", false}
 
ToolHandle< MuonCalib::IShiftMapToolsm_t0ShiftTool {this, "T0ShiftTool", ""}
 
ToolHandle< MuonCalib::IShiftMapToolsm_tMaxShiftTool {this, "TShiftMaxTool", ""}
 
Gaudi::Property< bool > m_doT0Shift {this, "DoT0Shift", false}
 
Gaudi::Property< bool > m_doTMaxShift {this, "DoTMaxShift", false}
 
Gaudi::Property< double > m_unphysicalHitRadiusUpperBound {this, "UpperBoundHitRadius", 20.}
 
Gaudi::Property< double > m_unphysicalHitRadiusLowerBound {this, "LowerBoundHitRadius" , 0.}
 
Gaudi::Property< double > m_resTwin {this, "ResolutionTwinTube" , 1.05, "Twin tube resolution"}
 
SG::ReadCondHandleKey< MuonCalib::MdtCalibDataContainerm_calibDbKey
 
SG::ReadCondHandleKey< AtlasFieldCacheCondObjm_fieldCacheCondObjInputKey
 
ServiceHandle< Muon::IMuonIdHelperSvcm_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
 

Detailed Description

the Mdt Calib Service provides, on request, the drift radius and its error, computed applying the proper calibration, for any hit in Mdt chambers

Author
Martin Woudstra, Niels van Eldik

Definition at line 35 of file MdtCalibrationTool.h.

Member Typedef Documentation

◆ CorrectionPtr

Definition at line 39 of file MdtCalibrationTool.h.

◆ RtRelationPtr

Definition at line 40 of file MdtCalibrationTool.h.

◆ TubeContainerPtr

Definition at line 41 of file MdtCalibrationTool.h.

Constructor & Destructor Documentation

◆ MdtCalibrationTool()

MdtCalibrationTool::MdtCalibrationTool ( const std::string &  type,
const std::string &  name,
const IInterface *  parent 
)

constructor

Definition at line 33 of file MdtCalibrationTool.cxx.

33  :
34  base_class(type, name, parent) {}

◆ ~MdtCalibrationTool()

virtual MdtCalibrationTool::~MdtCalibrationTool ( )
virtualdefault

destructor

Member Function Documentation

◆ calibrate()

MdtCalibOutput MdtCalibrationTool::calibrate ( const EventContext &  ctx,
const MdtCalibInput hit,
bool  resolFromRtrack = false 
) const
finaloverridevirtual

Convert the raw MDT time (+charge) into a drift radius + error.

It returns whether the conversion was successful.

Parameters
[in,out]hitHit must have pointer set to the MdtDigit, as well as the global hit position (including the position along the tube!)
[in]signedTracklengththe track length from the 'triggerpoint' to the hit. It is used for the time-of-flight correction. This triggerpoint is the I.P. for ATLAS p-p collisions, typically scintillators in test-beam and cosmic teststands, and not clear yet what is it is for cosmics in ATLAS. The sign is for determining the sign of the time-of-flight correction. If a muon first passes the triggerpoint, and then the MDT tube, the sign should be positive (the case for ATLAS p-p and H8 test-beam). If a muon first passes the MDT tube, and then de triggerpoint, the sign should be negative (typically the case for cosmic-ray teststands).
[in]triggerTimethe time of the 'triggerpoint' in ns. This is the time (measured with the same clock as the MDT TDC's) when the muon passed a known point in space: the 'triggerpoint'. For ATLAS this is 0.0 since the TDC's are synchonised w.r.t. the bunch-crossings. For H8 test-beam it is the trigger time, which is time when the muon passed the trigger scintillators. For cosmic-ray teststands it is usually also the time when the muon passed the trigger scintillators. For cosmics in ATLAS it is not clear yet.
[in]resolFromRtrackindicates the method to provide the resolution as a function of the distance of the reconstructed track from the anode wire instead of the drift radius

Get the calibration constatns from the conditions store

Retrieve the constants for the specific tube

calculate drift time

slewing corrections

Wire sag corrections

Retrieve the center of the sagged surface in global coordinates

Calculate the sagging as the difference of the point of closest approach to the sagged center surface

now check whether we are outside the time window

Definition at line 102 of file MdtCalibrationTool.cxx.

104  {
105 
106  const MdtIdHelper& id_helper{m_idHelperSvc->mdtIdHelper()};
109  if (!readCondHandle.isValid()){
110  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Failed to retrieve the Mdt calibration constants "<<m_calibDbKey.fullKey());
111  throw std::runtime_error("No calibration constants could be retrieved");
112  }
113 
114  const Identifier& id{calibIn.identify()};
115 
116  const MuonCalib::MdtFullCalibData* calibConstants = readCondHandle->getCalibData(id, msgStream());
117  if (!calibConstants) {
118  ATH_MSG_WARNING("Could not find calibration data for channel "<<m_idHelperSvc->toString(id));
119  return MdtCalibOutput{};
120  }
121 
122  // require at least the MdtRtRelation to be available
123  const RtRelationPtr& rtRelation{calibConstants->rtRelation};
124  // Hardcoded MDT tube radius 14.6mm here - not correct for sMDT
125  // on the other hand it should be rare that a tube does not have an RT
126  if(!rtRelation) {
127  ATH_MSG_WARNING("No rtRelation found, cannot calibrate tube "<<m_idHelperSvc->toString(id));
128  return MdtCalibOutput{};
129  }
130  if (!calibConstants->tubeCalib) {
131  ATH_MSG_WARNING("Cannot extract the single tube calibrations for tube "<<m_idHelperSvc->toString(id));
132  return MdtCalibOutput{};
133  }
135  const SingleTubeCalib* singleTubeData = calibConstants->tubeCalib->getCalib(id);
136  if (!singleTubeData) {
137  ATH_MSG_WARNING("Failed to access tubedata for " << m_idHelperSvc->toString(id));
138  return MdtCalibOutput{};
139  }
140 
141  MdtCalibOutput calibResult{};
142  // correct for global t0 of rt-region
143 
144  calibResult.setTubeT0(singleTubeData->t0 + rtRelation->t0Global());
145  calibResult.setMeanAdc(singleTubeData->adcCal);
146 
147  // set propagation delay
148  if (m_doProp) {
149  const double propagationDistance = calibIn.signalPropagationDistance();
150  calibResult.setPropagationTime(singleTubeData->inversePropSpeed * propagationDistance);
151  }
152 
154  const double driftTime = calibIn.tdc() * tdcBinSize
155  - (m_doTof ? calibIn.timeOfFlight() : 0.)
156  - calibIn.triggerTime()
157  - calibResult.tubeT0()
158  - calibResult.signalPropagationTime();
159 
160  calibResult.setDriftTime(driftTime);
161  // apply corrections
162  double corrTime{0.};
163  const bool doCorrections = m_doField || m_doTemp || m_doBkg || m_doWireSag;
164  if (doCorrections) {
165  const CorrectionPtr& corrections{calibConstants->corrections};
166  const RtRelationPtr& rtRelation{calibConstants->rtRelation};
167  const MuonCalib::IRtRelation* rt = rtRelation->rt();
168  ATH_MSG_VERBOSE("There are correction functions.");
170  if (m_doSlew && corrections->slewing()) {
171  double slewTime=corrections->slewing()->correction(calibResult.driftTime(), calibIn.adc());
172  corrTime -= slewTime;
173  calibResult.setSlewingTime(slewTime);
174  }
175 
176 
177  if (m_doField && corrections->bField()) {
178  MagField::AtlasFieldCache fieldCache{};
179 
181  if (!readHandle.isValid()) {
182  ATH_MSG_FATAL("calibrate: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCacheCondObjInputKey.key());
183  throw std::runtime_error("No magnetic field could be retrieved");
184  }
185  readHandle->getInitializedCache(fieldCache);
186 
188  fieldCache.getField(calibIn.closestApproach().data(), globalB.data());
189  const Amg::Vector2D locBField = calibIn.projectMagneticField(globalB);
190  using BFieldComp = MdtCalibInput::BFieldComp;
191  calibResult.setLorentzTime(corrections->bField()->correction(calibResult.driftTime(),
192  locBField[BFieldComp::alongWire],
193  locBField[BFieldComp::alongTrack]));
194  corrTime -= calibResult.lorentzTime();
195  }
196  if(m_doTemp && rt && rt->HasTmaxDiff()) {
197  const int mL = id_helper.multilayer(id);
198  const double tempTime = MuonCalib::RtScaleFunction(calibResult.driftTime(),
199  mL == 2,
200  *rt);
201  calibResult.setTemperatureTime(tempTime);
202  corrTime-=calibResult.temperatureTime();
203  }
204  // background corrections (I guess this is never active)
205  if (m_doBkg && corrections->background()) {
206  double bgLevel{0.};
207  calibResult.setBackgroundTime(corrections->background()->correction(calibResult.driftTime(), bgLevel ));
208  corrTime += calibResult.backgroundTime();
209  }
211  if (m_doWireSag && corrections->wireSag()) {
213  const Amg::Vector3D& saggedSurfPos{calibIn.saggedSurfCenter()};
214  const Amg::Vector3D& nominalSurfPos{calibIn.surfaceCenter()};
217  const double deltaY = calibIn.closestApproach().y() - saggedSurfPos.y();
218 
219  // sign of drift radius (for sag calculation) is +/- of track passes
220  // above/below wire
221  const double signedDriftRadius = deltaY*(std::abs(calibResult.driftRadius()/deltaY));
222 
223  // calculate the magnitude of the wire sag
224  double effectiveSag = nominalSurfPos.y()
225  - saggedSurfPos.y();
226 
227  calibResult.setSaggingTime(corrections->wireSag()->correction(signedDriftRadius, effectiveSag));
228  // apply the correction
229  corrTime += calibResult.saggingTime();
230  }
231  }
232 
233  calibResult.setDriftTime(calibResult.driftTime() + corrTime);
234 
235  // calculate drift radius + error
236  double r{0.}, reso{0.};
237  double t = calibResult.driftTime();
238  double t_inrange = t;
239  Muon::MdtDriftCircleStatus timeStatus = driftTimeStatus(t, *rtRelation);
240  if(rtRelation->rt()) {
241  r = rtRelation->rt()->radius(t);
242  // apply tUpper gshift
243  if (m_doTMaxShift) {
244  float tShift = m_tMaxShiftTool->getValue(id);
245  r = rtRelation->rt()->radius( t * (1 + tShift) );
246  }
247  // check whether drift times are within range, if not fix them to the min/max range
248  if ( t < rtRelation->rt()->tLower() ) {
249  t_inrange = rtRelation->rt()->tLower();
250  double rmin = rtRelation->rt()->radius( t_inrange );
251  double drdt = (rtRelation->rt()->radius( t_inrange + 30. ) - rmin)/30.;
252 
254  if (timeStatus == Muon::MdtStatusBeforeSpectrum) {
255  t = rtRelation->rt()->tLower() - m_timeWindowLowerBound;
256  }
257  // if we get here we are outside the rt range but inside the window.
258  r = std::max(rmin + drdt*(t-t_inrange), m_unphysicalHitRadiusLowerBound.value());
259  } else if( t > rtRelation->rt()->tUpper() ) {
260  t_inrange = rtRelation->rt()->tUpper();
261  double rmax = rtRelation->rt()->radius( t_inrange );
262  double drdt = (rmax - rtRelation->rt()->radius( t_inrange - 30. ))/30.;
263 
264  // now check whether we are outside the time window
265  if ( timeStatus == Muon::MdtStatusAfterSpectrum ) {
266  t = rtRelation->rt()->tUpper() + m_timeWindowUpperBound;
267  }
268  // if we get here we are outside the rt range but inside the window.
269  r = rmax + drdt*(t-t_inrange);
270  }
271  } else {
272  ATH_MSG_WARNING( "no rt found" );
273  return calibResult;
274  }
275 
276  if (rtRelation->rtRes()) {
277  if (!resolFromRtrack) {
278  reso = rtRelation->rtRes()->resolution( t_inrange );
279  } else {
280  bool boundFlag{false};
281  const double tFromR = rtRelation->tr()->tFromR(std::abs(calibIn.distanceToTrack()),
282  boundFlag);
283  reso = rtRelation->rtRes()->resolution(tFromR);
284  }
285  } else {
286  ATH_MSG_WARNING( "no rtRes found" );
287  return calibResult;
288  }
289  calibResult.setDriftRadius(r, reso);
290  calibResult.setStatus(timeStatus);
291  // summary
292  ATH_MSG_VERBOSE( "Calibration for tube " << m_idHelperSvc->toString(id)
293  <<" passed. "<<std::endl<<"Input: "<<calibIn<<std::endl<<"Extracted calib constants: "<<calibResult<<std::endl);
294  return calibResult;
295 } //end MdtCalibrationTool::calibrate

◆ calibrateTwinTubes()

MdtCalibTwinOutput MdtCalibrationTool::calibrateTwinTubes ( const EventContext &  ctx,
const MdtCalibInput hit,
const MdtCalibInput twinHit 
) const
finaloverridevirtual

Convert the raw MDT times of two twin hits into a Twin position (coordinate along tube) It returns whether the conversion was successful.

Get the calibration constatns from the conditions store

Put twin hit always inside acceptance

Definition at line 297 of file MdtCalibrationTool.cxx.

299  {
300 
301  MdtCalibOutput primResult = calibrate(ctx, primHit);
302  MdtCalibOutput twinResult = calibrate(ctx, twinHit);
303 
304  // get Identifier and MdtReadOutElement for twin tubes
305  const Identifier& primId = primHit.identify();
306  const Identifier& twinId = twinHit.identify();
307  // get 'raw' drifttimes of twin pair; we don't use timeofFlight or propagationTime cause they are irrelevant for twin coordinate
308  double primdriftTime = primHit.tdc()*tdcBinSize - primResult.tubeT0();
309  double twinDriftTime = twinHit.tdc()*tdcBinSize - twinResult.tubeT0();
310 
313  if (!calibDataContainer.isValid()){
314  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Failed to retrieve the Mdt calibration constants "<<m_calibDbKey.fullKey());
315  throw std::runtime_error("No calibration constants could be retrieved");
316  }
317  // get calibration constants from DbTool
318  const MuonCalib::MdtFullCalibData* data1st = calibDataContainer->getCalibData(primId, msgStream());
319  const MuonCalib::MdtFullCalibData* data2nd = calibDataContainer->getCalibData(twinId, msgStream());
320  if (!data1st || !data2nd) {
321  ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<" Failed to access calibration constants for tubes "<<
322  m_idHelperSvc->toString(primId)<<" & "<<m_idHelperSvc->toString(twinId));
323  return MdtCalibTwinOutput{};
324  }
325  const SingleTubeCalib* calibSingleTube1st = data1st->tubeCalib->getCalib(primId);
326  const SingleTubeCalib* calibSingleTube2nd = data2nd->tubeCalib->getCalib(twinId);
327  if (!calibSingleTube1st || !calibSingleTube2nd) {
328  ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<" Failed to access calibration constants for tubes "<<
329  m_idHelperSvc->toString(primId)<<" & "<<m_idHelperSvc->toString(twinId));
330  return MdtCalibTwinOutput{};
331  }
332 
333  const double invPropSpeed1st{calibSingleTube1st->inversePropSpeed};
334  const double invPropSpeed2nd{calibSingleTube2nd->inversePropSpeed};
335 
336  // define twin position and error
337  double zTwin{0.}, errZTwin{0.}, twin_timedif{0.};
338  // find out which tube was the prompt
339  // (= actually hit by the muon; not hit by the muon = twinhit_)
340  // in the formula for z_hit_from_twin we take as convention that
341  // twindif = twin_time - prompt_time
342  int prompthit_tdc{0}, twinhit_tdc{0};
343  bool firstIsPrompt{true};
344  if ( primdriftTime < twinDriftTime) {
345  twin_timedif = twinDriftTime - primdriftTime;
346  } else {
347  twin_timedif = primdriftTime - twinDriftTime;
348  firstIsPrompt = false;
349  }
350 
351  // get tubelength and set HV-delay (~6ns)
352  const MdtCalibInput& primaryHit{(firstIsPrompt ? primHit : twinHit)};
353  const double tubelength = primaryHit.tubeLength();
354  constexpr double HVdelay = 6.;
355 
356  // twin_timedif must be between min and max of possible time-difference
357  // between prompt and twin signals
358  // accounting for 5 std.dev. of twin time resolution
359  if ( twin_timedif < (HVdelay - 5.*m_resTwin) ||
360  twin_timedif > (tubelength*(invPropSpeed1st + invPropSpeed2nd)
361  + HVdelay + 5.*m_resTwin)){
362  ATH_MSG_DEBUG( " TIME DIFFERENCE OF TWIN PAIR OUT OF RANGE("
363  << (HVdelay - 5.*m_resTwin)<< "-"
364  << (tubelength*(invPropSpeed1st + invPropSpeed2nd) + HVdelay + 5.*m_resTwin)
365  << ") time difference = " << twin_timedif );
366 
367  }
368 
369  // Make ONLY a twin PrepData if twin time difference is physical (within tubelength)
370  if (twin_timedif < (tubelength* (invPropSpeed1st + invPropSpeed2nd)
371  + HVdelay + 10.*m_resTwin)){
372 
373  //calculate local(!) z of the hit from twin tubes information
374  double z_hit_sign_from_twin = ( 1 / (invPropSpeed2nd *2.)) *
375  (tubelength*invPropSpeed2nd -
376  twin_timedif + HVdelay) ;
378  if (z_hit_sign_from_twin < -tubelength/2.) {
379  ATH_MSG_DEBUG( " TWIN HIT outside acceptance with time difference "
380  << twin_timedif
381  << " Z local hit " << z_hit_sign_from_twin
382  << " Z local minimum " << -tubelength/2 );
383  z_hit_sign_from_twin = - tubelength/2.;
384  }
385  // do sign management just like in MdtDigitizationTool.cxx
386  const double z_hit_geo_from_twin = primaryHit.readOutSide() *z_hit_sign_from_twin;
387 
388  zTwin = z_hit_geo_from_twin;
389  errZTwin = m_resTwin*invPropSpeed1st;
390 
391  ATH_MSG_VERBOSE( " TWIN TUBE "
392  << " tube: " << m_idHelperSvc->toString(primId)
393  << " twintube: " << m_idHelperSvc->toString(twinId)<<endmsg
394  << " prompthit tdc = " << prompthit_tdc//*TDCbinsize
395  << " twinhit tdc = " << twinhit_tdc// *TDCbinsize
396  << " tube driftTime = " << primResult
397  << " second tube driftTime = " << twinResult
398  << " TWIN PAIR time difference = " << twin_timedif << endmsg
399  << " z_hit_sign_from_twin = " << z_hit_sign_from_twin
400  << " z_hit_geo_from_twin = " << z_hit_geo_from_twin);
401 
402  } // end if(twin_timedif < (tubelength*inversePropSpeed + tubelength*inversePropSpeedSecond + HVdelay + 10.*m_resTwin)){
403  else {
404  ATH_MSG_VERBOSE( " TIME DIFFERENCE OF TWIN PAIR UNPHYSICAL OUT OF RANGE("
405  << (HVdelay - 5*m_resTwin) << "-"
406  << (2*tubelength*invPropSpeed1st + HVdelay + 5*m_resTwin)
407  << ") time difference = "
408  << twin_timedif );
409  zTwin = 0.;
410  errZTwin = tubelength/2.;
411  }
412 
413  MdtCalibTwinOutput calibResult{(firstIsPrompt ? primHit : twinHit),
414  (firstIsPrompt ? twinHit : primHit),
415  (firstIsPrompt ? primResult : twinResult),
416  (firstIsPrompt ? twinResult : primResult)};
417 
418 
419  calibResult.setLocZ(zTwin, errZTwin);
420  return calibResult;
421 }

◆ driftTimeStatus()

Muon::MdtDriftCircleStatus MdtCalibrationTool::driftTimeStatus ( double  driftTime,
const MuonCalib::MdtRtRelation rtRelation 
) const
private

Definition at line 423 of file MdtCalibrationTool.cxx.

424  {
425  if (rtRelation.rt()) {
426  if(driftTime < rtRelation.rt()->tLower() - m_timeWindowLowerBound) {
427  ATH_MSG_VERBOSE( " drift time outside time window "
428  << driftTime << ". Mininum time = "
429  << rtRelation.rt()->tLower() - m_timeWindowLowerBound );
431  } else if (driftTime > rtRelation.rt()->tUpper() + m_timeWindowUpperBound) {
432  ATH_MSG_VERBOSE( " drift time outside time window "
433  << driftTime << ". Maximum time = "
434  << rtRelation.rt()->tUpper() + m_timeWindowUpperBound);
436  }
437  } else {
438  ATH_MSG_WARNING( "No valid rt relation supplied for driftTimeStatus method" );
440  }
442 }

◆ getResolutionFromRt()

double MdtCalibrationTool::getResolutionFromRt ( const EventContext &  ctx,
const Identifier module,
const double  time 
) const
finaloverridevirtual

Definition at line 443 of file MdtCalibrationTool.cxx.

443  {
444 
446  if (!calibConstants.isValid()) {
447  ATH_MSG_FATAL("Failed to retrieve the calibration constants "<<m_calibDbKey.fullKey());
448  throw std::runtime_error("Where are my Mdt calibration constants");
449  }
450  const MuonCalib::MdtFullCalibData* moduleConstants = calibConstants->getCalibData(moduleID, msgStream());
451  if (!moduleConstants){
452  ATH_MSG_FATAL("Failed to retrieve set of calibration constants for "<<m_idHelperSvc->toString(moduleID));
453  throw std::runtime_error("No constants for calib container");
454  }
455  const RtRelationPtr& rtRel{moduleConstants->rtRelation};
456  if (!rtRel) {
457  ATH_MSG_FATAL("No rt-relation found for "<<m_idHelperSvc->toString(moduleID));
458  throw std::runtime_error("No rt relation ");
459  }
460  const double t = std::min(std::max(time, rtRel->rt()->tLower()), rtRel->rt()->tUpper());
461  return rtRel->rtRes()->resolution(t);
462 }

◆ getSettings()

ToolSettings MdtCalibrationTool::getSettings ( ) const
finaloverridevirtual

Definition at line 36 of file MdtCalibrationTool.cxx.

36  {
37  ToolSettings settings{};
38  using Property = ToolSettings::Property;
39  settings.setBit(Property::TofCorrection, m_doTof);
40  settings.setBit(Property::PropCorrection, m_doProp);
41  settings.setBit(Property::TempCorrection, m_doTemp);
42  settings.setBit(Property::MagFieldCorrection, m_doField);
43  settings.setBit(Property::WireSagTimeCorrection, m_doWireSag);
44  settings.setBit(Property::SlewCorrection, m_doSlew);
45  settings.setBit(Property::BackgroundCorrection, m_doBkg);
46  settings.window = static_cast<timeWindowMode>(m_windowSetting.value());
47  return settings;
48 }

◆ initialize()

StatusCode MdtCalibrationTool::initialize ( )
finaloverridevirtual

initialization

Ensure that the conditions dependency is properly declared

Shifting tools to evaluate systematic uncertainties on the T0 timing

Definition at line 49 of file MdtCalibrationTool.cxx.

49  {
50  ATH_MSG_DEBUG( "Initializing" );
51 
52  switch(m_windowSetting.value()) {
53  case timeWindowMode::UserDefined:
54  ATH_MSG_DEBUG("Use predefined user values of "<<m_timeWindowLowerBound<<" & "<<m_timeWindowUpperBound);
55  break;
57  ATH_MSG_DEBUG("Use 1000. & 2000. as the lower and upper time window values ");
58  m_timeWindowLowerBound = 1000.;
59  m_timeWindowUpperBound = 2000.;
60  break;
61  case timeWindowMode::CollisionG4:
62  ATH_MSG_DEBUG("Use Geant4 collision time window of 20-30");
65  break;
66  case timeWindowMode::CollisionData:
67  ATH_MSG_DEBUG("Use collision data time window of 10 to 30");
70  break;
71  case timeWindowMode::CollisionFitT0:
72  ATH_MSG_DEBUG("Use collision data time window of 50 to 100 to fit T0 in the end");
75  break;
76  default:
77  ATH_MSG_FATAL("Unknown time window setting "<<m_windowSetting<<" provided.");
78  return StatusCode::FAILURE;
79  };
80 
81  ATH_CHECK(m_idHelperSvc.retrieve());
86  ATH_CHECK(m_t0ShiftTool.retrieve(EnableTool{m_doT0Shift}));
87  ATH_CHECK(m_tMaxShiftTool.retrieve(EnableTool{m_doTMaxShift}));
88  ATH_MSG_DEBUG("Initialization finalized "<<std::endl
89  <<" TimeWindow: ["<< m_timeWindowLowerBound.value()<<";"<<m_timeWindowUpperBound.value()<<"]"<<std::endl
90  <<" Correct time of flight "<<(m_doTof ? "yay" : "nay")<<std::endl
91  <<" Correct propagation time "<<(m_doProp ? "si" : "no")<<std::endl
92  <<" Correct temperature "<<(m_doTemp ? "si" : "no")<<std::endl
93  <<" Correct magnetic field "<<(m_doField ? "si" : "no")<<std::endl
94  <<" Correct wire sagging "<<(m_doWireSag ? "si" : "no")<<std::endl
95  <<" Correct time slew "<<(m_doSlew ? "si" : "no")<<std::endl
96  <<" Correct background "<<(m_doBkg ? "si" : "no"));
97  return StatusCode::SUCCESS;
98 } //end MdtCalibrationTool::initialize

Member Data Documentation

◆ m_calibDbKey

SG::ReadCondHandleKey<MuonCalib::MdtCalibDataContainer> MdtCalibrationTool::m_calibDbKey
private
Initial value:
{this, "CalibDataKey", "MdtCalibConstants",
"Conditions object containing the calibrations"}

Definition at line 123 of file MdtCalibrationTool.h.

◆ m_doBkg

Gaudi::Property<bool> MdtCalibrationTool::m_doBkg {this, "DoBackgroundCorrection", false}
private

Definition at line 107 of file MdtCalibrationTool.h.

◆ m_doField

Gaudi::Property<bool> MdtCalibrationTool::m_doField {this,"DoMagneticFieldCorrection", false}
private

Definition at line 104 of file MdtCalibrationTool.h.

◆ m_doProp

Gaudi::Property<bool> MdtCalibrationTool::m_doProp {this, "DoPropagationCorrection", true}
private

Definition at line 102 of file MdtCalibrationTool.h.

◆ m_doSlew

Gaudi::Property<bool> MdtCalibrationTool::m_doSlew {this, "DoSlewingCorrection", false}
private

Definition at line 106 of file MdtCalibrationTool.h.

◆ m_doT0Shift

Gaudi::Property<bool> MdtCalibrationTool::m_doT0Shift {this, "DoT0Shift", false}
private

Definition at line 115 of file MdtCalibrationTool.h.

◆ m_doTemp

Gaudi::Property<bool> MdtCalibrationTool::m_doTemp {this, "DoTemperatureCorrection", false}
private

Definition at line 103 of file MdtCalibrationTool.h.

◆ m_doTMaxShift

Gaudi::Property<bool> MdtCalibrationTool::m_doTMaxShift {this, "DoTMaxShift", false}
private

Definition at line 116 of file MdtCalibrationTool.h.

◆ m_doTof

Gaudi::Property<bool> MdtCalibrationTool::m_doTof {this, "DoTofCorrection", true}
private

Definition at line 101 of file MdtCalibrationTool.h.

◆ m_doWireSag

Gaudi::Property<bool> MdtCalibrationTool::m_doWireSag {this, "DoWireSagCorrection", false}
private

Definition at line 105 of file MdtCalibrationTool.h.

◆ m_fieldCacheCondObjInputKey

SG::ReadCondHandleKey<AtlasFieldCacheCondObj> MdtCalibrationTool::m_fieldCacheCondObjInputKey
private
Initial value:
{this, "AtlasFieldCacheCondObj", "fieldCondObj",
"Name of the Magnetic Field conditions object key"}

Definition at line 130 of file MdtCalibrationTool.h.

◆ m_idHelperSvc

ServiceHandle<Muon::IMuonIdHelperSvc> MdtCalibrationTool::m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
private

Definition at line 132 of file MdtCalibrationTool.h.

◆ m_resTwin

Gaudi::Property<double> MdtCalibrationTool::m_resTwin {this, "ResolutionTwinTube" , 1.05, "Twin tube resolution"}
private

Definition at line 120 of file MdtCalibrationTool.h.

◆ m_t0ShiftTool

ToolHandle<MuonCalib::IShiftMapTools> MdtCalibrationTool::m_t0ShiftTool {this, "T0ShiftTool", ""}
private

Definition at line 110 of file MdtCalibrationTool.h.

◆ m_timeWindowLowerBound

Gaudi::Property<double> MdtCalibrationTool::m_timeWindowLowerBound {this, "TimeWindowLowerBound", 0.}
private

Definition at line 99 of file MdtCalibrationTool.h.

◆ m_timeWindowUpperBound

Gaudi::Property<double> MdtCalibrationTool::m_timeWindowUpperBound {this, "TimeWindowUpperBound", 0.}
private

Definition at line 100 of file MdtCalibrationTool.h.

◆ m_tMaxShiftTool

ToolHandle<MuonCalib::IShiftMapTools> MdtCalibrationTool::m_tMaxShiftTool {this, "TShiftMaxTool", ""}
private

Definition at line 112 of file MdtCalibrationTool.h.

◆ m_unphysicalHitRadiusLowerBound

Gaudi::Property<double> MdtCalibrationTool::m_unphysicalHitRadiusLowerBound {this, "LowerBoundHitRadius" , 0.}
private

Definition at line 119 of file MdtCalibrationTool.h.

◆ m_unphysicalHitRadiusUpperBound

Gaudi::Property<double> MdtCalibrationTool::m_unphysicalHitRadiusUpperBound {this, "UpperBoundHitRadius", 20.}
private

Definition at line 118 of file MdtCalibrationTool.h.

◆ m_windowSetting

Gaudi::Property<int> MdtCalibrationTool::m_windowSetting {this, "TimeWindowSetting", timeWindowMode::Default}
private

Definition at line 98 of file MdtCalibrationTool.h.


The documentation for this class was generated from the following files:
MdtCalibInput::tdc
int tdc() const
Returns the tdc counts of the hit.
Definition: MdtCalibInput.cxx:63
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib::t0
float t0
< relative t0 in chamber (ns)
Definition: MdtTubeCalibContainer.h:20
beamspotman.r
def r
Definition: beamspotman.py:676
MdtCalibrationTool::calibrate
virtual MdtCalibOutput calibrate(const EventContext &ctx, const MdtCalibInput &hit, bool resolFromRtrack=false) const override final
Convert the raw MDT time (+charge) into a drift radius + error.
Definition: MdtCalibrationTool.cxx:102
GeoModel::TransientConstSharedPtr< MdtCorFuncSet >
MCP::SystVariation::Default
@ Default
Definition: EnumDef.h:72
MdtCalibrationTool::m_doWireSag
Gaudi::Property< bool > m_doWireSag
Definition: MdtCalibrationTool.h:105
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
MuonCalib::IRtRelation::tUpper
virtual double tUpper(void) const =0
max
#define max(a, b)
Definition: cfImp.cxx:41
MdtCalibInput::BFieldComp
BFieldComp
Definition: MdtCalibInput.h:86
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
MdtCalibInput
Definition: MdtCalibInput.h:27
makeComparison.deltaY
int deltaY
Definition: makeComparison.py:44
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
TRT::Hit::signedDriftRadius
@ signedDriftRadius
Definition: HitInfo.h:40
MuonCalib::IRtRelation::HasTmaxDiff
bool HasTmaxDiff() const
Definition: IRtRelation.h:29
MuonCalib::MdtFullCalibData::rtRelation
RtRelationPtr rtRelation
Definition: MdtFullCalibData.h:21
MdtCalibrationTool::m_doTof
Gaudi::Property< bool > m_doTof
Definition: MdtCalibrationTool.h:101
Muon::MdtStatusAfterSpectrum
@ MdtStatusAfterSpectrum
The tube produced a hit that is inconsistent with the drift time spectrum, the drift time is larger t...
Definition: MdtDriftCircleStatus.h:40
Muon::MdtDriftCircleStatus
MdtDriftCircleStatus
Enum to represent the 'status' of Mdt measurements e.g.
Definition: MdtDriftCircleStatus.h:25
MdtCalibrationTool::m_doBkg
Gaudi::Property< bool > m_doBkg
Definition: MdtCalibrationTool.h:107
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
MdtCalibrationTool::m_tMaxShiftTool
ToolHandle< MuonCalib::IShiftMapTools > m_tMaxShiftTool
Definition: MdtCalibrationTool.h:112
Property
Support class for PropertyMgr.
Definition: Property.h:23
MuonCalib::MdtFullCalibData
class which holds the full set of calibration constants for a given tube
Definition: MdtFullCalibData.h:15
Muon::MdtStatusDriftTime
@ MdtStatusDriftTime
The tube produced a vaild measurement.
Definition: MdtDriftCircleStatus.h:34
MdtCalibrationTool::m_timeWindowUpperBound
Gaudi::Property< double > m_timeWindowUpperBound
Definition: MdtCalibrationTool.h:100
MdtCalibInput::identify
const Identifier & identify() const
Returns the Identifier of the hit.
Definition: MdtCalibInput.cxx:62
MuonCalib::MdtFullCalibData::corrections
CorrectionPtr corrections
Definition: MdtFullCalibData.h:20
MdtCalibrationTool::m_fieldCacheCondObjInputKey
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
Definition: MdtCalibrationTool.h:130
MuonCalib::MdtFullCalibData::tubeCalib
TubeContainerPtr tubeCalib
Definition: MdtFullCalibData.h:22
MdtCalibrationTool::m_calibDbKey
SG::ReadCondHandleKey< MuonCalib::MdtCalibDataContainer > m_calibDbKey
Definition: MdtCalibrationTool.h:123
TRT::Hit::driftTime
@ driftTime
Definition: HitInfo.h:43
Muon::MdtStatusBeforeSpectrum
@ MdtStatusBeforeSpectrum
The tube produced a hit that is inconsistent with the drift time spectrum, the drift time is smaller ...
Definition: MdtDriftCircleStatus.h:37
MdtCalibInput::tubeLength
double tubeLength() const
Returns the tube length.
Definition: MdtCalibInput.cxx:143
MdtCalibrationTool::m_unphysicalHitRadiusLowerBound
Gaudi::Property< double > m_unphysicalHitRadiusLowerBound
Definition: MdtCalibrationTool.h:119
MdtCalibrationTool::m_doTemp
Gaudi::Property< bool > m_doTemp
Definition: MdtCalibrationTool.h:103
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
MuonCalib::IRtRelation::tLower
virtual double tLower(void) const =0
MdtCalibrationTool::m_doField
Gaudi::Property< bool > m_doField
Definition: MdtCalibrationTool.h:104
MdtIdHelper
Definition: MdtIdHelper.h:61
MdtCalibrationTool::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: MdtCalibrationTool.h:132
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MdtCalibOutput
Definition: MdtCalibOutput.h:10
MdtCalibrationTool::m_doSlew
Gaudi::Property< bool > m_doSlew
Definition: MdtCalibrationTool.h:106
min
#define min(a, b)
Definition: cfImp.cxx:40
MdtCalibrationTool::m_t0ShiftTool
ToolHandle< MuonCalib::IShiftMapTools > m_t0ShiftTool
Definition: MdtCalibrationTool.h:110
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib::adcCal
float adcCal
quality flag for the SingleTubeCalib constants: 0 all ok, 1 no hits found, 2 too few hits,...
Definition: MdtTubeCalibContainer.h:24
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
MdtCalibrationTool::RtRelationPtr
MuonCalib::MdtFullCalibData::RtRelationPtr RtRelationPtr
Definition: MdtCalibrationTool.h:40
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib::inversePropSpeed
float inversePropSpeed
multiplicative correction factor for ADC measurement w.r.t.
Definition: MdtTubeCalibContainer.h:22
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
MdtCalibOutput::setTubeT0
void setTubeT0(const double T0)
Sets the tube T0.
Definition: MdtCalibOutput.cxx:44
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MdtCalibrationTool::m_windowSetting
Gaudi::Property< int > m_windowSetting
Definition: MdtCalibrationTool.h:98
MuonCalib::MdtRtRelation::rt
const IRtRelation * rt() const
rt relation
Definition: MdtRtRelation.h:23
MdtCalibTwinOutput
Definition: MdtCalibTwinOutput.h:11
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
MdtCalibrationTool::m_timeWindowLowerBound
Gaudi::Property< double > m_timeWindowLowerBound
Definition: MdtCalibrationTool.h:99
MagField::AtlasFieldCache
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
Definition: AtlasFieldCache.h:43
MdtCalibrationTool::m_doTMaxShift
Gaudi::Property< bool > m_doTMaxShift
Definition: MdtCalibrationTool.h:116
MdtCalibTwinOutput::setLocZ
void setLocZ(const double locZ, const double locZuncert)
Definition: MdtCalibTwinOutput.cxx:43
Muon::MdtStatusUnDefined
@ MdtStatusUnDefined
Undefined.
Definition: MdtDriftCircleStatus.h:43
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib
Definition: MdtTubeCalibContainer.h:18
MdtCalibrationTool::m_doProp
Gaudi::Property< bool > m_doProp
Definition: MdtCalibrationTool.h:102
MdtCalibrationTool::driftTimeStatus
Muon::MdtDriftCircleStatus driftTimeStatus(double driftTime, const MuonCalib::MdtRtRelation &rtRelation) const
Definition: MdtCalibrationTool.cxx:423
MuonCalib::RtScaleFunction
float RtScaleFunction(const float t, const bool ml2, const IRtRelation &rtrelation)
Definition: RtScaleFunction.cxx:20
ToolSettings
MdtCalibrationTool::ToolSettings ToolSettings
Definition: MdtCalibrationTool.cxx:32
MuonCalib::IRtRelation
generic interface for a rt-relation
Definition: IRtRelation.h:14
MdtCalibOutput::tubeT0
double tubeT0() const
Returns the point in time where the muon typically enters the chamber.
Definition: MdtCalibOutput.cxx:43
MdtCalibrationTool::m_resTwin
Gaudi::Property< double > m_resTwin
Definition: MdtCalibrationTool.h:120
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32