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

In This Package:

KRLInverseBeta.cc

Go to the documentation of this file.
00001 #include "KRLInverseBeta.hh"
00002 #include "stdio.h"
00003 
00004 //KRLInverseBeta* gInverseBeta;
00005 
00006 KRLInverseBeta::KRLInverseBeta() {
00007   fF = 1;
00008   fG = 1.26;
00009   fF2 = 3.706;
00010   fDelta = gkMassNeutron - gkMassProton;
00011   fMassEsq = gkMassElectron*gkMassElectron;
00012   fYsq = (fDelta*fDelta - fMassEsq)/2;
00013   fF2Plus3G2 = fF*fF + 3*fG*fG;
00014   fF2MinusG2 = fF*fF - fG*fG;
00015   fSigma0 = 0.0952/(fF2Plus3G2); // *10^{-42} cm^2, eqn 9
00016   fDifferential = new TF1("fDifferential",gKRLDSigmaByDCosTheta, -1, 1, 1);
00017   fDifferential->SetParameter(0,3); // default enu = 3 MeV
00018   fHTotalCrossSection = NULL;
00019 }
00020 
00021 KRLInverseBeta::~KRLInverseBeta() {
00022   delete fDifferential;
00023   delete fHTotalCrossSection;
00024 }
00025 
00027 Double_t KRLInverseBeta::Ee1(Double_t aEnu, Double_t aCosTheta) {
00028   Double_t answer;
00029   fE0 = Ee0(aEnu);
00030   if( fE0 <= gkMassElectron ) { // below threshold
00031     fE0 = 0;
00032     fP0 = 0;
00033     answer = 0;
00034   } else {
00035     fP0 = TMath::Sqrt(fE0*fE0 - fMassEsq);
00036     fV0 = fP0/fE0;
00037     Double_t sqBracket = 1 - aEnu*(1-fV0*aCosTheta)/gkMassProton;
00038     answer = fE0*sqBracket - fYsq/gkMassProton;
00039   }
00040   return answer;
00041 }
00042 
00043 Double_t KRLInverseBeta::DSigDCosTh(Double_t aEnu, Double_t aCosTheta) {
00044   fE1 = Ee1(aEnu, aCosTheta);
00045   Double_t answer;
00046   if( fE1<gkMassElectron ) {
00047     answer = 0;
00048   } else {
00049     Double_t pe1 = TMath::Sqrt(fE1*fE1 - fMassEsq);
00050     Double_t ve1 = pe1/fE1;
00051     Double_t firstLine = (fSigma0/2) * (fF2Plus3G2 + fF2MinusG2*ve1*aCosTheta)* fE1*pe1;
00052     Double_t secondLine = fSigma0 * GammaTerm(aCosTheta) * fE0 * fP0 / (2* gkMassProton); 
00053     answer = firstLine - secondLine;
00054   }
00055   return answer;
00056 }
00057 
00058 Double_t KRLInverseBeta::GammaTerm(Double_t aCosTheta) {
00059   Double_t firstLine = (2*fE0+fDelta)*(1-fV0*aCosTheta)-fMassEsq/fE0;
00060   firstLine *= (2*(fF+fF2)*fG);
00061   Double_t secondLine = fDelta*(1+fV0*aCosTheta) +fMassEsq/fE0;
00062   secondLine *= (fF*fF+fG*fG);
00063   Double_t thirdLine = fF2Plus3G2 *( (fE0+fDelta)*(1-aCosTheta/fV0) - fDelta);
00064   Double_t fourthLine = (fF*fF - fG*fG)*fV0*aCosTheta;
00065   fourthLine *= ( (fE0+fDelta)*(1-aCosTheta/fV0) - fDelta );
00066 
00067   Double_t answer = firstLine + secondLine + thirdLine + fourthLine;
00068   return answer;
00069 
00070 }
00071 
00072 Double_t KRLInverseBeta::SigmaTot(Double_t aEnu) {
00073   //  fDifferential->SetParameter(0, aEnu);
00074   Double_t answer;
00075   if( aEnu<0 ) {
00076     Warning("SigmaTot(Double_t aEnu)","Tried to calculate cross section for -ve nu energy");
00077     return 0;
00078   }
00079   if( aEnu>10 ) {
00080     // table on precalculated to 10 MeV
00081     answer = fDifferential->Integral(-1.0, 1.0, &aEnu, 1e-9);
00082     return answer;
00083   }
00084   if( fHTotalCrossSection==NULL ) setupTotalCrossSection();
00085   int bin = fHTotalCrossSection->FindBin(aEnu);
00086   Double_t answer1 =  fHTotalCrossSection->GetBinContent(bin);
00087   Double_t e1 = fHTotalCrossSection->GetBinCenter(bin);
00088   Double_t answer2, e2;
00089   if( bin!=1000 ) {
00090     answer2 =  fHTotalCrossSection->GetBinContent(bin+1);
00091     e2 = fHTotalCrossSection->GetBinCenter(bin+1);
00092   } else {
00093     answer2 =  fHTotalCrossSection->GetBinContent(bin-1);
00094     e2 = fHTotalCrossSection->GetBinCenter(bin-1);
00095   }
00096   answer = answer1 + (answer2-answer1)*( aEnu-e1)/(e2-e1); // answer1 + slope correction
00097   return answer;
00098 }
00099 
00100 void KRLInverseBeta::setupTotalCrossSection() {
00101   fHTotalCrossSection = new TH1D("htotalCross","Total #nu (p,n) e Cross Section", 1000, 0, 10);
00102   Double_t enu;
00103   for( int i=1 ; i<=1000 ; i++ ) {
00104     enu = fHTotalCrossSection->GetBinCenter(i);
00105     fHTotalCrossSection->SetBinContent(i, fDifferential->Integral(-1.0, 1.0, &enu, 1e-9) );
00106 
00107   }
00108 }
00109 
00110 
00113 Double_t KRLInverseBeta::PromptEnergyToNeutrinoEnergy(Double_t aE_prompt) {
00114   Double_t ePos = aE_prompt - gkMassElectron; // paper uses total E so only
00115   // subtract one mass
00116   Double_t a = -1/(gkMassProton);
00117   Double_t b = 1+fDelta/gkMassProton;
00118   Double_t c = -fYsq/gkMassProton - ePos - fDelta;
00119   Double_t answer1 = ( -b + sqrt(b*b-4*a*c) )/(2*a);
00120   Double_t answer2 = ( -b - sqrt(b*b-4*a*c) )/(2*a);
00121   //  printf("%e\t%e\t%e\t%e\t%e\n", aE_prompt, ePos, answer1, answer2, ePos+fDelta);
00122   return answer1;
00123 }
00124 
00129 Double_t gKRLDSigmaByDCosTheta(Double_t* x, Double_t*a) {
00130   Double_t cosTheta = x[0];
00131   Double_t enu = a[0];
00132   //  if( gInverseBeta==NULL ) gInverseBeta = new KRLInverseBeta();
00133   //  return gInverseBeta->DSigDCosTh(enu, cosTheta);
00134 
00135   KRLInverseBeta* gInverseBeta = new KRLInverseBeta();
00136   double value = gInverseBeta->DSigDCosTh(enu, cosTheta);
00137   delete gInverseBeta;
00138 
00139   return value;
00140 }
00141 
00142 
00143 //a global function to allow the total cross section call be put into a TF1
00144 // a redirect to KRLInverseBeta::SigmaTot()
00145 Double_t gKRLSigmaTotal(Double_t* x, Double_t*a) {
00146   // a not used
00147   // x[0] = neutrino energy (MeV)
00148   //  if( gInverseBeta==NULL ) gInverseBeta = new KRLInverseBeta();
00149   //return gInverseBeta->SigmaTot(x[0]);
00150 
00151   KRLInverseBeta* gInverseBeta = new KRLInverseBeta();
00152   double value = gInverseBeta->SigmaTot(x[0]);
00153   delete gInverseBeta;
00154 
00155   return value;
00156 }
00157 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 21:05:44 2011 for InvBetaDecay by doxygen 1.4.7