8 #include "GaudiKernel/MsgStream.h"
9 #include "GaudiKernel/IToolSvc.h"
16 #include "GaudiKernel/IChronoStatSvc.h"
29 inRange(
const double val,
const double lo,
const double hi){
30 return (
val>lo) and (
val<hi);
37 declareInterface<ITRT_ToT_dEdx>(
this);
57 return StatusCode::FAILURE;
69 ATH_MSG_ERROR(
"Property TRT_dEdx_useTrackPartWithGasType has an invalid "
71 return StatusCode::FAILURE;
74 return StatusCode::SUCCESS;
104 if(trkP==
nullptr)
return false;
106 double Trt_Rtrack = std::abs(trkP->parameters()[
Trk::locR]);
120 if (TrtHl==1)
return false;
136 std::optional<float> localOccupancy)
const
150 double mu = eventInfoDecor(0);
152 nVtx = 1.3129 + 0.716194*
mu + (-0.00475074)*
mu*
mu;
155 nVtx = 1.0897 + 0.748287*
mu + (-0.00421788)*
mu*
mu;
169 size_t vtos_size = vtsos->
size();
170 double correctionFactor = 1.;
173 std::vector<double> vecToT;
174 vecToT.reserve(vtos_size);
177 for ( ; itr!=itre ; ++itr) {
183 ToT_correct*=correctionFactor;
185 vecToT.push_back(ToT_correct);
189 sort(vecToT.begin(), vecToT.end());
190 size_t nhits = vecToT.size();
197 if (nhits<1)
return 0.0;
205 ToTsum*=correctionFactor;
210 std::vector<double> vecToT_Xe;
211 vecToT_Xe.reserve(vtos_size/2);
212 std::vector<double> vecToT_Ar;
213 vecToT_Ar.reserve(vtos_size/2);
214 std::vector<double> vecToT_Kr;
218 "dEdX_Estimator():: Using m_toolScenario="
219 <<
m_toolScenario <<
" scenario m_useTrackPartWithGasType is set to"
221 <<
", but kUnset is requiered. Check you tool configuration.");
224 for ( ; itr!=itre ; ++itr) {
232 ToT_correct*=correctionFactor;
234 vecToT_Xe.push_back(ToT_correct);
235 }
else if (gasType==
kArgon) {
236 vecToT_Ar.push_back(ToT_correct);
238 vecToT_Kr.push_back(ToT_correct);
240 ATH_MSG_ERROR(
"dEdX_Estimator():: During scenario kAlgReweight variable gasTypeInStraw got value kUnset.");
245 sort(vecToT_Xe.begin(), vecToT_Xe.end());
246 sort(vecToT_Ar.begin(), vecToT_Ar.end());
247 sort(vecToT_Kr.begin(), vecToT_Kr.end());
249 size_t nhitsXe = vecToT_Xe.size();
250 size_t nhitsAr = vecToT_Ar.size();
251 size_t nhitsKr = vecToT_Kr.size();
261 if (nhitsXe>0 && vecToT_Xe.at(nhitsXe-1)>maxToT) {
263 maxToT = vecToT_Xe.at(nhitsXe-1);
265 if(nhitsAr>0 && vecToT_Ar.at(nhitsAr-1)>maxToT){
267 maxToT = vecToT_Ar.at(nhitsAr-1);
269 if (nhitsKr>0 && vecToT_Kr.at(nhitsKr-1)>maxToT) {
275 }
else if (trunkGas==
kArgon) {
283 size_t nhits = nhitsXe + nhitsAr + nhitsKr;
284 if(nhits<1)
return 0.0;
289 for (
size_t i = 0;
i < nhitsXe;
i++) {
290 ToTsumXe+=vecToT_Xe[
i];
292 for (
size_t i = 0;
i < nhitsAr;
i++) {
293 ToTsumAr+=vecToT_Ar[
i];
295 for (
size_t i = 0;
i < nhitsKr;
i++) {
296 ToTsumKr+=vecToT_Kr[
i];
299 ToTsumXe = (nhitsXe>0) ? ToTsumXe/nhitsXe : 0;
300 ToTsumAr = (nhitsAr>0) ? ToTsumAr/nhitsAr : 0;
301 ToTsumKr = (nhitsKr>0) ? ToTsumKr/nhitsKr : 0;
302 double ToTsum = ToTsumXe*nhitsXe + ToTsumAr*nhitsAr + ToTsumKr*nhitsKr;
310 ToTsum *= correctionFactor;
322 bool useHitsHT)
const
341 for ( ; itr!=itre ; ++itr) {
357 "usedHits_Estimator():: Using m_toolScenario="
358 <<
m_toolScenario <<
" scenario m_useTrackPartWithGasType is set to "
360 <<
", but kUnset is required. Check you tool configuration.");
363 for ( ; itr!=itre ; ++itr) {
369 }
else if (gasType==
kArgon) {
374 ATH_MSG_ERROR(
"usedHits_Estimator():: During scenario kAlgReweight variable gasTypeInStraw got value kUnset.");
385 if(nhitsXe>0 || nhitsAr>0 || nhitsKr>0)
390 nhits = nhitsXe + nhitsAr + nhitsKr;
401 const double dEdx_obs,
407 return getProb(ctx,gasType, dEdx_obs, pTrk, hypothesis, nUsedHits);
413 const double dEdx_obs,
422 if (dEdxCorrection==
nullptr) {
423 ATH_MSG_ERROR(
" getProb: Could not find any dEdxCorrection in CondStore. Return zero.");
428 ATH_MSG_DEBUG(
"getProb():: gasTypeInStraw set kUnset that is not allowed! Use gasTypeInStraw(*itr) to get gas type info for that hit first!");
429 ATH_MSG_DEBUG(
"getProb():: Now gasTypeInStraw sets to kXenon.");
433 double dEdx_pred =
predictdEdx(ctx,gasType, pTrk, hypothesis);
434 if (dEdx_pred==0)
return 0.0;
438 double correct = 1+factor*(0.045*log10(pTrk)+0.885-1);
439 dEdx_pred= dEdx_pred/correct;
443 dEdxCorrection->resolution[gasType][0] +
444 dEdxCorrection->resolution[gasType][1] * (nUsedHits + 0.5) +
445 dEdxCorrection->resolution[gasType][2] * (nUsedHits + 0.5) *
447 dEdxCorrection->resolution[gasType][3] * (nUsedHits + 0.5) *
448 (nUsedHits + 0.5) * (nUsedHits + 0.5);
451 dEdxCorrection->resolutionElectron[gasType][0] +
452 dEdxCorrection->resolutionElectron[gasType][1] * (nUsedHits + 0.5) +
453 dEdxCorrection->resolutionElectron[gasType][2] * (nUsedHits + 0.5) *
455 dEdxCorrection->resolutionElectron[gasType][3] * (nUsedHits + 0.5) *
456 (nUsedHits + 0.5) * (nUsedHits + 0.5);
459 double prob =
std::exp( -0.5 * ( ( ( dEdx_obs - dEdx_pred ) / (Resolution*dEdx_pred) ) *
460 ( ( dEdx_obs - dEdx_pred ) / (Resolution*dEdx_pred) ) )) ;
468 const double dEdx_obs,
477 if ( dEdx_obs<=0. || pTrk<=0. || nUsedHits<=0 )
return 0.5;
479 double Pone =
getProb(ctx,gasType, dEdx_obs,pTrk,hypothesis,nUsedHits);
480 double Ptwo =
getProb(ctx,gasType, dEdx_obs,pTrk,antihypothesis,nUsedHits);
481 if ((Pone+Ptwo) != 0) {
483 return Pone/(Pone+Ptwo);
505 ATH_MSG_DEBUG(
"predictdEdx(): gasTypeInStraw = " << gasType <<
"");
509 if (dEdxCorrection ==
nullptr) {
510 ATH_MSG_ERROR(
" predictdEdx: Could not find any dEdxCorrection in "
511 "CondStore. Return zero.");
517 "predictdEdx():: gasTypeInStraw set kUnset that is not allowed! Use "
518 "gasTypeInStraw(*itr) to get gas type info for that hit first!");
519 ATH_MSG_DEBUG(
"predictdEdx():: Now gasTypeInStraw sets to kXenon.");
525 double betaGamma = pTrk/
mass;
533 if (dEdxCorrection->paraDivideByLengthDedxP3[gasType] +
535 dEdxCorrection->paraDivideByLengthDedxP5[gasType])) <=
538 return dEdxCorrection->paraDivideByLengthDedxP1[gasType] /
539 std::pow(std::sqrt((betaGamma * betaGamma) /
540 (1. + (betaGamma * betaGamma))),
541 dEdxCorrection->paraDivideByLengthDedxP4[gasType]) *
542 (dEdxCorrection->paraDivideByLengthDedxP2[gasType] -
543 std::pow(std::sqrt((betaGamma * betaGamma) /
544 (1. + (betaGamma * betaGamma))),
545 dEdxCorrection->paraDivideByLengthDedxP4[gasType]) -
546 log(dEdxCorrection->paraDivideByLengthDedxP3[gasType] +
549 dEdxCorrection->paraDivideByLengthDedxP5[gasType]))));
551 if (dEdxCorrection->paraDedxP3[gasType] +
552 1. / (
std::pow(betaGamma, dEdxCorrection->paraDedxP5[gasType])) <=
555 return dEdxCorrection->paraDedxP1[gasType] /
557 std::sqrt((betaGamma * betaGamma) / (1. + (betaGamma * betaGamma))),
558 dEdxCorrection->paraDedxP4[gasType]) *
559 (dEdxCorrection->paraDedxP2[gasType] -
561 std::sqrt((betaGamma * betaGamma) / (1. + (betaGamma * betaGamma))),
562 dEdxCorrection->paraDedxP4[gasType]) -
563 log(dEdxCorrection->paraDedxP3[gasType] +
564 1. / (
std::pow(betaGamma, dEdxCorrection->paraDedxP5[gasType]))));
581 if(dEdxCorrection==
nullptr)
583 ATH_MSG_ERROR(
" mass: Could not find any dEdxCorrection in CondStore. Return zero.");
589 ATH_MSG_WARNING(
"mass():: gasTypeInStraw set kUnset that is not allowed! Use gasTypeInStraw(*itr) to get gas type info for that hit first!");
597 static const double bg_min = 0.001;
598 static const double bg_max = 3;
600 static const std::string blumRolandiFunction =
601 "( [0]/sqrt( (x*x/([5]*[5]))/(1.+(x*x/([5]*[5]))) )^[3] ) * ([1] - sqrt( "
602 "(x*x/([5]*[5]))/(1.+(x*x/([5]*[5]))) )^[3] - log([2]+1./((x/[5])^[4]) ) )";
604 TF1 blumRolandi(
"BR", blumRolandiFunction.c_str(), 0.7, 100000);
606 blumRolandi.SetParameters(dEdxCorrection->paraDedxP1[gasType],
607 dEdxCorrection->paraDedxP2[gasType],
608 dEdxCorrection->paraDedxP3[gasType],
609 dEdxCorrection->paraDedxP4[gasType],
610 dEdxCorrection->paraDedxP5[gasType],
613 double betaGamma = blumRolandi.GetX(
dEdx, bg_min, bg_max);
617 return pTrk/betaGamma;
650 const EventContext& ctx,
670 <<
", must be 'Good(2)||Xenon(3)' or 'Dead(1)||Argon(4)' or "
671 "'Krypton(5)' or 'EmulatedArgon(6)' or 'EmulatedKr(7)'!");
688 if(dEdxCorrection==
nullptr) {
689 ATH_MSG_ERROR(
" correctNormalization: Could not find any dEdxCorrection in CondStore. Return zero.");
695 if (nVtx<=0) nVtx=dEdxCorrection->normNzero[gasType];
696 double slope = dEdxCorrection->normSlopeTot[gasType];
697 double offset = dEdxCorrection->normOffsetTot[gasType];
699 slope = dEdxCorrection->normSlopeTotDivideByLength[gasType];
700 offset = dEdxCorrection->normOffsetTotDivideByLength[gasType];
702 double shift = dEdxCorrection->normOffsetData[gasType];
704 return (slope*dEdxCorrection->normNzero[gasType]+
offset)/(slope*nVtx+
offset+shift);
742 double hitRtrack = std::abs(trkP->parameters()[
Trk::locR]);
745 ATH_MSG_ERROR(
"correctToT_corrRZ(const Trk::TrackStateOnSurface *itr):: Gas type in straw is kUnset! Return ToT = 0");
756 double hitPosR = std::sqrt(trackx*trackx+tracky*tracky);
773 if (std::isinf(valToT))
return 0.;
784 int StrawLayer)
const
786 if (
Layer == 0 && StrawLayer < 9) {
796 double radialPosition,
805 return T0+
a*radialPosition;
814 int StrawLayer)
const
821 double z = std::abs(zPosition);
823 if(zPosition<0)
sign=-1;
831 const double expArg=(
z-
l)/
s;
832 if (not
inRange(expArg, -600.0,600.0)){
833 return expArg>0 ? std::numeric_limits<double>::infinity():0.;
843 int StrawLayer)
const
848 double z = std::abs(zPosition);
850 if(zPosition<0)
sign=-1;
868 if(dEdxCorrection==
nullptr)
870 ATH_MSG_ERROR(
" fitFuncPol_corrRZ: Could not find any dEdxCorrection in CondStore. Return zero.");
884 a = dEdxCorrection->paraLongCorrRZ[gasType][(6*parameter+0)*30*3+
Layer*30+Strawlayer+
offset];
885 b = dEdxCorrection->paraLongCorrRZ[gasType][(6*parameter+1)*30*3+
Layer*30+Strawlayer+
offset];
886 c = dEdxCorrection->paraLongCorrRZ[gasType][(6*parameter+2)*30*3+
Layer*30+Strawlayer+
offset];
887 d = dEdxCorrection->paraLongCorrRZ[gasType][(6*parameter+3)*30*3+
Layer*30+Strawlayer+
offset];
888 e = dEdxCorrection->paraLongCorrRZ[gasType][(6*parameter+4)*30*3+
Layer*30+Strawlayer+
offset];
889 f = dEdxCorrection->paraLongCorrRZ[gasType][(6*parameter+5)*30*3+
Layer*30+Strawlayer+
offset];
893 a = dEdxCorrection->paraShortCorrRZ[gasType][(6*parameter+0)*9+
Layer+
offset];
894 b = dEdxCorrection->paraShortCorrRZ[gasType][(6*parameter+1)*9+
Layer+
offset];
895 c = dEdxCorrection->paraShortCorrRZ[gasType][(6*parameter+2)*9+
Layer+
offset];
896 d = dEdxCorrection->paraShortCorrRZ[gasType][(6*parameter+3)*9+
Layer+
offset];
897 e = dEdxCorrection->paraShortCorrRZ[gasType][(6*parameter+4)*9+
Layer+
offset];
898 f = dEdxCorrection->paraShortCorrRZ[gasType][(6*parameter+5)*9+
Layer+
offset];
901 a = dEdxCorrection->paraEndCorrRZ[gasType][(6*parameter+0)*28+
Layer];
902 b = dEdxCorrection->paraEndCorrRZ[gasType][(6*parameter+1)*28+
Layer];
903 c = dEdxCorrection->paraEndCorrRZ[gasType][(6*parameter+2)*28+
Layer];
904 d = dEdxCorrection->paraEndCorrRZ[gasType][(6*parameter+3)*28+
Layer];
905 e = dEdxCorrection->paraEndCorrRZ[gasType][(6*parameter+4)*28+
Layer];
906 f = dEdxCorrection->paraEndCorrRZ[gasType][(6*parameter+5)*28+
Layer];
911 a = dEdxCorrection->paraLongCorrRZMC[gasType][(6*parameter+0)*30*3+
Layer*30+Strawlayer+
offset];
912 b = dEdxCorrection->paraLongCorrRZMC[gasType][(6*parameter+1)*30*3+
Layer*30+Strawlayer+
offset];
913 c = dEdxCorrection->paraLongCorrRZMC[gasType][(6*parameter+2)*30*3+
Layer*30+Strawlayer+
offset];
914 d = dEdxCorrection->paraLongCorrRZMC[gasType][(6*parameter+3)*30*3+
Layer*30+Strawlayer+
offset];
915 e = dEdxCorrection->paraLongCorrRZMC[gasType][(6*parameter+4)*30*3+
Layer*30+Strawlayer+
offset];
916 f = dEdxCorrection->paraLongCorrRZMC[gasType][(6*parameter+5)*30*3+
Layer*30+Strawlayer+
offset];
919 a = dEdxCorrection->paraShortCorrRZMC[gasType][(6*parameter+0)*9+
Layer+
offset];
920 b = dEdxCorrection->paraShortCorrRZMC[gasType][(6*parameter+1)*9+
Layer+
offset];
921 c = dEdxCorrection->paraShortCorrRZMC[gasType][(6*parameter+2)*9+
Layer+
offset];
922 d = dEdxCorrection->paraShortCorrRZMC[gasType][(6*parameter+3)*9+
Layer+
offset];
923 e = dEdxCorrection->paraShortCorrRZMC[gasType][(6*parameter+4)*9+
Layer+
offset];
924 f = dEdxCorrection->paraShortCorrRZMC[gasType][(6*parameter+5)*9+
Layer+
offset];
927 a = dEdxCorrection->paraEndCorrRZMC[gasType][(6*parameter+0)*28+
Layer];
928 b = dEdxCorrection->paraEndCorrRZMC[gasType][(6*parameter+1)*28+
Layer];
929 c = dEdxCorrection->paraEndCorrRZMC[gasType][(6*parameter+2)*28+
Layer];
930 d = dEdxCorrection->paraEndCorrRZMC[gasType][(6*parameter+3)*28+
Layer];
931 e = dEdxCorrection->paraEndCorrRZMC[gasType][(6*parameter+4)*28+
Layer];
932 f = dEdxCorrection->paraEndCorrRZMC[gasType][(6*parameter+5)*28+
Layer];
942 double radialPosition,
952 if(dEdxCorrection==
nullptr) {
953 ATH_MSG_ERROR(
" fitFuncEndcap_corrRZL: Could not find any dEdxCorrection in CondStore. Return zero.");
961 a = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(0)*28+
Layer];
962 b = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(1)*28+
Layer];
963 c = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(2)*28+
Layer];
964 d = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(3)*28+
Layer];
965 e = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(4)*28+
Layer];
966 f = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(5)*28+
Layer];
967 g = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(6)*28+
Layer];
968 h = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(7)*28+
Layer];
969 i = dEdxCorrection->paraEndCorrRZDivideByLengthDATA[gasType][(8)*28+
Layer];
971 a = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(0)*28+
Layer];
972 b = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(1)*28+
Layer];
973 c = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(2)*28+
Layer];
974 d = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(3)*28+
Layer];
975 e = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(4)*28+
Layer];
976 f = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(5)*28+
Layer];
977 g = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(6)*28+
Layer];
978 h = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(7)*28+
Layer];
979 i = dEdxCorrection->paraEndCorrRZDivideByLengthMC[gasType][(8)*28+
Layer];
983 double slope =
g+
h*
r+
i*
r*
r;
986 return T0+T1+slope*radialPosition;
995 int Strawlayer)
const
1002 if(dEdxCorrection==
nullptr) {
1003 ATH_MSG_ERROR(
" fitFuncBarrel_corrRZL: Could not find any dEdxCorrection in CondStore. Return zero.");
1008 if (
Layer==0 && Strawlayer<9) {
1010 a = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(0)*9+Strawlayer];
1011 b = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(1)*9+Strawlayer];
1012 c = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(2)*9+Strawlayer];
1013 d = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(3)*9+Strawlayer];
1014 e = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(4)*9+Strawlayer];
1015 f = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(5)*9+Strawlayer];
1016 g = dEdxCorrection->paraShortCorrRZDivideByLengthDATA[gasType][(6)*9+Strawlayer];
1018 a = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(0)*9+Strawlayer];
1019 b = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(1)*9+Strawlayer];
1020 c = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(2)*9+Strawlayer];
1021 d = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(3)*9+Strawlayer];
1022 e = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(4)*9+Strawlayer];
1023 f = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(5)*9+Strawlayer];
1024 g = dEdxCorrection->paraShortCorrRZDivideByLengthMC[gasType][(6)*9+Strawlayer];
1028 a = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(0)*30*3+
Layer*30+Strawlayer];
1029 b = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(1)*30*3+
Layer*30+Strawlayer];
1030 c = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(2)*30*3+
Layer*30+Strawlayer];
1031 d = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(3)*30*3+
Layer*30+Strawlayer];
1032 e = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(4)*30*3+
Layer*30+Strawlayer];
1033 f = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(5)*30*3+
Layer*30+Strawlayer];
1034 g = dEdxCorrection->paraLongCorrRZDivideByLengthDATA[gasType][(6)*30*3+
Layer*30+Strawlayer];
1036 a = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(0)*30*3+
Layer*30+Strawlayer];
1037 b = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(1)*30*3+
Layer*30+Strawlayer];
1038 c = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(2)*30*3+
Layer*30+Strawlayer];
1039 d = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(3)*30*3+
Layer*30+Strawlayer];
1040 e = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(4)*30*3+
Layer*30+Strawlayer];
1041 f = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(5)*30*3+
Layer*30+Strawlayer];
1042 g = dEdxCorrection->paraLongCorrRZDivideByLengthMC[gasType][(6)*30*3+
Layer*30+Strawlayer];
1045 double z = std::abs(zPosition);
1053 if (zPosition>0)
result = T0pos+T1+slope*
z;
1098 double Trt_HitTheta = trkP->parameters()[
Trk::theta];
1105 double p0=0.,
p1=0.,
p2=0., p0_flat=0.;
1110 int nBarrelLayers = 3, nEndcapLayers = 14;
1112 int nParametersPerLayer = 3;
1114 int nHTConfigurations = 2;
1116 int nSharedConfigurations = 2;
1118 layer * nParametersPerLayer +
1119 isHT * ((abs(HitPart) - 1) * (nEndcapLayers - nBarrelLayers) *
1120 nParametersPerLayer +
1121 nBarrelLayers * nParametersPerLayer) +
1122 isShared * ((abs(HitPart) - 1) * (nEndcapLayers - nBarrelLayers) *
1123 nParametersPerLayer * nHTConfigurations +
1124 nBarrelLayers * nParametersPerLayer * nHTConfigurations) +
1125 (abs(HitPart) - 1) * nParametersPerLayer * nBarrelLayers *
1126 nHTConfigurations * nSharedConfigurations;
1128 int num_flat =
layer * 3 +
1129 isHT * ((abs(HitPart) - 1) * (nEndcapLayers - nBarrelLayers) *
1130 nParametersPerLayer +
1131 nBarrelLayers * nParametersPerLayer) +
1132 (abs(HitPart) - 1) * nParametersPerLayer * nBarrelLayers *
1133 nHTConfigurations * nSharedConfigurations;
1135 p0 = dEdxCorrection->hitOccPar[
num];
1136 p1 = dEdxCorrection->hitOccPar[
num+1];
1137 p2 = dEdxCorrection->hitOccPar[
num+2];
1138 p0_flat = dEdxCorrection->hitOccPar[num_flat];
1143 valToT = p0_flat/(
p0+
p1*localOccupancy+
p2*localOccupancy*localOccupancy);
1145 return ToTmip*valToT;
1152 std::optional<float> localOccupancy)
const
1159 double trackOcc = localOccupancy != std::nullopt
1174 corr=dEdxCorrection->trackOccPar0[
index]+dEdxCorrection->trackOccPar1[
index]*trackOcc+dEdxCorrection->trackOccPar2[
index]*
pow(trackOcc,2);
1176 corr=dEdxCorrection->trackOccPar0NoHt[
index]+dEdxCorrection->trackOccPar1NoHt[
index]*trackOcc+dEdxCorrection->trackOccPar2NoHt[
index]*
pow(trackOcc,2);
1209 if(trkP==
nullptr)
return 0.;
1211 double Trt_Rtrack = std::abs(trkP->parameters()[
Trk::locR]);
1212 double Trt_HitTheta = trkP->parameters()[
Trk::theta];
1213 double Trt_HitPhi = trkP->parameters()[
Trk::phi];
1215 int HitPart = std::abs(
identifier->barrel_ec(DCId));
1217 double strawphi = element->
center(DCId).phi();
1220 if (Trt_Rtrack >= 2.0) {
1226 length = 2*std::sqrt(4-Trt_Rtrack*Trt_Rtrack)*1./std::abs(
std::sin(Trt_HitTheta));
1227 }
else if (HitPart == 2) {
1231 throw std::runtime_error(
"Unknown barrel/endcap identifier: " +
std::to_string(HitPart) +
". Must be 1(Barrel) or 2(Endcap)");