127 crossSectionHandler(0),
132 cutForPhotons = 250.0*
eV;
133 cutForElectrons = 250.0*
eV;
140 delete crossSectionHandler;
141 delete energySpectrum;
142 delete theMeanFreePath;
150 G4cout <<
"G4LowEnergyIonisation::BuildPhysicsTable start"
157 if( energySpectrum != 0 )
delete energySpectrum;
161 G4cout <<
"G4RDVEnergySpectrum is initialized"
167 if ( crossSectionHandler != 0 )
delete crossSectionHandler;
181 <<
" is created; Cross section data: "
191 BuildLossTable(aParticleType);
194 G4cout <<
"The loss table is built"
212 if( theMeanFreePath )
delete theMeanFreePath;
213 theMeanFreePath = crossSectionHandler->
214 BuildMeanFreePathForMaterials(&cutForDelta);
217 G4cout <<
"The MeanFreePath table is built"
227 G4cout <<
"G4LowEnergyIonisation::BuildPhysicsTable end"
253 if (shellVacancy != 0)
delete shellVacancy;
257 size_t binForFluo = totBin/10;
270 for (
size_t m=0;
m<numOfCouples;
m++) {
283 if(tCut > highKineticEnergy) tCut = highKineticEnergy;
284 cutForDelta.push_back(tCut);
287 const G4double* theAtomicNumDensityVector =
290 G4cout <<
"Energy loss for material # " <<
m
291 <<
" tCut(keV)= " << tCut/
keV
296 for (
size_t i = 0; i<totBin; i++) {
302 for (
size_t iel=0; iel<NumberOfElements; iel++ ) {
304 G4int Z = (
G4int)((*theElementVector)[iel]->GetZ());
313 ionloss += e * cs * theAtomicNumDensityVector[iel];
315 if(
verboseLevel > 1 || (Z == 14 && lowEdgeEnergy>1. && lowEdgeEnergy<0.)) {
318 <<
" E(keV)= " << lowEdgeEnergy/
keV
319 <<
" Eav(keV)= " << e/
keV
321 <<
" loss= " << ionloss
322 <<
" rho= " << theAtomicNumDensityVector[iel]
327 ionloss += esp * theAtomicNumDensityVector[iel];
330 if(
verboseLevel > 1 || (
m == 0 && lowEdgeEnergy>=1. && lowEdgeEnergy<=0.)) {
332 <<
" E(keV)= " << lowEdgeEnergy/
keV
333 <<
" loss(MeV/mm)= " << ionloss*
mm/
MeV
344 for (
size_t iel=0; iel<NumberOfElements; iel++ ) {
346 G4int Z = (
G4int)((*theElementVector)[iel]->GetZ());
350 for (
size_t j = 0; j<binForFluo; j++) {
364 eAverage += e * cs * theAtomicNumDensityVector[iel];
365 cross += cs * pro * theAtomicNumDensityVector[iel];
369 <<
" E(keV)= " << lowEdgeEnergy/
keV
370 <<
" Eav(keV)= " << e/
keV
379 coeff = cross/eAverage;
384 G4cout <<
"Ksi Coefficient for Z= " << Z
385 <<
" E(keV)= " << lowEdgeEnergy/
keV
386 <<
" Eav(keV)= " << eAverage/
keV
387 <<
" coeff= " << coeff
391 energy->push_back(lowEdgeEnergy);
392 ksi->push_back(coeff);
434 kineticEnergy, shell);
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);
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;
524 if (
Fluorescence() && Z > 5 && (bindingEnergy >= cutForPhotons
525 || bindingEnergy >= cutForElectrons)) {
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;
590 G4String comments =
"Total cross sections from EEDL database.";
591 comments +=
"\n Gamma energy sampled from a parametrised formula.";
592 comments +=
"\n Implementation of the continuous dE/dx part.";
593 comments +=
"\n At present it can be used for electrons ";
594 comments +=
"in the energy range [250eV,100GeV].";
595 comments +=
"\n The process must work with G4LowEnergyBremsstrahlung.";
605 std::vector<G4DynamicParticle*>*
613 std::vector<G4DynamicParticle*>* partVector =
614 new std::vector<G4DynamicParticle*>;
616 if(eLoss > cutForPhotons && eLoss > cutForElectrons) {
624 std::vector<G4DynamicParticle*>* secVector = 0;
629 G4int shell, shellId;
634 std::vector<G4int>
n =
636 incidentEnergy,eLoss);
637 for (
size_t i=0; i<nElements; i++) {
639 G4int Z = (
G4int)((*theElementVector)[i]->GetZ());
640 size_t nVacancies = n[i];
644 if (nVacancies && Z > 5 && (maxE>cutForPhotons || maxE>cutForElectrons)) {
646 for (
size_t j=0; j<nVacancies; j++) {
649 shellId = transitionManager->
Shell(Z, shell)->
ShellId();
653 if (maxEShell>cutForPhotons || maxEShell>cutForElectrons ) {
657 if (secVector != 0) {
659 for (
size_t l = 0; l<secVector->size(); l++) {
661 aSecondary = (*secVector)[l];
662 if (aSecondary != 0) {
666 if ( eTot + e <= eLoss &&
671 partVector->push_back(aSecondary);
709 cutForElectrons = cut;
virtual G4double Excitation(G4int Z, G4double kineticEnergy) const =0
const std::vector< G4double > * GetEnergyCutsVector(size_t pcIdx) const
void AddXsiTable(G4RDVEMDataSet *set)
void SetCutForSecondaryPhotons(G4double cut)
static constexpr double mm
std::vector< G4DynamicParticle * > * GenerateParticles(G4int Z, G4int shellId)
G4double GetMeanFreePath(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
std::vector< G4Element * > G4ElementVector
void ActivateAuger(G4bool val)
void insert(G4PhysicsVector *)
void ActivateAugerElectronProduction(G4bool val)
G4double GetKineticEnergy() const
static G4int CounterOfElectronProcess
G4bool Fluorescence() const
virtual std::vector< G4DynamicParticle * > * DeexciteAtom(const G4MaterialCutsCouple *couple, G4double incidentEnergy, G4double eLoss)
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
void LoadShellData(const G4String &dataFile)
virtual const G4RDVEMDataSet * GetComponent(G4int componentId) const =0
void SetMomentumDirection(const G4ThreeVector &aDirection)
G4ParticleDefinition * GetDefinition() const
static G4double GetLowerBoundEloss()
G4double FindValue(G4int Z, G4double e) const
G4double GetLowEdgeEnergy(size_t binNumber) const
const G4ElementVector * GetElementVector() const
void BuildPhysicsTable(const G4ParticleDefinition &ParticleType)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
static constexpr double twopi
const XML_Char const XML_Char * data
static G4RDAtomicTransitionManager * Instance()
std::vector< G4int > GenerateNumberOfIonisations(const G4MaterialCutsCouple *couple, G4double incidentEnergy, G4double eLoss) const
G4double GetKineticEnergy() const
G4GLOB_DLL std::ostream G4cout
static constexpr double m
size_t GetTableSize() const
G4bool IsApplicable(const G4ParticleDefinition &)
void SetCutForLowEnSecPhotons(G4double cut)
G4double BindingEnergy() const
G4int SelectRandomShell(G4int Z, G4double e) const
Hep3Vector & rotateUz(const Hep3Vector &)
void PutValue(size_t index, G4double theValue)
void BuildDEDXTable(const G4ParticleDefinition &aParticleType)
G4LowEnergyIonisation(const G4String &processName="LowEnergyIoni")
static constexpr double eV
virtual G4double FindValue(G4double x, G4int componentId=0) const =0
virtual void PrintData(void) const =0
virtual void PrintData() const =0
const G4String & GetProcessName() const
const G4double * GetAtomicNumDensityVector() const
void SetKineticEnergy(G4double aEnergy)
void SetCutForLowEnSecElectrons(G4double cut)
static G4PhysicsTable ** RecorderOfPositronProcess
virtual void Initialize(const G4Track &)
static G4ProductionCutsTable * GetProductionCutsTable()
static G4double GetUpperBoundEloss()
virtual G4double AverageEnergy(G4int Z, G4double minKineticEnergy, G4double maxKineticEnergy, G4double kineticEnergy, G4int shell=0, const G4ParticleDefinition *pd=0) const =0
G4int NumberOfShells(G4int Z) const
static G4PhysicsTable ** RecorderOfElectronProcess
const G4ThreeVector & GetMomentumDirection() const
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
G4VParticleChange * PostStepDoIt(const G4Track &track, const G4Step &step)
void PrintInfoDefinition()
G4double energy(const ThreeVector &p, const G4double m)
void SetNumberOfSecondaries(G4int totSecondaries)
static G4int GetNbinEloss()
void SetCutForAugerElectrons(G4double cut)
G4int SelectRandomAtom(const G4MaterialCutsCouple *couple, G4double e) const
void ProposeEnergy(G4double finalEnergy)
G4ParticleChange aParticleChange
G4RDAtomicShell * Shell(G4int Z, size_t shellIndex) const
void AddSecondary(G4Track *aSecondary)
static G4Electron * Electron()
static constexpr double MeV
size_t GetNumberOfElements() const
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
G4PhysicsTable * theLossTable
static G4int CounterOfPositronProcess
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
void ProposeTrackStatus(G4TrackStatus status)
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
virtual void AddComponent(G4RDVEMDataSet *dataSet)=0
G4double bindingEnergy(G4int A, G4int Z)
static constexpr double keV
virtual G4double SampleEnergy(G4int Z, G4double minKineticEnergy, G4double maxKineticEnergy, G4double kineticEnergy, G4int shell=0, const G4ParticleDefinition *pd=0) const =0
const G4Material * GetMaterial() const
virtual G4double Probability(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