Returns energy loss, optional calculation of energy loss straggeling.
Uses Bethe Bloch formula to calculate energy loss. For the energy loss straggeling, different formulas are used for different regions:
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) gammaSquare = 1./gammaSquare;
52 else gammaSquare = 1.E10;
53 double gamma = sqrt(gammaSquare);
55 double massRatio = me/mass;
56 double argument = gammaSquare*beta*beta*me*1.E3*2./((1.E-6*meanExcitationEnergy) * sqrt(1+2*sqrt(gammaSquare)*massRatio + massRatio*massRatio));
57 if (argument <= exp(beta*beta))
60 dedx *= (log(argument)-beta*
beta);
63 throw GFException(
"GFEnergyLossBetheBloch::energyLoss(): non-positive dE/dx", __LINE__, __FILE__).
setFatal();
66 double DE =
step * dedx;
67 double momLoss = sqrt(mom*mom+2.*sqrt(mom*mom+mass*mass)*DE+DE*DE) - mom;
70 if(fabs(momLoss)<1.
E-11)momLoss=1.E-11;
75 throw GFException(
"GFEnergyLossBetheBloch::energyLoss(): no noise matrix specified!", __LINE__, __FILE__).
setFatal();
79 double zeta = 153.4E3 * charge*charge/(beta*
beta) * matZ/matA * matDensity *
step;
80 double Emax = 2.E9*me*beta*beta*gammaSquare / (1. + 2.*gamma*me/mass + (me/mass)*(me/mass) );
81 double kappa = zeta/Emax;
84 sigma2E += zeta*Emax*(1.-beta*beta/2.);
88 double sigmaalpha = 15.76;
90 double I = 16. *
pow(matZ, 0.9);
92 if (matZ > 2.) f2 = 2./matZ;
94 double e2 = 10.*matZ*matZ;
95 double e1 =
pow( (I/
pow(e2,f2)), 1./f1);
97 double mbbgg2 = 2.E9*mass*beta*beta*gammaSquare;
98 double Sigma1 = dedx*1.0E9 * f1/e1 * (log(mbbgg2 / e1) - beta*
beta) / (log(mbbgg2 / I) - beta*
beta) * 0.6;
99 double Sigma2 = dedx*1.0E9 * f2/e2 * (log(mbbgg2 / e2) - beta*
beta) / (log(mbbgg2 / I) - beta*
beta) * 0.6;
100 double Sigma3 = dedx*1.0E9 * Emax / ( I*(Emax+
I)*log((Emax+I)/
I) ) * 0.4;
102 double Nc = (Sigma1 + Sigma2 + Sigma3)*
step;
106 double RLAMED = -0.422784 - beta*beta - log(zeta/Emax);
107 double RLAMAX = 0.60715 + 1.1934*RLAMED +(0.67794 + 0.052382*RLAMED)*exp(0.94753+0.74442*RLAMED);
109 if(RLAMAX <= 1010.) {
110 sigmaalpha = 1.975560
111 +9.898841e-02 *RLAMAX
112 -2.828670e-04 *RLAMAX*RLAMAX
113 +5.345406e-07 *
pow(RLAMAX,3.)
114 -4.942035e-10 *
pow(RLAMAX,4.)
115 +1.729807e-13 *
pow(RLAMAX,5.);
117 else { sigmaalpha = 1.871887E+01 + 1.296254E-02 *RLAMAX; }
119 if(sigmaalpha > 54.6) sigmaalpha=54.6;
120 sigma2E += sigmaalpha*sigmaalpha * zeta*zeta;
123 double Ealpha = I / (1.-(alpha*Emax/(Emax+
I)));
124 double meanE32 = I*(Emax+
I)/Emax * (Ealpha-I);
125 sigma2E +=
step * (Sigma1*e1*e1 + Sigma2*e2*e2 + Sigma3*meanE32);
132 (*noise)[6][6] += (mom*mom+mass*mass)/
pow(mom,6.)*sigma2E;
double beta(double KE, const simb::MCParticle *part)
double getParticleMass(const int &pdg)
Returns particle mass (in GeV)
double gamma(double KE, const simb::MCParticle *part)
void getParticleParameters(const int &pdg, double &charge, double &mass)
Gets particle charge and mass (in GeV)
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.