434 kineticEnergy, shell);
440 G4double deltaKinE = tDelta + 2.0*bindingEnergy;
441 G4double primaryKinE = kineticEnergy + 2.0*bindingEnergy;
448 / (deltaMom * primaryMom);
450 if (cost > 1.) cost = 1.;
451 G4double sint = std::sqrt(1. - cost*cost);
453 G4double dirx = sint * std::cos(phi);
454 G4double diry = sint * std::sin(phi);
460 deltaDir.rotateUz(primaryDirection);
470 sint = std::sqrt(1. - cost*cost);
474 dirx += del* sint * std::cos(phi);
475 diry += del* sint * std::sin(phi);
479 G4double finalPx = primaryMom*primaryDirection.
x() - deltaMom*dirx;
480 G4double finalPy = primaryMom*primaryDirection.
y() - deltaMom*diry;
481 G4double finalPz = primaryMom*primaryDirection.
z() - deltaMom*dirz;
486 G4double norm = 1.0/std::sqrt(dirx*dirx + diry*diry + dirz*dirz);
493 G4double theEnergyDeposit = bindingEnergy;
498 G4double finalKinEnergy = kineticEnergy - tDelta - theEnergyDeposit;
499 if(finalKinEnergy < 0.0) {
500 theEnergyDeposit += finalKinEnergy;
501 finalKinEnergy = 0.0;
506 G4double norm = 1.0/std::sqrt(finalPx*finalPx+finalPy*finalPy+finalPz*finalPz);
516 size_t nSecondaries = 0;
517 size_t totalNumber = 1;
518 std::vector<G4DynamicParticle*>* secondaryVector = 0;
529 if (secondaryVector != 0) {
531 nSecondaries = secondaryVector->size();
532 for (
size_t i = 0; i<nSecondaries; i++) {
534 aSecondary = (*secondaryVector)[i];
539 if (e < theEnergyDeposit &&
543 theEnergyDeposit -=
e;
549 (*secondaryVector)[i] = 0;
563 if (secondaryVector) {
565 for (
size_t l = 0; l < nSecondaries; l++) {
567 aSecondary = (*secondaryVector)[l];
574 delete secondaryVector;
577 if(theEnergyDeposit < 0.) {
578 G4cout <<
"G4LowEnergyIonisation: Negative energy deposit: " 579 << theEnergyDeposit/
eV <<
" eV" <<
G4endl;
580 theEnergyDeposit = 0.0;
G4int SelectRandomAtom(const G4MaterialCutsCouple *couple, G4double e) const
G4int SelectRandomShell(G4int Z, G4double e) const
std::vector< G4DynamicParticle * > * GenerateParticles(G4int Z, G4int shellId)
G4RDVEnergySpectrum * energySpectrum
void SetMomentumDirection(const G4ThreeVector &aDirection)
static G4RDAtomicTransitionManager * Instance()
G4double BindingEnergy() const
G4double GetKineticEnergy() const
G4GLOB_DLL std::ostream G4cout
static const double twopi
void SetKineticEnergy(G4double aEnergy)
G4RDAtomicDeexcitation deexcitationManager
G4ParticleChange aParticleChange
static G4Electron * Electron()
G4ParticleDefinition * GetDefinition() const
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
G4bool Fluorescence() const
G4RDVCrossSectionHandler * crossSectionHandler
virtual G4double SampleEnergy(G4int Z, G4double minKineticEnergy, G4double maxKineticEnergy, G4double kineticEnergy, G4int shell=0, const G4ParticleDefinition *pd=0) const =0
virtual G4double MaxEnergyOfSecondaries(G4double kineticEnergy, G4int Z=0, const G4ParticleDefinition *pd=0) const =0