ROOT logo
/************************************************************************* 
* Copyright(c) 1998-2048, ALICE Experiment at CERN, All rights reserved. * 
*                                                                        * 
* Author: The ALICE Off-line Project.                                    * 
* Contributors are mentioned in the code where appropriate.              * 
*                                                                        * 
* Permission to use, copy, modify and distribute this software and its   * 
* documentation strictly for non-commercial purposes is hereby granted   * 
* without fee, provided that the above copyright notice appears in all   * 
* copies and that both the copyright notice and this permission notice   * 
* appear in the supporting documentation. The authors make no claims     * 
* about the suitability of this software for any purpose. It is          * 
* provided "as is" without express or implied warranty.                  * 
**************************************************************************/

//Author: Dariusz Miskowiec
//Date:   2010

//=============================================================================
// Coulomb correlation function
//=============================================================================

#include <TRandom2.h>
#include <TComplex.h>
#include <TFile.h>
#include <TH2.h>
#include "AliUnicorCoulomb.h"

ClassImp(AliUnicorCoulomb)

//=============================================================================
AliUnicorCoulomb::AliUnicorCoulomb(int zz, double mass, double R) : TGraph(1001) {

  // constructor
  // zz = +1 for pi+pi+, -1 for pi-pi-, etc. 
  // mass is the reduced mass: m1*m2/(m1+m2)

  SetMarkerStyle(20);
  int nstep = 10000;

  double rx = R;
  double ry = R;
  double rz = R;
  double r0 = 0;
  TRandom2 ran;

  if (zz>0) SetPoint(0,0,0);
  else SetPoint(0,0,1e9);
  for (int i=1; i<1000; i++) {
    double qinv = i/1000.0;
    double k = qinv/2.0;
    double sum = 0;
    for (int j=0; j<nstep; j++) {
      double x0 = ran.Gaus(0.0,rx);
      double y0 = ran.Gaus(0.0,ry);
      double z0 = ran.Gaus(0.0,rz);
      double t0 = ran.Gaus(0.0,r0);
      double x1 = ran.Gaus(0.0,rx);
      double y1 = ran.Gaus(0.0,ry);
      double z1 = ran.Gaus(0.0,rz);
      double t1 = ran.Gaus(0.0,r0);
      double dx = x1-x0;
      double dy = y1-y0;
      double dz = z1-z0;
      double dt = t1-t0;
      dz += dt*k/mass;
      sum += WaveFunction2(zz,mass,k,dx,dy,dz);
    }
    SetPoint(i,qinv,sum/nstep);
  }
  SetPoint(1000,1000,1);
}
//=============================================================================
double AliUnicorCoulomb::WaveFunction2(int zz, double mass, double k, double x, double y, double z) {

  // Square of normalized Coulomb wave function. 
  // Hypergeometrical function diverges for numerical reasons for large Qinv, z and x. 
  // Out of the convergence limit I will return 1.0

  double qinv12 = 1.2 * 2.0 * k;
  double p0 = -9.1569/qinv12;
  double p2 = 2.735e-2*qinv12;
  double wf2 = 1.0;
  int converg = (z>p0+p2*(x*x+y*y));
  if (converg) {
    TComplex co = WaveFunction(zz,mass,k,x,y,z);
    wf2 =  co.Rho2()*Gamow(zz,mass,k);
  }
  return wf2;
}
//=============================================================================
TComplex AliUnicorCoulomb::WaveFunction(int zz, double mass, double k, double x, double y, double z) {

  // Coulomb wave function in parabolic coordinates
  // Merzbacher, Quantum Mechanics, p.248
  // Landau-Lifshitz, Quantum Mechanics (Non-Relativistic Theory), p.518

  double r = sqrt(x*x+y*y+z*z);
  //  double ksi = r+z;
  double eta = r-z;
  TComplex jjj(0,1);
  TComplex a = -zz*mass/k/137.036*jjj;
  TComplex b(1.0,0.0);
  TComplex c = jjj*k*eta/0.197327;
  TComplex wf = TComplex::Exp(jjj*k*z/0.197327)*F1(a,b,c);
  //printf("%8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f \n",a.Re(),a.Im(),b.Re(),b.Im(),c.Re(),c.Im(),F1(a,b,c).Rho());
  return wf;
}
//=============================================================================
double AliUnicorCoulomb::Gamow(int zz, double m, double k) {

  // Squared Coulomb wave function in infinity = Gamow
  // zz - product of charges
  // m - reduced mass
  // k = Qinv/2 for equal masses

  double n = -zz*m/k/137.036;
  double a = 2*TMath::Pi()*n;
  double ga = a/(1.0-exp(-a));
  return ga;
}
//=============================================================================
TComplex AliUnicorCoulomb::F1(TComplex alpha, TComplex gamma, TComplex z) {

  // confluent hypergeometric function 1F1

  double prec = 0.0000001;
  TComplex term(1.0,0.0);
  TComplex sum(1.0,0.0);
  for (int n=1; n<1000; n++) {
    double u = (double) n;
    TComplex v = (alpha+u-1.0)/(gamma+u-1.0);
    TComplex w = z/u;
    term *= v;
    term *= w;
    sum += term;
    //    printf("%10d %10.3f %10.3f %10.3f %10.3f\n", n, v.Rho(), w.Rho(), term.Rho(), sum.Rho());
    if (TComplex::Abs(term/sum) < prec) return sum;
  }
  printf("F1 Maximum number of iterations reached\n");
  return sum;
}
//=============================================================================
 void AliUnicorCoulomb::Makehist(int zz, double m, const char *outfil) {

  // Make a two-dim histogram coulomb(R,Q) and store it on outfil.
  // Later to be used via TH2::Interpolate(). 
  // zz and m are the product of charges and the reduced mass. 

  TH2D *hi = new TH2D("co","coulomb",11,-0.5,10.5,999,0.0005,0.9995);
  hi->SetXTitle("R (fm)");
  hi->SetYTitle("Q (GeV/c)");
  AliUnicorCoulomb *co = 0;
  for (int i=1; i<=hi->GetNbinsX(); i++) {
    double R = hi->GetXaxis()->GetBinCenter(i);
    printf("R = %.1f fm\n",R); 
    co = new AliUnicorCoulomb(zz, m, R);
    for (int j=1; j<=hi->GetNbinsY(); j++) {
      double Q = hi->GetYaxis()->GetBinCenter(j);
      hi->SetBinContent(i,j,co->Eval(Q));
    }
    delete co;
  }
  TFile::Open(outfil,"recreate");
  hi->Write();
  gFile->Close();
}
//=============================================================================
 AliUnicorCoulomb.cxx:1
 AliUnicorCoulomb.cxx:2
 AliUnicorCoulomb.cxx:3
 AliUnicorCoulomb.cxx:4
 AliUnicorCoulomb.cxx:5
 AliUnicorCoulomb.cxx:6
 AliUnicorCoulomb.cxx:7
 AliUnicorCoulomb.cxx:8
 AliUnicorCoulomb.cxx:9
 AliUnicorCoulomb.cxx:10
 AliUnicorCoulomb.cxx:11
 AliUnicorCoulomb.cxx:12
 AliUnicorCoulomb.cxx:13
 AliUnicorCoulomb.cxx:14
 AliUnicorCoulomb.cxx:15
 AliUnicorCoulomb.cxx:16
 AliUnicorCoulomb.cxx:17
 AliUnicorCoulomb.cxx:18
 AliUnicorCoulomb.cxx:19
 AliUnicorCoulomb.cxx:20
 AliUnicorCoulomb.cxx:21
 AliUnicorCoulomb.cxx:22
 AliUnicorCoulomb.cxx:23
 AliUnicorCoulomb.cxx:24
 AliUnicorCoulomb.cxx:25
 AliUnicorCoulomb.cxx:26
 AliUnicorCoulomb.cxx:27
 AliUnicorCoulomb.cxx:28
 AliUnicorCoulomb.cxx:29
 AliUnicorCoulomb.cxx:30
 AliUnicorCoulomb.cxx:31
 AliUnicorCoulomb.cxx:32
 AliUnicorCoulomb.cxx:33
 AliUnicorCoulomb.cxx:34
 AliUnicorCoulomb.cxx:35
 AliUnicorCoulomb.cxx:36
 AliUnicorCoulomb.cxx:37
 AliUnicorCoulomb.cxx:38
 AliUnicorCoulomb.cxx:39
 AliUnicorCoulomb.cxx:40
 AliUnicorCoulomb.cxx:41
 AliUnicorCoulomb.cxx:42
 AliUnicorCoulomb.cxx:43
 AliUnicorCoulomb.cxx:44
 AliUnicorCoulomb.cxx:45
 AliUnicorCoulomb.cxx:46
 AliUnicorCoulomb.cxx:47
 AliUnicorCoulomb.cxx:48
 AliUnicorCoulomb.cxx:49
 AliUnicorCoulomb.cxx:50
 AliUnicorCoulomb.cxx:51
 AliUnicorCoulomb.cxx:52
 AliUnicorCoulomb.cxx:53
 AliUnicorCoulomb.cxx:54
 AliUnicorCoulomb.cxx:55
 AliUnicorCoulomb.cxx:56
 AliUnicorCoulomb.cxx:57
 AliUnicorCoulomb.cxx:58
 AliUnicorCoulomb.cxx:59
 AliUnicorCoulomb.cxx:60
 AliUnicorCoulomb.cxx:61
 AliUnicorCoulomb.cxx:62
 AliUnicorCoulomb.cxx:63
 AliUnicorCoulomb.cxx:64
 AliUnicorCoulomb.cxx:65
 AliUnicorCoulomb.cxx:66
 AliUnicorCoulomb.cxx:67
 AliUnicorCoulomb.cxx:68
 AliUnicorCoulomb.cxx:69
 AliUnicorCoulomb.cxx:70
 AliUnicorCoulomb.cxx:71
 AliUnicorCoulomb.cxx:72
 AliUnicorCoulomb.cxx:73
 AliUnicorCoulomb.cxx:74
 AliUnicorCoulomb.cxx:75
 AliUnicorCoulomb.cxx:76
 AliUnicorCoulomb.cxx:77
 AliUnicorCoulomb.cxx:78
 AliUnicorCoulomb.cxx:79
 AliUnicorCoulomb.cxx:80
 AliUnicorCoulomb.cxx:81
 AliUnicorCoulomb.cxx:82
 AliUnicorCoulomb.cxx:83
 AliUnicorCoulomb.cxx:84
 AliUnicorCoulomb.cxx:85
 AliUnicorCoulomb.cxx:86
 AliUnicorCoulomb.cxx:87
 AliUnicorCoulomb.cxx:88
 AliUnicorCoulomb.cxx:89
 AliUnicorCoulomb.cxx:90
 AliUnicorCoulomb.cxx:91
 AliUnicorCoulomb.cxx:92
 AliUnicorCoulomb.cxx:93
 AliUnicorCoulomb.cxx:94
 AliUnicorCoulomb.cxx:95
 AliUnicorCoulomb.cxx:96
 AliUnicorCoulomb.cxx:97
 AliUnicorCoulomb.cxx:98
 AliUnicorCoulomb.cxx:99
 AliUnicorCoulomb.cxx:100
 AliUnicorCoulomb.cxx:101
 AliUnicorCoulomb.cxx:102
 AliUnicorCoulomb.cxx:103
 AliUnicorCoulomb.cxx:104
 AliUnicorCoulomb.cxx:105
 AliUnicorCoulomb.cxx:106
 AliUnicorCoulomb.cxx:107
 AliUnicorCoulomb.cxx:108
 AliUnicorCoulomb.cxx:109
 AliUnicorCoulomb.cxx:110
 AliUnicorCoulomb.cxx:111
 AliUnicorCoulomb.cxx:112
 AliUnicorCoulomb.cxx:113
 AliUnicorCoulomb.cxx:114
 AliUnicorCoulomb.cxx:115
 AliUnicorCoulomb.cxx:116
 AliUnicorCoulomb.cxx:117
 AliUnicorCoulomb.cxx:118
 AliUnicorCoulomb.cxx:119
 AliUnicorCoulomb.cxx:120
 AliUnicorCoulomb.cxx:121
 AliUnicorCoulomb.cxx:122
 AliUnicorCoulomb.cxx:123
 AliUnicorCoulomb.cxx:124
 AliUnicorCoulomb.cxx:125
 AliUnicorCoulomb.cxx:126
 AliUnicorCoulomb.cxx:127
 AliUnicorCoulomb.cxx:128
 AliUnicorCoulomb.cxx:129
 AliUnicorCoulomb.cxx:130
 AliUnicorCoulomb.cxx:131
 AliUnicorCoulomb.cxx:132
 AliUnicorCoulomb.cxx:133
 AliUnicorCoulomb.cxx:134
 AliUnicorCoulomb.cxx:135
 AliUnicorCoulomb.cxx:136
 AliUnicorCoulomb.cxx:137
 AliUnicorCoulomb.cxx:138
 AliUnicorCoulomb.cxx:139
 AliUnicorCoulomb.cxx:140
 AliUnicorCoulomb.cxx:141
 AliUnicorCoulomb.cxx:142
 AliUnicorCoulomb.cxx:143
 AliUnicorCoulomb.cxx:144
 AliUnicorCoulomb.cxx:145
 AliUnicorCoulomb.cxx:146
 AliUnicorCoulomb.cxx:147
 AliUnicorCoulomb.cxx:148
 AliUnicorCoulomb.cxx:149
 AliUnicorCoulomb.cxx:150
 AliUnicorCoulomb.cxx:151
 AliUnicorCoulomb.cxx:152
 AliUnicorCoulomb.cxx:153
 AliUnicorCoulomb.cxx:154
 AliUnicorCoulomb.cxx:155
 AliUnicorCoulomb.cxx:156
 AliUnicorCoulomb.cxx:157
 AliUnicorCoulomb.cxx:158
 AliUnicorCoulomb.cxx:159
 AliUnicorCoulomb.cxx:160
 AliUnicorCoulomb.cxx:161
 AliUnicorCoulomb.cxx:162
 AliUnicorCoulomb.cxx:163
 AliUnicorCoulomb.cxx:164
 AliUnicorCoulomb.cxx:165
 AliUnicorCoulomb.cxx:166
 AliUnicorCoulomb.cxx:167
 AliUnicorCoulomb.cxx:168