24 #include "GeoModelKernel/throwExcept.h"
33 using Property = ToolSettings::Property;
34 settings.setBit(Property::TofCorrection,
m_doTof);
35 settings.setBit(Property::PropCorrection,
m_doProp);
36 settings.setBit(Property::TempCorrection,
m_doTemp);
37 settings.setBit(Property::MagFieldCorrection,
m_doField);
38 settings.setBit(Property::SlewCorrection,
m_doSlew);
39 settings.setBit(Property::BackgroundCorrection,
m_doBkg);
47 case timeWindowMode::UserDefined:
50 case timeWindowMode::Default:
51 ATH_MSG_DEBUG(
"Use 1000. & 2000. as the lower and upper time window values ");
55 case timeWindowMode::CollisionG4:
60 case timeWindowMode::CollisionData:
65 case timeWindowMode::CollisionFitT0:
66 ATH_MSG_DEBUG(
"Use collision data time window of 50 to 100 to fit T0 in the end");
72 return StatusCode::FAILURE;
84 <<
" Correct time of flight "<<(
m_doTof ?
"yay" :
"nay")<<std::endl
85 <<
" Correct propagation time "<<(
m_doProp ?
"si" :
"no")<<std::endl
86 <<
" Correct temperature "<<(
m_doTemp ?
"si" :
"no")<<std::endl
87 <<
" Correct magnetic field "<<(
m_doField ?
"si" :
"no")<<std::endl
88 <<
" Correct time slew "<<(
m_doSlew ?
"si" :
"no")<<std::endl
89 <<
" Correct background "<<(
m_doBkg ?
"si" :
"no"));
90 return StatusCode::SUCCESS;
97 if (!constantHandle.isValid()){
100 return constantHandle->getCalibData(
channelId, msgStream());
104 bool resolFromRtrack)
const {
109 if (!constantHandle.isValid()){
114 if (!calibConstants) {
133 if (!singleTubeData) {
137 const float invPropSpeed = constantHandle->inversePropSpeed();
143 calibResult.setMeanAdc(singleTubeData->
adcCal);
149 <<(invPropSpeed * propagationDistance));
150 calibResult.setPropagationTime(invPropSpeed * propagationDistance);
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);
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);
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
274 - calibResult.tubeT0());
276 const double driftTimeDn =
std::max(rtRelation->rt()->tLower(),
277 calibIn.
tdc() * tdcBinSize
280 - calibResult.tubeT0()
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);
310 double primdriftTime = primHit.tdc()*tdcBinSize - primResult.
tubeT0();
311 double twinDriftTime = twinHit.tdc()*tdcBinSize - twinResult.
tubeT0();
313 if (primdriftTime >= twinDriftTime) {
315 <<
" primDriftTime: "<<primdriftTime<<
", secondTime: "<<twinDriftTime);
320 const Identifier& primId = primHit.identify();
321 const Identifier& twinId = twinHit.identify();
325 if (!constantHandle.isValid()){
332 if (!data1st || !data2nd) {
333 ATH_MSG_WARNING(__FILE__<<
":"<<__LINE__<<
" Failed to access calibration constants for tubes "<<
339 const double invPropSpeed = constantHandle->inversePropSpeed();
340 if (!calibSingleTube1st || !calibSingleTube2nd) {
341 ATH_MSG_WARNING(__FILE__<<
":"<<__LINE__<<
" Failed to access calibration constants for tubes "<<
347 constexpr
double HVdelay = 6.;
350 double twin_timedif = twinDriftTime - primdriftTime - invPropSpeed * twinHit.tubeLength() - HVdelay;
354 const double tubeHalfLength = 0.5*primHit.tubeLength();
355 const double zTwin = std::clamp(0.5* primHit.readOutSide()* twin_timedif / invPropSpeed, -tubeHalfLength, tubeHalfLength);
356 const double errZTwin =
m_resTwin / invPropSpeed;
359 <<
" prompthit tdc = " << primHit.tdc() <<
" twinhit tdc = " << twinHit.tdc()
360 <<
" tube driftTime = " << primResult<<
" second tube driftTime = " << twinResult<<
endmsg
361 <<
" Time difference =" << twin_timedif <<
" zTwin=" << zTwin<<
", errorZ="<<errZTwin);
365 calibResult.setLocZ(zTwin, errZTwin);
371 if (rtRelation.
rt()) {
384 ATH_MSG_WARNING(
"No valid rt relation supplied for driftTimeStatus method" );
392 if (!moduleConstants){
400 return rtRel->rtRes()->resolution(
t);