]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STARLIGHT/starlight/src/nucleus.cpp~
STARLIGHT code and interface
[u/mrichter/AliRoot.git] / STARLIGHT / starlight / src / nucleus.cpp~
diff --git a/STARLIGHT/starlight/src/nucleus.cpp~ b/STARLIGHT/starlight/src/nucleus.cpp~
new file mode 100644 (file)
index 0000000..d175246
--- /dev/null
@@ -0,0 +1,216 @@
+///////////////////////////////////////////////////////////////////////////
+//
+//    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:: 164                         $: revision of last commit
+// $Author:: odjuvsla                 $: author of last commit
+// $Date:: 2013-10-06 16:18:08 +0200 #$: date of last commit
+//
+// Description:
+//
+//
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+#include <iostream>
+#include <fstream>
+
+#include "starlightconstants.h"
+#include "reportingUtils.h"
+#include "nucleus.h"
+#include <inputParameters.h>
+
+
+using namespace std;
+using namespace starlightConstants;
+
+//______________________________________________________________________________
+nucleus::nucleus(const int    Z,
+                 const int    A,
+                 const double deuteronSlopePar,
+                 const bool   dAuCoherentProduction)
+       : _Z(Z),
+         _A(A),
+         _deuteronSlopePar(deuteronSlopePar),
+         _dAuCoherentProduction(dAuCoherentProduction)
+{
+  init();      
+}
+
+void nucleus::init()
+{
+  switch (_Z) {
+       case 79:
+               {
+                       _Q0   = 0.060;
+                       _rho0 = 0.159407;
+               }
+               break;
+       case 53:
+       case 49:
+               {
+                       _Q0   = 0.069;
+                       _rho0 = 0.161626;
+               }
+               break;
+       case 29:
+               {
+                       _Q0   = 0.087;
+                       _rho0 = 0.166878;
+               }
+               break;
+       case 14:
+               {
+                       _Q0   = 0.115;
+                       _rho0 = 0.177128;
+               }
+               break;
+       case 8:
+               {
+                       _Q0   = 0.138;
+                       _rho0 = 0.188459;
+               }
+               break;
+       case 82:
+               {
+                       _Q0   = 0.059;
+                       _rho0 = 0.159176;
+               }
+               break;
+       case 20:
+               {
+                       _Q0   = 0.102;
+                       _rho0 = 0.171907;
+               }
+               break;
+       case 1: // _Q0 and _rho0 are not relevant for protons.
+               {
+                       _Q0   = -1.0;
+                       _rho0 = -1.0;
+               }
+               break;
+       default:
+               printWarn << "density not defined for projectile with Z = " << _Z << ". using defaults." << endl;
+               _rho0 = 0.16;  //'typical' density
+               _Q0   = 0.0;   // not used.
+       }
+       _r0 = 1.16 * (1. - 1.16 * pow(_A, -2. / 3.));  // for FRITIOF and FormFactor.
+}
+
+//______________________________________________________________________________
+nucleus::~nucleus()
+{ }
+
+
+//______________________________________________________________________________
+double
+nucleus::nuclearRadius() const
+{
+       // we use this for specific nuclei, Au, Pb, protons...
+       if (_Z == 79)                // Au
+               return 6.38;  // [fm]
+       if (_Z == 82)                // Pb
+               return 6.62;  // [fm]
+       if ((_Z == 1) && (_A == 1))  // proton
+               return 0.7;   // [fm]
+       if ((_Z == 1) && (_A == 2))  // deuteron
+               return 1.9;   // [fm]
+       return 1.2 * pow(_A, 1. / 3.); 
+}
+
+
+//______________________________________________________________________________
+double
+nucleus::formFactor(const double t) const
+{
+       // electromagnetic form factor of proton
+       if ((_Z == 1) && (_A == 1)) {
+               const double rec = 1. / (1. + t / 0.71);
+               return rec * rec;
+       }
+       // deuteron form factor
+       if ((_Z == 1) && (_A == 2)) {   // careful with this line on dAu
+               // this is for dAu//Sergey
+               // sergey's stuff, also replaced b with _deuteronSlopePar and dropped t02 since it wasnt used
+               // incoherent form factor F(t) = 0.34 e(141.5 t) + 0.58 e(26.1 t) + 0.08 e(15.5 t)
+               const double st  = 0.34 * exp(-141.5 * t    ) + 0.58 * exp(-26.1 * t    ) + 0.08 * exp(-15.5 * t    );
+               const double st4 = 0.34 * exp(-141.5 * t / 4) + 0.58 * exp(-26.1 * t / 4) + 0.08 * exp(-15.5 * t / 4);
+               // st paramters from Franco and Varma for st eqn PRL33 ...
+               // form factor from Eisenberg, nuclear physics B 104
+               const double arg = _deuteronSlopePar * t;
+               if (_dAuCoherentProduction)
+                       return (st4 * st4 * exp(-arg) - 0.068 * st4 * exp(-arg * 3. / 4.));
+               return exp(-arg) * 0.5 * (1 + st) - 0.068 * exp(-arg * 3. / 4.)
+                       - st4 * st4 * exp(-arg) + 0.068 * st4 * exp(-arg * 3. / 4.);
+       }
+       // nuclear form factor
+       // use parameterization from FRITIOF
+       // R = r0 * A^{1/3} with r0 = 1.16 * (1 - 1.16 * A^{-2/3})
+       const double R    = fritiofR0();
+       const double q    = sqrt(t);
+       const double arg1 = q * R / hbarc;
+       const double arg2 = hbarc / (q * _r0);
+       const double sph  = (sin(arg1) - arg1 * cos(arg1)) * 3. * arg2 * arg2 * arg2 / double(_A);
+       const double a0   = 0.70;  // [fm]
+       return sph / (1. + (a0 * a0 * t) / (hbarc * hbarc));
+}
+
+//______________________________________________________________________________
+
+double
+nucleus::dipoleFormFactor(const double t, const double t0) const
+{
+     const double rec = 1. / (1. + t / t0);
+     return rec * rec;
+}
+
+//______________________________________________________________________________
+double
+nucleus::thickness(const double b) const
+{
+       //    JS      This code calculates the nuclear thickness function as per Eq. 4 in
+       //    Klein and Nystrand, PRC 60.
+       //    former DOUBLE PRECISION FUNCTION T(b)
+                                                  
+       // data for Gauss integration
+       const unsigned int nmbPoints         = 5;
+       const double       xg[nmbPoints + 1] = {0., 0.1488743390, 0.4333953941, 0.6794095683,
+                                               0.8650633667, 0.9739065285};
+       const double       ag[nmbPoints + 1] = {0., 0.2955242247, 0.2692667193, 0.2190863625,
+                                               0.1494513492, 0.0666713443};
+  
+       const double zMin   = 0;
+       const double zMax   = 15;
+       const double zRange = 0.5 * (zMax - zMin); 
+       const double zMean  = 0.5 * (zMax + zMin); 
+       double       sum    = 0;
+       for(unsigned int i = 1; i <= nmbPoints; ++i) {
+               double zsp    = zRange * xg[i] + zMean;
+               double radius = sqrt(b * b + zsp * zsp);
+               sum          += ag[i] * rws(radius);
+               zsp           = zRange * (-xg[i]) + zMean;
+               radius        = sqrt(b * b + zsp * zsp);
+               sum          += ag[i] * rws(radius);
+       }
+  
+       return 2. * zRange * sum;
+}