Page MenuHomeHEPForge

No OneTemporary

Index: trunk/src/gammagammaleptonpair.cpp
===================================================================
--- trunk/src/gammagammaleptonpair.cpp (revision 170)
+++ trunk/src/gammagammaleptonpair.cpp (revision 171)
@@ -1,848 +1,846 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright 2010
//
// This file is part of starlight.
//
// starlight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// starlight is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with starlight. If not, see <http://www.gnu.org/licenses/>.
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: $: revision of last commit
// $Author:: $: author of last commit
// $Date:: $: date of last commit
//
// Description:
// Nystrand 220710
// Fixed bug which gave incorrect minv distribution in gammagammaleptonpair.
// Moved loop over W and Y from pickw to twoLeptonCrossSection in
// gammagammaleptonpair to speed up event generation.
// Changed to Woods-Saxon radius in twophotonluminosity to be consistent
// with old starligt.
//
//
///////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include "starlightconstants.h"
#include "gammagammaleptonpair.h"
using namespace std;
//_____________________________________________________________________________
Gammagammaleptonpair::Gammagammaleptonpair(beamBeamSystem& bbsystem)
: eventChannel(bbsystem)
{
//Initialize randomgenerator with our seed.
cout<<"Randy in leptonpair construction: "<<randyInstance.Rndom()<<endl;
//Storing inputparameters into protected members for use
_GGlepInputnumw=inputParametersInstance.nmbWBins();
_GGlepInputnumy=inputParametersInstance.nmbRapidityBins();
_GGlepInputpidtest=inputParametersInstance.prodParticleType();
_GGlepInputGamma_em=inputParametersInstance.beamLorentzGamma();
//Let us read in the luminosity tables
read();
//Now we will calculate the crosssection
twoLeptonCrossSection();
//If it is a tauon, calculate its tables
- if(inputParametersInstance.prodParticleId()==starlightConstants::TAUON) calculateTable();
+ if(inputParametersInstance.prodParticleId()==starlightConstants::TAUONDECAY) calculateTable();
}
//______________________________________________________________________________
Gammagammaleptonpair::~Gammagammaleptonpair()
{ }
//______________________________________________________________________________
void Gammagammaleptonpair::twoLeptonCrossSection()
{
//This function calculates section for 2-particle decay. For reference, see STAR Note 243, Eq. 9.
//calculate the 2-lepton differential cross section
//the 100 is to convert to barns
//the 2 is to account for the fact that we integrate only over one half of the rapidity range
//Multiply all _Farray[] by _f_max
for(int i=0;i<_GGlepInputnumw;i++)
{
for(int j=0;j<_GGlepInputnumy;j++)
{
// _sigmax[i][j]=2.*Gammagammaleptonpair::twoMuonCrossSection(_Warray[i])*_f_max*_Farray[i][j]/100.;
_sigmax[i][j]=twoMuonCrossSection(_Warray[i])*_f_max*_Farray[i][j]/(100.*_Warray[i]);
}
}
//calculate the total two-lepton cross section
double sigmasum =0.;
for(int i=0;i<_GGlepInputnumw-1;i++)
{
for(int j=0;j<_GGlepInputnumy-1;j++)
{
// _sigmaSum = _sigmaSum +2.*((_sigmax[i][j]+_sigmax[i+1][j]+_sigmax[i][j+1]+_sigmax[i+1][j+1])/4.*(_Yarray[j+1]-_Yarray[j])*(_Warray[i+1]-_Warray[i])/((_Warray[i+1]+_Warray[i])/2.));
// _sigmaSum = _sigmaSum +((_sigmax[i][j]+_sigmax[i+1][j]+_sigmax[i][j+1]+_sigmax[i+1][j+1])/4.*(_Yarray[j+1]-_Yarray[j])*(_Warray[i+1]-_Warray[i])/((_Warray[i+1]+_Warray[i])/2.));
sigmasum = sigmasum +(_sigmax[i][j]+_sigmax[i+1][j]+_sigmax[i][j+1]+_sigmax[i+1][j+1])/4.*(_Yarray[j+1]-_Yarray[j])*(_Warray[i+1]-_Warray[i]);
}
}
cout << "The total "<<_GGlepInputpidtest<<" cross-section is: "<<sigmasum<<" barns."<<endl;
// Do this integration here, once per run rather than once per event (JN 220710)
//integrate sigma down to a function of just w
double sgf=0.;
for(int i=0;i<_ReadInputnumw;i++)
{
_sigofw[i]=0.;
for(int j=0;j<_ReadInputnumy-1;j++)
{
_sigofw[i] = _sigofw[i]+(_Yarray[j+1]-_Yarray[j])*(_sigmax[i][j+1]+_sigmax[i][j])/2.;
}
}
//calculate the unnormalized sgfint array
_sigfint[0]=0.;
for(int i=0;i<_ReadInputnumw-1;i++)
{
sgf=(_sigofw[i+1]+_sigofw[i])*(_Warray[i+1]-_Warray[i])/2.;
_sigfint[i+1]=_sigfint[i]+sgf;
}
//normalize sgfint array
_signormw=_sigfint[_ReadInputnumw-1];
for(int i=0;i<_ReadInputnumw;i++)
{
_sigfint[i]=_sigfint[i]/_signormw;
}
return;
}
//______________________________________________________________________________
double Gammagammaleptonpair::twoMuonCrossSection(double w)
{
//This function gives the two muon cross section as a function of Y&W.
//Using the formula given in G.Soff et. al Nuclear Equation of State, part B, 579
double s=0.,Etest=0.,deltat=0.,xL=0.,sigmuix=0.,alphasquared=0.,hbarcsquared=0.;
s = w*w;
Etest = 4.*getMass()*getMass()/s;
deltat = s * sqrt(1.-Etest);
xL = 2.*log(sqrt(s)/(2.*getMass())+sqrt(1./Etest-1.));
alphasquared = starlightConstants::alpha*starlightConstants::alpha;
hbarcsquared = starlightConstants::hbarc*starlightConstants::hbarc;
sigmuix = 4.*starlightConstants::pi*alphasquared/s*hbarcsquared*((1+Etest-0.5*Etest*Etest)*xL-(1./s+Etest/s)*deltat);
if(Etest > 1.)
sigmuix = 0.;
return sigmuix;
}
//______________________________________________________________________________
void Gammagammaleptonpair::pickw(double &w)
{
// This function picks a w for the 2-photon calculation.
double x=0.,remainarea=0.,remainw=0.,a=0.,b=0.,c=0.;
int ivalw=0;
if(_wdelta != 0)
{
w=_wdelta;
ivalw=_ivalwd;
remainw=_remainwd;
}
else{
//deal with the case where sigma is an array
//_sigofw is simga integrated over y using a linear interpolation
//sigint is the integral of sgfint, normalized
//pick a random number
x = randyInstance.Rndom();//random()/(RAND_MAX+1.0);
//compare x and sgfint to find the ivalue which is just less than the random number x
for(int i=0;i<_GGlepInputnumw;i++)
{
if(x > _sigfint[i]) ivalw=i;
}
//remainder above ivalw
remainarea = x - _sigfint[ivalw];
//figure out what point corresponds to the excess area in remainarea
c = -remainarea*_signormw/(_Warray[ivalw+1]-_Warray[ivalw]);
b = _sigofw[ivalw];
a = (_sigofw[ivalw+1]-_sigofw[ivalw])/2.;
if(a==0.)
{
remainw = -c/b;
}
else{
remainw = (-b+sqrt(b*b-4.*a*c))/(2.*a);
}
_ivalwd = ivalw;
_remainwd = remainw;
//calculate the w value
w = _Warray[ivalw]+(_Warray[ivalw+1]-_Warray[ivalw])*remainw;
-
}
}
//______________________________________________________________________________
void Gammagammaleptonpair::picky(double &y)
{
// This function picks a y given a W
double * sigofy;
double * sgfint;
sigofy = new double[starlightLimits::MAXYBINS];
sgfint = new double[starlightLimits::MAXWBINS];
double remainw =0.,remainarea=0.,remainy=0.,a=0.,b=0.,c=0.,sgf=0.,signorm=0.,x=0.;
int ivalw=0,ivaly=0;
ivalw=_ivalwd;
remainw=_remainwd;
//average over two colums to get y array
for(int j=0;j<_GGlepInputnumy;j++)
{
sigofy[j]=_sigmax[ivalw][j]+(_sigmax[ivalw+1][j]-_sigmax[ivalw][j])*remainw;
}
//calculate the unnormalized sgfint
sgfint[0]=0.;
for(int j=0;j<_GGlepInputnumy-1;j++)
{
sgf = (sigofy[j+1]+sigofy[j])/2.;
sgfint[j+1]=sgfint[j]+sgf*(_Yarray[j+1]-_Yarray[j]);
}
//normalize the sgfint array
signorm = sgfint[_GGlepInputnumy-1];
for(int j=0;j<_GGlepInputnumy;j++)
{
sgfint[j]=sgfint[j]/signorm;
}
//pick a random number
x = randyInstance.Rndom();//random()/(RAND_MAX+1.0);
//compare x and sgfint to find the ivalue which is just less then the random number x
for(int i=0;i<_GGlepInputnumy;i++)
{
if(x > sgfint[i]) ivaly = i;
}
//remainder above ivaly
remainarea = x - sgfint[ivaly];
//figure what point corresponds to the leftover area in remainarea
c = -remainarea*signorm/(_Yarray[ivaly+1]-_Yarray[ivaly]);
b = sigofy[ivaly];
a = (sigofy[ivaly+1]-sigofy[ivaly])/2.;
if(a==0.)
{
remainy = -c/b;
}
else{
remainy = (-b + sqrt(b*b-4.*a*c))/(2.*a);
}
//calculate the y value
y = _Yarray[ivaly]+(_Yarray[ivaly+1]-_Yarray[ivaly])*remainy;
delete[] sigofy;
delete[] sgfint;
}
//______________________________________________________________________________
void Gammagammaleptonpair::pairMomentum(double w,double y,double &E,double &px,double &py,double &pz)
{
//this function calculates px,py,pz,and E given w and y
double anglepp1=0.,anglepp2=0.,pp1=0.,pp2=0.,E1=0.,E2=0.,signpx=0.,pt=0.;
//E1 and E2 are for the 2 photons in the CM frame
E1 = w*exp(y)/2.;
E2 = w*exp(-y)/2.;
//calculate px and py
//to get x and y components-- phi is random between 0 and 2*pi
anglepp1 = randyInstance.Rndom();//random()/(RAND_MAX+1.0);
anglepp2 = randyInstance.Rndom();//random()/(RAND_MAX+1.0);
pp1 = pp_1(E1);
pp2 = pp_2(E2);
px = pp1*cos(2.*starlightConstants::pi*anglepp1)+pp2*cos(2.*starlightConstants::pi*anglepp2);
py = pp1*sin(2.*starlightConstants::pi*anglepp1)+pp2*sin(2.*starlightConstants::pi*anglepp2);
//Compute vector sum Pt=Pt1+Pt2 to find pt for the produced particle
pt = sqrt(px*px+py*py);
//W is the mass of the produced particle (not necessarily on-mass-shell).Now compute its energy and pz
E = sqrt(w*w+pt*pt)*cosh(y);
pz= sqrt(w*w+pt*pt)*sinh(y);
signpx = randyInstance.Rndom();//random()/(RAND_MAX+1.0);
//pick the z direction
//Don't do this anymore since y goes from -ymax to +ymax (JN 15-02-2013)
//if(signpx > 0.5) pz = -pz;
}
//______________________________________________________________________________
double Gammagammaleptonpair::pp_1(double E)
{
// This is for beam 1
// returns on random draw from pp(E) distribution
double ereds =0.,Cm=0.,Coef=0.,x=0.,pp=0.,test=0.,u=0.;
double singleformfactorCm=0.,singleformfactorpp1=0.,singleformfactorpp2=0.;
int satisfy =0;
ereds = (E/_GGlepInputGamma_em)*(E/_GGlepInputGamma_em);
//sqrt(3)*E/gamma_em is p_t where the distribution is a maximum
Cm = sqrt(3.)*E/_GGlepInputGamma_em;
//the amplitude of the p_t spectrum at the maximum
singleformfactorCm=_bbs.beam1().formFactor(Cm*Cm+ereds);
Coef = 3.0*(singleformfactorCm*singleformfactorCm*Cm*Cm*Cm)/((2.*(starlightConstants::pi)*(ereds+Cm*Cm))*(2.*(starlightConstants::pi)*(ereds+Cm*Cm)));
//pick a test value pp, and find the amplitude there
x = randyInstance.Rndom();
pp = x*5.*starlightConstants::hbarc/_bbs.beam1().nuclearRadius();
singleformfactorpp1=_bbs.beam1().formFactor(pp*pp+ereds);
test = (singleformfactorpp1*singleformfactorpp1)*pp*pp*pp/((2.*starlightConstants::pi*(ereds+pp*pp))*(2.*starlightConstants::pi*(ereds+pp*pp)));
while(satisfy==0){
u = randyInstance.Rndom();
if(u*Coef <= test)
{
satisfy =1;
}
else{
x =randyInstance.Rndom();
pp = 5*starlightConstants::hbarc/_bbs.beam1().nuclearRadius()*x;
singleformfactorpp2=_bbs.beam1().formFactor(pp*pp+ereds);
test = (singleformfactorpp2*singleformfactorpp2)*pp*pp*pp/(2.*starlightConstants::pi*(ereds+pp*pp)*2.*starlightConstants::pi*(ereds+pp*pp));
}
}
return pp;
}
//______________________________________________________________________________
double Gammagammaleptonpair::pp_2(double E)
{
// This is for beam 2
//returns on random draw from pp(E) distribution
double ereds =0.,Cm=0.,Coef=0.,x=0.,pp=0.,test=0.,u=0.;
double singleformfactorCm=0.,singleformfactorpp1=0.,singleformfactorpp2=0.;
int satisfy =0;
ereds = (E/_GGlepInputGamma_em)*(E/_GGlepInputGamma_em);
//sqrt(3)*E/gamma_em is p_t where the distribution is a maximum
Cm = sqrt(3.)*E/_GGlepInputGamma_em;
//the amplitude of the p_t spectrum at the maximum
singleformfactorCm=_bbs.beam2().formFactor(Cm*Cm+ereds);
Coef = 3.0*(singleformfactorCm*singleformfactorCm*Cm*Cm*Cm)/((2.*(starlightConstants::pi)*(ereds+Cm*Cm))*(2.*(starlightConstants::pi)*(ereds+Cm*Cm)));
//pick a test value pp, and find the amplitude there
x = randyInstance.Rndom();
pp = x*5.*starlightConstants::hbarc/_bbs.beam2().nuclearRadius(); //Will use nucleus #1
singleformfactorpp1=_bbs.beam2().formFactor(pp*pp+ereds);
test = (singleformfactorpp1*singleformfactorpp1)*pp*pp*pp/((2.*starlightConstants::pi*(ereds+pp*pp))*(2.*starlightConstants::pi*(ereds+pp*pp)));
while(satisfy==0){
u = randyInstance.Rndom();
if(u*Coef <= test)
{
satisfy =1;
}
else{
x =randyInstance.Rndom();
pp = 5*starlightConstants::hbarc/_bbs.beam2().nuclearRadius()*x;
singleformfactorpp2=_bbs.beam2().formFactor(pp*pp+ereds);
test = (singleformfactorpp2*singleformfactorpp2)*pp*pp*pp/(2.*starlightConstants::pi*(ereds+pp*pp)*2.*starlightConstants::pi*(ereds+pp*pp));
}
}
return pp;
}
//______________________________________________________________________________
void Gammagammaleptonpair::twoBodyDecay(starlightConstants::particleTypeEnum &ipid,
double , // E (unused)
double W,
double px0, double py0, double pz0,
double& px1, double& py1, double& pz1,
double& px2, double& py2, double& pz2,
int& iFbadevent)
{
// This routine decays a particle into two particles of mass mdec,
// taking spin into account
double mdec=0.,E1=0.,E2=0.;
double pmag, anglelep[20001];
// double ytest=0.,dndtheta;
double phi,theta,xtest,Ecm;
double betax,betay,betaz;
double hirestheta,hirestest,hiresw; //added from JN->needed precision
- // set the mass of the daughter particles
-
mdec = getMass();
if(W < 2*mdec)
{
cout<<" ERROR: W="<<W<<endl;
iFbadevent = 1;
return;
}
pmag = sqrt(W*W/4. - mdec*mdec);
// pick an orientation, based on the spin
// phi has a flat distribution in 2*pi
phi = randyInstance.Rndom()*2.*starlightConstants::pi; //(random()/(RAND_MAX+1.0))* 2.*starlightConstants::pi;
// find theta, the angle between one of the outgoing particles and
// the beamline, in the frame of the two photons
if(getSpin()==0.5){
// calculate a table of integrated angle values for leptons
// JN05: Go from 1000->20000bins, use double precision for anglelep and thetalep. needed when W >6Gev.
hiresw = W;
anglelep[0] = 0.;
for(int i =1;i<=20000;i++)
{
hirestheta = starlightConstants::pi * double(i) /20000.;
// Added sin(theta) phase space factor (not in thetalep) and changed E to W in thetalep call
// 11/9/2000 SRK
// Note that thetalep is form invariant, so it could be called for E, theta_lab just
// as well as W,theta_cm. Since there is a boost from cm to lab below, the former is fine.
anglelep[i] = anglelep[i-1] + thetalep(hiresw,hirestheta)*sin(hirestheta);
}
hirestheta = 0.;
xtest = randyInstance.Rndom();//random()/(RAND_MAX+1.0);
hirestest = xtest;
for(int i =1;i<=20000;i++)
{
if(xtest > (anglelep[i]/anglelep[20000]))
hirestheta = starlightConstants::pi * double(i) / 20000.;
}
theta=hirestheta;
}
if(getSpin() != 0.5)
cout<<" This model cannot yet handle this spin value for lepton pairs: "<<getSpin()<<endl;
// compute unboosted momenta
px1 = sin(theta)*cos(phi)*pmag;
py1 = sin(theta)*sin(phi)*pmag;
pz1 = cos(theta)*pmag;
px2 = -px1;
py2 = -py1;
pz2 = -pz1;
// compute energies
//Changed mass to W 11/9/2000 SRK
Ecm = sqrt(W*W+px0*px0+py0*py0+pz0*pz0);
E1 = sqrt(mdec*mdec+px1*px1+py1*py1+pz1*pz1);
E2 = sqrt(mdec*mdec+px2*px2+py2*py2+pz2*pz2);
// decay tau to electrons
// note that after this routine px1, etc., refer to the electrons
- if(_GGlepInputpidtest == starlightConstants::TAUON)
+ if(_GGlepInputpidtest == starlightConstants::TAUONDECAY)
tauDecay(px1,py1,pz1,E1,px2,py2,pz2,E2);
// Lorentz transform into the lab frame
// betax,betay,betaz are the boost of the complete system
betax = -(px0/Ecm);
betay = -(py0/Ecm);
betaz = -(pz0/Ecm);
transform (betax,betay,betaz,E1,px1,py1,pz1,iFbadevent);
transform (betax,betay,betaz,E2,px2,py2,pz2,iFbadevent);
if(iFbadevent == 1)
return;
// change particle id from that of parent to that of daughters
// change taoun id into electron id, already switched particles in tau decay
- if(_GGlepInputpidtest == starlightConstants::TAUON)
+ if(_GGlepInputpidtest == starlightConstants::TAUONDECAY)
ipid = starlightConstants::ELECTRON;
// electrons remain electrons; muons remain muons
- if ((_GGlepInputpidtest == starlightConstants::ELECTRON) || (_GGlepInputpidtest == starlightConstants::MUON))
+ if ( (_GGlepInputpidtest == starlightConstants::ELECTRON) || (_GGlepInputpidtest == starlightConstants::MUON) ||
+ (_GGlepInputpidtest == starlightConstants::TAUON) )
ipid = _GGlepInputpidtest;
}
//______________________________________________________________________________
double Gammagammaleptonpair::thetalep(double W,double theta)
{
// This function calculates the cross-section as a function of
// angle for a given W and Y, for the production of two muons.
// (or tauons)
// expression is taken from Brodsky et al. PRD 1971, 1532
// equation 5.7
// factor that are not dependant on theta are scrapped, so the
// the absolute crosssections given by this function are inaccurate
// here we are working in the CM frame of the photons and the last
// term is 0
// real function thetalep (W,theta)
double moverw=0., W1sq=0.;
double thetalep_r=0.,denominator=0.;
W1sq = (W / 2.)*(W/2.);
moverw = getMass()*getMass() / W1sq;
denominator = (1. - (1. - moverw)*(cos(theta)*cos(theta)));
thetalep_r = 2. + 4.*(1.-moverw)*((1.-moverw)*sin(theta)*sin(theta)*cos(theta)*cos(theta) + moverw) / (denominator*denominator);
return thetalep_r;
}
//______________________________________________________________________________
starlightConstants::event Gammagammaleptonpair::produceEvent(int &ievent)
{//returns the vector with the decay particles inside.
starlightConstants::event leptonpair; //This object will store all the tracks for a single event
double comenergy = 0.;
double rapidity = 0.;
double pairE = 0.;
double pairmomx=0.,pairmomy=0.,pairmomz=0.;
int iFbadevent=0;
starlightConstants::particleTypeEnum ipid = starlightConstants::UNKNOWN;
double px2=0.,px1=0.,py2=0.,py1=0.,pz2=0.,pz1=0.;
//this function decays particles and writes events to a file
//zero out the event structure
leptonpair._numberOfTracks=0;
for(int i=0;i<4;i++)
{
leptonpair.px[i]=0.;
leptonpair.py[i]=0.;
leptonpair.pz[i]=0.;
leptonpair._fsParticle[i]=starlightConstants::UNKNOWN;
leptonpair._charge[i]=0;
}
pickw(comenergy);
picky(rapidity);
pairMomentum(comenergy,rapidity,pairE,pairmomx,pairmomy,pairmomz);
twoBodyDecay(ipid,pairE,comenergy,pairmomx,pairmomy,pairmomz,px1,py1,pz1,px2,py2,pz2,iFbadevent);
if (iFbadevent==0){
int q1=0,q2=0;
double xtest = randyInstance.Rndom();//random()/(RAND_MAX+1.0);
if (xtest<0.5)
{
q1=1;
q2=-1;
}
else{
q1=-1;
q2=1;
}
leptonpair._numberOfTracks=2;//leptonpairs are two tracks...
leptonpair.px[0]=px1;
leptonpair.py[0]=py1;
leptonpair.pz[0]=pz1;
leptonpair._fsParticle[0]=ipid;
leptonpair._charge[0]=q1;
leptonpair.px[1]=px2;
leptonpair.py[1]=py2;
leptonpair.pz[1]=pz2;
leptonpair._fsParticle[1]=ipid;
leptonpair._charge[1]=q2;
ievent=ievent+1;
}
return leptonpair;
}
//______________________________________________________________________________
upcEvent Gammagammaleptonpair::produceEvent()
{
//returns the vector with the decay particles inside.
upcEvent event;
double comenergy = 0.;
double rapidity = 0.;
double pairE = 0.;
double pairmomx=0.,pairmomy=0.,pairmomz=0.;
int iFbadevent=0;
starlightConstants::particleTypeEnum ipid = starlightConstants::UNKNOWN;
double px2=0.,px1=0.,py2=0.,py1=0.,pz2=0.,pz1=0.,E2=0.,E1=0.;
bool accepted = false;
do{
//this function decays particles and writes events to a file
//zero out the event structure
pickw(comenergy);
picky(rapidity);
pairMomentum(comenergy,rapidity,pairE,pairmomx,pairmomy,pairmomz);
_nmbAttempts++;
twoBodyDecay(ipid,pairE,comenergy,pairmomx,pairmomy,pairmomz,px1,py1,pz1,px2,py2,pz2,iFbadevent);
double pt1chk = sqrt(px1*px1+py1*py1);
double pt2chk = sqrt(px2*px2+py2*py2);
double eta1 = pseudoRapidity(px1, py1, pz1);
double eta2 = pseudoRapidity(px2, py2, pz2);
if(_ptCutEnabled && !_etaCutEnabled){
if(pt1chk > _ptCutMin && pt1chk < _ptCutMax && pt2chk > _ptCutMin && pt2chk < _ptCutMax){
accepted = true;
_nmbAccepted++;
}
}
else if(!_ptCutEnabled && _etaCutEnabled){
if(eta1 > _etaCutMin && eta1 < _etaCutMax && eta2 > _etaCutMin && eta2 < _etaCutMax){
accepted = true;
_nmbAccepted++;
}
}
else if(_ptCutEnabled && _etaCutEnabled){
if(pt1chk > _ptCutMin && pt1chk < _ptCutMax && pt2chk > _ptCutMin && pt2chk < _ptCutMax){
if(eta1 > _etaCutMin && eta1 < _etaCutMax && eta2 > _etaCutMin && eta2 < _etaCutMax){
accepted = true;
_nmbAccepted++;
}
}
}
}while((_ptCutEnabled || _etaCutEnabled) && !accepted);
//twoBodyDecay(ipid,pairE,comenergy,pairmomx,pairmomy,pairmomz,px1,py1,pz1,px2,py2,pz2,iFbadevent);
if (iFbadevent==0){
int q1=0,q2=0;
double xtest = randyInstance.Rndom();//random()/(RAND_MAX+1.0);
if (xtest<0.5)
{
q1=1;
q2=-1;
}
else{
q1=-1;
q2=1;
}
// The new stuff
double mlepton = getMass();
E1 = sqrt( mlepton*mlepton + px1*px1 + py1*py1 + pz1*pz1 );
E2 = sqrt( mlepton*mlepton + px2*px2 + py2*py2 + pz2*pz2 );
starlightParticle particle1(px1, py1, pz1, E1, starlightConstants::UNKNOWN, -q1*ipid, q1);
event.addParticle(particle1);
starlightParticle particle2(px2, py2, pz2, E2, starlightConstants::UNKNOWN, -q2*ipid, q2);
event.addParticle(particle2);
}
return event;
}
//______________________________________________________________________________
void Gammagammaleptonpair::calculateTable()
{
// this subroutine calculates the tables that are used
// elsewhere in the montecarlo
// the tauon decay is taken from V-A theory, 1 - 1/3 cos(theta)
// the energy of each of the two leptons in tau decay
// is calculated using formula 10.35 given
// in introduction to elementary particles by D. griffiths
// which assmes that the mass of the electron is 0.
// the highest energy attainable by the electron in such a system is
// .5 * mass of the tau
// subroutine calculateTable
double E,theta;
_tautolangle[0] = 0.;
_dgammade[0] = 0.;
for(int i =1;i<=100;i++)
{
// calculate energy of tau decay
E = double(i)/100. * .5 * starlightConstants::tauMass;
_dgammade[i] = _dgammade[i-1] + E*E * (1. - 4.*E/(3.*starlightConstants::tauMass));
// calculate angles for tau
theta = starlightConstants::pi * double(i) / 100.;
_tautolangle[i] = _tautolangle[i-1] + (1 + 0.3333333 * cos(theta));
}
}
//______________________________________________________________________________
void Gammagammaleptonpair::tauDecay(double &px1,double &py1,double &pz1,double &E1,double &px2,double &py2,double &pz2,double &E2)
{
// this routine assumes that the tauons decay to electrons and
// calculates the directons of the decays
double Ee1,Ee2,theta1,theta2,phi1,phi2, ran1, ran2 ;
double pmag1,pex1,pey1,pez1,pex2,pey2,pez2,pmag2;
double betax,betay,betaz,dir;
int Tmp_Par=0; // temp variable for the transform function .. kind of starnge - being called with 7 parameter instead of 8
// the highest energy attainable by the electron in this system is
// .5 * mass of the tau
// get two random numbers to compare with
ran1 = randyInstance.Rndom()*_dgammade[100];//(random()/(RAND_MAX+1.0)) * _dgammade[100];
ran2 = randyInstance.Rndom()*_dgammade[100];//(random()/(RAND_MAX+1.0)) * _dgammade[100];
// compute the energies that correspond to those numbers
Ee1 = 0.;
Ee2 = 0.;
for( int i =1;i<=100;i++)
{
if (ran1 > _dgammade[i])
Ee1 = double(i) /100. * .5 * getMass();
if (ran2 > _dgammade[i])
Ee2 = double(i) /100. * .5 * getMass();
}
// to find the direction of emmission, first
// we determine if the tauons have spin of +1 or -1 along the
// direction of the beam line
dir = 1.;
if ( randyInstance.Rndom() < 0.5 )//(random()/(RAND_MAX+1.0)) < 0.5)
dir = -1.;
// get two random numbers to compare with
ran1 = randyInstance.Rndom()*_tautolangle[99];//(random()/(RAND_MAX+1.0)) * _tautolangle[100];
ran2 = randyInstance.Rndom()*_tautolangle[99];//(random()/(RAND_MAX+1.0)) * _tautolangle[100];
// find the angles corrsponding to those numbers
theta1 = 0.;
theta2 = 0.;
for( int i =1;i<=100;i++)
{
if (ran1 > _tautolangle[i]) theta1 = starlightConstants::pi * double(i) /100.;
if (ran2 > _tautolangle[i]) theta2 = starlightConstants::pi * double(i) /100.;
}
// grab another two random numbers to determine phi's
phi1 = randyInstance.Rndom()*2.*starlightConstants::pi;// (random()/(RAND_MAX+1.0))* 2. * starlightConstants::pi;
phi2 = randyInstance.Rndom()*2.*starlightConstants::pi;// (random()/(RAND_MAX+1.0))* 2. * starlightConstants::pi;
// figure out the momenta of the electron in the frames of the
// tauons from which they decayed, that is electron1 is in the
// rest frame of tauon1 and e2 is in the rest fram of tau2
// again the electrons are assumed to be massless
pmag1 = Ee1;
pex1 = cos(phi1)*sin(theta1)*pmag1;
pey1 = sin(phi1)*sin(theta1)*pmag1;
pez1 = cos(theta1)*pmag1*dir;
pmag2 = Ee2;
pex2 = cos(phi2)*sin(theta2)*pmag2;
pey2 = sin(phi2)*sin(theta2)*pmag2;
pez2 = cos(theta2)*pmag2*(-1.*dir);
// now Lorentz transform into the frame of each of the particles
// do particle one first
betax = -(px1/E1);
betay = -(py1/E1);
betaz = -(pz1/E1);
//cout<<"2decay betax,pex1= "<<betax<<" "<<pex1<<endl;
transform (betax,betay,betaz,Ee1,pex1,pey1,pez1,Tmp_Par);
// then do particle two
betax = -(px1/E2);
betay = -(py1/E2);
betaz = -(pz1/E2);
transform (betax,betay,betaz,Ee2,pex2,pey2,pez2, Tmp_Par);
// finally dump the electron values into the approriate
// variables
E1 = Ee1;
E2 = Ee2;
px1 = pex1;
px2 = pex2;
py1 = pey1;
py2 = pey2;
pz1 = pez1;
pz2 = pez2;
}
//______________________________________________________________________________
double Gammagammaleptonpair::getMass()
{
double leptonmass=0.;
switch(_GGlepInputpidtest){
case starlightConstants::ELECTRON:
leptonmass=starlightConstants::mel;
break;
case starlightConstants::MUON:
leptonmass=starlightConstants::muonMass;
break;
case starlightConstants::TAUON:
leptonmass=starlightConstants::tauMass;
break;
default:
cout<<"Not a recognized lepton, Gammagammaleptonpair::getmass(), mass = 0."<<endl;
}
return leptonmass;
}
//______________________________________________________________________________
double Gammagammaleptonpair::getWidth()
{
double leptonwidth=0.;
return leptonwidth;
}
//______________________________________________________________________________
double Gammagammaleptonpair::getSpin()
{
double leptonspin=0.5;
return leptonspin;
}

File Metadata

Mime Type
text/x-diff
Expires
Tue, Nov 19, 7:26 PM (1 d, 10 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805822
Default Alt Text
(29 KB)

Event Timeline