Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4INCLNucleus.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// INCL++ intra-nuclear cascade model
27// Pekka Kaitaniemi, CEA and Helsinki Institute of Physics
28// Davide Mancusi, CEA
29// Alain Boudard, CEA
30// Sylvie Leray, CEA
31// Joseph Cugnon, University of Liege
32//
33// INCL++ revision: v5.1.8
34//
35#define INCLXX_IN_GEANT4_MODE 1
36
37#include "globals.hh"
38
39/*
40 * G4INCLNucleus.hh
41 *
42 * \date Jun 5, 2009
43 * \author Pekka Kaitaniemi
44 */
45
46#ifndef G4INCLNUCLEUS_HH_
47#define G4INCLNUCLEUS_HH_
48
49#include <list>
50#include <string>
51
52#include "G4INCLParticle.hh"
53#include "G4INCLEventInfo.hh"
54#include "G4INCLCluster.hh"
55#include "G4INCLFinalState.hh"
56#include "G4INCLStore.hh"
57#include "G4INCLGlobals.hh"
59#include "G4INCLConfig.hh"
60#include "G4INCLConfigEnums.hh"
61#include "G4INCLCluster.hh"
63
64namespace G4INCL {
65
66 class Nucleus : public Cluster {
67 public:
68 Nucleus(G4int mass, G4int charge, Config const * const conf, const G4double universeRadius=-1.);
69 virtual ~Nucleus();
70
71 /**
72 * Call the Cluster method to generate the initial distribution of
73 * particles. At the beginning all particles are assigned as spectators.
74 */
76
77 /// \brief Insert a new particle (e.g. a projectile) in the nucleus.
79 theZ += p->getZ();
80 theA += p->getA();
81 theStore->particleHasEntered(p);
82 if(p->isNucleon()) {
85 }
86 if(!p->isTargetSpectator()) theStore->getBook()->incrementCascading();
87 };
88
89 /**
90 * Apply reaction final state information to the nucleus.
91 */
93
94 G4int getInitialA() const { return theInitialA; };
95 G4int getInitialZ() const { return theInitialZ; };
96
97 /**
98 * Get the list of particles that were created by the last applied final state
99 */
100 ParticleList const &getCreatedParticles() const { return justCreated; }
101
102 /**
103 * Get the list of particles that were updated by the last applied final state
104 */
105 ParticleList const &getUpdatedParticles() const { return toBeUpdated; }
106
107 /// \brief Get the delta that could not decay
108 Particle *getBlockedDelta() const { return blockedDelta; }
109
110 /**
111 * Propagate the particles one time step.
112 *
113 * @param step length of the time step
114 */
115 void propagateParticles(G4double step);
116
117 G4int getNumberOfEnteringProtons() const { return theNpInitial; };
118 G4int getNumberOfEnteringNeutrons() const { return theNnInitial; };
119
120 /** \brief Outgoing - incoming separation energies.
121 *
122 * Used by CDPP.
123 */
125 G4double S = 0.0;
126 ParticleList outgoing = theStore->getOutgoingParticles();
127 for(ParticleIter i = outgoing.begin(); i != outgoing.end(); ++i) {
128 const ParticleType t = (*i)->getType();
129 switch(t) {
130 case Proton:
131 case Neutron:
132 case DeltaPlusPlus:
133 case DeltaPlus:
134 case DeltaZero:
135 case DeltaMinus:
136 S += thePotential->getSeparationEnergy(*i);
137 break;
138 case Composite:
139 S += (*i)->getZ() * thePotential->getSeparationEnergy(Proton)
140 + ((*i)->getA() - (*i)->getZ()) * thePotential->getSeparationEnergy(Neutron);
141 break;
142 case PiPlus:
143 S += thePotential->getSeparationEnergy(Proton) - thePotential->getSeparationEnergy(Neutron);
144 break;
145 case PiMinus:
146 S += thePotential->getSeparationEnergy(Neutron) - thePotential->getSeparationEnergy(Proton);
147 break;
148 default:
149 break;
150 }
151 }
152
153 S -= theNpInitial * thePotential->getSeparationEnergy(Proton);
154 S -= theNnInitial * thePotential->getSeparationEnergy(Neutron);
155 return S;
156 }
157
158 /** \brief Force the decay of outgoing deltas.
159 *
160 * \return true if any delta was forced to decay.
161 */
163
164 /** \brief Force the decay of deltas inside the nucleus.
165 *
166 * \return true if any delta was forced to decay.
167 */
169
170 /** \brief Force the decay of unstable outgoing clusters.
171 *
172 * \return true if any cluster was forced to decay.
173 */
175
176 /** \brief Force the phase-space decay of the Nucleus.
177 *
178 * Only applied if Z==0 or Z==A.
179 *
180 * \return true if the nucleus was forced to decay.
181 */
182 G4bool decayMe();
183
184 /// \brief Force emission of all pions inside the nucleus.
185 void emitInsidePions();
186
187 /** \brief Compute the recoil momentum and spin of the nucleus. */
189
190 /** \brief Compute the current center-of-mass position.
191 *
192 * \return the center-of-mass position vector [fm].
193 */
195
196 /** \brief Compute the current total energy.
197 *
198 * \return the total energy [MeV]
199 */
201
202 /** \brief Compute the current excitation energy.
203 *
204 * \return the excitation energy [MeV]
205 */
207
208 /** \brief Set the incoming angular-momentum vector. */
210 incomingAngularMomentum = j;
211 }
212
213 /** \brief Get the incoming angular-momentum vector. */
214 const ThreeVector &getIncomingAngularMomentum() const { return incomingAngularMomentum; }
215
216 /** \brief Set the incoming momentum vector. */
218 incomingMomentum = p;
219 }
220
221 /** \brief Get the incoming momentum vector. */
223 return incomingMomentum;
224 }
225
226 /** \brief Set the initial energy. */
227 void setInitialEnergy(const G4double e) { initialEnergy = e; }
228
229 /** \brief Get the initial energy. */
230 G4double getInitialEnergy() const { return initialEnergy; }
231
232 /** \brief Get the excitation energy of the nucleus.
233 *
234 * Method computeRecoilKinematics() should be called first.
235 */
237
238 ///\brief Returns true if the nucleus contains any deltas.
240 ParticleList inside = theStore->getParticles();
241 for(ParticleIter i=inside.begin(); i!=inside.end(); ++i)
242 if((*i)->isDelta()) return true;
243 return false;
244 }
245
246 /**
247 * Print the nucleus info
248 */
249 std::string print();
250
251 std::string dump();
252
253 Store* getStore() const {return theStore; };
254 void setStore(Store *s) {
255 delete theStore;
256 theStore = s;
257 };
258
259 G4double getInitialInternalEnergy() const { return initialInternalEnergy; };
260
261 /** \brief Is the event transparent?
262 *
263 * To be called at the end of the cascade.
264 **/
266
267 /** \brief Does the nucleus give a cascade remnant?
268 *
269 * To be called after computeRecoilKinematics().
270 **/
271 G4bool hasRemnant() const { return remnant; }
272
273 /**
274 * Fill the event info which contains INCL output data
275 */
276 // void fillEventInfo(Results::EventInfo *eventInfo);
277 void fillEventInfo(EventInfo *eventInfo);
278
279 G4bool getTryCompoundNucleus() { return tryCN; }
280
281 /// \brief Return the charge number of the projectile
282 G4int getProjectileChargeNumber() const { return projectileZ; }
283
284 /// \brief Return the mass number of the projectile
285 G4int getProjectileMassNumber() const { return projectileA; }
286
287 /// \brief Set the charge number of the projectile
288 void setProjectileChargeNumber(G4int n) { projectileZ=n; }
289
290 /// \brief Set the mass number of the projectile
291 void setProjectileMassNumber(G4int n) { projectileA=n; }
292
293 /// \brief Returns true if a transparent event should be forced.
294 G4bool isForcedTransparent() { return forceTransparent; }
295
296 /// \brief Get the transmission barrier
298 const G4double theTransmissionRadius = theDensity->getTransmissionRadius(p);
299 const G4double theParticleZ = p->getZ();
300 return PhysicalConstants::eSquared*(theZ-theParticleZ)*theParticleZ/theTransmissionRadius;
301 }
302
303 /// \brief Struct for conservation laws
308 };
309
310 /// \brief Compute charge, mass, energy and momentum balance
311 ConservationBalance getConservationBalance(EventInfo const &theEventInfo, const G4bool afterRecoil) const;
312
313 /// \brief Adjust the kinematics for complete-fusion events
314 void useFusionKinematics();
315
316 /** \brief Get the maximum allowed radius for a given particle.
317 *
318 * Calls the NuclearDensity::getMaxRFromP() method for nucleons and deltas,
319 * and the NuclearDensity::getTrasmissionRadius() method for pions.
320 *
321 * \param particle pointer to a particle
322 * \return surface radius
323 */
324 G4double getSurfaceRadius(Particle const * const particle) const {
325 if(particle->isPion())
326 // Temporarily set RPION = RMAX
327 return getUniverseRadius();
328 //return 0.5*(theDensity->getTransmissionRadius(particle)+getUniverseRadius());
329 else {
330 const G4double pr = particle->getMomentum().mag()/thePotential->getFermiMomentum(particle);
331 if(pr>=1.)
332 return getUniverseRadius();
333 else
334 return theDensity->getMaxRFromP(pr);
335 }
336 }
337
338 /** \brief Get the Coulomb radius for a given particle
339 *
340 * That's the radius of the sphere that the Coulomb trajectory of the
341 * incoming particle should intersect. The intersection point is used to
342 * determine the effective impact parameter of the trajectory and the new
343 * entrance angle.
344 *
345 * If the particle is not a Cluster, the Coulomb radius reduces to the
346 * surface radius. We use a parametrisation for d, t, He3 and alphas. For
347 * heavier clusters we fall back to the surface radius.
348 *
349 * \param p the particle species
350 * \return Coulomb radius
351 */
353 if(p.theType == Composite) {
354 const G4int zp = p.theZ;
355 const G4int ap = p.theA;
356 G4double barr, radius = 0.;
357 if(zp==1 && ap==2) { // d
358 barr = 0.2565*Math::pow23((G4double)theA)-0.78;
359 radius = ParticleTable::eSquared*zp*theZ/barr - 2.5;
360 } else if((zp==1 || zp==2) && ap==3) { // t, He3
361 barr = 0.5*(0.5009*Math::pow23((G4double)theA)-1.16);
362 radius = ParticleTable::eSquared*theZ/barr - 0.5;
363 } else if(zp==2 && ap==4) { // alpha
364 barr = 0.5939*Math::pow23((G4double)theA)-1.64;
365 radius = ParticleTable::eSquared*zp*theZ/barr - 0.5;
366 } else if(zp>2) {
367 radius = getUniverseRadius();
368 }
369 if(radius<=0.) {
370 ERROR("Negative Coulomb radius! Using the universe radius" << std::endl);
371 radius = getUniverseRadius();
372 }
373 return radius;
374 } else
375 return getUniverseRadius();
376 }
377
378 /// \brief Getter for theUniverseRadius.
379 G4double getUniverseRadius() const { return theUniverseRadius; }
380
381 /// \brief Setter for theUniverseRadius.
382 void setUniverseRadius(const G4double universeRadius) { theUniverseRadius=universeRadius; }
383
384 /// \brief Is it a nucleus-nucleus collision?
385 G4bool isNucleusNucleusCollision() const { return isNucleusNucleus; }
386
387 /// \brief Set a nucleus-nucleus collision
388 void setNucleusNucleusCollision() { isNucleusNucleus=true; }
389
390 /// \brief Set a particle-nucleus collision
391 void setParticleNucleusCollision() { isNucleusNucleus=false; }
392
393 /// \brief Set the projectile remnant
395 delete theProjectileRemnant;
396 theProjectileRemnant = c;
397 }
398
399 /// \brief Get the projectile remnant
400 ProjectileRemnant *getProjectileRemnant() const { return theProjectileRemnant; }
401
402 /// \brief Delete the projectile remnant
404 delete theProjectileRemnant;
405 theProjectileRemnant = NULL;
406 }
407
408 /// \brief Move the components of the projectile remnant to the outgoing list
410 theStore->addToOutgoing(theProjectileRemnant->getParticles());
411 theProjectileRemnant->clearParticles();
412 }
413
414 /** \brief Finalise the projectile remnant
415 *
416 * Complete the treatment of the projectile remnant. If it contains
417 * nucleons, assign its excitation energy and spin. Move stuff to the
418 * outgoing list, if appropriate.
419 *
420 * \param emissionTime the emission time of the projectile remnant
421 */
422 void finalizeProjectileRemnant(const G4double emissionTime);
423
424 /// \brief Update the particle potential energy.
426 p->setPotentialEnergy(thePotential->computePotentialEnergy(p));
427 }
428
429 /// \brief Getter for theDensity
430 NuclearDensity* getDensity() const { return theDensity; };
431
432 /// \brief Getter for thePotential
433 NuclearPotential::INuclearPotential* getPotential() const { return thePotential; };
434
435 private:
436 /** \brief Compute the recoil kinematics for a 1-nucleon remnant.
437 *
438 * Puts the remnant nucleon on mass shell and tries to enforce approximate
439 * energy conservation by modifying the masses of the outgoing particles.
440 */
441 void computeOneNucleonRecoilKinematics();
442
443 private:
444 G4int theInitialZ, theInitialA;
445 /// \brief The number of entering protons
446 G4int theNpInitial;
447 /// \brief The number of entering neutrons
448 G4int theNnInitial;
449 G4double initialInternalEnergy;
450 ThreeVector incomingAngularMomentum, incomingMomentum;
451 ThreeVector initialCenterOfMass;
452 G4bool remnant;
453
454 ParticleList toBeUpdated;
455 ParticleList justCreated;
456 Particle *blockedDelta;
457 G4double initialEnergy;
458 Store *theStore;
459 G4bool tryCN;
460 G4bool forceTransparent;
461
462 /// \brief The charge number of the projectile
463 G4int projectileZ;
464 /// \brief The mass number of the projectile
465 G4int projectileA;
466
467 /// \brief The radius of the universe
468 G4double theUniverseRadius;
469
470 /** \brief true if running a nucleus-nucleus collision
471 *
472 * Tells INCL whether to make a projectile-like pre-fragment or not.
473 */
474 G4bool isNucleusNucleus;
475
476 /// \brief Pointer to the quasi-projectile
477 ProjectileRemnant *theProjectileRemnant;
478
479 /// \brief Pointer to the NuclearDensity object
480 NuclearDensity *theDensity;
481
482 /// \brief Pointer to the NuclearPotential object
484
485 };
486
487}
488
489#endif /* G4INCLNUCLEUS_HH_ */
Simple container for output of event results.
#define ERROR(x)
Class for constructing a projectile-like remnant.
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
void incrementCascading()
Definition: G4INCLBook.hh:73
ParticleList const & getParticles() const
G4double theExcitationEnergy
G4double getTransmissionRadius(Particle const *const p) const
The radius used for calculating the transmission coefficient.
G4double getMaxRFromP(G4double p) const
Get the maximum allowed radius for a given momentum.
G4double getFermiMomentum(const Particle *const p) const
Return the Fermi momentum for a particle.
G4double getSeparationEnergy(const Particle *const p) const
Return the separation energy for a particle.
virtual G4double computePotentialEnergy(const Particle *const p) const =0
G4int getInitialA() const
NuclearPotential::INuclearPotential * getPotential() const
Getter for thePotential.
const ThreeVector & getIncomingAngularMomentum() const
Get the incoming angular-momentum vector.
G4double computeSeparationEnergyBalance() const
Outgoing - incoming separation energies.
Store * getStore() const
ProjectileRemnant * getProjectileRemnant() const
Get the projectile remnant.
Particle * getBlockedDelta() const
Get the delta that could not decay.
G4bool isForcedTransparent()
Returns true if a transparent event should be forced.
void fillEventInfo(EventInfo *eventInfo)
G4bool decayMe()
Force the phase-space decay of the Nucleus.
G4double computeTotalEnergy() const
Compute the current total energy.
ParticleList const & getUpdatedParticles() const
void setStore(Store *s)
G4bool decayInsideDeltas()
Force the decay of deltas inside the nucleus.
void setIncomingAngularMomentum(const ThreeVector &j)
Set the incoming angular-momentum vector.
void computeRecoilKinematics()
Compute the recoil momentum and spin of the nucleus.
void setInitialEnergy(const G4double e)
Set the initial energy.
void finalizeProjectileRemnant(const G4double emissionTime)
Finalise the projectile remnant.
G4double getSurfaceRadius(Particle const *const particle) const
Get the maximum allowed radius for a given particle.
G4bool containsDeltas()
Returns true if the nucleus contains any deltas.
G4bool getTryCompoundNucleus()
NuclearDensity * getDensity() const
Getter for theDensity.
void setProjectileMassNumber(G4int n)
Set the mass number of the projectile.
G4bool isEventTransparent() const
Is the event transparent?
G4int getNumberOfEnteringProtons() const
G4double getCoulombRadius(ParticleSpecies const &p) const
Get the Coulomb radius for a given particle.
ParticleList const & getCreatedParticles() const
void applyFinalState(FinalState *)
void moveProjectileRemnantComponentsToOutgoing()
Move the components of the projectile remnant to the outgoing list.
G4bool isNucleusNucleusCollision() const
Is it a nucleus-nucleus collision?
void insertParticle(Particle *p)
Insert a new particle (e.g. a projectile) in the nucleus.
void deleteProjectileRemnant()
Delete the projectile remnant.
void setProjectileChargeNumber(G4int n)
Set the charge number of the projectile.
std::string print()
G4double getTransmissionBarrier(Particle const *const p)
Get the transmission barrier.
G4int getProjectileMassNumber() const
Return the mass number of the projectile.
void setIncomingMomentum(const ThreeVector &p)
Set the incoming momentum vector.
G4int getNumberOfEnteringNeutrons() const
void useFusionKinematics()
Adjust the kinematics for complete-fusion events.
void updatePotentialEnergy(Particle *p)
Update the particle potential energy.
G4double getInitialInternalEnergy() const
const ThreeVector & getIncomingMomentum() const
Get the incoming momentum vector.
void setParticleNucleusCollision()
Set a particle-nucleus collision.
void emitInsidePions()
Force emission of all pions inside the nucleus.
G4double getInitialEnergy() const
Get the initial energy.
std::string dump()
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.
void setNucleusNucleusCollision()
Set a nucleus-nucleus collision.
void propagateParticles(G4double step)
ConservationBalance getConservationBalance(EventInfo const &theEventInfo, const G4bool afterRecoil) const
Compute charge, mass, energy and momentum balance.
void setProjectileRemnant(ProjectileRemnant *const c)
Set the projectile remnant.
void initializeParticles()
G4int getProjectileChargeNumber() const
Return the charge number of the projectile.
G4bool hasRemnant() const
Does the nucleus give a cascade remnant?
void setUniverseRadius(const G4double universeRadius)
Setter for theUniverseRadius.
G4double getUniverseRadius() const
Getter for theUniverseRadius.
G4double computeExcitationEnergy() const
Compute the current excitation energy.
virtual ~Nucleus()
G4bool decayOutgoingDeltas()
Force the decay of outgoing deltas.
G4int getInitialZ() const
static const G4double eSquared
Coulomb conversion factor, in MeV*fm.
static G4int getIsospin(const ParticleType t)
Get the isospin of a particle.
void setPotentialEnergy(G4double v)
Set the particle potential energy.
G4int getZ() const
Returns the charge number.
G4bool isTargetSpectator() const
G4bool isPion() const
Is this a pion?
const G4INCL::ThreeVector & getMomentum() const
G4INCL::ParticleType getType() const
G4int getA() const
Returns the baryon number.
G4bool isNucleon() const
Book * getBook()
Definition: G4INCLStore.hh:243
ParticleList const & getOutgoingParticles() const
Definition: G4INCLStore.hh:204
void addToOutgoing(Particle *p)
add the particle to the outgoing particle list.
Definition: G4INCLStore.hh:171
void particleHasEntered(Particle *const particle)
Move a particle from incoming to inside.
Definition: G4INCLStore.cc:289
ParticleList const & getParticles() const
Definition: G4INCLStore.hh:237
G4double mag() const
G4double pow23(G4double x)
G4int heaviside(G4int n)
const G4double eSquared
Coulomb conversion factor [MeV*fm].
std::list< G4INCL::Particle * > ParticleList
std::list< G4INCL::Particle * >::const_iterator ParticleIter
Struct for conservation laws.