ATLAS Offline Software
TRT_ToT_dEdx.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "TRT_ToT_dEdx.h"
7 
8 #include "GaudiKernel/MsgStream.h"
9 #include "GaudiKernel/IToolSvc.h"
10 
11 #include "InDetIdentifier/TRT_ID.h"
13 
14 #include "TrkSurfaces/Surface.h"
15 
16 #include "GaudiKernel/IChronoStatSvc.h"
17 
18 #include "TF1.h"
19 
20 #include "StoreGate/DataHandle.h"
21 #include "StoreGate/ReadHandle.h"
24 #include <cmath>
25 #include <limits>
26 
27 namespace{
28 bool
29 inRange(const double val, const double lo, const double hi){
30  return (val>lo) and (val<hi);
31 }
32 
33 }
34 
35 // constructor
36 TRT_ToT_dEdx::TRT_ToT_dEdx(const std::string& t, const std::string& n, const IInterface* p)
37  :
38  AthAlgTool(t,n,p),
39  m_TRTStrawSummaryTool("TRT_StrawStatusSummaryTool",this)
40 {
41  declareInterface<ITRT_ToT_dEdx>(this);
42  declareProperty("TRTStrawSummaryTool", m_TRTStrawSummaryTool);
43 
45 
46  m_trtId = nullptr;
47 }
48 
49 
50 
52 {
53  declareProperty("TRT_dEdx_divideByL",m_divideByL=true);
54  declareProperty("TRT_dEdx_corrected",m_corrected=true);
55  declareProperty("TRT_dEdx_correctionType",m_correctionType=kTrackBased);
56  declareProperty("TRT_dEdx_useTrackPartWithGasType",m_useTrackPartWithGasType=kUnset);
57  declareProperty("TRT_dEdx_toolScenario",m_toolScenario=kAlgReweightTrunkOne);
58  declareProperty("TRT_dEdx_trackConfig_maxRtrack",m_trackConfig_maxRtrack=1.85);
59  declareProperty("TRT_dEdx_trackConfig_minRtrack",m_trackConfig_minRtrack=0.15);
60  declareProperty("TRT_dEdx_useZeroRHitCut",m_useZeroRHitCut=true);
61  declareProperty("TRT_dEdx_isData",m_isData=true);
62 }
63 
64 // destructor
65 TRT_ToT_dEdx::~TRT_ToT_dEdx() = default;
66 
67 
68 
69 // initialize
71 {
72 
73  MsgStream log(msgSvc(), name());
74 
75  // retrieve TRT-ID helper
76 
77  StatusCode sc = detStore()->retrieve(m_trtId, "TRT_ID");
78  if (sc.isFailure()){
79  ATH_MSG_ERROR ( "Could not get TRT_ID helper !" );
80  return StatusCode::FAILURE;
81  }
82 
83  // Initialize ReadHandleKey and ReadCondHandleKey
84  ATH_CHECK(m_rdhkEvtInfo.initialize());
86  ATH_CHECK(m_assoTool.retrieve());
87  ATH_CHECK( m_localOccTool.retrieve() );
88  ATH_CHECK(m_TRTStrawSummaryTool.retrieve());
89 
90  if (m_useTrackPartWithGasType > EGasType::kUnset ||
91  m_useTrackPartWithGasType < EGasType::kXenon) {
92  ATH_MSG_ERROR("Property TRT_dEdx_useTrackPartWithGasType has an invalid "
93  << "value: " << m_useTrackPartWithGasType);
94  return StatusCode::FAILURE;
95  }
96 
97  return StatusCode::SUCCESS;
98 }
99 
100 bool
101 TRT_ToT_dEdx::isGoodHit(const EventContext& ctx,
102  const Trk::TrackStateOnSurface* trackState,
103  bool useHitsHT,
104  double& length) const
105 {
106  const Trk::MeasurementBase* trkM = trackState->measurementOnTrack();
107  if (!trkM) {
108  return false;
109  }
110 
111  // Check if this is RIO on track
112  // and if yes check if is TRT Drift Circle
113  // then set the ptr
114  const InDet::TRT_DriftCircleOnTrack* driftcircle = nullptr;
116  const Trk::RIO_OnTrack* tmpRio = static_cast<const Trk::RIO_OnTrack*>(trkM);
118  driftcircle = static_cast<const InDet::TRT_DriftCircleOnTrack*>(tmpRio);
119  }
120  }
121 
122  if (!driftcircle) {
123  return false;
124  }
125 
126  const Trk::TrackParameters* trkP = trackState->trackParameters();
127  if(trkP==nullptr)return false;
128 
129  double Trt_Rtrack = std::abs(trkP->parameters()[Trk::locR]);
130  double Trt_RHit = std::abs(driftcircle->localParameters()[Trk::driftRadius]);
131  double error = std::sqrt(driftcircle->localCovariance()(Trk::driftRadius,Trk::driftRadius));
132 
133  if (trackState->type(Trk::TrackStateOnSurface::Outlier)) return false; //Outliers
134  if (m_useZeroRHitCut && Trt_RHit==0 && error>1.) return false; //Select precision hits only
135  if ((Trt_Rtrack >= m_trackConfig_maxRtrack) || (Trt_Rtrack <= m_trackConfig_minRtrack)) return false; // drift radius close to wire or wall
136 
138 
139  if (m_divideByL and length < 1.7) return false; // Length in the straw
140 
141  if (!useHitsHT) {
142  int TrtHl = driftcircle->highLevel();
143  if (TrtHl==1) return false;
144  }
145 
146  if (m_useTrackPartWithGasType != kUnset) { // don't preselect hits
147  if(m_useTrackPartWithGasType != gasTypeInStraw(ctx,trackState)) return false;
148  }
149 
150  if (driftcircle->prepRawData()->timeOverThreshold()==0.) return false; // If ToT for this hit equal 0, skip it.
151 
152  return true;
153 }
154 
155 double
156 TRT_ToT_dEdx::dEdx(const EventContext& ctx,
157  const Trk::Track* track,
158  bool useHitsHT,
159  std::optional<float> localOccupancy) const
160 {
161  ATH_MSG_DEBUG("dEdx()");
162 
163  double nVtx=-1.;
164  // Event information
166  if(!eventInfoDecor.isPresent()) {
167  REPORT_MESSAGE(MSG::FATAL) << "EventInfo decoration not available!";
168  return 0;
169  }
170 
171  // Average interactions per crossing for the current BCID
172  // TODO: we should really not hard-code a mu to nVtx conversion
173  double mu = eventInfoDecor(0);
174  if(m_isData) {
175  nVtx = 1.3129 + 0.716194*mu + (-0.00475074)*mu*mu;
176  }
177  else {
178  nVtx = 1.0897 + 0.748287*mu + (-0.00421788)*mu*mu;
179  }
180 
181  if (!track) {
182  return 0;
183  }
184  const Trk::TrackStates* vtsos = track->trackStateOnSurfaces();
185  if (!vtsos) {
186  return 0;
187  }
188 
189  EGasType gasType;
191  Trk::TrackStates::const_iterator itre = vtsos->end();
192  size_t vtos_size = vtsos->size();
193  double correctionFactor = 1.;
194 
196  std::vector<double> vecToT;
197  vecToT.reserve(vtos_size);
198  double ToTsum = 0;
199 
200  for ( ; itr!=itre ; ++itr) {
201  double length = 0;
202  if ( isGoodHit(ctx,(*itr), useHitsHT, length)) {
203  double ToT_correct = correctToT_corrRZ(ctx,*itr, length);
204  if (m_correctionType == kHitBased){
205  correctionFactor = hitOccupancyCorrection(ctx,*itr);
206  ToT_correct*=correctionFactor;
207  }
208  vecToT.push_back(ToT_correct);
209  }
210  }
211 
212  sort(vecToT.begin(), vecToT.end());
213  size_t nhits = vecToT.size();
214 
215  if (m_divideByL) {
216  nhits-=m_nTrunkateHits;
217  }
218 
219  // Boost speed
220  if (nhits<1) return 0.0;
221 
222  ToTsum = std::accumulate(vecToT.begin(), vecToT.end(), 0);
223  if (m_correctionType == kTrackBased) {
224  correctionFactor=trackOccupancyCorrection(ctx,track, useHitsHT,localOccupancy);
225  } else {
226  correctionFactor=correctNormalization(ctx,nVtx);
227  }
228  ToTsum*=correctionFactor;
229  return ToTsum/nhits;
230  }
231 
233  std::vector<double> vecToT_Xe;
234  vecToT_Xe.reserve(vtos_size/2);
235  std::vector<double> vecToT_Ar;
236  vecToT_Ar.reserve(vtos_size/2);
237  std::vector<double> vecToT_Kr;
238 
241  "dEdX_Estimator():: Using m_toolScenario="
242  << m_toolScenario << " scenario m_useTrackPartWithGasType is set to"
244  << ", but kUnset is requiered. Check you tool configuration.");
245  }
246 
247  for ( ; itr!=itre ; ++itr) {
248  double length=0;
249  if (isGoodHit(ctx,(*itr), useHitsHT, length)) {
250  gasType=gasTypeInStraw(ctx,*itr);
251  double ToT_correct = correctToT_corrRZ(ctx,*itr, length);
252  if (m_correctionType == kHitBased) {
253  correctionFactor = hitOccupancyCorrection(ctx,*itr);
254  }
255  ToT_correct*=correctionFactor;
256  if(gasType==kXenon) {
257  vecToT_Xe.push_back(ToT_correct);
258  } else if (gasType==kArgon) {
259  vecToT_Ar.push_back(ToT_correct);
260  } else if (gasType==kKrypton) {
261  vecToT_Kr.push_back(ToT_correct);
262  } else {
263  ATH_MSG_ERROR("dEdX_Estimator():: During scenario kAlgReweight variable gasTypeInStraw got value kUnset.");
264  }
265  }
266  }
267 
268  sort(vecToT_Xe.begin(), vecToT_Xe.end());
269  sort(vecToT_Ar.begin(), vecToT_Ar.end());
270  sort(vecToT_Kr.begin(), vecToT_Kr.end());
271 
272  size_t nhitsXe = vecToT_Xe.size();
273  size_t nhitsAr = vecToT_Ar.size();
274  size_t nhitsKr = vecToT_Kr.size();
275 
276  if (m_divideByL) {
278  if (nhitsXe>=m_nTrunkateHits) nhitsXe-=m_nTrunkateHits;
279  if (nhitsAr>=m_nTrunkateHits) nhitsAr-=m_nTrunkateHits;
280  if (nhitsKr>=m_nTrunkateHits) nhitsKr-=m_nTrunkateHits;
281  } else {// kAlgReweightTrunkOne
282  int trunkGas = kUnset;
283  double maxToT = 0.;
284  if (nhitsXe>0 && vecToT_Xe.at(nhitsXe-1)>maxToT) {
285  trunkGas = kXenon;
286  maxToT = vecToT_Xe.at(nhitsXe-1);
287  }
288  if(nhitsAr>0 && vecToT_Ar.at(nhitsAr-1)>maxToT){
289  trunkGas = kArgon;
290  maxToT = vecToT_Ar.at(nhitsAr-1);
291  }
292  if (nhitsKr>0 && vecToT_Kr.at(nhitsKr-1)>maxToT) {
293  trunkGas = kKrypton;
294  }
295 
296  if (trunkGas==kXenon) {
297  nhitsXe-=m_nTrunkateHits;
298  } else if (trunkGas==kArgon) {
299  nhitsAr-=m_nTrunkateHits;
300  } else if (trunkGas==kKrypton) {
301  nhitsKr-=m_nTrunkateHits;
302  }
303  }
304  }
305 
306  size_t nhits = nhitsXe + nhitsAr + nhitsKr;
307  if(nhits<1) return 0.0;
308 
309  double ToTsumXe = 0;
310  double ToTsumAr = 0;
311  double ToTsumKr = 0;
312  for (size_t i = 0; i < nhitsXe;i++) {
313  ToTsumXe+=vecToT_Xe[i];
314  }
315  for (size_t i = 0; i < nhitsAr;i++) {
316  ToTsumAr+=vecToT_Ar[i];
317  }
318  for (size_t i = 0; i < nhitsKr;i++) {
319  ToTsumKr+=vecToT_Kr[i];
320  }
321 
322  ToTsumXe = (nhitsXe>0) ? ToTsumXe/nhitsXe : 0;
323  ToTsumAr = (nhitsAr>0) ? ToTsumAr/nhitsAr : 0;
324  ToTsumKr = (nhitsKr>0) ? ToTsumKr/nhitsKr : 0;
325  double ToTsum = ToTsumXe*nhitsXe + ToTsumAr*nhitsAr + ToTsumKr*nhitsKr;
326 
327  if (m_correctionType == kTrackBased) {
328  correctionFactor =
329  trackOccupancyCorrection(ctx, track, true, localOccupancy);
330  } else {
331  correctionFactor = correctNormalization(ctx, nVtx);
332  }
333  ToTsum *= correctionFactor;
334 
335  return ToTsum/nhits;
336  }
337 
338  ATH_MSG_ERROR("dEdX_Estimator():: m_toolScenario has wrong value "<<m_toolScenario<<"");
339  return 0.;
340 }
341 
342 double
343 TRT_ToT_dEdx::usedHits(const EventContext& ctx,
344  const Trk::Track* track,
345  bool useHitsHT) const
346 {
347  ATH_MSG_DEBUG("usedHits()");
348  EGasType gasType = kUnset;
349 
350  if (!track) {
351  return 0;
352  }
353  const Trk::TrackStates* vtsos = track->trackStateOnSurfaces();
354  if (!vtsos) {
355  return 0;
356  }
357 
359  Trk::TrackStates::const_iterator itre = vtsos->end();
360 
362  int nhits =0;
363 
364  for ( ; itr!=itre ; ++itr) {
365  double length=0;
366  if (isGoodHit(ctx,(*itr), useHitsHT, length)) {
367  nhits++;
368  }
369  }
370  if (m_divideByL) nhits -= m_nTrunkateHits;
371  return nhits;
373  int nhits = 0;
374  int nhitsXe = 0;
375  int nhitsAr = 0;
376  int nhitsKr = 0;
377 
380  "usedHits_Estimator():: Using m_toolScenario="
381  << m_toolScenario << " scenario m_useTrackPartWithGasType is set to "
383  << ", but kUnset is required. Check you tool configuration.");
384  }
385 
386  for ( ; itr!=itre ; ++itr) {
387  double length=0;
388  if ( isGoodHit(ctx,(*itr), useHitsHT, length)) {
389  gasType=gasTypeInStraw(ctx,*itr);
390  if (gasType==kXenon) {
391  nhitsXe++;
392  } else if (gasType==kArgon) {
393  nhitsAr++;
394  } else if (gasType==kKrypton) {
395  nhitsKr++;
396  } else {
397  ATH_MSG_ERROR("usedHits_Estimator():: During scenario kAlgReweight variable gasTypeInStraw got value kUnset.");
398  }
399  }
400  }
401 
402  if (m_divideByL) {
404  if(nhitsXe>0) nhitsXe -= m_nTrunkateHits;
405  if(nhitsAr>0) nhitsAr -= m_nTrunkateHits;
406  if(nhitsKr>0) nhitsKr -= m_nTrunkateHits;
407  } else { // kAlgReweightTrunkOne
408  if(nhitsXe>0 || nhitsAr>0 || nhitsKr>0)
409  nhitsXe -= m_nTrunkateHits;
410  }
411  }
412 
413  nhits = nhitsXe + nhitsAr + nhitsKr;
414  return nhits;
415  }
416 
417  ATH_MSG_ERROR("usedHits_Estimator():: m_toolScenario has wrong value "<<m_toolScenario<<"");
418  return 0;
419 }
420 
421 double
422 TRT_ToT_dEdx::getProb(const EventContext& ctx,
423  const Trk::TrackStateOnSurface* itr,
424  const double dEdx_obs,
425  const double pTrk,
426  Trk::ParticleHypothesis hypothesis,
427  int nUsedHits) const
428 {
429  EGasType gasType = gasTypeInStraw(ctx, itr);
430  return getProb(ctx,gasType, dEdx_obs, pTrk, hypothesis, nUsedHits);
431 }
432 
433 double
434 TRT_ToT_dEdx::getProb(const EventContext& ctx,
435  EGasType gasType,
436  const double dEdx_obs,
437  const double pTrk,
438  Trk::ParticleHypothesis hypothesis,
439  int nUsedHits) const
440 {
441  ATH_MSG_DEBUG("getProb():: gasTypeInStraw = "<<gasType<<"");
442 
444  const TRTDedxcorrection* dEdxCorrection{*readHandle};
445  if (dEdxCorrection==nullptr) {
446  ATH_MSG_ERROR(" getProb: Could not find any dEdxCorrection in CondStore. Return zero.");
447  return 0;
448  }
449 
450  if(gasType==kUnset) {
451  ATH_MSG_DEBUG("getProb():: gasTypeInStraw set kUnset that is not allowed! Use gasTypeInStraw(*itr) to get gas type info for that hit first!");
452  ATH_MSG_DEBUG("getProb():: Now gasTypeInStraw sets to kXenon.");
453  gasType = kXenon;
454  }
455 
456  double dEdx_pred = predictdEdx(ctx,gasType, pTrk, hypothesis);
457  if (dEdx_pred==0) return 0.0;
458  if (hypothesis==Trk::electron) {
459  // correction for pTrk in [MeV]
460  double factor = 1;
461  double correct = 1+factor*(0.045*log10(pTrk)+0.885-1);
462  dEdx_pred= dEdx_pred/correct;
463  }
464 
465  double Resolution =
466  dEdxCorrection->resolution[gasType][0] +
467  dEdxCorrection->resolution[gasType][1] * (nUsedHits + 0.5) +
468  dEdxCorrection->resolution[gasType][2] * (nUsedHits + 0.5) *
469  (nUsedHits + 0.5) +
470  dEdxCorrection->resolution[gasType][3] * (nUsedHits + 0.5) *
471  (nUsedHits + 0.5) * (nUsedHits + 0.5);
472  if (hypothesis == Trk::electron) {
473  Resolution =
474  dEdxCorrection->resolutionElectron[gasType][0] +
475  dEdxCorrection->resolutionElectron[gasType][1] * (nUsedHits + 0.5) +
476  dEdxCorrection->resolutionElectron[gasType][2] * (nUsedHits + 0.5) *
477  (nUsedHits + 0.5) +
478  dEdxCorrection->resolutionElectron[gasType][3] * (nUsedHits + 0.5) *
479  (nUsedHits + 0.5) * (nUsedHits + 0.5);
480  }
481 
482  double prob = std::exp( -0.5 * ( ( ( dEdx_obs - dEdx_pred ) / (Resolution*dEdx_pred) ) *
483  ( ( dEdx_obs - dEdx_pred ) / (Resolution*dEdx_pred) ) )) ;
484 
485  ATH_MSG_DEBUG("getProb():: return "<<prob<<"");
486  return prob;
487 }
488 
489 double
490 TRT_ToT_dEdx::getTest(const EventContext& ctx,
491  const double dEdx_obs,
492  const double pTrk,
493  Trk::ParticleHypothesis hypothesis,
494  Trk::ParticleHypothesis antihypothesis,
495  int nUsedHits) const
496 {
497  ATH_MSG_DEBUG("getTest()");
498 
499  EGasType gasType = kUnset;
500  if ( dEdx_obs<=0. || pTrk<=0. || nUsedHits<=0 ) return 0.5;
501 
502  double Pone = getProb(ctx,gasType, dEdx_obs,pTrk,hypothesis,nUsedHits);
503  double Ptwo = getProb(ctx,gasType, dEdx_obs,pTrk,antihypothesis,nUsedHits);
504  if ((Pone+Ptwo) != 0) {
505  ATH_MSG_DEBUG("getTest():: return "<<Pone/(Pone+Ptwo)<<"");
506  return Pone/(Pone+Ptwo);
507  } else {
508  return 0.5;
509  }
510 }
511 
512 double
513 TRT_ToT_dEdx::predictdEdx(const EventContext& ctx,
514  const Trk::TrackStateOnSurface* itr,
515  const double pTrk,
516  Trk::ParticleHypothesis hypothesis) const
517 {
518  EGasType gasType = gasTypeInStraw(ctx, itr);
519  return predictdEdx(ctx,gasType, pTrk, hypothesis);
520 }
521 
522 double
523 TRT_ToT_dEdx::predictdEdx(const EventContext& ctx,
524  EGasType gasType,
525  const double pTrk,
526  Trk::ParticleHypothesis hypothesis) const
527 {
528  ATH_MSG_DEBUG("predictdEdx(): gasTypeInStraw = " << gasType << "");
529 
531  const TRTDedxcorrection* dEdxCorrection{ *readHandle };
532  if (dEdxCorrection == nullptr) {
533  ATH_MSG_ERROR(" predictdEdx: Could not find any dEdxCorrection in "
534  "CondStore. Return zero.");
535  return 0;
536  }
537 
538  if (gasType == kUnset) {
540  "predictdEdx():: gasTypeInStraw set kUnset that is not allowed! Use "
541  "gasTypeInStraw(*itr) to get gas type info for that hit first!");
542  ATH_MSG_DEBUG("predictdEdx():: Now gasTypeInStraw sets to kXenon.");
543  gasType = kXenon;
544  }
545 
546  double mass = Trk::ParticleMasses::mass[hypothesis];
547 
548  double betaGamma = pTrk/mass;
550  // low momentum particle can create floating point error
551  // do we need the check in the log parameter in addition? will create CPU increase
552  // do we want to throw an assertion here?
553  if (pTrk < 100)
554  return 0;
555  if (m_divideByL) {
556  if (dEdxCorrection->paraDivideByLengthDedxP3[gasType] +
557  1. / (std::pow(betaGamma,
558  dEdxCorrection->paraDivideByLengthDedxP5[gasType])) <=
559  0)
560  return 0;
561  return dEdxCorrection->paraDivideByLengthDedxP1[gasType] /
562  std::pow(std::sqrt((betaGamma * betaGamma) /
563  (1. + (betaGamma * betaGamma))),
564  dEdxCorrection->paraDivideByLengthDedxP4[gasType]) *
565  (dEdxCorrection->paraDivideByLengthDedxP2[gasType] -
566  std::pow(std::sqrt((betaGamma * betaGamma) /
567  (1. + (betaGamma * betaGamma))),
568  dEdxCorrection->paraDivideByLengthDedxP4[gasType]) -
569  log(dEdxCorrection->paraDivideByLengthDedxP3[gasType] +
570  1. / (std::pow(
571  betaGamma,
572  dEdxCorrection->paraDivideByLengthDedxP5[gasType]))));
573  }
574  if (dEdxCorrection->paraDedxP3[gasType] +
575  1. / (std::pow(betaGamma, dEdxCorrection->paraDedxP5[gasType])) <=
576  0)
577  return 0;
578  return dEdxCorrection->paraDedxP1[gasType] /
579  std::pow(
580  std::sqrt((betaGamma * betaGamma) / (1. + (betaGamma * betaGamma))),
581  dEdxCorrection->paraDedxP4[gasType]) *
582  (dEdxCorrection->paraDedxP2[gasType] -
583  std::pow(
584  std::sqrt((betaGamma * betaGamma) / (1. + (betaGamma * betaGamma))),
585  dEdxCorrection->paraDedxP4[gasType]) -
586  log(dEdxCorrection->paraDedxP3[gasType] +
587  1. / (std::pow(betaGamma, dEdxCorrection->paraDedxP5[gasType]))));
588 
589  //return 0;
590 }
591 
592 double
593 TRT_ToT_dEdx::mass(const EventContext& ctx,
594  const Trk::TrackStateOnSurface* itr,
595  const double pTrk,
596  double dEdx) const
597 {
598  EGasType gasType = gasTypeInStraw(ctx,itr);
599 
600  ATH_MSG_DEBUG("mass(): gasTypeInStraw = "<<gasType<<"");
601 
603  const TRTDedxcorrection* dEdxCorrection{*readHandle};
604  if(dEdxCorrection==nullptr)
605  {
606  ATH_MSG_ERROR(" mass: Could not find any dEdxCorrection in CondStore. Return zero.");
607  return 0;
608  }
609 
610  if(gasType==kUnset)
611  {
612  ATH_MSG_WARNING("mass():: gasTypeInStraw set kUnset that is not allowed! Use gasTypeInStraw(*itr) to get gas type info for that hit first!");
613  ATH_MSG_WARNING("mass():: Now gasTypeInStraw sets to kXenon.");
614  gasType = kXenon;
615  }
616  // only for testing purposes!!!!
617  // note that dE/dx has to be corrected on track level first before value can be transferred to mass
618  // this has to be tuned on user level
620  static const double bg_min = 0.001;
621  static const double bg_max = 3; // maximal allowed bg
622 
623  static const std::string blumRolandiFunction =
624  "( [0]/sqrt( (x*x/([5]*[5]))/(1.+(x*x/([5]*[5]))) )^[3] ) * ([1] - sqrt( "
625  "(x*x/([5]*[5]))/(1.+(x*x/([5]*[5]))) )^[3] - log([2]+1./((x/[5])^[4]) ) )";
626 
627  TF1 blumRolandi( "BR", blumRolandiFunction.c_str(), 0.7, 100000);
628 
629  blumRolandi.SetParameters(dEdxCorrection->paraDedxP1[gasType],
630  dEdxCorrection->paraDedxP2[gasType],
631  dEdxCorrection->paraDedxP3[gasType],
632  dEdxCorrection->paraDedxP4[gasType],
633  dEdxCorrection->paraDedxP5[gasType],
634  1.);
635  //blumRolandi.SetParameters(&dEdxCorrection->para_dEdx_BB);
636  double betaGamma = blumRolandi.GetX(dEdx, bg_min, bg_max);
637 
638  ATH_MSG_DEBUG("mass():: return "<<pTrk/betaGamma<<"");
639 
640  return pTrk/betaGamma;
641 }
642 
643 /* returns gas type for given straw */
644 // TODO: move this functionality to TRT_StrawStatusSummaryTool.
646  const Trk::TrackStateOnSurface *itr) const
647 {
648  const Trk::MeasurementBase* trkM = itr->measurementOnTrack();
649  if (!trkM) {
650  return kUnset;
651  }
652 
653  // Check if this is RIO on track
654  //annd if yes check if is TRT Drift Circle
655  //then set the ptr
656  const InDet::TRT_DriftCircleOnTrack* driftcircle = nullptr;
658  const Trk::RIO_OnTrack* tmpRio = static_cast<const Trk::RIO_OnTrack*>(trkM);
660  driftcircle = static_cast<const InDet::TRT_DriftCircleOnTrack*>(tmpRio);
661  }
662  }
663 
664  if (!driftcircle) {
665  return kUnset;
666  }
667 
668  return gasTypeInStraw(ctx,driftcircle);
669 }
670 
673  const EventContext& ctx,
674  const InDet::TRT_DriftCircleOnTrack* driftcircle) const
675 {
676  Identifier DCid = driftcircle->identify();
677 
678  // getStatusHT returns enum {Undefined, Dead, Good, Xenon, Argon, Krypton, EmulatedArgon, EmulatedKrypton}.
679  // Our representation of 'GasType' is 0:Xenon, 1:Argon, 2:Krypton
680  EGasType GasType=kUnset; // kUnset is default
681  if (!m_TRTStrawSummaryTool.empty()) {
682  int stat = m_TRTStrawSummaryTool->getStatusHT(DCid,ctx);
683  if ( stat==2 || stat==3 ) { GasType = kXenon; } // Xe
684  else if ( stat==1 || stat==4 ) { GasType = kArgon; } // Ar
685  else if ( stat==5 ) { GasType = kKrypton; } // Kr
686  else if ( stat==6 ) { GasType = kArgon; } // Emulated Ar
687  else if ( stat==7 ) { GasType = kKrypton;
688  } // Emulated Kr
689  else {
691  "getStatusHT = "
692  << stat
693  << ", must be 'Good(2)||Xenon(3)' or 'Dead(1)||Argon(4)' or "
694  "'Krypton(5)' or 'EmulatedArgon(6)' or 'EmulatedKr(7)'!");
695  throw std::exception();
696  }
697  }
698 
699  return GasType;
700 }
701 
703 // Corrections
705 
706 double
707 TRT_ToT_dEdx::correctNormalization(const EventContext& ctx, double nVtx) const
708 {
710  const TRTDedxcorrection* dEdxCorrection{*readHandle};
711  if(dEdxCorrection==nullptr) {
712  ATH_MSG_ERROR(" correctNormalization: Could not find any dEdxCorrection in CondStore. Return zero.");
713  return 0;
714  }
715 
716  EGasType gasType = static_cast<EGasType> (m_useTrackPartWithGasType);
718  if (nVtx<=0) nVtx=dEdxCorrection->normNzero[gasType];
719  double slope = dEdxCorrection->normSlopeTot[gasType];
720  double offset = dEdxCorrection->normOffsetTot[gasType];
721  if (m_divideByL){
722  slope = dEdxCorrection->normSlopeTotDivideByLength[gasType];
723  offset = dEdxCorrection->normOffsetTotDivideByLength[gasType];
724  }
725  double shift = dEdxCorrection->normOffsetData[gasType];
726  if(!m_isData)shift = 0;
727  return (slope*dEdxCorrection->normNzero[gasType]+offset)/(slope*nVtx+offset+shift);
728 }
729 
730 double
731 TRT_ToT_dEdx::correctToT_corrRZ(const EventContext& ctx,
732  const Trk::TrackStateOnSurface* itr,
733  double length) const
734 {
735  const Trk::MeasurementBase* trkM = itr->measurementOnTrack();
736  const Trk::TrackParameters* trkP = itr->trackParameters();
737 
738  // Check if this is RIO on track
739  // annd if yes check if is TRT Drift Circle
740  // then set the ptr
741  const InDet::TRT_DriftCircleOnTrack* driftcircle = nullptr;
742  if (trkM && trkM->type(Trk::MeasurementBaseType::RIO_OnTrack)) {
743  const Trk::RIO_OnTrack* tmpRio = static_cast<const Trk::RIO_OnTrack*>(trkM);
745  driftcircle = static_cast<const InDet::TRT_DriftCircleOnTrack*>(tmpRio);
746  }
747  }
748 
749  if (!driftcircle) {
750  return 0;
751  }
752  if (driftcircle->prepRawData()==nullptr) {
753  return 0;
754  }
755 
756  Identifier DCId = driftcircle->identify();
757  double timeOverThreshold = driftcircle->prepRawData()->timeOverThreshold();
758  if(timeOverThreshold==0) {
759  ATH_MSG_WARNING("correctToT_corrRZ(const Trk::TrackStateOnSurface *itr):: ToT="<<timeOverThreshold<<". We must cut that hit in isGoodHit() !");
760  return 0;
761  }
762  int hitPart = m_trtId->barrel_ec(DCId);
763  int StrawLayer = m_trtId->straw_layer(DCId);
764  int Layer = m_trtId->layer_or_wheel(DCId);
765  double hitRtrack = std::abs(trkP->parameters()[Trk::locR]);
766  EGasType gasType = gasTypeInStraw(ctx,itr);
767  if(gasType==kUnset) {
768  ATH_MSG_ERROR("correctToT_corrRZ(const Trk::TrackStateOnSurface *itr):: Gas type in straw is kUnset! Return ToT = 0");
769  return 0;
770  }
771 
773  if(!m_corrected) return timeOverThreshold;
774  /* else correct */
775 
776  double hitZ = driftcircle->globalPosition().z();
777  double trackx = driftcircle->globalPosition().x();
778  double tracky = driftcircle->globalPosition().y();
779  double hitPosR = std::sqrt(trackx*trackx+tracky*tracky);
780 
783  double ToTmip = 1;
784  double valToT = 0;
785  if(m_divideByL){
786  if (abs(hitPart)==1) // Barrel
787  valToT = fitFuncBarrel_corrRZL(ctx,gasType, hitRtrack, hitZ, Layer, StrawLayer);
788  else // End-cap
789  valToT = fitFuncEndcap_corrRZL(ctx,gasType, hitRtrack, hitPosR, Layer, hitZ>0?1:(hitZ<0?-1:0));
790  }else{
791  if (abs(hitPart)==1) // Barrel
792  valToT = fitFuncBarrel_corrRZ(ctx,gasType, hitRtrack, hitZ, Layer, StrawLayer);
793  else // End-cap
794  valToT = fitFuncEndcap_corrRZ(ctx,gasType, hitRtrack, hitPosR, Layer, hitZ>0?1:(hitZ<0?-1:0));
795  }
796  if (std::isinf(valToT)) return 0.;
797  if (valToT!=0) return ToTmip*timeOverThreshold/valToT;
798  return 0.;
799 }
800 
801 double
802 TRT_ToT_dEdx::fitFuncBarrel_corrRZ(const EventContext& ctx,
803  EGasType gasType,
804  double driftRadius,
805  double zPosition,
806  int Layer,
807  int StrawLayer) const
808 {
809  if (Layer == 0 && StrawLayer < 9) {
810  return fitFuncBarrelShort_corrRZ(ctx,gasType, driftRadius, zPosition, StrawLayer);
811  }
812  return fitFuncBarrelLong_corrRZ(ctx,gasType, driftRadius, zPosition, Layer, StrawLayer);
813 }
814 
815 double
816 TRT_ToT_dEdx::fitFuncEndcap_corrRZ(const EventContext& ctx,
817  EGasType gasType,
818  double driftRadius,
819  double radialPosition,
820  int Layer,
821  int sign) const
822 {
826  double T0 = fitFuncPol_corrRZ(ctx,gasType, 0,driftRadius,Layer,0,sign,2);
827  double a = fitFuncPol_corrRZ(ctx,gasType, 1,driftRadius,Layer,0,sign,2);
828  return T0+a*radialPosition;
829 }
830 
831 double
833  EGasType gasType,
834  double driftRadius,
835  double zPosition,
836  int Layer,
837  int StrawLayer) const
838 {
844  double z = std::abs(zPosition);
845  int sign=1;
846  if(zPosition<0)sign=-1;
847  double l = 704.6;
848  // define set of parameters for negative and positive z positions
849  double T0 = fitFuncPol_corrRZ(ctx,gasType, 0,driftRadius,Layer,StrawLayer,sign,0);
850  double v = fitFuncPol_corrRZ(ctx,gasType, 1,driftRadius,Layer,StrawLayer,sign,0);
851  double s = fitFuncPol_corrRZ(ctx,gasType, 2,driftRadius,Layer,StrawLayer,sign,0);
852  //_in theory_ For IEEE-compatible type double, argument causes exp to overflow if outside [-708.4, 709.8]
853  //however, overflow still seen when argument is 702; so I restrict these to -600, 600
854  const double expArg=(z-l)/s;
855  if (not inRange(expArg, -600.0,600.0)){
856  return expArg>0 ? std::numeric_limits<double>::infinity():0.;
857  }
858  return T0+(z/v)*std::exp(expArg);
859 }
860 
861 double
863  EGasType gasType,
864  double driftRadius,
865  double zPosition,
866  int StrawLayer) const
867 {
871  double z = std::abs(zPosition);
872  int sign=1;
873  if(zPosition<0)sign=-1;
874  double T0 = fitFuncPol_corrRZ(ctx,gasType, 0,driftRadius,0,StrawLayer,sign,1);
875  double b = fitFuncPol_corrRZ(ctx,gasType, 1,driftRadius,0,StrawLayer,sign,1);
876  return T0+b*z;
877 }
878 
879 double
880 TRT_ToT_dEdx::fitFuncPol_corrRZ(const EventContext& ctx,
881  EGasType gasType,
882  int parameter,
883  double driftRadius,
884  int Layer,
885  int Strawlayer,
886  int sign,
887  int set) const
888 {
890  const TRTDedxcorrection* dEdxCorrection{*readHandle};
891  if(dEdxCorrection==nullptr)
892  {
893  ATH_MSG_ERROR(" fitFuncPol_corrRZ: Could not find any dEdxCorrection in CondStore. Return zero.");
894  return 0;
895  }
896 
897  double a = 0;
898  double b = 0;
899  double c = 0;
900  double d = 0;
901  double e = 0;
902  double f = 0;
903  double r = driftRadius;
904  int offset = 0;
905  if(m_isData){
906  if(set==0){ // long straws in barrel
907  a = dEdxCorrection->paraLongCorrRZ[gasType][(6*parameter+0)*30*3+Layer*30+Strawlayer+offset];
908  b = dEdxCorrection->paraLongCorrRZ[gasType][(6*parameter+1)*30*3+Layer*30+Strawlayer+offset];
909  c = dEdxCorrection->paraLongCorrRZ[gasType][(6*parameter+2)*30*3+Layer*30+Strawlayer+offset];
910  d = dEdxCorrection->paraLongCorrRZ[gasType][(6*parameter+3)*30*3+Layer*30+Strawlayer+offset];
911  e = dEdxCorrection->paraLongCorrRZ[gasType][(6*parameter+4)*30*3+Layer*30+Strawlayer+offset];
912  f = dEdxCorrection->paraLongCorrRZ[gasType][(6*parameter+5)*30*3+Layer*30+Strawlayer+offset];
913 
914  }else if (set ==1) { // short straws in barrel
915  if(sign > 0) offset+=108;
916  a = dEdxCorrection->paraShortCorrRZ[gasType][(6*parameter+0)*9+Layer+offset];
917  b = dEdxCorrection->paraShortCorrRZ[gasType][(6*parameter+1)*9+Layer+offset];
918  c = dEdxCorrection->paraShortCorrRZ[gasType][(6*parameter+2)*9+Layer+offset];
919  d = dEdxCorrection->paraShortCorrRZ[gasType][(6*parameter+3)*9+Layer+offset];
920  e = dEdxCorrection->paraShortCorrRZ[gasType][(6*parameter+4)*9+Layer+offset];
921  f = dEdxCorrection->paraShortCorrRZ[gasType][(6*parameter+5)*9+Layer+offset];
922  }else{ // straws in endcap
923  if(sign >0) Layer+=14;
924  a = dEdxCorrection->paraEndCorrRZ[gasType][(6*parameter+0)*28+Layer];
925  b = dEdxCorrection->paraEndCorrRZ[gasType][(6*parameter+1)*28+Layer];
926  c = dEdxCorrection->paraEndCorrRZ[gasType][(6*parameter+2)*28+Layer];
927  d = dEdxCorrection->paraEndCorrRZ[gasType][(6*parameter+3)*28+Layer];
928  e = dEdxCorrection->paraEndCorrRZ[gasType][(6*parameter+4)*28+Layer];
929  f = dEdxCorrection->paraEndCorrRZ[gasType][(6*parameter+5)*28+Layer];
930  }
931  }else{
932  if(set==0){ // long straws in barrel
933  if(sign > 0) offset=1620;
934  a = dEdxCorrection->paraLongCorrRZMC[gasType][(6*parameter+0)*30*3+Layer*30+Strawlayer+offset];
935  b = dEdxCorrection->paraLongCorrRZMC[gasType][(6*parameter+1)*30*3+Layer*30+Strawlayer+offset];
936  c = dEdxCorrection->paraLongCorrRZMC[gasType][(6*parameter+2)*30*3+Layer*30+Strawlayer+offset];
937  d = dEdxCorrection->paraLongCorrRZMC[gasType][(6*parameter+3)*30*3+Layer*30+Strawlayer+offset];
938  e = dEdxCorrection->paraLongCorrRZMC[gasType][(6*parameter+4)*30*3+Layer*30+Strawlayer+offset];
939  f = dEdxCorrection->paraLongCorrRZMC[gasType][(6*parameter+5)*30*3+Layer*30+Strawlayer+offset];
940  }else if (set ==1) { // short straws in barrel
941  if(sign > 0) offset+=108;
942  a = dEdxCorrection->paraShortCorrRZMC[gasType][(6*parameter+0)*9+Layer+offset];
943  b = dEdxCorrection->paraShortCorrRZMC[gasType][(6*parameter+1)*9+Layer+offset];
944  c = dEdxCorrection->paraShortCorrRZMC[gasType][(6*parameter+2)*9+Layer+offset];
945  d = dEdxCorrection->paraShortCorrRZMC[gasType][(6*parameter+3)*9+Layer+offset];
946  e = dEdxCorrection->paraShortCorrRZMC[gasType][(6*parameter+4)*9+Layer+offset];
947  f = dEdxCorrection->paraShortCorrRZMC[gasType][(6*parameter+5)*9+Layer+offset];
948  }else{ // straws in endcap
949  if(sign >0) Layer+=14;
950  a = dEdxCorrection->paraEndCorrRZMC[gasType][(6*parameter+0)*28+Layer];
951  b = dEdxCorrection->paraEndCorrRZMC[gasType][(6*parameter+1)*28+Layer];
952  c = dEdxCorrection->paraEndCorrRZMC[gasType][(6*parameter+2)*28+Layer];
953  d = dEdxCorrection->paraEndCorrRZMC[gasType][(6*parameter+3)*28+Layer];
954  e = dEdxCorrection->paraEndCorrRZMC[gasType][(6*parameter+4)*28+Layer];
955  f = dEdxCorrection->paraEndCorrRZMC[gasType][(6*parameter+5)*28+Layer];
956  }
957  }
958  return a+b*r+c*r*r+d*r*r*r+e*r*r*r*r+f*r*r*r*r*r;
959 }
960 
961 double
962 TRT_ToT_dEdx::fitFuncEndcap_corrRZL(const EventContext& ctx,
963  EGasType gasType,
964  double driftRadius,
965  double radialPosition,
966  int Layer,
967  int sign) const
968 {
969  /*
970  * T(r,R) = T0(r)+ a(r)*R
971  */
972 
974  const TRTDedxcorrection* dEdxCorrection{*readHandle};
975  if(dEdxCorrection==nullptr) {
976  ATH_MSG_ERROR(" fitFuncEndcap_corrRZL: Could not find any dEdxCorrection in CondStore. Return zero.");
977  return 0;
978  }
979 
980  double r = std::abs(driftRadius);
981  double a,b,c,d,e,f,g,h,i;
982  if(sign >0) Layer+=14;
983  if(m_isData){
984  a = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(0)*28+Layer];
985  b = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(1)*28+Layer];
986  c = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(2)*28+Layer];
987  d = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(3)*28+Layer];
988  e = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(4)*28+Layer];
989  f = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(5)*28+Layer];
990  g = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(6)*28+Layer];
991  h = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(7)*28+Layer];
992  i = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(8)*28+Layer];
993  }else{
994  a = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(0)*28+Layer];
995  b = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(1)*28+Layer];
996  c = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(2)*28+Layer];
997  d = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(3)*28+Layer];
998  e = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(4)*28+Layer];
999  f = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(5)*28+Layer];
1000  g = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(6)*28+Layer];
1001  h = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(7)*28+Layer];
1002  i = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(8)*28+Layer];
1003  }
1004 
1005  double T1 = b*r+c*r*r+d*r*r*r+e*r*r*r*r+f*r*r*r*r*r;
1006  double slope = g+h*r+i*r*r;
1007  double T0 = a;
1008 
1009  return T0+T1+slope*radialPosition;
1010 }
1011 
1012 double
1013 TRT_ToT_dEdx::fitFuncBarrel_corrRZL(const EventContext& ctx,
1014  EGasType gasType,
1015  double driftRadius,
1016  double zPosition,
1017  int Layer,
1018  int Strawlayer) const
1019 {
1020  /*
1021  * T(r,z) = T0(r)+ b(r)*z*z
1022  */
1024  const TRTDedxcorrection* dEdxCorrection{*readHandle};
1025  if(dEdxCorrection==nullptr) {
1026  ATH_MSG_ERROR(" fitFuncBarrel_corrRZL: Could not find any dEdxCorrection in CondStore. Return zero.");
1027  return 0;
1028  }
1029 
1030  double a,b,c,d,e,f,g;
1031  if (Layer==0 && Strawlayer<9) { // short straws
1032  if (m_isData){
1033  a = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(0)*9+Strawlayer];
1034  b = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(1)*9+Strawlayer];
1035  c = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(2)*9+Strawlayer];
1036  d = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(3)*9+Strawlayer];
1037  e = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(4)*9+Strawlayer];
1038  f = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(5)*9+Strawlayer];
1039  g = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(6)*9+Strawlayer];
1040  } else {
1041  a = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(0)*9+Strawlayer];
1042  b = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(1)*9+Strawlayer];
1043  c = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(2)*9+Strawlayer];
1044  d = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(3)*9+Strawlayer];
1045  e = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(4)*9+Strawlayer];
1046  f = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(5)*9+Strawlayer];
1047  g = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(6)*9+Strawlayer];
1048  }
1049  } else {
1050  if (m_isData) {
1051  a = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(0)*30*3+Layer*30+Strawlayer];
1052  b = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(1)*30*3+Layer*30+Strawlayer];
1053  c = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(2)*30*3+Layer*30+Strawlayer];
1054  d = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(3)*30*3+Layer*30+Strawlayer];
1055  e = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(4)*30*3+Layer*30+Strawlayer];
1056  f = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(5)*30*3+Layer*30+Strawlayer];
1057  g = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(6)*30*3+Layer*30+Strawlayer];
1058  } else {
1059  a = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(0)*30*3+Layer*30+Strawlayer];
1060  b = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(1)*30*3+Layer*30+Strawlayer];
1061  c = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(2)*30*3+Layer*30+Strawlayer];
1062  d = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(3)*30*3+Layer*30+Strawlayer];
1063  e = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(4)*30*3+Layer*30+Strawlayer];
1064  f = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(5)*30*3+Layer*30+Strawlayer];
1065  g = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(6)*30*3+Layer*30+Strawlayer];
1066  }
1067  }
1068  double z = std::abs(zPosition);
1069  double r = std::abs(driftRadius);
1070  double T0neg=a;
1071  double T0pos=b;
1072  double T1 = std::exp(-c*r*r)+d*r;
1073  double slope = e*r+f*r*r+g*r*r*r;
1074  double result;
1075  result = T0neg+T1+slope*z;
1076  if (zPosition>0) result = T0pos+T1+slope*z;
1077 
1078  return result;
1079 }
1080 
1081 double
1083  const Trk::TrackStateOnSurface* itr) const
1084 {
1086  const TRTDedxcorrection* dEdxCorrection{*readHandle};
1087 
1088  const Trk::MeasurementBase* trkM = itr->measurementOnTrack();
1089 
1090  // Check if this is RIO on track
1091  // and if yes check if is TRT Drift Circle
1092  // then set the ptr
1093  const InDet::TRT_DriftCircleOnTrack* driftcircle = nullptr;
1094  if (trkM && trkM->type(Trk::MeasurementBaseType::RIO_OnTrack)) {
1095  const Trk::RIO_OnTrack* tmpRio = static_cast<const Trk::RIO_OnTrack*>(trkM);
1097  driftcircle = static_cast<const InDet::TRT_DriftCircleOnTrack*>(tmpRio);
1098  }
1099  }
1100 
1101  if (!driftcircle) {
1102  return 0.;
1103  }
1104 
1105  const Trk::TrackParameters* trkP = itr->trackParameters();
1106  Identifier DCId = driftcircle->identify();
1107  int isHT = driftcircle->highLevel();
1108  int isShared=0;
1109 
1110  const Trk::RIO_OnTrack* hit_trt = nullptr;
1111  if (trkM && trkM->type(Trk::MeasurementBaseType::RIO_OnTrack)) {
1112  hit_trt = static_cast<const Trk::RIO_OnTrack*>(trkM);
1113  }
1114 
1115  if (hit_trt) {
1116  if ( m_assoTool->isShared(*(hit_trt->prepRawData())) ) isShared=1;
1117  }
1118  int layer = m_trtId->layer_or_wheel(DCId);
1119  int phimodule = m_trtId->phi_module(DCId);
1120  int HitPart = m_trtId->barrel_ec(DCId);
1121  double Trt_HitTheta = trkP->parameters()[Trk::theta];
1122  double trackEta = -log(tan(Trt_HitTheta/2.0));
1123 
1124  double localOccupancy = m_localOccTool->LocalOccupancy(ctx, trackEta, phimodule);
1125  double ToTmip = 1;
1126  double valToT = 1.;
1127 
1128  double p0=0., p1=0., p2=0., p0_flat=0.;
1129 
1130  //the calibration array is structured as follows (hence the non intuitive numbers)
1131  //the first 36 parameters are for barrel, the last 168 for the endcap
1132  //each of these subarrays is divided into smaller subarrays of length 12 (barrel has 3 and endcap 14 layers)
1133  int nBarrelLayers = 3, nEndcapLayers = 14;
1134  //each layer has 3 parameters (function 2nd order), so a subarray for each layer has 3 parameters
1135  int nParametersPerLayer = 3;
1136  //this subarray for every layer exits for HT/LT hits, so 6 parameters
1137  int nHTConfigurations = 2;
1138  //this subarray exists for shared/non-shared hits, so 12 parameters
1139  int nSharedConfigurations = 2;
1140  int num =
1141  layer * nParametersPerLayer +
1142  isHT * ((abs(HitPart) - 1) * (nEndcapLayers - nBarrelLayers) *
1143  nParametersPerLayer +
1144  nBarrelLayers * nParametersPerLayer) +
1145  isShared * ((abs(HitPart) - 1) * (nEndcapLayers - nBarrelLayers) *
1146  nParametersPerLayer * nHTConfigurations +
1147  nBarrelLayers * nParametersPerLayer * nHTConfigurations) +
1148  (abs(HitPart) - 1) * nParametersPerLayer * nBarrelLayers *
1149  nHTConfigurations * nSharedConfigurations;
1150  //number for that given hit for non-shared conditions
1151  int num_flat = layer * 3 +
1152  isHT * ((abs(HitPart) - 1) * (nEndcapLayers - nBarrelLayers) *
1153  nParametersPerLayer +
1154  nBarrelLayers * nParametersPerLayer) +
1155  (abs(HitPart) - 1) * nParametersPerLayer * nBarrelLayers *
1156  nHTConfigurations * nSharedConfigurations;
1157 
1158  p0 = dEdxCorrection->hitOccPar[num];
1159  p1 = dEdxCorrection->hitOccPar[num+1];
1160  p2 = dEdxCorrection->hitOccPar[num+2];
1161  p0_flat = dEdxCorrection->hitOccPar[num_flat];
1162 
1163  //fitting function is a polynomial 2nd order f(x)=a+b*x+x^2
1164  //Hence the tot value is divided by the value of the function
1165  //multiplied to the non-shared intercept
1166  valToT = p0_flat/(p0+p1*localOccupancy+p2*localOccupancy*localOccupancy);
1167 
1168  return ToTmip*valToT;
1169 }
1170 
1171 double
1173  const Trk::Track* track,
1174  bool useHitsHT,
1175  std::optional<float> localOccupancy) const
1176 {
1178  const TRTDedxcorrection* dEdxCorrection{*readHandle};
1179 
1180  double corr=-999.;
1181 
1182  double trackOcc = localOccupancy != std::nullopt
1183  ? *localOccupancy
1184  : m_localOccTool->LocalOccupancy(ctx, *track);
1185  const Trk::TrackParameters* perigee = track->perigeeParameters();
1186  const AmgVector(Trk::TrackParameters::dim)& parameterVector = perigee->parameters();
1187  double theta = parameterVector[Trk::theta];
1188  double trackEta = -log(tan(theta/2.0));
1189 
1190  // the correction constants were determined in 100 bins of 0.04 in the eta range between -2 and 2
1191  int index = int(25*(trackEta+2.)); // determine the bin of the corrections
1192  if (index < 0) index = 0; // lower bound corresponding to eta = -2
1193  else if (index > 99) index = 99; // upper bound corresponding to eta = +2
1194 
1195  //Function of the from f(x)=a+b*x+c*x^2 was used as a fitting function, separately for tracks with and without excluding HT hits
1196  if (useHitsHT) {
1197  corr=dEdxCorrection->trackOccPar0[index]+dEdxCorrection->trackOccPar1[index]*trackOcc+dEdxCorrection->trackOccPar2[index]*pow(trackOcc,2);
1198  } else {
1199  corr=dEdxCorrection->trackOccPar0NoHt[index]+dEdxCorrection->trackOccPar1NoHt[index]*trackOcc+dEdxCorrection->trackOccPar2NoHt[index]*pow(trackOcc,2);
1200  }
1201 
1202  if (corr != 0) {
1203  return 1./corr;
1204  }
1205  return 0.;
1206 }
1207 
1209  if (trackState->type(Trk::TrackStateOnSurface::Outlier)) return 0.; //Outliers
1210 
1211  const Trk::MeasurementBase* trkM = trackState->measurementOnTrack();
1212  if (!trkM) {
1213  return 0.;
1214  }
1215 
1216  // Check if this is RIO on track
1217  // and if yes check if is TRT Drift Circle
1218  // then set the ptr
1219  const InDet::TRT_DriftCircleOnTrack* driftcircle = nullptr;
1221  const Trk::RIO_OnTrack* tmpRio = static_cast<const Trk::RIO_OnTrack*>(trkM);
1223  driftcircle = static_cast<const InDet::TRT_DriftCircleOnTrack*>(tmpRio);
1224  }
1225  }
1226 
1227  if (!driftcircle) {
1228  return 0.;
1229  }
1230 
1231  const Trk::TrackParameters* trkP = trackState->trackParameters();
1232  if(trkP==nullptr) return 0.;
1233 
1234  double Trt_Rtrack = std::abs(trkP->parameters()[Trk::locR]);
1235  double Trt_HitTheta = trkP->parameters()[Trk::theta];
1236  double Trt_HitPhi = trkP->parameters()[Trk::phi];
1237  Identifier DCId = driftcircle->identify();
1238  int HitPart = std::abs(identifier->barrel_ec(DCId));
1239  const InDetDD::TRT_BaseElement* element = driftcircle->detectorElement();
1240  double strawphi = element->center(DCId).phi();
1241 
1242  // check if track is an outlier
1243  if (Trt_Rtrack >= 2.0) {
1244  return 0.;
1245  }
1246 
1247  double length=0;
1248  if (HitPart == 1) { //Barrel
1249  length = 2*std::sqrt(4-Trt_Rtrack*Trt_Rtrack)*1./std::abs(std::sin(Trt_HitTheta));
1250  } else if (HitPart == 2) { //EndCap
1251  length = 2*std::sqrt(4-Trt_Rtrack*Trt_Rtrack)*1./std::sqrt(1-std::sin(Trt_HitTheta)*std::sin(Trt_HitTheta)*std::cos(Trt_HitPhi-strawphi)*std::cos(Trt_HitPhi-strawphi));
1252  } else {
1253  // This should never happen
1254  throw std::runtime_error("Unknown barrel/endcap identifier: " + std::to_string(HitPart) + ". Must be 1(Barrel) or 2(Endcap)");
1255  }
1256 
1257  return length;
1258 }
TRT_ToT_dEdx::m_isData
bool m_isData
Definition: TRT_ToT_dEdx.h:91
TRT_ToT_dEdx::m_TRTStrawSummaryTool
ToolHandle< ITRT_StrawStatusSummaryTool > m_TRTStrawSummaryTool
Definition: TRT_ToT_dEdx.h:52
beamspotman.r
def r
Definition: beamspotman.py:676
Trk::TrackStateOnSurface::trackParameters
const TrackParameters * trackParameters() const
return ptr to trackparameters const overload
TRT_ToT_dEdx::m_useZeroRHitCut
bool m_useZeroRHitCut
Definition: TRT_ToT_dEdx.h:97
TRT_ToT_dEdx::usedHits
virtual double usedHits(const EventContext &ctx, const Trk::Track *track, bool useHThits=true) const override final
function to calculate number of used hits
Definition: TRT_ToT_dEdx.cxx:343
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
TRT_ToT_dEdx::isGoodHit
bool isGoodHit(const EventContext &ctx, const Trk::TrackStateOnSurface *trackState, bool useHitsHT, double &length) const
function to define what is a good hit to be used for dEdx calculation cuts on track level can be made...
Definition: TRT_ToT_dEdx.cxx:101
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
InDet::TRT_DriftCircleOnTrack::prepRawData
virtual const TRT_DriftCircle * prepRawData() const override final
returns the PrepRawData - is a TRT_DriftCircle in this scope
Definition: TRT_DriftCircleOnTrack.h:202
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
TRT_ToT_dEdx::kTrackBased
@ kTrackBased
Definition: TRT_ToT_dEdx.h:60
get_generator_info.result
result
Definition: get_generator_info.py:21
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
TRT_ToT_dEdx::getProb
double getProb(const EventContext &ctx, const Trk::TrackStateOnSurface *itr, const double dEdx_obs, const double pTrk, Trk::ParticleHypothesis hypothesis, int nUsedHits) const
function to calculate likelihood from prediction and resolution
Definition: TRT_ToT_dEdx.cxx:422
TRT_ToT_dEdx::~TRT_ToT_dEdx
virtual ~TRT_ToT_dEdx()
Virtual destructor.
python.Constants.FATAL
int FATAL
Definition: Control/AthenaCommon/python/Constants.py:19
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
TRT_ToT_dEdx::m_divideByL
bool m_divideByL
Definition: TRT_ToT_dEdx.h:76
Surface.h
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
TRT_ToT_dEdx::EGasType
EGasType
Definition: TRT_ToT_dEdx.h:61
index
Definition: index.py:1
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
hist_file_dump.d
d
Definition: hist_file_dump.py:137
TRT_ToT_dEdx::fitFuncBarrelShort_corrRZ
double fitFuncBarrelShort_corrRZ(const EventContext &ctx, EGasType gasType, double driftRadius, double zPosition, int StrawLayer) const
function called by fitFuncBarrel_corrRZ for short straws
Definition: TRT_ToT_dEdx.cxx:862
InDet::TRT_DriftCircle::timeOverThreshold
double timeOverThreshold() const
returns Time over threshold in ns
TRT_ToT_dEdx::kKrypton
@ kKrypton
Definition: TRT_ToT_dEdx.h:61
TRT_ToT_dEdx::m_useTrackPartWithGasType
int m_useTrackPartWithGasType
Definition: TRT_ToT_dEdx.h:78
accumulate
bool accumulate(AccumulateMap &map, std::vector< module_t > const &modules, FPGATrackSimMatrixAccumulator const &acc)
Accumulates an accumulator (e.g.
Definition: FPGATrackSimMatrixAccumulator.cxx:22
theta
Scalar theta() const
theta method
Definition: AmgMatrixBasePlugin.h:71
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
TRT_ID.h
This is an Identifier helper class for the TRT subdetector. This class is a factory for creating comp...
SG::ReadDecorHandle::isPresent
bool isPresent() const
Is the referenced container present in SG?
TRT_ToT_dEdx::getTest
virtual double getTest(const EventContext &ctx, const double dEdx_obs, const double pTrk, Trk::ParticleHypothesis hypothesis, Trk::ParticleHypothesis antihypothesis, int nUsedHits) const override final
function to calculate likelihood ratio test
Definition: TRT_ToT_dEdx.cxx:490
TRT_ToT_dEdx::dEdx
virtual double dEdx(const EventContext &ctx, const Trk::Track *track, bool useHThits, std::optional< float > localOccupancy=std::nullopt) const override final
function to calculate sum ToT normalised to number of used hits
Definition: TRT_ToT_dEdx.cxx:156
Trk::TrackStateOnSurface::measurementOnTrack
const MeasurementBase * measurementOnTrack() const
returns MeasurementBase const overload
Trk::RIO_OnTrack::rioType
virtual bool rioType(RIO_OnTrackType::Type type) const =0
Method checking the Rio On Track type.
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
IOVDbNamespace::inRange
bool inRange(const NumericType &val, const std::pair< NumericType, NumericType > &range)
Function to check whether a number is in the inclusive range, given as a pair.
Definition: IOVDbCoolFunctions.h:42
Trk::RIO_OnTrack
Definition: RIO_OnTrack.h:70
InDet::TRT_DriftCircleOnTrack::highLevel
bool highLevel() const
returns true if the high level threshold was passed
Definition: TRT_DriftCircleOnTrack.h:234
Trk::locR
@ locR
Definition: ParamDefs.h:50
TRT_ToT_dEdx::trackOccupancyCorrection
double trackOccupancyCorrection(const EventContext &ctx, const Trk::Track *track, bool useHThits, std::optional< float > localOccupancy) const
Definition: TRT_ToT_dEdx.cxx:1172
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
xAOD::identifier
identifier
Definition: UncalibratedMeasurement_v1.cxx:15
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
covarianceTool.prob
prob
Definition: covarianceTool.py:678
InDet::TRT_DriftCircleOnTrack
Definition: TRT_DriftCircleOnTrack.h:53
InDet::TRT_DriftCircleOnTrack::detectorElement
virtual const InDetDD::TRT_BaseElement * detectorElement() const override final
returns the detector element, assoicated with the PRD of this class
Definition: TRT_DriftCircleOnTrack.h:224
DataHandle.h
Trk::ParametersCommon::dim
static constexpr int dim
Definition: ParametersCommon.h:50
python.RingerConstants.Layer
Layer
Definition: RingerConstants.py:42
ReadCondHandle.h
TRT_ToT_dEdx::fitFuncBarrelLong_corrRZ
double fitFuncBarrelLong_corrRZ(const EventContext &ctx, EGasType gasType, double driftRadius, double zPosition, int Layer, int StrawLayer) const
function called by fitFuncBarrel_corrRZ for long straws
Definition: TRT_ToT_dEdx.cxx:832
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
Trk::TrackStateOnSurface::Outlier
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
Definition: TrackStateOnSurface.h:122
TRT_ToT_dEdx::correctToT_corrRZ
double correctToT_corrRZ(const EventContext &ctx, const Trk::TrackStateOnSurface *itr, double length) const
main function to correct ToT values on hit level as a function of track radius and z-position
Definition: TRT_ToT_dEdx.cxx:731
Trk::ParticleHypothesis
ParticleHypothesis
Definition: ParticleHypothesis.h:25
TRT_ToT_dEdx::fitFuncBarrel_corrRZL
double fitFuncBarrel_corrRZL(const EventContext &ctx, EGasType gasType, double driftRadius, double zPosition, int Layer, int StrawLayer) const
function to compute correction factor in barrel region
Definition: TRT_ToT_dEdx.cxx:1013
Trk::TrackStateOnSurface::type
bool type(const TrackStateOnSurfaceType type) const
Use this method to find out if the TSoS is of a certain type: i.e.
TRT_ToT_dEdx::kArgon
@ kArgon
Definition: TRT_ToT_dEdx.h:61
TRT_ToT_dEdx::kUnset
@ kUnset
Definition: TRT_ToT_dEdx.h:61
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
TRT_ToT_dEdx::fitFuncBarrel_corrRZ
double fitFuncBarrel_corrRZ(const EventContext &ctx, EGasType gas, double driftRadius, double zPosition, int Layer, int StrawLayer) const
function to compute correction factor in barrel region
Definition: TRT_ToT_dEdx.cxx:802
SG::ReadDecorHandle
Handle class for reading a decoration on an object.
Definition: StoreGate/StoreGate/ReadDecorHandle.h:94
TRT_ToT_dEdx::m_assoTool
ToolHandle< Trk::IPRD_AssociationTool > m_assoTool
Definition: TRT_ToT_dEdx.h:70
StdJOSetup.msgSvc
msgSvc
Provide convenience handles for various services.
Definition: StdJOSetup.py:36
lumiFormat.i
int i
Definition: lumiFormat.py:92
z
#define z
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
python.CaloCondTools.g
g
Definition: CaloCondTools.py:15
beamspotman.n
n
Definition: beamspotman.py:731
Trk::theta
@ theta
Definition: ParamDefs.h:72
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
Trk::electron
@ electron
Definition: ParticleHypothesis.h:27
extractSporadic.h
list h
Definition: extractSporadic.py:97
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
AmgVector
AmgVector(4) T2BSTrackFilterTool
Definition: T2BSTrackFilterTool.cxx:114
TRT_ToT_dEdx::m_correctionType
int m_correctionType
Definition: TRT_ToT_dEdx.h:80
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
Trk::driftRadius
@ driftRadius
trt, straws
Definition: ParamDefs.h:59
TRT_ToT_dEdx::kHitBased
@ kHitBased
Definition: TRT_ToT_dEdx.h:60
TRT_ToT_dEdx::initialize
virtual StatusCode initialize() override
AlgTool initailize method.
Definition: TRT_ToT_dEdx.cxx:70
calibdata.exception
exception
Definition: calibdata.py:496
TRT_ToT_dEdx::m_toolScenario
int m_toolScenario
Definition: TRT_ToT_dEdx.h:79
sign
int sign(int a)
Definition: TRT_StrawNeighbourSvc.h:127
TRT_ToT_dEdx::m_trackConfig_minRtrack
float m_trackConfig_minRtrack
Definition: TRT_ToT_dEdx.h:95
TRTDedxcorrection
Definition: TRTDedxcorrection.h:9
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Trk::MeasurementBase::type
virtual bool type(MeasurementBaseType::Type type) const =0
Interface method checking the type.
TRT_ToT_dEdx.h
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
Trk::ParametersBase
Definition: ParametersBase.h:55
TRT_ToT_dEdx::mass
double mass(const EventContext &ctx, const Trk::TrackStateOnSurface *itr, const double pTrk, double dEdx) const
function to extract most likely mass in bg [0,3]
Definition: TRT_ToT_dEdx.cxx:593
TRT_DriftCircleOnTrack.h
TRT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: TRT_ID.h:866
TRT_ID::straw_layer
int straw_layer(const Identifier &id) const
Definition: TRT_ID.h:893
TRT_ToT_dEdx::kAlgStandard
@ kAlgStandard
Definition: TRT_ToT_dEdx.h:59
TRT_ToT_dEdx::kXenon
@ kXenon
Definition: TRT_ToT_dEdx.h:61
DataVector< const Trk::TrackStateOnSurface >
TRT_ID::layer_or_wheel
int layer_or_wheel(const Identifier &id) const
Definition: TRT_ID.h:884
beamspotman.stat
stat
Definition: beamspotman.py:266
TRT_ToT_dEdx::m_rdhkEvtInfo
SG::ReadDecorHandleKey< xAOD::EventInfo > m_rdhkEvtInfo
Definition: TRT_ToT_dEdx.h:64
Trk::MeasurementBase::localCovariance
const Amg::MatrixX & localCovariance() const
Interface method to get the localError.
Definition: MeasurementBase.h:138
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:224
Trk::RIO_OnTrackType::TRT_DriftCircle
@ TRT_DriftCircle
Definition: RIO_OnTrack.h:59
trigbs_pickEvents.num
num
Definition: trigbs_pickEvents.py:76
TRT_ToT_dEdx::m_trtId
const TRT_ID * m_trtId
Definition: TRT_ToT_dEdx.h:68
Trk::MeasurementBase
Definition: MeasurementBase.h:58
Trk::ParticleMasses::mass
constexpr double mass[PARTICLEHYPOTHESES]
the array of masses
Definition: ParticleHypothesis.h:53
TRT_ToT_dEdx::m_ReadKey
SG::ReadCondHandleKey< TRTDedxcorrection > m_ReadKey
Definition: TRT_ToT_dEdx.h:245
TRT_ToT_dEdx::fitFuncEndcap_corrRZ
double fitFuncEndcap_corrRZ(const EventContext &ctx, EGasType gas, double driftRadius, double rPosition, int Layer, int sign) const
function to compute correction factor in endcap region
Definition: TRT_ToT_dEdx.cxx:816
TRT_ToT_dEdx::predictdEdx
double predictdEdx(const EventContext &ctx, const Trk::TrackStateOnSurface *itr, const double pTrk, Trk::ParticleHypothesis hypothesis) const
function to calculate expectation value for dEdx using BB fit
Definition: TRT_ToT_dEdx.cxx:513
Trk::TrackStateOnSurface
represents the track state (measurement, material, fit parameters and quality) at a surface.
Definition: TrackStateOnSurface.h:71
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
TRT_ToT_dEdx::correctNormalization
double correctNormalization(const EventContext &ctx, double nVtx=-1) const
correct overall dEdx normalization on track level
Definition: TRT_ToT_dEdx.cxx:707
TRT_ToT_dEdx::m_trackConfig_maxRtrack
float m_trackConfig_maxRtrack
Definition: TRT_ToT_dEdx.h:94
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
TRT_ToT_dEdx::setDefaultConfiguration
void setDefaultConfiguration()
Definition: TRT_ToT_dEdx.cxx:51
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
TRT_ID::phi_module
int phi_module(const Identifier &id) const
Definition: TRT_ID.h:875
Trk::RIO_OnTrack::prepRawData
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
TRT_ToT_dEdx::calculateTrackLengthInStraw
static double calculateTrackLengthInStraw(const Trk::TrackStateOnSurface *trackState, const TRT_ID *identifier)
Definition: TRT_ToT_dEdx.cxx:1208
Trk::MeasurementBaseType::RIO_OnTrack
@ RIO_OnTrack
Definition: MeasurementBase.h:49
TRT_ToT_dEdx::m_localOccTool
ToolHandle< InDet::ITRT_LocalOccupancy > m_localOccTool
Definition: TRT_ToT_dEdx.h:71
REPORT_MESSAGE
#define REPORT_MESSAGE(LVL)
Report a message.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:365
Trk::MeasurementBase::localParameters
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
Definition: MeasurementBase.h:132
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
python.PyAthena.v
v
Definition: PyAthena.py:157
TRT_ToT_dEdx::fitFuncPol_corrRZ
double fitFuncPol_corrRZ(const EventContext &ctx, EGasType gasType, int parameter, double driftRadius, int Layer, int Strawlayer, int sign, int set) const
function called by fitFuncBarrel_corrRZ and fitFuncEndcap_corrRZ
Definition: TRT_ToT_dEdx.cxx:880
DeMoScan.index
string index
Definition: DeMoScan.py:362
TRT_ToT_dEdx::fitFuncEndcap_corrRZL
double fitFuncEndcap_corrRZL(const EventContext &ctx, EGasType gasType, double driftRadius, double radialPosition, int Layer, int sign) const
function to compute correction factor in endcap region
Definition: TRT_ToT_dEdx.cxx:962
TRT_ID
Definition: TRT_ID.h:84
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
a
TList * a
Definition: liststreamerinfos.cxx:10
h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
TRT_ToT_dEdx::m_corrected
bool m_corrected
Definition: TRT_ToT_dEdx.h:75
TRT_ToT_dEdx::hitOccupancyCorrection
double hitOccupancyCorrection(const EventContext &ctx, const Trk::TrackStateOnSurface *itr) const
Definition: TRT_ToT_dEdx.cxx:1082
InDetDD::TRT_BaseElement::center
virtual const Amg::Vector3D & center() const override final
Element Surface: center of a straw layer.
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
Trk::RIO_OnTrack::identify
virtual Identifier identify() const final
return the identifier -extends MeasurementBase
Definition: RIO_OnTrack.h:155
TRT_ToT_dEdx::kAlgReweight
@ kAlgReweight
Definition: TRT_ToT_dEdx.h:59
convertTimingResiduals.offset
offset
Definition: convertTimingResiduals.py:71
TRT_ToT_Corrections.h
ReadDecorHandle.h
Handle class for reading a decoration on an object.
timeOverThreshold
double timeOverThreshold(unsigned int m_word)
Definition: driftCircle.h:116
Trk::phi
@ phi
Definition: ParamDefs.h:81
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
ReadHandle.h
Handle class for reading from StoreGate.
InDet::TRT_DriftCircleOnTrack::globalPosition
virtual const Amg::Vector3D & globalPosition() const override final
return the global position of this RIO_OnTrack
Definition: TRT_DriftCircleOnTrack.cxx:160
AthAlgTool
Definition: AthAlgTool.h:26
CaloNoise_fillDB.mu
mu
Definition: CaloNoise_fillDB.py:53
error
Definition: IImpactPoint3dEstimator.h:70
TRT_ToT_dEdx::TRT_ToT_dEdx
TRT_ToT_dEdx(const std::string &, const std::string &, const IInterface *)
AlgTool like constructor.
Definition: TRT_ToT_dEdx.cxx:36
python.compressB64.c
def c
Definition: compressB64.py:93
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
TRT_ToT_dEdx::kAlgReweightTrunkOne
@ kAlgReweightTrunkOne
Definition: TRT_ToT_dEdx.h:59
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
TRT_ToT_dEdx::gasTypeInStraw
EGasType gasTypeInStraw(const EventContext &ctx, const Trk::TrackStateOnSurface *itr) const
return gas type for that hit
Definition: TRT_ToT_dEdx.cxx:645
TauGNNUtils::Variables::Track::trackEta
bool trackEta(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
Definition: TauGNNUtils.cxx:475
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
TRT_ToT_dEdx::m_nTrunkateHits
unsigned int m_nTrunkateHits
Definition: TRT_ToT_dEdx.h:99
InDetDD::TRT_BaseElement
Definition: TRT_BaseElement.h:57