Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4INCLCrossSectionsAntiparticles.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
38/** \file G4INCLCrossSectionsAntiparticles.cc
39 * \brief Multipion, mesonic Resonances, strange cross sections and antinucleon as projectile
40 *
41 * \date 31st March 2023
42 * \author Demid Zharenov
43 */
44
48// #include <cassert>
49
50namespace G4INCL {
51
52 template<G4int N>
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 const G4double nbar_pbarThreshold =1.; //Threshold above which nbar and pbar are considered the same particle
66
68 s11pzHC(-2.228000000000294018,8.7560000000005723725,-0.61000000000023239325,-5.4139999999999780324,3.3338333333333348023,-0.75835000000000022049,0.060623611111111114688),
69 s01ppHC(2.0570000000126518344,-6.029000000012135826,36.768500000002462784,-45.275666666666553533,25.112666666666611953,-7.2174166666666639187,1.0478875000000000275,-0.060804365079365080846),
70 s01pzHC(0.18030000000000441851,7.8700999999999953598,-4.0548999999999990425,0.555199999999999959),
71 s11pmHC(0.20590000000000031866,3.3450999999999993936,-1.4401999999999997825,0.17076666666666664973),
72 s12pmHC(-0.77235999999999901328,4.2626599999999991117,-1.9008899999999997323,0.30192266666666663379,-0.012270833333333331986),
73 s12ppHC(-0.75724999999999975664,2.0934399999999998565,-0.3803099999999999814),
74 s12zzHC(-0.89599999999996965072,7.882999999999978632,-7.1049999999999961928,1.884333333333333089),
75 s02pzHC(-1.0579999999999967036,11.113999999999994089,-8.5259999999999990196,2.0051666666666666525),
76 s02pmHC(2.4009000000012553286,-7.7680000000013376183,20.619000000000433505,-16.429666666666723928,5.2525708333333363472,-0.58969166666666670206),
77 s12mzHC(-0.21858699999999976269,1.9148999999999999722,-0.31727500000000001065,-0.027695000000000000486)
78 {
79 }
80
81 /// \brief redefining previous cross sections
82
83 G4double CrossSectionsAntiparticles::total(Particle const * const p1, Particle const * const p2) {
84 G4double inelastic;
85 if ((p1->isNucleon() && p2->isAntiNucleon()) || (p1->isAntiNucleon() && p2->isNucleon())){
87 const Particle *antinucleon;
88 const Particle *nucleon;
89 if (p1->isAntiNucleon()) {
90 antinucleon = p1;
91 nucleon = p2;
92 }
93 else {
94 antinucleon = p2;
95 nucleon = p1;
96 }
97 const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
98 const std::vector<G4double> coef_nbarp_total = {1.69447, 5.26254E+08, -5.36346, -0.39766, 0.0243057};//OBELIX data
99 G4double sigma = KinematicsUtils::compute_xs(coef_nbarp_total,pLab*1000);
100 if(iso == 2 && pLab < nbar_pbarThreshold){//nbarp low energy
101 return sigma*1000;
102
103 }
104 else if(antinucleon->getType() == antiNeutron && nucleon->getType() == Neutron && pLab < nbar_pbarThreshold){ //nbarn low energy
105 return 1000*sigma + NNbarCEX(p1, p2);
106 }
107 else {
108 inelastic = NNbarCEX(p1, p2) + NNbarToNNbarpi(p1, p2) + NNbarToNNbar2pi(p1, p2) + NNbarToNNbar3pi(p1, p2) + NNbarToAnnihilation(p1, p2) + NNbarToLLbar(p1, p2);
109 }
110 } else if(p1->isNucleon() && p2->isNucleon()) {
111 return CrossSectionsMultiPions::NNTot(p1, p2);
112 } else if((p1->isNucleon() && p2->isDelta()) ||
113 (p1->isDelta() && p2->isNucleon())) {
114 inelastic = CrossSectionsMultiPions::NDeltaToNN(p1, p2) + NDeltaToNLK(p1, p2) + NDeltaToNSK(p1, p2) + NDeltaToDeltaLK(p1, p2) + NDeltaToDeltaSK(p1, p2) + NDeltaToNNKKb(p1, p2);
115 } else if((p1->isNucleon() && p2->isPion()) ||
116 (p1->isPion() && p2->isNucleon())) {
118 } else if((p1->isNucleon() && p2->isEta()) ||
119 (p1->isEta() && p2->isNucleon())) {
121 } else if((p1->isNucleon() && p2->isOmega()) ||
122 (p1->isOmega() && p2->isNucleon())) {
124 } else if((p1->isNucleon() && p2->isEtaPrime()) ||
125 (p1->isEtaPrime() && p2->isNucleon())) {
127 } else if((p1->isNucleon() && p2->isLambda()) ||
128 (p1->isLambda() && p2->isNucleon())) {
129 inelastic = CrossSectionsStrangeness::NLToNS(p1,p2);
130 } else if((p1->isNucleon() && p2->isSigma()) ||
131 (p1->isSigma() && p2->isNucleon())) {
133 } else if((p1->isNucleon() && p2->isKaon()) ||
134 (p1->isKaon() && p2->isNucleon())) {
136 } else if((p1->isNucleon() && p2->isAntiKaon()) ||
137 (p1->isAntiKaon() && p2->isNucleon())) {
138 inelastic = CrossSectionsStrangeness::NKbToLpi(p1,p2)
142 } else {
143 inelastic = 0.;
144 }
145 return inelastic + elastic(p1, p2);
146 }
147
148 // without NNbar!
149 G4double CrossSectionsAntiparticles::elastic(Particle const * const p1, Particle const * const p2) {
150 if ((p1->isNucleon() && p2->isAntiNucleon()) || (p1->isAntiNucleon() && p2->isNucleon()))
151 return NNbarElastic(p1, p2);
152 if((p1->isNucleon()||p1->isDelta()) && (p2->isNucleon()||p2->isDelta())){ // N-N, N-Delta, Delta-Delta
154 }
155 else if ((p1->isNucleon() && p2->isPion()) || (p2->isNucleon() && p1->isPion())){
157 }
158 else if ((p1->isNucleon() && p2->isEta()) || (p2->isNucleon() && p1->isEta())){
160 }
161 else if ((p1->isNucleon() && p2->isHyperon()) || (p2->isNucleon() && p1->isHyperon())){
163 }
164 else if ((p1->isNucleon() && p2->isKaon()) || (p2->isNucleon() && p1->isKaon())){
166 }
167 else if ((p1->isNucleon() && p2->isAntiKaon()) || (p2->isNucleon() && p1->isAntiKaon())){
169 }
170 else {
171 return 0.0;
172 }
173 }
174
176 //brief ppbar
177 // p pbar -> n nbar (BFMM 204)
178 //
179 //brief nnbar
180 // n nbar -> p pbar (same as BFMM 204, but no threshold)
181 //
182
183// assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
184
185 G4double sigma=0.;
187 // iso == 2 || iso == -2 (n pbar or p nbar)
188
189 const std::vector<G4double> BFMM204 = {7.549, -0.041, -2.959, -6.835, 1.629, 0.114};
190 //{6.875, 0.590, -0.003, -6.629, 1.532, 0.114}
191 //const G4double Eth_PPbar_NNbar = 0.114;
192 const std::vector<G4double> BFMM204nn = {7.549, -0.041, -2.959, -6.835, 1.629};
193 //const G4double Eth_NNbar_PPbar = 0.0;
194
195 const Particle *antinucleon;
196 const Particle *nucleon;
197
198 if (p1->isAntiNucleon()) {
199 antinucleon = p1;
200 nucleon = p2;
201 }
202 else {
203 antinucleon = p2;
204 nucleon = p1;
205 }
206
207 const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
208
209 if(iso == 2 || iso == -2){ //npbar or pnbar
210 sigma = 0.0;
211 return sigma;
212 }
213 else{ // ppbar or nnbar
214 if(p1->getType()==antiProton || p1->getType()==Proton)
215 sigma = KinematicsUtils::compute_xs(std::move(BFMM204), pLab); // ppbar case
216 else
217 sigma = KinematicsUtils::compute_xs(std::move(BFMM204nn), pLab); // nnbar case
218 return sigma;
219 }
220 }
221
223 //brief ppbar
224 // p pbar -> p pbar (BFMM 2)
225 //
226 //brief npbar
227 // n pbar -> n pbar (BFMM 472)
228 //
229 //brief nnbar
230 // n nbar -> n nbar (same as BFMM 2)
231 //
232 //brief pnbar
233 // p nbar -> p nbar (same as BFMM 472) --> Total -annihilation
234 //
235
236// assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
237
238 G4double sigma=0.;
240 // iso == 2 || iso == -2 (n pbar or p nbar)
241
242 const std::vector<G4double> BFMM2 = {110.496, -65.605, -0.198, -34.813, 4.317};
243 //elastic ppbar;
244 const std::vector<G4double> BFMM472 = {14.625, 23.413, -0.288, -9.002, 1.084};
245 //elastic pnbar;
246
247 const Particle *antinucleon;
248 const Particle *nucleon;
249
250 if (p1->isAntiNucleon()) {
251 antinucleon = p1;
252 nucleon = p2;
253 }
254 else {
255 antinucleon = p2;
256 nucleon = p1;
257 }
258
259 const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
260
261 if(iso == 2 || iso == -2){ // npbar or pnbar
262 if (iso ==2 && pLab < nbar_pbarThreshold){//nbarp low energy
263 sigma = total(p1, p2) - NNbarToAnnihilation(p1, p2);// Total minus annihilation
264 }
265 else{
266 sigma = KinematicsUtils::compute_xs(BFMM472, pLab); //pbarn
267 }
268 return sigma;
269 }
270 else { // ppbar or nnbar
271 if(p1->getType()==antiProton || p1->getType()==Proton)
272 sigma = KinematicsUtils::compute_xs(BFMM2, pLab); // ppbar case
273 else{
274 if (pLab < nbar_pbarThreshold){ //nnbar low energy case
275 sigma = total(p1, p2) - NNbarToAnnihilation(p1, p2) - NNbarCEX(p1, p2);// Total minus annihilation minus CEX
276 }
277 else{
278 sigma = KinematicsUtils::compute_xs(BFMM2, pLab); // nnbar high energy case (same as ppbar)
279 }
280 }
281 return sigma;
282 }
283 }
284
286 // this channel includes all states with lambdas, sigmas and xis and their antiparticles
287
288 //brief ppbar
289 // p pbar -> l lbar (BFMM 121)
290 // ppbar -> l lbar pi0 (BFMM 113)
291 // ppbar -> splus pim lbar || sminusbar pim l (BFMM 136)
292 // ppbar -> sminus pip lbar || splusbar l pip (BFMM 146)
293 // ppbar -> sp spbar (BFMM 139)
294 // ppbar -> sm smbar (BFMM 149)
295 // ppbar -> szero szerobar (BFMM 144)
296 // ppbar -> ximinus ximinusbar (BFMM 101)
297 // ppbar -> szero lbar || szerobar l (BFMM 143)
298 //
299 //
300 //brief npbar
301 // n pbar -> l lbar pi- (BFMM 487)
302 // n pbar -> l sbarplus || lbar sminus (BFMM 488)
303 //
304 //
305 //brief nnbar
306 // all same as for ppbar
307 //
308 //
309 //brief pnbar
310 // p nbar -> l lbar pi+ (same as BFMM 487)
311 // p nbar -> l sbarminus || lbar splus (same as BFMM 488)
312 //
313
314 const std::vector<G4double> BFMM121 = {2.379, -2.738, -1.260, -1.915, 0.430, 1.437};
315 //const G4double Eth_PPbar_LLbar = 1.437;
316 const std::vector<G4double> BFMM113 = {-0.105, 0.000, -5.099, 0.188, -0.050, 1.820};
317 //const G4double Eth_PPbar_LLbar_pi0 = 1.820;
318 const std::vector<G4double> BFMM139 = {0.142, -0.291, -1.702, -0.058, 0.001, 1.851};
319 //const G4double Eth_PPbar_SpSpbar = 1.851;
320 const std::vector<G4double> BFMM149 = {1.855, -2.238, -1.002, -1.279, 0.252, 1.896};
321 //const G4double Eth_PPbar_SmSmbar = 1.896;
322 const std::vector<G4double> BFMM136 = {1.749, -2.506, -1.222, -1.262, 0.274, 2.042};
323 //const G4double Eth_PPbar_SpLbar_pim = 2.042;
324 const std::vector<G4double> BFMM146 = {1.037, -1.437, -1.155, -0.709, 0.138, 2.065};
325 //const G4double Eth_PPbar_SmLbar_pip = 2.065;
326 const std::vector<G4double> BFMM143 = {0.652, -1.006, -1.805, -0.537, 0.121, 1.653};
327 //const G4double Eth_PPbar_Szero_Lbar = 1.653;
328
329// assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
330
331 G4double sigma=0.;
333 // iso == 2 || iso == -2 (n pbar or p nbar)
334
335 const Particle *antinucleon;
336 const Particle *nucleon;
337
338 if (p1->isAntiNucleon()) {
339 antinucleon = p1;
340 nucleon = p2;
341 }
342 else {
343 antinucleon = p2;
344 nucleon = p1;
345 }
346
347 const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
348
349 //fixed due to limited data
350 G4double BFMM144;
351 if(pLab > 1.868) BFMM144 = 0.008; //sigmazero sigmazerobar
352 else BFMM144 = 0.0;
353 G4double BFMM101;
354 if(pLab > 1.868) BFMM101 = 0.002; //xizero xizerobar
355 else BFMM101 = 0.0;
356
357 // npbar cross sections (fixed due to limited data)
358 G4double BFMM487;
359 if(pLab > 2.1) BFMM487 = 0.048; //llbar piminus
360 else BFMM487 = 0.0;
361 G4double BFMM488;
362 if(pLab > 2.0) BFMM488 = 0.139; //lsigmaminus +cc
363 else BFMM488 = 0.0;
364
365 if(iso == 2 || iso == -2){ //npbar or pnbar
366 sigma = BFMM487 + BFMM488;
367 return sigma;
368 }
369 else{ // ppbar or nnbar
370 sigma = KinematicsUtils::compute_xs(std::move(BFMM113), pLab)
371 +KinematicsUtils::compute_xs(std::move(BFMM139), pLab)+KinematicsUtils::compute_xs(std::move(BFMM136), pLab)
372 +KinematicsUtils::compute_xs(std::move(BFMM146), pLab)+KinematicsUtils::compute_xs(std::move(BFMM143), pLab)
373 +KinematicsUtils::compute_xs(std::move(BFMM121), pLab)+KinematicsUtils::compute_xs(std::move(BFMM149), pLab)
374 +BFMM144 +BFMM101; // nnbar case totally same as ppbar
375 return sigma;
376 }
377 }
378
380 //brief ppbar
381 // p pbar -> p pbar pi0 (BFMM 185)
382 // p pbar -> p nbar pi- (BFMM 188)
383 // p pbar -> n pbar pi+ (BFMM 199)
384 // p pbar -> n nbar pi0 (no data)
385 //
386 //brief npbar
387 // n pbar -> p pbar pi- (BFMM 491)
388 // n pbar -> p nbar pion (impossible)
389 // n pbar -> n pbar pi0 (BFMM 495)
390 // n pbar -> n nbar pi- (same as BFMM 188)
391 //
392 //brief nnbar
393 // n nbar -> n nbar pi0 (same as BFMM 185)
394 // n nbar -> p nbar pi- (same as BFMM 188)
395 // n nbar -> n pbar pi+ (same as BFMM 199)
396 // n nbar -> p pbar pi0 (no data)
397 //
398 //brief pnbar
399 // p nbar -> p pbar pi+ (same as BFMM 491)
400 // p nbar -> n pbar pion (impossible)
401 // p nbar -> p nbar pi0 (BFMM 495)
402 // p nbar -> n nbar pi- (same as BFMM 188)
403 //
404 //
405 // BFMM 188,199 are very close in value, 491 is larger
406
407// assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
408
409 G4double sigma=0.;
411 // iso == 2 || iso == -2 (n pbar or p nbar)
412
413 const std::vector<G4double> BFMM185 = {-0.734, 0.841, 0.905, 3.415, -2.316, 0.775};
414 //{22.781, -22.602, -0.752, -11.036, 1.548, 0.775}
415 //const G4double Eth_PPbar_PPbar_pi0 = 0.775;
416 const std::vector<G4double> BFMM188 = { -0.442, 0.501, 0.002, 3.434, -1.201, 0.798};
417 //const G4double Eth_PPbar_PNbar_pim = 0.798;
418 const std::vector<G4double> BFMM199 = {-2.025, 2.055, -2.355, 6.064, -2.004, 0.798};
419 //const G4double Eth_PPbar_NPbar_pip = 0.798;
420 const std::vector<G4double> BFMM491 = {24.125, -20.669, -1.534, -19.573, 4.493, 0.787};
421 //const G4double Eth_NPbar_PPbar_pim = 0.787;
422 const std::vector<G4double> BFMM495 = {-0.650, -0.140, -0.058, 5.166, -1.705, 0.777};
423 //const G4double Eth_NPbar_NPbar_pi0 = 0.777;
424
425 const Particle *antinucleon;
426 const Particle *nucleon;
427
428 if (p1->isAntiNucleon()) {
429 antinucleon = p1;
430 nucleon = p2;
431 }
432 else {
433 antinucleon = p2;
434 nucleon = p1;
435 }
436
437 const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
438
439 if(iso == 2 || iso == -2){ //npbar or pnbar
440 sigma = KinematicsUtils::compute_xs(std::move(BFMM491), pLab) + KinematicsUtils::compute_xs(std::move(BFMM185), pLab) + KinematicsUtils::compute_xs(std::move(BFMM188), pLab);
441 return sigma;
442 }
443 else{ // ppbar or nnbar
444 sigma = KinematicsUtils::compute_xs(std::move(BFMM199), pLab) + KinematicsUtils::compute_xs(std::move(BFMM185), pLab) + KinematicsUtils::compute_xs(std::move(BFMM188), pLab);
445 return sigma;
446 }
447 }
448
450 //brief ppbar
451 // p pbar -> p pbar pi+ pi- (BFMM 167)
452 // p pbar -> p nbar pi- pi0 (same as BFMM 490)
453 // p pbar -> n pbar pi+ pi0 (same as BFMM 490)
454 // p pbar -> n nbar pi+ pi- (BFMM 198)
455 //
456 //brief npbar
457 // n pbar -> p pbar pi- pi0 (BFMM 490)
458 // n pbar -> p nbar pi- pi- (BFMM 492)
459 // n pbar -> n pbar pi+ pi- (BFMM 494)
460 // n pbar -> n nbar pi- pi0 (same as BFMM 490)
461 //
462 //brief nnbar
463 // n nbar -> n nbar pi+ pi- (same as BFMM 167)
464 // n nbar -> p nbar pi- pi0 (same as BFMM 490)
465 // n nbar -> n pbar pi+ pi0 (same as BFMM 490)
466 // n nbar -> p pbar pi+ pi- (same as BFMM 198)
467 //
468 //brief pnbar
469 // p nbar -> p pbar pi+ pi0 (same as BFMM 490)
470 // p nbar -> n pbar pi+ pi+ (same as BFMM 492)
471 // p nbar -> p nbar pi+ pi- (same as BFMM 494)
472 // p nbar -> n nbar pi+ pi0 (same as BFMM 490)
473 //
474 //
475 // BFMM 188,199 are very close in value, 491 is larger
476
477// assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
478
479 G4double sigma=0.;
481 // iso == 2 || iso == -2 (n pbar or p nbar)
482
483 const std::vector<G4double> BFMM167 = {-6.885, 0.476, 1.206, 13.857, -5.728, 1.220};
484 //const G4double Eth_PPbar_PPbar_pip_pim = 1.220;
485 const std::vector<G4double> BFMM198 = {1.857, -21.213, -3.448, 0.827, -0.390, 1.231};
486 //const G4double Eth_PPbar_NNbar_pip_pim = 1.231;
487 const std::vector<G4double> BFMM490 = {-3.594, 0.811, 0.306, 5.108, -1.625, 1.201};
488 //const G4double Eth_PNbar_PPbar_pim_pi0 = 1.201;
489 const std::vector<G4double> BFMM492 = {-5.443, 7.254, -2.936, 8.441, -2.588, 1.221};
490 //const G4double Eth_PNbar_NPbar_pim_pim = 1.221;
491 const std::vector<G4double> BFMM494 = {21.688, -38.709, -2.062, -17.783, 3.895, 1.221};
492 //const G4double Eth_NPbar_NPbar_pip_pim = 1.221;
493
494 const Particle *antinucleon;
495 const Particle *nucleon;
496
497 if (p1->isAntiNucleon()) {
498 antinucleon = p1;
499 nucleon = p2;
500 }
501 else {
502 antinucleon = p2;
503 nucleon = p1;
504 }
505
506 const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
507
508 if(iso == 2 || iso == -2){ // pnbar or npbar
509 sigma = KinematicsUtils::compute_xs(BFMM490, pLab) + KinematicsUtils::compute_xs(BFMM490, pLab) + KinematicsUtils::compute_xs(std::move(BFMM167), pLab) + KinematicsUtils::compute_xs(std::move(BFMM198), pLab);
510 return sigma;
511 }
512 else{ // ppbar or nnbar
513 sigma = KinematicsUtils::compute_xs(BFMM490, pLab) + KinematicsUtils::compute_xs(BFMM490, pLab) + KinematicsUtils::compute_xs(std::move(BFMM492), pLab) + KinematicsUtils::compute_xs(std::move(BFMM494), pLab);
514 return sigma;
515 }
516 }
517
519 //brief ppbar
520 // p pbar -> p pbar pi+ pi- pi0 (BFMM 161)
521 // p pbar -> p nbar 2pi- pi+ (BFMM 169)
522 // p pbar -> n pbar 2pi+ pi- (BFMM 201)
523 // p pbar -> n nbar pi+ pi- pi0 (BFMM 197)
524 //
525 //brief npbar
526 // n pbar -> p pbar 2pi- pi+ (same as BFMM 169)
527 // n pbar -> p nbar 2pi- pi0 (same as BFMM 197)
528 // n pbar -> n pbar pi+ pi- pi0 (same as BFMM 161)
529 // n pbar -> n nbar 2pi- pi+ (same as BFMM 169)
530 //
531 //brief nnbar
532 // n nbar -> n nbar pi+ pi- pi0 (same as BFMM 161)
533 // n nbar -> p nbar 2pi- pi+ (same as BFMM 169)
534 // n nbar -> n pbar 2pi+ pi- (same as BFMM 201)
535 // n nbar -> p pbar pi+ pi- pi0 (same as BFMM 197)
536 //
537 //brief pnbar
538 // p nbar -> p pbar 2pi+ pi- (same as BFMM 169)
539 // p nbar -> n pbar 2pi+ pi0 (same as BFMM 197)
540 // p nbar -> p nbar pi+ pi- pi0 (same as BFMM 161)
541 // p nbar -> n nbar 2pi+ pi- (same as BFMM 169)
542 //
543
544// assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
545
546 G4double sigma=0.;
548 // iso == 2 || iso == -2 (n pbar or p nbar)
549
550 const std::vector<G4double> BFMM161 = {-6.434, 1.351, -5.185, 7.754, -1.692, 1.604};
551 //const G4double Eth_PPbar_PPbar_pip_pim_pi0 = 1.604;
552 const std::vector<G4double> BFMM169 = {3.696, -5.356, -0.053, 1.941, -0.432, 1.624};
553 //const G4double Eth_PPbar_PNbar_2pim_pip = 1.624;
554 const std::vector<G4double> BFMM201 = {-1.070, -0.636, -0.009, 2.335, -0.499, 1.624};
555 //const G4double Eth_PPbar_NPbar_2pip_pim = 1.624;
556 const std::vector<G4double> BFMM197 = {1.857, -21.213, -3.448, 0.827, -0.390, 1.616};
557 //const G4double Eth_PPbar_NNbar_pip_pim_pi0 = 1.616;
558
559 const Particle *antinucleon;
560 const Particle *nucleon;
561
562 if (p1->isAntiNucleon()) {
563 antinucleon = p1;
564 nucleon = p2;
565 }
566 else {
567 antinucleon = p2;
568 nucleon = p1;
569 }
570
571 const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
572
573 if(iso == 2 || iso == -2){ // pnbar or npbar
574 sigma = KinematicsUtils::compute_xs(BFMM169, pLab) + KinematicsUtils::compute_xs(BFMM169, pLab) + KinematicsUtils::compute_xs(std::move(BFMM197), pLab) + KinematicsUtils::compute_xs(std::move(BFMM161), pLab);
575 return sigma;
576 }
577 else{ // ppbar or nnbar
578 sigma = KinematicsUtils::compute_xs(std::move(BFMM161), pLab) + KinematicsUtils::compute_xs(std::move(BFMM169), pLab) + KinematicsUtils::compute_xs(std::move(BFMM197), pLab) + KinematicsUtils::compute_xs(std::move(BFMM201), pLab);
579 return sigma;
580 }
581 }
582
584 //brief ppbar
585 /*
586 This part only contains total annihilation xs, the choice of a particular final state
587 will be done in the channel file.
588 As long as we only have good data for ppbar, we assume that for npbar, pnbar and nnbar the xs
589 will be the same, but in order to compensate for the Coulombic effect the ppbar annihilation xs
590 is multiplied by the pnbar total xs and divided by the ppbar total xs.
591 */
592
593// assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
594
595 G4double sigma=0.;
597 // iso == 2 || iso == -2 (n pbar or p nbar)
598
599 const std::vector<G4double> BFMM6 = {66.098, 0.153, -4.576, -38.319, 6.625}; //ppbar annihilation xs
600 const std::vector<G4double> BFMM1 = {119.066, 6.251, -0.006, -60.046, 11.958}; //ppbar total xs
601 const std::vector<G4double> BFMM471 = {108.104, 15.708, 0.832, -54.632, -6.958}; //npbar total xs
602
603 const Particle *antinucleon;
604 const Particle *nucleon;
605
606 if (p1->isAntiNucleon()) {
607 antinucleon = p1;
608 nucleon = p2;
609 }
610 else {
611 antinucleon = p2;
612 nucleon = p1;
613 }
614
615 const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
617 const G4double hbar_c = 197.326968; // MeV.fm
618 const G4double Ek_cm = std::sqrt(mu*mu + std::pow(KinematicsUtils::momentumInCM(antinucleon,nucleon),2)) - mu;
619 const G4double k = std::sqrt(2*mu*Ek_cm)/(hbar_c);
620 const G4double K = std::sqrt(std::pow(k,2)+2*mu*85/std::pow(hbar_c,2)); //Strong Interaction Potential (MeV)
621 const G4double x_m = (k*0.97); //Nuclear contact radius (fm)
622 const G4double X_m = (K*0.97);
623 const G4double T_0 = 4*K*k/(std::pow(K+k,2));
624 const G4double v_1 = std::pow(x_m,2)/(1+std::pow(x_m,2));
625 const G4double v_1_prime = (1/std::pow(x_m,2))+std::pow(1-1/std::pow(x_m,2),2);
626 const G4double T_1 = (4*x_m*X_m*v_1)/(std::pow(X_m,2)+(2*x_m*X_m+std::pow(x_m,2)*v_1_prime)*v_1);
627 const G4double v_2 = std::pow(x_m,4)/(9+3*std::pow(x_m,2)+std::pow(x_m,4));
628 const G4double v_2_prime = std::pow(1-(6/std::pow(x_m,2)),2) + std::pow((6/std::pow(x_m,3))-(3/std::pow(x_m,2)),2);
629 const G4double T_2 = (4*x_m*X_m*v_2)/(std::pow(X_m,2)+(2*x_m*X_m+std::pow(x_m,2)*v_2_prime)*v_2);
630 const G4double v_3 = std::pow(x_m,6)/(225+45*std::pow(x_m,2)+6*std::pow(x_m,4)+std::pow(x_m,6));
631 const G4double v_3_prime = (1 - (21/std::pow(x_m,2)) + (45/std::pow(x_m,4))) + std::pow((45/std::pow(x_m,3))-(6/x_m),2);
632 const G4double T_3 = (4*x_m*X_m*v_3)/(std::pow(X_m,2)+(2*x_m*X_m+std::pow(x_m,2)*v_3_prime)*v_3);
633 G4double sigma_nbar_low = (Math::pi/std::pow(k,2)) * (T_0 + 3*T_1 + 5*T_2 + 7*T_3) * 10 ; //GeV
634
635 if(iso == 2 || iso == -2){ // pnbar or npbar
636 if (iso ==2 && pLab < nbar_pbarThreshold) { //nbarp != pbarn at low momenta
637 return sigma_nbar_low;
638 }
639 else { //pbarn
640 sigma = KinematicsUtils::compute_xs(std::move(BFMM6), pLab)*KinematicsUtils::compute_xs(std::move(BFMM471), pLab)/KinematicsUtils::compute_xs(std::move(BFMM1), pLab);
641 return sigma;
642 }
643 }
644 else if(p1->getType()==antiProton || p2->getType()==Proton){ // ppbar case
645 sigma = KinematicsUtils::compute_xs(std::move(BFMM6), pLab);
646 return sigma;
647 }
648 else{ // nnbar case
649 sigma = KinematicsUtils::compute_xs(std::move(BFMM6), pLab)*KinematicsUtils::compute_xs(std::move(BFMM471), pLab)/KinematicsUtils::compute_xs(std::move(BFMM1), pLab);
650 return sigma;
651 }
652 }
653
654} // namespace G4INCL
655
Multipion, mesonic Resonances, strange cross sections and antinucleon as projectile.
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
virtual G4double NNbarElastic(Particle const *const p1, Particle const *const p2)
Nucleon-AntiNucleon to Nucleon-AntiNucleon cross sections.
const HornerC5 s12pmHC
Horner coefficients for s12pm.
const HornerC8 s01ppHC
Horner coefficients for s01pp.
const HornerC6 s02pmHC
Horner coefficients for s02pm.
virtual G4double NNbarCEX(Particle const *const p1, Particle const *const p2)
const HornerC4 s11pmHC
Horner coefficients for s11pm.
virtual G4double NNbarToAnnihilation(Particle const *const p1, Particle const *const p2)
Nucleon-AntiNucleon total annihilation cross sections.
const HornerC4 s12zzHC
Horner coefficients for s12zz.
virtual G4double elastic(Particle const *const p1, Particle const *const p2)
old elastic particle-particle cross section
virtual G4double NNbarToLLbar(Particle const *const p1, Particle const *const p2)
const HornerC4 s12mzHC
Horner coefficients for s12mz.
virtual G4double NNbarToNNbarpi(Particle const *const p1, Particle const *const p2)
Nucleon-AntiNucleon to Nucleon-AntiNucleon + pions cross sections.
const HornerC4 s02pzHC
Horner coefficients for s02pz.
static const G4int nMaxPiNN
Maximum number of outgoing pions in NN collisions.
virtual G4double NNbarToNNbar3pi(Particle const *const p1, Particle const *const p2)
const HornerC3 s12ppHC
Horner coefficients for s12pp.
const HornerC4 s01pzHC
Horner coefficients for s01pz.
const HornerC7 s11pzHC
Horner coefficients for s11pz.
virtual G4double NNbarToNNbar2pi(Particle const *const p1, Particle const *const p2)
static const G4int nMaxPiPiN
Maximum number of outgoing pions in piN collisions.
virtual G4double total(Particle const *const p1, Particle const *const p2)
second new total particle-particle cross section
virtual G4double etaNElastic(Particle const *const p1, Particle const *const p2)
Cross sections for mesonic resonance absorption on nucleon - elastic Channel.
virtual G4double etaNToPiPiN(Particle const *const p1, Particle const *const p2)
Cross sections for mesonic resonance absorption on nucleon - pipiN Channel.
virtual G4double omegaNInelastic(Particle const *const p1, Particle const *const p2)
Cross sections for mesonic resonance absorption on nucleon - inelastic Channel.
virtual G4double etaPrimeNToPiN(Particle const *const p1, Particle const *const p2)
Cross section for EtaPrimeN->PiN.
virtual G4double etaNToPiN(Particle const *const p1, Particle const *const p2)
Cross sections for mesonic resonance absorption on nucleon - piN Channel.
G4double piNTot(Particle const *const p1, Particle const *const p2)
virtual G4double elastic(Particle const *const p1, Particle const *const p2)
Elastic particle-particle cross section.
G4double NNTot(Particle const *const part1, Particle const *const part2)
Internal implementation of the NN total cross section.
virtual G4double NDeltaToNN(Particle const *const p1, Particle const *const p2)
Cross section for NDelta->NN.
virtual G4double NKbToNKb2pi(Particle const *const p1, Particle const *const p2)
virtual G4double etaNToSK(Particle const *const p1, Particle const *const p2)
virtual G4double NKbToNKbpi(Particle const *const p1, Particle const *const p2)
virtual G4double NKbToL2pi(Particle const *const p1, Particle const *const p2)
virtual G4double NKbelastic(Particle const *const p1, Particle const *const p2)
virtual G4double NLToNS(Particle const *const p1, Particle const *const p2)
Nucleon-Hyperon quasi-elastic cross sections.
virtual G4double NKToNK2pi(Particle const *const p1, Particle const *const p2)
virtual G4double NDeltaToDeltaSK(Particle const *const p1, Particle const *const p2)
virtual G4double NKToNKpi(Particle const *const p1, Particle const *const p2)
virtual G4double NDeltaToNSK(Particle const *const p1, Particle const *const p2)
virtual G4double NKelastic(Particle const *const p1, Particle const *const p2)
virtual G4double NKbToLpi(Particle const *const p1, Particle const *const p2)
virtual G4double NSToNS(Particle const *const p1, Particle const *const p2)
virtual G4double NSToNL(Particle const *const p1, Particle const *const p2)
virtual G4double etaNToLK(Particle const *const p1, Particle const *const p2)
eta-Nucleon cross sections
virtual G4double NKbToS2pi(Particle const *const p1, Particle const *const p2)
virtual G4double NKbToSpi(Particle const *const p1, Particle const *const p2)
virtual G4double NKToNK(Particle const *const p1, Particle const *const p2)
Nucleon-Kaon cross sections.
virtual G4double NDeltaToNNKKb(Particle const *const p1, Particle const *const p2)
virtual G4double NDeltaToDeltaLK(Particle const *const p1, Particle const *const p2)
virtual G4double NYelastic(Particle const *const p1, Particle const *const p2)
elastic scattering for Nucleon-Strange Particles cross sections
virtual G4double NDeltaToNLK(Particle const *const p1, Particle const *const p2)
Nucleon-Delta to Stange particles cross sections.
virtual G4double NKbToNKb(Particle const *const p1, Particle const *const p2)
Nucleon-antiKaon cross sections.
G4bool isLambda() const
Is this a Lambda?
G4bool isEtaPrime() const
Is this an etaprime?
G4bool isOmega() const
Is this an omega?
G4bool isSigma() const
Is this a Sigma?
G4bool isAntiNucleon() const
Is this an antinucleon?
G4bool isEta() const
Is this an eta?
G4bool isPion() const
Is this a pion?
G4bool isAntiKaon() const
Is this an antiKaon?
G4INCL::ParticleType getType() const
G4bool isKaon() const
Is this a Kaon?
G4bool isDelta() const
Is it a Delta?
G4bool isHyperon() const
Is this an Hyperon?
G4bool isNucleon() const
G4double compute_xs(const std::vector< G4double > coefficients, const G4double pLab)
G4double momentumInLab(Particle const *const p1, Particle const *const p2)
gives the momentum in the lab frame of two particles.
G4double momentumInCM(Particle const *const p1, Particle const *const p2)
gives the momentum in the CM frame of two particles.
const G4double pi
G4double getRealMass(const G4INCL::ParticleType t)
Get particle mass (in MeV/c^2).
const G4double effectiveNucleonMass2
G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
const G4double effectiveNucleonMass
const G4double nbar_pbarThreshold
static G4double eval(const G4double pLab, const G4double oneOverThreshold, HornerCoefficients< N > const &coeffs)
static G4double eval(const G4double x, HornerCoefficients< N > const &coeffs)