35#define INCLXX_IN_GEANT4_MODE 1
74 if(x>10000.)
return 0.0;
82 }
else if(particle2->
isPion()) {
93 G4double q2=(y-1076.0*1076.0)*(y-800.0*800.0)/y/4.0;
97 G4double q3 = std::pow(std::sqrt(q2),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);
102 spnResult = spnResult*f3*cg/6.0;
104 if(x < 1200.0 && spnResult < 5.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;
116 ERROR(
"Unknown configuration!" << std::endl);
126 return -2.33730e-06*std::pow(x, 3)+1.13819e-02*std::pow(x,2)
127 -1.83993e+01*x+9893.4;
128 }
else if(x > 1750.0 && x <= 2175.0) {
129 return 1.13531e-06*std::pow(x, 3)-6.91694e-03*std::pow(x, 2)
130 +1.39907e+01*x-9360.76;
132 return -3.18087*std::log(x)+52.9784;
139 return 0.00120683*(x-1372.52)*(x-1372.52)+26.2058;
140 }
else if(x > 1475.0 && x <= 1565.0) {
141 return 1.15873e-05*x*x+49965.6/((x-1519.59)*(x-1519.59)+2372.55);
142 }
else if(x > 1565.0 && x <= 2400.0) {
143 return 34.0248+43262.2/((x-1681.65)*(x-1681.65)+1689.35);
144 }
else if(x > 2400.0 && x <= 7500.0) {
145 return 3.3e-7*(x-7500.0)*(x-7500.0)+24.5;
153 if(isospin==4 || isospin==-4)
return 0.0;
167 if(Ecm <= 938.3 + deltaMass) {
171 if(Ecm < 938.3 + deltaMass + 2.0) {
172 Ecm = 938.3 + deltaMass + 2.0;
184 result *= 3.*(32.0 + isospin * isospin * (deltaIsospin * deltaIsospin - 5))/64.0;
185 result /= 1.0 + 0.25 * isospin * isospin;
205 const G4double momentumGeV = 0.001 * pLab;
210 if(isospin==2 || isospin==-2) {
212 xs = (41.0 + (60.0*momentumGeV - 54.0)*std::exp(-1.2*momentumGeV) - 77.0/(momentumGeV + 1.5));
213 }
else if(pLab >= 1500.0 && pLab < 2000.0) {
214 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));
215 }
else if(pLab < 1500.0) {
216 xs = (23.5 + 24.6/(1.0 + std::exp(-10.0*momentumGeV + 12.0))
217 -1250.0/(momentumGeV +50.0)+4.0*std::pow(momentumGeV - 1.3,2));
219 }
else if(isospin==0) {
221 xs = (42.0 - 77.0/(momentumGeV + 1.5));
222 }
else if(pLab >= 1000.0 && pLab < 2000.0) {
223 xs = (24.2 + 8.9*momentumGeV - 31.1/std::sqrt(momentumGeV));
224 }
else if(pLab < 1000.0) {
225 xs = (33.0 + 196.0*std::sqrt(std::pow(std::abs(momentumGeV - 0.95),5))
226 -31.1/std::sqrt(momentumGeV));
230 if(xs < 0.0)
return 0.0;
235 return 77.0/(momentum + 1.5);
239 if(momentum < 0.450) {
240 const G4double alp = std::log(momentum);
241 return 6.3555*std::exp(-3.2481*alp-0.377*alp*alp);
242 }
else if(momentum >= 0.450 && momentum < 0.8) {
243 return (33.0 + 196.0 * std::sqrt(std::pow(std::abs(momentum - 0.95), 5)));
244 }
else if(momentum > 2.0) {
245 return CrossSections::elasticNNHighEnergy(momentum);
247 return 31.0/std::sqrt(momentum);
251 G4double CrossSections::elasticProtonProtonOrNeutronNeutron(
const G4double momentum)
253 if(momentum < 0.440) {
254 return 34.0*std::pow(momentum/0.4, -2.104);
255 }
else if(momentum < 0.8 && momentum >= 0.440) {
256 return (23.5 + 1000.0*std::pow(momentum-0.7, 4));
257 }
else if(momentum < 2.0) {
258 return (1250.0/(50.0 + momentum) - 4.0*std::pow(momentum-1.3, 2));
260 return CrossSections::elasticNNHighEnergy(momentum);
264 G4double CrossSections::elasticNN(Particle
const *
const p1, Particle
const *
const p2) {
267 if((p1->getType() ==
Proton && p2->getType() ==
Proton) ||
269 return CrossSections::elasticProtonProtonOrNeutronNeutron(momentum);
270 }
else if((p1->getType() ==
Proton && p2->getType() ==
Neutron) ||
272 return CrossSections::elasticProtonNeutron(momentum);
274 ERROR(
"G4INCL::CrossSections::elasticNN: Bad input!" << std::endl
275 << p1->print() << p2->print() << std::endl);
280 G4double CrossSections::elasticNNLegacy(Particle
const *
const part1, Particle
const *
const part2) {
299 if(plab > 2000.)
goto sel13;
300 if(part1->isNucleon() && part2->isNucleon())
304 sel1:
if (i == 0)
goto sel2;
305 sel3:
if (plab < 800.)
goto sel4;
306 if (plab > 2000.)
goto sel13;
307 sel=(1250./(50.+p1)-4.*std::pow(p1-1.3, 2))*scale;
310 sel4:
if (plab < 440.) {
311 sel=34.*std::pow(p1/0.4, (-2.104))*scale;
313 sel=(23.5+1000.*std::pow(p1-0.7, 4))*scale;
317 sel13: sel=77./(p1+1.5)*scale;
320 sel2:
if (plab < 800.)
goto sel11;
321 if (plab > 2000.)
goto sel13;
322 sel=31./std::sqrt(p1)*scale;
325 sel11:
if (plab < 450.) {
327 sel=6.3555*std::exp(-3.2481*alp-0.377*alp*alp)*scale;
329 sel=(33.+196.*std::sqrt(std::pow(std::abs(p1-0.95),5)))*scale;
338 return elasticNNLegacy(p1, p2);
348 return 5.5e-6 * x/(7.7 + x);
350 return (5.34 + 0.67*(x - 2.0)) * 1.0e-6;
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;
359 return (3.68 + 0.76*x) * 1.0e-6;
370 protonProjectile.
setEnergy(protonProjectile.
getMass()+projectileKineticEnergy);
373 neutronProjectile.
setEnergy(neutronProjectile.
getMass()+projectileKineticEnergy);
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);
387 const G4double largestSigma = std::max(sigmapp, std::max(sigmapn, std::max(sigmanp,sigmann)));
390 return interactionDistance;
398 piPlusProjectile.
setEnergy(piPlusProjectile.
getMass()+projectileKineticEnergy);
401 piZeroProjectile.
setEnergy(piZeroProjectile.
getMass()+projectileKineticEnergy);
404 piMinusProjectile.
setEnergy(piMinusProjectile.
getMass()+projectileKineticEnergy);
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);
420 const G4double largestSigma = std::max(sigmapipp, std::max(sigmapipn, std::max(sigmapi0p, std::max(sigmapi0n, std::max(sigmapimp,sigmapimn)))));
423 return interactionDistance;
static G4double elastic(Particle const *const p1, Particle const *const p2)
static G4double interactionDistancePiN(const G4double projectileKineticEnergy)
Compute the "interaction distance".
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 recombination(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 interactionDistanceNN(const G4double projectileKineticEnergy)
Compute the "interaction distance".
static G4double squareTotalEnergyInCM(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 const G4double effectiveNucleonMass2
static G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
static const G4double effectiveNucleonMass
static const G4double effectivePionMass
const ThreeVector & adjustMomentumFromEnergy()
Rescale the momentum to match the total energy.
G4bool isPion() const
Is this a pion?
G4INCL::ParticleType getType() const
void setEnergy(G4double energy)
G4double getMass() const
Get the cached particle mass.
G4bool isDelta() const
Is it a Delta?