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),
107 if(theUniverseRadius<0)
109 theStore =
new Store(conf);
123 delete theProjectileRemnant;
124 theProjectileRemnant = NULL;
146 for(
ParticleIter iter=created.begin(), e=created.end(); iter!=e; ++iter) {
147 theStore->
add((*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
174 for(
ParticleIter in=components.begin(), end=components.end(); in!=end; ++in)
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');
221 for(
ParticleIter p=inside.begin(), e=inside.end(); p!=e; ++p) {
222 if((*p)->isNucleon())
223 totalEnergy += (*p)->getKineticEnergy() - (*p)->getPotentialEnergy();
224 else if((*p)->isResonance())
226 else if((*p)->isHyperon())
229 totalEnergy += (*p)->getEnergy() - (*p)->getPotentialEnergy();
240 computeOneNucleonRecoilKinematics();
247 theSpin = incomingAngularMomentum;
250 for(
ParticleIter p=outgoing.begin(), e=outgoing.end(); p!=e; ++p) {
252 theSpin -= (*p)->getAngularMomentum();
254 if(theProjectileRemnant) {
272 for(
ParticleIter p=inside.begin(), e=inside.end(); p!=e; ++p) {
273 const G4double mass = (*p)->getMass();
274 cm += (*p)->getPosition() * mass;
285 return totalEnergy - initialInternalEnergy - separationEnergies;
290 std::stringstream ss;
291 ss <<
"Particles in the nucleus:" <<
'\n'
292 <<
"Inside:" <<
'\n';
295 for(
ParticleIter p=inside.begin(), e=inside.end(); p!=e; ++p) {
296 ss <<
"index = " << counter <<
'\n'
300 ss <<
"Outgoing:" <<
'\n';
302 for(
ParticleIter p=outgoing.begin(), e=outgoing.end(); p!=e; ++p)
311 for(
ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
312 if((*i)->isDelta()) deltas.push_back((*i));
314 if(deltas.empty())
return false;
316 for(
ParticleIter i=deltas.begin(), e=deltas.end(); i!=e; ++i) {
317 INCL_DEBUG(
"Decay outgoing delta particle:" <<
'\n'
318 << (*i)->print() <<
'\n');
320 const G4double deltaMass = (*i)->getMass();
325 (*i)->setEnergy((*i)->getMass());
335 nucleon->getTableMass(),
336 pion->getTableMass());
338 newMomentum *= decayMomentum / newMomentum.
mag();
340 pion->setTableMass();
341 pion->setMomentum(newMomentum);
342 pion->adjustEnergyFromMomentum();
343 pion->setEmissionTime(nucleon->getEmissionTime());
345 pion->setBiasCollisionVector(nucleon->getBiasCollisionVector());
347 nucleon->setTableMass();
348 nucleon->setMomentum(-newMomentum);
349 nucleon->adjustEnergyFromMomentum();
350 nucleon->boost(beta);
369 const G4bool unphysicalRemnant = (theZ<0 || theZ>
theA);
376 for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i)
377 if((*i)->isDelta()) deltas.push_back((*i));
380 for(
ParticleIter i=deltas.begin(), e=deltas.end(); i!=e; ++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');
436 for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i){
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);
483 for(
ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
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");
554 for(
ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
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");
611 for(
ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
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');
634 for(
ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
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;
683 for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i) {
686 INCL_DEBUG(
"Forcing emission of the following particle: "
687 << thePion->
print() <<
'\n');
693 if(kineticEnergyOutside > 0.0)
700 toEject.push_back(thePion);
703 for(
ParticleIter i=toEject.begin(), e=toEject.end(); i!=e; ++i) {
716 INCL_DEBUG(
"Forcing emissions of all strange particles in the nucleus." <<
'\n');
724 for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i) {
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);
746 for(
ParticleIter i=toEject.begin(), e=toEject.end(); i!=e; ++i) {
759 INCL_DEBUG(
"Forcing emissions of all Lambda in the nucleus." <<
'\n');
767 for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i) {
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);
788 for(
ParticleIter i=toEject.begin(), e=toEject.end(); i!=e; ++i) {
793 return (
G4int)toEject.size();
802 INCL_DEBUG(
"Forcing emissions of all Kaon in the nucleus." <<
'\n');
810 for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i) {
813 INCL_DEBUG(
"Forcing emission of the following particle: "
814 << theKaon->
print() <<
'\n');
820 if(kineticEnergyOutside > 0.0)
828 toEject.push_back(theKaon);
831 for(
ParticleIter i=toEject.begin(), e=toEject.end(); i!=e; ++i) {
837 return toEject.size() != 0;
846 if(nEventCollisions==0 && nEventDecays==0 && nEventClusters==0)
853 void Nucleus::computeOneNucleonRecoilKinematics() {
875 for(
ParticleIter j=created.begin(), e=created.end(); j!=e; ++j)
883 if(outgoing.size() == 2) {
885 INCL_DEBUG(
"Two particles in the outgoing channel, applying exact two-body kinematics" <<
'\n');
889 Particle *p1 = outgoing.front(), *p2 = outgoing.back();
890 const ThreeVector aBoostVector = incomingMomentum / initialEnergy;
892 p1->boost(aBoostVector);
893 const G4double sqrts = std::sqrt(initialEnergy*initialEnergy - incomingMomentum.
mag2());
895 const G4double scale = pcm/(p1->getMomentum().mag());
897 p1->setMomentum(p1->getMomentum()*scale);
898 p2->setMomentum(-p1->getMomentum());
899 p1->adjustEnergyFromMomentum();
900 p2->adjustEnergyFromMomentum();
902 p1->boost(-aBoostVector);
903 p2->boost(-aBoostVector);
907 INCL_DEBUG(
"Trying to adjust final-state momenta to achieve energy and momentum conservation" <<
'\n');
909 const G4int maxIterations=8;
911 G4double val=1.E+100, oldVal=1.E+100, oldOldVal=1.E+100, oldOldOldVal;
912 ThreeVector totalMomentum, deltaP;
913 std::vector<ThreeVector> minMomenta;
916 minMomenta.reserve(outgoing.size());
919 totalMomentum.setX(0.0);
920 totalMomentum.setY(0.0);
921 totalMomentum.setZ(0.0);
922 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i)
923 totalMomentum += (*i)->getMomentum();
927 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i)
928 totalEnergy += (*i)->getEnergy();
931 for(
G4int iterations=0; iterations < maxIterations; ++iterations) {
934 oldOldOldVal = oldOldVal;
938 if(iterations%2 == 0) {
941 deltaP = incomingMomentum - totalMomentum;
943 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i)
944 pOldTot += (*i)->getMomentum().
mag();
945 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i) {
946 const ThreeVector mom = (*i)->getMomentum();
947 (*i)->setMomentum(mom + deltaP*mom.mag()/pOldTot);
948 (*i)->adjustEnergyFromMomentum();
953 energyScale = initialEnergy/totalEnergy;
954 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i) {
955 const ThreeVector mom = (*i)->getMomentum();
956 G4double pScale = ((*i)->getEnergy()*energyScale - std::pow((*i)->getMass(),2))/mom.mag2();
958 (*i)->setEnergy((*i)->getEnergy()*energyScale);
959 (*i)->adjustMomentumFromEnergy();
965 totalMomentum.setX(0.0);
966 totalMomentum.setY(0.0);
967 totalMomentum.setZ(0.0);
969 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i) {
970 totalMomentum += (*i)->getMomentum();
971 totalEnergy += (*i)->getEnergy();
975 val = std::pow(totalEnergy - initialEnergy,2) +
976 0.25*(totalMomentum - incomingMomentum).mag2();
977 INCL_DEBUG(
"Merit function: val=" << val <<
", oldVal=" << oldVal <<
", oldOldVal=" << oldOldVal <<
", oldOldOldVal=" << oldOldOldVal <<
'\n');
981 INCL_DEBUG(
"New minimum found, storing the particle momenta" <<
'\n');
983 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i)
984 minMomenta.push_back((*i)->getMomentum());
988 if(val > oldOldVal && oldVal > oldOldOldVal) {
989 INCL_DEBUG(
"Search is diverging, breaking out of the iteration loop: val=" << val <<
", oldVal=" << oldVal <<
", oldOldVal=" << oldOldVal <<
", oldOldOldVal=" << oldOldOldVal <<
'\n');
999 std::vector<ThreeVector>::const_iterator v = minMomenta.begin();
1000 for(
ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i, ++v) {
1001 (*i)->setMomentum(*v);
1002 (*i)->adjustEnergyFromMomentum();
1012 G4bool isNucleonAbsorption =
false;
1014 G4bool isPionAbsorption =
false;
1020 isPionAbsorption =
true;
1031 if(outgoingParticles.size() == 0 &&
1034 isNucleonAbsorption =
true;
1041 for(
ParticleIter i=outgoingParticles.begin(), e=outgoingParticles.end(); i!=e; ++i ) {
1044 if(isPionAbsorption) {
1045 if((*i)->isPion()) {
1046 isPionAbsorption =
false;
1056 eventInfo->
EKin[eventInfo->
nParticles] = (*i)->getKineticEnergy();
1066 eventInfo->
history.push_back(
"");
1082 if(theProjectileRemnant && theProjectileRemnant->
getA()>0) {
1087 if(std::abs(eStar)<1E-10)
1091 INCL_WARN(
"Negative excitation energy in projectile-like remnant! EStarRem = " << eventInfo->
EStarRem[eventInfo->
nRemnants] <<
'\n');
1160 theBalance.
Z = theEventInfo.
Zp + theEventInfo.
Zt;
1161 theBalance.
A = theEventInfo.
Ap + theEventInfo.
At;
1162 theBalance.
S = theEventInfo.
Sp + theEventInfo.
St;
1169 for(
ParticleIter i=outgoingParticles.begin(), e=outgoingParticles.end(); i!=e; ++i ) {
1170 theBalance.
Z -= (*i)->getZ();
1171 theBalance.
A -= (*i)->getA();
1172 theBalance.
S -= (*i)->getS();
1175 theBalance.
energy -= (*i)->getEnergy();
1176 theBalance.
momentum -= (*i)->getMomentum();
1180 if(theProjectileRemnant && theProjectileRemnant->
getA()>0) {
1181 theBalance.
Z -= theProjectileRemnant->
getZ();
1182 theBalance.
A -= theProjectileRemnant->
getA();
1183 theBalance.
S -= theProjectileRemnant->
getS();
1192 theBalance.
Z -=
getZ();
1193 theBalance.
A -=
getA();
1194 theBalance.
S -=
getS();
1208 setSpin(incomingAngularMomentum);
1215 const G4int prA = theProjectileRemnant->
getA();
1219 theProjectileRemnant->
setMass(aMass);
1222 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 insertParticle(Particle *p)
Insert a new particle (e.g. a projectile) in the nucleus.
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.
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)
Nucleus(G4int mass, G4int charge, G4int strangess, Config const *const conf, const G4double universeRadius=-1.)
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 getRealMass(const G4INCL::ParticleType t)
Get particle mass (in MeV/c^2)
void setNeutronSeparationEnergy(const G4double s)
Setter for protonSeparationEnergy.
const G4double effectiveNucleonMass
void setProtonSeparationEnergy(const G4double s)
Setter 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.