#include <G4INCLCoulombNonRelativistic.hh>
Inheritance diagram for G4INCL::CoulombNonRelativistic:
Public Member Functions | |
CoulombNonRelativistic () | |
virtual | ~CoulombNonRelativistic () |
ParticleEntryAvatar * | bringToSurface (Particle *const p, Nucleus *const n) const |
Modify the momentum of the particle and position it on the surface of the nucleus. | |
IAvatarList | bringToSurface (Cluster *const c, Nucleus *const n) const |
Modify the momentum of the incoming cluster and position it on the surface of the nucleus. | |
void | distortOut (ParticleList const &pL, Nucleus const *const n) const |
Modify the momenta of the outgoing particles. | |
G4double | maxImpactParameter (ParticleSpecies const &p, const G4double kinE, Nucleus const *const n) const |
Return the maximum impact parameter for Coulomb-distorted trajectories. |
Definition at line 55 of file G4INCLCoulombNonRelativistic.hh.
G4INCL::CoulombNonRelativistic::CoulombNonRelativistic | ( | ) | [inline] |
virtual G4INCL::CoulombNonRelativistic::~CoulombNonRelativistic | ( | ) | [inline, virtual] |
IAvatarList G4INCL::CoulombNonRelativistic::bringToSurface | ( | Cluster *const | c, | |
Nucleus *const | n | |||
) | const [virtual] |
Modify the momentum of the incoming cluster and position it on the surface of the nucleus.
This method performs non-relativistic distortion. The momenta of the particles that compose the cluster are also distorted.
c | incoming cluster | |
n | distorting nucleus |
Implements G4INCL::ICoulomb.
Definition at line 62 of file G4INCLCoulombNonRelativistic.cc.
References G4INCL::CoulombNone::bringToSurface(), and CLHEP::detail::n.
00062 { 00063 // Neutral clusters?! 00064 // assert(c->getZ()>0); 00065 00066 // Perform the actual Coulomb deviation 00067 const G4bool success = coulombDeviation(c, n); 00068 if(!success) { 00069 return IAvatarList(); 00070 } 00071 00072 // Rely on the CoulombNone slave to compute the straight-line intersection 00073 // and actually bring the particle to the surface of the nucleus 00074 return theCoulombNoneSlave.bringToSurface(c,n); 00075 }
ParticleEntryAvatar * G4INCL::CoulombNonRelativistic::bringToSurface | ( | Particle *const | p, | |
Nucleus *const | n | |||
) | const [virtual] |
Modify the momentum of the particle and position it on the surface of the nucleus.
This method performs non-relativistic distortion.
p | incoming particle | |
n | distorting nucleus |
Implements G4INCL::ICoulomb.
Definition at line 49 of file G4INCLCoulombNonRelativistic.cc.
References G4INCL::CoulombNone::bringToSurface(), G4INCL::Particle::getZ(), and CLHEP::detail::n.
00049 { 00050 // No distortion for neutral particles 00051 if(p->getZ()!=0) { 00052 const G4bool success = coulombDeviation(p, n); 00053 if(!success) // transparent 00054 return NULL; 00055 } 00056 00057 // Rely on the CoulombNone slave to compute the straight-line intersection 00058 // and actually bring the particle to the surface of the nucleus 00059 return theCoulombNoneSlave.bringToSurface(p,n); 00060 }
void G4INCL::CoulombNonRelativistic::distortOut | ( | ParticleList const & | pL, | |
Nucleus const *const | n | |||
) | const [virtual] |
Modify the momenta of the outgoing particles.
This method performs non-relativistic distortion.
pL | list of outgoing particles | |
n | distorting nucleus |
Implements G4INCL::ICoulomb.
Definition at line 77 of file G4INCLCoulombNonRelativistic.cc.
References G4INCL::PhysicalConstants::eSquared, G4INCL::Nucleus::getDensity(), G4INCL::NuclearDensity::getTransmissionRadius(), G4INCL::Particle::getZ(), G4INCL::ThreeVector::mag(), G4INCL::Math::piOverTwo, and position.
00078 { 00079 00080 for(ParticleIter particle=pL.begin(); particle!=pL.end(); ++particle) { 00081 00082 const G4int Z = (*particle)->getZ(); 00083 if(Z == 0) continue; 00084 00085 const G4double tcos=1.-0.000001; 00086 00087 const G4double et1 = PhysicalConstants::eSquared * nucleus->getZ(); 00088 const G4double transmissionRadius = 00089 nucleus->getDensity()->getTransmissionRadius(*particle); 00090 00091 const ThreeVector position = (*particle)->getPosition(); 00092 ThreeVector momentum = (*particle)->getMomentum(); 00093 const G4double r = position.mag(); 00094 const G4double p = momentum.mag(); 00095 const G4double cosTheta = position.dot(momentum)/(r*p); 00096 if(cosTheta < 0.999999) { 00097 const G4double sinTheta = std::sqrt(1.-cosTheta*cosTheta); 00098 const G4double eta = et1 * Z / (*particle)->getKineticEnergy(); 00099 if(eta > transmissionRadius-0.0001) { 00100 // If below the Coulomb barrier, radial emission: 00101 momentum = position * (p/r); 00102 (*particle)->setMomentum(momentum); 00103 } else { 00104 const G4double b0 = 0.5 * (eta + std::sqrt(eta*eta + 00105 4. * std::pow(transmissionRadius*sinTheta,2) 00106 * (1.-eta/transmissionRadius))); 00107 const G4double bInf = std::sqrt(b0*(b0-eta)); 00108 const G4double thr = std::atan(eta/(2.*bInf)); 00109 G4double uTemp = (1.-b0/transmissionRadius) * std::sin(thr) + 00110 b0/transmissionRadius; 00111 if(uTemp>tcos) uTemp=tcos; 00112 const G4double thd = std::acos(cosTheta)-Math::piOverTwo + thr + 00113 std::acos(uTemp); 00114 const G4double c1 = std::sin(thd)*cosTheta/sinTheta + std::cos(thd); 00115 const G4double c2 = -p*std::sin(thd)/(r*sinTheta); 00116 const ThreeVector newMomentum = momentum*c1 + position*c2; 00117 (*particle)->setMomentum(newMomentum); 00118 } 00119 } 00120 } 00121 }
G4double G4INCL::CoulombNonRelativistic::maxImpactParameter | ( | ParticleSpecies const & | p, | |
const G4double | kinE, | |||
Nucleus const *const | n | |||
) | const [virtual] |
Return the maximum impact parameter for Coulomb-distorted trajectories.
Implements G4INCL::ICoulomb.
Definition at line 123 of file G4INCLCoulombNonRelativistic.cc.
References G4INCL::Composite, G4INCL::ParticleTable::getNuclearRadius(), CLHEP::detail::n, G4INCL::ParticleSpecies::theA, G4INCL::ParticleSpecies::theType, and G4INCL::ParticleSpecies::theZ.
00124 { 00125 G4double theMaxImpactParameter = maxImpactParameterParticle(p, kinE, n); 00126 if(theMaxImpactParameter <= 0.) 00127 return 0.; 00128 if(p.theType == Composite) 00129 theMaxImpactParameter += 2.*ParticleTable::getNuclearRadius(p.theA, p.theZ); 00130 return theMaxImpactParameter; 00131 }