]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STARLIGHT/starlight/src/gammaaluminosity.cpp
STARLIGHT code and interface
[u/mrichter/AliRoot.git] / STARLIGHT / starlight / src / gammaaluminosity.cpp
1 ///////////////////////////////////////////////////////////////////////////
2 //
3 //    Copyright 2010
4 //
5 //    This file is part of starlight.
6 //
7 //    starlight is free software: you can redistribute it and/or modify
8 //    it under the terms of the GNU General Public License as published by
9 //    the Free Software Foundation, either version 3 of the License, or
10 //    (at your option) any later version.
11 //
12 //    starlight is distributed in the hope that it will be useful,
13 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
14 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 //    GNU General Public License for more details.
16 //
17 //    You should have received a copy of the GNU General Public License
18 //    along with starlight. If not, see <http://www.gnu.org/licenses/>.
19 //
20 ///////////////////////////////////////////////////////////////////////////
21 //
22 // File and Version Information:
23 // $Rev:: 164                         $: revision of last commit
24 // $Author:: odjuvsla                 $: author of last commit
25 // $Date:: 2013-10-06 16:18:08 +0200 #$: date of last commit
26 //
27 // Description:
28 //
29 //
30 //
31 ///////////////////////////////////////////////////////////////////////////
32
33
34 #include <iostream>
35 #include <fstream>
36 #include <cmath>
37
38 #include "inputParameters.h"
39 #include "beambeamsystem.h"
40 #include "beam.h"
41 #include "starlightconstants.h"
42 #include "nucleus.h"
43 #include "bessel.h"
44 #include "gammaaluminosity.h"
45
46
47 using namespace std;
48
49
50 //______________________________________________________________________________
51 photonNucleusLuminosity::photonNucleusLuminosity(beamBeamSystem& bbsystem)
52   : photonNucleusCrossSection(bbsystem)
53   ,_nPtBinsInterference(inputParametersInstance.nmbPtBinsInterference())
54   ,_ptBinWidthInterference(inputParametersInstance.ptBinWidthInterference())
55   ,_interferenceStrength(inputParametersInstance.interferenceStrength())
56 {
57   cout <<"Creating Luminosity Tables."<<endl;
58   photonNucleusDifferentialLuminosity();
59   cout <<"Luminosity Tables created."<<endl;
60 }
61
62
63 //______________________________________________________________________________
64 photonNucleusLuminosity::~photonNucleusLuminosity()
65 { }
66
67
68 //______________________________________________________________________________
69 void photonNucleusLuminosity::photonNucleusDifferentialLuminosity()
70 {
71         // double Av,Wgp,cs,cvma;
72   double W,dW,dY;
73   double Egamma,Y;
74   // double t,tmin,tmax;
75   double testint,dndWdY;
76   double csgA;
77   // double ax,bx;
78   double C;  
79
80   ofstream wylumfile;
81   wylumfile.precision(15);
82   
83   double  bwnorm,Eth;
84
85   dW = (_wMax-_wMin)/_nWbins;
86   dY  = (_yMax-(-1.0)*_yMax)/_nYbins;
87     
88   // Write the values of W used in the calculation to slight.txt.  
89   wylumfile.open("slight.txt");
90   wylumfile << inputParametersInstance.parameterValueKey() << endl;
91   wylumfile << getbbs().beam1().Z() <<endl;
92   wylumfile << getbbs().beam1().A() <<endl;
93   wylumfile << getbbs().beam2().Z() <<endl;
94   wylumfile << getbbs().beam2().A() <<endl;
95   wylumfile << inputParametersInstance.beamLorentzGamma() <<endl;
96   wylumfile << inputParametersInstance.maxW() <<endl;
97   wylumfile << inputParametersInstance.minW() <<endl;
98   wylumfile << inputParametersInstance.nmbWBins() <<endl;
99   wylumfile << inputParametersInstance.maxRapidity() <<endl;
100   wylumfile << inputParametersInstance.nmbRapidityBins() <<endl;
101   wylumfile << inputParametersInstance.productionMode() <<endl;
102   wylumfile << inputParametersInstance.beamBreakupMode() <<endl;
103   wylumfile << inputParametersInstance.interferenceEnabled() <<endl;
104   wylumfile << inputParametersInstance.interferenceStrength() <<endl;
105   wylumfile << inputParametersInstance.coherentProduction() <<endl;
106   wylumfile << inputParametersInstance.incoherentFactor() <<endl;
107   wylumfile << inputParametersInstance.deuteronSlopePar() <<endl;
108   wylumfile << inputParametersInstance.maxPtInterference() <<endl;
109   wylumfile << inputParametersInstance.nmbPtBinsInterference() <<endl;
110   
111   //     Normalize the Breit-Wigner Distribution and write values of W to slight.txt
112   testint=0.0;
113   //Grabbing default value for C in the breit-wigner calculation
114   C=getDefaultC();
115   for(unsigned int i = 0; i <= _nWbins - 1; ++i) {
116     W = _wMin + double(i)*dW + 0.5*dW;
117     testint = testint + breitWigner(W,C)*dW;
118     wylumfile << W << endl;
119   }
120   bwnorm = 1./testint;
121   
122   //     Write the values of Y used in the calculation to slight.txt.
123   for(unsigned int i = 0; i <= _nYbins - 1; ++i) {
124     Y = -1.0*_yMax + double(i)*dY + 0.5*dY;
125     wylumfile << Y << endl;
126   }
127     
128   Eth=0.5*(((_wMin+starlightConstants::protonMass)*(_wMin
129                                                             +starlightConstants::protonMass)-starlightConstants::protonMass*starlightConstants::protonMass)/
130            (inputParametersInstance.protonEnergy()+sqrt(inputParametersInstance.protonEnergy()*
131                                                inputParametersInstance.protonEnergy()-starlightConstants::protonMass*starlightConstants::protonMass)));
132   
133   for(unsigned int i = 0; i <= _nWbins - 1; ++i) {
134
135     W = _wMin + double(i)*dW + 0.5*dW;
136     
137     for(unsigned int j = 0; j <= _nYbins - 1; ++j) {
138
139       Y = -1.0*_yMax + double(j)*dY + 0.5*dY;
140
141       int A_1 = getbbs().beam1().A(); 
142       int A_2 = getbbs().beam2().A();
143       if( A_2 == 1 && A_1 != 1 ){
144         // pA, first beam is the nucleus 
145         Egamma = 0.5*W*exp(-Y);
146       } else if( A_1 ==1 && A_2 != 1){
147         // pA, second beam is the nucleus 
148         Egamma = 0.5*W*exp(Y); 
149       } else {
150         Egamma = 0.5*W*exp(Y);        
151       }
152
153       dndWdY = 0.; 
154
155       if( Egamma > Eth && Egamma < maxPhotonEnergy() ){
156
157        csgA=getcsgA(Egamma,W);
158        dndWdY = Egamma*photonFlux(Egamma)*csgA*breitWigner(W,bwnorm);
159
160       }
161
162       wylumfile << dndWdY << endl;
163
164     }
165   }
166
167   wylumfile.close();
168   
169   if(inputParametersInstance.interferenceEnabled()==1) 
170     pttablegen();
171  
172   wylumfile.open("slight.txt",ios::app);
173   cout << "bwnorm: "<< bwnorm <<endl;
174   wylumfile << bwnorm << endl;
175   wylumfile << inputParametersInstance.parameterValueKey() << endl;
176   wylumfile.close();
177 }
178
179
180 //______________________________________________________________________________
181 void photonNucleusLuminosity::pttablegen()
182 {
183   //  Calculates the pt spectra for VM production with interference
184   //  Follows S. Klein and J. Nystrand, Phys. Rev Lett. 84, 2330 (2000).
185   //  Written by S. Klein, 8/2002
186   
187   //  fill in table pttable in one call
188   //  Integrate over all y (using the same y values as in table yarray
189   //  note that the cross section goes from ymin (<0) to ymax (>0), in numy points
190   //  here,  we go from 0 to ymax in (numy/2)+1 points
191   //  numy must be even.
192   
193   //  At each y, calculate the photon energies Egamma1 and Egamma2
194   //  and the two photon-A cross sections
195   
196   //  loop over each p_t entry in the table.
197   
198   //  Then, loop over b and phi (the angle between the VM \vec{p_t} and \vec{b}
199   //  and calculate the cross section at each step.
200   //  Put the results in pttable
201   
202   ofstream wylumfile;
203   wylumfile.precision(15);
204   wylumfile.open("slight.txt",ios::app);
205   
206   
207   double param1pt[500],param2pt[500];
208   double  *ptparam1=param1pt;
209   double  *ptparam2=param2pt;
210   double dY=0.,Yp=0.,Egamma1=0.,Egamma2=0.,Wgp=0.,cs=0.,cvma=0.,Av=0.,tmin=0.,tmax=0.,ax=0.,bx=0.;
211   double csgA=0.,t=0.,sig_ga_1=0.,sig_ga_2=0.,bmax=0.,bmin=0.,db=0.,pt=0.,sum1=0.,b=0.,A1=0.,A2=0.;
212   double sumg=0.,theta=0.,amp_i_2=0.,sumint=0.;
213   int NGAUSS=0,NBIN=0,NThetaBIN=0;
214   
215   double xg[16]={.0483076656877383162E0,.144471961582796493E0,
216                  .239287362252137075E0, .331868602282127650E0,
217                  .421351276130635345E0, .506899908932229390E0,
218                  .587715757240762329E0, .663044266930215201E0,
219                  .732182118740289680E0, .794483795967942407E0,
220                  .849367613732569970E0, .896321155766052124E0,
221                  .934906075937739689E0, .964762255587506430E0,
222                  .985611511545268335E0, .997263861849481564E0};
223   double ag[16]={.0965400885147278006E0, .0956387200792748594E0,
224                  .0938443990808045654E0, .0911738786957638847E0,
225                  .0876520930044038111E0, .0833119242269467552E0,
226                  .0781938957870703065E0, .0723457941088485062E0,
227                  .0658222227763618468E0, .0586840934785355471E0,
228                  .0509980592623761762E0, .0428358980222266807E0,
229                  .0342738629130214331E0, .0253920653092620595E0,
230                  .0162743947309056706E0, .00701861000947009660E0};
231
232   NGAUSS=16;
233
234   //Setting input calls to variables/less calls this way.
235   double Ymax=_yMax;
236   int numy = _nYbins;
237   double Ep = inputParametersInstance.protonEnergy();
238   int ibreakup = inputParametersInstance.beamBreakupMode();
239   double NPT = inputParametersInstance.nmbPtBinsInterference();
240   double gamma_em=inputParametersInstance.beamLorentzGamma();
241   double mass= getChannelMass();
242   
243   //  loop over y from 0 (not -ymax) to yma
244   
245   dY=(2.*Ymax)/numy;
246   for(int jy=1;jy<=numy/2;jy++){
247     Yp=(double(jy)-0.5)*dY;
248     
249     // Find the photon energies.  Yp >= 0, so Egamma2 is smaller
250     // Use the vector meson mass for W here - neglect the width
251     
252     Egamma1 = 0.5*mass*exp(Yp);
253     Egamma2 = 0.5*mass*exp(-Yp);
254     
255     //  Find the sigma(gammaA) for the two directions
256     //  Photonuclear Cross Section 1
257     //  Gamma-proton CM energy
258     
259     Wgp=sqrt(2.*Egamma1*(Ep+sqrt(Ep*Ep-starlightConstants::protonMass*
260                                  starlightConstants::protonMass))+starlightConstants::protonMass*starlightConstants::protonMass);
261     
262     // Calculate V.M.+proton cross section
263     
264     cs=sqrt(16.*starlightConstants::pi*vmPhotonCoupling()*slopeParameter()*
265             starlightConstants::hbarc*starlightConstants::hbarc*sigmagp(Wgp)
266             /starlightConstants::alpha);
267     
268     // Calculate V.M.+nucleus cross section
269     
270     cvma=sigma_A(cs);
271     
272     // Calculate Av = dsigma/dt(t=0) Note Units: fm**2/Gev**2
273     
274     Av=(starlightConstants::alpha*cvma*cvma)/(16.*starlightConstants::pi
275                                               *vmPhotonCoupling()*starlightConstants::hbarc*starlightConstants::hbarc);
276     
277     tmin  = ((mass*mass)/(4.*Egamma1*gamma_em)*(mass*mass)/(4.*Egamma1*gamma_em));
278     tmax  = tmin + 0.25;
279     ax    = 0.5*(tmax-tmin);
280     bx    = 0.5*(tmax+tmin);
281     csgA  = 0.;
282     
283     for(int k=0;k<NGAUSS;k++){
284       t     = sqrt(ax*xg[k]+bx);
285       csgA  = csgA + ag[k]*getbbs().beam2().formFactor(t)*getbbs().beam2().formFactor(t);
286       t     = sqrt(ax*(-xg[k])+bx);
287       csgA  = csgA + ag[k]*getbbs().beam2().formFactor(t)*getbbs().beam2().formFactor(t);
288     }
289     
290     csgA = 0.5*(tmax-tmin)*csgA;
291     csgA = Av*csgA;
292     sig_ga_1 = csgA;
293            
294     // Photonuclear Cross Section 2
295     
296     Wgp=sqrt(2.*Egamma2*(Ep+sqrt(Ep*Ep-starlightConstants::protonMass*
297                                  starlightConstants::protonMass))+starlightConstants::protonMass*starlightConstants::protonMass);
298     
299     cs=sqrt(16.*starlightConstants::pi*vmPhotonCoupling()*slopeParameter()*
300             starlightConstants::hbarc*starlightConstants::hbarc*sigmagp(Wgp)/starlightConstants::alpha);
301     
302     cvma=sigma_A(cs);
303     
304     Av=(starlightConstants::alpha*cvma*cvma)/(16.*starlightConstants::pi
305                                               *vmPhotonCoupling()*starlightConstants::hbarc*starlightConstants::hbarc);
306     
307     tmin  = (((mass*mass)/(4.*Egamma2*gamma_em))*((mass*mass)/(4.*Egamma2*gamma_em)));
308     tmax  = tmin + 0.25;
309     ax    = 0.5*(tmax-tmin);
310     bx    = 0.5*(tmax+tmin);
311     csgA  = 0.;
312     
313     for(int k=0;k<NGAUSS;k++){
314       t     = sqrt(ax*xg[k]+bx);
315       csgA  = csgA + ag[k]*getbbs().beam2().formFactor(t)*getbbs().beam2().formFactor(t);
316       t     = sqrt(ax*(-xg[k])+bx);
317       csgA  = csgA + ag[k]*getbbs().beam2().formFactor(t)*getbbs().beam2().formFactor(t);
318     }
319            
320     csgA = 0.5*(tmax-tmin)*csgA;
321     csgA = Av*csgA;
322     sig_ga_2 = csgA;
323     
324     //  Set up pttables - they find the reduction in sigma(pt)
325     //  due to the nuclear form factors.
326     //  Use the vector meson mass for W here - neglect width in
327     //  interference calculation
328     
329     ptparam1=vmsigmapt(mass,Egamma1,ptparam1);
330     ptparam2=vmsigmapt(mass,Egamma2,ptparam2);
331     
332     //  set  bmax according to the smaller photon energy, following flux.f
333     
334     bmax=bmin+6.*starlightConstants::hbarc*gamma_em/Egamma2;
335     bmin = getbbs().beam1().nuclearRadius()+getbbs().beam2().nuclearRadius();
336     //  if we allow for nuclear breakup, use a slightly smaller bmin
337     
338     if (ibreakup != 1) 
339       bmin=0.95*bmin;
340     //  set number of bins to a reasonable number to start
341     NBIN = 2000;
342     NThetaBIN = 1000;
343     db   = (bmax-bmin)/float(NBIN);
344     // loop over pt
345     for(int i=1;i<=NPT;i++){
346       
347       pt = (float(i)-0.5)*_ptBinWidthInterference;
348       sum1=0.0;
349       // loop over b
350       for(int j=1;j<=NBIN;j++){
351         
352         b = bmin + (float(j)-0.5)*db;
353         //  nofe is the photon flux function
354         A1 = Egamma1*nofe(Egamma1,b)*sig_ga_1*ptparam1[i];
355         A2 = Egamma2*nofe(Egamma2,b)*sig_ga_2*ptparam2[i];
356         sumg=0.0;
357         //  do this as a Gaussian integral, from 0 to pi
358         for(int k=0;k<NGAUSS;k++){
359           
360           theta=xg[k]*starlightConstants::pi;
361           //  allow for a linear sum of interfering and non-interfering amplitudes
362           amp_i_2 = A1 + A2 - 2.*_interferenceStrength
363             *sqrt(A1*A2)*cos(pt*b*cos(theta)/starlightConstants::hbarc);
364           sumg  = sumg+ag[k]*amp_i_2;
365         }
366         //  this is dn/dpt^2
367         //  The factor of 2 is because the theta integral is only from 0 to pi
368         sumint=2.*sumg*b*db;
369         if (ibreakup > 1)
370           sumint=sumint*getbbs().probabilityOfBreakup(b);
371         sum1 = sum1 + sumint;
372       }
373       //  normalization is done in readDiffLum.f
374       //  This is d^2sigma/dpt^2; convert to dsigma/dpt
375       //CHECK THIS OUT---->      write(20,*)sum1*pt*dpt
376       wylumfile << sum1*pt*_ptBinWidthInterference <<endl;
377       //  end of pt loop
378     }
379     //  end of y loop
380   }
381   wylumfile.close();
382 }
383
384
385 //______________________________________________________________________________
386 double *photonNucleusLuminosity::vmsigmapt(double W, double Egamma, double *SIGMAPT)
387 {
388   //
389   //  This subroutine calculates the effect of the nuclear form factor
390   // on the pt spectrum, for use in interference calculations
391   // For an interaction with mass W and photon energy Egamma,
392   // it calculates the cross section suppression SIGMAPT(PT)
393   // as a function of pt.
394   // The input pt values come from pttable.inc
395
396   
397   double pxmax=0.,pymax=0.,dx=0.,Epom=0.,pt=0.,px0=0.,py0=0.,sum=0.,sumy=0.;
398   double py=0.,px=0.,pt1=0.,pt2=0.,f1=0.,f2=0.,q1=0.,q2=0.,norm=0.;
399   int NGAUSS =0,Nxbin=0;
400   double xg[16]={.0483076656877383162e0,.144471961582796493e0,
401                  .239287362252137075e0, .331868602282127650e0,
402                  .421351276130635345e0, .506899908932229390e0,
403                  .587715757240762329e0, .663044266930215201e0,
404                  .732182118740289680e0, .794483795967942407e0,
405                  .849367613732569970e0, .896321155766052124e0,
406                  .934906075937739689e0, .964762255587506430e0,
407                  .985611511545268335e0, .997263861849481564e0};
408   double ag[16]={.0965400885147278006e0, .0956387200792748594e0,
409                  .0938443990808045654e0, .0911738786957638847e0,
410                  .0876520930044038111e0, .0833119242269467552e0,
411                  .0781938957870703065e0, .0723457941088485062e0,
412                  .0658222227763618468e0, .0586840934785355471e0,
413                  .0509980592623761762e0, .0428358980222266807e0,
414                  .0342738629130214331e0, .0253920653092620595e0,
415                  .0162743947309056706e0, .00701861000947009660e0};
416   NGAUSS=16;
417
418   //     >> Initialize
419   pxmax = 10.*(starlightConstants::hbarc/getbbs().beam1().nuclearRadius());
420   pymax = 10.*(starlightConstants::hbarc/getbbs().beam1().nuclearRadius());
421   
422   Nxbin = 500;
423   
424   dx = 2.*pxmax/double(Nxbin);
425   Epom   = W*W/(4.*Egamma);
426   
427   //     >> Loop over total Pt to find distribution
428       
429       for(int k=1;k<=_nPtBinsInterference;k++){
430         
431               pt=_ptBinWidthInterference*(double(k)-0.5);
432               
433               px0 = pt;
434               py0 = 0.0;
435               
436               //  For each total Pt, integrate over Pt1, , the photon pt
437               //  The pt of the Pomeron  is the difference
438               //  pt1 is
439               sum=0.;
440               for(int i=1;i<=Nxbin;i++){
441                 
442                 px = -pxmax + (double(i)-0.5)*dx;
443                 sumy=0.0;
444                 for(int j=0;j<NGAUSS;j++){
445
446                   py = 0.5*pymax*xg[j]+0.5*pymax;
447                   //  photon pt
448                   pt1 = sqrt( px*px + py*py );
449                   //  pomeron pt
450                   pt2 = sqrt( (px-px0)*(px-px0) + (py-py0)*(py-py0) );
451                   q1  = sqrt( ((Egamma/_beamLorentzGamma)*(Egamma/_beamLorentzGamma)) + pt1*pt1 );        
452                   q2  = sqrt( ((Epom/_beamLorentzGamma)*(Epom/_beamLorentzGamma))   + pt2*pt2 );
453                   
454                   //  photon form factor
455                   // add in phase space factor?
456                   f1  = (getbbs().beam1().formFactor(q1*q1)*getbbs().beam1().formFactor(q1*q1)*pt1*pt1)/(q1*q1*q1*q1);
457                   
458                   //  Pomeron form factor
459                   f2  = getbbs().beam1().formFactor(q2*q2)*getbbs().beam1().formFactor(q2*q2);
460                   sumy= sumy + ag[j]*f1*f2;
461                   
462                   //  now consider other half of py phase space - why is this split?
463                   py = 0.5*pymax*(-xg[j])+0.5*pymax;
464                   pt1 = sqrt( px*px + py*py );
465                   pt2 = sqrt( (px-px0)*(px-px0) + (py-py0)*(py-py0) );
466                   q1  = sqrt( ((Egamma/_beamLorentzGamma)*Egamma/_beamLorentzGamma) + pt1*pt1 );
467                   q2  = sqrt( ((Epom/_beamLorentzGamma)*(Epom/_beamLorentzGamma))   + pt2*pt2 );
468                   //  add in phase space factor?
469                   f1  = (getbbs().beam1().formFactor(q1*q1)*getbbs().beam1().formFactor(q1*q1)*pt1*pt1)/(q1*q1*q1*q1);
470                   f2  = getbbs().beam1().formFactor(q2*q2)*getbbs().beam1().formFactor(q2*q2);
471                   sumy= sumy + ag[j]*f1*f2;
472       
473                 }
474                 //         >> This is to normalize the gaussian integration
475                 sumy = 0.5*pymax*sumy;
476                 //         >> The 2 is to account for py: 0 -- pymax
477                 sum  = sum + 2.*sumy*dx;
478               }
479               
480               if(k==1) norm=1./sum;
481               SIGMAPT[k]=sum*norm;
482       }
483       return (SIGMAPT);
484 }
485
486
487 //______________________________________________________________________________
488 double photonNucleusLuminosity::nofe(double Egamma, double bimp)
489 {
490   //Function for the calculation of the "photon density".
491   //nofe=numberofgammas/(energy*area)
492   //Assume beta=1.0 and gamma>>1, i.e. neglect the (1/gamma^2)*K0(x) term
493   
494   double X=0.,nofex=0.,factor1=0.,factor2=0.,factor3=0.;
495   
496   X = (bimp*Egamma)/(_beamLorentzGamma*starlightConstants::hbarc);
497   
498   if( X <= 0.0) 
499     cout<<"In nofe, X= "<<X<<endl;
500   
501   factor1 = (double(getbbs().beam1().Z()*getbbs().beam1().Z())
502              *starlightConstants::alpha)/(starlightConstants::pi*starlightConstants::pi);
503
504   factor2 = 1./(Egamma*bimp*bimp);
505   factor3 = X*X*(bessel::dbesk1(X))*(bessel::dbesk1(X));
506   nofex    = factor1*factor2*factor3;
507   return nofex;
508 }