Convert the raw MDT time (+charge) into a drift radius + error.
It returns whether the conversion was successful.
112 if (!constantHandle.isValid()){
117 if (!calibConstants) {
136 if (!singleTubeData) {
140 const float invPropSpeed = constantHandle->inversePropSpeed();
146 calibResult.setMeanAdc(singleTubeData->
adcCal);
150 const double propagationDistance = calibIn.signalPropagationDistance();
152 <<(invPropSpeed * propagationDistance));
153 calibResult.setPropagationTime(invPropSpeed * propagationDistance);
157 const double driftTime = calibIn.tdc() * tdcBinSize
158 - (
m_doTof ? calibIn.timeOfFlight() : 0.)
159 - calibIn.triggerTime()
160 - calibResult.tubeT0()
161 - calibResult.signalPropagationTime();
173 if (
m_doSlew && corrections->slewing()) {
174 double slewTime=corrections->slewing()->correction(calibResult.driftTime(), calibIn.adc());
175 corrTime -= slewTime;
176 calibResult.setSlewingTime(slewTime);
180 if (
m_doField && corrections->bField()) {
184 if (!readHandle.isValid()) {
187 readHandle->getInitializedCache(fieldCache);
190 fieldCache.getField(calibIn.closestApproach().data(), globalB.data());
191 const Amg::Vector2D locBField = calibIn.projectMagneticField(globalB);
193 calibResult.setLorentzTime(corrections->bField()->correction(calibResult.driftTime(),
194 locBField[
static_cast<int>(BFieldComp::alongWire)],
195 locBField[
static_cast<int>(BFieldComp::alongTrack)]));
196 corrTime -= calibResult.lorentzTime();
200 const int mL = id_helper.multilayer(
id);
202 calibResult.setTemperatureTime(tempTime);
203 corrTime-=calibResult.temperatureTime();
206 if (
m_doBkg && corrections->background()) {
208 calibResult.setBackgroundTime(corrections->background()->correction(calibResult.driftTime(), bgLevel ));
209 corrTime += calibResult.backgroundTime();
213 calibResult.setDriftTime(calibResult.driftTime() + corrTime);
216 double r{0.}, reso{0.};
217 double t = calibResult.driftTime();
218 double t_inrange =
t;
221 assert(rtRelation->rt() !=
nullptr);
222 r = rtRelation->rt()->radius(
t);
226 r = rtRelation->rt()->radius(
t * (1 + tShift) );
229 if ( t < rtRelation->rt()->tLower() ) {
230 t_inrange = rtRelation->rt()->tLower();
231 double rmin = rtRelation->rt()->radius( t_inrange );
232 double drdt = (rtRelation->rt()->radius( t_inrange + 30. ) - rmin)/30.;
239 }
else if(
t > rtRelation->rt()->tUpper() ) {
240 t_inrange = rtRelation->rt()->tUpper();
241 double rmax = rtRelation->rt()->radius( t_inrange );
242 double drdt = (rmax - rtRelation->rt()->radius( t_inrange - 30. ))/30.;
248 r = rmax + drdt*(
t-t_inrange);
251 assert(rtRelation->rtRes() !=
nullptr);
252 if (!resolFromRtrack) {
253 reso = rtRelation->rtRes()->resolution( t_inrange );
255 const std::optional<double> tFromR = rtRelation->tr()->driftTime(std::abs(calibIn.distanceToTrack()));
256 reso = rtRelation->rtRes()->resolution(tFromR.value_or(0.));
261 assert(rtRelation->rt() !=
nullptr);
262 const double driftTimeUp =
std::min(rtRelation->rt()->tUpper(),
263 calibIn.tdc() * tdcBinSize
264 - (
m_doTof ? calibIn.timeOfFlight() : 0.)
265 - calibIn.triggerTime()
266 - calibResult.tubeT0());
268 const double driftTimeDn =
std::max(rtRelation->rt()->tLower(),
269 calibIn.tdc() * tdcBinSize
270 - (
m_doTof ? calibIn.timeOfFlight() : 0.)
271 - calibIn.triggerTime()
272 - calibResult.tubeT0()
273 - calibIn.tubeLength() * invPropSpeed);
275 const double radiusUp = rtRelation->rt()->radius(driftTimeUp);
276 const double radiusDn = rtRelation->rt()->radius(driftTimeDn);
278 <<
" nominal drift time "<<
driftTime<<
", down: "<<driftTimeDn<<
", up: "<<driftTimeUp
279 <<
" --> driftRadius: "<<
r<<
" pm "<<reso<<
", prop-up: "<<radiusUp<<
", prop-dn: "<<radiusDn
280 <<
" delta: "<<(radiusUp-radiusDn));
281 calibResult.setDriftUncertSigProp(0.5*std::abs(radiusUp - radiusDn));
282 reso = std::hypot(reso, calibResult.driftUncertSigProp());
285 calibResult.setDriftRadius(
r, reso);
286 calibResult.setStatus(timeStatus);
289 <<
" passed. "<<std::endl<<
"Input: "<<calibIn<<std::endl<<
"Extracted calib constants: "<<calibResult<<std::endl);