| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

Li9He8.cc

Go to the documentation of this file.
00001 // This program generates Li9/He8 events.
00002 // Sep. 09,2009  qinghe@princeton.edu
00003 
00004 #include "Li9He8.h"
00005 #include <iostream>
00006 #include <fstream>
00007 #include <cstdlib>
00008 #include <TROOT.h>
00009 #include <TRandom.h>
00010 #include <cmath>
00011 #include <TVector3.h>
00012 
00013 #include "GaudiKernel/GaudiException.h"
00014 
00015 using namespace std;
00016 using namespace CLHEP;
00017 
00018 Li9He8::Li9He8(IRndmGenSvc *rgs)
00019 {
00020   StatusCode sc = m_uni.initialize(rgs, Rndm::Flat(0,1));
00021   if (sc.isFailure()) {
00022     throw GaudiException("Failed to initialize uniform random numbers",
00023                          "GtDecayerator::DecayRates",StatusCode::FAILURE);
00024   }
00025   sc = m_breitwigner.initialize(rgs, Rndm::BreitWigner(0,1));
00026   if (sc.isFailure()) {
00027     throw GaudiException("Failed to initialize uniform random numbers",
00028                          "GtDecayerator::DecayRates",StatusCode::FAILURE);
00029   }
00030 
00031 }
00032 
00033 void Li9He8::RandomVector(TVector3& aVec)
00034 {
00035   double theta, phi;
00036   double rn1 = m_uni();
00037   double rn2 = m_uni();
00038   
00039   theta = acos(1-2*rn1);
00040   phi = 2*pi*rn2;
00041   
00042   aVec.SetMagThetaPhi(1.,theta,phi);
00043 }
00044 
00045 //Generate Li9 alpha sepectrum according data 
00046 //Nuclear Physics A450(1990) 189-208  fig.4
00047 double Li9He8::GetLi9AlphaEnergy(int whichcase)
00048 {
00049   //alpha sectra 
00050   double x[181],y[181];
00051 x[0]=0.0256274;y[0]=1831.06;
00052 x[1]=0.0633363;y[1]=2024.86;x[2]=0.101034;y[2]=2211.13;x[3]=0.119957;y[3]=2507.88;
00053 x[4]=0.13888;y[4]=2844.46;x[5]=0.170319;y[5]=3145.64;x[6]=0.214286;y[6]=3434.87;
00054 x[7]=0.25815;y[7]=3348.43;x[8]=0.295687;y[8]=3064.9;x[9]=0.326944;y[9]=2770.36;
00055 x[10]=0.345638;y[10]=2441.97;x[11]=0.364344;y[11]=2179.81;x[12]=0.383038;y[12]=1921.42;
00056 x[13]=0.407922;y[13]=1550.56;x[14]=0.432897;y[14]=1384.05;x[15]=0.457838;y[15]=1189.57;
00057 x[16]=0.464199;y[16]=1315.73;x[17]=0.476544;y[17]=1061.86;x[18]=0.488968;y[18]=936.029;
00058 x[19]=0.513955;y[19]=846.107;x[20]=0.538884;y[20]=718.107;x[21]=0.551309;y[21]=633.01;
00059 x[22]=0.557487;y[22]=572.266;x[23]=0.563642;y[23]=504.472;x[24]=0.576067;y[24]=444.691;
00060 x[25]=0.607312;y[25]=396.92;x[26]=0.6258;y[26]=278.848;x[27]=0.626018;y[27]=354.308;
00061 x[28]=0.632001;y[28]=258.526;x[29]=0.656862;y[29]=203.433;x[30]=0.675785;y[30]=230.735;
00062 x[31]=0.68186;y[31]=186.222;x[32]=0.694296;y[32]=166.237;x[33]=0.706675;y[33]=139.332;
00063 x[34]=0.725415;y[34]=129.167;x[35]=0.75039;y[35]=115.296;x[36]=0.888229;y[36]=104.146;
00064 x[37]=0.93842;y[37]=108.125;x[38]=0.982421;y[38]=122.617;x[39]=1.0074;y[39]=109.449;
00065 x[40]=1.03881;y[40]=118.025;x[41]=1.17665;y[41]=106.611;x[42]=1.19554;y[42]=116.432;
00066 x[43]=1.37112;y[43]=120.785;x[44]=1.40866;y[44]=110.558;x[45]=1.43994;y[45]=102.484;
00067 x[46]=1.54651;y[46]=101.133;x[47]=1.56535;y[47]=105.018;x[48]=1.59041;y[48]=102.387;
00068 x[49]=1.59656;y[49]=90.2576;x[50]=1.61546;y[50]=99.8223;x[51]=1.63421;y[51]=93.7139;
00069 x[52]=1.65298;y[52]=89.0953;x[53]=1.69686;y[53]=89.0707;x[54]=1.71557;y[54]=79.5085;
00070 x[55]=1.74074;y[55]=87.9307;x[56]=1.75318;y[56]=78.494;x[57]=1.88492;y[57]=85.6637;
00071 x[58]=1.89738;y[58]=78.4226;x[59]=1.91607;y[59]=69.1267;x[60]=1.94116;y[60]=69.9925;
00072 x[61]=1.96634;y[61]=78.3886;x[62]=1.99144;y[62]=80.3772;x[63]=2.00387;y[63]=70.8524;
00073 x[64]=2.01002;y[64]=62.4587;x[65]=2.02249;y[65]=57.9045;x[66]=2.03513;y[66]=64.8556;
00074 x[67]=2.14164;y[67]=59.3383;x[68]=2.15406;y[68]=52.3066;x[69]=2.18549;y[69]=57.1204;
00075 x[70]=2.21056;y[70]=56.396;x[71]=2.22305;y[71]=53.6187;x[72]=2.29195;y[72]=49.6914;
00076 x[73]=2.31701;y[73]=49.0612;x[74]=2.31701;y[74]=49.0612;x[75]=2.3609;y[75]=49.0476;
00077 x[76]=2.49263;y[76]=52.8572;x[77]=2.50507;y[77]=47.1846;x[78]=2.50507;y[78]=47.1846;
00078 x[79]=2.52389;y[79]=47.7774;x[80]=2.54265;y[80]=45.4228;x[81]=2.54265;y[81]=45.4228;
00079 x[82]=2.56134;y[82]=40.0385;x[83]=2.58019;y[83]=41.5767;x[84]=2.58019;y[84]=41.5767;
00080 x[85]=2.68073;y[85]=53.4643;x[86]=2.69943;y[86]=47.7246;x[87]=2.70559;y[87]=42.0708;
00081 x[88]=2.71174;y[88]=37.0868;x[89]=2.73056;y[89]=37.5528;x[90]=2.74322;y[90]=42.5944;
00082 x[91]=2.77454;y[91]=41.5258;x[92]=2.78698;y[92]=37.0692;x[93]=2.7994;y[93]=32.6765;
00083 x[94]=2.82444;y[94]=31.0648;x[95]=2.83082;y[95]=35.2368;x[96]=2.8372;y[96]=39.969;
00084 x[97]=2.87471;y[97]=35.227;x[98]=2.89977;y[98]=34.7803;x[99]=2.93111;y[99]=34.3378;
00085 x[100]=2.9874;y[100]=29.507;x[101]=3.00005;y[101]=33.4684;x[102]=3.01259;y[102]=33.4658;
00086 x[103]=3.03149;y[103]=37.0122;x[104]=3.05658;y[104]=37.4757;x[105]=3.07529;y[105]=33.4525;
00087 x[106]=3.10033;y[106]=32.206;x[107]=3.13794;y[107]=31.7951;x[108]=3.15658;y[108]=26.6481;
00088 x[109]=3.16297;y[109]=30.2269;x[110]=3.18181;y[110]=31.3881;x[111]=3.18797;y[111]=27.6697;
00089 x[112]=3.19412;y[112]=24.3917;x[113]=3.21287;y[113]=22.8991;x[114]=3.22552;y[114]=25.648;
00090 x[115]=3.2319;y[115]=29.0925;x[116]=3.25687;y[116]=25.9683;x[117]=3.34442;y[117]=20.1704;
00091 x[118]=3.36333;y[118]=22.5908;x[119]=3.38219;y[119]=23.7563;x[120]=3.41357;y[120]=24.667;
00092 x[121]=3.45105;y[121]=21.1992;x[122]=3.46347;y[122]=18.6871;x[123]=3.47599;y[123]=18.2204;
00093 x[124]=3.495;y[124]=22.8584;x[125]=3.52628;y[125]=21.1892;x[126]=3.55766;y[126]=22.0015;
00094 x[127]=3.58894;y[127]=20.3948;x[128]=3.60778;y[128]=20.913;x[129]=3.63899;y[129]=17.9737;
00095 x[130]=3.69545;y[130]=18.6598;x[131]=3.73912;y[131]=14.6816;x[132]=3.75157;y[132]=13.4406;
00096 x[133]=3.75796;y[133]=15.2456;x[134]=3.88329;y[134]=14.3031;x[135]=3.93996;y[135]=18.6311;
00097 x[136]=3.99617;y[136]=14.6578;x[137]=4.0086;y[137]=13.0847;x[138]=4.01502;y[138]=15.414;
00098 x[139]=4.03378;y[139]=14.6543;x[140]=4.04623;y[140]=13.2476;x[141]=4.14013;y[141]=11.2386;
00099 x[142]=4.15255;y[142]=9.90679;x[143]=4.17144;y[143]=10.8194;x[144]=4.17782;y[144]=12.2724;
00100 x[145]=4.22172;y[145]=12.4246;x[146]=4.25924;y[146]=11.0895;x[147]=4.28449;y[147]=13.3955;
00101 x[148]=4.34105;y[148]=15.5775;x[149]=4.37201;y[149]=10.1457;x[150]=4.46601;y[150]=9.64108;
00102 x[151]=4.5099;y[151]=9.76068;x[152]=4.51629;y[152]=11.0715;x[153]=4.55383;y[153]=10.1341;
00103 x[154]=4.61626;y[154]=7.58054;x[155]=4.61642;y[155]=6.04361;x[156]=4.70998;y[156]=5.32303;
00104 x[157]=4.77286;y[157]=6.50995;x[158]=4.80433;y[158]=7.47671;x[159]=4.82321;y[159]=8.06317;
00105 x[160]=4.8796;y[160]=7.76119;x[161]=4.96742;y[161]=8.15803;x[162]=5.09882;y[162]=6.09977;
00106 x[163]=5.13653;y[163]=6.74537;x[164]=5.19263;y[164]=4.7377;x[165]=5.25514;y[165]=3.82235;
00107 x[166]=5.33026;y[166]=3.36807;x[167]=5.3363;y[167]=2.61743;x[168]=5.3675;y[168]=2.22137;
00108 x[169]=5.43639;y[169]=2.05867;x[170]=5.58667;y[170]=1.66001;x[171]=5.66189;y[171]=1.63843;
00109 x[172]=5.71198;y[172]=1.51861;x[173]=5.84989;y[173]=1.47951;x[174]=5.9878;y[174]=1.45971;
00110 x[175]=6.11946;y[175]=1.4585;x[176]=6.18844;y[176]=1.47636;x[177]=6.2511;y[177]=1.42101;
00111 x[178]=6.45168;y[178]=1.34943;x[179]=6.65234;y[179]=1.39967;x[180]=6.92197;y[180]=1.45114;
00112  
00113   bool accept = 0;
00114   double alphaenergy = -1;
00115   if( whichcase == 1 ){//case 1, from x[0] to x[44]
00116     while(!accept){
00117       double sampling = m_uni()*x[44];
00118       //find y value of the sampling point 
00119       double yvalue = 0;
00120       for(int i=0;i<43;i++){
00121         if(sampling > x[i] && sampling < x[i+1]){
00122           yvalue = (y[i]+y[i+1])/2.;
00123           break;
00124         }
00125       }
00126 
00127       double max = 3500.0; //maximum of case 1
00128       if( yvalue > m_uni()*max ){
00129         alphaenergy = sampling;
00130         accept = 1;
00131       }
00132     }
00133   }
00134   if( whichcase == 2 ){//case 2, from x[44] to x[180]
00135     while(!accept){
00136       double sampling = m_uni()*(7.0-x[44])+x[44];
00137       //find y value of the sampling point 
00138       double yvalue = 0;
00139       for(int i=44;i<180;i++){
00140         if(sampling > x[i] && sampling < x[i+1]){
00141           yvalue = (y[i]+y[i+1])/2.;
00142           break;
00143         }
00144       }
00145 
00146       double max = 111.0; //maximum of case 2
00147       if( yvalue > m_uni()*max ){
00148         alphaenergy = sampling;
00149         accept = 1;
00150       }
00151     }
00152   }
00153 
00154   return alphaenergy;
00155 }
00156 
00157 //Generate He8 neutron sepectrum according data 
00158 //Nuclear Physics A366(1981) 461-468  fig.4
00159 double Li9He8::GetHe8NeutronEnergy()
00160 {
00161   double x[2000];
00162   double y[2000];
00163 x[0]=0.153478;y[0]=1.6369;
00164 x[1]=0.219561;y[1]=1.9881;x[2]=0.297456;y[2]=2.35119;x[3]=0.367927;y[3]=2.32143;
00165 x[4]=0.442927;y[4]=1.94643;x[5]=0.531232;y[5]=1.96429;x[6]=0.60873;y[6]=2.22619;
00166 x[7]=0.684524;y[7]=2.05357;x[8]=0.778758;y[8]=2.08333;x[9]=0.855089;y[9]=2.04762;
00167 x[10]=0.92458;y[10]=1.76786;x[11]=1.00093;y[11]=1.7381;x[12]=1.08301;y[12]=1.66667;
00168 x[13]=1.17085;y[13]=1.56548;x[14]=1.22908;y[14]=1.41667;x[15]=1.31653;y[15]=1.21429;
00169 x[16]=1.38128;y[16]=1.22619;x[17]=1.48088;y[17]=1.125;x[18]=1.55124;y[18]=1.06548;
00170 x[19]=1.63894;y[19]=0.928571;x[20]=1.7152;y[20]=0.875;x[21]=1.79743;y[21]=0.845238;
00171 x[22]=1.87967;y[22]=0.815476;x[23]=1.9497;y[23]=0.672619;x[24]=2.02633;y[24]=0.714286;
00172 x[25]=2.10212;y[25]=0.541667;x[26]=2.17264;y[26]=0.52381;x[27]=2.2489;y[27]=0.470238;
00173 x[28]=2.33665;y[28]=0.345238;x[29]=2.41349;y[29]=0.440476;x[30]=2.49542;y[30]=0.333333;
00174 x[31]=2.57782;y[31]=0.345238;x[32]=2.65437;y[32]=0.363095;x[33]=2.73049;y[33]=0.27381;
00175 x[34]=2.80717;y[34]=0.327381;x[35]=2.88336;y[35]=0.255952;x[36]=2.96555;y[36]=0.214286;
00176 x[37]=3.04797;y[37]=0.232143;x[38]=3.11811;y[38]=0.119048;x[39]=3.19484;y[39]=0.184524;
00177 x[40]=3.27659;y[40]=0.0297619;x[41]=3.34753;y[41]=0.119048;x[42]=3.43574;y[42]=0.113095;
00178 
00179   bool accept = 0;
00180   double nenergy = 0;
00181   while(!accept){
00182     double sampling = m_uni()*4;
00183     //find y value of the sampling point 
00184     double yvalue = 0;
00185     for(int i=0;i<42;i++){
00186       if(sampling > x[i] && sampling < x[i+1]){
00187         yvalue = (y[i]+y[i+1])/2.;
00188         break;
00189       }
00190     }
00191     double max = 2.5; //maximum 
00192     if( yvalue > m_uni()*max ){
00193       nenergy = sampling;
00194       accept = 1;
00195     }
00196   }
00197   return nenergy;
00198 }  
00199 
00200 // Chooses an intermediate energy for decays with broad levels
00201 // by thowing according to a Breit-Wigner form.  It is constrained,
00202 // however, to be >0 and less than the maximum available energy
00203 double Li9He8::GetIntermediateEnergy(double peak, double width, double max)
00204 {
00205   if (width==0) return peak;
00206 
00207   double energy= -1;
00208   do {
00209     //    energy = RandBreitWigner::shoot(peak,width);
00210     energy = m_breitwigner()*width+peak;
00211   } while (energy < 0 || energy > max);
00212   
00213   return energy;
00214 }
00215 
00216 //This Fermi function is copyed from Geant4
00217 double Li9He8::FermiFunc(double T, double Z) {
00218   double A1, A2;
00219   double P, U, S, Y;
00220   double F2;
00221   double E = T+1.;  
00222   P=std::sqrt(E*E-1.0) ;
00223   U=Z/137.0;
00224   S=std::sqrt(1.0-U*U) - 1.;
00225   Y = 2*pi*U*E/P;
00226   A1 = U*U*E*E + P*P/4.;
00227   A2 = std::fabs(Y/(1-std::exp(-Y)));
00228   F2 = std::pow(A1,S) * A2; 
00229   return F2;
00230 }
00231 // Unnormalized beta spectrum (allowed approximation, including fermi factor)
00232 // Z is for daughter nucleus, i.e. 3 for He-8, 4 for Li-9
00233 double Li9He8::BetaSpectrum(double E, double QOfDecay, double Z)
00234 {
00235   if(E>QOfDecay) return 0;
00236   else{
00237     return FermiFunc(E/electron_mass_c2, Z)*sqrt(E*E+2*electron_mass_c2*E)*(QOfDecay-E)*(QOfDecay-E)*(E+electron_mass_c2);
00238   }
00239 }
00240 
00241 //Get the spectrum max by sampling 100 events
00242 double Li9He8::GetSpectrumMax(double QOfDecay, int Z)
00243 {
00244   double max = 0;
00245   int nbins = 100;
00246   double de = QOfDecay/nbins;
00247   for(int i=0; i<100; i++){
00248     double E = de*(i+1);
00249     double betaE = FermiFunc(E/electron_mass_c2, Z)*sqrt(E*E+2*electron_mass_c2*E)*(QOfDecay-E)*(QOfDecay-E)*(E+electron_mass_c2);
00250     if(betaE > max) max = betaE;
00251   }
00252 
00253   return max*1.2; //enlarge a little bit to assure it is larger than max
00254 }
00255 // Uses accept/reject method to generate electron energy according to beta spectrum
00256 // the Z is for the daughter nucleus
00257 double Li9He8::GetElectronEnergy(double QOfDecay, int Z, double max)
00258 {
00259   double trialE, rn_y;
00260   do {
00261     trialE = QOfDecay*m_uni();
00262     rn_y = max*m_uni();
00263   } while ( rn_y > BetaSpectrum(trialE,QOfDecay,Z) );
00264   
00265   return trialE;
00266 }
00267 
00268 //This is the neutron spectrum line shape for Li9 2.43MeV state 
00269 //ref. Nuclear Physics A450(1990) 189-208 
00270 double Li9He8::Li9NeutronLineShape1(double x)
00271 {
00272   double mean  = 0.2279;
00273   double width = 0.3266;
00274   double norm  = 674.1;
00275   double mean2 = 0.6661;
00276   double width2= 0.05699;
00277   double norm2 = 24.78;
00278 
00279   double sum = norm*width/((x-mean)*(x-mean)+width*width/4.);
00280   sum += norm2*width2/((x-mean2)*(x-mean2)+width2*width2/4.);  
00281   return sum;
00282 }
00283 
00284 //This is the neutron spectrum line shape for Li9 2.43MeV state 
00285 //ref. Nuclear Physics A450(1990) 189-208 
00286 double Li9He8::Li9NeutronLineShape2(double x)
00287 {
00288   double mean  = 1.253;
00289   double width = 0.8205;
00290   double norm  = 219;
00291 
00292   return norm*width/((x-mean)*(x-mean)+width*width/4.);
00293 }
00294 //This is the neutron spectrum line shape for Li9 2.78MeV state 
00295 //ref. Nuclear Physics A450(1990) 189-208 
00296 double Li9He8::Li9NeutronLineShape3(double x)
00297 {
00298   double mean  = 0.8;
00299   double width = 1.5;
00300   double norm  = 100;
00301 
00302   return norm*width/((x-mean)*(x-mean)+width*width/4.);
00303 }
00304 
00305 //Get Li9 neutron spectrum from the above line shapes 
00306 double Li9He8::GetLi9NeutronEnergy(int whichshape, double max)
00307 {
00308   bool accept = 0;
00309   double trial_E = 0;
00310   double shapeV;
00311   while(!accept){
00312     double rand1 = m_uni()*3.;//random energy
00313     double rand2 = m_uni()*max;
00314     if(whichshape == 1) {
00315       shapeV = Li9NeutronLineShape1(rand1);
00316     }
00317     else if(whichshape == 2) {
00318       shapeV = Li9NeutronLineShape2(rand1);
00319     }
00320     else if(whichshape == 3) {
00321       rand1 = m_uni()*10.;
00322       shapeV = Li9NeutronLineShape3(rand1);
00323     }
00324     else {
00325       cout << "Error! The first parameter must be 1, 2 or 3." << endl; 
00326       break;
00327     }
00328     if(rand2 < shapeV) {//accept
00329       trial_E = rand1;
00330       accept=1;
00331     }
00332   }    
00333 
00334   return trial_E;
00335 }
00336 
00337 // For broad states, the final energy of the daughter nucleus is thrown according 
00338 // to a Breit-Wigner form
00339 //by default, only decays with neutrons are considered.
00340 //for complete decay, use the -complete_decay option
00341 void Li9He8::Li9Decay(TVector3 &pElectron,TVector3 &pNeutron,TVector3 &pAlpha1,
00342                       TVector3 &pAlpha2,double alpha_mass,bool complete_decay)
00343 {
00344   double rn;
00345   //default is to skip the decay without neutron
00346   if(complete_decay) rn= m_uni();
00347   else rn = m_uni()*(1.-0.492)+0.492;//start from 0.492
00348   double intermediateEnergy = 0;
00349   double betaenergy = 0;
00350   double nenergy = 0;
00351   double aenergy1 = 0;
00352   double aenergy2 = 0;
00353 
00354   double max = 0;
00355   if (rn<0.492){
00356     max = GetSpectrumMax(13.6067,4);
00357     betaenergy = GetElectronEnergy(13.6067,4,max);
00358   }
00359   else if (rn<0.789) {//case 1 for alpha spectra
00360     intermediateEnergy = GetIntermediateEnergy(2.429,0.00077,13.6067);
00361     max = GetSpectrumMax(13.6067-intermediateEnergy,4);
00362     betaenergy = GetElectronEnergy(13.6067-intermediateEnergy,4,max);
00363     nenergy = GetLi9NeutronEnergy(1,8264);
00364     aenergy1 = GetLi9AlphaEnergy(1);
00365     aenergy2 = GetLi9AlphaEnergy(1);
00366   }
00367   else if (rn < 0.947) {//case 1 for alpha spectra
00368     intermediateEnergy = GetIntermediateEnergy(2.78,1.08,13.6067);
00369     max = GetSpectrumMax(13.6067-intermediateEnergy,4);
00370     betaenergy = GetElectronEnergy(13.6067-intermediateEnergy,4,max);
00371     nenergy = GetLi9NeutronEnergy(2,1068);
00372     aenergy1 = GetLi9AlphaEnergy(1);
00373     aenergy2 = GetLi9AlphaEnergy(1);
00374   }
00375   else if (rn < 0.962) {//case 2 for alpha spectra
00376     intermediateEnergy = GetIntermediateEnergy(7.94,1.0,13.6067);
00377     max = GetSpectrumMax(13.6067-intermediateEnergy,4);
00378     betaenergy = GetElectronEnergy(13.6067-intermediateEnergy,4,max);
00379     nenergy = GetLi9NeutronEnergy(3,300);
00380     aenergy1 = GetLi9AlphaEnergy(2);
00381     aenergy2 = GetLi9AlphaEnergy(2);
00382   }
00383   else if (rn < 0.973) {//case 2 for alpha spectra
00384     intermediateEnergy = GetIntermediateEnergy(11.283,0.575,13.6067);
00385     max = GetSpectrumMax(13.6067-intermediateEnergy,4);
00386     betaenergy = GetElectronEnergy(13.6067-intermediateEnergy,4,max);
00387     nenergy = GetLi9NeutronEnergy(3,300);
00388     aenergy1 = GetLi9AlphaEnergy(2);
00389     aenergy2 = GetLi9AlphaEnergy(2);
00390   }
00391   else {//case 2 for alpha spectra
00392     intermediateEnergy = GetIntermediateEnergy(11.81,0.400,13.6067);
00393     max = GetSpectrumMax(13.6067-intermediateEnergy,4);
00394     betaenergy = GetElectronEnergy(13.6067-intermediateEnergy,4,max);
00395     nenergy = GetLi9NeutronEnergy(3,300);
00396     aenergy1 = GetLi9AlphaEnergy(2);
00397     aenergy2 = GetLi9AlphaEnergy(2);
00398   }
00399 
00400   // Electron momentum vector is isotropic
00401   double eMom = sqrt(2*betaenergy*electron_mass_c2+betaenergy*betaenergy);
00402   eMom *= MeV;
00403   RandomVector(pElectron);
00404   pElectron *= eMom;
00405 
00406   // Neutron momentum vector is isotropic
00407   if(nenergy>0){//there is neutron come out
00408     double nMom = sqrt(2*nenergy*neutron_mass_c2+nenergy*nenergy);
00409     nMom *= MeV;
00410     RandomVector(pNeutron);
00411     pNeutron *= nMom;
00412 
00413     //alpha momentum setup isotropically
00414     double aMom1 = sqrt(2*aenergy1*alpha_mass+aenergy1*aenergy1);
00415     aMom1 *= MeV;
00416     RandomVector(pAlpha1);
00417     pAlpha1 *= aMom1;
00418 
00419     //alpha2
00420     double aMom2 = sqrt(2*aenergy2*alpha_mass+aenergy2*aenergy2);
00421     aMom2 *= MeV;
00422     RandomVector(pAlpha2);
00423     pAlpha2 *= aMom2;
00424   }  
00425 }
00426 
00427 //He8 decay
00428 //by default, only decays with neutrons are considered.
00429 //for complete decay, use the -complete_decay option
00430 //ref. Nucler Physics A366 (1981) 461-468, Nuclear Physics A487 (1988) 269-278 
00431 void Li9He8::He8Decay(TVector3 &pElectron, TVector3 &pNeutron, TVector3 &pGamma,
00432               bool complete_decay)
00433 {
00434   double rn;
00435   //degault is to skip the decay without neutron
00436   if(complete_decay) rn= m_uni();
00437   else rn = m_uni()*(1-0.84)+0.84; //start from 0.84
00438   double intermediateEnergy = 0;
00439   double betaenergy = 0;
00440   double nenergy = 0;
00441   double gammaenergy = 0;
00442 
00443   double max = 0;
00444   if (rn<0.84){//84% to the 0.9808MeV state, no neutron
00445     max = GetSpectrumMax(10.649-0.9808,3);//(Q,Z)
00446     betaenergy = GetElectronEnergy(10.649-0.9808,3,max);
00447     gammaenergy = 0.9808;
00448   }
00449   else {//16% neutron
00450     nenergy = GetHe8NeutronEnergy();
00451     if( m_uni()<0.32 ){//32% gamma 
00452       gammaenergy = 0.478;
00453     }
00454     double He8Br = m_uni();
00455     if( He8Br<7.8/(7.8+2.6) ){//3.21 MeV state
00456       intermediateEnergy = GetIntermediateEnergy(3.21,1.0,10.649);
00457       max = GetSpectrumMax(10.649-intermediateEnergy,3);
00458       betaenergy = GetElectronEnergy(10.649-intermediateEnergy,3,max);
00459     }
00460     else {//5.4 MeV state
00461       intermediateEnergy = GetIntermediateEnergy(5.4,0.65,10.649);
00462       max = GetSpectrumMax(10.649-intermediateEnergy,3);
00463       betaenergy = GetElectronEnergy(10.649-intermediateEnergy,3,max);
00464     }
00465   }
00466 
00467   // Electron momentum vector is isotropic
00468   double eMom = sqrt(2*betaenergy*electron_mass_c2+betaenergy*betaenergy);
00469   eMom *= MeV;
00470   RandomVector(pElectron);
00471   pElectron *= eMom;
00472 
00473   // Neutron momentum vector is isotropic
00474   if(nenergy>0){//there is neutron come out
00475     //neutron momentum setup isotropically
00476     double nMom = sqrt(2*nenergy*neutron_mass_c2+nenergy*nenergy);
00477     nMom *= MeV;
00478     RandomVector(pNeutron);
00479     pNeutron *= nMom;
00480   }
00481 
00482   //gamma momentum setup isotropically
00483   if(gammaenergy>0){
00484     RandomVector(pGamma);
00485     pGamma *= gammaenergy*MeV;
00486   }
00487 }
00488 
00489 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 21:05:22 2011 for Li9He8Decay by doxygen 1.4.7