Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

KokoulinPetrukhinModel.cxx

Go to the documentation of this file.
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.; // MeV
00049 
00050   return validity_range;
00051 }
00052 //_________________________________________________________________________________________
00053 double KokoulinPetrukhinModel::dE_dx(double E) const
00054 {
00055 // Calculates the muon -dE/dx in ( MeV cm^2 / gr ) due to e+e- pair production
00056 // Input  : E, muon energy in MeV
00057 
00058   return bpair(E) * E;
00059 }
00060 //_________________________________________________________________________________________
00061 double KokoulinPetrukhinModel::bpair(double E) const
00062 {
00063 // Purpose: get the b factor for e+e- pair production from muons ( -dE/dx = b*E )
00064 // Input  : E, muon energy in MeV
00065 // Output : b factor in cm^2 / gr
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; // put this here for now so as not to hit an assert() below... 
00088                             // Eventually I need to solve Pmax(E) > 0 for E, and combine it
00089                             // with the E limit from Vmax in the validity range of the model
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   } // v
00102 
00103   double integral = integrator->Simpson(vds_dv, kNV, dV);
00104 
00105   delete [] vds_dv;
00106 
00107   // factor 10 is for dimensions:
00108   //    10 :   v*ds/dv(integral) in 10^22 cm2 --  N->N*10^(-23) -> b in 0.1 cm2/gr
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 // Calculate the differential cross section d^2s/dpdv (in 10^22 cm^2) for e+e- pair production
00116 // by muons based on the Kokoulin,Petrukhin parameterization
00117 // Input  : v, the fraction of the energy transfered to the e+e- pair
00118 //          p, the asymmetry parameter of the e+e- pair p = (E(+) - E(-)) / (E(+) + E(-))
00119 //          E, muon energy in MeV
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 // Approximate the FIe factor (dimensionless) from pair production cross section
00138 // Input  : v, the fraction of the energy transfered to the e+e- pair
00139 //          p, the asymmetry parameter of the e+e- pair p = (E(+) - E(-)) / (E(+) + E(-))
00140 //          E, muon energy in MeV
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 // Approximates the factor FIm factor (dimensionless) from pair production cross section
00155 // Input  : v, the fraction of the energy transfered to the e+e- pair
00156 //          p, the asymmetry parameter of the e+e- pair p = (E(+) - E(-)) / (E(+) + E(-))
00157 //          E, muon energy in MeV
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 // Approximates the Le factor (dimensionless) appearing in the factor FIe at pair production xsec
00172 // Input  : v, the fraction of the energy transfered to the e+e- pair
00173 //          p, the asymmetry parameter of the e+e- pair p = (E(+) - E(-)) / (E(+) + E(-))
00174 //          E, muon energy in MeV
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 // Approximates the Lm factor (dimensioness) appearing in the factor FIm at pair production xsec
00195 // Input  : v, the fraction of the energy transfered to the e+e- pair
00196 //          p, the asymmetry parameter of the e+e- pair p = (E(+) - E(-)) / (E(+) + E(-))
00197 //          E, muon energy in MeV
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 // Approximates the Ye factor (dimensionless) in the factor Le at pair production xsec
00214 // Input  : v, the fraction of the energy transfered to the e+e- pair
00215 //          p, the asymmetry parameter of the e+e- pair p = (E(+) - E(-)) / (E(+) + E(-))
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 // Approximates the Ym factor (dimensionless) in the factor Lm at pair production xsec
00227 // Input  : v, the fraction of the energy transfered to the e+e- pair
00228 //          p, the asymmetry parameter of the e+e- pair p = (E(+) - E(-)) / (E(+) + E(-))
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 // Minimum value of parameter v = E(+)+(E-)/E
00240 
00241   return 4.*MuELoss::Me/E;
00242 }
00243 //___________________________________________________________________________________________
00244 double KokoulinPetrukhinModel::V_max(double E) const
00245 {
00246 // Maximum value of parameter v = E(+)+(E-)/E
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 

Generated on Thu Nov 1 11:51:08 2007 for loon by  doxygen 1.3.9.1