53 float& momentumAfterGeV,
54 float& outHighlandTheta2Rad2,
55 float& outRelativeInverseMomentumVariance)
noexcept
60 if (material.xOverX0 < 0.f || material.arealDensityGPerCm2 < 0.f) {
63 if (momentumGeV <= 0.f) {
66 if (
pid.getID() >= o2::track::PID::NIDsTot) {
69 const float mass =
pid.getMass();
74 const float q2 =
static_cast<float>(absCharge) *
static_cast<float>(absCharge);
75 const float p0 = momentumGeV;
76 const float p0Squared = p0 * p0;
77 const float e0 = std::sqrt(p0Squared + mass * mass);
78 const float beta2 = p0Squared / (e0 * e0);
86 if (material.arealDensityGPerCm2 > 0.f) {
87 const float ekin = e0 - mass;
88 const float bg0 = p0 / mass;
89 const float dedx0 = o2::track::BetheBlochSolidOpt<float>(bg0) * q2;
90 const float fullStepEnergyLoss = dedx0 * material.arealDensityGPerCm2;
92 const uint8_t substeps = classifySubsteps(fullStepEnergyLoss, ekin);
94 const float arealDensityStep = material.arealDensityGPerCm2 /
static_cast<float>(substeps);
95 for (uint8_t
i = 0;
i < substeps; ++
i) {
96 const float bg = p / mass;
97 const float dedx = o2::track::BetheBlochSolidOpt<float>(bg) * q2;
98 const float dE = dedx * arealDensityStep;
103 p = std::sqrt(e * e - mass * mass);
107 if (p < kMinMomentumGeV) {
110 const float signedEnergyChangeGeV = e - e0;
112 float highlandTheta2Rad2 = 0.f;
113 if (material.xOverX0 > 0.f) {
114 highlandTheta2Rad2 = kHighlandConst2 / (beta2 * p0 * p0) * material.xOverX0 * q2;
115 if (highlandTheta2Rad2 > o2::constants::math::PI * o2::constants::math::PI) {
120 float relativeInverseMomentumVariance = 0.f;
121 if (signedEnergyChangeGeV != 0.f) {
122 relativeInverseMomentumVariance = kStragglingConst * kStragglingConst * std::fabs(signedEnergyChangeGeV) * e0 * e0 / (p0 * p0 * p0 * p0);
125 momentumAfterGeV = p;
126 outHighlandTheta2Rad2 = highlandTheta2Rad2;
127 outRelativeInverseMomentumVariance = relativeInverseMomentumVariance;
bool calculateMaterialPhysics(float momentumGeV, o2::track::PID pid, uint8_t absCharge, MaterialTraversalDirection direction, IntegratedMaterialBudget material, float &momentumAfterGeV, float &highlandTheta2Rad2, float &relativeInverseMomentumVariance) noexcept