34#define INCLXX_IN_GEANT4_MODE 1
45#ifndef G4INCLNucleus_hh
46#define G4INCLNucleus_hh 1
72 :
Cluster(charge,mass,strangess,true),
73 theInitialZ(charge), theInitialA(mass), theInitialS(strangess),
74 theNpInitial(0), theNnInitial(0),
75 theNpionplusInitial(0), theNpionminusInitial(0),
76 theNkaonplusInitial(0), theNkaonminusInitial(0),
77 theNantiprotonInitial(0),
78 initialInternalEnergy(0.),
79 incomingAngularMomentum(0.,0.,0.), incomingMomentum(0.,0.,0.),
80 initialCenterOfMass(0.,0.,0.),
84 theUniverseRadius(universeRadius),
85 isNucleusNucleus(false),
86 theProjectileRemnant(NULL),
115 if(theUniverseRadius<0)
117 theStore =
new Store(conf);
139 delete theProjectileRemnant;
140 theProjectileRemnant = NULL;
162 for(
ParticleIter iter=created.begin(), e=created.end(); iter!=e; ++iter) {
163 theStore->
add((*iter));
164 if(!(*iter)->isOutOfWell()) {
165 totalEnergy += (*iter)->getEnergy() - (*iter)->getPotentialEnergy();
170 for(
ParticleIter iter=deleted.begin(), e=deleted.end(); iter!=e; ++iter) {
175 for(
ParticleIter iter=modified.begin(), e=modified.end(); iter!=e; ++iter) {
177 totalEnergy += (*iter)->getEnergy() - (*iter)->getPotentialEnergy();
181 for(
ParticleIter iter=out.begin(), e=out.end(); iter!=e; ++iter) {
182 if((*iter)->isCluster()) {
185#ifdef INCLXX_IN_GEANT4_MODE
190 for(
ParticleIter in=components.begin(), end=components.end(); in!=end; ++in)
195 totalEnergy += (*iter)->getEnergy();
196 theA -= (*iter)->getA();
197 theZ -= (*iter)->getZ();
198 theS -= (*iter)->getS();
204 for(
ParticleIter iter=entering.begin(), e=entering.end(); iter!=e; ++iter) {
206 totalEnergy += (*iter)->getEnergy() - (*iter)->getPotentialEnergy();
212 INCL_DEBUG(
"A Particle is entering below the Fermi sea:" <<
'\n' << finalstate->
print() <<
'\n');
215 for(
ParticleIter iter=entering.begin(), e=entering.end(); iter!=e; ++iter) {
222 INCL_ERROR(
"Energy nonconservation! Energy at the beginning of the event = "
224 <<
" and after interaction = "
225 << totalEnergy <<
'\n'
226 << finalstate->
print());
231 INCL_WARN(
"Useless Nucleus::propagateParticles -method called." <<
'\n');
237 for(
ParticleIter p=inside.begin(), e=inside.end(); p!=e; ++p) {
238 if((*p)->isNucleon())
239 totalEnergy += (*p)->getKineticEnergy() - (*p)->getPotentialEnergy();
240 else if((*p)->isResonance())
242 else if((*p)->isHyperon())
244 else if((*p)->isAntiNucleon())
246 else if((*p)->isAntiLambda())
250 totalEnergy += (*p)->getEnergy() - (*p)->getPotentialEnergy();
261 computeOneNucleonRecoilKinematics();
268 theSpin = incomingAngularMomentum;
271 for(
ParticleIter p=outgoing.begin(), e=outgoing.end(); p!=e; ++p) {
273 theSpin -= (*p)->getAngularMomentum();
275 if(theProjectileRemnant) {
293 for(
ParticleIter p=inside.begin(), e=inside.end(); p!=e; ++p) {
294 const G4double mass = (*p)->getMass();
295 cm += (*p)->getPosition() * mass;
320 if (eSep > 0. && (totalEnergy - initialInternalEnergy - separationEnergies - eSep) < 0.) {
321 INCL_DEBUG(
"Negative Excitation Energy due to a Nbar Annihilation process (separation energy of the nucleon annihilated...); E* = " << (totalEnergy - initialInternalEnergy - separationEnergies - eSep) <<
'\n');
324 return totalEnergy - initialInternalEnergy - separationEnergies - eSep;
332 std::stringstream ss;
333 ss <<
"Particles in the nucleus:" <<
'\n'
334 <<
"Inside:" <<
'\n';
337 for(
ParticleIter p=inside.begin(), e=inside.end(); p!=e; ++p) {
338 ss <<
"index = " << counter <<
'\n'
342 ss <<
"Outgoing:" <<
'\n';
344 for(
ParticleIter p=outgoing.begin(), e=outgoing.end(); p!=e; ++p)
353 for(
ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
354 if((*i)->isDelta()) deltas.push_back((*i));
356 if(deltas.empty())
return false;
358 for(
ParticleIter i=deltas.begin(), e=deltas.end(); i!=e; ++i) {
359 INCL_DEBUG(
"Decay outgoing delta particle:" <<
'\n'
360 << (*i)->print() <<
'\n');
362 const G4double deltaMass = (*i)->getMass();
367 (*i)->setEnergy((*i)->getMass());
377 nucleon->getTableMass(),
378 pion->getTableMass());
380 newMomentum *= decayMomentum / newMomentum.
mag();
382 pion->setTableMass();
383 pion->setMomentum(newMomentum);
384 pion->adjustEnergyFromMomentum();
385 pion->setEmissionTime(nucleon->getEmissionTime());
387 pion->setBiasCollisionVector(nucleon->getBiasCollisionVector());
389 nucleon->setTableMass();
390 nucleon->setMomentum(-newMomentum);
391 nucleon->adjustEnergyFromMomentum();
392 nucleon->boost(beta);
418 for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i)
419 if((*i)->isDelta()) deltas.push_back((*i));
422 for(
ParticleIter i=deltas.begin(), e=deltas.end(); i!=e; ++i) {
423 INCL_DEBUG(
"Decay inside delta particle:" <<
'\n'
424 << (*i)->print() <<
'\n');
430 if(unphysicalRemnant) {
431 INCL_WARN(
"Forcing delta decay inside an unphysical remnant (A=" <<
theA
432 <<
", Z=" <<
theZ <<
"). Might lead to energy-violation warnings."
451 if(unphysicalRemnant) {
452 INCL_DEBUG(
"Remnant is unphysical: Z=" <<
theZ <<
", A=" <<
theA <<
", emitting all the pions" <<
'\n');
465 if(unphysicalRemnant){
467 INCL_WARN(
"Remnant is unphysical: Z=" <<
theZ <<
", A=" <<
theA <<
", too much strange particles? -> all emit" <<
'\n');
478 for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i){
479 if((*i)->isSigma() || (*i)->isAntiKaon()) stranges.push_back((*i));
480 else if((*i)->isNucleon() && (*i)->getZ() == 1) protons.push_back((*i));
481 else if((*i)->isNucleon() && (*i)->getZ() == 0) neutrons.push_back((*i));
484 if((stranges.size() > protons.size()) || (stranges.size() > neutrons.size())){
485 INCL_WARN(
"Remnant is unphysical: Nproton=" << protons.size() <<
", Nneutron=" << neutrons.size() <<
", Strange particles : " << stranges.size() <<
'\n');
493 for(
ParticleIter i=stranges.begin(), e=stranges.end(); i!=e; ++i) {
494 INCL_DEBUG(
"Absorbe inside strange particles:" <<
'\n'
495 << (*i)->print() <<
'\n');
498 decay =
new DecayAvatar((*protonIter), (*i), 0.0,
this,
true);
502 decay =
new DecayAvatar((*neutronIter), (*i), 0.0,
this,
true);
505 else if(
Random::shoot()*(protons.size() + neutrons.size()) < protons.size()){
506 decay =
new DecayAvatar((*protonIter), (*i), 0.0,
this,
true);
510 decay =
new DecayAvatar((*neutronIter), (*i), 0.0,
this,
true);
525 for(
ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
529 if(pionResonances.empty())
return false;
531 for(
ParticleIter i=pionResonances.begin(), e=pionResonances.end(); i!=e; ++i) {
532 INCL_DEBUG(
"Decay outgoing pionResonances particle:" <<
'\n'
533 << (*i)->print() <<
'\n');
535 const G4double pionResonanceMass = (*i)->getMass();
540 (*i)->setEnergy((*i)->getMass());
548 Particle *
const theCreatedParticle1 = created.front();
550 if (created.size() == 1) {
555 newMomentum *= decayMomentum / newMomentum.
mag();
561 theCreatedParticle1->
boost(beta);
567 theModifiedParticle->
boost(beta);
571 else if (created.size() == 2) {
572 Particle *
const theCreatedParticle2 = created.back();
574 theCreatedParticle1->
boost(beta);
576 theCreatedParticle2->
boost(beta);
578 theModifiedParticle->
boost(beta);
584 INCL_ERROR(
"Wrong number (< 2) of created particles during the decay of a pion resonance");
596 for(
ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
599 if(neutralsigma.empty())
return false;
601 for(
ParticleIter i=neutralsigma.begin(), e=neutralsigma.end(); i!=e; ++i) {
602 INCL_DEBUG(
"Decay outgoing neutral sigma:" <<
'\n'
603 << (*i)->print() <<
'\n');
605 const G4double neutralsigmaMass = (*i)->getMass();
610 (*i)->setEnergy((*i)->getMass());
618 Particle *
const theCreatedParticle = created.front();
620 if (created.size() == 1) {
625 newMomentum *= decayMomentum / newMomentum.
mag();
630 theCreatedParticle->
boost(beta);
636 theModifiedParticle->
boost(beta);
641 INCL_ERROR(
"Wrong number (!= 1) of created particles during the decay of a sigma zero");
653 for(
ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
654 if((*i)->getType() ==
KZero || (*i)->getType() ==
KZeroBar) neutralkaon.push_back((*i));
656 if(neutralkaon.empty())
return false;
658 for(
ParticleIter i=neutralkaon.begin(), e=neutralkaon.end(); i!=e; ++i) {
659 INCL_DEBUG(
"Transform outgoing neutral kaon:" <<
'\n'
660 << (*i)->print() <<
'\n');
676 for(
ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
677 if((*i)->isCluster()) clusters.push_back((*i));
679 if(clusters.empty())
return false;
681 for(
ParticleIter i=clusters.begin(), e=clusters.end(); i!=e; ++i) {
684#ifdef INCLXX_IN_GEANT4_MODE
690 for(
ParticleIter j=decayProducts.begin(), end=decayProducts.end(); j!=end; ++j){
704 for(
ParticleIter j=decayProducts.begin(), e=decayProducts.end(); j!=e; ++j){
717 INCL_WARN(
"Forcing emissions of all pions in the nucleus." <<
'\n');
720 const G4double tinyPionEnergy = 0.1;
725 for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i) {
728 INCL_DEBUG(
"Forcing emission of the following particle: "
729 << thePion->
print() <<
'\n');
735 if(kineticEnergyOutside > 0.0)
742 toEject.push_back(thePion);
745 for(
ParticleIter i=toEject.begin(), e=toEject.end(); i!=e; ++i) {
758 INCL_DEBUG(
"Forcing emissions of all strange particles in the nucleus." <<
'\n');
766 for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i) {
767 if((*i)->isSigma() || (*i)->isAntiKaon()) {
769 INCL_DEBUG(
"Forcing emission of the following particle: "
770 << theParticle->
print() <<
'\n');
776 if(kineticEnergyOutside > 0.0)
785 toEject.push_back(theParticle);
788 for(
ParticleIter i=toEject.begin(), e=toEject.end(); i!=e; ++i) {
801 INCL_DEBUG(
"Forcing emissions of all Lambda in the nucleus." <<
'\n');
809 for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i) {
810 if((*i)->isLambda()) {
812 INCL_DEBUG(
"Forcing emission of the following particle: "
813 << theLambda->
print() <<
'\n');
819 if(kineticEnergyOutside > 0.0)
827 toEject.push_back(theLambda);
830 for(
ParticleIter i=toEject.begin(), e=toEject.end(); i!=e; ++i) {
835 return (
G4int)toEject.size();
844 INCL_DEBUG(
"Forcing emissions of all Kaon in the nucleus." <<
'\n');
852 for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i) {
855 INCL_DEBUG(
"Forcing emission of the following particle: "
856 << theKaon->
print() <<
'\n');
862 if(kineticEnergyOutside > 0.0)
870 toEject.push_back(theKaon);
873 for(
ParticleIter i=toEject.begin(), e=toEject.end(); i!=e; ++i) {
879 return toEject.size() != 0;
888 if(nEventCollisions==0 && nEventDecays==0 && nEventClusters==0)
895 void Nucleus::computeOneNucleonRecoilKinematics() {
917 for(
ParticleIter j=created.begin(), e=created.end(); j!=e; ++j)
925 if(outgoing.size() == 2) {
927 INCL_DEBUG(
"Two particles in the outgoing channel, applying exact two-body kinematics" <<
'\n');
931 Particle *p1 = outgoing.front(), *p2 = outgoing.back();
932 const ThreeVector aBoostVector = incomingMomentum / initialEnergy;
934 p1->boost(aBoostVector);
935 const G4double sqrts = std::sqrt(initialEnergy*initialEnergy - incomingMomentum.
mag2());
937 const G4double scale = pcm/(p1->getMomentum().mag());
939 p1->setMomentum(p1->getMomentum()*scale);
940 p2->setMomentum(-p1->getMomentum());
941 p1->adjustEnergyFromMomentum();
942 p2->adjustEnergyFromMomentum();
944 p1->boost(-aBoostVector);
945 p2->boost(-aBoostVector);
949 INCL_DEBUG(
"Trying to adjust final-state momenta to achieve energy and momentum conservation" <<
'\n');
951 const G4int maxIterations=8;
953 G4double val=1.E+100, oldVal=1.E+100, oldOldVal=1.E+100, oldOldOldVal;
954 ThreeVector totalMomentum, deltaP;
955 std::vector<ThreeVector> minMomenta;
958 minMomenta.reserve(outgoing.size());
961 totalMomentum.setX(0.0);
962 totalMomentum.setY(0.0);
963 totalMomentum.setZ(0.0);
964 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i)
965 totalMomentum += (*i)->getMomentum();
969 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i)
970 totalEnergy += (*i)->getEnergy();
973 for(
G4int iterations=0; iterations < maxIterations; ++iterations) {
976 oldOldOldVal = oldOldVal;
980 if(iterations%2 == 0) {
983 deltaP = incomingMomentum - totalMomentum;
985 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i)
986 pOldTot += (*i)->getMomentum().
mag();
987 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i) {
988 const ThreeVector mom = (*i)->getMomentum();
989 (*i)->setMomentum(mom + deltaP*mom.mag()/pOldTot);
990 (*i)->adjustEnergyFromMomentum();
995 energyScale = initialEnergy/totalEnergy;
996 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i) {
997 const ThreeVector mom = (*i)->getMomentum();
998 G4double pScale = ((*i)->getEnergy()*energyScale - std::pow((*i)->getMass(),2))/mom.mag2();
1000 (*i)->setEnergy((*i)->getEnergy()*energyScale);
1001 (*i)->adjustMomentumFromEnergy();
1007 totalMomentum.setX(0.0);
1008 totalMomentum.setY(0.0);
1009 totalMomentum.setZ(0.0);
1011 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i) {
1012 totalMomentum += (*i)->getMomentum();
1013 totalEnergy += (*i)->getEnergy();
1017 val = std::pow(totalEnergy - initialEnergy,2) +
1018 0.25*(totalMomentum - incomingMomentum).mag2();
1019 INCL_DEBUG(
"Merit function: val=" << val <<
", oldVal=" << oldVal <<
", oldOldVal=" << oldOldVal <<
", oldOldOldVal=" << oldOldOldVal <<
'\n');
1023 INCL_DEBUG(
"New minimum found, storing the particle momenta" <<
'\n');
1025 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i)
1026 minMomenta.push_back((*i)->getMomentum());
1030 if(val > oldOldVal && oldVal > oldOldOldVal) {
1031 INCL_DEBUG(
"Search is diverging, breaking out of the iteration loop: val=" << val <<
", oldVal=" << oldVal <<
", oldOldVal=" << oldOldVal <<
", oldOldOldVal=" << oldOldOldVal <<
'\n');
1041 std::vector<ThreeVector>::const_iterator v = minMomenta.begin();
1042 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i, ++v) {
1043 (*i)->setMomentum(*v);
1044 (*i)->adjustEnergyFromMomentum();
1054 G4bool isNucleonAbsorption =
false;
1055 G4bool isPionAbsorption =
false;
1061 isPionAbsorption =
true;
1072 if(outgoingParticles.size() == 0 &&
1075 isNucleonAbsorption =
true;
1082 for(
ParticleIter i=outgoingParticles.begin(), e=outgoingParticles.end(); i!=e; ++i ) {
1085 if(isPionAbsorption) {
1086 if((*i)->isPion()) {
1087 isPionAbsorption =
false;
1093#ifdef INCLXX_IN_GEANT4_MODE
1103 eventInfo->
EKin[eventInfo->
nParticles] = (*i)->getKineticEnergy();
1111#ifdef INCLXX_IN_GEANT4_MODE
1115 eventInfo->
history.push_back(
"");
1131 if(theProjectileRemnant && theProjectileRemnant->
getA()>0) {
1132#ifdef INCLXX_IN_GEANT4_MODE
1142 if(std::abs(eStar)<1E-10)
1146 INCL_WARN(
"Negative excitation energy in projectile-like remnant! EStarRem = " << eventInfo->
EStarRem[eventInfo->
nRemnants] <<
'\n');
1169#ifdef INCLXX_IN_GEANT4_MODE
1223 INCL_DEBUG(
"theEventInfo " << theEventInfo.
Zt <<
" " << theEventInfo.
At <<
'\n');
1224 theBalance.
Z = theEventInfo.
Zp + theEventInfo.
Zt;
1225 theBalance.
A = theEventInfo.
Ap + theEventInfo.
At;
1226 theBalance.
S = theEventInfo.
Sp + theEventInfo.
St;
1227 INCL_DEBUG(
"theBalance Z and A " << theBalance.
Z <<
" " << theBalance.
A <<
'\n');
1233 for(
ParticleIter i=outgoingParticles.begin(), e=outgoingParticles.end(); i!=e; ++i ) {
1234 theBalance.
Z -= (*i)->getZ();
1235 theBalance.
A -= (*i)->getA();
1236 theBalance.
S -= (*i)->getS();
1239 theBalance.
energy -= (*i)->getEnergy();
1240 theBalance.
momentum -= (*i)->getMomentum();
1244 if(theProjectileRemnant && theProjectileRemnant->
getA()>0) {
1245 theBalance.
Z -= theProjectileRemnant->
getZ();
1246 theBalance.
A -= theProjectileRemnant->
getA();
1247 theBalance.
S -= theProjectileRemnant->
getS();
1256 theBalance.
Z -=
getZ();
1257 theBalance.
A -=
getA();
1258 theBalance.
S -=
getS();
1272 setSpin(incomingAngularMomentum);
1279 const G4int prA = theProjectileRemnant->
getA();
1283 theProjectileRemnant->
setMass(aMass);
1286 const G4double anExcitationEnergy = aMass
Static class for carrying out cluster decays.
Simple class implementing De Jong's spin model for nucleus-nucleus collisions.
#define INCL_DATABLOCK(x)
G4int getAcceptedDecays() const
G4double getFirstCollisionXSec() const
G4double getFirstCollisionTime() const
G4int getAvatars(AvatarType type) const
G4double getFirstCollisionSpectatorMomentum() const
G4double getCurrentTime() const
G4int getAcceptedCollisions() const
G4double getFirstCollisionSpectatorPosition() const
G4int getBlockedCollisions() const
G4bool getFirstCollisionIsElastic() const
G4int getEnergyViolationInteraction() const
G4int getBlockedDecays() const
G4int getEmittedClusters() const
ThreeVector const & getSpin() const
Get the spin of the nucleus.
ParticleList const & getParticles() const
void setExcitationEnergy(const G4double e)
Set the excitation energy of the cluster.
void setSpin(const ThreeVector &j)
Set the spin of the nucleus.
virtual void initializeParticles()
Initialise the NuclearDensity pointer and sample the particles.
ParticleSampler * theParticleSampler
G4INCL::ThreeVector getAngularMomentum() const
Get the total angular momentum (orbital + spin)
G4double getExcitationEnergy() const
Get the excitation energy of the cluster.
virtual G4double getTableMass() const
Get the real particle mass.
G4double theExcitationEnergy
G4bool getPionPotential() const
Do we want the pion potential?
PotentialType getPotentialType() const
Get the type of the potential for nucleons.
ParticleList const & getOutgoingParticles() const
ParticleList const & getEnteringParticles() const
std::string print() const
ParticleList const & getModifiedParticles() const
FinalStateValidity getValidity() const
ParticleList const & getDestroyedParticles() const
G4double getTotalEnergyBeforeInteraction() const
ParticleList const & getCreatedParticles() const
G4double getMaximumRadius() const
G4double getSeparationEnergy(const Particle *const p) const
Return the separation energy for a particle.
G4bool hasPionPotential() const
Do we have a pion potential?
G4bool decayOutgoingNeutralKaon()
Force the transformation of outgoing Neutral Kaon into propation eigenstate.
G4double computeSeparationEnergyBalance() const
Outgoing - incoming separation energies.
void fillEventInfo(EventInfo *eventInfo)
G4bool decayMe()
Force the phase-space decay of the Nucleus.
G4double computeTotalEnergy() const
Compute the current total energy.
G4bool decayInsideDeltas()
Force the decay of deltas inside the nucleus.
void computeRecoilKinematics()
Compute the recoil momentum and spin of the nucleus.
void finalizeProjectileRemnant(const G4double emissionTime)
Finalise the projectile remnant.
G4bool emitInsideKaon()
Force emission of all Kaon inside the nucleus.
G4bool isEventTransparent() const
Is the event transparent?
void applyFinalState(FinalState *)
void setAType(AnnihilationType type)
void insertParticle(Particle *p)
Insert a new particle (e.g. a projectile) in the nucleus.
Nucleus(G4int mass, G4int charge, G4int strangess, Config const *const conf, const G4double universeRadius=-1., AnnihilationType AType=Def)
void emitInsideStrangeParticles()
Force emission of all strange particles inside the nucleus.
void deleteProjectileRemnant()
Delete the projectile remnant.
G4bool decayOutgoingPionResonances(G4double timeThreshold)
Force the decay of outgoing PionResonances (eta/omega).
void useFusionKinematics()
Adjust the kinematics for complete-fusion events.
AnnihilationType getAType() const
const ThreeVector & getIncomingMomentum() const
Get the incoming momentum vector.
void emitInsidePions()
Force emission of all pions inside the nucleus.
G4double getInitialEnergy() const
Get the initial energy.
ThreeVector computeCenterOfMass() const
Compute the current center-of-mass position.
G4bool decayOutgoingClusters()
Force the decay of unstable outgoing clusters.
G4double getExcitationEnergy() const
Get the excitation energy of the nucleus.
G4int emitInsideLambda()
Force emission of all Lambda (desexitation code with strangeness not implanted yet)
void propagateParticles(G4double step)
G4bool decayInsideStrangeParticles()
Force the transformation of strange particles into a Lambda;.
ConservationBalance getConservationBalance(EventInfo const &theEventInfo, const G4bool afterRecoil) const
Compute charge, mass, energy and momentum balance.
void initializeParticles()
G4bool hasRemnant() const
Does the nucleus give a cascade remnant?
void updatePotentialEnergy(Particle *p) const
Update the particle potential energy.
G4double computeExcitationEnergy() const
Compute the current excitation energy.
G4bool decayOutgoingDeltas()
Force the decay of outgoing deltas.
G4bool decayOutgoingSigmaZero(G4double timeThreshold)
Force the decay of outgoing Neutral Sigma.
void setPotential(NuclearPotential::INuclearPotential const *const p)
Setter for thePotential.
void setDensity(NuclearDensity const *const d)
Setter for theDensity.
G4int getPDGCode() const
Set a PDG Code (MONTE CARLO PARTICLE NUMBERING)
void setPotentialEnergy(G4double v)
Set the particle potential energy.
G4int getS() const
Returns the strangeness number.
G4double getEmissionQValueCorrection(const G4int AParent, const G4int ZParent) const
Computes correction on the emission Q-value.
G4INCL::ThreeVector theMomentum
void setBiasCollisionVector(std::vector< G4int > BiasCollisionVector)
Set the vector list of biased vertices on the particle path.
G4double getPotentialEnergy() const
Get the particle potential energy.
void setMass(G4double mass)
G4int getZ() const
Returns the charge number.
G4double getKineticEnergy() const
Get the particle kinetic energy.
G4int theNKaon
The number of Kaons inside the nucleus (update during the cascade)
std::vector< G4int > getBiasCollisionVector() const
Get the vector list of biased vertices on the particle path.
void setEmissionTime(G4double t)
G4double adjustEnergyFromMomentum()
Recompute the energy to match the momentum.
static G4double getTotalBias()
General bias vector function.
const ThreeVector & adjustMomentumFromEnergy()
Rescale the momentum to match the total energy.
const G4INCL::ThreeVector & getMomentum() const
virtual void setMomentum(const G4INCL::ThreeVector &momentum)
virtual G4double getTableMass() const
Get the tabulated particle mass.
G4double getInvariantMass() const
Get the the particle invariant mass.
void setEnergy(G4double energy)
std::string print() const
G4double getMass() const
Get the cached particle mass.
void boost(const ThreeVector &aBoostVector)
void setTableMass()
Set the mass of the Particle to its table mass.
G4bool isDelta() const
Is it a Delta?
G4int getA() const
Returns the baryon number.
G4INCL::ThreeVector thePosition
ParticleList const & getOutgoingParticles() const
void addToOutgoing(Particle *p)
add the particle to the outgoing particle list.
void particleHasBeenDestroyed(Particle *const)
void particleHasBeenUpdated(Particle *const)
Notify the Store about a particle update.
void removeScheduledAvatars()
Remove avatars that have been scheduled.
void particleHasBeenEjected(Particle *const)
ParticleList const & getParticles() const
ParticleList decay(Cluster *const c)
Carries out a cluster decay.
G4double momentumInCM(Particle const *const p1, Particle const *const p2)
gives the momentum in the CM frame of two particles.
G4double toDegrees(G4double radians)
NuclearDensity const * createDensity(const G4int A, const G4int Z, const G4int S)
INuclearPotential const * createPotential(const PotentialType type, const G4int theA, const G4int theZ, const G4bool pionPotential)
Create an INuclearPotential object.
G4ThreadLocal NuclearMassFn getTableMass
Static pointer to the mass function for nuclei.
G4double getNeutronSeparationEnergy()
Getter for neutronSeparationEnergy.
G4double getRealMass(const G4INCL::ParticleType t)
Get particle mass (in MeV/c^2)
G4double getINCLMass(const G4int A, const G4int Z, const G4int S)
Get INCL nuclear mass (in MeV/c^2)
G4double getSeparationEnergyINCL(const ParticleType t, const G4int, const G4int)
Return INCL's default separation energy.
void setNeutronSeparationEnergy(const G4double s)
Setter for protonSeparationEnergy.
const G4double effectiveNucleonMass
void setProtonSeparationEnergy(const G4double s)
Setter for protonSeparationEnergy.
G4double getProtonSeparationEnergy()
Getter for protonSeparationEnergy.
G4double getWidth(const ParticleType t)
Get particle width (in s)
const G4double hc
[MeV*fm]
ParticleList::const_iterator ParticleIter
Bool_t pionAbsorption
True if the event is a pion absorption.
Short_t S[maxSizeParticles]
Particle strangeness number.
Int_t nCollisionAvatars
Number of collision avatars.
Short_t origin[maxSizeParticles]
Origin of the particle.
Short_t At
Mass number of the target nucleus.
Short_t Zp
Charge number of the projectile nucleus.
Int_t parentResonancePDGCode[maxSizeParticles]
Particle's parent resonance PDG code.
Int_t nDecays
Number of accepted Delta decays.
Int_t projectileType
Projectile particle type.
Short_t nCascadeParticles
Number of cascade particles.
Short_t nRemnants
Number of remnants.
Float_t theta[maxSizeParticles]
Particle momentum polar angle [radians].
Short_t A[maxSizeParticles]
Particle mass number.
Float_t EKinRem[maxSizeRemnants]
Remnant kinetic energy [MeV].
Float_t firstCollisionSpectatorMomentum
Momentum of the spectator on the first collision (fm)
Int_t parentResonanceID[maxSizeParticles]
Particle's parent resonance unique ID identifier.
Float_t jzRem[maxSizeRemnants]
Remnant angular momentum, z component [ ].
Bool_t nucleonAbsorption
True if the event is a nucleon absorption.
Float_t emissionTime[maxSizeParticles]
Emission time [fm/c].
Float_t EStarRem[maxSizeRemnants]
Remnant excitation energy [MeV].
Short_t St
Strangeness number of the target nucleus.
Int_t nEnergyViolationInteraction
Number of attempted collisions/decays for which the energy-conservation algorithm failed to find a so...
Float_t phi[maxSizeParticles]
Particle momentum azimuthal angle [radians].
Short_t Ap
Mass number of the projectile nucleus.
Int_t nReflectionAvatars
Number of reflection avatars.
Float_t firstCollisionSpectatorPosition
Position of the spectator on the first collision (fm)
Short_t Z[maxSizeParticles]
Particle charge number.
Bool_t forcedCompoundNucleus
True if the event is a forced CN.
Float_t JRem[maxSizeRemnants]
Remnant spin [ ].
Float_t thetaRem[maxSizeRemnants]
Remnant momentum polar angle [radians].
std::vector< std::string > history
History of the particle.
Short_t Sp
Strangeness number of the projectile nucleus.
Float_t EKin[maxSizeParticles]
Particle kinetic energy [MeV].
Short_t nParticles
Number of particles in the final state.
Float_t jxRem[maxSizeRemnants]
Remnant angular momentum, x component [ ].
Int_t nBlockedDecays
Number of decays blocked by Pauli or CDPP.
Float_t px[maxSizeParticles]
Particle momentum, x component [MeV/c].
Float_t ParticleBias[maxSizeParticles]
Particle weight due to the bias.
Short_t SRem[maxSizeRemnants]
Remnant strangeness number.
Float_t pxRem[maxSizeRemnants]
Remnant momentum, x component [MeV/c].
Float_t pyRem[maxSizeRemnants]
Remnant momentum, y component [MeV/c].
Float_t firstCollisionTime
Time of the first collision [fm/c].
Short_t Zt
Charge number of the target nucleus.
Float_t phiRem[maxSizeRemnants]
Remnant momentum azimuthal angle [radians].
Float_t pzRem[maxSizeRemnants]
Remnant momentum, z component [MeV/c].
static G4ThreadLocal Int_t eventNumber
Number of the event.
Float_t pz[maxSizeParticles]
Particle momentum, z component [MeV/c].
Int_t nCollisions
Number of accepted two-body collisions.
Int_t PDGCode[maxSizeParticles]
PDG numbering of the particles.
Int_t nBlockedCollisions
Number of two-body collisions blocked by Pauli or CDPP.
Float_t jyRem[maxSizeRemnants]
Remnant angular momentum, y component [ ].
Float_t py[maxSizeParticles]
Particle momentum, y component [MeV/c].
Bool_t firstCollisionIsElastic
True if the first collision was elastic.
Short_t ARem[maxSizeRemnants]
Remnant mass number.
Short_t ZRem[maxSizeRemnants]
Remnant charge number.
Float_t firstCollisionXSec
Cross section of the first collision (mb)
Int_t nDecayAvatars
Number of decay avatars.
Struct for conservation laws.