Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4INCLCrossSectionsMultiPionsAndResonances.cc
Go to the documentation of this file.
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 // INCL++ intra-nuclear cascade model
27 // Alain Boudard, CEA-Saclay, France
28 // Joseph Cugnon, University of Liege, Belgium
29 // Jean-Christophe David, CEA-Saclay, France
30 // Pekka Kaitaniemi, CEA-Saclay, France, and Helsinki Institute of Physics, Finland
31 // Sylvie Leray, CEA-Saclay, France
32 // Davide Mancusi, CEA-Saclay, France
33 //
34 #define INCLXX_IN_GEANT4_MODE 1
35 
36 #include "globals.hh"
37 
46 #include "G4INCLKinematicsUtils.hh"
47 #include "G4INCLParticleTable.hh"
48 // #include <cassert>
49 
50 namespace G4INCL {
51 
52  template<G4int N>
53  struct BystrickyEvaluator {
54  static G4double eval(const G4double pLab, const G4double oneOverThreshold, HornerCoefficients<N> const &coeffs) {
55  const G4double pMeV = pLab*1E3;
57  const G4double xrat=ekin*oneOverThreshold;
58  const G4double x=std::log(xrat);
59  return HornerEvaluator<N>::eval(x, coeffs) * x * std::exp(-0.5*x);
60  }
61  };
62 
65 
66  const G4double CrossSectionsMultiPionsAndResonances::s11pzOOT = 0.0035761542037692665889;
67  const G4double CrossSectionsMultiPionsAndResonances::s01ppOOT = 0.003421025623481919853;
68  const G4double CrossSectionsMultiPionsAndResonances::s01pzOOT = 0.0035739814152966403123;
69  const G4double CrossSectionsMultiPionsAndResonances::s11pmOOT = 0.0034855350296270480281;
70  const G4double CrossSectionsMultiPionsAndResonances::s12pmOOT = 0.0016672224074691565119;
71  const G4double CrossSectionsMultiPionsAndResonances::s12ppOOT = 0.0016507643038726931312;
72  const G4double CrossSectionsMultiPionsAndResonances::s12zzOOT = 0.0011111111111111111111;
74  const G4double CrossSectionsMultiPionsAndResonances::s02pmOOT = 0.0016661112962345883443;
75  const G4double CrossSectionsMultiPionsAndResonances::s12mzOOT = 0.0017047391749062392793;
76 
78  s11pzHC(-2.228000000000294018,8.7560000000005723725,-0.61000000000023239325,-5.4139999999999780324,3.3338333333333348023,-0.75835000000000022049,0.060623611111111114688),
79  s01ppHC(2.0570000000126518344,-6.029000000012135826,36.768500000002462784,-45.275666666666553533,25.112666666666611953,-7.2174166666666639187,1.0478875000000000275,-0.060804365079365080846),
80  s01pzHC(0.18030000000000441851,7.8700999999999953598,-4.0548999999999990425,0.555199999999999959),
81  s11pmHC(0.20590000000000031866,3.3450999999999993936,-1.4401999999999997825,0.17076666666666664973),
82  s12pmHC(-0.77235999999999901328,4.2626599999999991117,-1.9008899999999997323,0.30192266666666663379,-0.012270833333333331986),
83  s12ppHC(-0.75724999999999975664,2.0934399999999998565,-0.3803099999999999814),
84  s12zzHC(-0.89599999999996965072,7.882999999999978632,-7.1049999999999961928,1.884333333333333089),
85  s02pzHC(-1.0579999999999967036,11.113999999999994089,-8.5259999999999990196,2.0051666666666666525),
86  s02pmHC(2.4009000000012553286,-7.7680000000013376183,20.619000000000433505,-16.429666666666723928,5.2525708333333363472,-0.58969166666666670206),
87  s12mzHC(-0.21858699999999976269,1.9148999999999999722,-0.31727500000000001065,-0.027695000000000000486)
88  {
89  }
90 
92  G4double inelastic;
93  if(p1->isNucleon() && p2->isNucleon()) {
94  return CrossSectionsMultiPions::NNTot(p1, p2);
95  } else if((p1->isNucleon() && p2->isDelta()) ||
96  (p1->isDelta() && p2->isNucleon())) {
97  inelastic = CrossSectionsMultiPions::NDeltaToNN(p1, p2);
98  } else if((p1->isNucleon() && p2->isPion()) ||
99  (p1->isPion() && p2->isNucleon())) {
100  return CrossSectionsMultiPions::piNTot(p1,p2);
101  } else if((p1->isNucleon() && p2->isEta()) ||
102  (p1->isEta() && p2->isNucleon())) {
103  inelastic = etaNToPiN(p1,p2) + etaNToPiPiN(p1,p2);
104  } else if((p1->isNucleon() && p2->isOmega()) ||
105  (p1->isOmega() && p2->isNucleon())) {
106  inelastic = omegaNInelastic(p1,p2);
107  } else if((p1->isNucleon() && p2->isEtaPrime()) ||
108  (p1->isEtaPrime() && p2->isNucleon())) {
109  inelastic = etaPrimeNToPiN(p1,p2);
110  } else {
111  inelastic = 0.;
112  }
113 
114  return inelastic + elastic(p1, p2);
115  }
116 
117 
119  if((p1->isNucleon()||p1->isDelta()) && (p2->isNucleon()||p2->isDelta())){
120  return CrossSectionsMultiPions::elastic(p1, p2);
121  }
122  else if ((p1->isNucleon() && p2->isPion()) || (p2->isNucleon() && p1->isPion())){
123  return CrossSectionsMultiPions::elastic(p1, p2);
124  }
125  else if ((p1->isNucleon() && p2->isEta()) || (p2->isNucleon() && p1->isEta())){
126  return etaNElastic(p1, p2);
127  }
128  else if ((p1->isNucleon() && p2->isOmega()) || (p2->isNucleon() && p1->isOmega())){
129  return omegaNElastic(p1, p2);
130  }
131  else {
132  return 0.0;
133  }
134  }
135 
136 
137  G4double CrossSectionsMultiPionsAndResonances::piNToxPiN(const G4int xpi, Particle const * const particle1, Particle const * const particle2) {
138  //
139  // pion-Nucleon producing xpi pions cross sections (corrected due to eta and omega)
140  //
141 // assert(xpi>1 && xpi<=nMaxPiPiN);
142 // assert((particle1->isNucleon() && particle2->isPion()) || (particle1->isPion() && particle2->isNucleon()));
143 
144  const G4double oldXS2Pi=CrossSectionsMultiPions::piNToxPiN(2,particle1, particle2);
145  const G4double oldXS3Pi=CrossSectionsMultiPions::piNToxPiN(3,particle1, particle2);
146  const G4double oldXS4Pi=CrossSectionsMultiPions::piNToxPiN(4,particle1, particle2);
147  const G4double xsEta=piNToEtaN(particle1, particle2);
148  const G4double xsOmega=piNToOmegaN(particle1, particle2);
149  G4double newXS2Pi=0.;
150  G4double newXS3Pi=0.;
151  G4double newXS4Pi=0.;
152 
153  if (xpi == 2) {
154  if (oldXS4Pi != 0.)
155  newXS2Pi=oldXS2Pi;
156  else if (oldXS3Pi != 0.) {
157  newXS3Pi=oldXS3Pi-xsEta-xsOmega;
158  if (newXS3Pi < 1.e-09)
159  newXS2Pi=oldXS2Pi-(xsEta+xsOmega-oldXS3Pi);
160  else
161  newXS2Pi=oldXS2Pi;
162  }
163  else {
164  newXS2Pi=oldXS2Pi-xsEta-xsOmega;
165  if (newXS2Pi < 1.e-09)
166  newXS2Pi=0.;
167  }
168  return newXS2Pi;
169  }
170  else if (xpi == 3) {
171  if (oldXS4Pi != 0.) {
172  newXS4Pi=oldXS4Pi-xsEta-xsOmega;
173  if (newXS4Pi < 1.e-09)
174  newXS3Pi=oldXS3Pi-(xsEta+xsOmega-oldXS4Pi);
175  else
176  newXS3Pi=oldXS3Pi;
177  }
178  else {
179  newXS3Pi=oldXS3Pi-xsEta-xsOmega;
180  if (newXS3Pi < 1.e-09)
181  newXS3Pi=0.;
182  }
183  return newXS3Pi;
184  }
185  else if (xpi == 4) {
186  newXS4Pi=oldXS4Pi-xsEta-xsOmega;
187  if (newXS4Pi < 1.e-09)
188  newXS4Pi=0.;
189  return newXS4Pi;
190  }
191  else // should never reach this point
192  return 0.;
193  }
194 
195  G4double CrossSectionsMultiPionsAndResonances::piNToEtaN(Particle const * const particle1, Particle const * const particle2) {
196  //
197  // Pion-Nucleon producing Eta cross sections
198  //
199 // assert((particle1->isNucleon() && particle2->isPion()) || (particle1->isPion() && particle2->isNucleon()));
200 
201  G4double sigma;
202  sigma=piMinuspToEtaN(particle1,particle2);
203 
204  const G4int isoin = ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
205 
206  if (isoin == -1) {
207  if ((particle1->getType()) == Proton || (particle2->getType()) == Proton) return sigma;
208  else return 0.5 * sigma;
209  }
210  else if (isoin == 1) {
211  if ((particle1->getType()) == Neutron || (particle2->getType()) == Neutron) return sigma;
212  else return 0.5 * sigma;
213  }
214  else return 0. ; // should never return 0. (?)
215 
216 // return sigma;
217  }
218 
219  G4double CrossSectionsMultiPionsAndResonances::piNToOmegaN(Particle const * const particle1, Particle const * const particle2) {
220  //
221  // Pion-Nucleon producing Omega cross sections
222  //
223 // assert((particle1->isNucleon() && particle2->isPion()) || (particle1->isPion() && particle2->isNucleon()));
224 
225  G4double sigma;
226  sigma=piMinuspToOmegaN(particle1,particle2);
227 
228  const G4int isoin = ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
229 
230  if (isoin == -1) {
231  if ((particle1->getType()) == Proton || (particle2->getType()) == Proton) return sigma;
232  else return 0.5 * sigma;
233  }
234  else if (isoin == 1) {
235  if ((particle1->getType()) == Neutron || (particle2->getType()) == Neutron) return sigma;
236  else return 0.5 * sigma;
237  }
238  else return 0. ; // should never return 0. (?)
239 
240 // return sigma;
241  }
242 
243 #if defined(NDEBUG) || defined(INCLXX_IN_GEANT4_MODE)
244  G4double CrossSectionsMultiPionsAndResonances::piNToEtaPrimeN(Particle const * const /*particle1*/, Particle const * const /*particle2*/) {
245 #else
246  G4double CrossSectionsMultiPionsAndResonances::piNToEtaPrimeN(Particle const * const particle1, Particle const * const particle2) {
247 #endif
248  //
249  // Pion-Nucleon producing EtaPrime cross sections
250  //
251 // assert((particle1->isNucleon() && particle2->isPion()) || (particle1->isPion() && particle2->isNucleon()));
252 
253  return 0.;
254  }
255 
256 G4double CrossSectionsMultiPionsAndResonances::etaNToPiN(Particle const * const particle1, Particle const * const particle2) {
257  //
258  // Eta-Nucleon producing Pion cross sections
259  //
260 // assert((particle1->isNucleon() && particle2->isEta()) || (particle1->isEta() && particle2->isNucleon()));
261 
262  const Particle *eta;
263  const Particle *nucleon;
264 
265  if (particle1->isEta()) {
266  eta = particle1;
267  nucleon = particle2;
268  }
269  else {
270  eta = particle2;
271  nucleon = particle1;
272  }
273 
274  const G4double pLab = KinematicsUtils::momentumInLab(eta, nucleon);
275  G4double sigma=0.;
276 
277  if (pLab <= 574.)
278  sigma= 1.511147E-13*std::pow(pLab,6)- 3.603636E-10*std::pow(pLab,5)+ 3.443487E-07*std::pow(pLab,4)- 1.681980E-04*std::pow(pLab,3)+ 4.437913E-02*std::pow(pLab,2)- 6.172108E+00*pLab+ 4.031449E+02;
279  else if (pLab <= 850.)
280  sigma= -8.00018E-14*std::pow(pLab,6)+ 3.50041E-10*std::pow(pLab,5)- 6.33891E-07*std::pow(pLab,4)+ 6.07658E-04*std::pow(pLab,3)- 3.24936E-01*std::pow(pLab,2)+ 9.18098E+01*pLab- 1.06943E+04;
281  else if (pLab <= 1300.)
282  sigma= 6.56364E-09*std::pow(pLab,3)- 2.07653E-05*std::pow(pLab,2)+ 1.84148E-02*pLab- 1.70427E+00;
283  else {
284  G4double ECM=KinematicsUtils::totalEnergyInCM(eta, nucleon);
288  G4double masseta;
289  G4double massnucleon;
290  G4double pCM_eta;
291  masseta=eta->getMass();
292  massnucleon=nucleon->getMass();
293  pCM_eta=KinematicsUtils::momentumInCM(ECM, masseta, massnucleon);
294  G4double pCM_PiZero=KinematicsUtils::momentumInCM(ECM, massPiZero, massProton);
295  G4double pCM_PiMinus=KinematicsUtils::momentumInCM(ECM, massPiMinus, massProton); // = pCM_PiPlus (because massPiMinus = massPiPlus)
296  sigma = (piMinuspToEtaN(ECM)/2.) * std::pow((pCM_PiZero/pCM_eta), 2) + piMinuspToEtaN(ECM) * std::pow((pCM_PiMinus/pCM_eta), 2);
297  }
298  if (sigma < 0.) sigma=0.;
299  return sigma;
300 }
301 
302  G4double CrossSectionsMultiPionsAndResonances::etaNToPiPiN(Particle const * const particle1, Particle const * const particle2) {
303  //
304  // Eta-Nucleon producing Two Pions cross sections
305  //
306 // assert((particle1->isNucleon() && particle2->isEta()) || (particle1->isEta() && particle2->isNucleon()));
307 
308  G4double sigma=0.;
309 
310  const Particle *eta;
311  const Particle *nucleon;
312 
313  if (particle1->isEta()) {
314  eta = particle1;
315  nucleon = particle2;
316  }
317  else {
318  eta = particle2;
319  nucleon = particle1;
320  }
321 
322  const G4double pLab = KinematicsUtils::momentumInLab(eta, nucleon);
323 
324  if (pLab < 450.)
325  sigma = 2.01854221E-13*std::pow(pLab,6) - 3.49750459E-10*std::pow(pLab,5) + 2.46011585E-07*std::pow(pLab,4) - 9.01422901E-05*std::pow(pLab,3) + 1.83382964E-02*std::pow(pLab,2) - 2.03113098E+00*pLab + 1.10358550E+02;
326  else if (pLab < 600.)
327  sigma = 2.01854221E-13*std::pow(450.,6) - 3.49750459E-10*std::pow(450.,5) + 2.46011585E-07*std::pow(450.,4) - 9.01422901E-05*std::pow(450.,3) + 1.83382964E-02*std::pow(450.,2) - 2.03113098E+00*450. + 1.10358550E+02;
328  else if (pLab <= 1300.)
329  sigma = -6.32793049e-16*std::pow(pLab,6) + 3.95985900e-12*std::pow(pLab,5) - 1.01727714e-8*std::pow(pLab,4) +
330  1.37055547e-05*std::pow(pLab,3) - 1.01830486e-02*std::pow(pLab,2) + 3.93492126*pLab - 609.447145;
331  else
332  sigma = etaNToPiN(particle1,particle2);
333 
334  if (sigma < 0.) sigma = 0.;
335  return sigma; // Parameterization from the ANL-Osaka DCC model [PRC88(2013)035209] - eta p --> "pi+pi0 n" + "pi0 pi0 p" total XS
336  }
337 
338 
339  G4double CrossSectionsMultiPionsAndResonances::etaNElastic(Particle const * const particle1, Particle const * const particle2) {
340  //
341  // Eta-Nucleon elastic cross sections
342  //
343 // assert((particle1->isNucleon() && particle2->isEta()) || (particle1->isEta() && particle2->isNucleon()));
344 
345  G4double sigma=0.;
346 
347  const Particle *eta;
348  const Particle *nucleon;
349 
350  if (particle1->isEta()) {
351  eta = particle1;
352  nucleon = particle2;
353  }
354  else {
355  eta = particle2;
356  nucleon = particle1;
357  }
358 
359  const G4double pLab = KinematicsUtils::momentumInLab(eta, nucleon);
360 
361  if (pLab < 700.)
362  sigma = 3.6838e-15*std::pow(pLab,6) - 9.7815e-12*std::pow(pLab,5) + 9.7914e-9*std::pow(pLab,4) -
363  4.3222e-06*std::pow(pLab,3) + 7.9188e-04*std::pow(pLab,2) - 1.8379e-01*pLab + 84.965;
364  else if (pLab < 1400.)
365  sigma = 3.562630e-16*std::pow(pLab,6) - 2.384766e-12*std::pow(pLab,5) + 6.601312e-9*std::pow(pLab,4) -
366  9.667078e-06*std::pow(pLab,3) + 7.894845e-03*std::pow(pLab,2) - 3.409200*pLab + 609.8501;
367  else if (pLab < 2025.)
368  sigma = -1.041950E-03*pLab + 2.110529E+00;
369  else
370  sigma=0.;
371 
372  if (sigma < 0.) sigma = 0.;
373  return sigma; // Parameterization from the ANL-Osaka DCC model [PRC88(2013)035209]
374  }
375 
376  G4double CrossSectionsMultiPionsAndResonances::omegaNInelastic(Particle const * const particle1, Particle const * const particle2) {
377  //
378  // Omega-Nucleon inelastic cross sections
379  //
380 // assert((particle1->isNucleon() && particle2->isOmega()) || (particle1->isOmega() && particle2->isNucleon()));
381 
382  G4double sigma=0.;
383 
384  const Particle *omega;
385  const Particle *nucleon;
386 
387  if (particle1->isOmega()) {
388  omega = particle1;
389  nucleon = particle2;
390  }
391  else {
392  omega = particle2;
393  nucleon = particle1;
394  }
395 
396  const G4double pLab = KinematicsUtils::momentumInLab(omega, nucleon)/1000.; // GeV/c
397 
398  sigma = 20. + 4.0/pLab; // Eq.(24) in G.I. Lykasov et al., EPJA 6, 71-81 (1999)
399 
400  return sigma;
401  }
402 
403 
404  G4double CrossSectionsMultiPionsAndResonances::omegaNElastic(Particle const * const particle1, Particle const * const particle2) {
405  //
406  // Omega-Nucleon elastic cross sections
407  //
408 // assert((particle1->isNucleon() && particle2->isOmega()) || (particle1->isOmega() && particle2->isNucleon()));
409 
410  G4double sigma=0.;
411 
412  const Particle *omega;
413  const Particle *nucleon;
414 
415  if (particle1->isOmega()) {
416  omega = particle1;
417  nucleon = particle2;
418  }
419  else {
420  omega = particle2;
421  nucleon = particle1;
422  }
423 
424  const G4double pLab = KinematicsUtils::momentumInLab(omega, nucleon)/1000.; // GeV/c
425 
426  sigma = 5.4 + 10.*std::exp(-0.6*pLab); // Eq.(21) in G.I. Lykasov et al., EPJA 6, 71-81 (1999)
427 
428  return sigma;
429  }
430 
431 
432  G4double CrossSectionsMultiPionsAndResonances::omegaNToPiN(Particle const * const particle1, Particle const * const particle2) {
433  //
434  // Omega-Nucleon producing Pion cross sections
435  //
436 // assert((particle1->isNucleon() && particle2->isOmega()) || (particle1->isOmega() && particle2->isNucleon()));
437 
438  G4double ECM=KinematicsUtils::totalEnergyInCM(particle1, particle2);
439 
443 
444  G4double massomega;
445  G4double massnucleon;
446  G4double pCM_omega;
447  G4double pLab_omega;
448 
449  G4double sigma=0.;
450 
451  if (particle1->isOmega()) {
452  massomega=particle1->getMass();
453  massnucleon=particle2->getMass();
454  }
455  else {
456  massomega=particle2->getMass();
457  massnucleon=particle1->getMass();
458  }
459  pCM_omega=KinematicsUtils::momentumInCM(ECM, massomega, massnucleon);
460  pLab_omega=KinematicsUtils::momentumInLab(ECM*ECM, massomega, massnucleon);
461 
462  G4double pCM_PiZero=KinematicsUtils::momentumInCM(ECM, massPiZero, massProton);
463  G4double pCM_PiMinus=KinematicsUtils::momentumInCM(ECM, massPiMinus, massProton); // = pCM_PiPlus (because massPiMinus = massPiPlus)
464 
465  sigma = (piMinuspToOmegaN(ECM)/2.) * std::pow((pCM_PiZero/pCM_omega), 2)
466  + piMinuspToOmegaN(ECM) * std::pow((pCM_PiMinus/pCM_omega), 2);
467 
468  if (sigma > omegaNInelastic(particle1, particle2) || (pLab_omega < 200.)) {
469 // if (sigma > omegaNInelastic(particle1, particle2)) {
470  sigma = omegaNInelastic(particle1, particle2);
471  }
472 
473  return sigma;
474  }
475 
476 
477  G4double CrossSectionsMultiPionsAndResonances::omegaNToPiPiN(Particle const * const particle1, Particle const * const particle2) {
478  //
479  // Omega-Nucleon producing 2 PionS cross sections
480  //
481 // assert((particle1->isNucleon() && particle2->isOmega()) || (particle1->isOmega() && particle2->isNucleon()));
482 
483  G4double sigma=0.;
484 
485  sigma = omegaNInelastic(particle1,particle2) - omegaNToPiN(particle1,particle2) ;
486 
487  return sigma;
488  }
489 
490 
491 #if defined(NDEBUG) || defined(INCLXX_IN_GEANT4_MODE)
492  G4double CrossSectionsMultiPionsAndResonances::etaPrimeNToPiN(Particle const * const /*particle1*/, Particle const * const /*particle2*/) {
493 #else
494  G4double CrossSectionsMultiPionsAndResonances::etaPrimeNToPiN(Particle const * const particle1, Particle const * const particle2) {
495 #endif
496  //
497  // EtaPrime-Nucleon producing Pion cross sections
498  //
499 // assert((particle1->isNucleon() && particle2->isEtaPrime()) || (particle1->isEtaPrime() && particle2->isNucleon()));
500 
501  return 0.;
502  }
503 
504  G4double CrossSectionsMultiPionsAndResonances::piMinuspToEtaN(Particle const * const particle1, Particle const * const particle2) {
505  //
506  // Pion-Nucleon producing Eta cross sections
507  //
508 // assert((particle1->isNucleon() && particle2->isPion()) || (particle1->isPion() && particle2->isNucleon()));
509 
510  G4double masspion;
511  G4double massnucleon;
512  if (particle1->isPion()) {
513  masspion=particle1->getMass();
514  massnucleon=particle2->getMass();
515  }
516  else {
517  masspion=particle2->getMass();
518  massnucleon=particle1->getMass();
519  }
520 
521  G4double ECM=KinematicsUtils::totalEnergyInCM(particle1, particle2);
522  G4double plab=KinematicsUtils::momentumInLab(ECM*ECM, masspion, massnucleon)/1000.; // GeV/c
523 
524  G4double sigma;
525 
526 // new parameterization (JCD) - end of february 2016
527  if (ECM < 1486.5) sigma=0.;
528  else
529  {
530  if (ECM < 1535.)
531  {
532  sigma = -0.0000003689197974814*std::pow(ECM,4) + 0.002260193900097*std::pow(ECM,3) - 5.193105877187*std::pow(ECM,2) + 5303.505273919*ECM - 2031265.900648;
533  }
534  else if (ECM < 1670.)
535  {
536  sigma = -0.0000000337986446*std::pow(ECM,4) + 0.000218279989*std::pow(ECM,3) - 0.528276144*std::pow(ECM,2) + 567.828367*ECM - 228709.42;
537  }
538  else if (ECM < 1714.)
539  {
540  sigma = 0.000003737765*std::pow(ECM,2) - 0.005664062*ECM;
541  }
542  else sigma=1.47*std::pow(plab, -1.68);
543  }
544 //
545 
546  return sigma;
547  }
548 
550  //
551  // Pion-Nucleon producing Eta cross sections
552  //
553 
554  const G4double masspion = ParticleTable::getRealMass(PiMinus);
555  const G4double massnucleon = ParticleTable::getRealMass(Proton);
556 
557  G4double plab=KinematicsUtils::momentumInLab(ECM*ECM, masspion, massnucleon)/1000.; // GeV/c
558 
559  G4double sigma;
560 
561 // new parameterization (JCD) - end of february 2016
562  if (ECM < 1486.5) sigma=0.;
563  else
564  {
565  if (ECM < 1535.)
566  {
567  sigma = -0.0000003689197974814*std::pow(ECM,4) + 0.002260193900097*std::pow(ECM,3) - 5.193105877187*std::pow(ECM,2) + 5303.505273919*ECM - 2031265.900648;
568  }
569  else if (ECM < 1670.)
570  {
571  sigma = -0.0000000337986446*std::pow(ECM,4) + 0.000218279989*std::pow(ECM,3) - 0.528276144*std::pow(ECM,2) + 567.828367*ECM - 228709.42;
572  }
573  else if (ECM < 1714.)
574  {
575  sigma = 0.000003737765*std::pow(ECM,2) - 0.005664062*ECM;
576  }
577  else sigma=1.47*std::pow(plab, -1.68);
578  }
579 //
580 
581  return sigma;
582  }
583 
584  G4double CrossSectionsMultiPionsAndResonances::piMinuspToOmegaN(Particle const * const particle1, Particle const * const particle2) {
585  //
586  // Pion-Nucleon producing Omega cross sections
587  //
588 // assert((particle1->isNucleon() && particle2->isPion()) || (particle1->isPion() && particle2->isNucleon()));
589 //jcd to be removed
590 // return 0.;
591 //jcd
592 
593 // G4double param=1.095 ; // Deneye (Thesis)
594  G4double param=1.0903 ; // JCD (threshold taken into account)
595 
596  G4double masspion;
597  G4double massnucleon;
598  if (particle1->isPion()) {
599  masspion=particle1->getMass();
600  massnucleon=particle2->getMass();
601  }
602  else {
603  masspion=particle2->getMass();
604  massnucleon=particle1->getMass();
605  }
606  G4double ECM=KinematicsUtils::totalEnergyInCM(particle1, particle2);
607  G4double plab=KinematicsUtils::momentumInLab(ECM*ECM, masspion, massnucleon)/1000.; // GeV/c
608 
609  G4double sigma;
610  if (plab < param) sigma=0.;
611  else sigma=13.76*(plab-param)/(std::pow(plab, 3.33) - 1.07); // Phys. Rev. C 41, 1701–1718 (1990)
612 
613  return sigma;
614 }
616  //
617  // Pion-Nucleon producing Omega cross sections
618  //
619 //jcd to be removed
620 // return 0.;
621 //jcd
622 
623 // G4double param=1.095 ; // Deneye (Thesis)
624  G4double param=1.0903 ; // JCD (threshold taken into account)
625 
626  const G4double masspion = ParticleTable::getRealMass(PiMinus);
627  const G4double massnucleon = ParticleTable::getRealMass(Proton);
628 
629  G4double plab=KinematicsUtils::momentumInLab(ECM*ECM, masspion, massnucleon)/1000.; // GeV/c
630 
631  G4double sigma;
632  if (plab < param) sigma=0.;
633  else sigma=13.76*(plab-param)/(std::pow(plab, 3.33)-1.07);
634 
635  return sigma;
636 }
637 
639 
640  const G4double Ecm=0.001*ener;
641  G4double sNNEta; // pp->pp+eta(+X)
642  G4double sNNEta1; // np->np+eta(+X)
643  G4double sNNEta2; // np->d+eta (d wil be considered as np - How far is this right?)
644  G4double x=Ecm*Ecm/5.88;
645 
646  if (Ecm > 5.5) {
647 // if (Ecm > 4) {
648  sNNEta = 2.5*std::pow((x-1.),1.47)*std::pow(x,-1.25)*1000.;
649  }
650  else if(Ecm>2.70555) {
651  sNNEta = 167.68*Ecm*Ecm-528.3*Ecm+442.29; // Mimicking the reduction seen in omega by HADES compared to Sibirtsev (5.5)
652 // sNNEta = 710.1*Ecm*Ecm-3719.7*Ecm+5106.2; // Mimicking the reduction seen in omega by HADES compared to Sibirtsev (4)
653 // sNNEta = 2.5*std::pow((x-1.),1.47)*std::pow(x,-1.25)*1000.*std::exp(-std::pow(Ecm-2.70555,0.2)*0.3020904); //exp to reduce from 1 to 0.7 (2.07555 --> 5)
654  if (sNNEta <= NNToNNEtaExcluIso(ener, 2)*1000.) sNNEta = NNToNNEtaExcluIso(ener, 2)*1000.;
655  }
656 /* if(Ecm>2.70555) {
657  sNNEta = 2.5*std::pow((x-1.),1.47)*std::pow(x,-1.25)*1000.;
658 // sNNEta = 2.5*std::pow((x-1.),1.47)*std::pow(x,-1.25)*1000.*std::exp(-std::pow(Ecm-2.70555,0.2)*0.3020904); //exp to reduce from 1 to 0.7 (2.07555 --> 5)
659  if (sNNEta <= NNToNNEtaExcluIso(ener, 2)*1000.) sNNEta = NNToNNEtaExcluIso(ener, 2)*1000.;
660  }*/
661  else {
662  sNNEta = NNToNNEtaExcluIso(ener, 2)*1000.;
663  }
664 
665  if (sNNEta < 1.e-9) sNNEta = 0.;
666 
667  if (iso != 0) {
668  return sNNEta/1000.; // parameterization in microbarn (not millibarn)!
669  }
670 
671  if(Ecm>=5.5) {
672 // if(Ecm>=4.) {
673 // if(Ecm>=5.) {
674 // sNNEta1 = 3*sNNEta;
675  sNNEta1 = sNNEta;
676  }
677  else if (Ecm>=2.70555) {
678 // sNNEta1 = 2349.400647*Ecm - 4794.192041; // with factor 3
679 // sNNEta1 = 329.2183*Ecm + 671.5123; // with factor 1
680 // sNNEta1 = 26.19086*Ecm + 1491.368; // with factor 1 and pp reduced
681 // sNNEta1 = sNNEta*(-4.23*Ecm+17.92); // going from a factor 6.5 (low) to 1 (high) (4)
682  sNNEta1 = sNNEta*(-1.968187*Ecm+11.82503); // going from a factor 6.5 (low) to 1 (high) (5.5)
683  }
684  else {
685  sNNEta1 = 6.5*sNNEta; // 6.5: ratio pn/pp
686  }
687 // sNNEta1 = 6.5*sNNEta; // 6.5: ratio pn/pp
688 
689  sNNEta2 = -10220.89518466*Ecm*Ecm+51227.30841724*Ecm-64097.96025731;
690  if (sNNEta2 < 0.) sNNEta2=0.;
691 
692  sNNEta = 2*(sNNEta1+sNNEta2)-sNNEta;
693 
697  if (sNNEta < 1.e-9 || Ecm < Mn+Mp+Meta) sNNEta = 0.;
698 
699  return sNNEta/1000.; // parameterization in microbarn (not millibarn)!
700 }
701 
702 
703  G4double CrossSectionsMultiPionsAndResonances::NNToNNEta(Particle const * const particle1, Particle const * const particle2) {
704 
705  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2);
706  const G4int iso=ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
707 
708  if (iso != 0) {
709  return NNToNNEtaIso(ener, iso);
710  }
711  else {
712  return 0.5*(NNToNNEtaIso(ener, 0)+NNToNNEtaIso(ener, 2));
713  }
714  }
715 
717 
718  const G4double Ecm=0.001*ener;
719  G4double sNNEta; // pp->pp+eta
720  G4double sNNEta1; // np->np+eta
721  G4double sNNEta2; // np->d+eta (d wil be considered as np - How far is this right?)
722 
723  if(Ecm>=2.70555) { // By hand (JCD)
724  sNNEta = -70.1*Ecm + 430.23;
725  }
726  else {
727  sNNEta = -147043.497285*std::pow(Ecm,4) + 1487222.5438123*std::pow(Ecm,3) - 5634399.900744*std::pow(Ecm,2) + 9477290.199378*Ecm - 5972174.353438;
728  }
729 
733  G4double Thr0=0.;
734  if (iso > 0) {
735  Thr0=2.*Mp+Meta;
736  }
737  else if (iso < 0) {
738  Thr0=2.*Mn+Meta;
739  }
740  else {
741  Thr0=Mn+Mp+Meta;
742  }
743 
744  if (sNNEta < 1.e-9 || Ecm < Thr0) sNNEta = 0.; // Thr0: Ecm threshold
745 
746  if (iso != 0) {
747  return sNNEta/1000.; // parameterization in microbarn (not millibarn)!
748  }
749 
750  if(Ecm>=5.5) {
751 // if(Ecm>=4.) {
752 // if(Ecm>=5.) {
753 // sNNEta1 = 3*sNNEta;
754  sNNEta1 = sNNEta;
755  }
756  else if (Ecm>=2.70555) {
757 // sNNEta1 = -577.2757*Ecm + 3125.5683;
758 // sNNEta1 = -646.775*Ecm + 3313.605;
759 // sNNEta1 = -646.775*Ecm + 3313.605;
760 // sNNEta1 = sNNEta*(-4.23*Ecm+17.92); // going from a factor 6.5 (low) to 1 (high) (4.)
761  sNNEta1 = sNNEta*(-1.968187*Ecm+11.82503); // going from a factor 6.5 (low) to 1 (high) (5.5)
762  }
763  else {
764  sNNEta1 = 6.5*sNNEta; // 6.5: ratio pn/pp
765  }
766 // sNNEta1 = 6.5*sNNEta; // 6.5: ratio pn/pp
767 
768  sNNEta2 = -10220.89518466*Ecm*Ecm+51227.30841724*Ecm-64097.96025731;
769  if (sNNEta2 < 0.) sNNEta2=0.;
770 
771  sNNEta = 2*(sNNEta1+sNNEta2)-sNNEta;
772  if (sNNEta < 1.e-9 || Ecm < Thr0) sNNEta = 0.; // Thr0: Ecm threshold
773 
774  return sNNEta/1000.; // parameterization in microbarn (not millibarn)!
775  }
776 
777  G4double CrossSectionsMultiPionsAndResonances::NNToNNEtaExclu(Particle const * const particle1, Particle const * const particle2) {
778 
779  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2);
780  const G4int iso=ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
781 
782  if (iso != 0) {
783  return NNToNNEtaExcluIso(ener, iso);
784  }
785  else {
786  return 0.5*(NNToNNEtaExcluIso(ener, 0)+NNToNNEtaExcluIso(ener, 2));
787  }
788  }
789 
790 
792 
793  const G4double Ecm=0.001*ener;
794  G4double sNNOmega; // pp->pp+eta(+X)
795  G4double sNNOmega1; // np->np+eta(+X)
796  G4double x=Ecm*Ecm/7.06;
797 
798  if(Ecm>4.0) {
799  sNNOmega = 2.5*std::pow(x-1, 1.47)*std::pow(x, -1.11) ;
800  }
801  else if(Ecm>2.802) { // 2802 MeV -> threshold to open inclusive (based on multipion threshold and omega mass)
802  sNNOmega = (568.5254*Ecm*Ecm - 2694.045*Ecm + 3106.247)/1000.;
803  if (sNNOmega <= NNToNNOmegaExcluIso(ener, 2)) sNNOmega = NNToNNOmegaExcluIso(ener, 2);
804  }
805  else {
806  sNNOmega = NNToNNOmegaExcluIso(ener, 2);
807  }
808 
809  if (sNNOmega < 1.e-9) sNNOmega = 0.;
810 
811  if (iso != 0) {
812  return sNNOmega;
813  }
814 
815  sNNOmega1 = 3.*sNNOmega; // 3.0: ratio pn/pp (5 from theory; 2 from experiments)
816 
817  sNNOmega = 2.*sNNOmega1-sNNOmega;
818 
819  if (sNNOmega < 1.e-9) sNNOmega = 0.;
820 
821  return sNNOmega;
822  }
823 
824 
825  G4double CrossSectionsMultiPionsAndResonances::NNToNNOmega(Particle const * const particle1, Particle const * const particle2) {
826 
827  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2);
828  const G4int iso=ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
829 //jcd to be removed
830 // return 0.;
831 //jcd
832  if (iso != 0) {
833  return NNToNNOmegaIso(ener, iso);
834  }
835  else {
836  return 0.5*(NNToNNOmegaIso(ener, 0)+NNToNNOmegaIso(ener, 2));
837  }
838  }
839 
841 
842  const G4double Ecm=0.001*ener;
843  G4double sNNOmega; // pp->pp+eta
844  G4double sNNOmega1; // np->np+eta
845  G4double sthroot=std::sqrt(7.06);
846 
847  if(Ecm>=3.0744) { // By hand (JCD)
848  sNNOmega = 330.*(Ecm-sthroot)/(1.05+std::pow((Ecm-sthroot),2));
849  }
850  else if(Ecm>=2.65854){
851  sNNOmega = -1208.09757*std::pow(Ecm,3) + 10773.3322*std::pow(Ecm,2) - 31661.0223*Ecm + 30728.7241 ;
852  }
853  else {
854  sNNOmega = 0. ;
855  }
856 
860  G4double Thr0=0.;
861  if (iso > 0) {
862  Thr0=2.*Mp+Momega;
863  }
864  else if (iso < 0) {
865  Thr0=2.*Mn+Momega;
866  }
867  else {
868  Thr0=Mn+Mp+Momega;
869  }
870 
871  if (sNNOmega < 1.e-9 || Ecm < Thr0) sNNOmega = 0.; // Thr0: Ecm threshold
872 
873  if (iso != 0) {
874  return sNNOmega/1000.; // parameterization in microbarn (not millibarn)!
875  }
876 
877  sNNOmega1 = 3*sNNOmega; // 3.0: ratio pn/pp
878 
879  sNNOmega = 2*sNNOmega1-sNNOmega;
880  if (sNNOmega < 1.e-9 || Ecm < Thr0) sNNOmega = 0.;
881 
882  return sNNOmega/1000.; // parameterization in microbarn (not millibarn)!
883  }
884 
885  G4double CrossSectionsMultiPionsAndResonances::NNToNNOmegaExclu(Particle const * const particle1, Particle const * const particle2) {
886 //jcd to be removed
887 // return 0.;
888 //jcd
889 
890  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2);
891  const G4int iso=ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
892 
893  if (iso != 0) {
894  return NNToNNOmegaExcluIso(ener, iso);
895  }
896  else {
897  return 0.5*(NNToNNOmegaExcluIso(ener, 0)+NNToNNOmegaExcluIso(ener, 2));
898  }
899  }
900 
901 
902  G4double CrossSectionsMultiPionsAndResonances::NNToxPiNN(const G4int xpi, Particle const * const particle1, Particle const * const particle2) {
903  //
904  // Nucleon-Nucleon producing xpi pions cross sections
905  //
906 // assert(xpi>0 && xpi<=nMaxPiNN);
907 // assert(particle1->isNucleon() && particle2->isNucleon());
908 
909  G4double oldXS1Pi=CrossSectionsMultiPions::NNToxPiNN(1,particle1, particle2);
910  G4double oldXS2Pi=CrossSectionsMultiPions::NNToxPiNN(2,particle1, particle2);
911  G4double oldXS3Pi=CrossSectionsMultiPions::NNToxPiNN(3,particle1, particle2);
912  G4double oldXS4Pi=CrossSectionsMultiPions::NNToxPiNN(4,particle1, particle2);
913  G4double xsEtaOmega=NNToNNEta(particle1, particle2)+NNToNNOmega(particle1, particle2);
914  G4double newXS1Pi=0.;
915  G4double newXS2Pi=0.;
916  G4double newXS3Pi=0.;
917  G4double newXS4Pi=0.;
918 
919  if (xpi == 1) {
920  if (oldXS4Pi != 0. || oldXS3Pi != 0.)
921  newXS1Pi=oldXS1Pi;
922  else if (oldXS2Pi != 0.) {
923  newXS2Pi=oldXS2Pi-xsEtaOmega;
924  if (newXS2Pi < 0.)
925  newXS1Pi=oldXS1Pi-(xsEtaOmega-oldXS2Pi);
926  else
927  newXS1Pi=oldXS1Pi;
928  }
929  else
930  newXS1Pi=oldXS1Pi-xsEtaOmega;
931  return newXS1Pi;
932  }
933  else if (xpi == 2) {
934  if (oldXS4Pi != 0.)
935  newXS2Pi=oldXS2Pi;
936  else if (oldXS3Pi != 0.) {
937  newXS3Pi=oldXS3Pi-xsEtaOmega;
938  if (newXS3Pi < 0.)
939  newXS2Pi=oldXS2Pi-(xsEtaOmega-oldXS3Pi);
940  else
941  newXS2Pi=oldXS2Pi;
942  }
943  else {
944  newXS2Pi=oldXS2Pi-xsEtaOmega;
945  if (newXS2Pi < 0.)
946  newXS2Pi=0.;
947  }
948  return newXS2Pi;
949  }
950  else if (xpi == 3) {
951  if (oldXS4Pi != 0.) {
952  newXS4Pi=oldXS4Pi-xsEtaOmega;
953  if (newXS4Pi < 0.)
954  newXS3Pi=oldXS3Pi-(xsEtaOmega-oldXS4Pi);
955  else
956  newXS3Pi=oldXS3Pi;
957  }
958  else {
959  newXS3Pi=oldXS3Pi-xsEtaOmega;
960  if (newXS3Pi < 0.)
961  newXS3Pi=0.;
962  }
963  return newXS3Pi;
964  }
965  else if (xpi == 4) {
966  newXS4Pi=oldXS4Pi-xsEtaOmega;
967  if (newXS4Pi < 0.)
968  newXS4Pi=0.;
969  return newXS4Pi;
970  }
971 
972  else // should never reach this point
973  return 0.;
974  }
975 
976 
977  G4double CrossSectionsMultiPionsAndResonances::NNToNNEtaOnePi(Particle const * const particle1, Particle const * const particle2) {
978  // Cross section for nucleon-nucleon producing one eta and one pion
979 
980  const G4int iso=ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
981  if (iso!=0)
982  return 0.;
983 
984  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2) - 686.987; // 686.987 MeV translation to open pion production in NNEta (= 2705.55 - 2018.563; 4074595.287720512986=2018.563*2018.563)
985  if (ener < 2018.563) return 0.;
986 
989 
990  return 0.25*(CrossSectionsMultiPions::NNOnePiOrDelta(ener, 0, xsiso0)+ CrossSectionsMultiPions::NNOnePiOrDelta(ener, 2, xsiso2));
991  }
992 
993  G4double CrossSectionsMultiPionsAndResonances::NNToNNEtaOnePiOrDelta(Particle const * const particle1, Particle const * const particle2) {
994  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2) - 686.987; // 686.987 MeV translation to open pion production in NNEta
995  if (ener < 2018.563) return 0.;
996  const G4int iso=ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
997 
999  if (iso != 0)
1000  return CrossSectionsMultiPions::NNOnePiOrDelta(ener, iso, xsiso2);
1001  else {
1002  const G4double xsiso0=CrossSectionsMultiPions::NNInelasticIso(ener, 0);
1003  return 0.5*(CrossSectionsMultiPions::NNOnePiOrDelta(ener, 0, xsiso0)+ CrossSectionsMultiPions::NNOnePiOrDelta(ener, 2, xsiso2));
1004  }
1005  }
1006 
1007  G4double CrossSectionsMultiPionsAndResonances::NNToNNEtaTwoPi(Particle const * const particle1, Particle const * const particle2) {
1008  //
1009  // Nucleon-Nucleon producing one eta and two pions
1010  //
1011  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2) - 686.987; // 686.987 MeV translation to open pion production in NNEta
1012  if (ener < 2018.563) return 0.;
1013  const G4int iso=ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
1014 
1015 
1016  const G4double xsiso2=CrossSectionsMultiPions::NNInelasticIso(ener, 2);
1017  if (iso != 0) {
1018  return CrossSectionsMultiPions::NNTwoPi(ener, 2, xsiso2);
1019  }
1020  else {
1021  const G4double xsiso0=CrossSectionsMultiPions::NNInelasticIso(ener, 0);
1022  return 0.5*(CrossSectionsMultiPions::NNTwoPi(ener, 0, xsiso0)+ CrossSectionsMultiPions::NNTwoPi(ener, 2, xsiso2));
1023  }
1024  }
1025 
1026  G4double CrossSectionsMultiPionsAndResonances::NNToNNEtaThreePi(Particle const * const particle1, Particle const * const particle2) {
1027  //
1028  // Nucleon-Nucleon producing one eta and three pions
1029  //
1030 
1031  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2) - 686.987; // 686.987 MeV translation to open pion production in NNEta
1032  if (ener < 2018.563) return 0.;
1033  const G4int iso=ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
1034 
1035 
1036  const G4double xsiso2=CrossSectionsMultiPions::NNInelasticIso(ener, 2);
1037  const G4double xs1pi2=CrossSectionsMultiPions::NNOnePiOrDelta(ener, 2, xsiso2);
1038  const G4double xs2pi2=CrossSectionsMultiPions::NNTwoPi(ener, 2, xsiso2);
1039  if (iso != 0)
1040  return CrossSectionsMultiPions::NNThreePi(ener, 2, xsiso2, xs1pi2, xs2pi2);
1041  else {
1042  const G4double xsiso0=CrossSectionsMultiPions::NNInelasticIso(ener, 0);
1043  const G4double xs1pi0=CrossSectionsMultiPions::NNOnePiOrDelta(ener, 0, xsiso0);
1044  const G4double xs2pi0=CrossSectionsMultiPions::NNTwoPi(ener, 0, xsiso0);
1045  return 0.5*(CrossSectionsMultiPions::NNThreePi(ener, 0, xsiso0, xs1pi0, xs2pi0)+ CrossSectionsMultiPions::NNThreePi(ener, 2, xsiso2, xs1pi2, xs2pi2));
1046  }
1047  }
1048 
1049  G4double CrossSectionsMultiPionsAndResonances::NNToNNEtaFourPi(Particle const * const particle1, Particle const * const particle2) {
1050  //
1051  // Nucleon-Nucleon producing one eta and four pions
1052  //
1053 
1054  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2) - 686.987; // 686.987 MeV translation to open pion production in NNEta
1055  if (ener < 2018.563) return 0.;
1056  const G4double s = ener*ener;
1057  const G4int i = ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
1058  G4double xsinelas;
1059  if (i!=0)
1060  xsinelas=CrossSectionsMultiPions::NNInelasticIso(ener, 2);
1061  else
1063  if (xsinelas <= 1.e-9) return 0.;
1064  G4double ratio=(NNToNNEta(particle1, particle2)-NNToNNEtaExclu(particle1, particle2))/xsinelas;
1065  if(s<6.25E6)
1066  return 0.;
1067  const G4double sigma = NNToNNEta(particle1, particle2) - NNToNNEtaExclu(particle1, particle2) - ratio*(NNToNNEtaOnePiOrDelta(particle1, particle2) + NNToNNEtaTwoPi(particle1, particle2) + NNToNNEtaThreePi(particle1, particle2));
1068  return ((sigma>1.e-9) ? sigma : 0.);
1069  }
1070 
1071  G4double CrossSectionsMultiPionsAndResonances::NNToNNEtaxPi(const G4int xpi, Particle const * const particle1, Particle const * const particle2) {
1072  //
1073  // Nucleon-Nucleon producing one eta and xpi pions
1074  //
1075 // assert(xpi>0 && xpi<=nMaxPiNN);
1076 // assert(particle1->isNucleon() && particle2->isNucleon());
1077 
1078  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2) - 686.987; // 686.987 MeV translation to open pion production in NNEta
1079  if (ener < 2018.563) return 0.;
1080  const G4int i = ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
1081  G4double xsinelas;
1082  if (i!=0)
1083  xsinelas=CrossSectionsMultiPions::NNInelasticIso(ener, 2);
1084  else
1086  if (xsinelas <= 1.e-9) return 0.;
1087  G4double ratio=(NNToNNEta(particle1, particle2)-NNToNNEtaExclu(particle1, particle2))/xsinelas;
1088 
1089  if (xpi == 1)
1090  return NNToNNEtaOnePi(particle1, particle2)*ratio;
1091  else if (xpi == 2)
1092  return NNToNNEtaTwoPi(particle1, particle2)*ratio;
1093  else if (xpi == 3)
1094  return NNToNNEtaThreePi(particle1, particle2)*ratio;
1095  else if (xpi == 4)
1096  return NNToNNEtaFourPi(particle1, particle2);
1097  else // should never reach this point
1098  return 0.;
1099  }
1100 
1101 
1103 // assert(p1->isNucleon() && p2->isNucleon());
1105  const G4double ener=KinematicsUtils::totalEnergyInCM(p1, p2) - 686.987; // 686.987 MeV translation to open pion production in NNEta
1106  if (ener < 2018.563) return 0.;
1107  G4double xsinelas;
1108  if (i!=0)
1109  xsinelas=CrossSectionsMultiPions::NNInelasticIso(ener, 2);
1110  else
1112  if (xsinelas <= 1.e-9) return 0.;
1113  G4double ratio=(NNToNNEta(p1, p2)-NNToNNEtaExclu(p1, p2))/xsinelas;
1114  G4double sigma = NNToNNEtaOnePiOrDelta(p1, p2)*ratio;
1115  if(i==0)
1116  sigma *= 0.5;
1117  return sigma;
1118  }
1119 
1120 
1121  G4double CrossSectionsMultiPionsAndResonances::NNToNNOmegaOnePi(Particle const * const particle1, Particle const * const particle2) {
1122  // Cross section for nucleon-nucleon producing one omega and one pion
1123 
1124  const G4int iso=ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
1125  if (iso!=0)
1126  return 0.;
1127 
1128  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2) - 783.437; // 783.437 MeV translation to open pion production in NNOmega (= 2802. - 2018.563; 4074595.287720512986=2018.563*2018.563)
1129  if (ener < 2018.563) return 0.;
1130 
1131  const G4double xsiso2=CrossSectionsMultiPions::NNInelasticIso(ener, 2);
1132  const G4double xsiso0=CrossSectionsMultiPions::NNInelasticIso(ener, 0);
1133 
1134  return 0.25*(CrossSectionsMultiPions::NNOnePiOrDelta(ener, 0, xsiso0)+ CrossSectionsMultiPions::NNOnePiOrDelta(ener, 2, xsiso2));
1135  }
1136 
1138  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2) - 783.437; // 783.437 MeV translation to open pion production in NNOmega
1139  if (ener < 2018.563) return 0.;
1140  const G4int iso=ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
1141 
1142  const G4double xsiso2=CrossSectionsMultiPions::NNInelasticIso(ener, 2);
1143  if (iso != 0)
1144  return CrossSectionsMultiPions::NNOnePiOrDelta(ener, iso, xsiso2);
1145  else {
1146  const G4double xsiso0=CrossSectionsMultiPions::NNInelasticIso(ener, 0);
1147  return 0.5*(CrossSectionsMultiPions::NNOnePiOrDelta(ener, 0, xsiso0)+ CrossSectionsMultiPions::NNOnePiOrDelta(ener, 2, xsiso2));
1148  }
1149  }
1150 
1151  G4double CrossSectionsMultiPionsAndResonances::NNToNNOmegaTwoPi(Particle const * const particle1, Particle const * const particle2) {
1152  //
1153  // Nucleon-Nucleon producing one omega and two pions
1154  //
1155  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2) - 783.437; // 783.437 MeV translation to open pion production in NNOmega
1156  if (ener < 2018.563) return 0.;
1157  const G4int iso=ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
1158 
1159 
1160  const G4double xsiso2=CrossSectionsMultiPions::NNInelasticIso(ener, 2);
1161  if (iso != 0) {
1162  return CrossSectionsMultiPions::NNTwoPi(ener, 2, xsiso2);
1163  }
1164  else {
1165  const G4double xsiso0=CrossSectionsMultiPions::NNInelasticIso(ener, 0);
1166  return 0.5*(CrossSectionsMultiPions::NNTwoPi(ener, 0, xsiso0)+ CrossSectionsMultiPions::NNTwoPi(ener, 2, xsiso2));
1167  }
1168  }
1169 
1170  G4double CrossSectionsMultiPionsAndResonances::NNToNNOmegaThreePi(Particle const * const particle1, Particle const * const particle2) {
1171  //
1172  // Nucleon-Nucleon producing one omega and three pions
1173  //
1174 
1175  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2) - 783.437; // 783.437 MeV translation to open pion production in NNOmega
1176  if (ener < 2018.563) return 0.;
1177  const G4int iso=ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
1178 
1179 
1180  const G4double xsiso2=CrossSectionsMultiPions::NNInelasticIso(ener, 2);
1181  const G4double xs1pi2=CrossSectionsMultiPions::NNOnePiOrDelta(ener, 2, xsiso2);
1182  const G4double xs2pi2=CrossSectionsMultiPions::NNTwoPi(ener, 2, xsiso2);
1183  if (iso != 0)
1184  return CrossSectionsMultiPions::NNThreePi(ener, 2, xsiso2, xs1pi2, xs2pi2);
1185  else {
1186  const G4double xsiso0=CrossSectionsMultiPions::NNInelasticIso(ener, 0);
1187  const G4double xs1pi0=CrossSectionsMultiPions::NNOnePiOrDelta(ener, 0, xsiso0);
1188  const G4double xs2pi0=CrossSectionsMultiPions::NNTwoPi(ener, 0, xsiso0);
1189  return 0.5*(CrossSectionsMultiPions::NNThreePi(ener, 0, xsiso0, xs1pi0, xs2pi0)+ CrossSectionsMultiPions::NNThreePi(ener, 2, xsiso2, xs1pi2, xs2pi2));
1190  }
1191  }
1192 
1193  G4double CrossSectionsMultiPionsAndResonances::NNToNNOmegaFourPi(Particle const * const particle1, Particle const * const particle2) {
1194  //
1195  // Nucleon-Nucleon producing one omega and four pions
1196  //
1197 //jcd to be removed
1198 // return 0.;
1199 //jcd
1200 
1201  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2) - 783.437; // 783.437 MeV translation to open pion production in NNOmega
1202  if (ener < 2018.563) return 0.;
1203  const G4double s = ener*ener;
1204  const G4int i = ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
1205  G4double xsinelas;
1206  if (i!=0)
1207  xsinelas=CrossSectionsMultiPions::NNInelasticIso(ener, 2);
1208  else
1210  if (xsinelas <= 1.e-9) return 0.;
1211  G4double ratio=(NNToNNOmega(particle1, particle2)-NNToNNOmegaExclu(particle1, particle2))/xsinelas;
1212  if(s<6.25E6)
1213  return 0.;
1214  const G4double sigma = NNToNNOmega(particle1, particle2) - NNToNNOmegaExclu(particle1, particle2) - ratio*(NNToNNOmegaOnePiOrDelta(particle1, particle2) + NNToNNOmegaTwoPi(particle1, particle2) + NNToNNOmegaThreePi(particle1, particle2));
1215  return ((sigma>1.e-9) ? sigma : 0.);
1216  }
1217 
1218  G4double CrossSectionsMultiPionsAndResonances::NNToNNOmegaxPi(const G4int xpi, Particle const * const particle1, Particle const * const particle2) {
1219  //
1220  // Nucleon-Nucleon producing one omega and xpi pions
1221  //
1222 // assert(xpi>0 && xpi<=nMaxPiNN);
1223 // assert(particle1->isNucleon() && particle2->isNucleon());
1224 //jcd to be removed
1225 // return 0.;
1226 //jcd
1227 
1228  const G4double ener=KinematicsUtils::totalEnergyInCM(particle1, particle2) - 783.437; // 783.437 MeV translation to open pion production in NNOmega
1229  if (ener < 2018.563) return 0.;
1230  const G4int i = ParticleTable::getIsospin(particle1->getType()) + ParticleTable::getIsospin(particle2->getType());
1231  G4double xsinelas;
1232  if (i!=0)
1233  xsinelas=CrossSectionsMultiPions::NNInelasticIso(ener, 2);
1234  else
1236  if (xsinelas <= 1.e-9) return 0.;
1237  G4double ratio=(NNToNNOmega(particle1, particle2)-NNToNNOmegaExclu(particle1, particle2))/xsinelas;
1238 
1239  if (xpi == 1)
1240  return NNToNNOmegaOnePi(particle1, particle2)*ratio;
1241  else if (xpi == 2)
1242  return NNToNNOmegaTwoPi(particle1, particle2)*ratio;
1243  else if (xpi == 3)
1244  return NNToNNOmegaThreePi(particle1, particle2)*ratio;
1245  else if (xpi == 4)
1246  return NNToNNOmegaFourPi(particle1, particle2);
1247  else // should never reach this point
1248  return 0.;
1249  }
1250 
1251 
1253 // assert(p1->isNucleon() && p2->isNucleon());
1254 //jcd to be removed
1255 // return 0.;
1256 //jcd
1258  const G4double ener=KinematicsUtils::totalEnergyInCM(p1, p2) - 783.437; // 783.437 MeV translation to open pion production in NNOmega
1259  if (ener < 2018.563) return 0.;
1260  G4double xsinelas;
1261  if (i!=0)
1262  xsinelas=CrossSectionsMultiPions::NNInelasticIso(ener, 2);
1263  else
1265  if (xsinelas <= 1.e-9) return 0.;
1266  G4double ratio=(NNToNNOmega(p1, p2)-NNToNNOmegaExclu(p1, p2))/xsinelas;
1267  G4double sigma = NNToNNOmegaOnePiOrDelta(p1, p2)*ratio;
1268  if(i==0)
1269  sigma *= 0.5;
1270  return sigma;
1271  }
1272 
1273 
1274 } // namespace G4INCL
1275 
virtual G4double NNToNNOmegaTwoPi(Particle const *const part1, Particle const *const part2)
Cross section for direct 2-pion production - NNOmega channel.
G4bool isEta() const
Is this a eta?
virtual G4double NNToxPiNN(const G4int xpi, Particle const *const p1, Particle const *const p2)
Cross section for X pion production - NN Channel.
static const G4double s12ppOOT
One over threshold for s12pp.
virtual G4double NNToNNEtaTwoPi(Particle const *const part1, Particle const *const part2)
Cross section for direct 2-pion production - NNEta channel.
virtual G4double NNToNNOmegaIso(const G4double ener, const G4int iso)
Isotopic Cross section for Omega production (inclusive) - NN entrance channel.
virtual G4double NNToNNOmegaxPi(const G4int xpi, Particle const *const p1, Particle const *const p2)
Cross section for X pion production - NNOmega Channel.
virtual G4double omegaNToPiN(Particle const *const p1, Particle const *const p2)
Cross section for OmegaN-&gt;PiN.
virtual G4double NNOnePiOrDelta(const G4double ener, const G4int iso, const G4double xsiso)
Cross section for direct 1-pion production + delta production - NN entrance channel.
virtual G4double NNToNNEtaIso(const G4double ener, const G4int iso)
Cross section for One (more) pion production - piN entrance channel.
G4double getMass() const
Get the cached particle mass.
G4double NNInelasticIso(const G4double ener, const G4int iso)
Internal implementation of the isospin dependent NN reaction cross section.
virtual G4double NNToNNEtaFourPi(Particle const *const part1, Particle const *const part2)
Cross section for direct 4-pion production - NNEta channel.
virtual G4double NNToNNEtaOnePiOrDelta(Particle const *const part1, Particle const *const part2)
Cross section for direct 1-pion production - NNEta channel.
virtual G4double NNToNDeltaOmega(Particle const *const p1, Particle const *const p2)
Cross section for N-Delta-Eta production - NNOmega Channel.
virtual G4double NNToNNEta(Particle const *const particle1, Particle const *const particle2)
Cross section for Eta production (inclusive) - NN entrance channel.
virtual G4double NNToNNEtaExcluIso(const G4double ener, const G4int iso)
Isotopic Cross section for Eta production (exclusive) - NN entrance channel.
virtual G4double omegaNInelastic(Particle const *const p1, Particle const *const p2)
Cross sections for mesonic resonance absorption on nucleon - inelastic Channel.
virtual G4double NNTwoPi(const G4double ener, const G4int iso, const G4double xsiso)
Cross section for direct 2-pion production - NN entrance channel.
virtual G4double NNToNNOmegaExclu(Particle const *const particle1, Particle const *const particle2)
Cross section for Omega production (exclusive) - NN entrance channel.
virtual G4double etaNToPiN(Particle const *const p1, Particle const *const p2)
Cross sections for mesonic resonance absorption on nucleon - piN Channel.
virtual G4double NNToNNEtaOnePi(Particle const *const part1, Particle const *const part2)
Cross section for direct 1-pion production - NNEta channel.
virtual G4double piNToEtaPrimeN(Particle const *const p1, Particle const *const p2)
Cross section for PiN-&gt;EtaPrimeN.
virtual G4double NNToNNEtaExclu(Particle const *const particle1, Particle const *const particle2)
Cross section for Eta production (exclusive) - NN entrance channel.
virtual G4double piNToxPiN(const G4int xpi, Particle const *const p1, Particle const *const p2)
Cross section for X pion production - piN Channel (modified due to the mesonic resonances) ...
G4bool isDelta() const
Is it a Delta?
virtual G4double etaPrimeNToPiN(Particle const *const p1, Particle const *const p2)
Cross section for EtaPrimeN-&gt;PiN.
static const G4double s12zzOOT
One over threshold for s12zz.
G4bool isEtaPrime() const
Is this a etaprime?
virtual G4double omegaNElastic(Particle const *const p1, Particle const *const p2)
virtual G4double NNToNNOmegaOnePiOrDelta(Particle const *const part1, Particle const *const part2)
Cross section for direct 1-pion production - NNOmega channel.
G4double momentumInCM(Particle const *const p1, Particle const *const p2)
gives the momentum in the CM frame of two particles.
virtual G4double piNToxPiN(const G4int xpi, Particle const *const p1, Particle const *const p2)
Cross section for X pion production - piN Channel.
virtual G4double NNToNNOmega(Particle const *const particle1, Particle const *const particle2)
Cross section for Omega production (inclusive) - NN entrance channel.
int G4int
Definition: G4Types.hh:78
virtual G4double NNThreePi(const G4double ener, const G4int iso, const G4double xsiso, const G4double xs1pi, const G4double xs2pi)
Cross section for direct 3-pion production - NN entrance channel.
virtual G4double NNToNDeltaEta(Particle const *const p1, Particle const *const p2)
Cross section for N-Delta-Eta production - NNEta Channel.
G4double NNTot(Particle const *const part1, Particle const *const part2)
Internal implementation of the NN total cross section.
virtual G4double NNToNNOmegaExcluIso(const G4double ener, const G4int iso)
Isotopic Cross section for Omega production (exclusive) - NN entrance channel.
virtual G4double total(Particle const *const p1, Particle const *const p2)
new total particle-particle cross section
const XML_Char * s
Definition: expat.h:262
G4double getRealMass(const G4INCL::ParticleType t)
Get particle mass (in MeV/c^2)
G4bool isOmega() const
Is this a omega?
static const G4double s12pmOOT
One over threshold for s12pm.
virtual G4double NNToNNEtaThreePi(Particle const *const part1, Particle const *const part2)
Cross section for direct 3-pion production - NNEta channel.
G4bool nucleon(G4int ityp)
virtual G4double piNToOmegaN(Particle const *const p1, Particle const *const p2)
Cross section for PiN-&gt;OmegaN.
static const G4int nMaxPiPiN
Maximum number of outgoing pions in piN collisions.
G4double piNTot(Particle const *const p1, Particle const *const p2)
virtual G4double NNToNNEtaxPi(const G4int xpi, Particle const *const p1, Particle const *const p2)
Cross section for X pion production - NNEta Channel.
virtual G4double elastic(Particle const *const p1, Particle const *const p2)
Elastic particle-particle cross section.
static const G4double s01ppOOT
One over threshold for s01pp.
virtual G4double elastic(Particle const *const p1, Particle const *const p2)
new elastic particle-particle cross section
static const G4double s11pzOOT
One over threshold for s11pz.
virtual G4double NDeltaToNN(Particle const *const p1, Particle const *const p2)
Cross section for NDelta-&gt;NN.
virtual G4double NNToNNOmegaThreePi(Particle const *const part1, Particle const *const part2)
Cross section for direct 3-pion production - NNOmega channel.
G4double getINCLMass(const G4int A, const G4int Z)
Get INCL nuclear mass (in MeV/c^2)
G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
const G4double effectiveNucleonMass2
G4INCL::ParticleType getType() const
virtual G4double omegaNToPiPiN(Particle const *const p1, Particle const *const p2)
Cross sections for omega-induced 2Pi emission on nucleon.
Multipion and mesonic Resonances cross sections.
static G4double eval(const G4double pLab, const G4double oneOverThreshold, HornerCoefficients< N > const &coeffs)
static const G4double s12mzOOT
One over threshold for s12mz.
virtual G4double NNToNNOmegaFourPi(Particle const *const part1, Particle const *const part2)
Cross section for direct 4-pion production - NNOmega channel.
virtual G4double etaNElastic(Particle const *const p1, Particle const *const p2)
Cross sections for mesonic resonance absorption on nucleon - elastic Channel.
G4double piMinuspToOmegaN(Particle const *const p1, Particle const *const p2)
G4bool isNucleon() const
virtual G4double NNToNNOmegaOnePi(Particle const *const part1, Particle const *const part2)
Cross section for direct 1-pion production - NNOmega channel.
G4double piMinuspToEtaN(Particle const *const p1, Particle const *const p2)
Internal function for pion cross sections.
static const G4double s02pmOOT
One over threshold for s02pm.
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)
virtual G4double etaNToPiPiN(Particle const *const p1, Particle const *const p2)
Cross sections for mesonic resonance absorption on nucleon - pipiN Channel.
static const G4double s11pmOOT
One over threshold for s11pm.
G4bool isPion() const
Is this a pion?
static G4double eval(const G4double x, HornerCoefficients< N > const &coeffs)
const G4double effectiveNucleonMass
static const G4int nMaxPiNN
Maximum number of outgoing pions in NN collisions.
static const G4double s01pzOOT
One over threshold for s01pz.
static const G4double s02pzOOT
One over threshold for s02pz.
virtual G4double NNToxPiNN(const G4int xpi, Particle const *const p1, Particle const *const p2)
Cross section for X pion production - NN Channel.
virtual G4double piNToEtaN(Particle const *const p1, Particle const *const p2)
Cross sections for mesonic resonance production - piN Channel.