00001 #include "KRLInverseBeta.hh"
00002 #include "stdio.h"
00003
00004
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);
00016 fDifferential = new TF1("fDifferential",gKRLDSigmaByDCosTheta, -1, 1, 1);
00017 fDifferential->SetParameter(0,3);
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 ) {
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
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
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);
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;
00115
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
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
00133
00134
00135 KRLInverseBeta* gInverseBeta = new KRLInverseBeta();
00136 double value = gInverseBeta->DSigDCosTh(enu, cosTheta);
00137 delete gInverseBeta;
00138
00139 return value;
00140 }
00141
00142
00143
00144
00145 Double_t gKRLSigmaTotal(Double_t* x, Double_t*a) {
00146
00147
00148
00149
00150
00151 KRLInverseBeta* gInverseBeta = new KRLInverseBeta();
00152 double value = gInverseBeta->SigmaTot(x[0]);
00153 delete gInverseBeta;
00154
00155 return value;
00156 }
00157