#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 () |
Definition at line 45 of file G4INCLCrossSections.hh.
G4INCL::CrossSections::CrossSections | ( | ) | [inline, protected] |
G4INCL::CrossSections::~CrossSections | ( | ) | [inline, protected] |
G4double G4INCL::CrossSections::calculateNNDiffCrossSection | ( | G4double | energyCM, | |
G4int | iso | |||
) | [static] |
Calculate the slope of the NN DDXS.
energyCM | energy in the CM frame, in MeV | |
iso | total isospin of the system |
Definition at line 341 of file G4INCLCrossSections.cc.
Referenced by G4INCL::ElasticChannel::getFinalState().
00341 { 00342 G4double x = 0.001 * pl; // Change to GeV 00343 if(iso != 0) { 00344 if(pl <= 2000.0) { 00345 x = std::pow(x, 8); 00346 return 5.5e-6 * x/(7.7 + x); 00347 } else { 00348 return (5.34 + 0.67*(x - 2.0)) * 1.0e-6; 00349 } 00350 } else { 00351 if(pl < 800.0) { 00352 G4double b = (7.16 - 1.63*x) * 1.0e-6; 00353 return b/(1.0 + std::exp(-(x - 0.45)/0.05)); 00354 } else if(pl < 1100.0) { 00355 return (9.87 - 4.88 * x) * 1.0e-6; 00356 } else { 00357 return (3.68 + 0.76*x) * 1.0e-6; 00358 } 00359 } 00360 return 0.0; // Should never reach this point 00361 }
G4double G4INCL::CrossSections::deltaProduction | ( | Particle const *const | p1, | |
Particle const *const | p2 | |||
) | [static] |
Definition at line 187 of file G4INCLCrossSections.cc.
References G4INCL::ParticleTable::effectiveNucleonMass, G4INCL::ParticleTable::effectivePionMass, G4INCL::ParticleTable::getIsospin(), G4INCL::Particle::getType(), G4INCL::KinematicsUtils::momentumInLab(), and G4INCL::KinematicsUtils::totalEnergyInCM().
Referenced by G4INCL::BinaryCollisionAvatar::getChannel(), recombination(), and total().
00187 { 00188 // assert(p1->isNucleon() && p2->isNucleon()); 00189 const G4double sqrts = KinematicsUtils::totalEnergyInCM(p1,p2); 00190 if(sqrts < ParticleTable::effectivePionMass + 2*ParticleTable::effectiveNucleonMass + 50.) { // approximately yields INCL4.6's hard-coded threshold in collis, 2065 MeV 00191 return 0.0; 00192 } else { 00193 const G4double pLab = KinematicsUtils::momentumInLab(p1,p2); 00194 const G4int isospin = ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType()); 00195 return deltaProduction(isospin, pLab); 00196 } 00197 }
G4double G4INCL::CrossSections::elastic | ( | Particle const *const | p1, | |
Particle const *const | p2 | |||
) | [static] |
Definition at line 333 of file G4INCLCrossSections.cc.
References G4INCL::Particle::isPion().
Referenced by G4INCL::BinaryCollisionAvatar::getChannel(), and total().
00333 { 00334 if(!p1->isPion() && !p2->isPion()) 00335 // return elasticNN(p1, p2); // New implementation 00336 return elasticNNLegacy(p1, p2); // Translated from INCL4.6 FORTRAN 00337 else 00338 return 0.0; // No pion-nucleon elastic scattering 00339 }
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.
Definition at line 363 of file G4INCLCrossSections.cc.
References G4INCL::Particle::adjustMomentumFromEnergy(), G4INCL::Particle::getMass(), G4INCL::Neutron, G4INCL::Proton, G4INCL::Particle::setEnergy(), G4INCL::Math::tenPi, and total().
Referenced by interactionDistanceNN1GeV().
00363 { 00364 ThreeVector nullVector; 00365 ThreeVector unitVector(0., 0., 1.); 00366 00367 Particle protonProjectile(Proton, unitVector, nullVector); 00368 protonProjectile.setEnergy(protonProjectile.getMass()+projectileKineticEnergy); 00369 protonProjectile.adjustMomentumFromEnergy(); 00370 Particle neutronProjectile(Neutron, unitVector, nullVector); 00371 neutronProjectile.setEnergy(neutronProjectile.getMass()+projectileKineticEnergy); 00372 neutronProjectile.adjustMomentumFromEnergy(); 00373 00374 Particle protonTarget(Proton, nullVector, nullVector); 00375 Particle neutronTarget(Neutron, nullVector, nullVector); 00376 const G4double sigmapp = total(&protonProjectile, &protonTarget); 00377 const G4double sigmapn = total(&protonProjectile, &neutronTarget); 00378 const G4double sigmanp = total(&neutronProjectile, &protonTarget); 00379 const G4double sigmann = total(&neutronProjectile, &neutronTarget); 00380 /* We compute the interaction distance from the largest of the NN cross 00381 * sections. Note that this is different from INCL4.6, which just takes the 00382 * average of the four, and will in general lead to a different geometrical 00383 * cross section. 00384 */ 00385 const G4double largestSigma = std::max(sigmapp, std::max(sigmapn, std::max(sigmanp,sigmann))); 00386 const G4double interactionDistance = std::sqrt(largestSigma/Math::tenPi); 00387 00388 return interactionDistance; 00389 }
static G4double G4INCL::CrossSections::interactionDistanceNN1GeV | ( | ) | [inline, static] |
The interaction distance for nucleons at 1 GeV.
Used to determine the universe radius at any energy.
Definition at line 85 of file G4INCLCrossSections.hh.
References interactionDistanceNN().
00085 { 00086 static G4double answer = CrossSections::interactionDistanceNN(1000.); 00087 return answer; 00088 }
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.
Definition at line 391 of file G4INCLCrossSections.cc.
References G4INCL::Particle::adjustMomentumFromEnergy(), G4INCL::Particle::getMass(), G4INCL::Neutron, G4INCL::PiMinus, G4INCL::PiPlus, G4INCL::PiZero, G4INCL::Proton, G4INCL::Particle::setEnergy(), G4INCL::Math::tenPi, and total().
Referenced by interactionDistancePiN1GeV().
00391 { 00392 ThreeVector nullVector; 00393 ThreeVector unitVector(0., 0., 1.); 00394 00395 Particle piPlusProjectile(PiPlus, unitVector, nullVector); 00396 piPlusProjectile.setEnergy(piPlusProjectile.getMass()+projectileKineticEnergy); 00397 piPlusProjectile.adjustMomentumFromEnergy(); 00398 Particle piZeroProjectile(PiZero, unitVector, nullVector); 00399 piZeroProjectile.setEnergy(piZeroProjectile.getMass()+projectileKineticEnergy); 00400 piZeroProjectile.adjustMomentumFromEnergy(); 00401 Particle piMinusProjectile(PiMinus, unitVector, nullVector); 00402 piMinusProjectile.setEnergy(piMinusProjectile.getMass()+projectileKineticEnergy); 00403 piMinusProjectile.adjustMomentumFromEnergy(); 00404 00405 Particle protonTarget(Proton, nullVector, nullVector); 00406 Particle neutronTarget(Neutron, nullVector, nullVector); 00407 const G4double sigmapipp = total(&piPlusProjectile, &protonTarget); 00408 const G4double sigmapipn = total(&piPlusProjectile, &neutronTarget); 00409 const G4double sigmapi0p = total(&piZeroProjectile, &protonTarget); 00410 const G4double sigmapi0n = total(&piZeroProjectile, &neutronTarget); 00411 const G4double sigmapimp = total(&piMinusProjectile, &protonTarget); 00412 const G4double sigmapimn = total(&piMinusProjectile, &neutronTarget); 00413 /* We compute the interaction distance from the largest of the pi-N cross 00414 * sections. Note that this is different from INCL4.6, which just takes the 00415 * average of the six, and will in general lead to a different geometrical 00416 * cross section. 00417 */ 00418 const G4double largestSigma = std::max(sigmapipp, std::max(sigmapipn, std::max(sigmapi0p, std::max(sigmapi0n, std::max(sigmapimp,sigmapimn))))); 00419 const G4double interactionDistance = std::sqrt(largestSigma/Math::tenPi); 00420 00421 return interactionDistance; 00422 }
static G4double G4INCL::CrossSections::interactionDistancePiN1GeV | ( | ) | [inline, static] |
The interaction distance for pions at 1 GeV.
Used to determine the universe radius at any energy.
Definition at line 94 of file G4INCLCrossSections.hh.
References interactionDistancePiN().
00094 { 00095 static G4double answer = CrossSections::interactionDistancePiN(1000.); 00096 return answer; 00097 }
G4double G4INCL::CrossSections::pionNucleon | ( | Particle const *const | p1, | |
Particle const *const | p2 | |||
) | [static] |
Definition at line 62 of file G4INCLCrossSections.cc.
References ERROR, G4INCL::ParticleTable::getIsospin(), G4INCL::Particle::getType(), G4INCL::Particle::isNucleon(), G4INCL::Particle::isPion(), and G4INCL::KinematicsUtils::totalEnergyInCM().
Referenced by total().
00062 { 00063 // FUNCTION SPN(X,IND2T3,IPIT3,f17) 00064 // SIGMA(PI+ + P) IN THE (3,3) REGION 00065 // NEW FIT BY J.VANDERMEULEN + FIT BY Th AOUST ABOVE (3,3) RES 00066 // CONST AT LOW AND VERY HIGH ENERGY 00067 // COMMON/BL8/RATHR,RAMASS REL21800 00068 // integer f17 00069 // RATHR and RAMASS are always 0.0!!! 00070 00071 G4double x = KinematicsUtils::totalEnergyInCM(particle1, particle2); 00072 if(x>10000.) return 0.0; // no cross section above this value 00073 00074 G4int ipit3 = 0; 00075 G4int ind2t3 = 0; 00076 G4double ramass = 0.0; 00077 00078 if(particle1->isPion()) { 00079 ipit3 = ParticleTable::getIsospin(particle1->getType()); 00080 } else if(particle2->isPion()) { 00081 ipit3 = ParticleTable::getIsospin(particle2->getType()); 00082 } 00083 00084 if(particle1->isNucleon()) { 00085 ind2t3 = ParticleTable::getIsospin(particle1->getType()); 00086 } else if(particle2->isNucleon()) { 00087 ind2t3 = ParticleTable::getIsospin(particle2->getType()); 00088 } 00089 00090 G4double y=x*x; 00091 G4double q2=(y-1076.0*1076.0)*(y-800.0*800.0)/y/4.0; 00092 if (q2 <= 0.) { 00093 return 0.0; 00094 } 00095 G4double q3 = std::pow(std::sqrt(q2),3); 00096 G4double f3 = q3/(q3 + 5832000.); // 5832000 = 180^3 00097 G4double spnResult = 326.5/(std::pow((x-1215.0-ramass)*2.0/(110.0-ramass), 2)+1.0); 00098 spnResult = spnResult*(1.0-5.0*ramass/1215.0); 00099 G4double cg = 4.0 + G4double(ind2t3)*G4double(ipit3); 00100 spnResult = spnResult*f3*cg/6.0; 00101 00102 if(x < 1200.0 && spnResult < 5.0) { 00103 spnResult = 5.0; 00104 } 00105 00106 // HE pi+ p and pi- n 00107 if(x > 1290.0) { 00108 if((ind2t3 == 1 && ipit3 == 2) || (ind2t3 == -1 && ipit3 == -2)) 00109 spnResult=CrossSections::spnPiPlusPHE(x); 00110 else if((ind2t3 == 1 && ipit3 == -2) || (ind2t3 == -1 && ipit3 == 2)) 00111 spnResult=CrossSections::spnPiMinusPHE(x); 00112 else if(ipit3 == 0) spnResult = (CrossSections::spnPiPlusPHE(x) + CrossSections::spnPiMinusPHE(x))/2.0; // (spnpipphe(x)+spnpimphe(x))/2.0 00113 else { 00114 ERROR("Unknown configuration!" << std::endl); 00115 } 00116 } 00117 00118 return spnResult; 00119 }
G4double G4INCL::CrossSections::recombination | ( | Particle const *const | p1, | |
Particle const *const | p2 | |||
) | [static] |
Definition at line 149 of file G4INCLCrossSections.cc.
References deltaProduction(), G4INCL::ParticleTable::effectiveNucleonMass, G4INCL::ParticleTable::effectiveNucleonMass2, G4INCL::ParticleTable::getIsospin(), G4INCL::Particle::getMass(), G4INCL::Particle::getType(), G4INCL::Particle::isDelta(), G4INCL::KinematicsUtils::momentumInLab(), and G4INCL::KinematicsUtils::squareTotalEnergyInCM().
Referenced by G4INCL::BinaryCollisionAvatar::getChannel(), and total().
00149 { 00150 const G4int isospin = ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType()); 00151 if(isospin==4 || isospin==-4) return 0.0; 00152 00153 G4double s = KinematicsUtils::squareTotalEnergyInCM(p1, p2); 00154 G4double Ecm = std::sqrt(s); 00155 G4int deltaIsospin; 00156 G4double deltaMass; 00157 if(p1->isDelta()) { 00158 deltaIsospin = ParticleTable::getIsospin(p1->getType()); 00159 deltaMass = p1->getMass(); 00160 } else { 00161 deltaIsospin = ParticleTable::getIsospin(p2->getType()); 00162 deltaMass = p2->getMass(); 00163 } 00164 00165 if(Ecm <= 938.3 + deltaMass) { 00166 return 0.0; 00167 } 00168 00169 if(Ecm < 938.3 + deltaMass + 2.0) { 00170 Ecm = 938.3 + deltaMass + 2.0; 00171 s = Ecm*Ecm; 00172 } 00173 00174 const G4double x = (s - 4.*ParticleTable::effectiveNucleonMass2) / 00175 (s - std::pow(ParticleTable::effectiveNucleonMass + deltaMass, 2)); 00176 const G4double y = s/(s - std::pow(deltaMass - ParticleTable::effectiveNucleonMass, 2)); 00177 /* Concerning the way we calculate the lab momentum, see the considerations 00178 * in CrossSections::elasticNNLegacy(). 00179 */ 00180 const G4double pLab = KinematicsUtils::momentumInLab(s, ParticleTable::effectiveNucleonMass, ParticleTable::effectiveNucleonMass); 00181 G4double result = 0.5 * x * y * deltaProduction(isospin, pLab); 00182 result *= 3.*(32.0 + isospin * isospin * (deltaIsospin * deltaIsospin - 5))/64.0; 00183 result /= 1.0 + 0.25 * isospin * isospin; 00184 return result; 00185 }
G4double G4INCL::CrossSections::total | ( | Particle const *const | p1, | |
Particle const *const | p2 | |||
) | [static] |
Definition at line 45 of file G4INCLCrossSections.cc.
References deltaProduction(), elastic(), G4INCL::Particle::isDelta(), G4INCL::Particle::isNucleon(), G4INCL::Particle::isPion(), pionNucleon(), and recombination().
Referenced by G4INCL::StandardPropagationModel::generateBinaryCollisionAvatar(), interactionDistanceNN(), interactionDistancePiN(), and G4INCL::InteractionAvatar::preInteractionBlocking().
00045 { 00046 G4double inelastic = 0.0; 00047 if(p1->isNucleon() && p2->isNucleon()) { 00048 inelastic = CrossSections::deltaProduction(p1, p2); 00049 } else if((p1->isNucleon() && p2->isDelta()) || 00050 (p1->isDelta() && p2->isNucleon())) { 00051 inelastic = CrossSections::recombination(p1, p2); 00052 } else if((p1->isNucleon() && p2->isPion()) || 00053 (p1->isPion() && p2->isNucleon())) { 00054 inelastic = CrossSections::pionNucleon(p1, p2); 00055 } else { 00056 inelastic = 0.0; 00057 } 00058 00059 return inelastic + CrossSections::elastic(p1, p2); 00060 }