Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4INCL::Nucleus Class Reference

#include <G4INCLNucleus.hh>

Inheritance diagram for G4INCL::Nucleus:
Collaboration diagram for G4INCL::Nucleus:

Classes

struct  ConservationBalance
 Struct for conservation laws. More...
 

Public Member Functions

 Nucleus (G4int mass, G4int charge, Config const *const conf, const G4double universeRadius=-1.)
 
virtual ~Nucleus ()
 
 Nucleus (const Nucleus &rhs)
 Dummy copy constructor to silence Coverity warning. More...
 
Nucleusoperator= (const Nucleus &rhs)
 Dummy assignment operator to silence Coverity warning. More...
 
void initializeParticles ()
 
void insertParticle (Particle *p)
 Insert a new particle (e.g. a projectile) in the nucleus. More...
 
void applyFinalState (FinalState *)
 
G4int getInitialA () const
 
G4int getInitialZ () const
 
void propagateParticles (G4double step)
 
G4int getNumberOfEnteringProtons () const
 
G4int getNumberOfEnteringNeutrons () const
 
G4double computeSeparationEnergyBalance () const
 Outgoing - incoming separation energies. More...
 
G4bool decayOutgoingDeltas ()
 Force the decay of outgoing deltas. More...
 
G4bool decayInsideDeltas ()
 Force the decay of deltas inside the nucleus. More...
 
G4bool decayOutgoingPionResonances (G4double timeThreshold)
 Force the decay of outgoing PionResonances (eta/omega). More...
 
G4bool decayOutgoingClusters ()
 Force the decay of unstable outgoing clusters. More...
 
G4bool decayMe ()
 Force the phase-space decay of the Nucleus. More...
 
void emitInsidePions ()
 Force emission of all pions inside the nucleus. More...
 
void computeRecoilKinematics ()
 Compute the recoil momentum and spin of the nucleus. More...
 
ThreeVector computeCenterOfMass () const
 Compute the current center-of-mass position. More...
 
G4double computeTotalEnergy () const
 Compute the current total energy. More...
 
G4double computeExcitationEnergy () const
 Compute the current excitation energy. More...
 
void setIncomingAngularMomentum (const ThreeVector &j)
 Set the incoming angular-momentum vector. More...
 
const ThreeVectorgetIncomingAngularMomentum () const
 Get the incoming angular-momentum vector. More...
 
void setIncomingMomentum (const ThreeVector &p)
 Set the incoming momentum vector. More...
 
const ThreeVectorgetIncomingMomentum () const
 Get the incoming momentum vector. More...
 
void setInitialEnergy (const G4double e)
 Set the initial energy. More...
 
G4double getInitialEnergy () const
 Get the initial energy. More...
 
G4double getExcitationEnergy () const
 Get the excitation energy of the nucleus. More...
 
G4bool containsDeltas ()
 Returns true if the nucleus contains any deltas. More...
 
G4bool containsEtas ()
 Returns true if the nucleus contains any etas. More...
 
G4bool containsOmegas ()
 Returns true if the nucleus contains any omegas. More...
 
std::string print ()
 
StoregetStore () const
 
void setStore (Store *s)
 
G4double getInitialInternalEnergy () const
 
G4bool isEventTransparent () const
 Is the event transparent? More...
 
G4bool hasRemnant () const
 Does the nucleus give a cascade remnant? More...
 
void fillEventInfo (EventInfo *eventInfo)
 
G4bool getTryCompoundNucleus ()
 
G4double getTransmissionBarrier (Particle const *const p)
 Get the transmission barrier. More...
 
ConservationBalance getConservationBalance (EventInfo const &theEventInfo, const G4bool afterRecoil) const
 Compute charge, mass, energy and momentum balance. More...
 
void useFusionKinematics ()
 Adjust the kinematics for complete-fusion events. More...
 
G4double getSurfaceRadius (Particle const *const particle) const
 Get the maximum allowed radius for a given particle. More...
 
G4double getUniverseRadius () const
 Getter for theUniverseRadius. More...
 
void setUniverseRadius (const G4double universeRadius)
 Setter for theUniverseRadius. More...
 
G4bool isNucleusNucleusCollision () const
 Is it a nucleus-nucleus collision? More...
 
void setNucleusNucleusCollision ()
 Set a nucleus-nucleus collision. More...
 
void setParticleNucleusCollision ()
 Set a particle-nucleus collision. More...
 
void setProjectileRemnant (ProjectileRemnant *const c)
 Set the projectile remnant. More...
 
ProjectileRemnantgetProjectileRemnant () const
 Get the projectile remnant. More...
 
void deleteProjectileRemnant ()
 Delete the projectile remnant. More...
 
void finalizeProjectileRemnant (const G4double emissionTime)
 Finalise the projectile remnant. More...
 
void updatePotentialEnergy (Particle *p) const
 Update the particle potential energy. More...
 
void setDensity (NuclearDensity const *const d)
 Setter for theDensity. More...
 
NuclearDensity const * getDensity () const
 Getter for theDensity. More...
 
NuclearPotential::INuclearPotential
const * 
getPotential () const
 Getter for thePotential. More...
 
- Public Member Functions inherited from G4INCL::Cluster
 Cluster (const G4int Z, const G4int A, const G4bool createParticleSampler=true)
 Standard Cluster constructor. More...
 
template<class Iterator >
 Cluster (Iterator begin, Iterator end)
 
virtual ~Cluster ()
 
 Cluster (const Cluster &rhs)
 Copy constructor. More...
 
Clusteroperator= (const Cluster &rhs)
 Assignment operator. More...
 
void swap (Cluster &rhs)
 Helper method for the assignment operator. More...
 
ParticleSpecies getSpecies () const
 Get the particle species. More...
 
void deleteParticles ()
 
void clearParticles ()
 
void setZ (const G4int Z)
 Set the charge number of the cluster. More...
 
void setA (const G4int A)
 Set the mass number of the cluster. More...
 
G4double getExcitationEnergy () const
 Get the excitation energy of the cluster. More...
 
void setExcitationEnergy (const G4double e)
 Set the excitation energy of the cluster. More...
 
virtual G4double getTableMass () const
 Get the real particle mass. More...
 
ParticleList const & getParticles () const
 
void removeParticle (Particle *const p)
 Remove a particle from the cluster components. More...
 
void addParticle (Particle *const p)
 
void updateClusterParameters ()
 Set total cluster mass, energy, size, etc. from the particles. More...
 
void addParticles (ParticleList const &pL)
 Add a list of particles to the cluster. More...
 
ParticleList getParticleList () const
 Returns the list of particles that make up the cluster. More...
 
std::string print () const
 
void internalBoostToCM ()
 Boost to the CM of the component particles. More...
 
void putParticlesOffShell ()
 Put the cluster components off shell. More...
 
void setPosition (const ThreeVector &position)
 Set the position of the cluster. More...
 
void boost (const ThreeVector &aBoostVector)
 Boost the cluster with the indicated velocity. More...
 
void freezeInternalMotion ()
 Freeze the internal motion of the particles. More...
 
virtual void rotatePosition (const G4double angle, const ThreeVector &axis)
 Rotate position of all the particles. More...
 
virtual void rotateMomentum (const G4double angle, const ThreeVector &axis)
 Rotate momentum of all the particles. More...
 
virtual void makeProjectileSpectator ()
 Make all the components projectile spectators, too. More...
 
virtual void makeTargetSpectator ()
 Make all the components target spectators, too. More...
 
virtual void makeParticipant ()
 Make all the components participants, too. More...
 
ThreeVector const & getSpin () const
 Get the spin of the nucleus. More...
 
void setSpin (const ThreeVector &j)
 Set the spin of the nucleus. More...
 
G4INCL::ThreeVector getAngularMomentum () const
 Get the total angular momentum (orbital + spin) More...
 
- Public Member Functions inherited from G4INCL::Particle
 Particle ()
 
 Particle (ParticleType t, G4double energy, ThreeVector const &momentum, ThreeVector const &position)
 
 Particle (ParticleType t, ThreeVector const &momentum, ThreeVector const &position)
 
virtual ~Particle ()
 
 Particle (const Particle &rhs)
 Copy constructor. More...
 
Particleoperator= (const Particle &rhs)
 Assignment operator. More...
 
G4INCL::ParticleType getType () const
 
void setType (ParticleType t)
 
G4bool isNucleon () const
 
ParticipantType getParticipantType () const
 
void setParticipantType (ParticipantType const p)
 
G4bool isParticipant () const
 
G4bool isTargetSpectator () const
 
G4bool isProjectileSpectator () const
 
G4bool isPion () const
 Is this a pion? More...
 
G4bool isEta () const
 Is this a eta? More...
 
G4bool isOmega () const
 Is this a omega? More...
 
G4bool isEtaPrime () const
 Is this a etaprime? More...
 
G4bool isResonance () const
 Is it a resonance? More...
 
G4bool isDelta () const
 Is it a Delta? More...
 
G4int getA () const
 Returns the baryon number. More...
 
G4int getZ () const
 Returns the charge number. More...
 
G4double getBeta () const
 
ThreeVector boostVector () const
 
void boost (const ThreeVector &aBoostVector)
 
void lorentzContract (const ThreeVector &aBoostVector, const ThreeVector &refPos)
 Lorentz-contract the particle position around some center. More...
 
G4double getMass () const
 Get the cached particle mass. More...
 
G4double getINCLMass () const
 Get the INCL particle mass. More...
 
G4double getRealMass () const
 Get the real particle mass. More...
 
void setRealMass ()
 Set the mass of the Particle to its real mass. More...
 
void setTableMass ()
 Set the mass of the Particle to its table mass. More...
 
void setINCLMass ()
 Set the mass of the Particle to its table mass. More...
 
G4double getEmissionQValueCorrection (const G4int AParent, const G4int ZParent) const
 Computes correction on the emission Q-value. More...
 
G4double getTransferQValueCorrection (const G4int AFrom, const G4int ZFrom, const G4int ATo, const G4int ZTo) const
 Computes correction on the transfer Q-value. More...
 
G4double getInvariantMass () const
 Get the the particle invariant mass. More...
 
G4double getKineticEnergy () const
 Get the particle kinetic energy. More...
 
G4double getPotentialEnergy () const
 Get the particle potential energy. More...
 
void setPotentialEnergy (G4double v)
 Set the particle potential energy. More...
 
G4double getEnergy () const
 
void setMass (G4double mass)
 
void setEnergy (G4double energy)
 
const G4INCL::ThreeVectorgetMomentum () const
 
virtual void setMomentum (const G4INCL::ThreeVector &momentum)
 
const G4INCL::ThreeVectorgetPosition () const
 
G4double getHelicity ()
 
void setHelicity (G4double h)
 
void propagate (G4double step)
 
G4int getNumberOfCollisions () const
 Return the number of collisions undergone by the particle. More...
 
void setNumberOfCollisions (G4int n)
 Set the number of collisions undergone by the particle. More...
 
void incrementNumberOfCollisions ()
 Increment the number of collisions undergone by the particle. More...
 
G4int getNumberOfDecays () const
 Return the number of decays undergone by the particle. More...
 
void setNumberOfDecays (G4int n)
 Set the number of decays undergone by the particle. More...
 
void incrementNumberOfDecays ()
 Increment the number of decays undergone by the particle. More...
 
void setOutOfWell ()
 Mark the particle as out of its potential well. More...
 
G4bool isOutOfWell () const
 Check if the particle is out of its potential well. More...
 
void setEmissionTime (G4double t)
 
G4double getEmissionTime ()
 
ThreeVector getTransversePosition () const
 Transverse component of the position w.r.t. the momentum. More...
 
ThreeVector getLongitudinalPosition () const
 Longitudinal component of the position w.r.t. the momentum. More...
 
const ThreeVectoradjustMomentumFromEnergy ()
 Rescale the momentum to match the total energy. More...
 
G4double adjustEnergyFromMomentum ()
 Recompute the energy to match the momentum. More...
 
G4bool isCluster () const
 
void setFrozenMomentum (const ThreeVector &momentum)
 Set the frozen particle momentum. More...
 
void setFrozenEnergy (const G4double energy)
 Set the frozen particle momentum. More...
 
ThreeVector getFrozenMomentum () const
 Get the frozen particle momentum. More...
 
G4double getFrozenEnergy () const
 Get the frozen particle momentum. More...
 
ThreeVector getPropagationVelocity () const
 Get the propagation velocity of the particle. More...
 
void freezePropagation ()
 Freeze particle propagation. More...
 
void thawPropagation ()
 Unfreeze particle propagation. More...
 
virtual void rotatePositionAndMomentum (const G4double angle, const ThreeVector &axis)
 Rotate the particle position and momentum. More...
 
std::string print () const
 
std::string dump () const
 
long getID () const
 
ParticleList const * getParticles () const
 
G4double getReflectionMomentum () const
 Return the reflection momentum. More...
 
void setUncorrelatedMomentum (const G4double p)
 Set the uncorrelated momentum. More...
 
void rpCorrelate ()
 Make the particle follow a strict r-p correlation. More...
 
void rpDecorrelate ()
 Make the particle not follow a strict r-p correlation. More...
 
G4double getCosRPAngle () const
 Get the cosine of the angle between position and momentum. More...
 

Additional Inherited Members

- Protected Member Functions inherited from G4INCL::Particle
void swap (Particle &rhs)
 Helper method for the assignment operator. More...
 
- Protected Attributes inherited from G4INCL::Cluster
ParticleList particles
 
G4double theExcitationEnergy
 
ThreeVector theSpin
 
ParticleSamplertheParticleSampler
 
- Protected Attributes inherited from G4INCL::Particle
G4int theZ
 
G4int theA
 
ParticipantType theParticipantType
 
G4INCL::ParticleType theType
 
G4double theEnergy
 
G4doublethePropagationEnergy
 
G4double theFrozenEnergy
 
G4INCL::ThreeVector theMomentum
 
G4INCL::ThreeVectorthePropagationMomentum
 
G4INCL::ThreeVector theFrozenMomentum
 
G4INCL::ThreeVector thePosition
 
G4int nCollisions
 
G4int nDecays
 
G4double thePotentialEnergy
 
long ID
 
G4bool rpCorrelated
 
G4double uncorrelatedMomentum
 

Detailed Description

Definition at line 65 of file G4INCLNucleus.hh.

Constructor & Destructor Documentation

G4INCL::Nucleus::Nucleus ( G4int  mass,
G4int  charge,
Config const *const  conf,
const G4double  universeRadius = -1. 
)

Definition at line 66 of file G4INCLNucleus.cc.

67  : Cluster(charge,mass,true),
68  theInitialZ(charge), theInitialA(mass),
69  theNpInitial(0), theNnInitial(0),
70  initialInternalEnergy(0.),
71  incomingAngularMomentum(0.,0.,0.), incomingMomentum(0.,0.,0.),
72  initialCenterOfMass(0.,0.,0.),
73  remnant(true),
74  initialEnergy(0.),
75  tryCN(false),
76  theUniverseRadius(universeRadius),
77  isNucleusNucleus(false),
78  theProjectileRemnant(NULL),
79  theDensity(NULL),
80  thePotential(NULL)
81  {
82  PotentialType potentialType;
83  G4bool pionPotential;
84  if(conf) {
85  potentialType = conf->getPotentialType();
86  pionPotential = conf->getPionPotential();
87  } else { // By default we don't use energy dependent
88  // potential. This is convenient for some tests.
89  potentialType = IsospinPotential;
90  pionPotential = true;
91  }
92 
93  thePotential = NuclearPotential::createPotential(potentialType, theA, theZ, pionPotential);
94 
97 
99 
100  theParticleSampler->setPotential(thePotential);
101  theParticleSampler->setDensity(theDensity);
102 
103  if(theUniverseRadius<0)
104  theUniverseRadius = theDensity->getMaximumRadius();
105  theStore = new Store(conf);
106  }
void setProtonSeparationEnergy(const G4double s)
Setter for protonSeparationEnergy.
G4double getSeparationEnergy(const Particle *const p) const
Return the separation energy for a particle.
void setDensity(NuclearDensity const *const d)
Setter for theDensity.
bool G4bool
Definition: G4Types.hh:79
NuclearDensity const * createDensity(const G4int A, const G4int Z)
ParticleSampler * theParticleSampler
void setPotential(NuclearPotential::INuclearPotential const *const p)
Setter for thePotential.
INuclearPotential const * createPotential(const PotentialType type, const G4int theA, const G4int theZ, const G4bool pionPotential)
Create an INuclearPotential object.
void setNeutronSeparationEnergy(const G4double s)
Setter for protonSeparationEnergy.
Cluster(const G4int Z, const G4int A, const G4bool createParticleSampler=true)
Standard Cluster constructor.

Here is the call graph for this function:

G4INCL::Nucleus::~Nucleus ( )
virtual

Definition at line 108 of file G4INCLNucleus.cc.

108  {
109  delete theStore;
111  /* We don't delete the potential and the density here any more -- Factories
112  * are caching them
113  delete thePotential;
114  delete theDensity;*/
115  }
void deleteProjectileRemnant()
Delete the projectile remnant.

Here is the call graph for this function:

G4INCL::Nucleus::Nucleus ( const Nucleus rhs)

Dummy copy constructor to silence Coverity warning.

Member Function Documentation

void G4INCL::Nucleus::applyFinalState ( FinalState finalstate)

Apply reaction final state information to the nucleus.

Definition at line 132 of file G4INCLNucleus.cc.

132  {
133  if(!finalstate) // do nothing if no final state was returned
134  return;
135 
136  G4double totalEnergy = 0.0;
137 
138  FinalStateValidity const validity = finalstate->getValidity();
139  if(validity == ValidFS) {
140 
141  ParticleList const &created = finalstate->getCreatedParticles();
142  for(ParticleIter iter=created.begin(), e=created.end(); iter!=e; ++iter) {
143  theStore->add((*iter));
144  if(!(*iter)->isOutOfWell()) {
145  totalEnergy += (*iter)->getEnergy() - (*iter)->getPotentialEnergy();
146  }
147  }
148 
149  ParticleList const &deleted = finalstate->getDestroyedParticles();
150  for(ParticleIter iter=deleted.begin(), e=deleted.end(); iter!=e; ++iter) {
151  theStore->particleHasBeenDestroyed(*iter);
152  }
153 
154  ParticleList const &modified = finalstate->getModifiedParticles();
155  for(ParticleIter iter=modified.begin(), e=modified.end(); iter!=e; ++iter) {
156  theStore->particleHasBeenUpdated(*iter);
157  totalEnergy += (*iter)->getEnergy() - (*iter)->getPotentialEnergy();
158  }
159 
160  ParticleList const &out = finalstate->getOutgoingParticles();
161  for(ParticleIter iter=out.begin(), e=out.end(); iter!=e; ++iter) {
162  if((*iter)->isCluster()) {
163  Cluster *clusterOut = dynamic_cast<Cluster*>((*iter));
164 // assert(clusterOut);
165 #ifdef INCLXX_IN_GEANT4_MODE
166  if(!clusterOut)
167  continue;
168 #endif
169  ParticleList const &components = clusterOut->getParticles();
170  for(ParticleIter in=components.begin(), end=components.end(); in!=end; ++in)
171  theStore->particleHasBeenEjected(*in);
172  } else {
173  theStore->particleHasBeenEjected(*iter);
174  }
175  totalEnergy += (*iter)->getEnergy(); // No potential here because the particle is gone
176  theA -= (*iter)->getA();
177  theZ -= (*iter)->getZ();
178  theStore->addToOutgoing(*iter);
179  (*iter)->setEmissionTime(theStore->getBook().getCurrentTime());
180  }
181 
182  ParticleList const &entering = finalstate->getEnteringParticles();
183  for(ParticleIter iter=entering.begin(), e=entering.end(); iter!=e; ++iter) {
184  insertParticle(*iter);
185  totalEnergy += (*iter)->getEnergy() - (*iter)->getPotentialEnergy();
186  }
187 
188  // actually perform the removal of the scheduled avatars
189  theStore->removeScheduledAvatars();
190  } else if(validity == ParticleBelowFermiFS || validity == ParticleBelowZeroFS) {
191  INCL_DEBUG("A Particle is entering below the Fermi sea:" << '\n' << finalstate->print() << '\n');
192  tryCN = true;
193  ParticleList const &entering = finalstate->getEnteringParticles();
194  for(ParticleIter iter=entering.begin(), e=entering.end(); iter!=e; ++iter) {
195  insertParticle(*iter);
196  }
197  }
198 
199  if(validity==ValidFS &&
200  std::abs(totalEnergy - finalstate->getTotalEnergyBeforeInteraction()) > 0.1) {
201  INCL_ERROR("Energy nonconservation! Energy at the beginning of the event = "
202  << finalstate->getTotalEnergyBeforeInteraction()
203  <<" and after interaction = "
204  << totalEnergy << '\n'
205  << finalstate->print());
206  }
207  }
#define INCL_ERROR(x)
void add(Particle *p)
Definition: G4INCLStore.cc:58
void removeScheduledAvatars()
Remove avatars that have been scheduled.
Definition: G4INCLStore.cc:134
Book & getBook()
Definition: G4INCLStore.hh:259
void particleHasBeenDestroyed(Particle *const)
Definition: G4INCLStore.cc:181
void particleHasBeenEjected(Particle *const)
Definition: G4INCLStore.cc:175
void particleHasBeenUpdated(Particle *const)
Notify the Store about a particle update.
Definition: G4INCLStore.cc:127
void insertParticle(Particle *p)
Insert a new particle (e.g. a projectile) in the nucleus.
double G4double
Definition: G4Types.hh:76
G4double getCurrentTime() const
Definition: G4INCLBook.hh:98
#define INCL_DEBUG(x)
void addToOutgoing(Particle *p)
add the particle to the outgoing particle list.
Definition: G4INCLStore.hh:190
ParticleList::const_iterator ParticleIter
Cluster(const G4int Z, const G4int A, const G4bool createParticleSampler=true)
Standard Cluster constructor.

Here is the call graph for this function:

Here is the caller graph for this function:

ThreeVector G4INCL::Nucleus::computeCenterOfMass ( ) const

Compute the current center-of-mass position.

Returns
the center-of-mass position vector [fm].

Definition at line 260 of file G4INCLNucleus.cc.

260  {
261  ThreeVector cm(0.,0.,0.);
262  G4double totalMass = 0.0;
263  ParticleList const &inside = theStore->getParticles();
264  for(ParticleIter p=inside.begin(), e=inside.end(); p!=e; ++p) {
265  const G4double mass = (*p)->getMass();
266  cm += (*p)->getPosition() * mass;
267  totalMass += mass;
268  }
269  cm /= totalMass;
270  return cm;
271  }
ParticleList const & getParticles() const
Definition: G4INCLStore.hh:253
const char * p
Definition: xmltok.h:285
static constexpr double cm
Definition: G4SIunits.hh:119
double G4double
Definition: G4Types.hh:76
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4INCL::Nucleus::computeExcitationEnergy ( ) const

Compute the current excitation energy.

Returns
the excitation energy [MeV]

Definition at line 273 of file G4INCLNucleus.cc.

273  {
274  const G4double totalEnergy = computeTotalEnergy();
275  const G4double separationEnergies = computeSeparationEnergyBalance();
276 
277  return totalEnergy - initialInternalEnergy - separationEnergies;
278  }
G4double computeSeparationEnergyBalance() const
Outgoing - incoming separation energies.
G4double computeTotalEnergy() const
Compute the current total energy.
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

void G4INCL::Nucleus::computeRecoilKinematics ( )

Compute the recoil momentum and spin of the nucleus.

Definition at line 227 of file G4INCLNucleus.cc.

227  {
228  // If the remnant consists of only one nucleon, we need to apply a special
229  // procedure to put it on mass shell.
230  if(theA==1) {
231  emitInsidePions();
232  computeOneNucleonRecoilKinematics();
233  remnant=false;
234  return;
235  }
236 
237  // Compute the recoil momentum and angular momentum
238  theMomentum = incomingMomentum;
239  theSpin = incomingAngularMomentum;
240 
241  ParticleList const &outgoing = theStore->getOutgoingParticles();
242  for(ParticleIter p=outgoing.begin(), e=outgoing.end(); p!=e; ++p) {
243  theMomentum -= (*p)->getMomentum();
244  theSpin -= (*p)->getAngularMomentum();
245  }
246  if(theProjectileRemnant) {
247  theMomentum -= theProjectileRemnant->getMomentum();
248  theSpin -= theProjectileRemnant->getAngularMomentum();
249  }
250 
251  // Subtract orbital angular momentum
253  theSpin -= (thePosition-initialCenterOfMass).vector(theMomentum);
254 
257  remnant=true;
258  }
void setMass(G4double mass)
const char * p
Definition: xmltok.h:285
const G4INCL::ThreeVector & getMomentum() const
G4double adjustEnergyFromMomentum()
Recompute the energy to match the momentum.
G4INCL::ThreeVector getAngularMomentum() const
Get the total angular momentum (orbital + spin)
ParticleList const & getOutgoingParticles() const
Definition: G4INCLStore.hh:223
ThreeVector theSpin
G4INCL::ThreeVector thePosition
ThreeVector computeCenterOfMass() const
Compute the current center-of-mass position.
G4double theExcitationEnergy
void emitInsidePions()
Force emission of all pions inside the nucleus.
G4ThreadLocal NuclearMassFn getTableMass
Static pointer to the mass function for nuclei.
G4INCL::ThreeVector theMomentum
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

G4double G4INCL::Nucleus::computeSeparationEnergyBalance ( ) const
inline

Outgoing - incoming separation energies.

Used by CDPP.

Definition at line 116 of file G4INCLNucleus.hh.

116  {
117  G4double S = 0.0;
118  ParticleList const &outgoing = theStore->getOutgoingParticles();
119  for(ParticleIter i=outgoing.begin(), e=outgoing.end(); i!=e; ++i) {
120  const ParticleType t = (*i)->getType();
121  switch(t) {
122  case Proton:
123  case Neutron:
124  case DeltaPlusPlus:
125  case DeltaPlus:
126  case DeltaZero:
127  case DeltaMinus:
128  S += thePotential->getSeparationEnergy(*i);
129  break;
130  case Composite:
131  S += (*i)->getZ() * thePotential->getSeparationEnergy(Proton)
132  + ((*i)->getA() - (*i)->getZ()) * thePotential->getSeparationEnergy(Neutron);
133  break;
134  case PiPlus:
135  S += thePotential->getSeparationEnergy(Proton) - thePotential->getSeparationEnergy(Neutron);
136  break;
137  case PiMinus:
138  S += thePotential->getSeparationEnergy(Neutron) - thePotential->getSeparationEnergy(Proton);
139  break;
140  default:
141  break;
142  }
143  }
144 
145  S -= theNpInitial * thePotential->getSeparationEnergy(Proton);
146  S -= theNnInitial * thePotential->getSeparationEnergy(Neutron);
147  return S;
148  }
double S(double temp)
G4double getSeparationEnergy(const Particle *const p) const
Return the separation energy for a particle.
ParticleList const & getOutgoingParticles() const
Definition: G4INCLStore.hh:223
double G4double
Definition: G4Types.hh:76
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4INCL::Nucleus::computeTotalEnergy ( ) const

Compute the current total energy.

Returns
the total energy [MeV]

Definition at line 213 of file G4INCLNucleus.cc.

213  {
214  G4double totalEnergy = 0.0;
215  ParticleList const &inside = theStore->getParticles();
216  for(ParticleIter p=inside.begin(), e=inside.end(); p!=e; ++p) {
217  if((*p)->isNucleon()) // Ugly: we should calculate everything using total energies!
218  totalEnergy += (*p)->getKineticEnergy() - (*p)->getPotentialEnergy();
219  else if((*p)->isResonance())
220  totalEnergy += (*p)->getEnergy() - (*p)->getPotentialEnergy() - ParticleTable::effectiveNucleonMass;
221  else
222  totalEnergy += (*p)->getEnergy() - (*p)->getPotentialEnergy();
223  }
224  return totalEnergy;
225  }
ParticleList const & getParticles() const
Definition: G4INCLStore.hh:253
const char * p
Definition: xmltok.h:285
double G4double
Definition: G4Types.hh:76
const G4double effectiveNucleonMass
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

Here is the caller graph for this function:

G4bool G4INCL::Nucleus::containsDeltas ( )
inline

Returns true if the nucleus contains any deltas.

Definition at line 237 of file G4INCLNucleus.hh.

237  {
238  ParticleList const &inside = theStore->getParticles();
239  for(ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i)
240  if((*i)->isDelta()) return true;
241  return false;
242  }
ParticleList const & getParticles() const
Definition: G4INCLStore.hh:253
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

G4bool G4INCL::Nucleus::containsEtas ( )
inline

Returns true if the nucleus contains any etas.

Definition at line 245 of file G4INCLNucleus.hh.

245  {
246  ParticleList const &inside = theStore->getParticles();
247  for(ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i)
248  if((*i)->isEta()) return true;
249  return false;
250  }
ParticleList const & getParticles() const
Definition: G4INCLStore.hh:253
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

G4bool G4INCL::Nucleus::containsOmegas ( )
inline

Returns true if the nucleus contains any omegas.

Definition at line 253 of file G4INCLNucleus.hh.

253  {
254  ParticleList const &inside = theStore->getParticles();
255  for(ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i)
256  if((*i)->isOmega()) return true;
257  return false;
258  }
ParticleList const & getParticles() const
Definition: G4INCLStore.hh:253
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

G4bool G4INCL::Nucleus::decayInsideDeltas ( )

Force the decay of deltas inside the nucleus.

Returns
true if any delta was forced to decay.

Definition at line 352 of file G4INCLNucleus.cc.

352  {
353  /* If there is a pion potential, do nothing (deltas will be counted as
354  * excitation energy).
355  * If, however, the remnant is unphysical (Z<0 or Z>A), force the deltas to
356  * decay and get rid of all the pions. In case you're wondering, you can
357  * end up with Z<0 or Z>A if the remnant contains more pi- than protons or
358  * more pi+ than neutrons, respectively.
359  */
360  const G4bool unphysicalRemnant = (theZ<0 || theZ>theA);
361  if(thePotential->hasPionPotential() && !unphysicalRemnant)
362  return false;
363 
364  // Build a list of deltas (avoid modifying the list you are iterating on).
365  ParticleList const &inside = theStore->getParticles();
366  ParticleList deltas;
367  for(ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i)
368  if((*i)->isDelta()) deltas.push_back((*i));
369 
370  // Loop over the deltas, make them decay
371  for(ParticleIter i=deltas.begin(), e=deltas.end(); i!=e; ++i) {
372  INCL_DEBUG("Decay inside delta particle:" << '\n'
373  << (*i)->print() << '\n');
374  // Create a forced-decay avatar. Note the last boolean parameter. Note
375  // also that if the remnant is unphysical we more or less explicitly give
376  // up energy conservation and CDPP by passing a NULL pointer for the
377  // nucleus.
378  IAvatar *decay;
379  if(unphysicalRemnant) {
380  INCL_WARN("Forcing delta decay inside an unphysical remnant (A=" << theA
381  << ", Z=" << theZ << "). Might lead to energy-violation warnings."
382  << '\n');
383  decay = new DecayAvatar((*i), 0.0, NULL, true);
384  } else
385  decay = new DecayAvatar((*i), 0.0, this, true);
386  FinalState *fs = decay->getFinalState();
387 
388  // The pion can be ejected only if we managed to satisfy energy
389  // conservation and if pion emission does not lead to negative excitation
390  // energies.
391  if(fs->getValidity()==ValidFS) {
392  // Apply the final state to the nucleus
393  applyFinalState(fs);
394  }
395  delete fs;
396  delete decay;
397  }
398 
399  // If the remnant is unphysical, emit all the pions
400  if(unphysicalRemnant) {
401  INCL_DEBUG("Remnant is unphysical: Z=" << theZ << ", A=" << theA << ", emitting all the pions" << '\n');
402  emitInsidePions();
403  }
404 
405  return true;
406  }
ParticleList const & getParticles() const
Definition: G4INCLStore.hh:253
void applyFinalState(FinalState *)
#define INCL_WARN(x)
ParticleList decay(Cluster *const c)
Carries out a cluster decay.
bool G4bool
Definition: G4Types.hh:79
G4bool hasPionPotential() const
Do we have a pion potential?
void emitInsidePions()
Force emission of all pions inside the nucleus.
#define INCL_DEBUG(x)
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

G4bool G4INCL::Nucleus::decayMe ( )

Force the phase-space decay of the Nucleus.

Only applied if Z==0 or Z==A.

Returns
true if the nucleus was forced to decay.

Definition at line 499 of file G4INCLNucleus.cc.

499  {
500  // Do the phase-space decay only if Z=0 or Z=A
501  if(theA<=1 || (theZ!=0 && theA!=theZ))
502  return false;
503 
504  ParticleList decayProducts = ClusterDecay::decay(this);
505  for(ParticleIter j=decayProducts.begin(), e=decayProducts.end(); j!=e; ++j)
506  theStore->addToOutgoing(*j);
507 
508  return true;
509  }
ParticleList decay(Cluster *const c)
Carries out a cluster decay.
void addToOutgoing(Particle *p)
add the particle to the outgoing particle list.
Definition: G4INCLStore.hh:190
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

G4bool G4INCL::Nucleus::decayOutgoingClusters ( )

Force the decay of unstable outgoing clusters.

Returns
true if any cluster was forced to decay.

Definition at line 476 of file G4INCLNucleus.cc.

476  {
477  ParticleList const &out = theStore->getOutgoingParticles();
478  ParticleList clusters;
479  for(ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
480  if((*i)->isCluster()) clusters.push_back((*i));
481  }
482  if(clusters.empty()) return false;
483 
484  for(ParticleIter i=clusters.begin(), e=clusters.end(); i!=e; ++i) {
485  Cluster *cluster = dynamic_cast<Cluster*>(*i); // Can't avoid using a cast here
486 // assert(cluster);
487 #ifdef INCLXX_IN_GEANT4_MODE
488  if(!cluster)
489  continue;
490 #endif
491  cluster->deleteParticles(); // Don't need them
492  ParticleList decayProducts = ClusterDecay::decay(cluster);
493  for(ParticleIter j=decayProducts.begin(), end=decayProducts.end(); j!=end; ++j)
494  theStore->addToOutgoing(*j);
495  }
496  return true;
497  }
ParticleList decay(Cluster *const c)
Carries out a cluster decay.
ParticleList const & getOutgoingParticles() const
Definition: G4INCLStore.hh:223
void addToOutgoing(Particle *p)
add the particle to the outgoing particle list.
Definition: G4INCLStore.hh:190
ParticleList::const_iterator ParticleIter
Cluster(const G4int Z, const G4int A, const G4bool createParticleSampler=true)
Standard Cluster constructor.

Here is the call graph for this function:

G4bool G4INCL::Nucleus::decayOutgoingDeltas ( )

Force the decay of outgoing deltas.

Returns
true if any delta was forced to decay.

Definition at line 300 of file G4INCLNucleus.cc.

300  {
301  ParticleList const &out = theStore->getOutgoingParticles();
302  ParticleList deltas;
303  for(ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
304  if((*i)->isDelta()) deltas.push_back((*i));
305  }
306  if(deltas.empty()) return false;
307 
308  for(ParticleIter i=deltas.begin(), e=deltas.end(); i!=e; ++i) {
309  INCL_DEBUG("Decay outgoing delta particle:" << '\n'
310  << (*i)->print() << '\n');
311  const ThreeVector beta = -(*i)->boostVector();
312  const G4double deltaMass = (*i)->getMass();
313 
314  // Set the delta momentum to zero and sample the decay in the CM frame.
315  // This makes life simpler if we are using real particle masses.
316  (*i)->setMomentum(ThreeVector());
317  (*i)->setEnergy((*i)->getMass());
318 
319  // Use a DecayAvatar
320  IAvatar *decay = new DecayAvatar((*i), 0.0, NULL);
321  FinalState *fs = decay->getFinalState();
322  Particle * const pion = fs->getCreatedParticles().front();
323  Particle * const nucleon = fs->getModifiedParticles().front();
324 
325  // Adjust the decay momentum if we are using the real masses
326  const G4double decayMomentum = KinematicsUtils::momentumInCM(deltaMass,
327  nucleon->getTableMass(),
328  pion->getTableMass());
329  ThreeVector newMomentum = pion->getMomentum();
330  newMomentum *= decayMomentum / newMomentum.mag();
331 
332  pion->setTableMass();
333  pion->setMomentum(newMomentum);
334  pion->adjustEnergyFromMomentum();
335  pion->setEmissionTime(nucleon->getEmissionTime());
336  pion->boost(beta);
337 
338  nucleon->setTableMass();
339  nucleon->setMomentum(-newMomentum);
340  nucleon->adjustEnergyFromMomentum();
341  nucleon->boost(beta);
342 
343  theStore->addToOutgoing(pion);
344 
345  delete fs;
346  delete decay;
347  }
348 
349  return true;
350  }
G4bool pion(G4int ityp)
G4double momentumInCM(Particle const *const p1, Particle const *const p2)
gives the momentum in the CM frame of two particles.
ParticleList decay(Cluster *const c)
Carries out a cluster decay.
ParticleList const & getOutgoingParticles() const
Definition: G4INCLStore.hh:223
G4bool nucleon(G4int ityp)
double G4double
Definition: G4Types.hh:76
#define INCL_DEBUG(x)
void addToOutgoing(Particle *p)
add the particle to the outgoing particle list.
Definition: G4INCLStore.hh:190
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

G4bool G4INCL::Nucleus::decayOutgoingPionResonances ( G4double  timeThreshold)

Force the decay of outgoing PionResonances (eta/omega).

Returns
true if any eta was forced to decay.

Definition at line 408 of file G4INCLNucleus.cc.

408  {
409  ParticleList const &out = theStore->getOutgoingParticles();
410  ParticleList pionResonances;
411  for(ParticleIter i=out.begin(), e=out.end(); i!=e; ++i) {
412 // if((*i)->isEta() || (*i)->isOmega()) pionResonances.push_back((*i));
413  if(((*i)->isEta() && timeThreshold > ParticleTable::getWidth(Eta)) || ((*i)->isOmega() && timeThreshold > ParticleTable::getWidth(Omega))) pionResonances.push_back((*i));
414  }
415  if(pionResonances.empty()) return false;
416 
417  for(ParticleIter i=pionResonances.begin(), e=pionResonances.end(); i!=e; ++i) {
418  INCL_DEBUG("Decay outgoing pionResonances particle:" << '\n'
419  << (*i)->print() << '\n');
420  const ThreeVector beta = -(*i)->boostVector();
421  const G4double pionResonanceMass = (*i)->getMass();
422 
423  // Set the pionResonance momentum to zero and sample the decay in the CM frame.
424  // This makes life simpler if we are using real particle masses.
425  (*i)->setMomentum(ThreeVector());
426  (*i)->setEnergy((*i)->getMass());
427 
428  // Use a DecayAvatar
429  IAvatar *decay = new DecayAvatar((*i), 0.0, NULL);
430  FinalState *fs = decay->getFinalState();
431 
432  Particle * const theModifiedParticle = fs->getModifiedParticles().front();
433  ParticleList const &created = fs->getCreatedParticles();
434  Particle * const theCreatedParticle1 = created.front();
435 
436  if (created.size() == 1) {
437 
438  // Adjust the decay momentum if we are using the real masses
439  const G4double decayMomentum = KinematicsUtils::momentumInCM(pionResonanceMass,theModifiedParticle->getTableMass(),theCreatedParticle1->getTableMass());
440  ThreeVector newMomentum = theCreatedParticle1->getMomentum();
441  newMomentum *= decayMomentum / newMomentum.mag();
442 
443  theCreatedParticle1->setTableMass();
444  theCreatedParticle1->setMomentum(newMomentum);
445  theCreatedParticle1->adjustEnergyFromMomentum();
446  //theCreatedParticle1->setEmissionTime(nucleon->getEmissionTime());
447  theCreatedParticle1->boost(beta);
448 
449  theModifiedParticle->setTableMass();
450  theModifiedParticle->setMomentum(-newMomentum);
451  theModifiedParticle->adjustEnergyFromMomentum();
452  theModifiedParticle->boost(beta);
453 
454  theStore->addToOutgoing(theCreatedParticle1);
455  }
456  else if (created.size() == 2) {
457  Particle * const theCreatedParticle2 = created.back();
458 
459  theCreatedParticle1->boost(beta);
460  theCreatedParticle2->boost(beta);
461  theModifiedParticle->boost(beta);
462 
463  theStore->addToOutgoing(theCreatedParticle1);
464  theStore->addToOutgoing(theCreatedParticle2);
465  }
466  else {
467  INCL_ERROR("Wrong number (< 2) of created particles during the decay of a pion resonance");
468  }
469  delete fs;
470  delete decay;
471  }
472 
473  return true;
474  }
#define INCL_ERROR(x)
G4double momentumInCM(Particle const *const p1, Particle const *const p2)
gives the momentum in the CM frame of two particles.
ParticleList decay(Cluster *const c)
Carries out a cluster decay.
ParticleList const & getOutgoingParticles() const
Definition: G4INCLStore.hh:223
G4double getWidth(const ParticleType t)
Get particle width (in s)
double G4double
Definition: G4Types.hh:76
#define INCL_DEBUG(x)
void addToOutgoing(Particle *p)
add the particle to the outgoing particle list.
Definition: G4INCLStore.hh:190
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

void G4INCL::Nucleus::deleteProjectileRemnant ( )
inline

Delete the projectile remnant.

Definition at line 360 of file G4INCLNucleus.hh.

360  {
361  delete theProjectileRemnant;
362  theProjectileRemnant = NULL;
363  }

Here is the caller graph for this function:

void G4INCL::Nucleus::emitInsidePions ( )

Force emission of all pions inside the nucleus.

Definition at line 511 of file G4INCLNucleus.cc.

511  {
512  /* Forcing emissions of all pions in the nucleus. This probably violates
513  * energy conservation (although the computation of the recoil kinematics
514  * might sweep this under the carpet).
515  */
516  INCL_WARN("Forcing emissions of all pions in the nucleus." << '\n');
517 
518  // Emit the pions with this kinetic energy
519  const G4double tinyPionEnergy = 0.1; // MeV
520 
521  // Push out the emitted pions
522  ParticleList const &inside = theStore->getParticles();
523  ParticleList toEject;
524  for(ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i) {
525  if((*i)->isPion()) {
526  Particle * const thePion = *i;
527  INCL_DEBUG("Forcing emission of the following particle: "
528  << thePion->print() << '\n');
529  thePion->setEmissionTime(theStore->getBook().getCurrentTime());
530  // Correction for real masses
531  const G4double theQValueCorrection = thePion->getEmissionQValueCorrection(theA,theZ);
532  const G4double kineticEnergyOutside = thePion->getKineticEnergy() - thePion->getPotentialEnergy() + theQValueCorrection;
533  thePion->setTableMass();
534  if(kineticEnergyOutside > 0.0)
535  thePion->setEnergy(thePion->getMass()+kineticEnergyOutside);
536  else
537  thePion->setEnergy(thePion->getMass()+tinyPionEnergy);
538  thePion->adjustMomentumFromEnergy();
539  thePion->setPotentialEnergy(0.);
540  theZ -= thePion->getZ();
541  toEject.push_back(thePion);
542  }
543  }
544  for(ParticleIter i=toEject.begin(), e=toEject.end(); i!=e; ++i) {
545  theStore->particleHasBeenEjected(*i);
546  theStore->addToOutgoing(*i);
547  }
548  }
ParticleList const & getParticles() const
Definition: G4INCLStore.hh:253
#define INCL_WARN(x)
Book & getBook()
Definition: G4INCLStore.hh:259
void particleHasBeenEjected(Particle *const)
Definition: G4INCLStore.cc:175
double G4double
Definition: G4Types.hh:76
G4double getCurrentTime() const
Definition: G4INCLBook.hh:98
#define INCL_DEBUG(x)
void addToOutgoing(Particle *p)
add the particle to the outgoing particle list.
Definition: G4INCLStore.hh:190
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

Here is the caller graph for this function:

void G4INCL::Nucleus::fillEventInfo ( EventInfo eventInfo)

Fill the event info which contains INCL output data

Definition at line 719 of file G4INCLNucleus.cc.

719  {
720  eventInfo->nParticles = 0;
721  G4bool isNucleonAbsorption = false;
722 
723  G4bool isPionAbsorption = false;
724  // It is possible to have pion absorption event only if the
725  // projectile is pion.
726  if(eventInfo->projectileType == PiPlus ||
727  eventInfo->projectileType == PiMinus ||
728  eventInfo->projectileType == PiZero) {
729  isPionAbsorption = true;
730  }
731 
732  // Forced CN
733  eventInfo->forcedCompoundNucleus = tryCN;
734 
735  // Outgoing particles
736  ParticleList const &outgoingParticles = getStore()->getOutgoingParticles();
737 
738  // Check if we have a nucleon absorption event: nucleon projectile
739  // and no ejected particles.
740  if(outgoingParticles.size() == 0 &&
741  (eventInfo->projectileType == Proton ||
742  eventInfo->projectileType == Neutron)) {
743  isNucleonAbsorption = true;
744  }
745 
746  // Reset the remnant counter
747  eventInfo->nRemnants = 0;
748  eventInfo->history.clear();
749 
750  for(ParticleIter i=outgoingParticles.begin(), e=outgoingParticles.end(); i!=e; ++i ) {
751  // We have a pion absorption event only if the projectile is
752  // pion and there are no ejected pions.
753  if(isPionAbsorption) {
754  if((*i)->isPion()) {
755  isPionAbsorption = false;
756  }
757  }
758 
759  eventInfo->A[eventInfo->nParticles] = (*i)->getA();
760  eventInfo->Z[eventInfo->nParticles] = (*i)->getZ();
761  eventInfo->emissionTime[eventInfo->nParticles] = (*i)->getEmissionTime();
762  eventInfo->EKin[eventInfo->nParticles] = (*i)->getKineticEnergy();
763  ThreeVector mom = (*i)->getMomentum();
764  eventInfo->px[eventInfo->nParticles] = mom.getX();
765  eventInfo->py[eventInfo->nParticles] = mom.getY();
766  eventInfo->pz[eventInfo->nParticles] = mom.getZ();
767  eventInfo->theta[eventInfo->nParticles] = Math::toDegrees(mom.theta());
768  eventInfo->phi[eventInfo->nParticles] = Math::toDegrees(mom.phi());
769  eventInfo->origin[eventInfo->nParticles] = -1;
770  eventInfo->history.push_back("");
771  if ((*i)->getType() != Composite) {
772  ParticleSpecies pt((*i)->getType());
773  eventInfo->PDGCode[eventInfo->nParticles] = pt.ParticleSpecies::getPDGCode();
774  }
775  else {
776  ParticleSpecies pt((*i)->getA(), (*i)->getZ());
777  eventInfo->PDGCode[eventInfo->nParticles] = pt.ParticleSpecies::getPDGCode();
778  }
779  eventInfo->nParticles++;
780  }
781  eventInfo->nucleonAbsorption = isNucleonAbsorption;
782  eventInfo->pionAbsorption = isPionAbsorption;
783  eventInfo->nCascadeParticles = eventInfo->nParticles;
784 
785  // Projectile-like remnant characteristics
786  if(theProjectileRemnant && theProjectileRemnant->getA()>0) {
787  eventInfo->ARem[eventInfo->nRemnants] = theProjectileRemnant->getA();
788  eventInfo->ZRem[eventInfo->nRemnants] = theProjectileRemnant->getZ();
789  G4double eStar = theProjectileRemnant->getExcitationEnergy();
790  if(std::abs(eStar)<1E-10)
791  eStar = 0.0; // blame rounding and set the excitation energy to zero
792  eventInfo->EStarRem[eventInfo->nRemnants] = eStar;
793  if(eventInfo->EStarRem[eventInfo->nRemnants]<0.) {
794  INCL_WARN("Negative excitation energy in projectile-like remnant! EStarRem = " << eventInfo->EStarRem[eventInfo->nRemnants] << '\n');
795  }
796  const ThreeVector &spin = theProjectileRemnant->getSpin();
797  if(eventInfo->ARem[eventInfo->nRemnants]%2==0) { // even-A nucleus
798  eventInfo->JRem[eventInfo->nRemnants] = (G4int) (spin.mag()/PhysicalConstants::hc + 0.5);
799  } else { // odd-A nucleus
800  eventInfo->JRem[eventInfo->nRemnants] = ((G4int) (spin.mag()/PhysicalConstants::hc)) + 0.5;
801  }
802  eventInfo->EKinRem[eventInfo->nRemnants] = theProjectileRemnant->getKineticEnergy();
803  const ThreeVector &mom = theProjectileRemnant->getMomentum();
804  eventInfo->pxRem[eventInfo->nRemnants] = mom.getX();
805  eventInfo->pyRem[eventInfo->nRemnants] = mom.getY();
806  eventInfo->pzRem[eventInfo->nRemnants] = mom.getZ();
807  eventInfo->jxRem[eventInfo->nRemnants] = spin.getX() / PhysicalConstants::hc;
808  eventInfo->jyRem[eventInfo->nRemnants] = spin.getY() / PhysicalConstants::hc;
809  eventInfo->jzRem[eventInfo->nRemnants] = spin.getZ() / PhysicalConstants::hc;
810  eventInfo->thetaRem[eventInfo->nRemnants] = Math::toDegrees(mom.theta());
811  eventInfo->phiRem[eventInfo->nRemnants] = Math::toDegrees(mom.phi());
812  eventInfo->nRemnants++;
813  }
814 
815  // Target-like remnant characteristics
816  if(hasRemnant()) {
817  eventInfo->ARem[eventInfo->nRemnants] = getA();
818  eventInfo->ZRem[eventInfo->nRemnants] = getZ();
819  eventInfo->EStarRem[eventInfo->nRemnants] = getExcitationEnergy();
820  if(eventInfo->EStarRem[eventInfo->nRemnants]<0.) {
821  INCL_WARN("Negative excitation energy in target-like remnant! EStarRem = " << eventInfo->EStarRem[eventInfo->nRemnants] << '\n');
822  }
823  const ThreeVector &spin = getSpin();
824  if(eventInfo->ARem[eventInfo->nRemnants]%2==0) { // even-A nucleus
825  eventInfo->JRem[eventInfo->nRemnants] = (G4int) (spin.mag()/PhysicalConstants::hc + 0.5);
826  } else { // odd-A nucleus
827  eventInfo->JRem[eventInfo->nRemnants] = ((G4int) (spin.mag()/PhysicalConstants::hc)) + 0.5;
828  }
829  eventInfo->EKinRem[eventInfo->nRemnants] = getKineticEnergy();
830  const ThreeVector &mom = getMomentum();
831  eventInfo->pxRem[eventInfo->nRemnants] = mom.getX();
832  eventInfo->pyRem[eventInfo->nRemnants] = mom.getY();
833  eventInfo->pzRem[eventInfo->nRemnants] = mom.getZ();
834  eventInfo->jxRem[eventInfo->nRemnants] = spin.getX() / PhysicalConstants::hc;
835  eventInfo->jyRem[eventInfo->nRemnants] = spin.getY() / PhysicalConstants::hc;
836  eventInfo->jzRem[eventInfo->nRemnants] = spin.getZ() / PhysicalConstants::hc;
837  eventInfo->thetaRem[eventInfo->nRemnants] = Math::toDegrees(mom.theta());
838  eventInfo->phiRem[eventInfo->nRemnants] = Math::toDegrees(mom.phi());
839  eventInfo->nRemnants++;
840  }
841 
842  // Global counters, flags, etc.
843  Book const &theBook = theStore->getBook();
844  eventInfo->nCollisions = theBook.getAcceptedCollisions();
845  eventInfo->nBlockedCollisions = theBook.getBlockedCollisions();
846  eventInfo->nDecays = theBook.getAcceptedDecays();
847  eventInfo->nBlockedDecays = theBook.getBlockedDecays();
848  eventInfo->firstCollisionTime = theBook.getFirstCollisionTime();
849  eventInfo->firstCollisionXSec = theBook.getFirstCollisionXSec();
850  eventInfo->firstCollisionSpectatorPosition = theBook.getFirstCollisionSpectatorPosition();
851  eventInfo->firstCollisionSpectatorMomentum = theBook.getFirstCollisionSpectatorMomentum();
852  eventInfo->firstCollisionIsElastic = theBook.getFirstCollisionIsElastic();
853  eventInfo->nReflectionAvatars = theBook.getAvatars(SurfaceAvatarType);
854  eventInfo->nCollisionAvatars = theBook.getAvatars(CollisionAvatarType);
855  eventInfo->nDecayAvatars = theBook.getAvatars(DecayAvatarType);
856  eventInfo->nEnergyViolationInteraction = theBook.getEnergyViolationInteraction();
857  }
G4int getA() const
Returns the baryon number.
G4int getAcceptedCollisions() const
Definition: G4INCLBook.hh:100
const G4double hc
[MeV*fm]
const G4INCL::ThreeVector & getMomentum() const
Store * getStore() const
#define INCL_WARN(x)
G4double toDegrees(G4double radians)
G4bool hasRemnant() const
Does the nucleus give a cascade remnant?
int G4int
Definition: G4Types.hh:78
ParticleList const & getOutgoingParticles() const
Definition: G4INCLStore.hh:223
Book & getBook()
Definition: G4INCLStore.hh:259
bool G4bool
Definition: G4Types.hh:79
G4int getZ() const
Returns the charge number.
G4double getExcitationEnergy() const
Get the excitation energy of the nucleus.
ThreeVector const & getSpin() const
Get the spin of the nucleus.
G4double getX() const
G4double getExcitationEnergy() const
Get the excitation energy of the cluster.
G4double getKineticEnergy() const
Get the particle kinetic energy.
double G4double
Definition: G4Types.hh:76
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

void G4INCL::Nucleus::finalizeProjectileRemnant ( const G4double  emissionTime)

Finalise the projectile remnant.

Complete the treatment of the projectile remnant. If it contains nucleons, assign its excitation energy and spin. Move stuff to the outgoing list, if appropriate.

Parameters
emissionTimethe emission time of the projectile remnant

Definition at line 911 of file G4INCLNucleus.cc.

911  {
912  // Deal with the projectile remnant
913  const G4int prA = theProjectileRemnant->getA();
914  if(prA>=1) {
915  // Set the mass
916  const G4double aMass = theProjectileRemnant->getInvariantMass();
917  theProjectileRemnant->setMass(aMass);
918 
919  // Compute the excitation energy from the invariant mass
920  const G4double anExcitationEnergy = aMass
921  - ParticleTable::getTableMass(prA, theProjectileRemnant->getZ());
922 
923  // Set the excitation energy
924  theProjectileRemnant->setExcitationEnergy(anExcitationEnergy);
925 
926  // No spin!
927  theProjectileRemnant->setSpin(ThreeVector());
928 
929  // Set the emission time
930  theProjectileRemnant->setEmissionTime(anEmissionTime);
931  }
932  }
G4int getA() const
Returns the baryon number.
void setMass(G4double mass)
void setEmissionTime(G4double t)
int G4int
Definition: G4Types.hh:78
G4double getInvariantMass() const
Get the the particle invariant mass.
G4int getZ() const
Returns the charge number.
G4ThreadLocal NuclearMassFn getTableMass
Static pointer to the mass function for nuclei.
double G4double
Definition: G4Types.hh:76
void setExcitationEnergy(const G4double e)
Set the excitation energy of the cluster.
void setSpin(const ThreeVector &j)
Set the spin of the nucleus.

Here is the call graph for this function:

Nucleus::ConservationBalance G4INCL::Nucleus::getConservationBalance ( EventInfo const &  theEventInfo,
const G4bool  afterRecoil 
) const

Compute charge, mass, energy and momentum balance.

Definition at line 859 of file G4INCLNucleus.cc.

859  {
860  ConservationBalance theBalance;
861  // Initialise balance variables with the incoming values
862  theBalance.Z = theEventInfo.Zp + theEventInfo.Zt;
863  theBalance.A = theEventInfo.Ap + theEventInfo.At;
864 
865  theBalance.energy = getInitialEnergy();
866  theBalance.momentum = getIncomingMomentum();
867 
868  // Process outgoing particles
869  ParticleList const &outgoingParticles = theStore->getOutgoingParticles();
870  for(ParticleIter i=outgoingParticles.begin(), e=outgoingParticles.end(); i!=e; ++i ) {
871  theBalance.Z -= (*i)->getZ();
872  theBalance.A -= (*i)->getA();
873  // For outgoing clusters, the total energy automatically includes the
874  // excitation energy
875  theBalance.energy -= (*i)->getEnergy(); // Note that outgoing particles should have the real mass
876  theBalance.momentum -= (*i)->getMomentum();
877  }
878 
879  // Projectile-like remnant contribution, if present
880  if(theProjectileRemnant && theProjectileRemnant->getA()>0) {
881  theBalance.Z -= theProjectileRemnant->getZ();
882  theBalance.A -= theProjectileRemnant->getA();
883  theBalance.energy -= ParticleTable::getTableMass(theProjectileRemnant->getA(),theProjectileRemnant->getZ()) +
884  theProjectileRemnant->getExcitationEnergy();
885  theBalance.energy -= theProjectileRemnant->getKineticEnergy();
886  theBalance.momentum -= theProjectileRemnant->getMomentum();
887  }
888 
889  // Target-like remnant contribution, if present
890  if(hasRemnant()) {
891  theBalance.Z -= getZ();
892  theBalance.A -= getA();
893  theBalance.energy -= ParticleTable::getTableMass(getA(),getZ()) +
895  if(afterRecoil)
896  theBalance.energy -= getKineticEnergy();
897  theBalance.momentum -= getMomentum();
898  }
899 
900  return theBalance;
901  }
G4int getA() const
Returns the baryon number.
const ThreeVector & getIncomingMomentum() const
Get the incoming momentum vector.
const G4INCL::ThreeVector & getMomentum() const
G4bool hasRemnant() const
Does the nucleus give a cascade remnant?
G4double getInitialEnergy() const
Get the initial energy.
ParticleList const & getOutgoingParticles() const
Definition: G4INCLStore.hh:223
G4int getZ() const
Returns the charge number.
G4double getExcitationEnergy() const
Get the excitation energy of the nucleus.
G4ThreadLocal NuclearMassFn getTableMass
Static pointer to the mass function for nuclei.
G4double getExcitationEnergy() const
Get the excitation energy of the cluster.
G4double getKineticEnergy() const
Get the particle kinetic energy.
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

NuclearDensity const* G4INCL::Nucleus::getDensity ( ) const
inline

Getter for theDensity.

Definition at line 388 of file G4INCLNucleus.hh.

388 { return theDensity; };

Here is the caller graph for this function:

G4double G4INCL::Nucleus::getExcitationEnergy ( ) const
inline

Get the excitation energy of the nucleus.

Method computeRecoilKinematics() should be called first.

Definition at line 234 of file G4INCLNucleus.hh.

234 { return theExcitationEnergy; }
G4double theExcitationEnergy

Here is the caller graph for this function:

const ThreeVector& G4INCL::Nucleus::getIncomingAngularMomentum ( ) const
inline

Get the incoming angular-momentum vector.

Definition at line 212 of file G4INCLNucleus.hh.

212 { return incomingAngularMomentum; }
const ThreeVector& G4INCL::Nucleus::getIncomingMomentum ( ) const
inline

Get the incoming momentum vector.

Definition at line 220 of file G4INCLNucleus.hh.

220  {
221  return incomingMomentum;
222  }

Here is the caller graph for this function:

G4int G4INCL::Nucleus::getInitialA ( ) const
inline

Definition at line 99 of file G4INCLNucleus.hh.

99 { return theInitialA; };

Here is the caller graph for this function:

G4double G4INCL::Nucleus::getInitialEnergy ( ) const
inline

Get the initial energy.

Definition at line 228 of file G4INCLNucleus.hh.

228 { return initialEnergy; }

Here is the caller graph for this function:

G4double G4INCL::Nucleus::getInitialInternalEnergy ( ) const
inline

Definition at line 271 of file G4INCLNucleus.hh.

271 { return initialInternalEnergy; };

Here is the caller graph for this function:

G4int G4INCL::Nucleus::getInitialZ ( ) const
inline

Definition at line 100 of file G4INCLNucleus.hh.

100 { return theInitialZ; };

Here is the caller graph for this function:

G4int G4INCL::Nucleus::getNumberOfEnteringNeutrons ( ) const
inline

Definition at line 110 of file G4INCLNucleus.hh.

110 { return theNnInitial; };
G4int G4INCL::Nucleus::getNumberOfEnteringProtons ( ) const
inline

Definition at line 109 of file G4INCLNucleus.hh.

109 { return theNpInitial; };
NuclearPotential::INuclearPotential const* G4INCL::Nucleus::getPotential ( ) const
inline

Getter for thePotential.

Definition at line 391 of file G4INCLNucleus.hh.

391 { return thePotential; };

Here is the caller graph for this function:

ProjectileRemnant* G4INCL::Nucleus::getProjectileRemnant ( ) const
inline

Get the projectile remnant.

Definition at line 357 of file G4INCLNucleus.hh.

357 { return theProjectileRemnant; }

Here is the caller graph for this function:

Store* G4INCL::Nucleus::getStore ( ) const
inline

Definition at line 265 of file G4INCLNucleus.hh.

265 {return theStore; };

Here is the caller graph for this function:

G4double G4INCL::Nucleus::getSurfaceRadius ( Particle const *const  particle) const
inline

Get the maximum allowed radius for a given particle.

Calls the NuclearDensity::getMaxRFromP() method for nucleons and deltas, and the NuclearDensity::getTrasmissionRadius() method for pions.

Parameters
particlepointer to a particle
Returns
surface radius

Definition at line 320 of file G4INCLNucleus.hh.

320  {
321 // if(particle->isPion())
322  if(particle->isPion() || particle->isEta() || particle->isOmega() || particle->isEtaPrime())
323  // Temporarily set RPION = RMAX
324  return getUniverseRadius();
325  //return 0.5*(theDensity->getTransmissionRadius(particle)+getUniverseRadius());
326  else {
327  const G4double pr = particle->getReflectionMomentum()/thePotential->getFermiMomentum(particle);
328  if(pr>=1.)
329  return getUniverseRadius();
330  else
331  return theDensity->getMaxRFromP(particle->getType(), pr);
332  }
333  }
G4double getFermiMomentum(const Particle *const p) const
Return the Fermi momentum for a particle.
G4double getUniverseRadius() const
Getter for theUniverseRadius.
double G4double
Definition: G4Types.hh:76
G4double getMaxRFromP(const ParticleType t, const G4double p) const
Get the maximum allowed radius for a given momentum.

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4INCL::Nucleus::getTransmissionBarrier ( Particle const *const  p)
inline

Get the transmission barrier.

Definition at line 293 of file G4INCLNucleus.hh.

293  {
294  const G4double theTransmissionRadius = theDensity->getTransmissionRadius(p);
295  const G4double theParticleZ = p->getZ();
296  return PhysicalConstants::eSquared*(theZ-theParticleZ)*theParticleZ/theTransmissionRadius;
297  }
const G4double eSquared
Coulomb conversion factor [MeV*fm].
const char * p
Definition: xmltok.h:285
double G4double
Definition: G4Types.hh:76
G4double getTransmissionRadius(Particle const *const p) const
The radius used for calculating the transmission coefficient.

Here is the call graph for this function:

Here is the caller graph for this function:

G4bool G4INCL::Nucleus::getTryCompoundNucleus ( )
inline

Definition at line 290 of file G4INCLNucleus.hh.

290 { return tryCN; }
G4double G4INCL::Nucleus::getUniverseRadius ( ) const
inline

Getter for theUniverseRadius.

Definition at line 336 of file G4INCLNucleus.hh.

336 { return theUniverseRadius; }

Here is the caller graph for this function:

G4bool G4INCL::Nucleus::hasRemnant ( ) const
inline

Does the nucleus give a cascade remnant?

To be called after computeRecoilKinematics().

Definition at line 283 of file G4INCLNucleus.hh.

283 { return remnant; }

Here is the caller graph for this function:

void G4INCL::Nucleus::initializeParticles ( )
virtual

Call the Cluster method to generate the initial distribution of particles. At the beginning all particles are assigned as spectators.

Reimplemented from G4INCL::Cluster.

Definition at line 117 of file G4INCLNucleus.cc.

117  {
118  // Reset the variables connected with the projectile remnant
119  delete theProjectileRemnant;
120  theProjectileRemnant = NULL;
121 
123  for(ParticleIter i=particles.begin(), e=particles.end(); i!=e; ++i) {
125  }
126  theStore->add(particles);
127  particles.clear();
128  initialInternalEnergy = computeTotalEnergy();
129  initialCenterOfMass = thePosition;
130  }
void updatePotentialEnergy(Particle *p) const
Update the particle potential energy.
void add(Particle *p)
Definition: G4INCLStore.cc:58
virtual void initializeParticles()
Initialise the NuclearDensity pointer and sample the particles.
ParticleList particles
G4INCL::ThreeVector thePosition
G4double computeTotalEnergy() const
Compute the current total energy.
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

Here is the caller graph for this function:

void G4INCL::Nucleus::insertParticle ( Particle p)
inline

Insert a new particle (e.g. a projectile) in the nucleus.

Definition at line 83 of file G4INCLNucleus.hh.

83  {
84  theZ += p->getZ();
85  theA += p->getA();
86  theStore->particleHasEntered(p);
87  if(p->isNucleon()) {
88  theNpInitial += Math::heaviside(ParticleTable::getIsospin(p->getType()));
89  theNnInitial += Math::heaviside(-ParticleTable::getIsospin(p->getType()));
90  }
91  if(!p->isTargetSpectator()) theStore->getBook().incrementCascading();
92  };
G4int heaviside(G4int n)
const char * p
Definition: xmltok.h:285
Book & getBook()
Definition: G4INCLStore.hh:259
void incrementCascading()
Definition: G4INCLBook.hh:77
G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
void particleHasEntered(Particle *const particle)
Move a particle from incoming to inside.
Definition: G4INCLStore.cc:188

Here is the call graph for this function:

Here is the caller graph for this function:

G4bool G4INCL::Nucleus::isEventTransparent ( ) const

Is the event transparent?

To be called at the end of the cascade.

Definition at line 550 of file G4INCLNucleus.cc.

550  {
551 
552  Book const &theBook = theStore->getBook();
553  const G4int nEventCollisions = theBook.getAcceptedCollisions();
554  const G4int nEventDecays = theBook.getAcceptedDecays();
555  const G4int nEventClusters = theBook.getEmittedClusters();
556  if(nEventCollisions==0 && nEventDecays==0 && nEventClusters==0)
557  return true;
558 
559  return false;
560 
561  }
G4int getAcceptedCollisions() const
Definition: G4INCLBook.hh:100
int G4int
Definition: G4Types.hh:78
Book & getBook()
Definition: G4INCLStore.hh:259

Here is the call graph for this function:

G4bool G4INCL::Nucleus::isNucleusNucleusCollision ( ) const
inline

Is it a nucleus-nucleus collision?

Definition at line 342 of file G4INCLNucleus.hh.

342 { return isNucleusNucleus; }

Here is the caller graph for this function:

Nucleus& G4INCL::Nucleus::operator= ( const Nucleus rhs)

Dummy assignment operator to silence Coverity warning.

std::string G4INCL::Nucleus::print ( )

Print the nucleus info

Definition at line 280 of file G4INCLNucleus.cc.

281  {
282  std::stringstream ss;
283  ss << "Particles in the nucleus:" << '\n'
284  << "Inside:" << '\n';
285  G4int counter = 1;
286  ParticleList const &inside = theStore->getParticles();
287  for(ParticleIter p=inside.begin(), e=inside.end(); p!=e; ++p) {
288  ss << "index = " << counter << '\n'
289  << (*p)->print();
290  counter++;
291  }
292  ss <<"Outgoing:" << '\n';
293  ParticleList const &outgoing = theStore->getOutgoingParticles();
294  for(ParticleIter p=outgoing.begin(), e=outgoing.end(); p!=e; ++p)
295  ss << (*p)->print();
296 
297  return ss.str();
298  }
ParticleList const & getParticles() const
Definition: G4INCLStore.hh:253
const char * p
Definition: xmltok.h:285
int G4int
Definition: G4Types.hh:78
ParticleList const & getOutgoingParticles() const
Definition: G4INCLStore.hh:223
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

void G4INCL::Nucleus::propagateParticles ( G4double  step)

Propagate the particles one time step.

Parameters
steplength of the time step

Definition at line 209 of file G4INCLNucleus.cc.

209  {
210  INCL_WARN("Useless Nucleus::propagateParticles -method called." << '\n');
211  }
#define INCL_WARN(x)
void G4INCL::Nucleus::setDensity ( NuclearDensity const *const  d)
inline

Setter for theDensity.

Definition at line 381 of file G4INCLNucleus.hh.

381  {
382  theDensity=d;
384  theParticleSampler->setDensity(theDensity);
385  };
void setDensity(NuclearDensity const *const d)
Setter for theDensity.
ParticleSampler * theParticleSampler

Here is the call graph for this function:

void G4INCL::Nucleus::setIncomingAngularMomentum ( const ThreeVector j)
inline

Set the incoming angular-momentum vector.

Definition at line 207 of file G4INCLNucleus.hh.

207  {
208  incomingAngularMomentum = j;
209  }

Here is the caller graph for this function:

void G4INCL::Nucleus::setIncomingMomentum ( const ThreeVector p)
inline

Set the incoming momentum vector.

Definition at line 215 of file G4INCLNucleus.hh.

215  {
216  incomingMomentum = p;
217  }
const char * p
Definition: xmltok.h:285

Here is the caller graph for this function:

void G4INCL::Nucleus::setInitialEnergy ( const G4double  e)
inline

Set the initial energy.

Definition at line 225 of file G4INCLNucleus.hh.

225 { initialEnergy = e; }

Here is the caller graph for this function:

void G4INCL::Nucleus::setNucleusNucleusCollision ( )
inline

Set a nucleus-nucleus collision.

Definition at line 345 of file G4INCLNucleus.hh.

345 { isNucleusNucleus=true; }

Here is the caller graph for this function:

void G4INCL::Nucleus::setParticleNucleusCollision ( )
inline

Set a particle-nucleus collision.

Definition at line 348 of file G4INCLNucleus.hh.

348 { isNucleusNucleus=false; }

Here is the caller graph for this function:

void G4INCL::Nucleus::setProjectileRemnant ( ProjectileRemnant *const  c)
inline

Set the projectile remnant.

Definition at line 351 of file G4INCLNucleus.hh.

351  {
352  delete theProjectileRemnant;
353  theProjectileRemnant = c;
354  }

Here is the caller graph for this function:

void G4INCL::Nucleus::setStore ( Store s)
inline

Definition at line 266 of file G4INCLNucleus.hh.

266  {
267  delete theStore;
268  theStore = s;
269  };
const XML_Char * s
Definition: expat.h:262
void G4INCL::Nucleus::setUniverseRadius ( const G4double  universeRadius)
inline

Setter for theUniverseRadius.

Definition at line 339 of file G4INCLNucleus.hh.

339 { theUniverseRadius=universeRadius; }
void G4INCL::Nucleus::updatePotentialEnergy ( Particle p) const
inline

Update the particle potential energy.

Definition at line 376 of file G4INCLNucleus.hh.

376  {
377  p->setPotentialEnergy(thePotential->computePotentialEnergy(p));
378  }
const char * p
Definition: xmltok.h:285
virtual G4double computePotentialEnergy(const Particle *const p) const =0

Here is the call graph for this function:

Here is the caller graph for this function:

void G4INCL::Nucleus::useFusionKinematics ( )

Adjust the kinematics for complete-fusion events.

Definition at line 903 of file G4INCLNucleus.cc.

903  {
904  setEnergy(initialEnergy);
905  setMomentum(incomingMomentum);
906  setSpin(incomingAngularMomentum);
909  }
void setMass(G4double mass)
virtual G4double getTableMass() const
Get the real particle mass.
G4double mag2() const
void setEnergy(G4double energy)
G4double theExcitationEnergy
G4INCL::ThreeVector theMomentum
void setSpin(const ThreeVector &j)
Set the spin of the nucleus.
virtual void setMomentum(const G4INCL::ThreeVector &momentum)

Here is the call graph for this function:


The documentation for this class was generated from the following files: