Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Protected Member Functions
G4INCL::CrossSectionsINCL46 Class Reference

Cross sections used in INCL4.6. More...

#include <G4INCLCrossSectionsINCL46.hh>

Inheritance diagram for G4INCL::CrossSectionsINCL46:
G4INCL::ICrossSections

Public Member Functions

virtual G4double elastic (Particle const *const p1, Particle const *const p2)
 Elastic particle-particle cross section. More...
 
virtual G4double total (Particle const *const p1, Particle const *const p2)
 Total (elastic+inelastic) particle-particle cross section. More...
 
virtual G4double pionNucleon (Particle const *const p1, Particle const *const p2)
 Total (elastic+inelastic) pion-nucleon cross section. More...
 
virtual G4double recombination (Particle const *const p1, Particle const *const p2)
 Cross section for NDelta->NN. More...
 
virtual G4double deltaProduction (Particle const *const p1, Particle const *const p2)
 Cross section for NN->NDelta. More...
 
virtual G4double calculateNNAngularSlope (G4double energyCM, G4int iso)
 Calculate the slope of the NN DDXS. More...
 
- Public Member Functions inherited from G4INCL::ICrossSections
 ICrossSections ()
 
virtual ~ICrossSections ()
 

Protected Member Functions

G4double elasticNNLegacy (Particle const *const part1, Particle const *const part2)
 Internal implementation of the elastic cross section. More...
 
G4double deltaProduction (const G4int isospin, const G4double pLab)
 Internal function for the delta-production cross section. More...
 
G4double spnPiPlusPHE (const G4double x)
 
G4double spnPiMinusPHE (const G4double x)
 

Detailed Description

Cross sections used in INCL4.6.

Definition at line 52 of file G4INCLCrossSectionsINCL46.hh.

Member Function Documentation

G4double G4INCL::CrossSectionsINCL46::calculateNNAngularSlope ( G4double  energyCM,
G4int  iso 
)
virtual

Calculate the slope of the NN DDXS.

Parameters
energyCMenergy in the CM frame, in MeV
isototal isospin of the system
Returns
the slope of the angular distribution

Implements G4INCL::ICrossSections.

Definition at line 341 of file G4INCLCrossSectionsINCL46.cc.

References test::b, readPY::pl, and test::x.

341  {
342  G4double x = 0.001 * pl; // Change to GeV
343  if(iso != 0) {
344  if(pl <= 2000.0) {
345  x = std::pow(x, 8);
346  return 5.5e-6 * x/(7.7 + x);
347  } else {
348  return (5.34 + 0.67*(x - 2.0)) * 1.0e-6;
349  }
350  } else {
351  if(pl < 800.0) {
352  G4double b = (7.16 - 1.63*x) * 1.0e-6;
353  return b/(1.0 + std::exp(-(x - 0.45)/0.05));
354  } else if(pl < 1100.0) {
355  return (9.87 - 4.88 * x) * 1.0e-6;
356  } else {
357  return (3.68 + 0.76*x) * 1.0e-6;
358  }
359  }
360  return 0.0; // Should never reach this point
361  }
tuple pl
Definition: readPY.py:5
double G4double
Definition: G4Types.hh:76
G4double G4INCL::CrossSectionsINCL46::deltaProduction ( Particle const *const  p1,
Particle const *const  p2 
)
virtual

Cross section for NN->NDelta.

Implements G4INCL::ICrossSections.

Definition at line 321 of file G4INCLCrossSectionsINCL46.cc.

References G4INCL::ParticleTable::effectiveNucleonMass, G4INCL::ParticleTable::effectivePionMass, G4INCL::ParticleTable::getIsospin(), G4INCL::Particle::getType(), G4INCL::KinematicsUtils::momentumInLab(), and G4INCL::KinematicsUtils::totalEnergyInCM().

Referenced by recombination(), and total().

321  {
322 // assert(p1->isNucleon() && p2->isNucleon());
323  const G4double sqrts = KinematicsUtils::totalEnergyInCM(p1,p2);
324  if(sqrts < ParticleTable::effectivePionMass + 2*ParticleTable::effectiveNucleonMass + 50.) { // approximately yields INCL4.6's hard-coded threshold in collis, 2065 MeV
325  return 0.0;
326  } else {
327  const G4double pLab = KinematicsUtils::momentumInLab(p1,p2);
328  const G4int isospin = ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType());
329  return deltaProduction(isospin, pLab);
330  }
331  }
virtual G4double deltaProduction(Particle const *const p1, Particle const *const p2)
Cross section for NN->NDelta.
int G4int
Definition: G4Types.hh:78
const G4double effectivePionMass
G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
G4double momentumInLab(Particle const *const p1, Particle const *const p2)
gives the momentum in the lab frame of two particles.
double G4double
Definition: G4Types.hh:76
G4double totalEnergyInCM(Particle const *const p1, Particle const *const p2)
const G4double effectiveNucleonMass
G4double G4INCL::CrossSectionsINCL46::deltaProduction ( const G4int  isospin,
const G4double  pLab 
)
protected

Internal function for the delta-production cross section.

Definition at line 146 of file G4INCLCrossSectionsINCL46.cc.

146  {
147  G4double xs = 0.0;
148 // assert(isospin==-2 || isospin==0 || isospin==2);
149 
150  const G4double momentumGeV = 0.001 * pLab;
151  if(pLab < 800.0) {
152  return 0.0;
153  }
154 
155  if(isospin==2 || isospin==-2) { // pp, nn
156  if(pLab >= 2000.0) {
157  xs = (41.0 + (60.0*momentumGeV - 54.0)*std::exp(-1.2*momentumGeV) - 77.0/(momentumGeV + 1.5));
158  } else if(pLab >= 1500.0 && pLab < 2000.0) {
159  xs = (41.0 + 60.0*(momentumGeV - 0.9)*std::exp(-1.2*momentumGeV) - 1250.0/(momentumGeV+50.0)+ 4.0*std::pow(momentumGeV - 1.3, 2));
160  } else if(pLab < 1500.0) {
161  xs = (23.5 + 24.6/(1.0 + std::exp(-10.0*momentumGeV + 12.0))
162  -1250.0/(momentumGeV +50.0)+4.0*std::pow(momentumGeV - 1.3,2));
163  }
164  } else if(isospin==0) { // pn
165  if(pLab >= 2000.0) {
166  xs = (42.0 - 77.0/(momentumGeV + 1.5));
167  } else if(pLab >= 1000.0 && pLab < 2000.0) {
168  xs = (24.2 + 8.9*momentumGeV - 31.1/std::sqrt(momentumGeV));
169  } else if(pLab < 1000.0) {
170  xs = (33.0 + 196.0*std::sqrt(std::pow(std::abs(momentumGeV - 0.95),5))
171  -31.1/std::sqrt(momentumGeV));
172  }
173  }
174 
175  if(xs < 0.0) return 0.0;
176  else return xs;
177  }
double G4double
Definition: G4Types.hh:76
G4double G4INCL::CrossSectionsINCL46::elastic ( Particle const *const  p1,
Particle const *const  p2 
)
virtual

Elastic particle-particle cross section.

Implements G4INCL::ICrossSections.

Definition at line 333 of file G4INCLCrossSectionsINCL46.cc.

References elasticNNLegacy(), and G4INCL::Particle::isPion().

Referenced by total().

333  {
334  if(!p1->isPion() && !p2->isPion())
335  // return elasticNN(p1, p2); // New implementation
336  return elasticNNLegacy(p1, p2); // Translated from INCL4.6 FORTRAN
337  else
338  return 0.0; // No pion-nucleon elastic scattering
339  }
G4double elasticNNLegacy(Particle const *const part1, Particle const *const part2)
Internal implementation of the elastic cross section.
G4double G4INCL::CrossSectionsINCL46::elasticNNLegacy ( Particle const *const  part1,
Particle const *const  part2 
)
protected

Internal implementation of the elastic cross section.

Definition at line 91 of file G4INCLCrossSectionsINCL46.cc.

References G4INCL::ParticleTable::effectiveNucleonMass, G4INCL::ParticleTable::getIsospin(), G4INCL::Particle::getType(), G4INCL::Particle::isNucleon(), G4INCL::KinematicsUtils::momentumInLab(), and G4INCL::KinematicsUtils::squareTotalEnergyInCM().

Referenced by elastic().

91  {
92  G4double scale = 1.0;
93 
94 
95  G4int i = ParticleTable::getIsospin(part1->getType())
96  + ParticleTable::getIsospin(part2->getType());
97  G4double sel = 0.0;
98 
99  /* The NN cross section is parametrised as a function of the lab momentum
100  * of one of the nucleons. For NDelta or DeltaDelta, the physical
101  * assumption is that the cross section is the same as NN *for the same
102  * total CM energy*. Thus, we calculate s from the particles involved, and
103  * we convert this value to the lab momentum of a nucleon *as if this were
104  * an NN collision*.
105  */
106  const G4double s = KinematicsUtils::squareTotalEnergyInCM(part1, part2);
108 
109  G4double p1=0.001*plab;
110  if(plab > 2000.) goto sel13;
111  if(part1->isNucleon() && part2->isNucleon())
112  goto sel1;
113  else
114  goto sel3;
115 sel1: if (i == 0) goto sel2;
116 sel3: if (plab < 800.) goto sel4;
117  if (plab > 2000.) goto sel13;
118  sel=(1250./(50.+p1)-4.*std::pow(p1-1.3, 2))*scale;
119  goto sel100;
120  return sel;
121 sel4: if (plab < 440.) {
122  sel=34.*std::pow(p1/0.4, (-2.104))*scale;
123  } else {
124  sel=(23.5+1000.*std::pow(p1-0.7, 4))*scale;
125  }
126  goto sel100;
127  return sel;
128 sel13: sel=77./(p1+1.5)*scale;
129  goto sel100;
130  return sel;
131 sel2: if (plab < 800.) goto sel11;
132  if (plab > 2000.) goto sel13;
133  sel=31./std::sqrt(p1)*scale;
134  goto sel100;
135  return sel;
136 sel11: if (plab < 450.) {
137  G4double alp=std::log(p1);
138  sel=6.3555*std::exp(-3.2481*alp-0.377*alp*alp)*scale;
139  } else {
140  sel=(33.+196.*std::sqrt(std::pow(std::abs(p1-0.95),5)))*scale;
141  }
142 
143 sel100: return sel;
144  }
const XML_Char * s
G4double squareTotalEnergyInCM(Particle const *const p1, Particle const *const p2)
int G4int
Definition: G4Types.hh:78
G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
G4double momentumInLab(Particle const *const p1, Particle const *const p2)
gives the momentum in the lab frame of two particles.
double G4double
Definition: G4Types.hh:76
const G4double effectiveNucleonMass
G4double G4INCL::CrossSectionsINCL46::pionNucleon ( Particle const *const  p1,
Particle const *const  p2 
)
virtual

Total (elastic+inelastic) pion-nucleon cross section.

Implements G4INCL::ICrossSections.

Definition at line 224 of file G4INCLCrossSectionsINCL46.cc.

References G4INCL::ParticleTable::getIsospin(), G4INCL::Particle::getType(), INCL_ERROR, G4INCL::Particle::isNucleon(), G4INCL::Particle::isPion(), spnPiMinusPHE(), spnPiPlusPHE(), G4INCL::KinematicsUtils::totalEnergyInCM(), and test::x.

Referenced by total().

224  {
225  // FUNCTION SPN(X,IND2T3,IPIT3,f17)
226  // SIGMA(PI+ + P) IN THE (3,3) REGION
227  // NEW FIT BY J.VANDERMEULEN + FIT BY Th AOUST ABOVE (3,3) RES
228  // CONST AT LOW AND VERY HIGH ENERGY
229  // COMMON/BL8/RATHR,RAMASS REL21800
230  // integer f17
231  // RATHR and RAMASS are always 0.0!!!
232 
233  G4double x = KinematicsUtils::totalEnergyInCM(particle1, particle2);
234  if(x>10000.) return 0.0; // no cross section above this value
235 
236  G4int ipit3 = 0;
237  G4int ind2t3 = 0;
238  G4double ramass = 0.0;
239 
240  if(particle1->isPion()) {
241  ipit3 = ParticleTable::getIsospin(particle1->getType());
242  } else if(particle2->isPion()) {
243  ipit3 = ParticleTable::getIsospin(particle2->getType());
244  }
245 
246  if(particle1->isNucleon()) {
247  ind2t3 = ParticleTable::getIsospin(particle1->getType());
248  } else if(particle2->isNucleon()) {
249  ind2t3 = ParticleTable::getIsospin(particle2->getType());
250  }
251 
252  G4double y=x*x;
253  G4double q2=(y-1076.0*1076.0)*(y-800.0*800.0)/y/4.0;
254  if (q2 <= 0.) {
255  return 0.0;
256  }
257  G4double q3 = std::pow(std::sqrt(q2),3);
258  G4double f3 = q3/(q3 + 5832000.); // 5832000 = 180^3
259  G4double spnResult = 326.5/(std::pow((x-1215.0-ramass)*2.0/(110.0-ramass), 2)+1.0);
260  spnResult = spnResult*(1.0-5.0*ramass/1215.0);
261  G4double cg = 4.0 + G4double(ind2t3)*G4double(ipit3);
262  spnResult = spnResult*f3*cg/6.0;
263 
264  if(x < 1200.0 && spnResult < 5.0) {
265  spnResult = 5.0;
266  }
267 
268  // HE pi+ p and pi- n
269  if(x > 1290.0) {
270  if((ind2t3 == 1 && ipit3 == 2) || (ind2t3 == -1 && ipit3 == -2))
271  spnResult=spnPiPlusPHE(x);
272  else if((ind2t3 == 1 && ipit3 == -2) || (ind2t3 == -1 && ipit3 == 2))
273  spnResult=spnPiMinusPHE(x);
274  else if(ipit3 == 0) spnResult = (spnPiPlusPHE(x) + spnPiMinusPHE(x))/2.0; // (spnpipphe(x)+spnpimphe(x))/2.0
275  else {
276  INCL_ERROR("Unknown configuration!" << std::endl);
277  }
278  }
279 
280  return spnResult;
281  }
#define INCL_ERROR(x)
G4double spnPiMinusPHE(const G4double x)
int G4int
Definition: G4Types.hh:78
G4double spnPiPlusPHE(const G4double x)
G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
double G4double
Definition: G4Types.hh:76
G4double totalEnergyInCM(Particle const *const p1, Particle const *const p2)
G4double G4INCL::CrossSectionsINCL46::recombination ( Particle const *const  p1,
Particle const *const  p2 
)
virtual

Cross section for NDelta->NN.

Implements G4INCL::ICrossSections.

Definition at line 283 of file G4INCLCrossSectionsINCL46.cc.

References deltaProduction(), G4INCL::ParticleTable::effectiveNucleonMass, G4INCL::ParticleTable::effectiveNucleonMass2, G4INCL::ParticleTable::getIsospin(), G4INCL::Particle::getMass(), G4INCL::Particle::getType(), G4INCL::Particle::isDelta(), G4INCL::KinematicsUtils::momentumInLab(), G4INCL::KinematicsUtils::squareTotalEnergyInCM(), and test::x.

Referenced by total().

283  {
284  const G4int isospin = ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType());
285  if(isospin==4 || isospin==-4) return 0.0;
286 
288  G4double Ecm = std::sqrt(s);
289  G4int deltaIsospin;
290  G4double deltaMass;
291  if(p1->isDelta()) {
292  deltaIsospin = ParticleTable::getIsospin(p1->getType());
293  deltaMass = p1->getMass();
294  } else {
295  deltaIsospin = ParticleTable::getIsospin(p2->getType());
296  deltaMass = p2->getMass();
297  }
298 
299  if(Ecm <= 938.3 + deltaMass) {
300  return 0.0;
301  }
302 
303  if(Ecm < 938.3 + deltaMass + 2.0) {
304  Ecm = 938.3 + deltaMass + 2.0;
305  s = Ecm*Ecm;
306  }
307 
309  (s - std::pow(ParticleTable::effectiveNucleonMass + deltaMass, 2));
310  const G4double y = s/(s - std::pow(deltaMass - ParticleTable::effectiveNucleonMass, 2));
311  /* Concerning the way we calculate the lab momentum, see the considerations
312  * in CrossSections::elasticNNLegacy().
313  */
315  G4double result = 0.5 * x * y * deltaProduction(isospin, pLab);
316  result *= 3.*(32.0 + isospin * isospin * (deltaIsospin * deltaIsospin - 5))/64.0;
317  result /= 1.0 + 0.25 * isospin * isospin;
318  return result;
319  }
virtual G4double deltaProduction(Particle const *const p1, Particle const *const p2)
Cross section for NN->NDelta.
const XML_Char * s
G4double squareTotalEnergyInCM(Particle const *const p1, Particle const *const p2)
int G4int
Definition: G4Types.hh:78
G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
const G4double effectiveNucleonMass2
G4double momentumInLab(Particle const *const p1, Particle const *const p2)
gives the momentum in the lab frame of two particles.
double G4double
Definition: G4Types.hh:76
const G4double effectiveNucleonMass
G4double G4INCL::CrossSectionsINCL46::spnPiMinusPHE ( const G4double  x)
protected

Definition at line 192 of file G4INCLCrossSectionsINCL46.cc.

Referenced by pionNucleon().

192  {
193  // HE pi- p and pi+ n
194  if(x <= 1475.0) {
195  return 0.00120683*(x-1372.52)*(x-1372.52)+26.2058;
196  } else if(x > 1475.0 && x <= 1565.0) {
197  return 1.15873e-05*x*x+49965.6/((x-1519.59)*(x-1519.59)+2372.55);
198  } else if(x > 1565.0 && x <= 2400.0) {
199  return 34.0248+43262.2/((x-1681.65)*(x-1681.65)+1689.35);
200  } else if(x > 2400.0 && x <= 7500.0) {
201  return 3.3e-7*(x-7500.0)*(x-7500.0)+24.5;
202  } else {
203  return 24.5;
204  }
205  }
G4double G4INCL::CrossSectionsINCL46::spnPiPlusPHE ( const G4double  x)
protected

Definition at line 179 of file G4INCLCrossSectionsINCL46.cc.

Referenced by pionNucleon().

179  {
180  // HE and LE pi- p and pi+ n
181  if(x <= 1750.0) {
182  return -2.33730e-06*std::pow(x, 3)+1.13819e-02*std::pow(x,2)
183  -1.83993e+01*x+9893.4;
184  } else if(x > 1750.0 && x <= 2175.0) {
185  return 1.13531e-06*std::pow(x, 3)-6.91694e-03*std::pow(x, 2)
186  +1.39907e+01*x-9360.76;
187  } else {
188  return -3.18087*std::log(x)+52.9784;
189  }
190  }
G4double G4INCL::CrossSectionsINCL46::total ( Particle const *const  p1,
Particle const *const  p2 
)
virtual

Total (elastic+inelastic) particle-particle cross section.

Implements G4INCL::ICrossSections.

Definition at line 207 of file G4INCLCrossSectionsINCL46.cc.

References deltaProduction(), elastic(), G4INCL::Particle::isDelta(), G4INCL::Particle::isNucleon(), G4INCL::Particle::isPion(), pionNucleon(), and recombination().

207  {
208  G4double inelastic = 0.0;
209  if(p1->isNucleon() && p2->isNucleon()) {
210  inelastic = deltaProduction(p1, p2);
211  } else if((p1->isNucleon() && p2->isDelta()) ||
212  (p1->isDelta() && p2->isNucleon())) {
213  inelastic = recombination(p1, p2);
214  } else if((p1->isNucleon() && p2->isPion()) ||
215  (p1->isPion() && p2->isNucleon())) {
216  inelastic = pionNucleon(p1, p2);
217  } else {
218  inelastic = 0.0;
219  }
220 
221  return inelastic + elastic(p1, p2);
222  }
virtual G4double deltaProduction(Particle const *const p1, Particle const *const p2)
Cross section for NN->NDelta.
virtual G4double recombination(Particle const *const p1, Particle const *const p2)
Cross section for NDelta->NN.
virtual G4double pionNucleon(Particle const *const p1, Particle const *const p2)
Total (elastic+inelastic) pion-nucleon cross section.
virtual G4double elastic(Particle const *const p1, Particle const *const p2)
Elastic particle-particle cross section.
double G4double
Definition: G4Types.hh:76

The documentation for this class was generated from the following files: