00001
00017 #include <cassert>
00018
00019 #include "KokoulinPetrukhinModel.h"
00020 #include "Constants.h"
00021 #include "Integrator.h"
00022
00023 ClassImp(KokoulinPetrukhinModel)
00024
00025
00026 KokoulinPetrukhinModel::KokoulinPetrukhinModel() :
00027 ProcessModel()
00028 {
00029
00030 }
00031
00032 KokoulinPetrukhinModel::KokoulinPetrukhinModel(const Material & material) :
00033 ProcessModel(material, Process::ePairProduction)
00034 {
00035
00036 }
00037
00038 KokoulinPetrukhinModel::~KokoulinPetrukhinModel()
00039 {
00040
00041 }
00042
00043 ValidityRange_t KokoulinPetrukhinModel::ValidityRange(void) const
00044 {
00045 ValidityRange_t validity_range;
00046
00047 validity_range.Emin = 0.75*sqrt(MuELoss::e)*(MuELoss::Mm)*pow(fMaterial.Z(), 1./3.);
00048 validity_range.Emax = 10000000.;
00049
00050 return validity_range;
00051 }
00052
00053 double KokoulinPetrukhinModel::dE_dx(double E) const
00054 {
00055
00056
00057
00058 return bpair(E) * E;
00059 }
00060
00061 double KokoulinPetrukhinModel::bpair(double E) const
00062 {
00063
00064
00065
00066
00067 const int kNV = 300;
00068 const int kNP = 300;
00069
00070 assert(E>=0);
00071
00072 Integrator * integrator = Integrator::Instance();
00073
00074 double Vmin = V_min(E);
00075 double Vmax = V_max(E);
00076 double dV = (Vmax-Vmin)/kNV;
00077
00078 double * vds_dv = new double[kNV];
00079
00080 for(int iv = 0; iv < kNV; iv++) {
00081
00082 double v = Vmin + (iv+1) * dV;
00083
00084 double Pmin = 0;
00085 double Pmax = P_max(v, E);
00086
00087 if(Pmax < 0) return 0;
00088
00089
00090
00091 double dP = (Pmax-Pmin)/kNP;
00092
00093 double * d2s = new double[kNP];
00094
00095 for(int ip = 0; ip < kNP; ip++) d2s[ip] = d2s_dvdp(v, (Pmin + (ip+1) * dP) ,E);
00096
00097 vds_dv[iv] = v * integrator->Simpson(d2s, kNP, dP);
00098
00099 delete [] d2s;
00100
00101 }
00102
00103 double integral = integrator->Simpson(vds_dv, kNV, dV);
00104
00105 delete [] vds_dv;
00106
00107
00108
00109
00110 return 10* ( 2*MuELoss::Na / fMaterial.A() ) * integral;
00111 }
00112
00113 double KokoulinPetrukhinModel::d2s_dvdp(double v, double p, double E) const
00114 {
00115
00116
00117
00118
00119
00120
00121 assert(v>=0);
00122 assert(p>=0);
00123 assert(E>=0);
00124
00125 double a4 = MuELoss::a_4;
00126 double pi = MuELoss::pi;
00127 double ZLe2 = pow(fMaterial.Z()*MuELoss::Le,2.);
00128 double me_mm_2 = MuELoss::Me_Mm_2;
00129 double fie = FIe(v,p,E);
00130 double fim = FIm(v,p,E);
00131
00132 return a4 * (2./(3.*pi)) * ZLe2 * ( (1.-v)/v ) * ( fie + fim * me_mm_2 );
00133 }
00134
00135 double KokoulinPetrukhinModel::FIe(double v, double p, double E) const
00136 {
00137
00138
00139
00140
00141
00142 double b = v*v / (2*(1-v));
00143 double p2 = p*p;
00144 double xi = (1.-p2) * pow( 0.5 *v *MuELoss::Mm_Me , 2.) / (1-v);
00145 double A = ( (2.+p2) * (1.+b) + xi*(3.+p2) ) * log(1.+1./xi);
00146 double B = (1.-p2-b) / (1.+xi);
00147 double C = 3. + p2;
00148
00149 return (A+B-C)*Le(v,p,E);
00150 }
00151
00152 double KokoulinPetrukhinModel::FIm(double v, double p, double E) const
00153 {
00154
00155
00156
00157
00158
00159 double b = v*v / (2*(1-v));
00160 double p2 = p*p;
00161 double xi = (1.-p2) * pow( 0.5 *v *MuELoss::Mm_Me , 2.) / (1-v);
00162 double A = ( (1.+p2)*(1.+3.*b/2.) - (1.+2.*b)*(1.-p2)/xi ) * log(1.+xi);
00163 double B = xi * (1. - p2 - b) / (1.+xi);
00164 double C = (1.+2.*b) * (1.-p2);
00165
00166 return (A+B+C)*Lm(v,p,E);
00167 }
00168
00169 double KokoulinPetrukhinModel::Le(double v, double p, double E) const
00170 {
00171
00172
00173
00174
00175
00176 double p2 = p*p;
00177 double xi = (1.-p2) * pow( 0.5 *v *MuELoss::Mm_Me , 2.) / (1-v);
00178 double Y = Ye(v,p);
00179 double Z_13 = pow(fMaterial.Z(),-1./3.);
00180 double Z13 = pow(fMaterial.Z(), 1./3.);
00181 double MeR = MuELoss::Me * MuELoss::R;
00182 double x_Y = (1+xi)*(1+Y);
00183
00184 double A = MuELoss::R * Z_13 * sqrt( x_Y );
00185 double B = 1. + (2. * MeR * MuELoss::sqrt_e * Z_13 * x_Y) / ( E*v*(1-p2) );
00186 double C = 1.5 * MuELoss::Me_Mm * Z13;
00187 double D = 1 + C*C*x_Y;
00188
00189 return log(A/B) - 0.5 * log(D);
00190 }
00191
00192 double KokoulinPetrukhinModel::Lm(double v, double p, double E) const
00193 {
00194
00195
00196
00197
00198
00199 double p2 = p*p;
00200 double xi = (1.-p2) * pow( 0.5 *v *MuELoss::Mm_Me , 2.) / (1-v);
00201 double Y = Ym(v,p);
00202 double Z_13 = pow(fMaterial.Z(),-1/3.);
00203 double Z_23 = pow(fMaterial.Z(),-2/3.);
00204 double MeR = MuELoss::Me * MuELoss::R;
00205 double A = (2./3.) * MuELoss::Mm_Me * MuELoss::R * Z_23;
00206 double B = 1. + ( 2. * MeR * MuELoss::sqrt_e * Z_13 * (1+xi) * (1+Y) ) / ( E*v*(1-p2) );
00207
00208 return log(A/B);
00209 }
00210
00211 double KokoulinPetrukhinModel::Ye(double v, double p) const
00212 {
00213
00214
00215
00216
00217 double b = v*v / (2*(1-v));
00218 double p2 = p*p;
00219 double xi = (1.-p2) * pow( 0.5 *v *MuELoss::Mm_Me , 2.) / (1-v);
00220
00221 return ( 5. - p2 + 4*b*(1+p2) ) / ( 2.*(1.+3.*b)*log(3.+1./xi) - p2 - 2.*b*(2.-p2) );
00222 }
00223
00224 double KokoulinPetrukhinModel::Ym(double v, double p) const
00225 {
00226
00227
00228
00229
00230 double b = v*v / (2*(1-v));
00231 double p2 = p*p;
00232 double xi = (1.-p2) * pow( 0.5 *v *MuELoss::Mm_Me , 2.) / (1-v);
00233
00234 return ( 4. + p2 + 3.*b*(1.+p2) ) / ( (1.+p2)*(1.5+2.*b)*log(3.+xi) + 1. - 1.5*p2 );
00235 }
00236
00237 double KokoulinPetrukhinModel::V_min(double E) const
00238 {
00239
00240
00241 return 4.*MuELoss::Me/E;
00242 }
00243
00244 double KokoulinPetrukhinModel::V_max(double E) const
00245 {
00246
00247
00248 return 1.- 3.* MuELoss::sqrt_e * MuELoss::Mm * pow(fMaterial.Z(), 1./3.) / (4.*E);
00249 }
00250
00251 double KokoulinPetrukhinModel::P_max(double v, double E) const
00252 {
00253 return (1. - 6.*MuELoss::Mm_2 / (E*E*(1.-v)) ) * sqrt(1.-4.*MuELoss::Me/(E*v));
00254 }
00255
00256
00257