00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <math.h>
00004 #include <assert.h>
00005 #include <math.h>
00006 #include "StiElossCalculator.h"
00007 #include "Stiostream.h"
00008 static double gsigma2(double ZoverA,double DENS,double CHARGE2
00009 ,double AMASS ,double BET2,double STEP );
00010 static double gdrelx (double A ,double Z ,double DENS ,double T,double HMASS);
00011
00012 using namespace std;
00013 StiElossCalculator::StiElossCalculator(double zOverA, double ionization, double A, double Z, double Dens)
00014 : _zOverA(zOverA), _ionization2(ionization*ionization), _A(A), _Z(Z), _Dens(Dens)
00015 {
00016 static int nCall=0; nCall++;
00017 assert(_A<=0 || _Z >0);
00018 mId=nCall;
00019 }
00020
00024
00025 StiElossCalculator::~StiElossCalculator(){}
00026
00041
00042 double StiElossCalculator::calculate(double z2, double m, double beta2) const
00043 {
00044 static int nCall=0; nCall++;
00045 if (_A <=0.) return 0.;
00046 double beta21 = 1 - beta2; if (beta21 < 1.e-10) beta21 = 1.e-10;
00047 double T = m*(1./::sqrt(beta21) - 1);
00048 double dedx = gdrelx(_A,_Z,_Dens,T,m)*z2*_Dens;
00049 return dedx;
00050 }
00051
00052 double StiElossCalculator::calcError(double z2, double m, double beta2) const
00053 {
00054 if (_A<=0.) return 0.;
00055 double err2=gsigma2(_Z/_A,1.,z2,m ,beta2,1.);
00056 return err2;
00057 }
00058
00059
00060 ostream& operator<<(ostream& os, const StiElossCalculator& m) {
00061 os << "zOverA "<< m.getzOverA()
00062 << "\tionization2 "<< m.getionization2()
00063 << "\tA "<< m.getA()
00064 << "\tZ "<< m.getZ()
00065 << "\tDens"<< m.getDens() << endl;
00066 return os;
00067 }
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 double gdrelx(double A,double Z,double DENS,double T,double HMASS)
00079 {
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 static const double AMUKEV=931494.32,AMUKEV50=pow(AMUKEV,0.50),AMUKEV45=pow(AMUKEV,0.45);
00105 static const double D=0.000153537,T1L=0.00001,T2L=0.002;
00106 static const double AVO=0.60221367,EMPROT=0.9382723,EMASS=0.0005109990615;
00107 static const double DCUTM=9999.;
00108
00109
00110 static const double B[93][6]={
00111 {0.},
00112 {1.262 ,1.44 ,242.6 ,12000. ,0.1159 ,18.8},
00113 {1.229 ,1.397 ,484.5 ,5873. ,0.05225 ,41.7},
00114 {1.411 ,1.6 ,725.6 ,3013. ,0.04578 ,47.6},
00115 {2.248 ,2.59 ,966. ,153.8 ,0.03475 ,62.7},
00116 {2.474 ,2.815 ,1206. ,1060. ,0.02855 ,76.0},
00117 {2.631 ,2.989 ,1445. ,957.2 ,0.02819 ,77.3},
00118 {2.954 ,3.35 ,1683. ,1900. ,0.02513 ,86.7},
00119 {2.652 ,3. ,1920. ,2000. ,0.0223 ,97.7},
00120 {2.085 ,2.352 ,2157. ,2634. ,0.01816 ,120.},
00121 {1.951 ,2.199 ,2393. ,2699. ,0.01568 ,139.},
00122 {2.542 ,2.869 ,2628. ,1854. ,0.01472 ,148.},
00123 {3.792 ,4.293 ,2862. ,1009. ,0.01397 ,156.},
00124 {4.154 ,4.739 ,2766. ,164.5 ,0.02023 ,162.},
00125 {4.15 ,4.7 ,3329. ,550. ,0.01321 ,165.},
00126 {3.232 ,3.647 ,3561. ,1560. ,0.01267 ,172.},
00127 {3.447 ,3.891 ,3792. ,1219. ,0.01211 ,180.},
00128 {5.047 ,5.714 ,4023. ,878.6 ,0.01178 ,185.},
00129 {5.731 ,6.5 ,4253. ,530. ,0.01123 ,194.},
00130 {5.151 ,5.833 ,4482. ,545.7 ,0.01129 ,193.},
00131 {5.521 ,6.252 ,4710. ,553.3 ,0.01112 ,196.},
00132 {5.201 ,5.884 ,4938. ,560.9 ,0.009995 ,218.},
00133 {4.862 ,5.496 ,5165. ,568.5 ,0.009474 ,230.},
00134 {4.48 ,5.055 ,5391. ,952.3 ,0.009117 ,239.},
00135 {3.983 ,4.489 ,5616. ,1336. ,0.008413 ,259.},
00136 {3.469 ,3.907 ,5725. ,1461. ,0.008829 ,270.},
00137 {3.519 ,3.963 ,6065. ,1243. ,0.007782 ,280.},
00138 {3.14 ,3.535 ,6288. ,1372. ,0.007361 ,296.},
00139 {3.553 ,4.004 ,6205. ,555.1 ,0.008763 ,310.},
00140 {3.696 ,4.175 ,4673. ,387.8 ,0.02188 ,322.},
00141 {4.21 ,4.75 ,6953. ,295.2 ,0.006809 ,320.},
00142 {5.041 ,5.697 ,7173. ,202.6 ,0.006725 ,324.},
00143 {5.554 ,6.3 ,6496. ,110. ,0.009689 ,330.},
00144 {5.323 ,6.012 ,7611. ,292.5 ,0.006447 ,338.},
00145 {5.874 ,6.656 ,7395. ,117.5 ,0.007684 ,340.},
00146 {5.611 ,6.335 ,8046. ,365.2 ,0.006244 ,349.},
00147 {6.411 ,7.25 ,8262. ,220. ,0.006087 ,358.},
00148 {5.694 ,6.429 ,8478. ,292.9 ,0.006087 ,358.},
00149 {6.339 ,7.159 ,8693. ,330.3 ,0.006003 ,363.},
00150 {6.407 ,7.234 ,8907. ,367.8 ,0.005889 ,370.},
00151 {6.734 ,7.603 ,9120. ,405.2 ,0.005765 ,378.},
00152 {6.902 ,7.791 ,9333. ,442.7 ,0.005587 ,390.},
00153 {6.425 ,7.248 ,9545. ,480.2 ,0.005367 ,406.},
00154 {6.799 ,7.671 ,9756. ,517.6 ,0.005315 ,410.},
00155 {6.108 ,6.887 ,9966. ,555.1 ,0.005151 ,423.},
00156 {5.924 ,6.677 ,10180. ,592.5 ,0.004919 ,443.},
00157 {5.238 ,5.9 ,10380. ,630. ,0.004758 ,458.},
00158 {5.623 ,6.354 ,7160. ,337.6 ,0.01394 ,466.},
00159 {5.814 ,6.554 ,10800. ,355.5 ,0.004626 ,471.},
00160 {6.23 ,7.024 ,11010. ,370.9 ,0.00454 ,480.},
00161 {6.41 ,7.227 ,11210. ,386.4 ,0.004474 ,487.},
00162 {7.5 ,8.48 ,8608. ,348. ,0.009074 ,494.},
00163 {6.979 ,7.871 ,11620. ,392.4 ,0.004402 ,495.},
00164 {7.725 ,8.716 ,11830. ,394.8 ,0.004376 ,498.},
00165 {8.231 ,9.289 ,12030. ,397.3 ,0.004384 ,497.},
00166 {7.287 ,8.218 ,12230. ,399.7 ,0.004447 ,490.},
00167 {7.899 ,8.911 ,12430. ,402.1 ,0.004511 ,483.},
00168 {8.041 ,9.071 ,12630. ,404.5 ,0.00454 ,480.},
00169 {7.489 ,8.444 ,12830. ,406.9 ,0.00442 ,493.},
00170 {7.291 ,8.219 ,13030. ,409.3 ,0.004298 ,507.},
00171 {7.098 ,8. ,13230. ,411.8 ,0.004182 ,521.},
00172 {6.91 ,7.786 ,13430. ,414.2 ,0.004058 ,537.},
00173 {6.728 ,7.58 ,13620. ,416.6 ,0.003976 ,548.},
00174 {6.551 ,7.38 ,13820. ,419. ,0.003877 ,562.},
00175 {6.739 ,7.592 ,14020. ,421.4 ,0.003863 ,564.},
00176 {6.212 ,6.996 ,14210. ,423.9 ,0.003725 ,585.},
00177 {5.517 ,6.21 ,14400. ,426.3 ,0.003632 ,600.},
00178 {5.219 ,5.874 ,14600. ,428.7 ,0.003498 ,623.},
00179 {5.071 ,5.706 ,14790. ,433. ,0.003405 ,640.},
00180 {4.926 ,5.542 ,14980. ,433.5 ,0.003342 ,652.},
00181 {4.787 ,5.386 ,15170. ,435.9 ,0.003292 ,662.},
00182 {4.893 ,5.505 ,15360. ,438.4 ,0.003243 ,672.},
00183 {5.028 ,5.657 ,15550. ,440.8 ,0.003195 ,682.},
00184 {4.738 ,5.329 ,15740. ,443.2 ,0.003186 ,684.},
00185 {4.574 ,5.144 ,15930. ,442.4 ,0.003144 ,693.},
00186 {5.2 ,5.851 ,16120. ,441.6 ,0.003122 ,698.},
00187 {5.07 ,5.704 ,16300. ,440.9 ,0.003082 ,707.},
00188 {4.945 ,5.563 ,16490. ,440.1 ,0.002965 ,735.},
00189 {4.476 ,5.034 ,16670. ,439.3 ,0.002871 ,759.},
00190 {4.856 ,5.46 ,18320. ,438.5 ,0.002542 ,755.},
00191 {4.308 ,4.843 ,17040. ,487.8 ,0.002882 ,756.},
00192 {4.723 ,5.311 ,17220. ,537. ,0.002913 ,748.},
00193 {5.319 ,5.982 ,17400. ,586.3 ,0.002871 ,759.},
00194 {5.956 ,6.7 ,17800. ,677. ,0.00266 ,765.},
00195 {6.158 ,6.928 ,17770. ,586.3 ,0.002812 ,775.},
00196 {6.204 ,6.979 ,17950. ,586.3 ,0.002776 ,785.},
00197 {6.181 ,6.954 ,18120. ,586.3 ,0.002748 ,793.},
00198 {6.949 ,7.82 ,18300. ,586.3 ,0.002737 ,796.},
00199 {7.506 ,8.448 ,18480. ,586.3 ,0.002727 ,799.},
00200 {7.649 ,8.609 ,18660. ,586.3 ,0.002697 ,808.},
00201 {7.71 ,8.679 ,18830. ,586.3 ,0.002641 ,825.},
00202 {7.407 ,8.336 ,19010. ,586.3 ,0.002603 ,837.},
00203 {7.29 ,8.204 ,19180. ,586.3 ,0.002573 ,847.}};
00204
00205 static const double CECOF[7]={0.,0.42237,0.0304,-0.00038,3.858,-0.1668,0.00158};
00206 double C[6]={0};
00207
00208 double poti,p,e,beta,bet2,tau,sl,sh,eta,eta2,b2g2,tmax,cc,x0,x1,xa,xm,delta;
00209 double f1,f2,f3,f4,f5,tupp,ce,st,sbb,dedx;
00210
00211
00212
00213
00214 int iz=(int)(Z+1e-8); if (iz == 92) iz = 91;
00215 double wt1=Z-iz,wt0 = 1-wt1;
00216 assert((iz>0)&&(iz<92));
00217
00218
00219
00220 double fac=AVO/A;
00221 C[0]=fac*AMUKEV50*(B[iz][0]*wt0+B[iz+1][0]*wt1);
00222 C[1]=fac*AMUKEV45*(B[iz][1]*wt0+B[iz+1][1]*wt1);
00223 C[2]=fac* (B[iz][2]*wt0+B[iz+1][2]*wt1)/AMUKEV;
00224 C[3]= (B[iz][3]*wt0+B[iz+1][3]*wt1)/AMUKEV;
00225 C[4]=AMUKEV* (B[iz][4]*wt0+B[iz+1][4]*wt1);
00226
00227 C[5]= (B[iz][5]*wt0+B[iz+1][5]*wt1)*1.E-9;
00228
00229
00230 double hmass2 = HMASS*HMASS;
00231 double T1LIM=HMASS*T1L/EMPROT;
00232 double T2LIM=HMASS*T2L/EMPROT;
00233
00234
00235
00236
00237 if(T<=T1LIM) {
00238 tau=T/HMASS;
00239 dedx=C[0]*pow(tau,0.5);
00240 } else {
00241
00242
00243
00244 if(T<=T2LIM) {
00245 tau=T/HMASS;
00246 sl=C[1]*pow(tau,0.45);
00247 sh=C[2]*log(1.+C[3]/tau+C[4]*tau)/tau;
00248 dedx=sl*sh/(sl+sh);
00249
00250
00251
00252 } else {
00253 p=sqrt(T*(T+2.*HMASS));
00254 e=T+HMASS;
00255 beta=p/e;
00256 bet2=beta*beta;
00257 eta=p/HMASS;
00258 eta2=eta*eta;
00259
00260 b2g2=eta*eta;
00261
00262 tmax=2.*EMASS*T*(T+2.*HMASS);
00263
00264
00265 tmax=tmax/(hmass2+EMASS*(EMASS+2.*e));
00266
00267
00268
00269
00270 poti=C[5];
00271 cc=1.+2.*log(poti/(28.8E-9*sqrt(DENS*Z/A)));
00272
00273 if(DENS>0.05) {
00274 if(poti < 1.E-7) {
00275 if(cc < 3.681) {
00276 x0=0.2;
00277 } else {
00278 x0=0.326*cc-1.;
00279 }
00280 x1=2.;
00281 } else {
00282 if(cc < 5.215) {
00283 x0=0.2;
00284 } else {
00285 x0=0.326*cc-1.5;
00286 }
00287 x1=3.;
00288 }
00289
00290 } else {
00291 if(cc<=12.25) {
00292 int ip=(int)((cc-10.)/0.5)+1;
00293 if(ip < 0) ip=0;
00294 if(ip>4) ip=4;
00295 x0=1.6+0.1*ip;
00296 x1=4.;
00297 } else {
00298 if(cc<=13.804) {
00299 x0=2.;
00300 x1=5.;
00301 } else {
00302 x0=0.326*cc-2.5;
00303 x1=5.;
00304 }
00305 }
00306 }
00307
00308 xa=cc/4.606;
00309 xm=3.;
00310 double aa=4.606*(xa-x0)/pow(x1-x0,xm);
00311
00312 double x=log10(eta);
00313 delta=0.;
00314 if(x>x0) {
00315 delta=4.606*x-cc;
00316 if(x < x1) delta=delta+aa*pow(x1-x,xm);
00317 }
00318
00319
00320
00321 double potsq=poti*poti;
00322 if(eta>0.13) {
00323 f1=1./eta2;
00324 f2=f1*f1;
00325 f3=f1*f2;
00326 f4=(f1*CECOF[1]+f2*CECOF[2]+f3*CECOF[3])*1.E+12;
00327 f5=(f1*CECOF[4]+f2*CECOF[5]+f3*CECOF[6])*1.E+18;
00328 ce=f4*potsq+f5*potsq*poti;
00329 } else {
00330 eta2=0.0169;
00331 f1=1./eta2;
00332 f2=f1*f1;
00333 f3=f1*f2;
00334 f4=(f1*CECOF[1]+f2*CECOF[2]+f3*CECOF[3])*1.E+12;
00335 f5=(f1*CECOF[4]+f2*CECOF[5]+f3*CECOF[6])*1.E+18;
00336 ce=f4*potsq+f5*potsq*poti;
00337 ce=ce*log(T/T2LIM)/log(0.0079/T2LIM);
00338 }
00339
00340 f1=D*Z/(A*bet2);
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350 tupp=DCUTM;
00351 if(tmax < DCUTM) tupp=tmax;
00352 f2=log(2.*EMASS*b2g2/poti)+log(tupp/poti)-bet2*(1.+tupp/tmax);
00353
00354 dedx=f1*(f2-delta-2.*ce/Z);
00355
00356
00357 tau=T2LIM/HMASS;
00358 sl=C[1]*pow(tau,0.45);
00359 sh=C[2]*log(1.+C[3]/tau+C[4]*tau)/tau;
00360 st=sl*sh/(sl+sh);
00361
00362 tmax=2.*EMASS*T2LIM*(T2LIM+2.*HMASS);
00363
00364
00365 tmax=tmax/(HMASS*HMASS+EMASS*EMASS+2.*EMASS*(T2LIM+HMASS));
00366
00367 bet2=T2LIM*(T2LIM+2.*HMASS)/pow(T2LIM+HMASS,2);
00368 sbb=2.*(log(tmax/poti)-bet2);
00369 sbb=D*Z*sbb/(A*bet2);
00370 double corbb=(st/sbb-1.)*T2LIM;
00371
00372 dedx=dedx*(1.+corbb/T);
00373
00374 }
00375 }
00376 return dedx;
00377 }
00378
00379
00380
00381 double gsigma2(double ZoverA,double DENS,double CHARGE2
00382 ,double AMASS ,double BET2,double STEP )
00383 {
00384
00385
00386 static const double DGEV=0.153536E-3,EMASS=0.0005109990615;
00387
00388 double gamm2 = 1./(1.-BET2);
00389 double gamma = sqrt(gamm2);
00390
00391
00392 double xi = DGEV*CHARGE2*STEP*DENS*ZoverA/(BET2);
00393
00394
00395
00396
00397
00398
00399
00400 double eta2 = BET2*gamm2;
00401 double ratio = EMASS/AMASS;
00402 double emax =(2*EMASS*eta2)/(1+2*ratio*gamma+ratio*ratio);
00403
00404
00405
00406
00407 double sigma2 = xi*(1.-0.5*BET2)*emax;
00408 return sigma2;
00409 }