Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4INCLBinaryCollisionAvatar.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/*
39 * G4INCLBinaryCollisionAvatar.cc
40 *
41 * \date Jun 5, 2009
42 * \author Pekka Kaitaniemi
43 */
44
58#include "G4INCLRandom.hh"
105#include "G4INCLNLToNSChannel.hh"
106#include "G4INCLNSToNLChannel.hh"
107#include "G4INCLNSToNSChannel.hh"
109#include "G4INCLStore.hh"
110#include "G4INCLBook.hh"
111#include "G4INCLLogger.hh"
112#include <string>
113#include <sstream>
114// #include <cassert>
122
123namespace G4INCL {
124
125 // WARNING: if you update the default cutNN value, make sure you update the
126 // cutNNSquared variable, too.
127 G4ThreadLocal G4double BinaryCollisionAvatar::cutNN = 1910.0;
128 G4ThreadLocal G4double BinaryCollisionAvatar::cutNNSquared = 3648100.0; // 1910.0 * 1910.0
129 G4ThreadLocal G4double BinaryCollisionAvatar::bias = 1.;
130
133 : InteractionAvatar(time, n, p1, p2), theCrossSection(crossSection),
134 isParticle1Spectator(false),
135 isParticle2Spectator(false),
136 isElastic(false),
137 isStrangeProduction(false)
138 {
140 }
141
144
146 // We already check cutNN at avatar creation time, but we have to check it
147 // again here. For composite projectiles, we might have created independent
148 // avatars with no cutNN before any collision took place.
149 if(particle1->isNucleon()
150 && particle2->isNucleon()
153 // Below a certain cut value we don't do anything:
154 if(energyCM2 < cutNNSquared) {
155 INCL_DEBUG("CM energy = sqrt(" << energyCM2 << ") MeV < std::sqrt(" << cutNNSquared
156 << ") MeV = cutNN" << "; returning a NULL channel" << '\n');
158 return NULL;
159 }
160 }
161
162 /** Check again the distance of approach. In order for the avatar to be
163 * realised, we have to perform a check in the CM system. We define a
164 * distance four-vector as
165 * \f[ (0, \Delta\vec{x}), \f]
166 * where \f$\Delta\vec{x}\f$ is the distance vector of the particles at
167 * their minimum distance of approach (i.e. at the avatar time). By
168 * boosting this four-vector to the CM frame of the two particles and we
169 * obtain a new four vector
170 * \f[ (\Delta t', \Delta\vec{x}'), \f]
171 * with a non-zero time component (the collision happens simultaneously for
172 * the two particles in the lab system, but not in the CM system). In order
173 * for the avatar to be realised, we require that
174 * \f[ |\Delta\vec{x}'| \leq \sqrt{\sigma/\pi}.\f]
175 * Note that \f$|\Delta\vec{x}'|\leq|\Delta\vec{x}|\f$; thus, the condition
176 * above is more restrictive than the check that we perform in
177 * G4INCL::Propagation::StandardPropagationModel::generateBinaryCollisionAvatar.
178 * In other words, the avatar generation cannot miss any physical collision
179 * avatars.
180 */
181 ThreeVector minimumDistance = particle1->getPosition();
182 minimumDistance -= particle2->getPosition();
183 const G4double betaDotX = boostVector.dot(minimumDistance);
184 const G4double minDist = Math::tenPi*(minimumDistance.mag2() + betaDotX*betaDotX / (1.-boostVector.mag2()));
185 if(minDist > theCrossSection) {
186 INCL_DEBUG("CM distance of approach is too small: " << minDist << ">" <<
187 theCrossSection <<"; returning a NULL channel" << '\n');
189 return NULL;
190 }
191
192 /** Bias apply for this reaction in order to get the same
193 * ParticleBias for all stange particles.
194 * Can be reduced after because of the safeguard.
195 */
196 G4double bias_apply = 1.;
198
199//// NN
201
202 G4double NLKProductionCX = CrossSections::NNToNLK(particle1, particle2)*bias_apply;
203 G4double NSKProductionCX = CrossSections::NNToNSK(particle1, particle2)*bias_apply;
204 G4double NLKpiProductionCX = CrossSections::NNToNLKpi(particle1, particle2)*bias_apply;
205 G4double NSKpiProductionCX = CrossSections::NNToNSKpi(particle1, particle2)*bias_apply;
206 G4double NLK2piProductionCX = CrossSections::NNToNLK2pi(particle1, particle2)*bias_apply;
207 G4double NSK2piProductionCX = CrossSections::NNToNSK2pi(particle1, particle2)*bias_apply;
208 G4double NNKKbProductionCX = CrossSections::NNToNNKKb(particle1, particle2)*bias_apply;
210
217 const G4double StrangenessProdCX = (NLKProductionCX + NSKProductionCX + NLKpiProductionCX + NSKpiProductionCX + NLK2piProductionCX + NSK2piProductionCX + NNKKbProductionCX + NNMissingCX)/bias_apply;
218
219 G4double counterweight = (1. - bias_apply * StrangenessProdCX / (StrangenessProdCX + UnStrangeProdCX))/(1. - StrangenessProdCX / (StrangenessProdCX + UnStrangeProdCX));
220
221 if(counterweight < 0.5) {
222 counterweight = 0.5;
223 bias_apply = 0.5*UnStrangeProdCX/StrangenessProdCX+1;
224 NLKProductionCX = CrossSections::NNToNLK(particle1, particle2)*bias_apply;
225 NSKProductionCX = CrossSections::NNToNSK(particle1, particle2)*bias_apply;
226 NLKpiProductionCX = CrossSections::NNToNLKpi(particle1, particle2)*bias_apply;
227 NSKpiProductionCX = CrossSections::NNToNSKpi(particle1, particle2)*bias_apply;
228 NLK2piProductionCX = CrossSections::NNToNLK2pi(particle1, particle2)*bias_apply;
229 NSK2piProductionCX = CrossSections::NNToNSK2pi(particle1, particle2)*bias_apply;
230 NNKKbProductionCX = CrossSections::NNToNNKKb(particle1, particle2)*bias_apply;
232 }
233
234
235 const G4double elasticCX = CrossSections::elastic(particle1, particle2)*counterweight;
236 const G4double deltaProductionCX = CrossSections::NNToNDelta(particle1, particle2)*counterweight;
237 const G4double onePiProductionCX = CrossSections::NNToxPiNN(1,particle1, particle2)*counterweight;
238 const G4double twoPiProductionCX = CrossSections::NNToxPiNN(2,particle1, particle2)*counterweight;
239 const G4double threePiProductionCX = CrossSections::NNToxPiNN(3,particle1, particle2)*counterweight;
240 const G4double fourPiProductionCX = CrossSections::NNToxPiNN(4,particle1, particle2)*counterweight;
241
242 const G4double etaProductionCX = CrossSections::NNToNNEtaExclu(particle1, particle2)*counterweight;
243 const G4double etadeltaProductionCX = CrossSections::NNToNDeltaEta(particle1, particle2)*counterweight;
244 const G4double etaonePiProductionCX = CrossSections::NNToNNEtaxPi(1,particle1, particle2)*counterweight;
245 const G4double etatwoPiProductionCX = CrossSections::NNToNNEtaxPi(2,particle1, particle2)*counterweight;
246 const G4double etathreePiProductionCX = CrossSections::NNToNNEtaxPi(3,particle1, particle2)*counterweight;
247 const G4double etafourPiProductionCX = CrossSections::NNToNNEtaxPi(4,particle1, particle2)*counterweight;
248 const G4double omegaProductionCX = CrossSections::NNToNNOmegaExclu(particle1, particle2)*counterweight;
249 const G4double omegadeltaProductionCX = CrossSections::NNToNDeltaOmega(particle1, particle2)*counterweight;
250 const G4double omegaonePiProductionCX = CrossSections::NNToNNOmegaxPi(1,particle1, particle2)*counterweight;
251 const G4double omegatwoPiProductionCX = CrossSections::NNToNNOmegaxPi(2,particle1, particle2)*counterweight;
252 const G4double omegathreePiProductionCX = CrossSections::NNToNNOmegaxPi(3,particle1, particle2)*counterweight;
253 const G4double omegafourPiProductionCX = CrossSections::NNToNNOmegaxPi(4,particle1, particle2)*counterweight;
254
256
257// assert(std::fabs(totCX-elasticCX-deltaProductionCX-onePiProductionCX-twoPiProductionCX-threePiProductionCX-fourPiProductionCX-NLKProductionCX-NSKProductionCX-NLKpiProductionCX-NSKpiProductionCX-NLK2piProductionCX-NSK2piProductionCX-NNKKbProductionCX-NNMissingCX-etaProductionCX-etadeltaProductionCX-etaonePiProductionCX-etatwoPiProductionCX-etathreePiProductionCX-etafourPiProductionCX-omegaProductionCX-omegadeltaProductionCX-omegaonePiProductionCX-omegatwoPiProductionCX-omegathreePiProductionCX-omegafourPiProductionCX) < 0.5);
258
259 const G4double rChannel=Random::shoot() * totCX;
260
261 if(elasticCX > rChannel) {
262// Elastic NN channel
263 isElastic = true;
264 INCL_DEBUG("NN interaction: elastic channel chosen" << '\n');
265 weight = counterweight;
267 } else if((elasticCX + deltaProductionCX) > rChannel) {
268 isElastic = false;
269// NN -> N Delta channel is chosen
270 INCL_DEBUG("NN interaction: Delta channel chosen" << '\n');
271 weight = counterweight;
273 } else if(elasticCX + deltaProductionCX + onePiProductionCX > rChannel) {
274 isElastic = false;
275// NN -> PiNN channel is chosen
276 INCL_DEBUG("NN interaction: one Pion channel chosen" << '\n');
277 weight = counterweight;
279 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX > rChannel) {
280 isElastic = false;
281// NN -> 2PiNN channel is chosen
282 INCL_DEBUG("NN interaction: two Pions channel chosen" << '\n');
283 weight = counterweight;
285 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX > rChannel) {
286 isElastic = false;
287// NN -> 3PiNN channel is chosen
288 INCL_DEBUG("NN interaction: three Pions channel chosen" << '\n');
289 weight = counterweight;
291 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX > rChannel) {
292 isElastic = false;
293// NN -> 4PiNN channel is chosen
294 INCL_DEBUG("NN interaction: four Pions channel chosen" << '\n');
295 weight = counterweight;
297 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
298 + etaProductionCX > rChannel) {
299 isElastic = false;
300// NN -> NNEta channel is chosen
301 INCL_DEBUG("NN interaction: Eta channel chosen" << '\n');
302 weight = counterweight;
304 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
305 + etaProductionCX + etadeltaProductionCX > rChannel) {
306 isElastic = false;
307// NN -> N Delta Eta channel is chosen
308 INCL_DEBUG("NN interaction: Delta Eta channel chosen" << '\n');
309 weight = counterweight;
311 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
312 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX > rChannel) {
313 isElastic = false;
314// NN -> EtaPiNN channel is chosen
315 INCL_DEBUG("NN interaction: Eta + one Pion channel chosen" << '\n');
316 weight = counterweight;
318 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
319 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX > rChannel) {
320 isElastic = false;
321// NN -> Eta2PiNN channel is chosen
322 INCL_DEBUG("NN interaction: Eta + two Pions channel chosen" << '\n');
323 weight = counterweight;
325 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
326 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX > rChannel) {
327 isElastic = false;
328// NN -> Eta3PiNN channel is chosen
329 INCL_DEBUG("NN interaction: Eta + three Pions channel chosen" << '\n');
330 weight = counterweight;
332 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
333 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX > rChannel) {
334 isElastic = false;
335// NN -> Eta4PiNN channel is chosen
336 INCL_DEBUG("NN interaction: Eta + four Pions channel chosen" << '\n');
337 weight = counterweight;
339 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
340 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
341 + omegaProductionCX > rChannel) {
342 isElastic = false;
343// NN -> NNOmega channel is chosen
344 INCL_DEBUG("NN interaction: Omega channel chosen" << '\n');
345 weight = counterweight;
347 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
348 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
349 + omegaProductionCX + omegadeltaProductionCX > rChannel) {
350 isElastic = false;
351// NN -> N Delta Omega channel is chosen
352 INCL_DEBUG("NN interaction: Delta Omega channel chosen" << '\n');
353 weight = counterweight;
355 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
356 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
357 + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX > rChannel) {
358 isElastic = false;
359// NN -> OmegaPiNN channel is chosen
360 INCL_DEBUG("NN interaction: Omega + one Pion channel chosen" << '\n');
361 weight = counterweight;
363 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
364 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
365 + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX > rChannel) {
366 isElastic = false;
367// NN -> Omega2PiNN channel is chosen
368 INCL_DEBUG("NN interaction: Omega + two Pions channel chosen" << '\n');
369 weight = counterweight;
371 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
372 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
373 + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX + omegathreePiProductionCX > rChannel) {
374 isElastic = false;
375// NN -> Omega3PiNN channel is chosen
376 INCL_DEBUG("NN interaction: Omega + three Pions channel chosen" << '\n');
377 weight = counterweight;
379 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
380 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
381 + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX + omegathreePiProductionCX + omegafourPiProductionCX > rChannel) {
382 isElastic = false;
383// NN -> Omega4PiNN channel is chosen
384 INCL_DEBUG("NN interaction: Omega + four Pions channel chosen" << '\n');
385 weight = counterweight;
387 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
388 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
389 + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX + omegathreePiProductionCX + omegafourPiProductionCX
390 + NLKProductionCX > rChannel) {
391 isElastic = false;
392 isStrangeProduction = true;
393// NN -> NLK channel is chosen
394 INCL_DEBUG("NN interaction: NLK channel chosen" << '\n');
395 weight = bias_apply;
397 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
398 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
399 + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX + omegathreePiProductionCX + omegafourPiProductionCX
400 + NLKProductionCX + NLKpiProductionCX > rChannel) {
401 isElastic = false;
402 isStrangeProduction = true;
403// NN -> NLKpi channel is chosen
404 INCL_DEBUG("NN interaction: NLKpi channel chosen" << '\n');
405 weight = bias_apply;
407 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
408 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
409 + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX + omegathreePiProductionCX + omegafourPiProductionCX
410 + NLKProductionCX + NLKpiProductionCX + NLK2piProductionCX > rChannel) {
411 isElastic = false;
412 isStrangeProduction = true;
413// NN -> NLK2pi channel is chosen
414 INCL_DEBUG("NN interaction: NLK2pi channel chosen" << '\n');
415 weight = bias_apply;
417 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
418 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
419 + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX + omegathreePiProductionCX + omegafourPiProductionCX
420 + NLKProductionCX + NLKpiProductionCX + NLK2piProductionCX + NSKProductionCX > rChannel) {
421 isElastic = false;
422 isStrangeProduction = true;
423// NN -> NSK channel is chosen
424 INCL_DEBUG("NN interaction: NSK channel chosen" << '\n');
425 weight = bias_apply;
427 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
428 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
429 + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX + omegathreePiProductionCX + omegafourPiProductionCX
430 + NLKProductionCX + NLKpiProductionCX + NLK2piProductionCX + NSKProductionCX + NSKpiProductionCX > rChannel) {
431 isElastic = false;
432 isStrangeProduction = true;
433// NN -> NSKpi channel is chosen
434 INCL_DEBUG("NN interaction: NSKpi channel chosen" << '\n');
435 weight = bias_apply;
437 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
438 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
439 + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX + omegathreePiProductionCX + omegafourPiProductionCX
440 + NLKProductionCX + NLKpiProductionCX + NLK2piProductionCX + NSKProductionCX + NSKpiProductionCX + NSK2piProductionCX > rChannel) {
441 isElastic = false;
442 isStrangeProduction = true;
443// NN -> NSK2pi channel is chosen
444 INCL_DEBUG("NN interaction: NSK2pi channel chosen" << '\n');
445 weight = bias_apply;
447 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
448 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
449 + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX + omegathreePiProductionCX + omegafourPiProductionCX
450 + NLKProductionCX + NLKpiProductionCX + NLK2piProductionCX + NSKProductionCX + NSKpiProductionCX + NSK2piProductionCX + NNKKbProductionCX > rChannel) {
451 isElastic = false;
452 isStrangeProduction = true;
453// NN -> NNKKb channel is chosen
454 INCL_DEBUG("NN interaction: NNKKb channel chosen" << '\n');
455 weight = bias_apply;
457 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX
458 + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX
459 + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX + omegathreePiProductionCX + omegafourPiProductionCX
460 + NLKProductionCX + NLKpiProductionCX + NLK2piProductionCX + NSKProductionCX + NSKpiProductionCX + NSK2piProductionCX + NNKKbProductionCX + NNMissingCX> rChannel) {
461 isElastic = false;
462 isStrangeProduction = true;
463// NN -> Missing Strangeness channel is chosen
464 INCL_DEBUG("NN interaction: Missing Strangeness channel chosen" << '\n');
465 weight = bias_apply;
467 } else {
468 INCL_WARN("inconsistency within the NN Cross Sections (sum!=inelastic)" << '\n');
469 if(NNMissingCX>0.) {
470 INCL_WARN("Returning an Missing Strangeness channel" << '\n');
471 weight = bias_apply;
472 isElastic = false;
473 isStrangeProduction = true;
475 } else if(NNKKbProductionCX>0.) {
476 INCL_WARN("Returning an NNKKb channel" << '\n');
477 weight = bias_apply;
478 isElastic = false;
479 isStrangeProduction = true;
481 } else if(NSK2piProductionCX>0.) {
482 INCL_WARN("Returning an NSK2pi channel" << '\n');
483 weight = bias_apply;
484 isElastic = false;
485 isStrangeProduction = true;
487 } else if(NSKpiProductionCX>0.) {
488 INCL_WARN("Returning an NSKpi channel" << '\n');
489 weight = bias_apply;
490 isElastic = false;
491 isStrangeProduction = true;
493 } else if(NSKProductionCX>0.) {
494 INCL_WARN("Returning an NSK channel" << '\n');
495 weight = bias_apply;
496 isElastic = false;
497 isStrangeProduction = true;
499 } else if(NLK2piProductionCX>0.) {
500 INCL_WARN("Returning an NLK2pi channel" << '\n');
501 weight = bias_apply;
502 isElastic = false;
503 isStrangeProduction = true;
505 } else if(NLKpiProductionCX>0.) {
506 INCL_WARN("Returning an NLKpi channel" << '\n');
507 weight = bias_apply;
508 isElastic = false;
509 isStrangeProduction = true;
511 } else if(NLKProductionCX>0.) {
512 INCL_WARN("Returning an NLK channel" << '\n');
513 weight = bias_apply;
514 isElastic = false;
515 isStrangeProduction = true;
517 } else if(omegafourPiProductionCX>0.) {
518 INCL_WARN("Returning an Omega + four Pions channel" << '\n');
519 weight = counterweight;
520 isElastic = false;
522 } else if(omegathreePiProductionCX>0.) {
523 INCL_WARN("Returning an Omega + three Pions channel" << '\n');
524 weight = counterweight;
525 isElastic = false;
527 } else if(omegatwoPiProductionCX>0.) {
528 INCL_WARN("Returning an Omega + two Pions channel" << '\n');
529 weight = counterweight;
530 isElastic = false;
532 } else if(omegaonePiProductionCX>0.) {
533 INCL_WARN("Returning an Omega + one Pion channel" << '\n');
534 weight = counterweight;
535 isElastic = false;
537 } else if(omegadeltaProductionCX>0.) {
538 INCL_WARN("Returning an Omega + Delta channel" << '\n');
539 weight = counterweight;
540 isElastic = false;
542 } else if(omegaProductionCX>0.) {
543 INCL_WARN("Returning an Omega channel" << '\n');
544 weight = counterweight;
545 isElastic = false;
547 } else if(etafourPiProductionCX>0.) {
548 INCL_WARN("Returning an Eta + four Pions channel" << '\n');
549 weight = counterweight;
550 isElastic = false;
552 } else if(etathreePiProductionCX>0.) {
553 INCL_WARN("Returning an Eta + threev channel" << '\n');
554 weight = counterweight;
555 isElastic = false;
557 } else if(etatwoPiProductionCX>0.) {
558 INCL_WARN("Returning an Eta + two Pions channel" << '\n');
559 weight = counterweight;
560 isElastic = false;
562 } else if(etaonePiProductionCX>0.) {
563 INCL_WARN("Returning an Eta + one Pion channel" << '\n');
564 weight = counterweight;
565 isElastic = false;
567 } else if(etadeltaProductionCX>0.) {
568 INCL_WARN("Returning an Eta + Delta channel" << '\n');
569 weight = counterweight;
570 isElastic = false;
572 } else if(etaProductionCX>0.) {
573 INCL_WARN("Returning an Eta channel" << '\n');
574 weight = counterweight;
575 isElastic = false;
577 } else if(fourPiProductionCX>0.) {
578 INCL_WARN("Returning a 4pi channel" << '\n');
579 weight = counterweight;
580 isElastic = false;
582 } else if(threePiProductionCX>0.) {
583 INCL_WARN("Returning a 3pi channel" << '\n');
584 weight = counterweight;
585 isElastic = false;
587 } else if(twoPiProductionCX>0.) {
588 INCL_WARN("Returning a 2pi channel" << '\n');
589 weight = counterweight;
590 isElastic = false;
592 } else if(onePiProductionCX>0.) {
593 INCL_WARN("Returning a 1pi channel" << '\n');
594 weight = counterweight;
595 isElastic = false;
597 } else if(deltaProductionCX>0.) {
598 INCL_WARN("Returning a delta-production channel" << '\n');
599 weight = counterweight;
600 isElastic = false;
602 } else {
603 INCL_WARN("Returning an elastic channel" << '\n');
604 weight = counterweight;
605 isElastic = true;
607 }
608 }
609
610//// NDelta
611 }
612 else if((particle1->isNucleon() && particle2->isDelta()) ||
614
615 G4double NLKProductionCX = CrossSections::NDeltaToNLK(particle1, particle2)*bias_apply;
616 G4double NSKProductionCX = CrossSections::NDeltaToNSK(particle1, particle2)*bias_apply;
617 G4double DeltaLKProductionCX = CrossSections::NDeltaToDeltaLK(particle1, particle2)*bias_apply;
618 G4double DeltaSKProductionCX = CrossSections::NDeltaToDeltaSK(particle1, particle2)*bias_apply;
619 G4double NNKKbProductionCX = CrossSections::NDeltaToNNKKb(particle1, particle2)*bias_apply;
620
622 const G4double StrangenessProdCX = (NLKProductionCX + NSKProductionCX + DeltaLKProductionCX + DeltaSKProductionCX + NNKKbProductionCX)/bias_apply;
623
624 G4double counterweight = (1. - bias_apply * StrangenessProdCX / (StrangenessProdCX + UnStrangeProdCX))/(1. - StrangenessProdCX / (StrangenessProdCX + UnStrangeProdCX));
625
626 if(counterweight < 0.5){
627 counterweight = 0.5;
628 bias_apply = 0.5*UnStrangeProdCX/StrangenessProdCX+1;
629
630 NLKProductionCX = CrossSections::NDeltaToNLK(particle1, particle2)*bias_apply;
631 NSKProductionCX = CrossSections::NDeltaToNSK(particle1, particle2)*bias_apply;
632 DeltaLKProductionCX = CrossSections::NDeltaToDeltaLK(particle1, particle2)*bias_apply;
633 DeltaSKProductionCX = CrossSections::NDeltaToDeltaSK(particle1, particle2)*bias_apply;
634 NNKKbProductionCX = CrossSections::NDeltaToNNKKb(particle1, particle2)*bias_apply;
635 }
636
637 G4double elasticCX = CrossSections::elastic(particle1, particle2)*counterweight;
638 G4double recombinationCX = CrossSections::NDeltaToNN(particle1, particle2)*counterweight;
639
640 const G4double rChannel=Random::shoot() * (StrangenessProdCX + UnStrangeProdCX);
641
642 if(elasticCX > rChannel) {
643 isElastic = true;
644// Elastic N Delta channel
645 INCL_DEBUG("NDelta interaction: elastic channel chosen" << '\n');
646 weight = counterweight;
648 } else if (elasticCX + recombinationCX > rChannel){
649 isElastic = false;
650// Recombination
651// NDelta -> NN channel is chosen
652 INCL_DEBUG("NDelta interaction: recombination channel chosen" << '\n');
653 weight = counterweight;
655 } else if (elasticCX + recombinationCX + NLKProductionCX > rChannel){
656 isElastic = false;
657 isStrangeProduction = true;
658// NDelta -> NLK channel is chosen
659 INCL_DEBUG("NDelta interaction: NLK channel chosen" << '\n');
660 weight = bias_apply;
662 } else if (elasticCX + recombinationCX + NLKProductionCX + NSKProductionCX > rChannel){
663 isElastic = false;
664 isStrangeProduction = true;
665// NDelta -> NSK channel is chosen
666 INCL_DEBUG("NDelta interaction: NSK channel chosen" << '\n');
667 weight = bias_apply;
669 } else if (elasticCX + recombinationCX + NLKProductionCX + NSKProductionCX + DeltaLKProductionCX > rChannel){
670 isElastic = false;
671 isStrangeProduction = true;
672// NDelta -> DeltaLK channel is chosen
673 INCL_DEBUG("NDelta interaction: DeltaLK channel chosen" << '\n');
674 weight = bias_apply;
676 } else if (elasticCX + recombinationCX + NLKProductionCX + NSKProductionCX + DeltaLKProductionCX + DeltaSKProductionCX > rChannel){
677 isElastic = false;
678 isStrangeProduction = true;
679// NDelta -> DeltaSK channel is chosen
680 INCL_DEBUG("NDelta interaction: DeltaSK channel chosen" << '\n');
681 weight = bias_apply;
683 } else if (elasticCX + recombinationCX + NLKProductionCX + NSKProductionCX + DeltaLKProductionCX + DeltaSKProductionCX + NNKKbProductionCX > rChannel){
684 isElastic = false;
685 isStrangeProduction = true;
686// NDelta -> NNKKb channel is chosen
687 INCL_DEBUG("NDelta interaction: NNKKb channel chosen" << '\n');
688 weight = bias_apply;
690 }
691 else{
692 INCL_ERROR("rChannel > (StrangenessProdCX + UnStrangeProdCX) in NDelta interaction: return an elastic channel" << '\n');
693 weight = counterweight;
694 isElastic = true;
696 }
697
698//// DeltaDelta
699 } else if(particle1->isDelta() && particle2->isDelta()) {
700 isElastic = true;
701 INCL_DEBUG("DeltaDelta interaction: elastic channel chosen" << '\n');
703
704//// PiN
705 } else if(isPiN) {
706
707 G4double LKProdCX = CrossSections::NpiToLK(particle1,particle2)*bias_apply;
708 G4double SKProdCX = CrossSections::NpiToSK(particle1,particle2)*bias_apply;
709 G4double LKpiProdCX = CrossSections::NpiToLKpi(particle1,particle2)*bias_apply;
710 G4double SKpiProdCX = CrossSections::NpiToSKpi(particle1,particle2)*bias_apply;
711 G4double LK2piProdCX = CrossSections::NpiToLK2pi(particle1,particle2)*bias_apply;
712 G4double SK2piProdCX = CrossSections::NpiToSK2pi(particle1,particle2)*bias_apply;
713 G4double NKKbProdCX = CrossSections::NpiToNKKb(particle1,particle2)*bias_apply;
715
719 const G4double StrangenessProdCX = (LKProdCX + SKProdCX + LKpiProdCX + SKpiProdCX + LK2piProdCX + SK2piProdCX + NKKbProdCX + MissingCX)/bias_apply;
720
721 G4double counterweight = (1. - bias_apply * StrangenessProdCX / (StrangenessProdCX + UnStrangeProdCX))/(1. - StrangenessProdCX / (StrangenessProdCX + UnStrangeProdCX));
722
723 if(counterweight < 0.5) {
724 counterweight = 0.5;
725 bias_apply = 0.5*UnStrangeProdCX/StrangenessProdCX+1;
726 LKProdCX = CrossSections::NpiToLK(particle1,particle2)*bias_apply;
727 SKProdCX = CrossSections::NpiToSK(particle1,particle2)*bias_apply;
728 LKpiProdCX = CrossSections::NpiToLKpi(particle1,particle2)*bias_apply;
729 SKpiProdCX = CrossSections::NpiToSKpi(particle1,particle2)*bias_apply;
730 LK2piProdCX = CrossSections::NpiToLK2pi(particle1,particle2)*bias_apply;
731 SK2piProdCX = CrossSections::NpiToSK2pi(particle1,particle2)*bias_apply;
732 NKKbProdCX = CrossSections::NpiToNKKb(particle1,particle2)*bias_apply;
734 }
735
736
737 const G4double elasticCX = CrossSections::elastic(particle1, particle2)*counterweight;
738 const G4double deltaProductionCX = CrossSections::piNToDelta(particle1, particle2)*counterweight;
739 const G4double onePiProductionCX = CrossSections::piNToxPiN(2,particle1, particle2)*counterweight;
740 const G4double twoPiProductionCX = CrossSections::piNToxPiN(3,particle1, particle2)*counterweight;
741 const G4double threePiProductionCX = CrossSections::piNToxPiN(4,particle1, particle2)*counterweight;
742 const G4double etaProductionCX = CrossSections::piNToEtaN(particle1, particle2)*counterweight;
743 const G4double omegaProductionCX = CrossSections::piNToOmegaN(particle1, particle2)*counterweight;
744
746
747// assert(std::fabs(totCX-elasticCX-deltaProductionCX-onePiProductionCX-twoPiProductionCX-threePiProductionCX-etaProductionCX-omegaProductionCX-LKProdCX-SKProdCX-LKpiProdCX-SKpiProdCX-LK2piProdCX-SK2piProdCX-NKKbProdCX-MissingCX) < 0.15);
748
749 const G4double rChannel=Random::shoot() * totCX;
750
751 if(elasticCX > rChannel) {
752 isElastic = true;
753// Elastic PiN channel
754 INCL_DEBUG("PiN interaction: elastic channel chosen" << '\n');
755 weight = counterweight;
757 } else if(elasticCX + deltaProductionCX > rChannel) {
758 isElastic = false;
759// PiN -> Delta channel is chosen
760 INCL_DEBUG("PiN interaction: Delta channel chosen" << '\n');
761 weight = counterweight;
763 } else if(elasticCX + deltaProductionCX + onePiProductionCX > rChannel) {
764 isElastic = false;
765// PiN -> PiNPi channel is chosen
766 INCL_DEBUG("PiN interaction: one Pion channel chosen" << '\n');
767 weight = counterweight;
769 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX > rChannel) {
770 isElastic = false;
771// PiN -> PiN2Pi channel is chosen
772 INCL_DEBUG("PiN interaction: two Pions channel chosen" << '\n');
773 weight = counterweight;
775 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX > rChannel) {
776 isElastic = false;
777// PiN -> PiN3Pi channel is chosen
778 INCL_DEBUG("PiN interaction: three Pions channel chosen" << '\n');
779 weight = counterweight;
781 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + etaProductionCX > rChannel) {
782 isElastic = false;
783// PiN -> EtaN channel is chosen
784 INCL_DEBUG("PiN interaction: Eta channel chosen" << '\n');
785 weight = counterweight;
787 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + etaProductionCX+ omegaProductionCX > rChannel) {
788 isElastic = false;
789// PiN -> OmegaN channel is chosen
790 INCL_DEBUG("PiN interaction: Omega channel chosen" << '\n');
791 weight = counterweight;
793 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + etaProductionCX+ omegaProductionCX
794 + LKProdCX > rChannel) {
795 isElastic = false;
796 isStrangeProduction = true;
797// PiN -> LK channel is chosen
798 INCL_DEBUG("PiN interaction: LK channel chosen" << '\n');
799 weight = bias_apply;
801 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + etaProductionCX+ omegaProductionCX
802 + LKProdCX + SKProdCX > rChannel) {
803 isElastic = false;
804 isStrangeProduction = true;
805// PiN -> SK channel is chosen
806 INCL_DEBUG("PiN interaction: SK channel chosen" << '\n');
807 weight = bias_apply;
809 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + etaProductionCX+ omegaProductionCX
810 + LKProdCX + SKProdCX + LKpiProdCX > rChannel) {
811 isElastic = false;
812 isStrangeProduction = true;
813// PiN -> LKpi channel is chosen
814 INCL_DEBUG("PiN interaction: LKpi channel chosen" << '\n');
815 weight = bias_apply;
817 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + etaProductionCX+ omegaProductionCX
818 + LKProdCX + SKProdCX + LKpiProdCX + SKpiProdCX > rChannel) {
819 isElastic = false;
820 isStrangeProduction = true;
821// PiN -> SKpi channel is chosen
822 INCL_DEBUG("PiN interaction: SKpi channel chosen" << '\n');
823 weight = bias_apply;
825 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + etaProductionCX+ omegaProductionCX
826 + LKProdCX + SKProdCX + LKpiProdCX + SKpiProdCX + LK2piProdCX > rChannel) {
827 isElastic = false;
828 isStrangeProduction = true;
829// PiN -> LK2pi channel is chosen
830 INCL_DEBUG("PiN interaction: LK2pi channel chosen" << '\n');
831 weight = bias_apply;
833 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + etaProductionCX+ omegaProductionCX
834 + LKProdCX + SKProdCX + LKpiProdCX + SKpiProdCX + LK2piProdCX + SK2piProdCX > rChannel) {
835 isElastic = false;
836 isStrangeProduction = true;
837// PiN -> SK2pi channel is chosen
838 INCL_DEBUG("PiN interaction: SK2pi channel chosen" << '\n');
839 weight = bias_apply;
841 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + etaProductionCX+ omegaProductionCX
842 + LKProdCX + SKProdCX + LKpiProdCX + SKpiProdCX + LK2piProdCX + SK2piProdCX + NKKbProdCX > rChannel) {
843 isElastic = false;
844 isStrangeProduction = true;
845// PiN -> NKKb channel is chosen
846 INCL_DEBUG("PiN interaction: NKKb channel chosen" << '\n');
847 weight = bias_apply;
849 } else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + etaProductionCX+ omegaProductionCX
850 + LKProdCX + SKProdCX + LKpiProdCX + SKpiProdCX + LK2piProdCX + SK2piProdCX + NKKbProdCX + MissingCX> rChannel) {
851 isElastic = false;
852 isStrangeProduction = true;
853// PiN -> Missinge Strangeness channel is chosen
854 INCL_DEBUG("PiN interaction: Missinge Strangeness channel chosen" << '\n');
855 weight = bias_apply;
857 }
858 else {
859 INCL_WARN("inconsistency within the PiN Cross Sections (sum!=inelastic)" << '\n');
860 if(MissingCX>0.) {
861 INCL_WARN("Returning a Missinge Strangeness channel" << '\n');
862 weight = bias_apply;
863 isElastic = false;
864 isStrangeProduction = true;
866 } else if(NKKbProdCX>0.) {
867 INCL_WARN("Returning a NKKb channel" << '\n');
868 weight = bias_apply;
869 isElastic = false;
870 isStrangeProduction = true;
872 } else if(SK2piProdCX>0.) {
873 INCL_WARN("Returning a SK2pi channel" << '\n');
874 weight = bias_apply;
875 isElastic = false;
876 isStrangeProduction = true;
878 } else if(LK2piProdCX>0.) {
879 INCL_WARN("Returning a LK2pi channel" << '\n');
880 weight = bias_apply;
881 isElastic = false;
882 isStrangeProduction = true;
884 } else if(SKpiProdCX>0.) {
885 INCL_WARN("Returning a SKpi channel" << '\n');
886 weight = bias_apply;
887 isElastic = false;
888 isStrangeProduction = true;
890 } else if(LKpiProdCX>0.) {
891 INCL_WARN("Returning a LKpi channel" << '\n');
892 weight = bias_apply;
893 isElastic = false;
894 isStrangeProduction = true;
896 } else if(SKProdCX>0.) {
897 INCL_WARN("Returning a SK channel" << '\n');
898 weight = bias_apply;
899 isElastic = false;
900 isStrangeProduction = true;
902 } else if(LKProdCX>0.) {
903 INCL_WARN("Returning a LK channel" << '\n');
904 weight = bias_apply;
905 isElastic = false;
906 isStrangeProduction = true;
908 } else if(omegaProductionCX>0.) {
909 INCL_WARN("Returning a Omega channel" << '\n');
910 weight = counterweight;
911 isElastic = false;
913 } else if(etaProductionCX>0.) {
914 INCL_WARN("Returning a Eta channel" << '\n');
915 weight = counterweight;
916 isElastic = false;
918 } else if(threePiProductionCX>0.) {
919 INCL_WARN("Returning a 3pi channel" << '\n');
920 weight = counterweight;
921 isElastic = false;
923 } else if(twoPiProductionCX>0.) {
924 INCL_WARN("Returning a 2pi channel" << '\n');
925 weight = counterweight;
926 isElastic = false;
928 } else if(onePiProductionCX>0.) {
929 INCL_WARN("Returning a 1pi channel" << '\n');
930 weight = counterweight;
931 isElastic = false;
933 } else if(deltaProductionCX>0.) {
934 INCL_WARN("Returning a delta-production channel" << '\n');
935 weight = counterweight;
936 isElastic = false;
938 } else {
939 INCL_WARN("Returning an elastic channel" << '\n');
940 weight = counterweight;
941 isElastic = true;
943 }
944 }
945 } else if ((particle1->isNucleon() && particle2->isEta()) || (particle2->isNucleon() && particle1->isEta())) {
946//// EtaN
947
949 const G4double onePiProductionCX = CrossSections::etaNToPiN(particle1, particle2);
950 const G4double twoPiProductionCX = CrossSections::etaNToPiPiN(particle1, particle2);
952// assert(std::fabs(totCX-elasticCX-onePiProductionCX-twoPiProductionCX)<1.);
953
954 const G4double rChannel=Random::shoot() * totCX;
955
956 if(elasticCX > rChannel) {
957// Elastic EtaN channel
958 isElastic = true;
959 INCL_DEBUG("EtaN interaction: elastic channel chosen" << '\n');
961 } else if(elasticCX + onePiProductionCX > rChannel) {
962 isElastic = false;
963// EtaN -> EtaPiN channel is chosen
964 INCL_DEBUG("EtaN interaction: PiN channel chosen" << '\n');
966 } else if(elasticCX + onePiProductionCX + twoPiProductionCX > rChannel) {
967 isElastic = false;
968// EtaN -> EtaPiPiN channel is chosen
969 INCL_DEBUG("EtaN interaction: PiPiN channel chosen" << '\n');
971 }
972
973 else {
974 INCL_WARN("inconsistency within the EtaN Cross Sections (sum!=inelastic)" << '\n');
975 if(twoPiProductionCX>0.) {
976 INCL_WARN("Returning a PiPiN channel" << '\n');
977 isElastic = false;
979 } else if(onePiProductionCX>0.) {
980 INCL_WARN("Returning a PiN channel" << '\n');
981 isElastic = false;
983 } else {
984 INCL_WARN("Returning an elastic channel" << '\n');
985 isElastic = true;
987 }
988 }
989
990 } else if ((particle1->isNucleon() && particle2->isOmega()) || (particle2->isNucleon() && particle1->isOmega())) {
991//// OmegaN
992
994 const G4double onePiProductionCX = CrossSections::omegaNToPiN(particle1, particle2);
995 const G4double twoPiProductionCX = CrossSections::omegaNToPiPiN(particle1, particle2);
997// assert(std::fabs(totCX-elasticCX-onePiProductionCX-twoPiProductionCX)<1.);
998
999 const G4double rChannel=Random::shoot() * totCX;
1000
1001 if(elasticCX > rChannel) {
1002// Elastic OmegaN channel
1003 isElastic = true;
1004 INCL_DEBUG("OmegaN interaction: elastic channel chosen" << '\n');
1006 } else if(elasticCX + onePiProductionCX > rChannel) {
1007 isElastic = false;
1008// OmegaN -> PiN channel is chosen
1009 INCL_DEBUG("OmegaN interaction: PiN channel chosen" << '\n');
1011 } else if(elasticCX + onePiProductionCX + twoPiProductionCX > rChannel) {
1012 isElastic = false;
1013// OmegaN -> PiPiN channel is chosen
1014 INCL_DEBUG("OmegaN interaction: PiPiN channel chosen" << '\n');
1016 }
1017 else {
1018 INCL_WARN("inconsistency within the OmegaN Cross Sections (sum!=inelastic)" << '\n');
1019 if(twoPiProductionCX>0.) {
1020 INCL_WARN("Returning a PiPiN channel" << '\n');
1021 isElastic = false;
1023 } else if(onePiProductionCX>0.) {
1024 INCL_WARN("Returning a PiN channel" << '\n');
1025 isElastic = false;
1027 } else {
1028 INCL_WARN("Returning an elastic channel" << '\n');
1029 isElastic = true;
1031 }
1032 }
1033 } else if ((particle1->isNucleon() && particle2->isKaon()) || (particle2->isNucleon() && particle1->isKaon())) {
1034//// KN
1036 const G4double quasielasticCX = CrossSections::NKToNK(particle1,particle2);
1040// assert(std::fabs(totCX-elasticCX-quasielasticCX-NKToNKpiCX-NKToNK2piCX)<0.1);
1041
1042 const G4double rChannel=Random::shoot() * totCX;
1043 if(elasticCX > rChannel){
1044// Elastic KN channel is chosen
1045 isElastic = true;
1046 INCL_DEBUG("KN interaction: elastic channel chosen" << '\n');
1048 } else if(elasticCX + quasielasticCX > rChannel){
1049// Quasi-elastic KN channel is chosen
1050 isElastic = false; // true ??
1051 INCL_DEBUG("KN interaction: quasi-elastic channel chosen" << '\n');
1052 return new NKToNKChannel(particle1, particle2);
1053 } else if(elasticCX + quasielasticCX + NKToNKpiCX > rChannel){
1054// KN -> NKpi channel is chosen
1055 isElastic = false;
1056 INCL_DEBUG("KN interaction: NKpi channel chosen" << '\n');
1057 return new NKToNKpiChannel(particle1, particle2);
1058 } else if(elasticCX + quasielasticCX + NKToNKpiCX + NKToNK2piCX > rChannel){
1059// KN -> NK2pi channel is chosen
1060 isElastic = false;
1061 INCL_DEBUG("KN interaction: NK2pi channel chosen" << '\n');
1063 } else {
1064 INCL_WARN("inconsistency within the KN Cross Sections (sum!=inelastic)" << '\n');
1065 if(NKToNK2piCX>0.) {
1066 INCL_WARN("Returning a NKToNK2pi channel" << '\n');
1067 isElastic = false;
1069 } else if(NKToNKpiCX>0.) {
1070 INCL_WARN("Returning a NKToNKpi channel" << '\n');
1071 isElastic = false;
1072 return new NKToNKpiChannel(particle1, particle2);
1073 } else if(quasielasticCX>0.) {
1074 INCL_WARN("Returning a quasi-elastic channel" << '\n');
1075 isElastic = false; // true ??
1076 return new NKToNKChannel(particle1, particle2);
1077 } else {
1078 INCL_WARN("Returning an elastic channel" << '\n');
1079 isElastic = true;
1081 }
1082 }
1083 } else if ((particle1->isNucleon() && particle2->isAntiKaon()) || (particle2->isNucleon() && particle1->isAntiKaon())) {
1084//// KbN
1086 const G4double quasielasticCX = CrossSections::NKbToNKb(particle1,particle2);
1094// assert(std::fabs(totCX-elasticCX-quasielasticCX-NKbToNKbpiCX-NKbToNKb2piCX-NKbToLpiCX-NKbToL2piCX-NKbToSpiCX-NKbToS2piCX)<0.1);
1095
1096 const G4double rChannel=Random::shoot() * totCX;
1097 if(elasticCX > rChannel){
1098// Elastic KbN channel is chosen
1099 isElastic = true;
1100 INCL_DEBUG("KbN interaction: elastic channel chosen" << '\n');
1102 } else if(elasticCX + quasielasticCX > rChannel){
1103// Quasi-elastic KbN channel is chosen
1104 isElastic = false; // true ??
1105 INCL_DEBUG("KbN interaction: quasi-elastic channel chosen" << '\n');
1106 return new NKbToNKbChannel(particle1, particle2);
1107 } else if(elasticCX + quasielasticCX + NKbToNKbpiCX > rChannel){
1108// KbN -> NKbpi channel is chosen
1109 isElastic = false;
1110 INCL_DEBUG("KbN interaction: NKbpi channel chosen" << '\n');
1112 } else if(elasticCX + quasielasticCX + NKbToNKbpiCX + NKbToNKb2piCX > rChannel){
1113// KbN -> NKb2pi channel is chosen
1114 isElastic = false;
1115 INCL_DEBUG("KbN interaction: NKb2pi channel chosen" << '\n');
1117 } else if(elasticCX + quasielasticCX + NKbToNKbpiCX + NKbToNKb2piCX + NKbToLpiCX > rChannel){
1118// KbN -> Lpi channel is chosen
1119 isElastic = false;
1120 INCL_DEBUG("KbN interaction: Lpi channel chosen" << '\n');
1121 return new NKbToLpiChannel(particle1, particle2);
1122 } else if(elasticCX + quasielasticCX + NKbToNKbpiCX + NKbToNKb2piCX + NKbToLpiCX + NKbToL2piCX > rChannel){
1123// KbN -> L2pi channel is chosen
1124 isElastic = false;
1125 INCL_DEBUG("KbN interaction: L2pi channel chosen" << '\n');
1127 } else if(elasticCX + quasielasticCX + NKbToNKbpiCX + NKbToNKb2piCX + NKbToLpiCX + NKbToL2piCX + NKbToSpiCX > rChannel){
1128// KbN -> Spi channel is chosen
1129 isElastic = false;
1130 INCL_DEBUG("KbN interaction: Spi channel chosen" << '\n');
1131 return new NKbToSpiChannel(particle1, particle2);
1132 } else if(elasticCX + quasielasticCX + NKbToNKbpiCX + NKbToNKb2piCX + NKbToLpiCX + NKbToL2piCX + NKbToSpiCX + NKbToS2piCX > rChannel){
1133// KbN -> S2pi channel is chosen
1134 isElastic = false;
1135 INCL_DEBUG("KbN interaction: S2pi channel chosen" << '\n');
1137 } else {
1138 INCL_WARN("inconsistency within the KbN Cross Sections (sum!=inelastic)" << '\n');
1139 if(NKbToS2piCX>0.) {
1140 INCL_WARN("Returning a NKbToS2pi channel" << '\n');
1141 isElastic = false;
1143 } else if(NKbToSpiCX>0.) {
1144 INCL_WARN("Returning a NKbToSpi channel" << '\n');
1145 isElastic = false;
1146 return new NKbToSpiChannel(particle1, particle2);
1147 } else if(NKbToL2piCX>0.) {
1148 INCL_WARN("Returning a NKbToL2pi channel" << '\n');
1149 isElastic = false;
1151 } else if(NKbToLpiCX>0.) {
1152 INCL_WARN("Returning a NKbToLpi channel" << '\n');
1153 isElastic = false;
1154 return new NKbToLpiChannel(particle1, particle2);
1155 } else if(NKbToNKb2piCX>0.) {
1156 INCL_WARN("Returning a NKbToNKb2pi channel" << '\n');
1157 isElastic = false;
1159 } else if(NKbToNKbpiCX>0.) {
1160 INCL_WARN("Returning a NKbToNKbpi channel" << '\n');
1161 isElastic = false;
1163 } else if(quasielasticCX>0.) {
1164 INCL_WARN("Returning a quasi-elastic channel" << '\n');
1165 isElastic = false; // true ??
1166 return new NKbToNKbChannel(particle1, particle2);
1167 } else {
1168 INCL_WARN("Returning an elastic channel" << '\n');
1169 isElastic = true;
1171 }
1172 }
1173 } else if ((particle1->isNucleon() && particle2->isLambda()) || (particle2->isNucleon() && particle1->isLambda())) {
1174//// NLambda
1178// assert(std::fabs(totCX-elasticCX-NLToNSCX)<0.1);
1179
1180 const G4double rChannel=Random::shoot() * totCX;
1181 if(elasticCX > rChannel){
1182// Elastic NLambda channel is chosen
1183 isElastic = true;
1184 INCL_DEBUG("NLambda interaction: elastic channel chosen" << '\n');
1186 } else if(elasticCX + NLToNSCX > rChannel){
1187// Quasi-elastic NLambda channel is chosen
1188 isElastic = false; // true ??
1189 INCL_DEBUG("NLambda interaction: quasi-elastic channel chosen" << '\n');
1190 return new NLToNSChannel(particle1, particle2);
1191 } else {
1192 INCL_WARN("inconsistency within the NLambda Cross Sections (sum!=inelastic)" << '\n');
1193 if(NLToNSCX>0.) {
1194 INCL_WARN("Returning a quasi-elastic channel" << '\n');
1195 isElastic = false; // true ??
1196 return new NLToNSChannel(particle1, particle2);
1197 } else {
1198 INCL_WARN("Returning an elastic channel" << '\n');
1199 isElastic = true;
1201 }
1202 }
1203 } else if ((particle1->isNucleon() && particle2->isSigma()) || (particle2->isNucleon() && particle1->isSigma())) {
1204//// NSigma
1209// assert(std::fabs(totCX-elasticCX-NSToNLCX-NSToNSCX)<0.1);
1210
1211 const G4double rChannel=Random::shoot() * totCX;
1212 if(elasticCX > rChannel){
1213// Elastic NSigma channel is chosen
1214 isElastic = true;
1215 INCL_DEBUG("NSigma interaction: elastic channel chosen" << '\n');
1217 } else if(elasticCX + NSToNLCX > rChannel){
1218// NSigma -> NLambda channel is chosen
1219 isElastic = false; // true ??
1220 INCL_DEBUG("NSigma interaction: NLambda channel chosen" << '\n');
1221 return new NSToNLChannel(particle1, particle2);
1222 } else if(elasticCX + NSToNLCX + NSToNSCX > rChannel){
1223// NSigma -> NSigma quasi-elastic channel is chosen
1224 isElastic = false; // true ??
1225 INCL_DEBUG("NSigma interaction: NSigma quasi-elastic channel chosen" << '\n');
1226 return new NSToNSChannel(particle1, particle2);
1227 } else {
1228 INCL_WARN("inconsistency within the NSigma Cross Sections (sum!=inelastic)" << '\n');
1229 if(NSToNSCX>0.) {
1230 INCL_WARN("Returning a quasi-elastic channel" << '\n');
1231 isElastic = false; // true ??
1232 return new NSToNSChannel(particle1, particle2);
1233 } else if(NSToNLCX>0.) {
1234 INCL_WARN("Returning a NLambda channel" << '\n');
1235 isElastic = false; // true ??
1236 return new NSToNLChannel(particle1, particle2);
1237 } else {
1238 INCL_WARN("Returning an elastic channel" << '\n');
1239 isElastic = true;
1241 }
1242 }
1244//// NNbar
1253
1254// assert(std::fabs(totCX-NNbElasticCX-NNbCEXCX-NNbToLLbCX-NNbToNNbpiCX-NNbToNNb2piCX-NNbToNNb3piCX-AnnihilationCX)<0.1);
1255
1256 const G4double rChannel=Random::shoot() * totCX;
1257 if (NNbElasticCX > rChannel) {
1258 // NNbar (elastic) channel is chosen
1259 isElastic = true;
1260 //INCL_WARN("NNbar interaction: NNbarElastic channel chosen" << '\n');
1262 } else if (NNbElasticCX + NNbCEXCX > rChannel) {
1263 // NNbar (CEX) channel is chosen
1264 isElastic = false; // may be charge-exchange also
1265 //INCL_WARN("NNbar interaction: NNbarCEX channel chosen" << '\n');
1266 return new NNbarCEXChannel(particle1, particle2);
1267 } else if (NNbElasticCX + NNbCEXCX + NNbToLLbCX > rChannel) {
1268 // NNbarToLLbar channel is chosen
1269 isElastic = false; // may be charge-exchange also
1270 //INCL_WARN("NNbar interaction: NNbarToLLbar channel chosen" << '\n');
1272 } else if (NNbElasticCX + NNbCEXCX + NNbToLLbCX + NNbToNNbpiCX > rChannel) {
1273 // NNbar to NNbar pi channel is chosen
1274 isElastic = false;
1275 //INCL_WARN("NNbar interaction: NNbar pi channel chosen" << '\n');
1277 } else if (NNbElasticCX + NNbCEXCX + NNbToLLbCX + NNbToNNbpiCX + NNbToNNb2piCX > rChannel) {
1278 // NNbar to NNbar 2pi channel is chosen
1279 isElastic = false;
1280 //INCL_WARN("NNbar interaction: NNbar 2pi channel chosen" << '\n');
1282 } else if (NNbElasticCX + NNbCEXCX + NNbToLLbCX + NNbToNNbpiCX + NNbToNNb2piCX + NNbToNNb3piCX > rChannel) {
1283 // NNbar to NNbar 3pi channel is chosen
1284 isElastic = false;
1285 //INCL_WARN("NNbar interaction: NNbar 3pi channel chosen" << '\n');
1287 } else if (NNbElasticCX + NNbCEXCX + NNbToLLbCX + NNbToNNbpiCX + NNbToNNb2piCX + NNbToNNb3piCX +AnnihilationCX > rChannel){
1288 // NNbar annihilation channel is chosen
1289 isElastic = false;
1290 AnnihilationType atype;
1292 atype = PTypeInFlight;
1293 }
1295 atype = NTypeInFlight;
1296 }
1298 atype = NbarPTypeInFlight;
1299 }
1301 atype = NbarNTypeInFlight;
1302 }
1303 else{
1304 atype = Def;
1305 INCL_ERROR("Annihilation type problem " << '\n');
1306 }
1307 theNucleus->setAType(atype);
1309 } else {
1310 INCL_WARN("Inconsistency within the NNbar Cross Sections (sum != inelastic)" << '\n');
1311 if (NNbToNNb3piCX > 0.0) {
1312 INCL_WARN("Returning an NNbar 3pi channel" << '\n');
1313 isElastic = false;
1315 } else if (NNbToNNb2piCX > 0.0) {
1316 INCL_WARN("Returning an NNbar 2pi channel" << '\n');
1317 isElastic = false;
1319 } else if (NNbToNNbpiCX > 0.0) {
1320 INCL_WARN("Returning an NNbar pi channel" << '\n');
1321 isElastic = false;
1323 } else if (AnnihilationCX > 0.0) {
1324 INCL_WARN("Returning an NNbar annihilation channel" << '\n');
1325 isElastic = false;
1326 AnnihilationType atype;
1328 atype = PTypeInFlight;
1329 }
1331 atype = NTypeInFlight;
1332 }
1334 atype = NbarPTypeInFlight;
1335 }
1337 atype = NbarNTypeInFlight;
1338 }
1339 else{
1340 atype = Def;
1341 INCL_ERROR("Annihilation type problem " << '\n');
1342 }
1343 theNucleus->setAType(atype);
1345 } else if (NNbCEXCX > 0.0) {
1346 INCL_WARN("Returning an NNbar CEX channel" << '\n');
1347 isElastic = false;
1348 return new NNbarCEXChannel(particle1, particle2);
1349 } else if (NNbToLLbCX > 0.0) {
1350 INCL_WARN("Returning an NNbar LLbar channel" << '\n');
1351 isElastic = false;
1353 } else {
1354 INCL_WARN("Elastic NNbar channel chosen" << '\n');
1355 isElastic = true;
1357 }
1358 }
1359 }
1360
1361 else {
1362 INCL_DEBUG("BinaryCollisionAvatar can only handle nucleons (for the moment)."
1363 << '\n'
1364 << particle1->print()
1365 << '\n'
1366 << particle2->print()
1367 << '\n');
1369 return NULL;
1370 }
1371 }
1372
1374 isParticle1Spectator = particle1->isTargetSpectator();
1375 isParticle2Spectator = particle2->isTargetSpectator();
1377 }
1378
1380 // Call the postInteraction method of the parent class
1381 // (provides Pauli blocking and enforces energy conservation)
1383
1384 switch(fs->getValidity()) {
1385 case PauliBlockedFS:
1387 break;
1391 break;
1392 case ValidFS:
1393 Book &theBook = theNucleus->getStore()->getBook();
1395
1396 if(theBook.getAcceptedCollisions() == 1) {
1397 // Store time and cross section of the first collision
1398 G4double t = theBook.getCurrentTime();
1399 theBook.setFirstCollisionTime(t);
1401 // Increase the number of Kaon by 1
1402 if(isStrangeProduction) theNucleus->setNumberOfKaon(theNucleus->getNumberOfKaon()+1);
1403 // Store position and momentum of the spectator on the first
1404 // collision
1405 if((isParticle1Spectator && isParticle2Spectator) || (!isParticle1Spectator && !isParticle2Spectator)) {
1406 INCL_ERROR("First collision must be within a target spectator and a non-target spectator");
1407 }
1408 if(isParticle1Spectator) {
1411 } else {
1414 }
1415
1416 // Store the elasticity of the first collision
1417 theBook.setFirstCollisionIsElastic(isElastic);
1418 }
1419 }
1420 return;
1421 }
1422
1423 std::string BinaryCollisionAvatar::dump() const {
1424 std::stringstream ss;
1425 ss << "(avatar " << theTime <<" 'nn-collision" << '\n'
1426 << "(list " << '\n'
1427 << particle1->dump()
1428 << particle2->dump()
1429 << "))" << '\n';
1430 return ss.str();
1431 }
1432
1433}
#define INCL_ERROR(x)
#define INCL_WARN(x)
#define INCL_DEBUG(x)
Delta-nucleon recombination channel.
double G4double
Definition G4Types.hh:83
BinaryCollisionAvatar(G4double, G4double, G4INCL::Nucleus *, G4INCL::Particle *, G4INCL::Particle *)
void setFirstCollisionSpectatorMomentum(const G4double x)
Definition G4INCLBook.hh:91
void setFirstCollisionXSec(const G4double x)
Definition G4INCLBook.hh:85
void incrementAcceptedCollisions()
Definition G4INCLBook.hh:72
void setFirstCollisionTime(const G4double t)
Definition G4INCLBook.hh:82
G4double getCurrentTime() const
Definition G4INCLBook.hh:98
G4int getAcceptedCollisions() const
void setFirstCollisionSpectatorPosition(const G4double x)
Definition G4INCLBook.hh:88
void incrementBlockedCollisions()
Definition G4INCLBook.hh:73
void setFirstCollisionIsElastic(const G4bool e)
Definition G4INCLBook.hh:94
FinalStateValidity getValidity() const
void setType(AvatarType t)
void restoreParticles() const
Restore the state of both particles.
static G4ThreadLocal Particle * backupParticle2
static G4ThreadLocal Particle * backupParticle1
Store * getStore() const
void setAType(AnnihilationType type)
G4bool isLambda() const
Is this a Lambda?
void setNumberOfKaon(const G4int NK)
G4bool isOmega() const
Is this an omega?
std::string dump() const
G4bool isSigma() const
Is this a Sigma?
const G4INCL::ThreeVector & getPosition() const
G4bool isTargetSpectator() const
static std::vector< G4int > MergeVectorBias(Particle const *const p1, Particle const *const p2)
G4bool isAntiNucleon() const
Is this an antinucleon?
G4bool isEta() const
Is this an eta?
G4bool isAntiKaon() const
Is this an antiKaon?
const G4INCL::ThreeVector & getMomentum() const
G4INCL::ParticleType getType() const
G4bool isKaon() const
Is this a Kaon?
G4int getNumberOfKaon() const
Number of Kaon inside de nucleus.
std::string print() const
G4bool isDelta() const
Is it a Delta?
static G4double getBiasFromVector(std::vector< G4int > VectorBias)
G4bool isNucleon() const
Book & getBook()
G4double dot(const ThreeVector &v) const
G4double mag2() const
G4double NSToNL(Particle const *const p1, Particle const *const p2)
G4double NNToNNKKb(Particle const *const p1, Particle const *const p2)
G4double elastic(Particle const *const p1, Particle const *const p2)
G4double NpiToSK(Particle const *const p1, Particle const *const p2)
G4double piNToOmegaN(Particle const *const p1, Particle const *const p2)
G4double NNbarCEX(Particle const *const p1, Particle const *const p2)
G4double NKbToNKb2pi(Particle const *const p1, Particle const *const p2)
G4double NNToNDeltaOmega(Particle const *const p1, Particle const *const p2)
G4double NDeltaToDeltaLK(Particle const *const p1, Particle const *const p2)
G4double NNToNSKpi(Particle const *const p1, Particle const *const p2)
G4double etaNToPiN(Particle const *const p1, Particle const *const p2)
G4double NDeltaToNNKKb(Particle const *const p1, Particle const *const p2)
G4double NKbToLpi(Particle const *const p1, Particle const *const p2)
G4double NNToNLK2pi(Particle const *const p1, Particle const *const p2)
G4double etaNToPiPiN(Particle const *const p1, Particle const *const p2)
G4double NKbToS2pi(Particle const *const p1, Particle const *const p2)
G4double piNToEtaN(Particle const *const p1, Particle const *const p2)
G4double NNbarToAnnihilation(Particle const *const p1, Particle const *const p2)
Nucleon-AntiNucleon total annihilation cross sections.
G4double omegaNToPiN(Particle const *const p1, Particle const *const p2)
G4double NDeltaToNSK(Particle const *const p1, Particle const *const p2)
G4double NKbToSpi(Particle const *const p1, Particle const *const p2)
G4double NNToNDelta(Particle const *const p1, Particle const *const p2)
G4double NNToNSK(Particle const *const p1, Particle const *const p2)
G4double NDeltaToNLK(Particle const *const p1, Particle const *const p2)
G4double NLToNS(Particle const *const p1, Particle const *const p2)
G4double piNToDelta(Particle const *const p1, Particle const *const p2)
G4double NKbToNKb(Particle const *const p1, Particle const *const p2)
G4double NNToNSK2pi(Particle const *const p1, Particle const *const p2)
G4double NNbarToNNbar3pi(Particle const *const p1, Particle const *const p2)
G4double NNToNLK(Particle const *const p1, Particle const *const p2)
Strange cross sections.
G4double NNToNNEtaExclu(Particle const *const p1, Particle const *const p2)
G4double NNToNDeltaEta(Particle const *const p1, Particle const *const p2)
G4double NNToNNOmegaxPi(const G4int xpi, Particle const *const p1, Particle const *const p2)
G4double NNToNNEtaxPi(const G4int xpi, Particle const *const p1, Particle const *const p2)
G4double NNbarToNNbarpi(Particle const *const p1, Particle const *const p2)
Nucleon-AntiNucleon to Nucleon-AntiNucleon + pions cross sections.
G4double NSToNS(Particle const *const p1, Particle const *const p2)
G4double NpiToNKKb(Particle const *const p1, Particle const *const p2)
G4double NpiToLK2pi(Particle const *const p1, Particle const *const p2)
G4double omegaNToPiPiN(Particle const *const p1, Particle const *const p2)
G4double NDeltaToDeltaSK(Particle const *const p1, Particle const *const p2)
G4double NpiToMissingStrangeness(Particle const *const p1, Particle const *const p2)
G4double NNbarToNNbar2pi(Particle const *const p1, Particle const *const p2)
G4double total(Particle const *const p1, Particle const *const p2)
G4double NDeltaToNN(Particle const *const p1, Particle const *const p2)
G4double NpiToLKpi(Particle const *const p1, Particle const *const p2)
G4double NKbToNKbpi(Particle const *const p1, Particle const *const p2)
G4double NNToNLKpi(Particle const *const p1, Particle const *const p2)
G4double NKbToL2pi(Particle const *const p1, Particle const *const p2)
G4double NNToxPiNN(const G4int xpi, Particle const *const p1, Particle const *const p2)
G4double NKToNK2pi(Particle const *const p1, Particle const *const p2)
G4double NKToNKpi(Particle const *const p1, Particle const *const p2)
G4double NNToNNOmegaExclu(Particle const *const p1, Particle const *const p2)
G4double NpiToSK2pi(Particle const *const p1, Particle const *const p2)
G4double NKToNK(Particle const *const p1, Particle const *const p2)
G4double NNToMissingStrangeness(Particle const *const p1, Particle const *const p2)
G4double piNToxPiN(const G4int xpi, Particle const *const p1, Particle const *const p2)
G4double NNbarToLLbar(Particle const *const p1, Particle const *const p2)
G4double NpiToLK(Particle const *const p1, Particle const *const p2)
G4double NNbarElastic(Particle const *const p1, Particle const *const p2)
antiparticle cross sections
G4double NpiToSKpi(Particle const *const p1, Particle const *const p2)
G4double squareTotalEnergyInCM(Particle const *const p1, Particle const *const p2)
const G4double tenPi
G4double shoot()
@ CollisionAvatarType
@ NoEnergyConservationFS
@ NbarPTypeInFlight
@ NbarNTypeInFlight
#define G4ThreadLocal
Definition tls.hh:77