78{
80
81
82
83
84 if (xmicrons == 0.) return 0.;
85 if (pf <= 0.) return 0.;
86 if (massf <= 0.) return 0.;
88 double mass=(double)massf;
89 double x=TMath::Abs((double)xmicrons/10000.);
93 double emax=(2.*me*beta*beta*gamma*gamma)/
95 double eta=gamma*beta;
96 double eta2=eta*eta;
97 double eta4=eta2*eta2;
98 double eta6=eta2*eta4;
100
101 double dzeta=153.4*
Z*ro*x/(beta*beta*A)/1000000.;
102 double k=dzeta/emax;
103 double delta;
104 if (
X < X0) delta = 0;
105 else if (
X < X1) delta = 4.606*
X+C+aa*TMath::Power((X1-
X),mm);
106 else delta = 4.606*
X+C;
107 double Ce=(0.42237/eta2+0.0304/eta4-0.00038/eta6)*1.E-6*I*I +
108 (3.85800/eta2-0.1668/eta4+0.00158/eta6)*1.E-9*I*I*I;
109
110 double de_aver=x*ro*(D*
Z/(A*beta*beta))*
111 (
TMath::Log(2.*me*beta*beta*gamma*gamma*emax/(I*I*1.E-18))-
112 2.*beta*beta-delta-2.*Ce/
Z);
113
114 double lambda_aver=-geu1-beta*beta-
TMath::Log(k);
115 double lambda_max=0.60715+1.1934*lambda_aver+(0.67794+0.052382*lambda_aver)
116 *TMath::Exp(0.94753+0.74442*lambda_aver);
117 double lambda=0.;
118 double de;
119 for (int i=0;i<100000;i++)
120 {
121 lambda=gRandom->Landau(0.,1.);
122 if (lambda<lambda_max)
123 {
124 de = de_aver + dzeta*(lambda-geu1+beta*beta+
TMath::Log(dzeta/emax));
125 return de;
126 }
127 }
128 return 0.;
129}