34 #define INCLXX_IN_GEANT4_MODE 1
89 isParticle1Spectator(false),
90 isParticle2Spectator(false),
108 if(energyCM2 < cutNNSquared) {
109 INCL_DEBUG(
"CM energy = sqrt(" << energyCM2 <<
") MeV < std::sqrt(" << cutNNSquared
110 <<
") MeV = cutNN" <<
"; returning a NULL channel" <<
'\n');
139 if(minDist > theCrossSection) {
140 INCL_DEBUG(
"CM distance of approach is too small: " << minDist <<
">" <<
141 theCrossSection <<
"; returning a NULL channel" <<
'\n');
170 if(elasticCX > rChannel) {
173 INCL_DEBUG(
"NN interaction: elastic channel chosen" <<
'\n');
175 }
else if((elasticCX + deltaProductionCX) > rChannel) {
178 INCL_DEBUG(
"NN interaction: Delta channel chosen" <<
'\n');
180 }
else if(elasticCX + deltaProductionCX + onePiProductionCX > rChannel) {
183 INCL_DEBUG(
"NN interaction: one Pion channel chosen" <<
'\n');
185 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX > rChannel) {
188 INCL_DEBUG(
"NN interaction: two Pions channel chosen" <<
'\n');
190 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX > rChannel) {
193 INCL_DEBUG(
"NN interaction: three Pions channel chosen" <<
'\n');
195 }
else if (elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX > rChannel) {
198 INCL_DEBUG(
"NN interaction: four Pions channel chosen" <<
'\n');
200 }
else if (elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX + etaProductionCX > rChannel) {
203 INCL_DEBUG(
"NN interaction: Eta channel chosen" <<
'\n');
205 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX + etaProductionCX + etadeltaProductionCX > rChannel) {
208 INCL_DEBUG(
"NN interaction: Delta Eta channel chosen" <<
'\n');
210 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX > rChannel) {
213 INCL_DEBUG(
"NN interaction: Eta + one Pion channel chosen" <<
'\n');
215 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX > rChannel) {
218 INCL_DEBUG(
"NN interaction: Eta + two Pions channel chosen" <<
'\n');
220 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX > rChannel) {
223 INCL_DEBUG(
"NN interaction: Eta + three Pions channel chosen" <<
'\n');
225 }
else if (elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX > rChannel) {
228 INCL_DEBUG(
"NN interaction: Eta + four Pions channel chosen" <<
'\n');
230 }
else if (elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX + omegaProductionCX > rChannel) {
233 INCL_DEBUG(
"NN interaction: Omega channel chosen" <<
'\n');
235 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX + omegaProductionCX + omegadeltaProductionCX > rChannel) {
238 INCL_DEBUG(
"NN interaction: Delta Omega channel chosen" <<
'\n');
240 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX > rChannel) {
243 INCL_DEBUG(
"NN interaction: Omega + one Pion channel chosen" <<
'\n');
245 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX > rChannel) {
248 INCL_DEBUG(
"NN interaction: Omega + two Pions channel chosen" <<
'\n');
250 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX + omegathreePiProductionCX > rChannel) {
253 INCL_DEBUG(
"NN interaction: Omega + three Pions channel chosen" <<
'\n');
255 }
else if (elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + fourPiProductionCX + etaProductionCX + etadeltaProductionCX + etaonePiProductionCX + etatwoPiProductionCX + etathreePiProductionCX + etafourPiProductionCX + omegaProductionCX + omegadeltaProductionCX + omegaonePiProductionCX + omegatwoPiProductionCX + omegathreePiProductionCX + omegafourPiProductionCX > rChannel) {
258 INCL_DEBUG(
"NN interaction: Omega + four Pions channel chosen" <<
'\n');
261 INCL_WARN(
"inconsistency within the NN Cross Sections (sum!=inelastic)" <<
'\n');
262 if(omegafourPiProductionCX>0.) {
263 INCL_WARN(
"Returning an Omega + four Pions channel" <<
'\n');
266 }
else if(omegathreePiProductionCX>0.) {
267 INCL_WARN(
"Returning an Omega + three Pions channel" <<
'\n');
270 }
else if(omegatwoPiProductionCX>0.) {
271 INCL_WARN(
"Returning an Omega + two Pions channel" <<
'\n');
274 }
else if(omegaonePiProductionCX>0.) {
275 INCL_WARN(
"Returning an Omega + one Pion channel" <<
'\n');
278 }
else if(omegadeltaProductionCX>0.) {
279 INCL_WARN(
"Returning an Omega + Delta channel" <<
'\n');
282 }
else if(omegaProductionCX>0.) {
283 INCL_WARN(
"Returning an Omega channel" <<
'\n');
286 }
else if(etafourPiProductionCX>0.) {
287 INCL_WARN(
"Returning an Eta + four Pions channel" <<
'\n');
290 }
else if(etathreePiProductionCX>0.) {
291 INCL_WARN(
"Returning an Eta + threev channel" <<
'\n');
294 }
else if(etatwoPiProductionCX>0.) {
295 INCL_WARN(
"Returning an Eta + two Pions channel" <<
'\n');
298 }
else if(etaonePiProductionCX>0.) {
299 INCL_WARN(
"Returning an Eta + one Pion channel" <<
'\n');
302 }
else if(etadeltaProductionCX>0.) {
303 INCL_WARN(
"Returning an Eta + Delta channel" <<
'\n');
306 }
else if(etaProductionCX>0.) {
307 INCL_WARN(
"Returning an Eta channel" <<
'\n');
310 }
else if(fourPiProductionCX>0.) {
311 INCL_WARN(
"Returning a 4pi channel" <<
'\n');
314 }
else if(threePiProductionCX>0.) {
315 INCL_WARN(
"Returning a 3pi channel" <<
'\n');
318 }
else if(twoPiProductionCX>0.) {
319 INCL_WARN(
"Returning a 2pi channel" <<
'\n');
322 }
else if(onePiProductionCX>0.) {
323 INCL_WARN(
"Returning a 1pi channel" <<
'\n');
326 }
else if(deltaProductionCX>0.) {
327 INCL_WARN(
"Returning a delta-production channel" <<
'\n');
331 INCL_WARN(
"Returning an elastic channel" <<
'\n');
343 if(elasticCX/(elasticCX + recombinationCX) <
Random::shoot()) {
350 INCL_DEBUG(
"NDelta interaction: elastic channel chosen" <<
'\n');
354 INCL_DEBUG(
"NDelta interaction: recombination channel chosen" <<
'\n');
361 INCL_DEBUG(
"DeltaDelta interaction: elastic channel chosen" <<
'\n');
378 if(elasticCX > rChannel) {
381 INCL_DEBUG(
"PiN interaction: elastic channel chosen" <<
'\n');
383 }
else if(elasticCX + deltaProductionCX > rChannel) {
386 INCL_DEBUG(
"PiN interaction: Delta channel chosen" <<
'\n');
388 }
else if(elasticCX + deltaProductionCX + onePiProductionCX > rChannel) {
391 INCL_DEBUG(
"PiN interaction: one Pion channel chosen" <<
'\n');
393 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX > rChannel) {
396 INCL_DEBUG(
"PiN interaction: two Pions channel chosen" <<
'\n');
398 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX > rChannel) {
401 INCL_DEBUG(
"PiN interaction: three Pions channel chosen" <<
'\n');
403 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + etaProductionCX > rChannel) {
406 INCL_DEBUG(
"PiN interaction: Eta channel chosen" <<
'\n');
408 }
else if(elasticCX + deltaProductionCX + onePiProductionCX + twoPiProductionCX + threePiProductionCX + etaProductionCX+ omegaProductionCX > rChannel) {
411 INCL_DEBUG(
"PiN interaction: Omega channel chosen" <<
'\n');
416 INCL_WARN(
"inconsistency within the PiN Cross Sections (sum!=inelastic)" <<
'\n');
417 if(omegaProductionCX>0.) {
418 INCL_WARN(
"Returning a Omega channel" <<
'\n');
421 }
else if(etaProductionCX>0.) {
422 INCL_WARN(
"Returning a Eta channel" <<
'\n');
425 }
else if(threePiProductionCX>0.) {
426 INCL_WARN(
"Returning a 3pi channel" <<
'\n');
429 }
else if(twoPiProductionCX>0.) {
430 INCL_WARN(
"Returning a 2pi channel" <<
'\n');
433 }
else if(onePiProductionCX>0.) {
434 INCL_WARN(
"Returning a 1pi channel" <<
'\n');
437 }
else if(deltaProductionCX>0.) {
438 INCL_WARN(
"Returning a delta-production channel" <<
'\n');
442 INCL_WARN(
"Returning an elastic channel" <<
'\n');
458 if(elasticCX > rChannel) {
461 INCL_DEBUG(
"EtaN interaction: elastic channel chosen" <<
'\n');
463 }
else if(elasticCX + onePiProductionCX > rChannel) {
466 INCL_DEBUG(
"EtaN interaction: PiN channel chosen" <<
'\n');
468 }
else if(elasticCX + onePiProductionCX + twoPiProductionCX > rChannel) {
471 INCL_DEBUG(
"EtaN interaction: PiPiN channel chosen" <<
'\n');
476 INCL_WARN(
"inconsistency within the EtaN Cross Sections (sum!=inelastic)" <<
'\n');
477 if(twoPiProductionCX>0.) {
478 INCL_WARN(
"Returning a PiPiN channel" <<
'\n');
481 }
else if(onePiProductionCX>0.) {
482 INCL_WARN(
"Returning a PiN channel" <<
'\n');
486 INCL_WARN(
"Returning an elastic channel" <<
'\n');
503 if(elasticCX > rChannel) {
506 INCL_DEBUG(
"OmegaN interaction: elastic channel chosen" <<
'\n');
508 }
else if(elasticCX + onePiProductionCX > rChannel) {
511 INCL_DEBUG(
"OmegaN interaction: PiN channel chosen" <<
'\n');
513 }
else if(elasticCX + onePiProductionCX + twoPiProductionCX > rChannel) {
516 INCL_DEBUG(
"OmegaN interaction: PiPiN channel chosen" <<
'\n');
521 INCL_WARN(
"inconsistency within the OmegaN Cross Sections (sum!=inelastic)" <<
'\n');
522 if(twoPiProductionCX>0.) {
523 INCL_WARN(
"Returning a PiPiN channel" <<
'\n');
526 }
else if(onePiProductionCX>0.) {
527 INCL_WARN(
"Returning a PiN channel" <<
'\n');
531 INCL_WARN(
"Returning an elastic channel" <<
'\n');
538 INCL_DEBUG(
"BinaryCollisionAvatar can only handle nucleons (for the moment)."
579 if((isParticle1Spectator && isParticle2Spectator) || (!isParticle1Spectator && !isParticle2Spectator)) {
580 INCL_ERROR(
"First collision must be within a target spectator and a non-target spectator");
582 if(isParticle1Spectator) {
598 std::stringstream ss;
599 ss <<
"(avatar " <<
theTime <<
" 'nn-collision" <<
'\n'
G4bool isEta() const
Is this a eta?
G4double NNToNNEtaxPi(const G4int xpi, Particle const *const p1, Particle const *const p2)
FinalStateValidity getValidity() const
void incrementBlockedCollisions()
G4double dot(const ThreeVector &v) const
G4double etaNToPiN(Particle const *const p1, Particle const *const p2)
G4int getAcceptedCollisions() const
G4double squareTotalEnergyInCM(Particle const *const p1, Particle const *const p2)
void postInteraction(FinalState *)
G4double omegaNToPiN(Particle const *const p1, Particle const *const p2)
G4double NNToNNOmegaxPi(const G4int xpi, Particle const *const p1, Particle const *const p2)
G4bool isTargetSpectator() const
G4double etaNToPiPiN(Particle const *const p1, Particle const *const p2)
const G4INCL::ThreeVector & getMomentum() const
G4bool isDelta() const
Is it a Delta?
std::string print() const
G4double NDeltaToNN(Particle const *const p1, Particle const *const p2)
virtual void postInteraction(FinalState *)
static G4ThreadLocal Particle * backupParticle2
void incrementAcceptedCollisions()
G4bool isOmega() const
Is this a omega?
void setType(AvatarType t)
G4double piNToEtaN(Particle const *const p1, Particle const *const p2)
void setFirstCollisionXSec(const G4double x)
static G4ThreadLocal Particle * backupParticle1
G4double NNToNDeltaOmega(Particle const *const p1, Particle const *const p2)
G4double NNToNDelta(Particle const *const p1, Particle const *const p2)
G4double NNToNNEtaExclu(Particle const *const p1, Particle const *const p2)
void setFirstCollisionTime(const G4double t)
G4double omegaNToPiPiN(Particle const *const p1, Particle const *const p2)
Delta-nucleon recombination channel.
G4double NNToNDeltaEta(Particle const *const p1, Particle const *const p2)
G4double total(Particle const *const p1, Particle const *const p2)
G4INCL::IChannel * getChannel()
const G4INCL::ThreeVector & getPosition() const
virtual void preInteraction()
G4double piNToDelta(Particle const *const p1, Particle const *const p2)
G4double NNToNNOmegaExclu(Particle const *const p1, Particle const *const p2)
virtual ~BinaryCollisionAvatar()
G4double piNToxPiN(const G4int xpi, Particle const *const p1, Particle const *const p2)
void restoreParticles() const
Restore the state of both particles.
G4double piNToOmegaN(Particle const *const p1, Particle const *const p2)
BinaryCollisionAvatar(G4double, G4double, G4INCL::Nucleus *, G4INCL::Particle *, G4INCL::Particle *)
G4double getCurrentTime() const
void setFirstCollisionIsElastic(const G4bool e)
G4double NNToxPiNN(const G4int xpi, Particle const *const p1, Particle const *const p2)
void setFirstCollisionSpectatorMomentum(const G4double x)
G4double elastic(Particle const *const p1, Particle const *const p2)
void setFirstCollisionSpectatorPosition(const G4double x)