Geant4  10.03.p03
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4INCL::ReflectionChannel Class Reference

#include <G4INCLReflectionChannel.hh>

Inheritance diagram for G4INCL::ReflectionChannel:
Collaboration diagram for G4INCL::ReflectionChannel:

Public Member Functions

 ReflectionChannel (Nucleus *n, Particle *p)
 
virtual ~ReflectionChannel ()
 
void fillFinalState (FinalState *fs)
 
- Public Member Functions inherited from G4INCL::IChannel
 IChannel ()
 
virtual ~IChannel ()
 
FinalStategetFinalState ()
 

Detailed Description

Definition at line 48 of file G4INCLReflectionChannel.hh.

Constructor & Destructor Documentation

G4INCL::ReflectionChannel::ReflectionChannel ( Nucleus n,
Particle p 
)

Definition at line 49 of file G4INCLReflectionChannel.cc.

50  :theNucleus(n),theParticle(p)
51  {
52  }
const char * p
Definition: xmltok.h:285
const G4int n
G4INCL::ReflectionChannel::~ReflectionChannel ( )
virtual

Definition at line 54 of file G4INCLReflectionChannel.cc.

55  {
56  }

Member Function Documentation

void G4INCL::ReflectionChannel::fillFinalState ( FinalState fs)
virtual

Implements G4INCL::IChannel.

Definition at line 58 of file G4INCLReflectionChannel.cc.

58  {
59  fs->setTotalEnergyBeforeInteraction(theParticle->getEnergy() - theParticle->getPotentialEnergy());
60 
61  const ThreeVector &oldMomentum = theParticle->getMomentum();
62  const ThreeVector thePosition = theParticle->getPosition();
63  G4double pspr = thePosition.dot(oldMomentum);
64  if(pspr>=0) { // This means that the particle is trying to leave; perform a reflection
65  const G4double x2cour = thePosition.mag2();
66  const ThreeVector newMomentum = oldMomentum - (thePosition * (2.0 * pspr/x2cour));
67  const G4double deltaP2 = (newMomentum-oldMomentum).mag2();
68  theParticle->setMomentum(newMomentum);
69  const G4double minDeltaP2 = sinMinReflectionAngleSquaredOverFour * newMomentum.mag2();
70  if(deltaP2 < minDeltaP2) { // Avoid extremely small reflection angles
71  theParticle->setPosition(thePosition * positionScalingFactor);
72  INCL_DEBUG("Reflection angle for particle " << theParticle->getID() << " was too tangential: " << '\n'
73  << " " << deltaP2 << "=deltaP2<minDeltaP2=" << minDeltaP2 << '\n'
74  << " Resetting the particle position to ("
75  << thePosition.getX() << ", "
76  << thePosition.getY() << ", "
77  << thePosition.getZ() << ")" << '\n');
78  }
79  theNucleus->updatePotentialEnergy(theParticle);
80  } else { // The particle momentum is already directed towards the inside of the nucleus; do nothing
81  // ...but make sure this only happened because of the frozen propagation
82 // assert(theParticle->getPosition().dot(theParticle->getPropagationVelocity())>0.);
83  }
84 
85  theParticle->thawPropagation();
86  fs->addModifiedParticle(theParticle);
87  }
void updatePotentialEnergy(Particle *p) const
Update the particle potential energy.
G4double dot(const ThreeVector &v) const
const G4INCL::ThreeVector & getMomentum() const
G4double getEnergy() const
void thawPropagation()
Unfreeze particle propagation.
G4double getPotentialEnergy() const
Get the particle potential energy.
virtual void setPosition(const G4INCL::ThreeVector &position)
const G4INCL::ThreeVector & getPosition() const
double G4double
Definition: G4Types.hh:76
#define INCL_DEBUG(x)
long getID() const
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: