Convert the raw MDT time (+charge) into a drift radius + error.
It returns whether the conversion was successful.
109 if (!constantHandle.isValid()){
114 if (!calibConstants) {
133 if (!singleTubeData) {
137 const float invPropSpeed = constantHandle->inversePropSpeed();
143 calibResult.setMeanAdc(singleTubeData->
adcCal);
147 const double propagationDistance = calibIn.signalPropagationDistance();
149 <<(invPropSpeed * propagationDistance));
150 calibResult.setPropagationTime(invPropSpeed * propagationDistance);
154 const double driftTime = calibIn.tdc() * tdcBinSize
155 - (
m_doTof ? calibIn.timeOfFlight() : 0.)
156 - calibIn.triggerTime()
157 - calibResult.tubeT0()
158 - calibResult.signalPropagationTime();
170 if (
m_doSlew && corrections->slewing()) {
171 double slewTime=corrections->slewing()->correction(calibResult.driftTime(), calibIn.adc());
172 corrTime -= slewTime;
173 calibResult.setSlewingTime(slewTime);
177 if (
m_doField && corrections->bField()) {
181 if (!readHandle.isValid()) {
184 readHandle->getInitializedCache(fieldCache);
187 fieldCache.getField(calibIn.closestApproach().data(), globalB.data());
188 const Amg::Vector2D locBField = calibIn.projectMagneticField(globalB);
190 calibResult.setLorentzTime(corrections->bField()->correction(calibResult.driftTime(),
191 locBField[
static_cast<int>(BFieldComp::alongWire)],
192 locBField[
static_cast<int>(BFieldComp::alongTrack)]));
193 corrTime -= calibResult.lorentzTime();
197 const int mL = id_helper.multilayer(
id);
199 calibResult.setTemperatureTime(tempTime);
200 corrTime-=calibResult.temperatureTime();
203 if (
m_doBkg && corrections->background()) {
205 calibResult.setBackgroundTime(corrections->background()->correction(calibResult.driftTime(), bgLevel ));
206 corrTime += calibResult.backgroundTime();
210 calibResult.setDriftTime(calibResult.driftTime() + corrTime);
213 double r{0.}, reso{0.};
214 double t = calibResult.driftTime();
215 double t_inrange =
t;
218 assert(rtRelation->rt() !=
nullptr);
219 r = rtRelation->rt()->radius(
t);
223 r = rtRelation->rt()->radius(
t * (1 + tShift) );
226 if ( t < rtRelation->rt()->tLower()) {
227 t_inrange = rtRelation->rt()->tLower();
228 double rmin = rtRelation->rt()->radius( t_inrange );
229 double drdt = rtRelation->rt()->driftVelocity( t_inrange);
235 r = rmin + drdt*(
t-t_inrange);
236 }
else if(
t > rtRelation->rt()->tUpper() ) {
237 t_inrange = rtRelation->rt()->tUpper();
238 double rmax = rtRelation->rt()->radius( t_inrange );
239 double drdt = rtRelation->rt()->driftVelocity(t_inrange);
245 r = rmax + drdt*(
t-t_inrange);
248 assert(rtRelation->rtRes() !=
nullptr);
252 ATH_MSG_VERBOSE(
"Calibrated radius below physical limit "<<
r<<
" vs. "<<calibIn.innerTubeR());
255 reso =
std::pow(calibIn.innerTubeR(), 2);
256 }
else if (
r > calibIn.innerTubeR()) {
257 ATH_MSG_VERBOSE(
"Calibrated radius outside tube ."<<
r<<
" vs. "<<calibIn.innerTubeR());
259 r = calibIn.innerTubeR();
260 reso =
std::pow(calibIn.innerTubeR(), 2);
261 }
else if (!resolFromRtrack) {
262 reso = rtRelation->rtRes()->resolution( t_inrange );
264 const std::optional<double> tFromR = rtRelation->tr()->driftTime(std::abs(calibIn.distanceToTrack()));
265 reso = rtRelation->rtRes()->resolution(tFromR.value_or(0.));
269 assert(rtRelation->rt() !=
nullptr);
270 const double driftTimeUp =
std::min(rtRelation->rt()->tUpper(),
271 calibIn.tdc() * tdcBinSize
272 - (
m_doTof ? calibIn.timeOfFlight() : 0.)
273 - calibIn.triggerTime()
274 - calibResult.tubeT0());
276 const double driftTimeDn =
std::max(rtRelation->rt()->tLower(),
277 calibIn.tdc() * tdcBinSize
278 - (
m_doTof ? calibIn.timeOfFlight() : 0.)
279 - calibIn.triggerTime()
280 - calibResult.tubeT0()
281 - calibIn.tubeLength() * invPropSpeed);
283 const double radiusUp = rtRelation->rt()->radius(driftTimeUp);
284 const double radiusDn = rtRelation->rt()->radius(driftTimeDn);
286 <<
" nominal drift time "<<calibResult.driftTime()<<
", down: "<<driftTimeDn<<
", up: "<<driftTimeUp
287 <<
" --> driftRadius: "<<
r<<
" pm "<<reso<<
", prop-up: "<<radiusUp<<
", prop-dn: "<<radiusDn
288 <<
" delta: "<<(radiusUp-radiusDn));
289 calibResult.setDriftUncertSigProp(0.5*std::abs(radiusUp - radiusDn));
290 reso = std::hypot(reso, calibResult.driftUncertSigProp());
293 calibResult.setDriftRadius(
r, reso);
294 calibResult.setStatus(timeStatus);
297 <<
" passed. "<<std::endl<<
"Input: "<<calibIn<<std::endl<<
"Extracted calib constants: "<<calibResult<<std::endl);