34 #define INCLXX_IN_GEANT4_MODE 1
45 #ifndef G4INCLNucleus_hh
46 #define G4INCLNucleus_hh 1
69 :
Cluster(charge,mass,strangess,true),
70 theInitialZ(charge), theInitialA(mass), theInitialS(strangess),
71 theNpInitial(0), theNnInitial(0),
72 theNpionplusInitial(0), theNpionminusInitial(0),
73 theNkaonplusInitial(0), theNkaonminusInitial(0),
74 initialInternalEnergy(0.),
75 incomingAngularMomentum(0.,0.,0.), incomingMomentum(0.,0.,0.),
76 initialCenterOfMass(0.,0.,0.),
80 theUniverseRadius(universeRadius),
81 isNucleusNucleus(false),
82 theProjectileRemnant(NULL),
146 for(
ParticleIter iter=created.begin(),
e=created.end(); iter!=
e; ++iter) {
148 if(!(*iter)->isOutOfWell()) {
149 totalEnergy += (*iter)->getEnergy() - (*iter)->getPotentialEnergy();
154 for(
ParticleIter iter=deleted.begin(),
e=deleted.end(); iter!=
e; ++iter) {
159 for(
ParticleIter iter=modified.begin(),
e=modified.end(); iter!=
e; ++iter) {
161 totalEnergy += (*iter)->getEnergy() - (*iter)->getPotentialEnergy();
165 for(
ParticleIter iter=out.begin(),
e=out.end(); iter!=
e; ++iter) {
166 if((*iter)->isCluster()) {
169 #ifdef INCLXX_IN_GEANT4_MODE
179 totalEnergy += (*iter)->getEnergy();
180 theA -= (*iter)->getA();
181 theZ -= (*iter)->getZ();
182 theS -= (*iter)->getS();
188 for(
ParticleIter iter=entering.begin(),
e=entering.end(); iter!=
e; ++iter) {
190 totalEnergy += (*iter)->getEnergy() - (*iter)->getPotentialEnergy();
196 INCL_DEBUG(
"A Particle is entering below the Fermi sea:" <<
'\n' << finalstate->
print() <<
'\n');
199 for(
ParticleIter iter=entering.begin(),
e=entering.end(); iter!=
e; ++iter) {
206 INCL_ERROR(
"Energy nonconservation! Energy at the beginning of the event = "
208 <<
" and after interaction = "
209 << totalEnergy <<
'\n'
210 << finalstate->
print());
215 INCL_WARN(
"Useless Nucleus::propagateParticles -method called." <<
'\n');
222 if((*p)->isNucleon())
223 totalEnergy += (*p)->getKineticEnergy() - (*p)->getPotentialEnergy();
224 else if((*p)->isResonance())
226 else if((*p)->isLambda())
227 totalEnergy += (*p)->getKineticEnergy() - (*p)->getPotentialEnergy();
229 totalEnergy += (*p)->getEnergy() - (*p)->getPotentialEnergy();
252 theSpin -= (*p)->getAngularMomentum();
273 const G4double mass = (*p)->getMass();
274 cm += (*p)->getPosition() * mass;
290 std::stringstream
ss;
291 ss <<
"Particles in the nucleus:" <<
'\n'
292 <<
"Inside:" <<
'\n';
296 ss <<
"index = " << counter <<
'\n'
300 ss <<
"Outgoing:" <<
'\n';
312 if((*i)->isDelta()) deltas.push_back((*i));
314 if(deltas.empty())
return false;
317 INCL_DEBUG(
"Decay outgoing delta particle:" <<
'\n'
318 << (*i)->print() <<
'\n');
320 const G4double deltaMass = (*i)->getMass();
325 (*i)->setEnergy((*i)->getMass());
338 newMomentum *= decayMomentum / newMomentum.
mag();
350 nucleon->
boost(beta);
369 const G4bool unphysicalRemnant = (theZ<0 || theZ>
theA);
377 if((*i)->isDelta()) deltas.push_back((*i));
381 INCL_DEBUG(
"Decay inside delta particle:" <<
'\n'
382 << (*i)->print() <<
'\n');
388 if(unphysicalRemnant) {
389 INCL_WARN(
"Forcing delta decay inside an unphysical remnant (A=" <<
theA
390 <<
", Z=" <<
theZ <<
"). Might lead to energy-violation warnings."
409 if(unphysicalRemnant) {
410 INCL_DEBUG(
"Remnant is unphysical: Z=" <<
theZ <<
", A=" <<
theA <<
", emitting all the pions" <<
'\n');
422 const G4bool unphysicalRemnant = (theZ<0 || theZ>
theA);
423 if(unphysicalRemnant){
425 INCL_WARN(
"Remnant is unphysical: Z=" <<
theZ <<
", A=" <<
theA <<
", too much strange particles? -> all emit" <<
'\n');
437 if((*i)->isSigma() || (*i)->isAntiKaon()) stranges.push_back((*i));
438 else if((*i)->isNucleon() && (*i)->getZ() == 1) protons.push_back((*i));
439 else if((*i)->isNucleon() && (*i)->getZ() == 0) neutrons.push_back((*i));
442 if((stranges.size() > protons.size()) || (stranges.size() > neutrons.size())){
443 INCL_WARN(
"Remnant is unphysical: Nproton=" << protons.size() <<
", Nneutron=" << neutrons.size() <<
", Strange particles : " << stranges.size() <<
'\n');
451 for(
ParticleIter i=stranges.begin(),
e=stranges.end(); i!=
e; ++i) {
452 INCL_DEBUG(
"Absorbe inside strange particles:" <<
'\n'
453 << (*i)->print() <<
'\n');
456 decay =
new DecayAvatar((*protonIter), (*i), 0.0,
this,
true);
460 decay =
new DecayAvatar((*neutronIter), (*i), 0.0,
this,
true);
463 else if(
Random::shoot()*(protons.size() + neutrons.size()) < protons.size()){
464 decay =
new DecayAvatar((*protonIter), (*i), 0.0,
this,
true);
468 decay =
new DecayAvatar((*neutronIter), (*i), 0.0,
this,
true);
487 if(pionResonances.empty())
return false;
489 for(
ParticleIter i=pionResonances.begin(),
e=pionResonances.end(); i!=
e; ++i) {
490 INCL_DEBUG(
"Decay outgoing pionResonances particle:" <<
'\n'
491 << (*i)->print() <<
'\n');
493 const G4double pionResonanceMass = (*i)->getMass();
498 (*i)->setEnergy((*i)->getMass());
506 Particle *
const theCreatedParticle1 = created.front();
508 if (created.size() == 1) {
513 newMomentum *= decayMomentum / newMomentum.
mag();
519 theCreatedParticle1->
boost(beta);
525 theModifiedParticle->
boost(beta);
529 else if (created.size() == 2) {
530 Particle *
const theCreatedParticle2 = created.back();
532 theCreatedParticle1->
boost(beta);
534 theCreatedParticle2->
boost(beta);
536 theModifiedParticle->
boost(beta);
542 INCL_ERROR(
"Wrong number (< 2) of created particles during the decay of a pion resonance");
557 if(neutralsigma.empty())
return false;
559 for(
ParticleIter i=neutralsigma.begin(),
e=neutralsigma.end(); i!=
e; ++i) {
560 INCL_DEBUG(
"Decay outgoing neutral sigma:" <<
'\n'
561 << (*i)->print() <<
'\n');
563 const G4double neutralsigmaMass = (*i)->getMass();
568 (*i)->setEnergy((*i)->getMass());
576 Particle *
const theCreatedParticle = created.front();
578 if (created.size() == 1) {
583 newMomentum *= decayMomentum / newMomentum.
mag();
588 theCreatedParticle->
boost(beta);
594 theModifiedParticle->
boost(beta);
599 INCL_ERROR(
"Wrong number (!= 1) of created particles during the decay of a sigma zero");
612 if((*i)->getType() ==
KZero || (*i)->getType() ==
KZeroBar) neutralkaon.push_back((*i));
614 if(neutralkaon.empty())
return false;
616 for(
ParticleIter i=neutralkaon.begin(),
e=neutralkaon.end(); i!=
e; ++i) {
617 INCL_DEBUG(
"Transform outgoing neutral kaon:" <<
'\n'
618 << (*i)->print() <<
'\n');
635 if((*i)->isCluster()) clusters.push_back((*i));
637 if(clusters.empty())
return false;
639 for(
ParticleIter i=clusters.begin(),
e=clusters.end(); i!=
e; ++i) {
642 #ifdef INCLXX_IN_GEANT4_MODE
648 for(
ParticleIter j=decayProducts.begin(), end=decayProducts.end(); j!=end; ++j){
662 for(
ParticleIter j=decayProducts.begin(),
e=decayProducts.end(); j!=
e; ++j){
675 INCL_WARN(
"Forcing emissions of all pions in the nucleus." <<
'\n');
678 const G4double tinyPionEnergy = 0.1;
686 INCL_DEBUG(
"Forcing emission of the following particle: "
687 << thePion->
print() <<
'\n');
693 if(kineticEnergyOutside > 0.0)
700 toEject.push_back(thePion);
716 INCL_DEBUG(
"Forcing emissions of all strange particles in the nucleus." <<
'\n');
725 if((*i)->isSigma() || (*i)->isAntiKaon()) {
727 INCL_DEBUG(
"Forcing emission of the following particle: "
728 << theParticle->
print() <<
'\n');
734 if(kineticEnergyOutside > 0.0)
743 toEject.push_back(theParticle);
759 INCL_DEBUG(
"Forcing emissions of all Lambda in the nucleus." <<
'\n');
768 if((*i)->isLambda()) {
770 INCL_DEBUG(
"Forcing emission of the following particle: "
771 << theLambda->
print() <<
'\n');
777 if(kineticEnergyOutside > 0.0)
785 toEject.push_back(theLambda);
793 return toEject.size();
802 INCL_DEBUG(
"Forcing emissions of all Kaon in the nucleus." <<
'\n');
813 INCL_DEBUG(
"Forcing emission of the following particle: "
814 << theKaon->
print() <<
'\n');
820 if(kineticEnergyOutside > 0.0)
828 toEject.push_back(theKaon);
836 return toEject.size() != 0;
845 if(nEventCollisions==0 && nEventDecays==0 && nEventClusters==0)
882 if(outgoing.size() == 2) {
884 INCL_DEBUG(
"Two particles in the outgoing channel, applying exact two-body kinematics" <<
'\n');
888 Particle *p1 = outgoing.front(), *p2 = outgoing.back();
891 p1->
boost(aBoostVector);
899 p2->adjustEnergyFromMomentum();
901 p1->
boost(-aBoostVector);
902 p2->boost(-aBoostVector);
906 INCL_DEBUG(
"Trying to adjust final-state momenta to achieve energy and momentum conservation" <<
'\n');
908 const G4int maxIterations=8;
910 G4double val=1.E+100, oldVal=1.E+100, oldOldVal=1.E+100, oldOldOldVal;
912 std::vector<ThreeVector> minMomenta;
915 minMomenta.reserve(outgoing.size());
918 totalMomentum.
setX(0.0);
919 totalMomentum.
setY(0.0);
920 totalMomentum.
setZ(0.0);
922 totalMomentum += (*i)->getMomentum();
927 totalEnergy += (*i)->getEnergy();
930 for(
G4int iterations=0; iterations < maxIterations; ++iterations) {
933 oldOldOldVal = oldOldVal;
937 if(iterations%2 == 0) {
943 pOldTot += (*i)->getMomentum().
mag();
944 for(
ParticleIter i=outgoing.begin(),
e=outgoing.end(); i!=
e; ++i) {
946 (*i)->setMomentum(mom + deltaP*mom.
mag()/pOldTot);
947 (*i)->adjustEnergyFromMomentum();
953 for(
ParticleIter i=outgoing.begin(),
e=outgoing.end(); i!=
e; ++i) {
955 G4double pScale = ((*i)->getEnergy()*energyScale - std::pow((*i)->getMass(),2))/mom.
mag2();
957 (*i)->setEnergy((*i)->getEnergy()*energyScale);
958 (*i)->adjustMomentumFromEnergy();
964 totalMomentum.
setX(0.0);
965 totalMomentum.
setY(0.0);
966 totalMomentum.
setZ(0.0);
968 for(
ParticleIter i=outgoing.begin(),
e=outgoing.end(); i!=
e; ++i) {
969 totalMomentum += (*i)->getMomentum();
970 totalEnergy += (*i)->getEnergy();
976 INCL_DEBUG(
"Merit function: val=" << val <<
", oldVal=" << oldVal <<
", oldOldVal=" << oldOldVal <<
", oldOldOldVal=" << oldOldOldVal <<
'\n');
980 INCL_DEBUG(
"New minimum found, storing the particle momenta" <<
'\n');
983 minMomenta.push_back((*i)->getMomentum());
987 if(val > oldOldVal && oldVal > oldOldOldVal) {
988 INCL_DEBUG(
"Search is diverging, breaking out of the iteration loop: val=" << val <<
", oldVal=" << oldVal <<
", oldOldVal=" << oldOldVal <<
", oldOldOldVal=" << oldOldOldVal <<
'\n');
998 std::vector<ThreeVector>::const_iterator v = minMomenta.begin();
999 for(
ParticleIter i=outgoing.begin(),
e=outgoing.end(); i!=
e; ++i, ++v) {
1000 (*i)->setMomentum(*v);
1001 (*i)->adjustEnergyFromMomentum();
1011 G4bool isNucleonAbsorption =
false;
1013 G4bool isPionAbsorption =
false;
1019 isPionAbsorption =
true;
1030 if(outgoingParticles.size() == 0 &&
1033 isNucleonAbsorption =
true;
1040 for(
ParticleIter i=outgoingParticles.begin(),
e=outgoingParticles.end(); i!=
e; ++i ) {
1043 if(isPionAbsorption) {
1044 if((*i)->isPion()) {
1045 isPionAbsorption =
false;
1051 eventInfo->
A[eventInfo->
nParticles] = (*i)->getA();
1052 eventInfo->
Z[eventInfo->
nParticles] = (*i)->getZ();
1053 eventInfo->
S[eventInfo->
nParticles] = (*i)->getS();
1055 eventInfo->
EKin[eventInfo->
nParticles] = (*i)->getKineticEnergy();
1063 eventInfo->
history.push_back(
"");
1084 if(std::abs(eStar)<1
E-10)
1088 INCL_WARN(
"Negative excitation energy in projectile-like remnant! EStarRem = " << eventInfo->
EStarRem[eventInfo->
nRemnants] <<
'\n');
1157 theBalance.
Z = theEventInfo.
Zp + theEventInfo.
Zt;
1158 theBalance.
A = theEventInfo.
Ap + theEventInfo.
At;
1159 theBalance.
S = theEventInfo.
Sp + theEventInfo.
St;
1166 for(
ParticleIter i=outgoingParticles.begin(),
e=outgoingParticles.end(); i!=
e; ++i ) {
1167 theBalance.
Z -= (*i)->getZ();
1168 theBalance.
A -= (*i)->getA();
1169 theBalance.
S += (*i)->getS();
1172 theBalance.
energy -= (*i)->getEnergy();
1173 theBalance.
momentum -= (*i)->getMomentum();
1190 theBalance.
Z -=
getZ();
1191 theBalance.
A -=
getA();
1192 theBalance.
S +=
getS();
1221 const G4double anExcitationEnergy = aMass
G4double getFirstCollisionTime() const
std::vector< G4int > getBiasCollisionVector() const
Get the vector list of biased vertices on the particle path.
ParticleList::const_iterator ParticleIter
void setZ(G4double az)
Set the z coordinate.
ParticleList decay(Cluster *const c)
Carries out a cluster decay.
virtual G4double getTableMass() const
Get the tabulated particle mass.
G4bool decayInsideDeltas()
Force the decay of deltas inside the nucleus.
Int_t nDecayAvatars
Number of decay avatars.
Float_t py[maxSizeParticles]
Particle momentum, y component [MeV/c].
Float_t JRem[maxSizeRemnants]
Remnant spin [ ].
void setProtonSeparationEnergy(const G4double s)
Setter for protonSeparationEnergy.
Int_t nBlockedDecays
Number of decays blocked by Pauli or CDPP.
G4double getWidth(const ParticleType t)
Get particle width (in s)
ProjectileRemnant * theProjectileRemnant
Pointer to the quasi-projectile.
G4int getEmittedClusters() const
G4double computeExcitationEnergy() const
Compute the current excitation energy.
G4int emitInsideLambda()
Force emission of all Lambda (desexitation code with strangeness not implanted yet) ...
void finalizeProjectileRemnant(const G4double emissionTime)
Finalise the projectile remnant.
ParticleList const & getParticles() const
void setNeutronSeparationEnergy(const G4double s)
Setter for protonSeparationEnergy.
const ThreeVector & adjustMomentumFromEnergy()
Rescale the momentum to match the total energy.
void setTableMass()
Set the mass of the Particle to its table mass.
ParticleSampler * theParticleSampler
const G4double effectiveNucleonMass
const G4double effectiveLambdaMass
Float_t pzRem[maxSizeRemnants]
Remnant momentum, z component [MeV/c].
Float_t firstCollisionSpectatorPosition
Position of the spectator on the first collision (fm)
Short_t St
Strangeness number of the target nucleus.
G4double getKineticEnergy() const
Get the particle kinetic energy.
Float_t EKinRem[maxSizeRemnants]
Remnant kinetic energy [MeV].
G4double getFirstCollisionXSec() const
Float_t emissionTime[maxSizeParticles]
Emission time [fm/c].
void setMass(G4double mass)
const G4INCL::ThreeVector & getMomentum() const
G4int getBlockedDecays() const
G4int getS() const
Returns the strangeness number.
G4INCL::ThreeVector theMomentum
Int_t nReflectionAvatars
Number of reflection avatars.
G4bool decayInsideStrangeParticles()
Force the transformation of strange particles into a Lambda;.
NuclearPotential::INuclearPotential const * thePotential
Pointer to the NuclearPotential object.
FinalStateValidity getValidity() const
G4bool getFirstCollisionIsElastic() const
G4int getEnergyViolationInteraction() const
G4bool getPionPotential() const
Do we want the pion potential?
void emitInsidePions()
Force emission of all pions inside the nucleus.
void particleHasBeenUpdated(Particle *const)
Notify the Store about a particle update.
std::vector< std::string > history
History of the particle.
G4double initialInternalEnergy
Short_t nParticles
Number of particles in the final state.
Short_t Z[maxSizeParticles]
Particle charge number.
G4bool nucleon(G4int ityp)
void setDensity(NuclearDensity const *const d)
Setter for theDensity.
G4double getExcitationEnergy() const
Get the excitation energy of the cluster.
void propagateParticles(G4double step)
Short_t nRemnants
Number of remnants.
G4double getMass() const
Get the cached particle mass.
void applyFinalState(FinalState *)
virtual G4double getTableMass() const
Get the real particle mass.
NuclearDensity const * theDensity
Pointer to the NuclearDensity object.
NuclearDensity const * createDensity(const G4int A, const G4int Z)
void deleteProjectileRemnant()
Delete the projectile remnant.
void setX(G4double ax)
Set the x coordinate.
void setBiasCollisionVector(std::vector< G4int > BiasCollisionVector)
Set the vector list of biased vertices on the particle path.
G4double theExcitationEnergy
void computeOneNucleonRecoilKinematics()
Compute the recoil kinematics for a 1-nucleon remnant.
FinalState * getFinalState()
G4bool hasRemnant() const
Does the nucleus give a cascade remnant?
Float_t phi[maxSizeParticles]
Particle momentum azimuthal angle [radians].
void updatePotentialEnergy(Particle *p) const
Update the particle potential energy.
Short_t origin[maxSizeParticles]
Origin of the particle.
G4double getFirstCollisionSpectatorMomentum() const
G4double computeTotalEnergy() const
Compute the current total energy.
void particleHasBeenEjected(Particle *const)
void initializeParticles()
std::string print() const
static G4double getTotalBias()
General bias vector function.
void fillEventInfo(EventInfo *eventInfo)
G4double momentumInCM(Particle const *const p1, Particle const *const p2)
gives the momentum in the CM frame of two particles.
INuclearPotential const * createPotential(const PotentialType type, const G4int theA, const G4int theZ, const G4bool pionPotential)
Create an INuclearPotential object.
Bool_t forcedCompoundNucleus
True if the event is a forced CN.
Int_t nCollisionAvatars
Number of collision avatars.
Float_t phiRem[maxSizeRemnants]
Remnant momentum azimuthal angle [radians].
ParticleList const & getParticles() const
G4bool hasPionPotential() const
Do we have a pion potential?
Float_t firstCollisionTime
Time of the first collision [fm/c].
G4double getEmissionTime()
Bool_t pionAbsorption
True if the event is a pion absorption.
G4INCL::ThreeVector getAngularMomentum() const
Get the total angular momentum (orbital + spin)
Float_t jzRem[maxSizeRemnants]
Remnant angular momentum, z component [ ].
G4double getPotentialEnergy() const
Get the particle potential energy.
G4bool isDelta() const
Is it a Delta?
G4ThreadLocal NuclearMassFn getTableMass
Static pointer to the mass function for nuclei.
void setPotential(NuclearPotential::INuclearPotential const *const p)
Setter for thePotential.
Short_t Sp
Strangeness number of the projectile nucleus.
G4double getInvariantMass() const
Get the the particle invariant mass.
G4double getSeparationEnergy(const Particle *const p) const
Return the separation energy for a particle.
void removeScheduledAvatars()
Remove avatars that have been scheduled.
Short_t ZRem[maxSizeRemnants]
Remnant charge number.
void useFusionKinematics()
Adjust the kinematics for complete-fusion events.
Float_t jyRem[maxSizeRemnants]
Remnant angular momentum, y component [ ].
Float_t firstCollisionXSec
Cross section of the first collision (mb)
Short_t Zt
Charge number of the target nucleus.
Short_t ARem[maxSizeRemnants]
Remnant mass number.
Float_t thetaRem[maxSizeRemnants]
Remnant momentum polar angle [radians].
G4INCL::ThreeVector thePosition
Float_t pyRem[maxSizeRemnants]
Remnant momentum, y component [MeV/c].
void setPotentialEnergy(G4double v)
Set the particle potential energy.
ParticleList const & getEnteringParticles() const
std::string print() const
ParticleList const & getModifiedParticles() const
G4int getZ() const
Returns the charge number.
void setSpin(const ThreeVector &j)
Set the spin of the nucleus.
PotentialType getPotentialType() const
Get the type of the potential for nucleons.
Short_t S[maxSizeParticles]
Particle strangeness number.
void particleHasBeenDestroyed(Particle *const)
G4int getA() const
Returns the baryon number.
G4bool decayMe()
Force the phase-space decay of the Nucleus.
const ThreeVector & getIncomingMomentum() const
Get the incoming momentum vector.
void emitInsideStrangeParticles()
Force emission of all strange particles inside the nucleus.
Simple class implementing De Jong's spin model for nucleus-nucleus collisions.
G4bool isEventTransparent() const
Is the event transparent?
ThreeVector initialCenterOfMass
G4double getFirstCollisionSpectatorPosition() const
Nucleus(G4int mass, G4int charge, G4int strangess, Config const *const conf, const G4double universeRadius=-1.)
G4int getAcceptedDecays() const
G4bool emitInsideKaon()
Force emission of all Kaon inside the nucleus.
ParticleList const & getDestroyedParticles() const
Float_t jxRem[maxSizeRemnants]
Remnant angular momentum, x component [ ].
Bool_t firstCollisionIsElastic
True if the first collision was elastic.
Struct for conservation laws.
ParticleList const & getOutgoingParticles() const
G4double getTotalEnergyBeforeInteraction() const
Float_t EKin[maxSizeParticles]
Particle kinetic energy [MeV].
static G4ThreadLocal Int_t eventNumber
Number of the event.
G4double theUniverseRadius
The radius of the universe.
virtual void setMomentum(const G4INCL::ThreeVector &momentum)
G4double toDegrees(G4double radians)
G4int getAvatars(AvatarType type) const
ThreeVector incomingAngularMomentum
ThreeVector const & getSpin() const
Get the spin of the nucleus.
G4int getAcceptedCollisions() const
G4bool decayOutgoingSigmaZero(G4double timeThreshold)
Force the decay of outgoing Neutral Sigma.
Int_t PDGCode[maxSizeParticles]
PDG numbering of the particles.
ThreeVector incomingMomentum
Float_t EStarRem[maxSizeRemnants]
Remnant excitation energy [MeV].
Short_t nCascadeParticles
Number of cascade particles.
void setExcitationEnergy(const G4double e)
Set the excitation energy of the cluster.
Bool_t nucleonAbsorption
True if the event is a nucleon absorption.
G4bool decayOutgoingDeltas()
Force the decay of outgoing deltas.
G4int getBlockedCollisions() const
#define INCL_DATABLOCK(x)
void boost(const ThreeVector &aBoostVector)
Int_t nCollisions
Number of accepted two-body collisions.
Short_t Ap
Mass number of the projectile nucleus.
G4double getEmissionQValueCorrection(const G4int AParent, const G4int ZParent) const
Computes correction on the emission Q-value.
void setEnergy(G4double energy)
G4double getInitialEnergy() const
Get the initial energy.
void addToOutgoing(Particle *p)
add the particle to the outgoing particle list.
static constexpr double cm
G4double adjustEnergyFromMomentum()
Recompute the energy to match the momentum.
virtual void initializeParticles()
Initialise the NuclearDensity pointer and sample the particles.
G4double computeSeparationEnergyBalance() const
Outgoing - incoming separation energies.
void computeRecoilKinematics()
Compute the recoil momentum and spin of the nucleus.
Float_t ParticleBias[maxSizeParticles]
Particle weight due to the bias.
Int_t nEnergyViolationInteraction
Number of attempted collisions/decays for which the energy-conservation algorithm failed to find a so...
Short_t A[maxSizeParticles]
Particle mass number.
Short_t Zp
Charge number of the projectile nucleus.
G4bool decayOutgoingNeutralKaon()
Force the transformation of outgoing Neutral Kaon into propation eigenstate.
Static class for carrying out cluster decays.
ThreeVector computeCenterOfMass() const
Compute the current center-of-mass position.
Int_t projectileType
Projectile particle type.
void setEmissionTime(G4double t)
Float_t pxRem[maxSizeRemnants]
Remnant momentum, x component [MeV/c].
Float_t px[maxSizeParticles]
Particle momentum, x component [MeV/c].
ParticleList const & getOutgoingParticles() const
Int_t nBlockedCollisions
Number of two-body collisions blocked by Pauli or CDPP.
G4double getExcitationEnergy() const
Get the excitation energy of the nucleus.
G4bool decayOutgoingClusters()
Force the decay of unstable outgoing clusters.
void insertParticle(Particle *p)
Insert a new particle (e.g. a projectile) in the nucleus.
Short_t SRem[maxSizeRemnants]
Remnant strangeness number.
ParticleList const & getCreatedParticles() const
G4double getCurrentTime() const
Short_t At
Mass number of the target nucleus.
Float_t pz[maxSizeParticles]
Particle momentum, z component [MeV/c].
Float_t theta[maxSizeParticles]
Particle momentum polar angle [radians].
ConservationBalance getConservationBalance(EventInfo const &theEventInfo, const G4bool afterRecoil) const
Compute charge, mass, energy and momentum balance.
G4bool decayOutgoingPionResonances(G4double timeThreshold)
Force the decay of outgoing PionResonances (eta/omega).
const G4double hc
[MeV*fm]
void setY(G4double ay)
Set the y coordinate.
Int_t nDecays
Number of accepted Delta decays.
Float_t firstCollisionSpectatorMomentum
Momentum of the spectator on the first collision (fm)