+++ /dev/null
-///////////////////////////////////////////////////////////////////////////
-//
-// 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();
-}
-
-
-//______________________________________________________________________________
-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)
- 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)
- ipid = starlightConstants::ELECTRON;
- // electrons remain electrons; muons remain muons
- if ((_GGlepInputpidtest == starlightConstants::ELECTRON) || (_GGlepInputpidtest == starlightConstants::MUON))
- 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;
-}