9#include "FairTrackParam.h"
10#include "TDatabasePDG.h"
11#include "TParticlePDG.h"
34 fDownstream = downstream;
35 TDatabasePDG* db = TDatabasePDG::Instance();
36 TParticlePDG* particle = db->GetParticle(pdg);
37 assert(particle != NULL);
38 fMass = particle->Mass();
40 fIsElectron = (std::abs(pdg) == 11) ? kTRUE : kFALSE;
41 fIsMuon = (std::abs(pdg) == 13) ? kTRUE : kFALSE;
63 Float_t qp = par->GetQp();
69 Float_t cov = par->GetCovariance(4, 4);
71 par->SetCovariance(4, 4, cov);
76 Float_t cov = par->GetCovariance(4, 4);
78 par->SetCovariance(4, 4, cov);
88 Float_t tx = par->GetTx();
89 Float_t ty = par->GetTy();
93 Float_t t = 1 + tx * tx + ty * ty;
95 Float_t Q33 = (1 + tx * tx) * t * thetaSq;
96 Float_t Q44 = (1 + ty * ty) * t * thetaSq;
97 Float_t Q34 = tx * ty * t * thetaSq;
99 Float_t T23 = (thickness * thickness) / 3.0;
100 Float_t T2 = thickness / 2.0;
102 Float_t D = (fDownstream) ? 1. : -1.;
109 C[2] += Q33 * D * T2;
110 C[3] += Q34 * D * T2;
113 C[6] += Q34 * D * T2;
114 C[7] += Q44 * D * T2;
121 par->SetCovMatrix(C);
129 Float_t tx = par->GetTx();
130 Float_t ty = par->GetTy();
133 Float_t t = 1 + tx * tx + ty * ty;
135 Float_t Q33 = (1 + tx * tx) * t * thetaSq;
136 Float_t Q44 = (1 + ty * ty) * t * thetaSq;
137 Float_t Q34 = tx * ty * t * thetaSq;
144 par->SetCovMatrix(C);
149 Float_t p = std::abs(1. / par->GetQp());
151 Float_t E = std::sqrt(fMass * fMass + p * p);
152 Float_t beta = p / E;
154 Float_t X0 = mat->
GetRL();
155 Float_t bcp = beta * p;
158 Float_t theta = 0.0136 * (1. / bcp) * z * std::sqrt(x / X0) * (1. + 0.038 * std::log(x / X0));
159 return theta * theta;
165 return dEdx(par, mat) * length;
179 Float_t K = 0.000307075;
180 Float_t z = (par->GetQp() > 0.) ? 1 : -1.;
182 Float_t Z = mat->
GetZ();
183 Float_t A = mat->
GetA();
186 Float_t p = std::abs(1. / par->GetQp());
188 Float_t E = std::sqrt(M * M + p * p);
189 Float_t beta = p / E;
190 Float_t betaSq = beta * beta;
191 Float_t gamma = E / M;
192 Float_t gammaSq = gamma * gamma;
194 Float_t I =
CalcI(Z) * 1e-9;
196 Float_t me = 0.000511;
197 Float_t ratio = me / M;
198 Float_t Tmax = (2 * me * betaSq * gammaSq) / (1 + 2 * gamma * ratio + ratio * ratio);
203 Float_t rho = mat->
GetRho();
204 Float_t hwp = 28.816 * std::sqrt(rho * Z / A) * 1e-9;
205 dc = std::log(hwp / I) + std::log(beta * gamma) - 0.5;
208 return K * z * z * (Z / A) * (1. / betaSq)
209 * (0.5 * std::log(2 * me * betaSq * gammaSq * Tmax / (I * I)) - betaSq - dc);
214 Float_t K = 0.000307075;
216 Float_t Z = mat->
GetZ();
217 Float_t A = mat->
GetA();
219 Float_t me = 0.000511;
220 Float_t p = std::abs(1. / par->GetQp());
221 Float_t E = std::sqrt(me * me + p * p);
222 Float_t gamma = E / me;
224 Float_t I =
CalcI(Z) * 1e-9;
226 if (par->GetQp() > 0) {
227 return K * (Z / A) * (std::log(2 * me / I) + 1.5 * std::log(gamma) - 0.975);
229 return K * (Z / A) * (std::log(2 * me / I) + 2. * std::log(gamma) - 1.);
235 Float_t massSq = fMass * fMass;
236 Float_t p = std::abs(1. / qp);
238 Float_t E = std::sqrt(p * p + massSq);
239 Float_t q = (qp > 0) ? 1. : -1.;
244 Float_t Enew = E - eloss;
245 Float_t pnew = (Enew > fMass) ? std::sqrt(Enew * Enew - massSq) : 0.;
260 Float_t P = std::abs(1. / par->GetQp());
262 Float_t XMASS = fMass;
263 Float_t E = std::sqrt(P * P + XMASS * XMASS);
264 Float_t Z = mat->
GetZ();
265 Float_t A = mat->
GetA();
266 Float_t RHO = mat->
GetRho();
268 Float_t EMASS = 0.511 * 1e-3;
270 Float_t BETA = P / E;
271 Float_t GAMMA = E / XMASS;
274 Float_t XI = (153.5 * Z * STEP * RHO) / (A * BETA * BETA);
277 Float_t ETA = BETA * GAMMA;
278 Float_t ETASQ = ETA * ETA;
279 Float_t RATIO = EMASS / XMASS;
280 Float_t F1 = 2. * EMASS * ETASQ;
281 Float_t F2 = 1. + 2. * RATIO * GAMMA + RATIO * RATIO;
282 Float_t EMAX = 1e6 * F1 / F2;
284 Float_t DEDX2 = XI * EMAX * (1. - (BETA * BETA / 2.)) * 1e-12;
286 Float_t SDEDX = (E * E * DEDX2) / std::pow(P, 6);
288 return std::abs(SDEDX);
294 Float_t X0 = mat->
GetRL();
295 return par->GetQp() * par->GetQp() * (std::exp(-x / X0 * std::log(3.0) / std::log(2.0)) - std::exp(-2.0 * x / X0));
304 return 16 * std::pow(Z, 0.9);
311 Float_t p = std::abs(1. / par->GetQp());
312 Float_t rho = mat->
GetRho();
313 Float_t X0 = mat->
GetRL();
314 Float_t me = 0.000511;
315 Float_t E = std::sqrt(M * M + p * p);
316 Float_t ratio = me / M;
318 return (E * ratio * ratio) / (X0 * rho);
323 Float_t p = std::abs(1. / par->GetQp());
325 Float_t rho = mat->
GetRho();
326 Float_t X0 = mat->
GetRL();
327 Float_t E = std::sqrt(M * M + p * p);
329 return 7e-5 * E / (X0 * rho);
334 return 0.00354 * mat->
GetZ() / mat->
GetA();
339 Float_t M = fMass * 1e3;
340 Float_t p = std::abs(1. / par->GetQp()) * 1e3;
343 Float_t Z = mat->
GetZ();
344 Float_t A = mat->
GetA();
347 Float_t I =
CalcI(Z) * 1e-6;
349 Float_t K = 0.307075;
352 Float_t E = std::sqrt(M * M + p * p);
353 Float_t beta = p / E;
354 Float_t betaSq = beta * beta;
355 Float_t gamma = E / M;
356 Float_t gammaSq = gamma * gamma;
358 Float_t ksi = (K / 2.) * (Z / A) * (x / betaSq);
365 Float_t eloss = ksi * (std::log(2 * M * betaSq * gammaSq / I) + std::log(ksi / I) + j - betaSq - dc);
Float_t CalcSigmaSqQp(const FairTrackParam *par, const BmnMaterialInfo *mat) const
Float_t BetheBlochSimple(const BmnMaterialInfo *mat) const
void AddEnergyLoss(FairTrackParam *par, const BmnMaterialInfo *mat) const
Float_t dEdx(const FairTrackParam *par, const BmnMaterialInfo *mat) const
BmnMaterialEffects()
Constructor.
Float_t CalcQpAfterEloss(Float_t qp, Float_t eloss) const
virtual BmnStatus Update(FairTrackParam *par, const BmnMaterialInfo *mat, Int_t pdg, Bool_t downstream)
Main function to be implemented for concrete material effects calculation algorithm.
Float_t BetheHeitler(const FairTrackParam *par, const BmnMaterialInfo *mat) const
Float_t EnergyLoss(const FairTrackParam *par, const BmnMaterialInfo *mat) const
Float_t CalcSigmaSqQpElectron(const FairTrackParam *par, const BmnMaterialInfo *mat) const
Float_t BetheBlochElectron(const FairTrackParam *par, const BmnMaterialInfo *mat) const
Float_t CalcThetaSq(const FairTrackParam *par, const BmnMaterialInfo *mat) const
Float_t MPVEnergyLoss(const FairTrackParam *par, const BmnMaterialInfo *mat) const
Float_t BetheBloch(const FairTrackParam *par, const BmnMaterialInfo *mat) const
Float_t CalcI(Float_t Z) const
void AddThinScatter(FairTrackParam *par, const BmnMaterialInfo *mat) const
void AddThickScatter(FairTrackParam *par, const BmnMaterialInfo *mat) const
Float_t PairProduction(const FairTrackParam *par, const BmnMaterialInfo *mat) const
virtual ~BmnMaterialEffects()
Destructor.
Float_t GetLength() const
Interface for material effects calculation algorithm.