00001
00017 #include <cassert>
00018
00019 #include "BezrukovBugaevModel.h"
00020 #include "Integrator.h"
00021 #include "Constants.h"
00022
00023 ClassImp(BezrukovBugaevModel)
00024
00025
00026 BezrukovBugaevModel::BezrukovBugaevModel() :
00027 ProcessModel()
00028 {
00029
00030 }
00031
00032 BezrukovBugaevModel::BezrukovBugaevModel(const Material & material) :
00033 ProcessModel(material, Process::eNuclearInteraction)
00034 {
00035
00036 }
00037
00038 BezrukovBugaevModel::~BezrukovBugaevModel()
00039 {
00040
00041 }
00042
00043 ValidityRange_t BezrukovBugaevModel::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 BezrukovBugaevModel::dE_dx(double E) const
00054 {
00055
00056
00057
00058 return bnuc(E) * E;
00059 }
00060
00061 double BezrukovBugaevModel::bnuc(double E) const
00062 {
00063
00064
00065
00066 const int kNV = 600;
00067
00068 double Vmin = 0;
00069 double Vmax = V_max(E);
00070 double dV = (Vmax - Vmin) / kNV;
00071
00072 Integrator * integrator = Integrator::Instance();
00073
00074 double * vds = new double[kNV];
00075
00076 for(int iv = 0; iv < kNV; iv++) vds[iv] = (Vmin+(iv+1)*dV) * ds_dv(Vmin+(iv+1)*dV, E);
00077
00078 double integral = integrator->Simpson(vds, kNV, dV);
00079
00080 delete [] vds;
00081
00082
00083
00084
00085 return 1e-7*(MuELoss::Na/fMaterial.A())*integral;
00086 }
00087
00088 double BezrukovBugaevModel::V_max(double E) const
00089 {
00090
00091
00092
00093 return ( 1 - (3/4.)*sqrt(MuELoss::e)*(MuELoss::Mm/E)* pow(fMaterial.Z(),1/3.) );
00094 }
00095
00096 double BezrukovBugaevModel::ds_dv(double v, double E) const
00097 {
00098
00099
00100
00101
00102
00103 assert(E >= 0);
00104 assert(v > 0);
00105
00106 double sig = PhotonuclXSec(v,E);
00107 double g = 3.*G(v,E)/4.;
00108 double v2 = v*v;
00109 double t = MuELoss::Mm_2 *v2/(1-v);
00110 double k = 1. - 2./v + 2./v2;
00111
00112 assert(t > 0);
00113
00114 double m1_2_t = MuELoss::m1_2 / t;
00115 double m2_2_t = MuELoss::m2_2 / t;
00116 double mm_2_t = MuELoss::Mm_2 / t;
00117 double d = MuELoss::m1_2 / ( t + MuELoss::m1_2 );
00118
00119 double A = MuELoss::a * fMaterial.A() * sig * v / (2 * MuELoss::pi);
00120
00121 double B = g * ( k*log(1.+m1_2_t) - k*d - 2.*mm_2_t );
00122 double C = 0.25 * ( k*log(1.+m2_2_t) - 2.*mm_2_t );
00123 double D = 0.5*mm_2_t * ( g*d + 0.25*m2_2_t*log(1.+1./m2_2_t) );
00124
00125 return A*(B+C+D);
00126 }
00127
00128 double BezrukovBugaevModel::G(double v, double E) const
00129 {
00130
00131
00132
00133
00134
00135 assert(E >= 0);
00136 assert(v > 0);
00137 double A13 = pow(fMaterial.A(),1/3.);
00138 double x = 0.00282 * A13 * PhotonuclXSec(v,E);
00139 double x2 = x*x;
00140 double x3 = x2*x;
00141
00142 return 3. * ( x2/2. - 1. + (1.+x)*exp(-x) ) / x3;
00143 }
00144
00145 double BezrukovBugaevModel::PhotonuclXSec(double v, double E) const
00146 {
00147
00148
00149
00150
00151 assert(E >= 0);
00152 assert(v > 0);
00153
00154 double Ep = v*E;
00155 double loge = log(0.0213*1e-3*Ep);
00156
00157 return 114.3 + 1.647 * loge*loge;
00158 }
00159
00160
00161