29 const double& matDensity,
33 const double& meanExcitationEnergy,
35 TMatrixT<Double_t>*
noise,
36 const TMatrixT<Double_t>* ,
46 const double beta = mom / sqrt(mass * mass + mom * mom);
47 double dedx = 0.307075 * matZ / matA * matDensity / (beta * beta) * charge * charge;
50 double gammaSquare = 1. - beta * beta;
51 if (gammaSquare > 1.
E-10)
52 gammaSquare = 1. / gammaSquare;
55 double gamma = sqrt(gammaSquare);
57 double massRatio = me / mass;
58 double argument = gammaSquare * beta * beta * me * 1.E3 * 2. /
59 ((1.E-6 * meanExcitationEnergy) *
60 sqrt(1 + 2 * sqrt(gammaSquare) * massRatio + massRatio * massRatio));
61 if (argument <= exp(beta * beta))
64 dedx *= (log(argument) - beta * beta);
68 "GFEnergyLossBetheBloch::energyLoss(): non-positive dE/dx", __LINE__, __FILE__)
72 double DE = step * dedx;
74 sqrt(mom * mom + 2. * sqrt(mom * mom + mass * mass) * DE + DE * DE) - mom;
77 if (fabs(momLoss) < 1.
E-11) momLoss = 1.E-11;
82 "GFEnergyLossBetheBloch::energyLoss(): no noise matrix specified!", __LINE__, __FILE__)
87 double zeta = 153.4E3 * charge * charge / (beta * beta) * matZ / matA * matDensity * step;
88 double Emax = 2.E9 * me * beta * beta * gammaSquare /
89 (1. + 2. * gamma * me / mass + (me / mass) * (me / mass));
90 double kappa = zeta / Emax;
93 sigma2E += zeta * Emax * (1. - beta * beta / 2.);
97 double sigmaalpha = 15.76;
99 double I = 16. * pow(matZ, 0.9);
101 if (matZ > 2.) f2 = 2. / matZ;
103 double e2 = 10. * matZ * matZ;
104 double e1 = pow((I / pow(e2, f2)), 1. / f1);
106 double mbbgg2 = 2.E9 * mass * beta * beta * gammaSquare;
107 double Sigma1 = dedx * 1.0E9 * f1 / e1 * (log(mbbgg2 / e1) - beta * beta) /
108 (log(mbbgg2 / I) - beta * beta) * 0.6;
109 double Sigma2 = dedx * 1.0E9 * f2 / e2 * (log(mbbgg2 / e2) - beta * beta) /
110 (log(mbbgg2 / I) - beta * beta) * 0.6;
111 double Sigma3 = dedx * 1.0E9 * Emax / (I * (Emax + I) * log((Emax + I) / I)) * 0.4;
113 double Nc = (Sigma1 + Sigma2 + Sigma3) * step;
117 double RLAMED = -0.422784 - beta * beta - log(zeta / Emax);
118 double RLAMAX = 0.60715 + 1.1934 * RLAMED +
119 (0.67794 + 0.052382 * RLAMED) * exp(0.94753 + 0.74442 * RLAMED);
121 if (RLAMAX <= 1010.) {
122 sigmaalpha = 1.975560 + 9.898841e-02 * RLAMAX - 2.828670e-04 * RLAMAX * RLAMAX +
123 5.345406e-07 * pow(RLAMAX, 3.) - 4.942035e-10 * pow(RLAMAX, 4.) +
124 1.729807e-13 * pow(RLAMAX, 5.);
127 sigmaalpha = 1.871887E+01 + 1.296254E-02 * RLAMAX;
130 if (sigmaalpha > 54.6) sigmaalpha = 54.6;
131 sigma2E += sigmaalpha * sigmaalpha * zeta * zeta;
134 double Ealpha = I / (1. - (alpha * Emax / (Emax + I)));
135 double meanE32 = I * (Emax + I) / Emax * (Ealpha - I);
136 sigma2E += step * (Sigma1 * e1 * e1 + Sigma2 * e2 * e2 + Sigma3 * meanE32);
143 (*noise)[6][6] += (mom * mom + mass * mass) / pow(mom, 6.) * sigma2E;
virtual ~GFEnergyLossBetheBloch()
double getParticleMass(const int &pdg)
Returns particle mass (in GeV)
void getParticleParameters(const int &pdg, double &charge, double &mass)
Gets particle charge and mass (in GeV)
double energyLoss(const double &step, const double &mom, const int &pdg, const double &matDensity, const double &matZ, const double &matA, const double &radiationLength, const double &meanExcitationEnergy, const bool &doNoise=false, TMatrixT< Double_t > *noise=NULL, const TMatrixT< Double_t > *jacobian=NULL, const TVector3 *directionBefore=NULL, const TVector3 *directionAfter=NULL)
Returns energy loss, optional calculation of energy loss straggeling.
Exception class for error handling in GENFIT (provides storage for diagnostic information) ...
GFException & setFatal(bool b=true)
set fatal flag. if this is true, the fit stops for this current track repr.