Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/inclxx/incl_physics/src/G4INCLCrossSectionsAntiparticles.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 
 45 #include "G4INCLCrossSectionsAntiparticles.hh"
 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;
 56             const G4double ekin=std::sqrt(ParticleTable::effectiveNucleonMass2+pMeV*pMeV)-ParticleTable::effectiveNucleonMass;
 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     
 63     const G4int CrossSectionsAntiparticles::nMaxPiNN = 4;
 64     const G4int CrossSectionsAntiparticles::nMaxPiPiN = 4;
 65 
 66     CrossSectionsAntiparticles::CrossSectionsAntiparticles() :
 67     s11pzHC(-2.228000000000294018,8.7560000000005723725,-0.61000000000023239325,-5.4139999999999780324,3.3338333333333348023,-0.75835000000000022049,0.060623611111111114688),
 68     s01ppHC(2.0570000000126518344,-6.029000000012135826,36.768500000002462784,-45.275666666666553533,25.112666666666611953,-7.2174166666666639187,1.0478875000000000275,-0.060804365079365080846),
 69     s01pzHC(0.18030000000000441851,7.8700999999999953598,-4.0548999999999990425,0.555199999999999959),
 70     s11pmHC(0.20590000000000031866,3.3450999999999993936,-1.4401999999999997825,0.17076666666666664973),
 71     s12pmHC(-0.77235999999999901328,4.2626599999999991117,-1.9008899999999997323,0.30192266666666663379,-0.012270833333333331986),
 72     s12ppHC(-0.75724999999999975664,2.0934399999999998565,-0.3803099999999999814),
 73     s12zzHC(-0.89599999999996965072,7.882999999999978632,-7.1049999999999961928,1.884333333333333089),
 74     s02pzHC(-1.0579999999999967036,11.113999999999994089,-8.5259999999999990196,2.0051666666666666525),
 75     s02pmHC(2.4009000000012553286,-7.7680000000013376183,20.619000000000433505,-16.429666666666723928,5.2525708333333363472,-0.58969166666666670206),
 76     s12mzHC(-0.21858699999999976269,1.9148999999999999722,-0.31727500000000001065,-0.027695000000000000486)
 77     {
 78     }
 79 
 80   /// \brief redefining previous cross sections
 81 
 82     G4double CrossSectionsAntiparticles::total(Particle const * const p1, Particle const * const p2) {
 83         G4double inelastic;
 84         if ((p1->isNucleon() && p2->isAntiNucleon()) || (p1->isAntiNucleon() && p2->isNucleon()))
 85             inelastic = NNbarCEX(p1, p2) + NNbarToNNbarpi(p1, p2) + NNbarToNNbar2pi(p1, p2) + NNbarToNNbar3pi(p1, p2) + NNbarToAnnihilation(p1, p2) + NNbarToLLbar(p1, p2);   
 86         else if(p1->isNucleon() && p2->isNucleon()) {
 87             return CrossSectionsMultiPions::NNTot(p1, p2);
 88         } else if((p1->isNucleon() && p2->isDelta()) ||
 89                   (p1->isDelta() && p2->isNucleon())) {
 90             inelastic = CrossSectionsMultiPions::NDeltaToNN(p1, p2) + NDeltaToNLK(p1, p2) + NDeltaToNSK(p1, p2) + NDeltaToDeltaLK(p1, p2) + NDeltaToDeltaSK(p1, p2) + NDeltaToNNKKb(p1, p2);
 91         } else if((p1->isNucleon() && p2->isPion()) ||
 92                   (p1->isPion() && p2->isNucleon())) {
 93             return CrossSectionsMultiPions::piNTot(p1,p2);
 94         } else if((p1->isNucleon() && p2->isEta()) ||
 95                   (p1->isEta() && p2->isNucleon())) {
 96             inelastic = CrossSectionsMultiPionsAndResonances::etaNToPiN(p1,p2) + CrossSectionsMultiPionsAndResonances::etaNToPiPiN(p1,p2);
 97         } else if((p1->isNucleon() && p2->isOmega()) ||
 98                   (p1->isOmega() && p2->isNucleon())) {
 99             inelastic = CrossSectionsMultiPionsAndResonances::omegaNInelastic(p1,p2);
100         } else if((p1->isNucleon() && p2->isEtaPrime()) ||
101                   (p1->isEtaPrime() && p2->isNucleon())) {
102             inelastic = CrossSectionsMultiPionsAndResonances::etaPrimeNToPiN(p1,p2);
103         } else if((p1->isNucleon() && p2->isLambda()) ||
104                   (p1->isLambda() && p2->isNucleon())) {
105             inelastic = CrossSectionsStrangeness::NLToNS(p1,p2);
106         } else if((p1->isNucleon() && p2->isSigma()) ||
107                   (p1->isSigma() && p2->isNucleon())) {
108             inelastic = CrossSectionsStrangeness::NSToNL(p1,p2) + CrossSectionsStrangeness::NSToNS(p1,p2);
109         } else if((p1->isNucleon() && p2->isKaon()) ||
110                   (p1->isKaon() && p2->isNucleon())) {
111             inelastic = CrossSectionsStrangeness::NKToNK(p1,p2) + CrossSectionsStrangeness::NKToNKpi(p1,p2) + CrossSectionsStrangeness::NKToNK2pi(p1,p2);
112         } else if((p1->isNucleon() && p2->isAntiKaon()) ||
113                   (p1->isAntiKaon() && p2->isNucleon())) {
114             inelastic = CrossSectionsStrangeness::NKbToLpi(p1,p2) 
115             + CrossSectionsStrangeness::NKbToSpi(p1,p2) + CrossSectionsStrangeness::NKbToL2pi(p1,p2) 
116             + CrossSectionsStrangeness::NKbToS2pi(p1,p2) + CrossSectionsStrangeness::NKbToNKb(p1,p2) 
117             + CrossSectionsStrangeness::NKbToNKbpi(p1,p2) + CrossSectionsStrangeness::NKbToNKb2pi(p1,p2);
118         } else {
119             inelastic = 0.;
120         }
121         return inelastic + elastic(p1, p2);
122     }    
123 
124     // without NNbar!
125     G4double CrossSectionsAntiparticles::elastic(Particle const * const p1, Particle const * const p2) {
126         if ((p1->isNucleon() && p2->isAntiNucleon()) || (p1->isAntiNucleon() && p2->isNucleon()))
127             return NNbarElastic(p1, p2);
128         if((p1->isNucleon()||p1->isDelta()) && (p2->isNucleon()||p2->isDelta())){ // N-N, N-Delta, Delta-Delta
129             return CrossSectionsMultiPions::elastic(p1, p2);
130         }
131         else if ((p1->isNucleon() && p2->isPion()) || (p2->isNucleon() && p1->isPion())){
132             return CrossSectionsMultiPions::elastic(p1, p2);
133         }
134         else if ((p1->isNucleon() && p2->isEta()) || (p2->isNucleon() && p1->isEta())){
135             return CrossSectionsMultiPionsAndResonances::etaNElastic(p1, p2);
136         }
137         else if ((p1->isNucleon() && p2->isHyperon()) || (p2->isNucleon() && p1->isHyperon())){
138             return CrossSectionsStrangeness::NYelastic(p1, p2);
139         }
140         else if ((p1->isNucleon() && p2->isKaon()) || (p2->isNucleon() && p1->isKaon())){
141             return CrossSectionsStrangeness::NKelastic(p1, p2);
142         }
143         else if ((p1->isNucleon() && p2->isAntiKaon()) || (p2->isNucleon() && p1->isAntiKaon())){
144             return CrossSectionsStrangeness::NKbelastic(p1, p2);
145         }
146         else {
147             return 0.0;
148         }
149     }
150 
151     G4double CrossSectionsAntiparticles::NNbarCEX(Particle const * const p1, Particle const * const p2) {
152         //brief ppbar
153         // p pbar -> n nbar (BFMM 204)
154         //
155         //brief nnbar
156         // n nbar -> p pbar (same as BFMM 204, but no threshold)
157         //
158 
159 // assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
160         
161         G4double sigma=0.;
162         const G4int iso=ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType());
163         // iso == 2 || iso == -2 (n pbar or p nbar)
164 
165         const std::vector<G4double> BFMM204 = {7.549, -0.041, -2.959, -6.835, 1.629, 0.114};
166         //{6.875, 0.590, -0.003, -6.629, 1.532, 0.114}
167         //const G4double Eth_PPbar_NNbar = 0.114;
168         const std::vector<G4double> BFMM204nn = {7.549, -0.041, -2.959, -6.835, 1.629};
169         //const G4double Eth_NNbar_PPbar = 0.0;
170 
171         const Particle *antinucleon;
172         const Particle *nucleon;
173         
174         if (p1->isAntiNucleon()) {
175             antinucleon = p1;
176             nucleon = p2;
177         }
178         else {
179             antinucleon = p2;
180             nucleon = p1;
181         }
182         
183         const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
184         
185         if(iso == 2 || iso == -2){ //npbar or pnbar
186             sigma = 0.0;
187             return sigma;
188         }
189         else{ // ppbar or nnbar
190             if(p1->getType()==antiProton || p1->getType()==Proton)
191                 sigma = KinematicsUtils::compute_xs(std::move(BFMM204), pLab); // ppbar case
192             else
193                 sigma = KinematicsUtils::compute_xs(std::move(BFMM204nn), pLab); // nnbar case
194             return sigma;
195         }
196     }
197 
198     G4double CrossSectionsAntiparticles::NNbarElastic(Particle const * const p1, Particle const * const p2) {
199         //brief ppbar
200         // p pbar -> p pbar (BFMM 2)
201         //
202         //brief npbar
203         // n pbar -> n pbar (BFMM 472)
204         //
205         //brief nnbar
206         // n nbar -> n nbar (same as BFMM 2)
207         //
208         //brief pnbar 
209         // p nbar -> p nbar (same as BFMM 472)
210         //
211 
212 // assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
213         
214         G4double sigma=0.;
215         const G4int iso=ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType());
216         // iso == 2 || iso == -2 (n pbar or p nbar)
217 
218         const std::vector<G4double> BFMM2 = {110.496, -65.605, -0.198, -34.813, 4.317};
219         //elastic ppbar;
220         const std::vector<G4double> BFMM472 = {14.625, 23.413, -0.288, -9.002, 1.084};
221         //elastic pnbar;
222 
223         const Particle *antinucleon;
224         const Particle *nucleon;
225         
226         if (p1->isAntiNucleon()) {
227             antinucleon = p1;
228             nucleon = p2;
229         }
230         else {
231             antinucleon = p2;
232             nucleon = p1;
233         }
234         
235         const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
236         
237         if(iso == 2 || iso == -2){ // npbar or pnbar
238             sigma = KinematicsUtils::compute_xs(std::move(BFMM472), pLab);
239             return sigma;
240         }
241         else { // ppbar or nnbar
242             sigma = KinematicsUtils::compute_xs(std::move(BFMM2), pLab);
243             return sigma;
244         }
245     }
246 
247     G4double CrossSectionsAntiparticles::NNbarToLLbar(Particle const * const p1, Particle const * const p2) {
248         // this channel includes all states with lambdas, sigmas and xis and their antiparticles
249 
250         //brief ppbar
251         // p pbar -> l lbar (BFMM 121)
252         // ppbar -> l lbar pi0 (BFMM 113)
253         // ppbar -> splus pim lbar || sminusbar pim l (BFMM 136)
254         // ppbar -> sminus pip lbar || splusbar l pip (BFMM 146)
255         // ppbar -> sp spbar (BFMM 139)
256         // ppbar -> sm smbar (BFMM 149) 
257         // ppbar -> szero szerobar (BFMM 144)
258         // ppbar -> ximinus ximinusbar (BFMM 101)
259         // ppbar -> szero lbar || szerobar l (BFMM 143)
260         //
261         //
262         //brief npbar
263         // n pbar -> l lbar pi- (BFMM 487)
264         // n pbar -> l sbarplus || lbar sminus (BFMM 488)
265         //
266         //
267         //brief nnbar
268         // all same as for ppbar
269         //
270         //
271         //brief pnbar
272         // p nbar -> l lbar pi+ (same as BFMM 487)
273         // p nbar -> l sbarminus || lbar splus (same as BFMM 488)
274         //
275 
276         const std::vector<G4double> BFMM121 = {2.379, -2.738, -1.260, -1.915, 0.430, 1.437};
277         //const G4double Eth_PPbar_LLbar = 1.437;
278         const std::vector<G4double> BFMM113 = {-0.105, 0.000, -5.099, 0.188, -0.050, 1.820};
279         //const G4double Eth_PPbar_LLbar_pi0 = 1.820;
280         const std::vector<G4double> BFMM139 = {0.142, -0.291, -1.702, -0.058, 0.001, 1.851};
281         //const G4double Eth_PPbar_SpSpbar = 1.851;
282         const std::vector<G4double> BFMM149 = {1.855, -2.238, -1.002, -1.279, 0.252, 1.896};
283         //const G4double Eth_PPbar_SmSmbar = 1.896;
284         const std::vector<G4double> BFMM136 = {1.749, -2.506, -1.222, -1.262, 0.274, 2.042};
285         //const G4double Eth_PPbar_SpLbar_pim = 2.042;
286         const std::vector<G4double> BFMM146 = {1.037, -1.437, -1.155, -0.709, 0.138, 2.065};
287         //const G4double Eth_PPbar_SmLbar_pip = 2.065;
288         const std::vector<G4double> BFMM143 = {0.652, -1.006, -1.805, -0.537, 0.121, 1.653};
289         //const G4double Eth_PPbar_Szero_Lbar = 1.653;
290 
291 // assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
292         
293         G4double sigma=0.;
294         const G4int iso=ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType());
295         // iso == 2 || iso == -2 (n pbar or p nbar)
296 
297         const Particle *antinucleon;
298         const Particle *nucleon;
299         
300         if (p1->isAntiNucleon()) {
301             antinucleon = p1;
302             nucleon = p2;
303         }
304         else {
305             antinucleon = p2;
306             nucleon = p1;
307         }
308         
309         const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
310 
311         //fixed due to limited data
312         G4double BFMM144; 
313         if(pLab > 1.868) BFMM144 = 0.008; //sigmazero sigmazerobar
314         else BFMM144 = 0.0;
315         G4double BFMM101; 
316         if(pLab > 1.868) BFMM101 = 0.002; //xizero xizerobar
317         else BFMM101 = 0.0;
318 
319         // npbar cross sections (fixed due to limited data)
320         G4double BFMM487;
321         if(pLab > 2.1) BFMM487 = 0.048; //llbar piminus
322         else BFMM487 = 0.0;
323         G4double BFMM488;
324         if(pLab > 2.0) BFMM488 = 0.139; //lsigmaminus +cc
325         else BFMM488 = 0.0;
326         
327         if(iso == 2 || iso == -2){ //npbar or pnbar
328             sigma = BFMM487 + BFMM488;
329             return sigma;
330         }
331         else{ // ppbar or nnbar
332             sigma = KinematicsUtils::compute_xs(std::move(BFMM113), pLab) 
333             +KinematicsUtils::compute_xs(std::move(BFMM139), pLab)+KinematicsUtils::compute_xs(std::move(BFMM136), pLab)
334             +KinematicsUtils::compute_xs(std::move(BFMM146), pLab)+KinematicsUtils::compute_xs(std::move(BFMM143), pLab) 
335             +KinematicsUtils::compute_xs(std::move(BFMM121), pLab)+KinematicsUtils::compute_xs(std::move(BFMM149), pLab)
336             +BFMM144 +BFMM101; // nnbar case totally same as ppbar
337             return sigma;
338         }
339     }
340 
341     G4double CrossSectionsAntiparticles::NNbarToNNbarpi(Particle const * const p1, Particle const * const p2) {
342         //brief ppbar
343         // p pbar -> p pbar pi0 (BFMM 185)
344         // p pbar -> p nbar pi- (BFMM 188)
345         // p pbar -> n pbar pi+ (BFMM 199)
346         // p pbar -> n nbar pi0 (no data)
347         //
348         //brief npbar
349         // n pbar -> p pbar pi- (BFMM 491)
350         // n pbar -> p nbar pion (impossible)
351         // n pbar -> n pbar pi0 (BFMM 495)
352         // n pbar -> n nbar pi- (same as BFMM 188)
353         //
354         //brief nnbar
355         // n nbar -> n nbar pi0 (same as BFMM 185)
356         // n nbar -> p nbar pi- (same as BFMM 188)
357         // n nbar -> n pbar pi+ (same as BFMM 199)
358         // n nbar -> p pbar pi0 (no data)
359         //
360         //brief pnbar 
361         // p nbar -> p pbar pi+ (same as BFMM 491)
362         // p nbar -> n pbar pion (impossible)
363         // p nbar -> p nbar pi0 (BFMM 495)
364         // p nbar -> n nbar pi- (same as BFMM 188)
365         //
366         //
367         // BFMM 188,199 are very close in value, 491 is larger
368 
369 // assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
370         
371         G4double sigma=0.;
372         const G4int iso=ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType());
373         // iso == 2 || iso == -2 (n pbar or p nbar)
374 
375         const std::vector<G4double> BFMM185 = {-0.734, 0.841, 0.905, 3.415, -2.316, 0.775};
376         //{22.781, -22.602, -0.752, -11.036, 1.548, 0.775}
377         //const G4double Eth_PPbar_PPbar_pi0 = 0.775;
378         const std::vector<G4double> BFMM188 = { -0.442, 0.501, 0.002, 3.434, -1.201, 0.798};
379         //const G4double Eth_PPbar_PNbar_pim = 0.798;
380         const std::vector<G4double> BFMM199 = {-2.025, 2.055, -2.355, 6.064, -2.004, 0.798};
381         //const G4double Eth_PPbar_NPbar_pip = 0.798;
382         const std::vector<G4double> BFMM491 = {24.125, -20.669, -1.534, -19.573, 4.493, 0.787};
383         //const G4double Eth_NPbar_PPbar_pim = 0.787; 
384         const std::vector<G4double> BFMM495 = {-0.650, -0.140, -0.058, 5.166, -1.705, 0.777};
385         //const G4double Eth_NPbar_NPbar_pi0 = 0.777;
386 
387         const Particle *antinucleon;
388         const Particle *nucleon;
389         
390         if (p1->isAntiNucleon()) {
391             antinucleon = p1;
392             nucleon = p2;
393         }
394         else {
395             antinucleon = p2;
396             nucleon = p1;
397         }
398         
399         const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
400         
401         if(iso == 2 || iso == -2){ //npbar or pnbar
402             sigma = KinematicsUtils::compute_xs(std::move(BFMM491), pLab) + KinematicsUtils::compute_xs(std::move(BFMM185), pLab) + KinematicsUtils::compute_xs(std::move(BFMM188), pLab);
403             return sigma;
404         }
405         else{ // ppbar or nnbar
406             sigma = KinematicsUtils::compute_xs(std::move(BFMM199), pLab) + KinematicsUtils::compute_xs(std::move(BFMM185), pLab) + KinematicsUtils::compute_xs(std::move(BFMM188), pLab);
407             return sigma;
408         }
409     }
410 
411     G4double CrossSectionsAntiparticles::NNbarToNNbar2pi(Particle const * const p1, Particle const * const p2) {
412         //brief ppbar
413         // p pbar -> p pbar pi+ pi- (BFMM 167)
414         // p pbar -> p nbar pi- pi0 (same as BFMM 490)
415         // p pbar -> n pbar pi+ pi0 (same as BFMM 490)
416         // p pbar -> n nbar pi+ pi- (BFMM 198)
417         //
418         //brief npbar
419         // n pbar -> p pbar pi- pi0 (BFMM 490)
420         // n pbar -> p nbar pi- pi- (BFMM 492)
421         // n pbar -> n pbar pi+ pi- (BFMM 494)
422         // n pbar -> n nbar pi- pi0 (same as BFMM 490)
423         //
424         //brief nnbar
425         // n nbar -> n nbar pi+ pi- (same as BFMM 167)
426         // n nbar -> p nbar pi- pi0 (same as BFMM 490)
427         // n nbar -> n pbar pi+ pi0 (same as BFMM 490)
428         // n nbar -> p pbar pi+ pi- (same as BFMM 198)
429         //
430         //brief pnbar
431         // p nbar -> p pbar pi+ pi0 (same as BFMM 490)
432         // p nbar -> n pbar pi+ pi+ (same as BFMM 492)
433         // p nbar -> p nbar pi+ pi- (same as BFMM 494)
434         // p nbar -> n nbar pi+ pi0 (same as BFMM 490)
435         //
436         //
437         // BFMM 188,199 are very close in value, 491 is larger
438 
439 // assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
440         
441         G4double sigma=0.;
442         const G4int iso=ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType());
443         // iso == 2 || iso == -2 (n pbar or p nbar)
444 
445         const std::vector<G4double> BFMM167 = {-6.885, 0.476, 1.206, 13.857, -5.728, 1.220};
446         //const G4double Eth_PPbar_PPbar_pip_pim = 1.220;
447         const std::vector<G4double> BFMM198 = {1.857, -21.213, -3.448, 0.827, -0.390, 1.231};
448         //const G4double Eth_PPbar_NNbar_pip_pim = 1.231;
449         const std::vector<G4double> BFMM490 = {-3.594, 0.811, 0.306, 5.108, -1.625, 1.201};
450         //const G4double Eth_PNbar_PPbar_pim_pi0 = 1.201;
451         const std::vector<G4double> BFMM492 = {-5.443, 7.254, -2.936, 8.441, -2.588, 1.221};
452         //const G4double Eth_PNbar_NPbar_pim_pim = 1.221;
453         const std::vector<G4double> BFMM494 = {21.688, -38.709, -2.062, -17.783, 3.895, 1.221};
454         //const G4double Eth_NPbar_NPbar_pip_pim = 1.221; 
455 
456         const Particle *antinucleon;
457         const Particle *nucleon;
458         
459         if (p1->isAntiNucleon()) {
460             antinucleon = p1;
461             nucleon = p2;
462         }
463         else {
464             antinucleon = p2;
465             nucleon = p1;
466         }
467         
468         const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
469         
470         if(iso == 2 || iso == -2){ // pnbar or npbar
471             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);
472             return sigma;
473         }
474         else{ // ppbar or nnbar
475             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);
476             return sigma;
477         }
478     }
479 
480     G4double CrossSectionsAntiparticles::NNbarToNNbar3pi(Particle const * const p1, Particle const * const p2) {
481         //brief ppbar
482         // p pbar -> p pbar pi+ pi- pi0 (BFMM 161)
483         // p pbar -> p nbar 2pi- pi+ (BFMM 169)
484         // p pbar -> n pbar 2pi+ pi- (BFMM 201)
485         // p pbar -> n nbar pi+ pi- pi0 (BFMM 197)
486         //
487         //brief npbar
488         // n pbar -> p pbar 2pi- pi+ (same as BFMM 169)
489         // n pbar -> p nbar 2pi- pi0 (same as BFMM 197)
490         // n pbar -> n pbar pi+ pi- pi0 (same as BFMM 161)
491         // n pbar -> n nbar 2pi- pi+ (same as BFMM 169)
492         //
493         //brief nnbar
494         // n nbar -> n nbar pi+ pi- pi0 (same as BFMM 161)
495         // n nbar -> p nbar 2pi- pi+ (same as BFMM 169)
496         // n nbar -> n pbar 2pi+ pi- (same as BFMM 201)
497         // n nbar -> p pbar pi+ pi- pi0 (same as BFMM 197)
498         //
499         //brief pnbar
500         // p nbar -> p pbar 2pi+ pi- (same as BFMM 169)
501         // p nbar -> n pbar 2pi+ pi0 (same as BFMM 197)
502         // p nbar -> p nbar pi+ pi- pi0 (same as BFMM 161)
503         // p nbar -> n nbar 2pi+ pi- (same as BFMM 169)
504         //      
505 
506 // assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
507         
508         G4double sigma=0.;
509         const G4int iso=ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType());
510         // iso == 2 || iso == -2 (n pbar or p nbar)
511 
512         const std::vector<G4double> BFMM161 = {-6.434, 1.351, -5.185, 7.754, -1.692, 1.604};
513         //const G4double Eth_PPbar_PPbar_pip_pim_pi0 = 1.604;
514         const std::vector<G4double> BFMM169 = {3.696, -5.356, -0.053, 1.941, -0.432, 1.624};
515         //const G4double Eth_PPbar_PNbar_2pim_pip = 1.624;
516         const std::vector<G4double> BFMM201 = {-1.070, -0.636, -0.009, 2.335, -0.499, 1.624};
517         //const G4double Eth_PPbar_NPbar_2pip_pim = 1.624;
518         const std::vector<G4double> BFMM197 = {1.857, -21.213, -3.448, 0.827, -0.390, 1.616};
519         //const G4double Eth_PPbar_NNbar_pip_pim_pi0 = 1.616;
520 
521         const Particle *antinucleon;
522         const Particle *nucleon;
523         
524         if (p1->isAntiNucleon()) {
525             antinucleon = p1;
526             nucleon = p2;
527         }
528         else {
529             antinucleon = p2;
530             nucleon = p1;
531         }
532         
533         const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
534         
535         if(iso == 2 || iso == -2){ // pnbar or npbar
536             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);
537             return sigma;
538         }
539         else{ // ppbar or nnbar
540             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);
541             return sigma;
542         }
543     }
544 
545     G4double CrossSectionsAntiparticles::NNbarToAnnihilation(Particle const * const p1, Particle const * const p2) {
546         //brief ppbar
547         /*
548         This part only contains total annihilation xs, the choice of a particular final state
549         will be done in the channel file.
550         As long as we only have good data for ppbar, we assume that for npbar, pnbar and nnbar the xs
551         will be the same, but in order to compensate for the Coulombic effect the ppbar annihilation xs
552         is multiplied by the pnbar total xs and divided by the ppbar total xs.
553         */
554 
555 // assert((p1->isAntiNucleon() && p2->isNucleon()) || (p1->isNucleon() && p2->isAntiNucleon()));
556         
557         G4double sigma=0.;
558         const G4int iso=ParticleTable::getIsospin(p1->getType()) + ParticleTable::getIsospin(p2->getType());
559         // iso == 2 || iso == -2 (n pbar or p nbar)
560 
561         const std::vector<G4double> BFMM6 = {66.098, 0.153, -4.576, -38.319, 6.625}; //ppbar annihilation xs
562         const std::vector<G4double> BFMM1 = {119.066, 6.251, -0.006, -60.046, 11.958}; //ppbar total xs
563         const std::vector<G4double> BFMM471 = {108.104, 15.708, 0.832, -54.632, -6.958}; //npbar total xs
564 
565         const Particle *antinucleon;
566         const Particle *nucleon;
567         
568         if (p1->isAntiNucleon()) {
569             antinucleon = p1;
570             nucleon = p2;
571         }
572         else {
573             antinucleon = p2;
574             nucleon = p1;
575         }
576         
577         const G4double pLab = 0.001*KinematicsUtils::momentumInLab(antinucleon, nucleon); // GeV
578         
579         if(iso == 2 || iso == -2){ // pnbar or npbar
580             sigma = KinematicsUtils::compute_xs(std::move(BFMM6), pLab)*KinematicsUtils::compute_xs(std::move(BFMM471), pLab)/KinematicsUtils::compute_xs(std::move(BFMM1), pLab);
581             return sigma;
582         }
583         else if(p1->getType()==antiProton || p2->getType()==Proton){ // ppbar case
584             sigma = KinematicsUtils::compute_xs(std::move(BFMM6), pLab);
585             return sigma;
586         }
587         else{ // nnbar case
588             sigma = KinematicsUtils::compute_xs(std::move(BFMM6), pLab)*KinematicsUtils::compute_xs(std::move(BFMM471), pLab)/KinematicsUtils::compute_xs(std::move(BFMM1), pLab);
589             return sigma;
590         }
591     }
592 
593 } // namespace G4INCL
594 
595