34#define INCLXX_IN_GEANT4_MODE 1
53 const G4bool success = coulombDeviation(p, n);
60 return theCoulombNoneSlave.bringToSurface(p,n);
66 const G4bool success = coulombDeviation(p, n);
73 return theCoulombNoneSlave.bringToSurfaceAbar(p,n);
81 const G4bool success = coulombDeviation(c, n);
88 return theCoulombNoneSlave.bringToSurface(c,n);
92 Nucleus const *
const nucleus)
const {
94 for(
ParticleIter particle=pL.begin(), e=pL.end(); particle!=e; ++particle) {
96 const G4int Z = (*particle)->getZ();
103 nucleus->getDensity()->getTransmissionRadius(*particle);
110 if(cosTheta < 0.999999) {
111 const G4double sinTheta = std::sqrt(1.-cosTheta*cosTheta);
112 const G4double eta = et1 * Z / (*particle)->getKineticEnergy();
113 if(eta > transmissionRadius-0.0001) {
116 (*particle)->setMomentum(momentum);
118 const G4double b0 = 0.5 * (eta + std::sqrt(eta*eta +
119 4. * std::pow(transmissionRadius*sinTheta,2)
120 * (1.-eta/transmissionRadius)));
121 const G4double bInf = std::sqrt(b0*(b0-eta));
122 const G4double thr = std::atan(eta/(2.*bInf));
123 G4double uTemp = (1.-b0/transmissionRadius) * std::sin(thr) +
124 b0/transmissionRadius;
125 if(uTemp>tcos) uTemp=tcos;
128 const G4double c1 = std::sin(thd)*cosTheta/sinTheta + std::cos(thd);
129 const G4double c2 = -p*std::sin(thd)/(r*sinTheta);
131 (*particle)->setMomentum(newMomentum);
138 Nucleus const *
const n)
const {
139 const G4double theMinimumDistance = minimumDistance(p, kinE, n);
140 G4double rMax = n->getUniverseRadius();
147 const G4double theMaxImpactParameterSquared = rMax*(rMax-theMinimumDistance);
148 if(theMaxImpactParameterSquared<=0.)
150 const G4double theMaxImpactParameter = std::sqrt(theMaxImpactParameterSquared);
151 return theMaxImpactParameter;
157 const G4double impactParameterSquared = positionTransverse.
mag2();
158 const G4double impactParameter = std::sqrt(impactParameterSquared);
161 const G4double theMinimumDistance = minimumDistance(p, n);
163 G4double deltaTheta2 = std::atan(2.*impactParameter/theMinimumDistance);
166 const G4double eccentricity = 1./std::cos(deltaTheta2);
171 const G4double impactParameterTangentSquared = radius*(radius-theMinimumDistance);
172 if(impactParameterSquared >= impactParameterTangentSquared) {
177 newImpactParameter = 0.5 * theMinimumDistance * (1.+eccentricity);
183 const G4double argument = -(1. + 2.*impactParameter*impactParameter/(radius*theMinimumDistance))
188 alpha = std::atan((1+std::cos(thetaIn))
189 / (std::sqrt(eccentricity*eccentricity-1.) - std::sin(thetaIn)))
192 newImpactParameter = radius * std::sin(thetaIn - alpha);
196 positionTransverse *= newImpactParameter/positionTransverse.
mag();
202 ThreeVector rotationAxis = momentum.
vector(positionTransverse);
205 if(axisLength>1E-20) {
206 rotationAxis /= axisLength;
217 const G4int Zt =
n->getZ();
218 const G4int At =
n->getA();
227 }
else if(Zp==1 && Ap==3) {
237 const G4double rp = 1.12*Ap13 - 0.94/Ap13;
238 const G4double rt = 1.12*At13 - 0.94/At13;
239 const G4double someRadius = rp+rt+3.2;
245 INCL_ERROR(
"Negative Coulomb radius! Using the sum of nuclear radii = " << radius <<
'\n');
249 ", Z=" << Zt <<
": " << radius <<
'\n');
252 return n->getUniverseRadius();
Class for non-relativistic Coulomb distortion.
ParticleEntryAvatar * bringToSurfaceAbar(Particle *const p, Nucleus *const n) const
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.
ParticleEntryAvatar * bringToSurface(Particle *const p, Nucleus *const n) const
Modify the momentum of the particle and position it on the surface of the nucleus.
virtual G4INCL::ParticleSpecies getSpecies() const
Get the particle species.
virtual void rotatePositionAndMomentum(const G4double angle, const ThreeVector &axis)
Rotate the particle position and momentum.
G4int getZ() const
Returns the charge number.
ThreeVector getLongitudinalPosition() const
Longitudinal component of the position w.r.t. the momentum.
const G4INCL::ThreeVector & getMomentum() const
ThreeVector getTransversePosition() const
Transverse component of the position w.r.t. the momentum.
virtual void setPosition(const G4INCL::ThreeVector &position)
ThreeVector vector(const ThreeVector &v) const
G4double pow13(G4double x)
G4double arcCos(const G4double x)
Calculates arccos with some tolerance on illegal arguments.
G4double pow23(G4double x)
G4double getLargestNuclearRadius(const G4int A, const G4int Z)
std::string getShortName(const ParticleType t)
Get the short INCL name of the particle.
const G4double eSquared
Coulomb conversion factor [MeV*fm].
ParticleList::const_iterator ParticleIter
UnorderedVector< IAvatar * > IAvatarList