Index: trunk/Readme.pdf =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: trunk/src/photonNucleusCrossSection.cpp =================================================================== --- trunk/src/photonNucleusCrossSection.cpp (revision 306) +++ trunk/src/photonNucleusCrossSection.cpp (revision 307) @@ -1,925 +1,926 @@ /////////////////////////////////////////////////////////////////////////// // // 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 . // /////////////////////////////////////////////////////////////////////////// // // File and Version Information: // $Rev:: $: revision of last commit // $Author:: $: author of last commit // $Date:: $: date of last commit // // Description: // // /////////////////////////////////////////////////////////////////////////// #include #include #include #include "reportingUtils.h" #include "starlightconstants.h" #include "bessel.h" #include "photonNucleusCrossSection.h" using namespace std; using namespace starlightConstants; //______________________________________________________________________________ photonNucleusCrossSection::photonNucleusCrossSection(const inputParameters& inputParametersInstance, const beamBeamSystem& bbsystem) : _ip(&inputParametersInstance), _nWbins (inputParametersInstance.nmbWBins() ), _nYbins (inputParametersInstance.nmbRapidityBins() ), _wMin (inputParametersInstance.minW() ), _wMax (inputParametersInstance.maxW() ), _yMax (inputParametersInstance.maxRapidity() ), _beamLorentzGamma (inputParametersInstance.beamLorentzGamma() ), _bbs (bbsystem ), _protonEnergy (inputParametersInstance.protonEnergy() ), _particleType (inputParametersInstance.prodParticleType() ), _beamBreakupMode (inputParametersInstance.beamBreakupMode() ), _productionMode (inputParametersInstance.productionMode() ), _sigmaNucleus (_bbs.beam2().A() ) { // new options - impulse aproximation (per Joakim) and Quantum Glauber (per SK) SKQG _impulseSelected = inputParametersInstance.impulseVM(); _quantumGlauber = inputParametersInstance.quantumGlauber(); switch(_particleType) { case RHO: _slopeParameter = 11.0; // [(GeV/c)^{-2}] _vmPhotonCoupling = 2.02; _ANORM = -2.75; _BNORM = 0.0; _defaultC = 1.0; _channelMass = _ip->rho0Mass(); _width = _ip->rho0Width(); break; case RHOZEUS: _slopeParameter =11.0; _vmPhotonCoupling=2.02; _ANORM=-2.75; _BNORM=1.84; _defaultC=1.0; _channelMass = _ip->rho0Mass(); _width = _ip->rho0Width(); break; case FOURPRONG: _slopeParameter = 11.0; _vmPhotonCoupling = 2.02; _ANORM = -2.75; _BNORM = 0; _defaultC = 1.0; _channelMass = _ip->rho0PrimeMass(); _width = _ip->rho0PrimeWidth(); break; case OMEGA: _slopeParameter=10.0; _vmPhotonCoupling=23.13; _ANORM=-2.75; _BNORM=0.0; _defaultC=1.0; _channelMass = _ip->OmegaMass(); _width = _ip->OmegaWidth(); break; case PHI: _slopeParameter=7.0; _vmPhotonCoupling=13.71; _ANORM=-2.75; _BNORM=0.0; _defaultC=1.0; _channelMass = _ip->PhiMass(); _width = _ip->PhiWidth(); break; case JPSI: case JPSI_ee: case JPSI_mumu: case JPSI_ppbar: _slopeParameter=4.0; _vmPhotonCoupling=10.45; _ANORM=-2.75; _BNORM=0.0; _defaultC=1.0; _channelMass = _ip->JpsiMass(); _width = _ip->JpsiWidth(); break; case JPSI2S: case JPSI2S_ee: case JPSI2S_mumu: _slopeParameter=4.3; _vmPhotonCoupling=26.39; _ANORM=-2.75; _BNORM=0.0; _defaultC=1.0; _channelMass = _ip->Psi2SMass(); _width = _ip->Psi2SWidth(); break; case UPSILON: case UPSILON_ee: case UPSILON_mumu: _slopeParameter=4.0; _vmPhotonCoupling=125.37; _ANORM=-2.75; _BNORM=0.0; _defaultC=1.0; _channelMass = _ip->Upsilon1SMass(); _width = _ip->Upsilon1SWidth(); break; case UPSILON2S: case UPSILON2S_ee: case UPSILON2S_mumu: _slopeParameter=4.0; _vmPhotonCoupling=290.84; _ANORM=-2.75; _BNORM=0.0; _defaultC=1.0; _channelMass = _ip->Upsilon2SMass(); _width = _ip->Upsilon2SWidth(); break; case UPSILON3S: case UPSILON3S_ee: case UPSILON3S_mumu: _slopeParameter=4.0; _vmPhotonCoupling=415.10; _ANORM=-2.75; _BNORM=0.0; _defaultC=1.0; _channelMass = _ip->Upsilon3SMass(); _width = _ip->Upsilon3SWidth(); break; default: cout <<"No sigma constants parameterized for pid: "<<_particleType <<" GammaAcrosssection"<protonMass() * _ip->protonMass())) + _ip->protonMass() * _ip->protonMass()); //Used for A-A tmin = (W * W / (4. * Egamma * _beamLorentzGamma)) * (W * W / (4. * Egamma * _beamLorentzGamma)); if ((_bbs.beam1().A() == 1) && (_bbs.beam2().A() == 1)){ // proton-proton, no scaling needed csgA = sigmagp(Wgp); } else { // coherent AA interactions int A_1 = _bbs.beam1().A(); int A_2 = _bbs.beam2().A(); // Calculate V.M.+proton cross section // cs = sqrt(16. * pi * _vmPhotonCoupling * _slopeParameter * hbarc * hbarc * sigmagp(Wgp) / alpha); cs = sigma_N(Wgp); //Use member function instead // Calculate V.M.+nucleus cross section cvma = sigma_A(cs,beam); // Do impulse approximation here if( _impulseSelected == 1){ if( beam == 1 ){ cvma = A_1*cs; } else if ( beam == 2 ){ cvma = A_2*cs; } } // Calculate Av = dsigma/dt(t=0) Note Units: fm**s/Gev**2 Av = (alpha * cvma * cvma) / (16. * pi * _vmPhotonCoupling * hbarc * hbarc); tmax = tmin + 0.25; ax = 0.5 * (tmax - tmin); bx = 0.5 * (tmax + tmin); csgA = 0.; for (int k = 1; k < NGAUSS; ++k) { t = ax * xg[k] + bx; if( A_1 == 1 && A_2 != 1){ csgA = csgA + ag[k] * _bbs.beam2().formFactor(t) * _bbs.beam2().formFactor(t); }else if(A_2 ==1 && A_1 != 1){ csgA = csgA + ag[k] * _bbs.beam1().formFactor(t) * _bbs.beam1().formFactor(t); }else{ if( beam==1 ){ csgA = csgA + ag[k] * _bbs.beam1().formFactor(t) * _bbs.beam1().formFactor(t); }else if(beam==2){ csgA = csgA + ag[k] * _bbs.beam2().formFactor(t) * _bbs.beam2().formFactor(t); }else{ cout<<"Something went wrong here, beam= "<20R_A change methods - just take the photon flux // at the center of the nucleus. if (biter > (10.*RNuc)){ // if there is no nuclear breakup or only hadronic breakup, which only // occurs at smaller b, we can analytically integrate the flux from b~20R_A // to infinity, following Jackson (2nd edition), Eq. 15.54 Xvar=energy*biter/(hbarc*_beamLorentzGamma); // Here, there is nuclear breakup. So, we can't use the integrated flux // However, we can do a single flux calculation, at the center of the nucleus // Eq. 41 of Vidovic, Greiner and Soff, Phys.Rev.C47,2308(1993), among other places // this is the flux per unit area fluxelement = (rZ*rZ*alpha*energy)* (bessel::dbesk1(Xvar))*(bessel::dbesk1(Xvar))/ ((pi*_beamLorentzGamma*hbarc)* (pi*_beamLorentzGamma*hbarc)); } else { // integrate over nuclear surface. n.b. this assumes total shadowing - // treat photons hitting the nucleus the same no matter where they strike fluxelement=0.; deltar=RNuc/double(nrstep); riter=-deltar/2.; for (int jr =1; jr<=nrstep;jr++){ riter=riter+deltar; // use symmetry; only integrate from 0 to pi (half circle) deltaphi=pi/double(nphistep); phiiter=0.; for( int jphi=1;jphi<= nphistep;jphi++){ phiiter=(double(jphi)-0.5)*deltaphi; // dist is the distance from the center of the emitting nucleus // to the point in question dist=sqrt((biter+riter*cos(phiiter))*(biter+riter* cos(phiiter))+(riter*sin(phiiter))*(riter*sin(phiiter))); Xvar=energy*dist/(hbarc*_beamLorentzGamma); flux_r = (rZ*rZ*alpha*energy)* (bessel::dbesk1(Xvar)*bessel::dbesk1(Xvar))/ ((pi*_beamLorentzGamma*hbarc)* (pi*_beamLorentzGamma*hbarc)); // The surface element is 2.* delta phi* r * delta r // The '2' is because the phi integral only goes from 0 to pi fluxelement=fluxelement+flux_r*2.*deltaphi*riter*deltar; // end phi and r integrations }//for(jphi) }//for(jr) // average fluxelement over the nuclear surface fluxelement=fluxelement/(pi*RNuc*RNuc); }//else // multiply by volume element to get total flux in the volume element fluxelement=fluxelement*2.*pi*biter*(biter-bold); // modulate by the probability of nuclear breakup as f(biter) // cout<<" jb: "< 1){ fluxelement=fluxelement*_bbs.probabilityOfBreakup(biter); } // cout<<" jb: "< lnEmax){ flux_r=0.0; // cout<<" WARNING: Egamma outside defined range. Egamma= "<> Egamma between Ilt and Ilt+1 Ilt = int((lEgamma-lnEmin)/dlnE); // >> ln(Egamma) for first point lnElt = lnEmin + Ilt*dlnE; // >> Interpolate flux_r = dide[Ilt] + ((lEgamma-lnElt)/dlnE)*(dide[Ilt+1]- dide[Ilt]); flux_r = flux_r/Egamma; } return flux_r; } //______________________________________________________________________________ double photonNucleusCrossSection::nepoint(const double Egamma, const double bmin) { // Function for the spectrum of virtual photons, // dn/dEgamma, for a point charge q=Ze sweeping // past the origin with velocity gamma // (=1/SQRT(1-(V/c)**2)) integrated over impact // parameter from bmin to infinity // See Jackson eq15.54 Classical Electrodynamics // Declare Local Variables double beta,X,C1,bracket,nepoint_r; beta = sqrt(1.-(1./(_beamLorentzGamma*_beamLorentzGamma))); X = (bmin*Egamma)/(beta*_beamLorentzGamma*hbarc); bracket = -0.5*beta*beta*X*X*(bessel::dbesk1(X)*bessel::dbesk1(X) -bessel::dbesk0(X)*bessel::dbesk0(X)); bracket = bracket+X*bessel::dbesk0(X)*bessel::dbesk1(X); // Note: NO Z*Z!! C1=(2.*alpha)/pi; nepoint_r = C1*(1./beta)*(1./beta)*(1./Egamma)*bracket; return nepoint_r; } //______________________________________________________________________________ double photonNucleusCrossSection::sigmagp(const double Wgp) { // Function for the gamma-proton --> VectorMeson // cross section. Wgp is the gamma-proton CM energy. // Unit for cross section: fm**2 double sigmagp_r=0.; switch(_particleType) { case RHO: case RHOZEUS: case FOURPRONG: sigmagp_r=1.E-4*(5.0*exp(0.22*log(Wgp))+26.0*exp(-1.23*log(Wgp))); break; case OMEGA: sigmagp_r=1.E-4*(0.55*exp(0.22*log(Wgp))+18.0*exp(-1.92*log(Wgp))); break; case PHI: sigmagp_r=1.E-4*0.34*exp(0.22*log(Wgp)); break; case JPSI: case JPSI_ee: case JPSI_mumu: case JPSI_ppbar: sigmagp_r=(1.0-((_channelMass+_ip->protonMass())*(_channelMass+_ip->protonMass()))/(Wgp*Wgp)); sigmagp_r*=sigmagp_r; sigmagp_r*=1.E-4*0.00406*exp(0.65*log(Wgp)); // sigmagp_r=1.E-4*0.0015*exp(0.80*log(Wgp)); break; case JPSI2S: case JPSI2S_ee: case JPSI2S_mumu: sigmagp_r=(1.0-((_channelMass+_ip->protonMass())*(_channelMass+_ip->protonMass()))/(Wgp*Wgp)); sigmagp_r*=sigmagp_r; sigmagp_r*=1.E-4*0.00406*exp(0.65*log(Wgp)); sigmagp_r*=0.166; // sigmagp_r=0.166*(1.E-4*0.0015*exp(0.80*log(Wgp))); break; case UPSILON: case UPSILON_ee: case UPSILON_mumu: // >> This is W**1.7 dependence from QCD calculations // sigmagp_r=1.E-10*(0.060)*exp(1.70*log(Wgp)); sigmagp_r=(1.0-((_channelMass+_ip->protonMass())*(_channelMass+_ip->protonMass()))/(Wgp*Wgp)); sigmagp_r*=sigmagp_r; sigmagp_r*=1.E-10*6.4*exp(0.74*log(Wgp)); break; case UPSILON2S: case UPSILON2S_ee: case UPSILON2S_mumu: // sigmagp_r=1.E-10*(0.0259)*exp(1.70*log(Wgp)); sigmagp_r=(1.0-((_channelMass+_ip->protonMass())*(_channelMass+_ip->protonMass()))/(Wgp*Wgp)); sigmagp_r*=sigmagp_r; sigmagp_r*=1.E-10*2.9*exp(0.74*log(Wgp)); break; case UPSILON3S: case UPSILON3S_ee: case UPSILON3S_mumu: // sigmagp_r=1.E-10*(0.0181)*exp(1.70*log(Wgp)); sigmagp_r=(1.0-((_channelMass+_ip->protonMass())*(_channelMass+_ip->protonMass()))/(Wgp*Wgp)); sigmagp_r*=sigmagp_r; sigmagp_r*=1.E-10*2.1*exp(0.74*log(Wgp)); break; default: cout<< "!!! ERROR: Unidentified Vector Meson: "<< _particleType <