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

#include <G4INCLSurfaceAvatar.hh>

Inheritance diagram for G4INCL::SurfaceAvatar:
Collaboration diagram for G4INCL::SurfaceAvatar:

Public Member Functions

 SurfaceAvatar (G4INCL::Particle *aParticle, G4double time, G4INCL::Nucleus *aNucleus)
 
virtual ~SurfaceAvatar ()
 
IChannelgetChannel ()
 
void fillFinalState (FinalState *fs)
 
virtual void preInteraction ()
 
virtual void postInteraction (FinalState *)
 
ParticleList getParticles () const
 
std::string dump () const
 
G4double getTransmissionProbability (Particle const *const particle)
 Calculate the transmission probability for the particle. More...
 
G4double getCosRefractionAngle () const
 Get the cosine of the refraction angle (precalculated by initializeRefractionVariables) More...
 
G4double getOutgoingMomentum () const
 Get the outgoing momentum (precalculated by initializeRefractionVariables) More...
 
- Public Member Functions inherited from G4INCL::IAvatar
 IAvatar ()
 
 IAvatar (G4double time)
 
virtual ~IAvatar ()
 
FinalStategetFinalState ()
 
void fillFinalState (FinalState *fs)
 
G4double getTime () const
 
AvatarType getType () const
 
G4bool isACollision () const
 
G4bool isADecay () const
 
void setType (AvatarType t)
 
long getID () const
 
std::string toString ()
 

Additional Inherited Members

- Protected Attributes inherited from G4INCL::IAvatar
G4double theTime
 

Detailed Description

Surface avatar

The reflection avatar is created when a particle reaches the boundary of the nucleus. At this point it can either be reflected from the boundary or exit the nucleus.

Definition at line 62 of file G4INCLSurfaceAvatar.hh.

Constructor & Destructor Documentation

G4INCL::SurfaceAvatar::SurfaceAvatar ( G4INCL::Particle aParticle,
G4double  time,
G4INCL::Nucleus aNucleus 
)

Definition at line 55 of file G4INCLSurfaceAvatar.cc.

56  :IAvatar(time), theParticle(aParticle), theNucleus(n),
57  particlePIn(0.),
58  particlePOut(0.),
59  particleTOut(0.),
60  TMinusV(0.),
61  TMinusV2(0.),
62  particleMass(0.),
63  sinIncidentAngle(0.),
64  cosIncidentAngle(0.),
65  sinRefractionAngle(0.),
66  cosRefractionAngle(0.),
67  refractionIndexRatio(0.),
68  internalReflection(false)
69  {
71  }
void setType(AvatarType t)

Here is the call graph for this function:

G4INCL::SurfaceAvatar::~SurfaceAvatar ( )
virtual

Definition at line 73 of file G4INCLSurfaceAvatar.cc.

73  {
74 
75  }

Member Function Documentation

std::string G4INCL::SurfaceAvatar::dump ( ) const
virtual

Implements G4INCL::IAvatar.

Definition at line 192 of file G4INCLSurfaceAvatar.cc.

192  {
193  std::stringstream ss;
194  ss << "(avatar " << theTime << " 'reflection" << '\n'
195  << "(list " << '\n'
196  << theParticle->dump()
197  << "))" << '\n';
198  return ss.str();
199  }
std::string dump() const

Here is the call graph for this function:

void G4INCL::SurfaceAvatar::fillFinalState ( FinalState fs)

Definition at line 166 of file G4INCLSurfaceAvatar.cc.

166  {
167  getChannel()->fillFinalState(fs);
168  }
virtual void fillFinalState(FinalState *fs)=0

Here is the call graph for this function:

G4INCL::IChannel * G4INCL::SurfaceAvatar::getChannel ( )
virtual

Implements G4INCL::IAvatar.

Definition at line 77 of file G4INCLSurfaceAvatar.cc.

77  {
78  if(theParticle->isTargetSpectator()) {
79  INCL_DEBUG("Particle " << theParticle->getID() << " is a spectator, reflection" << '\n');
80  return new ReflectionChannel(theNucleus, theParticle);
81  }
82 
83  // We forbid transmission of resonances below the Fermi energy. Emitting a
84  // delta particle below Tf can lead to negative excitation energies, since
85  // CDPP assumes that particles stay in the Fermi sea.
86  if(theParticle->isResonance()) {
87  const G4double theFermiEnergy = theNucleus->getPotential()->getFermiEnergy(theParticle);
88  if(theParticle->getKineticEnergy()<theFermiEnergy) {
89  INCL_DEBUG("Particle " << theParticle->getID() << " is a resonance below Tf, reflection" << '\n'
90  << " Tf=" << theFermiEnergy << ", EKin=" << theParticle->getKineticEnergy() << '\n');
91  return new ReflectionChannel(theNucleus, theParticle);
92  }
93  }
94 
95  // Don't try to make a cluster if the leading particle is too slow
96  const G4double transmissionProbability = getTransmissionProbability(theParticle);
97  const G4double TOut = TMinusV;
98  const G4double kOut = particlePOut;
99  const G4double cosR = cosRefractionAngle;
100 
101  INCL_DEBUG("Transmission probability for particle " << theParticle->getID() << " = " << transmissionProbability << '\n');
102  /* Don't attempt to construct clusters when a projectile spectator is
103  * trying to escape during a nucleus-nucleus collision. The idea behind
104  * this is that projectile spectators will later be collected in the
105  * projectile remnant, and trying to clusterise them somewhat feels like
106  * G4double counting. Moreover, applying the clustering algorithm on escaping
107  * projectile spectators makes the code *really* slow if the projectile is
108  * large.
109  */
110  if(theParticle->isNucleon()
111  && (!theParticle->isProjectileSpectator() || !theNucleus->isNucleusNucleusCollision())
112  && transmissionProbability>1.E-4) {
113  Cluster *candidateCluster = 0;
114 
115  candidateCluster = Clustering::getCluster(theNucleus, theParticle);
116  if(candidateCluster != 0 &&
117  Clustering::clusterCanEscape(theNucleus, candidateCluster)) {
118 
119  INCL_DEBUG("Cluster algorithm succeded. Candidate cluster:" << '\n' << candidateCluster->print() << '\n');
120 
121  // Check if the cluster can penetrate the Coulomb barrier
122  const G4double clusterTransmissionProbability = getTransmissionProbability(candidateCluster);
123  const G4double x = Random::shoot();
124 
125  INCL_DEBUG("Transmission probability for cluster " << candidateCluster->getID() << " = " << clusterTransmissionProbability << '\n');
126 
127  if (x <= clusterTransmissionProbability) {
128  theNucleus->getStore()->getBook().incrementEmittedClusters();
129  INCL_DEBUG("Cluster " << candidateCluster->getID() << " passes the Coulomb barrier, transmitting." << '\n');
130  return new TransmissionChannel(theNucleus, candidateCluster);
131  } else {
132  INCL_DEBUG("Cluster " << candidateCluster->getID() << " does not pass the Coulomb barrier. Falling back to transmission of the leading particle." << '\n');
133  delete candidateCluster;
134  }
135  } else {
136  delete candidateCluster;
137  }
138  }
139 
140  // If we haven't transmitted a cluster (maybe cluster feature was
141  // disabled or maybe we just can't produce an acceptable cluster):
142 
143  // Always transmit projectile spectators if no cluster was formed and if
144  // transmission is energetically allowed
145  if(theParticle->isProjectileSpectator() && transmissionProbability>0.) {
146  INCL_DEBUG("Particle " << theParticle->getID() << " is a projectile spectator, transmission" << '\n');
147  return new TransmissionChannel(theNucleus, theParticle, TOut);
148  }
149 
150  // Transmit or reflect depending on the transmission probability
151  const G4double x = Random::shoot();
152 
153  if(x <= transmissionProbability) { // Transmission
154  INCL_DEBUG("Particle " << theParticle->getID() << " passes the Coulomb barrier, transmitting." << '\n');
155  if(theNucleus->getStore()->getConfig()->getRefraction()) {
156  return new TransmissionChannel(theNucleus, theParticle, kOut, cosR);
157  } else {
158  return new TransmissionChannel(theNucleus, theParticle, TOut);
159  }
160  } else { // Reflection
161  INCL_DEBUG("Particle " << theParticle->getID() << " does not pass the Coulomb barrier, reflection." << '\n');
162  return new ReflectionChannel(theNucleus, theParticle);
163  }
164  }
G4bool isResonance() const
Is it a resonance?
G4bool isNucleusNucleusCollision() const
Is it a nucleus-nucleus collision?
G4bool isTargetSpectator() const
Config const * getConfig()
Definition: G4INCLStore.hh:273
Store * getStore() const
G4double getTransmissionProbability(Particle const *const particle)
Calculate the transmission probability for the particle.
G4double getFermiEnergy(const Particle *const p) const
Return the Fermi energy for a particle.
G4bool clusterCanEscape(Nucleus const *const n, Cluster const *const c)
Determine whether the cluster can escape or not.
Book & getBook()
Definition: G4INCLStore.hh:259
void incrementEmittedClusters()
Definition: G4INCLBook.hh:79
Cluster * getCluster(Nucleus *n, Particle *p)
Call the clustering algorithm.
NuclearPotential::INuclearPotential const * getPotential() const
Getter for thePotential.
G4bool isProjectileSpectator() const
G4bool isNucleon() const
G4double shoot()
Definition: G4INCLRandom.cc:93
G4double getKineticEnergy() const
Get the particle kinetic energy.
double G4double
Definition: G4Types.hh:76
#define INCL_DEBUG(x)
long getID() const
G4bool getRefraction() const
True if we should use refraction.

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4INCL::SurfaceAvatar::getCosRefractionAngle ( ) const
inline

Get the cosine of the refraction angle (precalculated by initializeRefractionVariables)

Definition at line 85 of file G4INCLSurfaceAvatar.hh.

85 { return cosRefractionAngle; }
G4double G4INCL::SurfaceAvatar::getOutgoingMomentum ( ) const
inline

Get the outgoing momentum (precalculated by initializeRefractionVariables)

Definition at line 88 of file G4INCLSurfaceAvatar.hh.

88 { return particlePOut; }
ParticleList G4INCL::SurfaceAvatar::getParticles ( ) const
inlinevirtual

Implements G4INCL::IAvatar.

Definition at line 73 of file G4INCLSurfaceAvatar.hh.

73  {
74  ParticleList theParticleList;
75  theParticleList.push_back(theParticle);
76  return theParticleList;
77  }
G4double G4INCL::SurfaceAvatar::getTransmissionProbability ( Particle const *const  particle)

Calculate the transmission probability for the particle.

Definition at line 201 of file G4INCLSurfaceAvatar.cc.

201  {
202 
203  particleMass = particle->getMass();
204  const G4double V = particle->getPotentialEnergy();
205 
206  // Correction to the particle kinetic energy if using real masses
207  const G4int theA = theNucleus->getA();
208  const G4int theZ = theNucleus->getZ();
209  const G4double correction = particle->getEmissionQValueCorrection(theA, theZ);
210  particleTOut = particle->getKineticEnergy() + correction;
211 
212  if (particleTOut <= V) // No transmission if total energy < 0
213  return 0.0;
214 
215  TMinusV = particleTOut-V;
216  TMinusV2 = TMinusV*TMinusV;
217 
218  // Momenta in and out
219  const G4double particlePIn2 = particle->getMomentum().mag2();
220  const G4double particlePOut2 = 2.*particleMass*TMinusV+TMinusV2;
221  particlePIn = std::sqrt(particlePIn2);
222  particlePOut = std::sqrt(particlePOut2);
223 
224  // Compute the transmission probability
225  G4double theTransmissionProbability;
226  if(theNucleus->getStore()->getConfig()->getRefraction()) {
227  // Use the formula with refraction
228  initializeRefractionVariables(particle);
229 
230  if(internalReflection)
231  return 0.; // total internal reflection
232 
233  // Intermediate variables for calculation
234  const G4double x = refractionIndexRatio*cosIncidentAngle;
235  const G4double y = (x - cosRefractionAngle) / (x + cosRefractionAngle);
236 
237  theTransmissionProbability = 1. - y*y;
238  } else {
239  // Use the formula without refraction
240 
241  // Intermediate variable for calculation
242  const G4double y = particlePIn+particlePOut;
243 
244  // The transmission probability for a potential step
245  theTransmissionProbability = 4.*particlePIn*particlePOut/(y*y);
246  }
247 
248  // For neutral and negative particles, no Coulomb transmission
249  // Also, no Coulomb if the particle takes away all of the nuclear charge
250  const G4int particleZ = particle->getZ();
251  if (particleZ <= 0 || particleZ >= theZ)
252  return theTransmissionProbability;
253 
254  // Nominal Coulomb barrier
255  const G4double theTransmissionBarrier = theNucleus->getTransmissionBarrier(particle);
256  if (TMinusV >= theTransmissionBarrier) // Above the Coulomb barrier
257  return theTransmissionProbability;
258 
259  // Coulomb-penetration factor
260  const G4double px = std::sqrt(TMinusV/theTransmissionBarrier);
261  const G4double logCoulombTransmission =
262  particleZ*(theZ-particleZ)/137.03*std::sqrt(2.*particleMass/TMinusV/(1.+TMinusV/2./particleMass))
263  *(Math::arcCos(px)-px*std::sqrt(1.-px*px));
264  INCL_DEBUG("Coulomb barrier, logCoulombTransmission=" << logCoulombTransmission << '\n');
265  if (logCoulombTransmission > 35.) // Transmission is forbidden by Coulomb
266  return 0.;
267  theTransmissionProbability *= std::exp(-2.*logCoulombTransmission);
268 
269  return theTransmissionProbability;
270  }
G4int getA() const
Returns the baryon number.
G4double arcCos(const G4double x)
Calculates arccos with some tolerance on illegal arguments.
Config const * getConfig()
Definition: G4INCLStore.hh:273
Store * getStore() const
int G4int
Definition: G4Types.hh:78
G4int getZ() const
Returns the charge number.
G4double getTransmissionBarrier(Particle const *const p)
Get the transmission barrier.
double G4double
Definition: G4Types.hh:76
#define INCL_DEBUG(x)
G4bool getRefraction() const
True if we should use refraction.

Here is the call graph for this function:

Here is the caller graph for this function:

void G4INCL::SurfaceAvatar::postInteraction ( FinalState fs)
virtual

Implements G4INCL::IAvatar.

Definition at line 172 of file G4INCLSurfaceAvatar.cc.

172  {
173  ParticleList const &outgoing = fs->getOutgoingParticles();
174  if(!outgoing.empty()) { // Transmission
175 // assert(outgoing.size()==1);
176  Particle *out = outgoing.front();
177  out->rpCorrelate();
178  if(out->isCluster()) {
179  Cluster *clusterOut = dynamic_cast<Cluster*>(out);
180  ParticleList const &components = clusterOut->getParticles();
181  for(ParticleIter i=components.begin(), e=components.end(); i!=e; ++i) {
182  if(!(*i)->isTargetSpectator())
183  theNucleus->getStore()->getBook().decrementCascading();
184  }
185  } else if(!theParticle->isTargetSpectator()) {
186 // assert(out==theParticle);
187  theNucleus->getStore()->getBook().decrementCascading();
188  }
189  }
190  }
G4bool isTargetSpectator() const
Store * getStore() const
Book & getBook()
Definition: G4INCLStore.hh:259
void decrementCascading()
Definition: G4INCLBook.hh:78
ParticleList::const_iterator ParticleIter

Here is the call graph for this function:

void G4INCL::SurfaceAvatar::preInteraction ( )
virtual

Implements G4INCL::IAvatar.

Definition at line 170 of file G4INCLSurfaceAvatar.cc.

170 {}

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