Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4INCL::CrossSections Class Reference

#include <G4INCLCrossSections.hh>

Static Public Member Functions

static G4double elastic (Particle const *const p1, Particle const *const p2)
 
static G4double total (Particle const *const p1, Particle const *const p2)
 
static G4double pionNucleon (Particle const *const p1, Particle const *const p2)
 
static G4double recombination (Particle const *const p1, Particle const *const p2)
 
static G4double deltaProduction (Particle const *const p1, Particle const *const p2)
 
static G4double calculateNNDiffCrossSection (G4double energyCM, G4int iso)
 Calculate the slope of the NN DDXS.
 
static G4double interactionDistanceNN (const G4double projectileKineticEnergy)
 Compute the "interaction distance".
 
static G4double interactionDistancePiN (const G4double projectileKineticEnergy)
 Compute the "interaction distance".
 
static G4double interactionDistanceNN1GeV ()
 The interaction distance for nucleons at 1 GeV.
 
static G4double interactionDistancePiN1GeV ()
 The interaction distance for pions at 1 GeV.
 

Protected Member Functions

 CrossSections ()
 
 ~CrossSections ()
 

Detailed Description

Definition at line 47 of file G4INCLCrossSections.hh.

Constructor & Destructor Documentation

◆ CrossSections()

G4INCL::CrossSections::CrossSections ( )
inlineprotected

Definition at line 114 of file G4INCLCrossSections.hh.

114{};

◆ ~CrossSections()

G4INCL::CrossSections::~CrossSections ( )
inlineprotected

Definition at line 115 of file G4INCLCrossSections.hh.

115{};

Member Function Documentation

◆ calculateNNDiffCrossSection()

G4double G4INCL::CrossSections::calculateNNDiffCrossSection ( G4double  energyCM,
G4int  iso 
)
static

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

Definition at line 343 of file G4INCLCrossSections.cc.

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

Referenced by G4INCL::ElasticChannel::getFinalState().

◆ deltaProduction()

G4double G4INCL::CrossSections::deltaProduction ( Particle const *const  p1,
Particle const *const  p2 
)
static

Definition at line 189 of file G4INCLCrossSections.cc.

189 {
190// assert(p1->isNucleon() && p2->isNucleon());
191 const G4double sqrts = KinematicsUtils::totalEnergyInCM(p1,p2);
192 if(sqrts < ParticleTable::effectivePionMass + 2*ParticleTable::effectiveNucleonMass + 50.) { // approximately yields INCL4.6's hard-coded threshold in collis, 2065 MeV
193 return 0.0;
194 } else {
195 const G4double pLab = KinematicsUtils::momentumInLab(p1,p2);
196 const G4int isospin = ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType());
197 return deltaProduction(isospin, pLab);
198 }
199 }
int G4int
Definition: G4Types.hh:66
static G4double deltaProduction(Particle const *const p1, Particle const *const p2)
static G4double totalEnergyInCM(Particle const *const p1, Particle const *const p2)
static G4double momentumInLab(Particle const *const p1, Particle const *const p2)
gives the momentum in the lab frame of two particles.
static G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
static const G4double effectiveNucleonMass
static const G4double effectivePionMass

Referenced by deltaProduction(), G4INCL::BinaryCollisionAvatar::getChannel(), recombination(), and total().

◆ elastic()

G4double G4INCL::CrossSections::elastic ( Particle const *const  p1,
Particle const *const  p2 
)
static

Definition at line 335 of file G4INCLCrossSections.cc.

335 {
336 if(!p1->isPion() && !p2->isPion())
337 // return elasticNN(p1, p2); // New implementation
338 return elasticNNLegacy(p1, p2); // Translated from INCL4.6 FORTRAN
339 else
340 return 0.0; // No pion-nucleon elastic scattering
341 }

Referenced by G4INCL::BinaryCollisionAvatar::getChannel(), and total().

◆ interactionDistanceNN()

G4double G4INCL::CrossSections::interactionDistanceNN ( const G4double  projectileKineticEnergy)
static

Compute the "interaction distance".

Defined on the basis of the average value of the N-N cross sections at the given kinetic energy.

Returns
the interaction distance

Definition at line 365 of file G4INCLCrossSections.cc.

365 {
366 ThreeVector nullVector;
367 ThreeVector unitVector(0., 0., 1.);
368
369 Particle protonProjectile(Proton, unitVector, nullVector);
370 protonProjectile.setEnergy(protonProjectile.getMass()+projectileKineticEnergy);
371 protonProjectile.adjustMomentumFromEnergy();
372 Particle neutronProjectile(Neutron, unitVector, nullVector);
373 neutronProjectile.setEnergy(neutronProjectile.getMass()+projectileKineticEnergy);
374 neutronProjectile.adjustMomentumFromEnergy();
375
376 Particle protonTarget(Proton, nullVector, nullVector);
377 Particle neutronTarget(Neutron, nullVector, nullVector);
378 const G4double sigmapp = total(&protonProjectile, &protonTarget);
379 const G4double sigmapn = total(&protonProjectile, &neutronTarget);
380 const G4double sigmanp = total(&neutronProjectile, &protonTarget);
381 const G4double sigmann = total(&neutronProjectile, &neutronTarget);
382 /* We compute the interaction distance from the largest of the NN cross
383 * sections. Note that this is different from INCL4.6, which just takes the
384 * average of the four, and will in general lead to a different geometrical
385 * cross section.
386 */
387 const G4double largestSigma = std::max(sigmapp, std::max(sigmapn, std::max(sigmanp,sigmann)));
388 const G4double interactionDistance = std::sqrt(largestSigma/Math::tenPi);
389
390 return interactionDistance;
391 }
static G4double total(Particle const *const p1, Particle const *const p2)
const G4double tenPi

Referenced by interactionDistanceNN1GeV().

◆ interactionDistanceNN1GeV()

static G4double G4INCL::CrossSections::interactionDistanceNN1GeV ( )
inlinestatic

The interaction distance for nucleons at 1 GeV.

Used to determine the universe radius at any energy.

Definition at line 87 of file G4INCLCrossSections.hh.

87 {
89 return answer;
90 }
static G4double interactionDistanceNN(const G4double projectileKineticEnergy)
Compute the "interaction distance".

◆ interactionDistancePiN()

G4double G4INCL::CrossSections::interactionDistancePiN ( const G4double  projectileKineticEnergy)
static

Compute the "interaction distance".

Defined on the basis of the average value of the pi-N cross sections at the given kinetic energy.

Returns
the interaction distance

Definition at line 393 of file G4INCLCrossSections.cc.

393 {
394 ThreeVector nullVector;
395 ThreeVector unitVector(0., 0., 1.);
396
397 Particle piPlusProjectile(PiPlus, unitVector, nullVector);
398 piPlusProjectile.setEnergy(piPlusProjectile.getMass()+projectileKineticEnergy);
399 piPlusProjectile.adjustMomentumFromEnergy();
400 Particle piZeroProjectile(PiZero, unitVector, nullVector);
401 piZeroProjectile.setEnergy(piZeroProjectile.getMass()+projectileKineticEnergy);
402 piZeroProjectile.adjustMomentumFromEnergy();
403 Particle piMinusProjectile(PiMinus, unitVector, nullVector);
404 piMinusProjectile.setEnergy(piMinusProjectile.getMass()+projectileKineticEnergy);
405 piMinusProjectile.adjustMomentumFromEnergy();
406
407 Particle protonTarget(Proton, nullVector, nullVector);
408 Particle neutronTarget(Neutron, nullVector, nullVector);
409 const G4double sigmapipp = total(&piPlusProjectile, &protonTarget);
410 const G4double sigmapipn = total(&piPlusProjectile, &neutronTarget);
411 const G4double sigmapi0p = total(&piZeroProjectile, &protonTarget);
412 const G4double sigmapi0n = total(&piZeroProjectile, &neutronTarget);
413 const G4double sigmapimp = total(&piMinusProjectile, &protonTarget);
414 const G4double sigmapimn = total(&piMinusProjectile, &neutronTarget);
415 /* We compute the interaction distance from the largest of the pi-N cross
416 * sections. Note that this is different from INCL4.6, which just takes the
417 * average of the six, and will in general lead to a different geometrical
418 * cross section.
419 */
420 const G4double largestSigma = std::max(sigmapipp, std::max(sigmapipn, std::max(sigmapi0p, std::max(sigmapi0n, std::max(sigmapimp,sigmapimn)))));
421 const G4double interactionDistance = std::sqrt(largestSigma/Math::tenPi);
422
423 return interactionDistance;
424 }

Referenced by interactionDistancePiN1GeV().

◆ interactionDistancePiN1GeV()

static G4double G4INCL::CrossSections::interactionDistancePiN1GeV ( )
inlinestatic

The interaction distance for pions at 1 GeV.

Used to determine the universe radius at any energy.

Definition at line 96 of file G4INCLCrossSections.hh.

96 {
98 return answer;
99 }
static G4double interactionDistancePiN(const G4double projectileKineticEnergy)
Compute the "interaction distance".

◆ pionNucleon()

G4double G4INCL::CrossSections::pionNucleon ( Particle const *const  p1,
Particle const *const  p2 
)
static

Definition at line 64 of file G4INCLCrossSections.cc.

64 {
65 // FUNCTION SPN(X,IND2T3,IPIT3,f17)
66 // SIGMA(PI+ + P) IN THE (3,3) REGION
67 // NEW FIT BY J.VANDERMEULEN + FIT BY Th AOUST ABOVE (3,3) RES
68 // CONST AT LOW AND VERY HIGH ENERGY
69 // COMMON/BL8/RATHR,RAMASS REL21800
70 // integer f17
71 // RATHR and RAMASS are always 0.0!!!
72
73 G4double x = KinematicsUtils::totalEnergyInCM(particle1, particle2);
74 if(x>10000.) return 0.0; // no cross section above this value
75
76 G4int ipit3 = 0;
77 G4int ind2t3 = 0;
78 G4double ramass = 0.0;
79
80 if(particle1->isPion()) {
81 ipit3 = ParticleTable::getIsospin(particle1->getType());
82 } else if(particle2->isPion()) {
83 ipit3 = ParticleTable::getIsospin(particle2->getType());
84 }
85
86 if(particle1->isNucleon()) {
87 ind2t3 = ParticleTable::getIsospin(particle1->getType());
88 } else if(particle2->isNucleon()) {
89 ind2t3 = ParticleTable::getIsospin(particle2->getType());
90 }
91
92 G4double y=x*x;
93 G4double q2=(y-1076.0*1076.0)*(y-800.0*800.0)/y/4.0;
94 if (q2 <= 0.) {
95 return 0.0;
96 }
97 G4double q3 = std::pow(std::sqrt(q2),3);
98 G4double f3 = q3/(q3 + 5832000.); // 5832000 = 180^3
99 G4double spnResult = 326.5/(std::pow((x-1215.0-ramass)*2.0/(110.0-ramass), 2)+1.0);
100 spnResult = spnResult*(1.0-5.0*ramass/1215.0);
101 G4double cg = 4.0 + G4double(ind2t3)*G4double(ipit3);
102 spnResult = spnResult*f3*cg/6.0;
103
104 if(x < 1200.0 && spnResult < 5.0) {
105 spnResult = 5.0;
106 }
107
108 // HE pi+ p and pi- n
109 if(x > 1290.0) {
110 if((ind2t3 == 1 && ipit3 == 2) || (ind2t3 == -1 && ipit3 == -2))
111 spnResult=CrossSections::spnPiPlusPHE(x);
112 else if((ind2t3 == 1 && ipit3 == -2) || (ind2t3 == -1 && ipit3 == 2))
113 spnResult=CrossSections::spnPiMinusPHE(x);
114 else if(ipit3 == 0) spnResult = (CrossSections::spnPiPlusPHE(x) + CrossSections::spnPiMinusPHE(x))/2.0; // (spnpipphe(x)+spnpimphe(x))/2.0
115 else {
116 ERROR("Unknown configuration!" << std::endl);
117 }
118 }
119
120 return spnResult;
121 }
#define ERROR(x)

Referenced by total().

◆ recombination()

G4double G4INCL::CrossSections::recombination ( Particle const *const  p1,
Particle const *const  p2 
)
static

Definition at line 151 of file G4INCLCrossSections.cc.

151 {
152 const G4int isospin = ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType());
153 if(isospin==4 || isospin==-4) return 0.0;
154
156 G4double Ecm = std::sqrt(s);
157 G4int deltaIsospin;
158 G4double deltaMass;
159 if(p1->isDelta()) {
160 deltaIsospin = ParticleTable::getIsospin(p1->getType());
161 deltaMass = p1->getMass();
162 } else {
163 deltaIsospin = ParticleTable::getIsospin(p2->getType());
164 deltaMass = p2->getMass();
165 }
166
167 if(Ecm <= 938.3 + deltaMass) {
168 return 0.0;
169 }
170
171 if(Ecm < 938.3 + deltaMass + 2.0) {
172 Ecm = 938.3 + deltaMass + 2.0;
173 s = Ecm*Ecm;
174 }
175
177 (s - std::pow(ParticleTable::effectiveNucleonMass + deltaMass, 2));
178 const G4double y = s/(s - std::pow(deltaMass - ParticleTable::effectiveNucleonMass, 2));
179 /* Concerning the way we calculate the lab momentum, see the considerations
180 * in CrossSections::elasticNNLegacy().
181 */
183 G4double result = 0.5 * x * y * deltaProduction(isospin, pLab);
184 result *= 3.*(32.0 + isospin * isospin * (deltaIsospin * deltaIsospin - 5))/64.0;
185 result /= 1.0 + 0.25 * isospin * isospin;
186 return result;
187 }
static G4double squareTotalEnergyInCM(Particle const *const p1, Particle const *const p2)
static const G4double effectiveNucleonMass2

Referenced by G4INCL::BinaryCollisionAvatar::getChannel(), and total().

◆ total()

G4double G4INCL::CrossSections::total ( Particle const *const  p1,
Particle const *const  p2 
)
static

Definition at line 47 of file G4INCLCrossSections.cc.

47 {
48 G4double inelastic = 0.0;
49 if(p1->isNucleon() && p2->isNucleon()) {
50 inelastic = CrossSections::deltaProduction(p1, p2);
51 } else if((p1->isNucleon() && p2->isDelta()) ||
52 (p1->isDelta() && p2->isNucleon())) {
53 inelastic = CrossSections::recombination(p1, p2);
54 } else if((p1->isNucleon() && p2->isPion()) ||
55 (p1->isPion() && p2->isNucleon())) {
56 inelastic = CrossSections::pionNucleon(p1, p2);
57 } else {
58 inelastic = 0.0;
59 }
60
61 return inelastic + CrossSections::elastic(p1, p2);
62 }
static G4double elastic(Particle const *const p1, Particle const *const p2)
static G4double recombination(Particle const *const p1, Particle const *const p2)
static G4double pionNucleon(Particle const *const p1, Particle const *const p2)

Referenced by G4INCL::StandardPropagationModel::generateBinaryCollisionAvatar(), interactionDistanceNN(), interactionDistancePiN(), and G4INCL::InteractionAvatar::preInteractionBlocking().


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