ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4KalbachCrossSection.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4KalbachCrossSection.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 //
28 // V.Ivanchenko 26.02.2018
29 //
30 
31 #include "G4KalbachCrossSection.hh"
32 #include "G4Exp.hh"
33 #include "G4Pow.hh"
34 
35 //from subroutine sigpar of PRECO-2000 by Constance Kalbach Walker
36 // Calculate optical model reaction cross sections
37 // using the empirical parameterization
38 // of Narasimha Murthy, Chaterjee, and Gupta
39 // going over to the geometrical limit at high energy.
40 //
41 // Proton cross sections scaled down with signor for a<100
42 // (appropriate for becchetti-greenlees potential).
43 // p2 reduced and global red'n factor introduced below Bc
44 // Neutron cross sections scaled down with signor for a<40
45 // Scaled up for A>210 (added June '98 to conform with
46 // my published papers)
47 // (appropriate for Mani et al potential)
48 //
49 
50 // index: 0-neutron, 1-proton, 2-deuteron, 3-triton, 4-He3, 5-He4
51 // parameters: p0, p1, p2, lambda0, lambda1, mu0, mu1, nu0, nu1, nu2, ra
52 
53 static const G4double paramK[6][11] = {
54  // n from mani, melkanoff and iori
55  {-312., 0., 0., 12.10, -11.27, 234.1, 38.26, 1.55, -106.1, 1280.8, 0.0},
56  // p from becchetti and greenlees (but modified with sub-barrier
57  // correction function and p2 changed from -449)
58  {15.72, 9.65, -300., 0.00437,-16.58, 244.7, 0.503, 273.1, -182.4, -1.872, 0.0},
59  // d from o.m. of perey and perey
60  {0.798, 420.3,-1651., 0.00619, -7.54, 583.5, 0.337, 421.8, -474.5, -3.592, 0.8},
61  // t from o.m. of hafele, flynn et al
62  {-21.45,484.7,-1608., 0.0186, -8.9, 686.3, 0.325, 368.9, -522.2, -4.998, 0.8},
63  // 3he from o.m. of gibson et al
64  {-2.88,205.6, -1487.,0.00459,-8.93, 611.2, 0.35 , 473.8, -468.2, -2.225, 0.8},
65  // alpha from huizenga and igo
66  { 10.95,-85.2, 1146., 0.0643,-13.96, 781.2, 0.29, -304.7,-470.0, -8.580, 1.2}
67 };
68 
70 {
71  return G4Pow::GetInstance()->powZ(resA, paramK[idx][6]);
72 }
73 
74 G4double
76  G4double resA13, G4double amu1,
77  G4int idx, G4int Z, G4int A,
78  G4int resA)
79 {
80  G4double sig = 0.0;
81  G4double signor = 1.0;
82  G4double lambda, mu, nu;
83  G4double ec = 0.5;
84  if(0 < Z) { ec = cb; }
85  //JMQ 13.02.2009 tuning for improving cluster emission ddxs
86  // (spallation benchmark)
87  /*
88  G4double xx = 1.7;
89  if(1 == A) { xx = 1.5; }
90  ec = 1.44 * Z * resZ / (xx*resA13 + paramK[idx][10]);
91  }
92  */
93  G4double ecsq = ec*ec;
94  G4double elab = K * (A + resA) / G4double(resA);
95 
96  if(idx == 0) { // parameterization for neutron
97 
98  if(resA < 40) { signor =0.7 + resA*0.0075; }
99  else if(resA > 210) { signor = 1. + (resA-210)*0.004; }
100  lambda = paramK[idx][3]/resA13 + paramK[idx][4];
101  mu = (paramK[idx][5] + paramK[idx][6]*resA13)*resA13;
102  // JMQ 20.11.2008 very low energy behaviour corrected
103  // (problem for A (apprx.)>60) fix for avoiding
104  // neutron xs going to zero at very low energies
105  nu = std::abs((paramK[idx][7]*resA + paramK[idx][8]*resA13)*resA13
106  + paramK[idx][9]);
107 
108  } else { // parameterization for charged
109  // proton correction
110  if(idx == 1) {
111  if (resA <= 60) { signor = 0.92; }
112  else if (resA < 100) { signor = 0.8 + resA*0.002; }
113  }
114  lambda = paramK[idx][3]*resA + paramK[idx][4];
115  mu = paramK[idx][5]*amu1;
116  nu = amu1* (paramK[idx][7] + paramK[idx][8]*ec + paramK[idx][9]*ecsq);
117  }
118  /*
119  G4cout << "## idx= " << idx << " K= " << K << " elab= " << elab << " ec= " << ec
120  << " lambda= " << lambda << " mu= " << mu << " nu= " << nu << G4endl;
121  */
122  // threashold cross section
123  if(elab < ec) {
124  G4double p = paramK[idx][0];
125  if(0 < Z) { p += paramK[idx][1]/ec + paramK[idx][2]/ecsq; }
126  G4double a = -2*p*ec + lambda - nu/ecsq;
127  G4double b = p*ecsq + mu + 2*nu/ec;
128  G4double ecut;
129  G4double det = a*a - 4*p*b;
130  if (det > 0.0) { ecut = (std::sqrt(det) - a)/(2*p); }
131  else { ecut = -a/(2*p); }
132 
133  //G4cout << " elab= " << elab << " ecut= " << ecut << " sig= " << sig
134  // << " sig1= " << (p*elab*elab + a*elab + b)*signor << G4endl;
135  // If ecut>0, sig=0 at elab=ecut
136  if(0 == idx) {
137  sig = (lambda*ec + mu + nu/ec)*signor*std::sqrt(elab/ec);
138  } else if(elab >= ecut) {
139  sig = (p*elab*elab + a*elab + b)*signor;
140 
141  // extra proton correction
142  if(1 == idx) {
143  // c and w are for global correction factor for
144  // they are scaled down for light targets where ec is low.
145  G4double cc = std::min(3.15, ec*0.5);
146  G4double signor2 = (ec - elab - cc) *3.15/ (0.7*cc);
147  sig /= (1. + G4Exp(signor2));
148  }
149  }
150  //G4cout << " ecut= " << ecut << " a= " << a << " b= " << b
151  // << " signor= " << signor << " sig= " << sig << G4endl;
152 
153  // high energy cross section
154  } else {
155  // etest is the energy above which the rxn cross section is
156  // compared with the geometrical limit and the max taken.
157 
158  // neutron parameters
159  G4double etest = 32.;
160  G4double xnulam = 1.0;
161 
162  // parameters for charged
163  static const G4double flow = 1.e-18;
164  static const G4double spill= 1.e+18;
165  if(0 < Z) {
166  etest = 0.0;
167  xnulam = nu / lambda;
168  xnulam = std::min(xnulam, spill);
169  if (xnulam >= flow) {
170  if(1 == idx) { etest = std::sqrt(xnulam) + 7.; }
171  else { etest = 1.2 *std::sqrt(xnulam); }
172  }
173  }
174  // ** For xnulam.gt.0, sig reaches a maximum at sqrt(xnulam).
175  sig = (lambda*elab + mu + nu/elab)*signor;
176  if (xnulam >= flow && elab >= etest) {
177  G4double geom = std::sqrt(A*K);
178  geom = 1.23*resA13 + paramK[idx][10] + 4.573/geom;
179  geom = 31.416 * geom * geom;
180  sig = std::max(sig, geom);
181  }
182  }
183  sig = std::max(sig, 0.0);
184  //G4cout << " ---- sig= " << sig << G4endl;
185  return sig;
186 }