Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4INCLNNbarToNNbarpiChannel.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
41#include "G4INCLRandom.hh"
42#include "G4INCLGlobals.hh"
43#include "G4INCLLogger.hh"
44#include <algorithm>
46
47namespace G4INCL {
48
50 : particle1(p1), particle2(p2)
51 {}
52
54
56
57 //brief ppbar
58 // p pbar -> p pbar pi0 (BFMM 185)
59 // p pbar -> p nbar pi- (BFMM 188)
60 // p pbar -> n pbar pi+ (BFMM 199)
61 // p pbar -> n nbar pi0 (no data)
62 //
63 //brief npbar
64 // n pbar -> p pbar pi- (BFMM 491)
65 // n pbar -> p nbar pion (impossible)
66 // n pbar -> n pbar pi0 (BFMM 495)
67 // n pbar -> n nbar pi- (same as BFMM 188)
68 //
69 //brief nnbar
70 // n nbar -> n nbar pi0 (same as BFMM 185)
71 // n nbar -> p nbar pi- (same as BFMM 188)
72 // n nbar -> n pbar pi+ (same as BFMM 199)
73 // n nbar -> p pbar pi0 (no data)
74 //
75 //brief pnbar
76 // p nbar -> p pbar pi+ (same as BFMM 491)
77 // p nbar -> n pbar pion (impossible)
78 // p nbar -> p nbar pi0 (same as BFMM 495)
79 // p nbar -> n nbar pi+ (same as BFMM 188)
80
81 Particle *nucleon;
82 Particle *antinucleon;
83
84 if(particle1->isNucleon()){
85 nucleon = particle1;
86 antinucleon = particle2;
87 }
88 else{
89 nucleon = particle2;
90 antinucleon = particle1;
91 }
92
93 const G4double plab = 0.001*KinematicsUtils::momentumInLab(particle1, particle2);
94 const G4double sqrtS = KinematicsUtils::totalEnergyInCM(nucleon, antinucleon);
95 const G4double rdm = Random::shoot();
96
97 const std::vector<G4double> BFMM185 = {-0.734, 0.841, 0.905, 3.415, -2.316, 0.775};
98 //{22.781, -22.602, -0.752, -11.036, 1.548, 0.775};
99 //const G4double Eth_PPbar_PPbar_pi0 = 0.775;
100 const std::vector<G4double> BFMM188 = { -0.442, 0.501, 0.002, 3.434, -1.201, 0.798};
101 //const G4double Eth_PPbar_PNbar_pim = 0.798;
102 const std::vector<G4double> BFMM199 = {-2.025, 2.055, -2.355, 6.064, -2.004, 0.798};
103 //const G4double Eth_PPbar_NPbar_pip = 0.798;
104 const std::vector<G4double> BFMM491 = {24.125, -20.669, -1.534, -19.573, 4.493, 0.787};
105 //const G4double Eth_NPbar_PPbar_pim = 0.787;
106 const std::vector<G4double> BFMM495 = {-0.650, -0.140, -0.058, 5.166, -1.705, 0.777};
107 //const G4double Eth_NPbar_NPbar_pi0 = 0.777;
108
109 // pnbar total is same as for npbar
110 // ppbar total is same as for nnbar
111 const G4double totalppbar = KinematicsUtils::compute_xs(BFMM199, plab) +KinematicsUtils::compute_xs(BFMM185, plab) +KinematicsUtils::compute_xs(BFMM188, plab);
112 const G4double totalpnbar = KinematicsUtils::compute_xs(BFMM491, plab) +KinematicsUtils::compute_xs(BFMM495, plab) +KinematicsUtils::compute_xs(BFMM188, plab);
113 //totalnnbar == totalppbar;
114 //totalpnbar == totalnpbar;
115 ParticleType PionType;
116
117 //setting types of new particles
118 if(nucleon->getType()==Proton){
119 if(antinucleon->getType()==antiProton){ // ppbar case
120 if(rdm*totalppbar < KinematicsUtils::compute_xs(BFMM185, plab)){ // ppbarpi0 case
121 PionType = PiZero;
122 if(rdm<0.5){
123 nucleon->setType(Proton);
124 antinucleon->setType(antiProton);
125 }
126 else{
127 nucleon->setType(antiProton);
128 antinucleon->setType(Proton);
129 }
130 }
131 else if(rdm*totalppbar < KinematicsUtils::compute_xs(BFMM185, plab)+KinematicsUtils::compute_xs(BFMM188, plab)){ //pnbarpi- case
132 PionType = PiMinus;
133 if(rdm<0.5){
134 nucleon->setType(Proton);
135 antinucleon->setType(antiNeutron);
136 }
137 else{
138 nucleon->setType(antiNeutron);
139 antinucleon->setType(Proton);
140 }
141 }
142 else{ // npbarpi+ case
143 PionType = PiPlus;
144 if(rdm<0.5){
145 nucleon->setType(Neutron);
146 antinucleon->setType(antiProton);
147 }
148 else{
149 nucleon->setType(antiProton);
150 antinucleon->setType(Neutron);
151 }
152 }
153 }
154 else{ //antiNeutron (pnbar case)
155 if(rdm*totalpnbar < KinematicsUtils::compute_xs(BFMM491, plab)){ // ppbarpi+ case
156 PionType = PiPlus;
157 if(rdm<0.5){
158 nucleon->setType(Proton);
159 antinucleon->setType(antiProton);
160 }
161 else{
162 nucleon->setType(antiProton);
163 antinucleon->setType(Proton);
164 }
165 }
166 else if(rdm*totalppbar < KinematicsUtils::compute_xs(BFMM491, plab)+KinematicsUtils::compute_xs(BFMM495, plab)){ //pnbarpi0 case
167 PionType = PiZero;
168 if(rdm<0.5){
169 nucleon->setType(Proton);
170 antinucleon->setType(antiNeutron);
171 }
172 else{
173 nucleon->setType(antiNeutron);
174 antinucleon->setType(Proton);
175 }
176 }
177 else{ // nnbarpi+ case
178 PionType = PiPlus;
179 if(rdm<0.5){
180 nucleon->setType(Neutron);
181 antinucleon->setType(antiNeutron);
182 }
183 else{
184 nucleon->setType(antiNeutron);
185 antinucleon->setType(Neutron);
186 }
187 }
188 }
189 }
190 else{ // neutron
191 if(antinucleon->getType()==antiProton){ //npbar case
192 if(rdm*totalpnbar < KinematicsUtils::compute_xs(BFMM491, plab)){ // ppbarpi- case
193 PionType = PiMinus;
194 if(rdm<0.5){
195 nucleon->setType(Proton);
196 antinucleon->setType(antiProton);
197 }
198 else{
199 nucleon->setType(antiProton);
200 antinucleon->setType(Proton);
201 }
202 }
203 else if(rdm*totalppbar < KinematicsUtils::compute_xs(BFMM491, plab)+KinematicsUtils::compute_xs(BFMM495, plab)){ //npbarpi0 case
204 PionType = PiZero;
205 if(rdm<0.5){
206 nucleon->setType(Neutron);
207 antinucleon->setType(antiProton);
208 }
209 else{
210 nucleon->setType(antiProton);
211 antinucleon->setType(Neutron);
212 }
213 }
214 else{ // nnbarpi- case
215 PionType = PiMinus;
216 if(rdm<0.5){
217 nucleon->setType(Neutron);
218 antinucleon->setType(antiNeutron);
219 }
220 else{
221 nucleon->setType(antiNeutron);
222 antinucleon->setType(Neutron);
223 }
224 }
225 }
226 else{ //antiNeutron (nnbar case)
227 if(rdm*totalpnbar < KinematicsUtils::compute_xs(BFMM185, plab)){ // nnbarpi0 case
228 PionType = PiZero;
229 if(rdm<0.5){
230 nucleon->setType(Neutron);
231 antinucleon->setType(antiNeutron);
232 }
233 else{
234 nucleon->setType(antiNeutron);
235 antinucleon->setType(Neutron);
236 }
237 }
238 else if(rdm*totalpnbar < KinematicsUtils::compute_xs(BFMM185, plab)+KinematicsUtils::compute_xs(BFMM188, plab)){ //pnbarpi- case
239 PionType = PiMinus;
240 if(rdm<0.5){
241 nucleon->setType(Proton);
242 antinucleon->setType(antiNeutron);
243 }
244 else{
245 nucleon->setType(antiNeutron);
246 antinucleon->setType(Proton);
247 }
248 }
249 else{ // npbarpi+ case
250 PionType = PiPlus;
251 if(rdm<0.5){
252 nucleon->setType(Neutron);
253 antinucleon->setType(antiProton);
254 }
255 else{
256 nucleon->setType(antiProton);
257 antinucleon->setType(Neutron);
258 }
259 }
260 }
261 }
262
263 ParticleList list;
264 list.push_back(nucleon);
265 list.push_back(antinucleon);
266 const ThreeVector &rcol = nucleon->getPosition();
267 const ThreeVector zero;
268 Particle *pion = new Particle(PionType,zero,rcol);
269 list.push_back(pion);
270
272
273 fs->addModifiedParticle(nucleon);
274 fs->addModifiedParticle(antinucleon);
275 fs->addCreatedParticle(pion);
276
277 }
278}
double G4double
Definition G4Types.hh:83
void addModifiedParticle(Particle *p)
void addCreatedParticle(Particle *p)
G4bool isNucleon() const
G4double compute_xs(const std::vector< G4double > coefficients, const G4double pLab)
G4double totalEnergyInCM(Particle const *const p1, Particle const *const p2)
G4double momentumInLab(Particle const *const p1, Particle const *const p2)
gives the momentum in the lab frame of two particles.
void generate(const G4double sqrtS, ParticleList &particles)
Generate an event in the CM system.
G4double shoot()