Geant4-11
Public Member Functions | Private Member Functions | Private Attributes
G4UAtomicDeexcitation Class Reference

#include <G4UAtomicDeexcitation.hh>

Inheritance diagram for G4UAtomicDeexcitation:
G4VAtomDeexcitation

Public Member Functions

void AlongStepDeexcitation (std::vector< G4Track * > &tracks, const G4Step &step, G4double &eLoss, G4int coupleIndex)
 
G4bool CheckAugerActiveRegion (G4int coupleIndex)
 
G4bool CheckDeexcitationActiveRegion (G4int coupleIndex)
 
G4double ComputeShellIonisationCrossSectionPerAtom (const G4ParticleDefinition *, G4int Z, G4AtomicShellEnumerator shell, G4double kinE, const G4Material *mat=nullptr) override
 access or compute PIXE cross section More...
 
 G4UAtomicDeexcitation ()
 
 G4UAtomicDeexcitation (G4UAtomicDeexcitation &)=delete
 
void GenerateParticles (std::vector< G4DynamicParticle * > *secVect, const G4AtomicShell *, G4int Z, G4double gammaCut, G4double eCut) override
 generation of deexcitation for given atom, shell vacancy and cuts More...
 
void GenerateParticles (std::vector< G4DynamicParticle * > *secVect, const G4AtomicShell *, G4int Z, G4int coupleIndex)
 
const G4AtomicShellGetAtomicShell (G4int Z, G4AtomicShellEnumerator shell) override
 
const std::vector< G4bool > & GetListOfActiveAtoms () const
 
const G4StringGetName () const
 
G4double GetShellIonisationCrossSectionPerAtom (const G4ParticleDefinition *, G4int Z, G4AtomicShellEnumerator shell, G4double kinE, const G4Material *mat=nullptr) override
 access or compute PIXE cross section More...
 
G4int GetVerboseLevel () const
 
void InitialiseAtomicDeexcitation ()
 
void InitialiseForExtraAtom (G4int Z) override
 
void InitialiseForNewRun () override
 initialisation methods More...
 
G4bool IsAugerActive () const
 
G4bool IsAugerCascadeActive () const
 
G4bool IsFluoActive () const
 
G4bool IsPIXEActive () const
 
G4UAtomicDeexcitationoperator= (const G4UAtomicDeexcitation &right)=delete
 
void SetAuger (G4bool)
 
void SetAugerCascade (G4bool)
 
void SetCutForAugerElectrons (G4double cut)
 Set threshold energy for Auger electron production. More...
 
void SetCutForSecondaryPhotons (G4double cut)
 Set threshold energy for fluorescence. More...
 
void SetDeexcitationActiveRegion (const G4String &rname, G4bool valDeexcitation, G4bool valAuger, G4bool valPIXE)
 
void SetFluo (G4bool)
 
void SetPIXE (G4bool)
 
void SetVerboseLevel (G4int)
 
virtual ~G4UAtomicDeexcitation ()
 

Private Member Functions

G4DynamicParticleGenerateAuger (G4int Z, G4int shellId)
 Generates a particle from a non-radiative transition and returns it. More...
 
G4DynamicParticleGenerateAuger (G4int Z, G4int shellId, G4int &newAugerShellId)
 
G4DynamicParticleGenerateFluorescence (G4int Z, G4int shellId, G4int provShellId)
 Generates a particle from a radiative transition and returns it. More...
 
G4int SelectTypeOfTransition (G4int Z, G4int shellId)
 

Private Attributes

std::vector< G4boolactiveAugerMedia
 
std::vector< G4boolactiveDeexcitationMedia
 
std::vector< G4boolactivePIXEMedia
 
std::vector< G4StringactiveRegions
 
std::vector< G4boolactiveZ
 
G4VhShellCrossSectionanaPIXEshellCS
 
std::vector< G4boolAugerRegions
 
std::vector< G4booldeRegions
 
G4EmCorrectionsemcorr
 
G4VhShellCrossSectionePIXEshellCS
 
G4bool flagAuger = false
 
G4bool flagPIXE = false
 
const G4ParticleDefinitiongamma
 
G4bool ignoreCuts = false
 
G4bool isActive = false
 
G4bool isActiveLocked = false
 
G4bool isAugerLocked = false
 
G4bool isPIXELocked = false
 
G4double minElectronEnergy
 
G4double minGammaEnergy
 
G4String name
 
G4int nCouples = 0
 
G4int newShellId
 
std::vector< G4boolPIXERegions
 
G4VhShellCrossSectionPIXEshellCS
 Data member for the calculation of the proton and alpha ionisation XS. More...
 
const G4ProductionCutsTabletheCoupleTable = nullptr
 
const G4ParticleDefinitiontheElectron
 
const G4ParticleDefinitionthePositron
 
G4AtomicTransitionManagertransitionManager
 
std::vector< int > vacancyArray
 
std::vector< G4DynamicParticle * > vdyn
 
G4int verbose = 1
 

Detailed Description

Definition at line 60 of file G4UAtomicDeexcitation.hh.

Constructor & Destructor Documentation

◆ G4UAtomicDeexcitation() [1/2]

G4UAtomicDeexcitation::G4UAtomicDeexcitation ( )
explicit

Definition at line 77 of file G4UAtomicDeexcitation.cc.

77 :
78 G4VAtomDeexcitation("UAtomDeexcitation"),
81 newShellId(-1)
82{
83 anaPIXEshellCS = nullptr;
84 PIXEshellCS = nullptr;
85 ePIXEshellCS = nullptr;
90}
static G4AtomicTransitionManager * Instance()
static G4Electron * Electron()
Definition: G4Electron.cc:93
static G4LossTableManager * Instance()
G4EmCorrections * EmCorrections()
static G4Positron * Positron()
Definition: G4Positron.cc:93
G4AtomicTransitionManager * transitionManager
G4VhShellCrossSection * anaPIXEshellCS
const G4ParticleDefinition * thePositron
const G4ParticleDefinition * theElectron
G4VhShellCrossSection * PIXEshellCS
Data member for the calculation of the proton and alpha ionisation XS.
G4VhShellCrossSection * ePIXEshellCS
G4VAtomDeexcitation(const G4String &modname="Deexcitation")
#define DBL_MAX
Definition: templates.hh:62

References anaPIXEshellCS, G4Electron::Electron(), emcorr, G4LossTableManager::EmCorrections(), ePIXEshellCS, G4AtomicTransitionManager::Instance(), G4LossTableManager::Instance(), PIXEshellCS, G4Positron::Positron(), theElectron, thePositron, and transitionManager.

◆ ~G4UAtomicDeexcitation()

G4UAtomicDeexcitation::~G4UAtomicDeexcitation ( )
virtual

Definition at line 94 of file G4UAtomicDeexcitation.cc.

95{
96 delete anaPIXEshellCS;
97 delete PIXEshellCS;
98 delete ePIXEshellCS;
99}

References anaPIXEshellCS, ePIXEshellCS, and PIXEshellCS.

◆ G4UAtomicDeexcitation() [2/2]

G4UAtomicDeexcitation::G4UAtomicDeexcitation ( G4UAtomicDeexcitation )
delete

Member Function Documentation

◆ AlongStepDeexcitation()

void G4VAtomDeexcitation::AlongStepDeexcitation ( std::vector< G4Track * > &  tracks,
const G4Step step,
G4double eLoss,
G4int  coupleIndex 
)
inherited

Definition at line 261 of file G4VAtomDeexcitation.cc.

265{
266 G4double truelength = step.GetStepLength();
267 if(!flagPIXE && !activePIXEMedia[coupleIndex]) { return; }
268 if(eLossMax <= 0.0 || truelength <= 0.0) { return; }
269
270 // step parameters
271 const G4StepPoint* preStep = step.GetPreStepPoint();
272 const G4ThreeVector prePos = preStep->GetPosition();
273 const G4ThreeVector delta = step.GetPostStepPoint()->GetPosition() - prePos;
274 const G4double preTime = preStep->GetGlobalTime();
275 const G4double dt = step.GetPostStepPoint()->GetGlobalTime() - preTime;
276
277 // particle parameters
278 const G4Track* track = step.GetTrack();
279 const G4ParticleDefinition* part = track->GetDefinition();
280 G4double ekin = preStep->GetKineticEnergy();
281
282 // media parameters
283 G4double gCut = (*theCoupleTable->GetEnergyCutsVector(0))[coupleIndex];
284 if(ignoreCuts) { gCut = 0.0; }
285 G4double eCut = DBL_MAX;
286 if(CheckAugerActiveRegion(coupleIndex)) {
287 eCut = (*theCoupleTable->GetEnergyCutsVector(1))[coupleIndex];
288 if(ignoreCuts) { eCut = 0.0; }
289 }
290
291 //G4cout<<"!Sample PIXE gCut(MeV)= "<<gCut<<" eCut(MeV)= "<<eCut
292 // <<" Ekin(MeV)= " << ekin/MeV << G4endl;
293
294 const G4Material* material = preStep->GetMaterial();
295 const G4ElementVector* theElementVector = material->GetElementVector();
296 const G4double* theAtomNumDensityVector =
297 material->GetVecNbOfAtomsPerVolume();
298 const G4int nelm = material->GetNumberOfElements();
299
300 // loop over deexcitations
301 for(G4int i=0; i<nelm; ++i) {
302 G4int Z = (*theElementVector)[i]->GetZasInt();
303 if(activeZ[Z] && Z < 93) {
304 G4int nshells =
305 std::min(9,(*theElementVector)[i]->GetNbOfAtomicShells());
306 G4double rho = truelength*theAtomNumDensityVector[i];
307 //G4cout<<" Z "<< Z <<" is active x(mm)= " << truelength/mm << G4endl;
308 for(G4int ii=0; ii<nshells; ++ii) {
310 const G4AtomicShell* shell = GetAtomicShell(Z, as);
311 const G4double bindingEnergy = shell->BindingEnergy();
312
313 if(gCut > bindingEnergy) { break; }
314
315 if(eLossMax > bindingEnergy) {
316 G4double sig = rho*
318
319 // mfp is mean free path in units of step size
320 if(sig > 0.0) {
321 G4double mfp = 1.0/sig;
322 G4double stot = 0.0;
323 //G4cout << " Shell " << ii << " mfp(mm)= " << mfp/mm << G4endl;
324 // sample ionisation points
325 do {
326 stot -= mfp*G4Log(G4UniformRand());
327 if( stot > 1.0 || eLossMax < bindingEnergy) { break; }
328 // sample deexcitation
329 vdyn.clear();
330 GenerateParticles(&vdyn, shell, Z, gCut, eCut);
331 G4int nsec = vdyn.size();
332 if(nsec > 0) {
333 G4ThreeVector r = prePos + stot*delta;
334 G4double time = preTime + stot*dt;
335 for(G4int j=0; j<nsec; ++j) {
336 G4DynamicParticle* dp = vdyn[j];
337 G4double e = dp->GetKineticEnergy();
338
339 // save new secondary if there is enough energy
340 if(eLossMax >= e) {
341 eLossMax -= e;
342 G4Track* t = new G4Track(dp, time, r);
343
344 // defined secondary type
345 if(dp->GetDefinition() == gamma) {
347 } else {
349 }
350 tracks.push_back(t);
351 } else {
352 delete dp;
353 }
354 }
355 }
356 // Loop checking, 03-Aug-2015, Vladimir Ivanchenko
357 } while (stot < 1.0);
358 }
359 }
360 }
361 }
362 }
363 return;
364}
G4AtomicShellEnumerator
std::vector< const G4Element * > G4ElementVector
G4double G4Log(G4double x)
Definition: G4Log.hh:226
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
#define G4UniformRand()
Definition: Randomize.hh:52
G4double BindingEnergy() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
const std::vector< G4double > * GetEnergyCutsVector(std::size_t pcIdx) const
G4double GetGlobalTime() const
G4Material * GetMaterial() const
const G4ThreeVector & GetPosition() const
G4double GetKineticEnergy() const
G4Track * GetTrack() const
G4StepPoint * GetPreStepPoint() const
G4double GetStepLength() const
G4StepPoint * GetPostStepPoint() const
G4ParticleDefinition * GetDefinition() const
void SetCreatorModelID(const G4int id)
virtual const G4AtomicShell * GetAtomicShell(G4int Z, G4AtomicShellEnumerator shell)=0
G4bool CheckAugerActiveRegion(G4int coupleIndex)
std::vector< G4bool > activePIXEMedia
void GenerateParticles(std::vector< G4DynamicParticle * > *secVect, const G4AtomicShell *, G4int Z, G4int coupleIndex)
std::vector< G4bool > activeZ
std::vector< G4DynamicParticle * > vdyn
virtual G4double GetShellIonisationCrossSectionPerAtom(const G4ParticleDefinition *, G4int Z, G4AtomicShellEnumerator shell, G4double kinE, const G4Material *mat=nullptr)=0
const G4ParticleDefinition * gamma
const G4ProductionCutsTable * theCoupleTable
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4double bindingEnergy(G4int A, G4int Z)
string material
Definition: eplot.py:19

References _ePIXE, _GammaPIXE, G4VAtomDeexcitation::activePIXEMedia, G4VAtomDeexcitation::activeZ, G4AtomicShell::BindingEnergy(), G4InuclSpecialFunctions::bindingEnergy(), G4VAtomDeexcitation::CheckAugerActiveRegion(), DBL_MAX, G4VAtomDeexcitation::flagPIXE, G4Log(), G4UniformRand, G4VAtomDeexcitation::gamma, G4VAtomDeexcitation::GenerateParticles(), G4VAtomDeexcitation::GetAtomicShell(), G4DynamicParticle::GetDefinition(), G4Track::GetDefinition(), G4ProductionCutsTable::GetEnergyCutsVector(), G4StepPoint::GetGlobalTime(), G4DynamicParticle::GetKineticEnergy(), G4StepPoint::GetKineticEnergy(), G4StepPoint::GetMaterial(), G4StepPoint::GetPosition(), G4Step::GetPostStepPoint(), G4Step::GetPreStepPoint(), G4VAtomDeexcitation::GetShellIonisationCrossSectionPerAtom(), G4Step::GetStepLength(), G4Step::GetTrack(), G4VAtomDeexcitation::ignoreCuts, eplot::material, G4INCL::Math::min(), G4Track::SetCreatorModelID(), G4VAtomDeexcitation::theCoupleTable, G4VAtomDeexcitation::vdyn, and Z.

Referenced by G4VEnergyLossProcess::AlongStepDoIt().

◆ CheckAugerActiveRegion()

G4bool G4VAtomDeexcitation::CheckAugerActiveRegion ( G4int  coupleIndex)
inlineinherited

◆ CheckDeexcitationActiveRegion()

G4bool G4VAtomDeexcitation::CheckDeexcitationActiveRegion ( G4int  coupleIndex)
inlineinherited

◆ ComputeShellIonisationCrossSectionPerAtom()

G4double G4UAtomicDeexcitation::ComputeShellIonisationCrossSectionPerAtom ( const G4ParticleDefinition p,
G4int  Z,
G4AtomicShellEnumerator  shell,
G4double  kinE,
const G4Material mat = nullptr 
)
overridevirtual

access or compute PIXE cross section

Implements G4VAtomDeexcitation.

Definition at line 386 of file G4UAtomicDeexcitation.cc.

392{
393 return GetShellIonisationCrossSectionPerAtom(p,Z,shell,kinE,mat);
394}
G4double GetShellIonisationCrossSectionPerAtom(const G4ParticleDefinition *, G4int Z, G4AtomicShellEnumerator shell, G4double kinE, const G4Material *mat=nullptr) override
access or compute PIXE cross section

References GetShellIonisationCrossSectionPerAtom(), and Z.

◆ GenerateAuger() [1/2]

G4DynamicParticle * G4UAtomicDeexcitation::GenerateAuger ( G4int  Z,
G4int  shellId 
)
private

Generates a particle from a non-radiative transition and returns it.

Definition at line 537 of file G4UAtomicDeexcitation.cc.

538{
539 if(!IsAugerActive()) {
540 // G4cout << "auger inactive!" << G4endl; //debug
541 return nullptr;
542 }
543
544 if (shellId <=0 ) {
545 //G4Exception("G4UAtomicDeexcitation::GenerateAuger()","de0002",
546 // JustWarning, "Energy deposited locally");
547 return nullptr;
548 }
549
551
552 const G4AugerTransition* refAugerTransition =
553 transitionManager->ReachableAugerShell(Z,maxNumOfShells-1);
554
555 // This loop gives to shellNum the value of the index of shellId
556 // in the vector storing the list of the vacancies in the variuos shells
557 // that can originate a NON-radiative transition
558 G4int shellNum = 0;
559
560 if ( shellId <= refAugerTransition->FinalShellId() )
561 // "FinalShellId" is final from the point of view of the electron
562 // who makes the transition,
563 // being the Id of the shell in which there is a vacancy
564 {
566 if (shellId != pippo ) {
567 do {
568 shellNum++;
569 if(shellNum == maxNumOfShells)
570 {
571 // G4cout << "No Auger transition found" << G4endl; //debug
572 return 0;
573 }
574 }
575 while (shellId != (transitionManager->ReachableAugerShell(Z,shellNum)->FinalShellId()) );
576 }
577
578 // Now we have that shellnum is the shellIndex of the shell named ShellId
579 // G4cout << " the index of the shell is: "<<shellNum<<G4endl;
580 // But we have now to select two shells: one for the transition,
581 // and another for the auger emission.
582 G4int transitionLoopShellIndex = 0;
583 G4double partSum = 0;
584 const G4AugerTransition* anAugerTransition =
586
587 G4int transitionSize =
588 (anAugerTransition->TransitionOriginatingShellIds())->size();
589 while (transitionLoopShellIndex < transitionSize) {
590
591 std::vector<G4int>::const_iterator pos =
592 anAugerTransition->TransitionOriginatingShellIds()->begin();
593
594 G4int transitionLoopShellId = *(pos+transitionLoopShellIndex);
595 G4int numberOfPossibleAuger =
596 (anAugerTransition->AugerTransitionProbabilities(transitionLoopShellId))->size();
597 G4int augerIndex = 0;
598
599 if (augerIndex < numberOfPossibleAuger) {
600 do
601 {
602 G4double thisProb = anAugerTransition->AugerTransitionProbability(augerIndex,
603 transitionLoopShellId);
604 partSum += thisProb;
605 augerIndex++;
606
607 } while (augerIndex < numberOfPossibleAuger);
608 }
609 transitionLoopShellIndex++;
610 }
611
612 G4double totalVacancyAugerProbability = partSum;
613
614 //And now we start to select the right auger transition and emission
615 G4int transitionRandomShellIndex = 0;
616 G4int transitionRandomShellId = 1;
617 G4int augerIndex = 0;
618 partSum = 0;
619 G4double partialProb = G4UniformRand();
620
621 G4int numberOfPossibleAuger = 0;
622 G4bool foundFlag = false;
623
624 while (transitionRandomShellIndex < transitionSize) {
625
626 std::vector<G4int>::const_iterator pos =
627 anAugerTransition->TransitionOriginatingShellIds()->begin();
628
629 transitionRandomShellId = *(pos+transitionRandomShellIndex);
630
631 augerIndex = 0;
632 numberOfPossibleAuger = (anAugerTransition->
633 AugerTransitionProbabilities(transitionRandomShellId))->size();
634
635 while (augerIndex < numberOfPossibleAuger) {
636 G4double thisProb =anAugerTransition->AugerTransitionProbability(augerIndex,
637 transitionRandomShellId);
638
639 partSum += thisProb;
640
641 if (partSum >= (partialProb*totalVacancyAugerProbability) ) { // was /
642 foundFlag = true;
643 break;
644 }
645 augerIndex++;
646 }
647 if (partSum >= (partialProb*totalVacancyAugerProbability) ) {break;} // was /
648 transitionRandomShellIndex++;
649 }
650
651 // Now we have the index of the shell from wich comes the auger electron (augerIndex),
652 // and the id of the shell, from which the transition e- come (transitionRandomShellid)
653 // If no Transition has been found, 0 is returned.
654 if (!foundFlag) {
655 return nullptr;
656 }
657
658 // Isotropic angular distribution for the outcoming e-
659 G4double newcosTh = 1.-2.*G4UniformRand();
660 G4double newsinTh = std::sqrt(1.-newcosTh*newcosTh);
661 G4double newPhi = twopi*G4UniformRand();
662
663 G4double xDir = newsinTh*std::sin(newPhi);
664 G4double yDir = newsinTh*std::cos(newPhi);
665 G4double zDir = newcosTh;
666
667 G4ThreeVector newElectronDirection(xDir,yDir,zDir);
668
669 // energy of the auger electron emitted
670 G4double transitionEnergy =
671 anAugerTransition->AugerTransitionEnergy(augerIndex, transitionRandomShellId);
672
673 if (transitionEnergy < minElectronEnergy) {
674 return nullptr;
675 }
676
677 // This is the shell where the new vacancy is: it is the same
678 // shell where the electron came from
679 newShellId = transitionRandomShellId;
680
681 //Auger cascade by Burkhant Suerfu on March 24 2015 (Bugzilla 1727)
683 {
684 vacancyArray.push_back(newShellId);
685 vacancyArray.push_back(anAugerTransition->AugerOriginatingShellId(augerIndex,transitionRandomShellId));
686 }
687
689 newElectronDirection,
690 transitionEnergy);
691 }
692 else
693 {
694 return nullptr;
695 }
696}
static const G4double pos
static constexpr double twopi
Definition: G4SIunits.hh:56
bool G4bool
Definition: G4Types.hh:86
const G4AugerTransition * ReachableAugerShell(G4int Z, G4int shellIndex) const
G4int NumberOfReachableAugerShells(G4int Z) const
G4int AugerOriginatingShellId(G4int index, G4int startShellId) const
G4int FinalShellId() const
returns the id of the shell in wich the transition electron arrives
const G4DataVector * AugerTransitionProbabilities(G4int startShellId) const
G4double AugerTransitionEnergy(G4int index, G4int startShellId) const
const std::vector< G4int > * TransitionOriginatingShellIds() const
Returns the ids of the shells from wich an electron cuuld fill the vacancy in finalShellId.
G4double AugerTransitionProbability(G4int index, G4int startShellId) const
std::vector< int > vacancyArray
G4bool IsAugerActive() const
G4bool IsAugerCascadeActive() const

References G4AugerTransition::AugerOriginatingShellId(), G4AugerTransition::AugerTransitionEnergy(), G4AugerTransition::AugerTransitionProbabilities(), G4AugerTransition::AugerTransitionProbability(), G4Electron::Electron(), G4AugerTransition::FinalShellId(), G4UniformRand, G4VAtomDeexcitation::IsAugerActive(), G4VAtomDeexcitation::IsAugerCascadeActive(), minElectronEnergy, newShellId, G4AtomicTransitionManager::NumberOfReachableAugerShells(), pos, G4AtomicTransitionManager::ReachableAugerShell(), transitionManager, G4AugerTransition::TransitionOriginatingShellIds(), twopi, vacancyArray, and Z.

Referenced by GenerateParticles().

◆ GenerateAuger() [2/2]

G4DynamicParticle * G4UAtomicDeexcitation::GenerateAuger ( G4int  Z,
G4int  shellId,
G4int newAugerShellId 
)
private

Auger cascade by Burkhant Suerfu on March 24 2015 (Bugzilla 1727) Generates auger electron cascade.

◆ GenerateFluorescence()

G4DynamicParticle * G4UAtomicDeexcitation::GenerateFluorescence ( G4int  Z,
G4int  shellId,
G4int  provShellId 
)
private

Generates a particle from a radiative transition and returns it.

Definition at line 464 of file G4UAtomicDeexcitation.cc.

466{
467 if (shellId <=0 )
468 {
469 //G4Exception("G4UAtomicDeexcitation::GenerateFluorescence()","de0002",JustWarning, "Energy deposited locally");
470 return nullptr;
471 }
472
473 //isotropic angular distribution for the outcoming photon
474 G4double newcosTh = 1.-2.*G4UniformRand();
475 G4double newsinTh = std::sqrt((1.-newcosTh)*(1. + newcosTh));
476 G4double newPhi = twopi*G4UniformRand();
477
478 G4double xDir = newsinTh*std::sin(newPhi);
479 G4double yDir = newsinTh*std::cos(newPhi);
480 G4double zDir = newcosTh;
481
482 G4ThreeVector newGammaDirection(xDir,yDir,zDir);
483
484 G4int shellNum = 0;
486
487 // find the index of the shell named shellId
488 while (shellId != transitionManager->
489 ReachableShell(Z,shellNum)->FinalShellId())
490 {
491 if(shellNum == maxNumOfShells-1)
492 {
493 break;
494 }
495 shellNum++;
496 }
497 // number of shell from wich an electron can reach shellId
498 size_t transitionSize = transitionManager->
499 ReachableShell(Z,shellNum)->OriginatingShellIds().size();
500
501 size_t index = 0;
502
503 // find the index of the shell named provShellId in the vector
504 // storing the shells from which shellId can be reached
505 while (provShellId != transitionManager->
506 ReachableShell(Z,shellNum)->OriginatingShellId(index))
507 {
508 if(index == transitionSize-1)
509 {
510 break;
511 }
512 index++;
513 }
514 // energy of the gamma leaving provShellId for shellId
515 G4double transitionEnergy = transitionManager->
516 ReachableShell(Z,shellNum)->TransitionEnergy(index);
517
518 if (transitionEnergy < minGammaEnergy) return nullptr;
519
520 // This is the shell where the new vacancy is: it is the same
521 // shell where the electron came from
523 ReachableShell(Z,shellNum)->OriginatingShellId(index);
524
526 newGammaDirection,
527 transitionEnergy);
528
529 //Auger cascade by Burkhant Suerfu on March 24 2015 (Bugzilla 1727)
531
532 return newPart;
533}
G4int NumberOfReachableShells(G4int Z) const
static G4Gamma * Gamma()
Definition: G4Gamma.cc:85

References G4UniformRand, G4Gamma::Gamma(), G4VAtomDeexcitation::IsAugerCascadeActive(), minGammaEnergy, newShellId, G4AtomicTransitionManager::NumberOfReachableShells(), transitionManager, twopi, vacancyArray, and Z.

Referenced by GenerateParticles().

◆ GenerateParticles() [1/2]

void G4UAtomicDeexcitation::GenerateParticles ( std::vector< G4DynamicParticle * > *  secVect,
const G4AtomicShell atomicShell,
G4int  Z,
G4double  gammaCut,
G4double  eCut 
)
overridevirtual

generation of deexcitation for given atom, shell vacancy and cuts

Implements G4VAtomDeexcitation.

Definition at line 186 of file G4UAtomicDeexcitation.cc.

192{
193 // Defined initial conditions
194 G4int givenShellId = atomicShell->ShellId();
195 minGammaEnergy = gammaCut;
196 minElectronEnergy = eCut;
197
198 // generation secondaries
199 G4DynamicParticle* aParticle=0;
200 G4int provShellId = 0;
201
202 //ORIGINAL METHOD BY ALFONSO MANTERO
204 {
205 //----------------------------
206 G4int counter = 0;
207
208 // let's check that 5<Z<100
209
210 if (Z>5 && Z<100) {
211
212 // The aim of this loop is to generate more than one fluorecence photon
213 // from the same ionizing event
214 do
215 {
216 if (counter == 0)
217 // First call to GenerateParticles(...):
218 // givenShellId is given by the process
219 {
220 provShellId = SelectTypeOfTransition(Z, givenShellId);
221
222 if ( provShellId >0)
223 {
224 aParticle = GenerateFluorescence(Z,givenShellId,provShellId);
225 }
226 else if ( provShellId == -1)
227 {
228 aParticle = GenerateAuger(Z, givenShellId);
229 }
230 else
231 {
232 //G4Exception("G4UAtomicDeexcitation::GenerateParticles()",
233 // "de0002",JustWarning, "Energy deposited locally");
234 }
235 }
236 else
237 // Following calls to GenerateParticles(...):
238 // newShellId is given by GenerateFluorescence(...)
239 {
240 provShellId = SelectTypeOfTransition(Z,newShellId);
241 if (provShellId >0)
242 {
243 aParticle = GenerateFluorescence(Z,newShellId,provShellId);
244 }
245 else if ( provShellId == -1)
246 {
247 aParticle = GenerateAuger(Z, newShellId);
248 }
249 else
250 {
251 //G4Exception("G4UAtomicDeexcitation::GenerateParticles()","de0002",JustWarning, "Energy deposited locally");
252 }
253 }
254 counter++;
255 if (aParticle != 0)
256 {
257 vectorOfParticles->push_back(aParticle);
258 //G4cout << "Deexcitation Occurred!" << G4endl; //debug
259 }
260 else {provShellId = -2;}
261 }
262 while (provShellId > -2);
263 }
264 else
265 {
266 //G4Exception("G4UAtomicDeexcitation::GenerateParticles()","de0001",JustWarning, "Energy deposited locally");
267 }
268
269 } // Auger cascade is not active
270
271 //END OF ORIGINAL METHOD BY ALFONSO MANTERO
272 //----------------------
273
274 // NEW METHOD
275 // Auger cascade by Burkhant Suerfu on March 24 2015 (Bugzilla 1727)
277 {
278 //----------------------
279 vacancyArray.push_back(givenShellId);
280
281 // let's check that 5<Z<100
282 if (Z<6 || Z>99){
283 //G4Exception("G4UAtomicDeexcitation::GenerateParticles()","de0001",JustWarning, "Energy deposited locally");
284 return;
285 }
286
287 // as long as there is vacancy to be filled by either fluo or auger, stay in the loop.
288 while(!vacancyArray.empty()){
289 // prepare to process the last element, and then delete it from the vector.
290 givenShellId = vacancyArray[0];
291 provShellId = SelectTypeOfTransition(Z,givenShellId);
292
293 //G4cout<<"\n------ Atom Transition with Z: "<<Z<<"\tbetween current:"
294 // <<givenShellId<<" & target:"<<provShellId<<G4endl;
295 if(provShellId>0){
296 aParticle = GenerateFluorescence(Z,givenShellId,provShellId);
297 }
298 else if(provShellId == -1){
299 aParticle = GenerateAuger(Z, givenShellId);
300 }
301 //else
302 // G4Exception("G4UAtomicDeexcitation::GenerateParticles()","de0002",JustWarning, "Energy deposited locally");
303
304 // if a particle is created, put it in the vector of new particles
305 if(aParticle!=0)
306 vectorOfParticles->push_back(aParticle);
307 else{;}
308 // one vacancy has been processed. Erase it.
309 vacancyArray.erase(vacancyArray.begin());
310 }
311 //----------------------
312 //End of Auger cascade by Burkhant Suerfu on March 24 2015 (Bugzilla 1727)
313
314 } // Auger cascade is active
315}
G4int ShellId() const
G4int SelectTypeOfTransition(G4int Z, G4int shellId)
G4DynamicParticle * GenerateAuger(G4int Z, G4int shellId)
Generates a particle from a non-radiative transition and returns it.
G4DynamicParticle * GenerateFluorescence(G4int Z, G4int shellId, G4int provShellId)
Generates a particle from a radiative transition and returns it.

References GenerateAuger(), GenerateFluorescence(), G4VAtomDeexcitation::IsAugerCascadeActive(), minElectronEnergy, minGammaEnergy, newShellId, SelectTypeOfTransition(), G4AtomicShell::ShellId(), vacancyArray, and Z.

◆ GenerateParticles() [2/2]

void G4VAtomDeexcitation::GenerateParticles ( std::vector< G4DynamicParticle * > *  secVect,
const G4AtomicShell as,
G4int  Z,
G4int  coupleIndex 
)
inherited

Definition at line 235 of file G4VAtomDeexcitation.cc.

238{
239 G4double gCut = DBL_MAX;
240 if(ignoreCuts) {
241 gCut = 0.0;
242 } else if (nullptr != theCoupleTable) {
243 gCut = (*(theCoupleTable->GetEnergyCutsVector(0)))[idx];
244 }
245 if(gCut < as->BindingEnergy()) {
246 G4double eCut = DBL_MAX;
247 if(CheckAugerActiveRegion(idx)) {
248 if(ignoreCuts) {
249 eCut = 0.0;
250 } else if (nullptr != theCoupleTable) {
251 eCut = (*(theCoupleTable->GetEnergyCutsVector(1)))[idx];
252 }
253 }
254 GenerateParticles(v, as, Z, gCut, eCut);
255 }
256}

References G4VAtomDeexcitation::CheckAugerActiveRegion(), DBL_MAX, G4VAtomDeexcitation::GenerateParticles(), G4ProductionCutsTable::GetEnergyCutsVector(), G4VAtomDeexcitation::ignoreCuts, G4VAtomDeexcitation::theCoupleTable, and Z.

Referenced by G4VAtomDeexcitation::AlongStepDeexcitation(), G4ECDecay::DecayIt(), G4ITDecay::DecayIt(), G4VAtomDeexcitation::GenerateParticles(), G4DNABornIonisationModel1::SampleSecondaries(), G4DNABornIonisationModel2::SampleSecondaries(), G4DNACPA100IonisationModel::SampleSecondaries(), G4DNAEmfietzoglouIonisationModel::SampleSecondaries(), G4DNARelativisticIonisationModel::SampleSecondaries(), G4DNARuddIonisationExtendedModel::SampleSecondaries(), G4DNARuddIonisationModel::SampleSecondaries(), G4LivermoreComptonModel::SampleSecondaries(), G4LivermorePhotoElectricModel::SampleSecondaries(), G4LivermorePolarizedComptonModel::SampleSecondaries(), G4LowEPComptonModel::SampleSecondaries(), G4LowEPPolarizedComptonModel::SampleSecondaries(), G4MicroElecInelasticModel::SampleSecondaries(), G4MicroElecInelasticModel_new::SampleSecondaries(), G4PenelopeComptonModel::SampleSecondaries(), G4PenelopeIonisationModel::SampleSecondaries(), G4PenelopePhotoElectricModel::SampleSecondaries(), G4KleinNishinaModel::SampleSecondaries(), and G4PEEffectFluoModel::SampleSecondaries().

◆ GetAtomicShell()

const G4AtomicShell * G4UAtomicDeexcitation::GetAtomicShell ( G4int  Z,
G4AtomicShellEnumerator  shell 
)
overridevirtual

Get atomic shell by shell index, used by discrete processes (for example, photoelectric), when shell vacancy sampled by the model

Implements G4VAtomDeexcitation.

Definition at line 179 of file G4UAtomicDeexcitation.cc.

180{
181 return transitionManager->Shell(Z, size_t(shell));
182}
G4AtomicShell * Shell(G4int Z, size_t shellIndex) const

References G4AtomicTransitionManager::Shell(), transitionManager, and Z.

◆ GetListOfActiveAtoms()

const std::vector< G4bool > & G4VAtomDeexcitation::GetListOfActiveAtoms ( ) const
inlineinherited

Definition at line 244 of file G4VAtomDeexcitation.hh.

245{
246 return activeZ;
247}

References G4VAtomDeexcitation::activeZ.

◆ GetName()

const G4String & G4VAtomDeexcitation::GetName ( ) const
inlineinherited

Definition at line 238 of file G4VAtomDeexcitation.hh.

239{
240 return name;
241}

References G4VAtomDeexcitation::name.

Referenced by G4VAtomDeexcitation::SetDeexcitationActiveRegion().

◆ GetShellIonisationCrossSectionPerAtom()

G4double G4UAtomicDeexcitation::GetShellIonisationCrossSectionPerAtom ( const G4ParticleDefinition pdef,
G4int  Z,
G4AtomicShellEnumerator  shell,
G4double  kinE,
const G4Material mat = nullptr 
)
overridevirtual

access or compute PIXE cross section

Implements G4VAtomDeexcitation.

Definition at line 320 of file G4UAtomicDeexcitation.cc.

326{
327 // we must put a control on the shell that are passed:
328 // some shells should not pass (line "0" or "2")
329
330 // check atomic number
331 G4double xsec = 0.0;
332 if(Z > 93 || Z < 6 ) { return xsec; } //corrected by alf - Z<6 missing
333 G4int idx = G4int(shellEnum);
334 if(idx >= G4AtomicShells::GetNumberOfShells(Z)) { return xsec; }
335
336 if(pdef == theElectron || pdef == thePositron) {
337 xsec = ePIXEshellCS->CrossSection(Z,shellEnum,kineticEnergy,0.0,mat);
338 return xsec;
339 }
340
341 G4double mass = pdef->GetPDGMass();
342 G4double escaled = kineticEnergy;
343 G4double q2 = 0.0;
344
345 // scaling to protons
346 if ((pdef->GetParticleName() != "proton" && pdef->GetParticleName() != "alpha" ) )
347 {
348 mass = proton_mass_c2;
349 escaled = kineticEnergy*mass/(pdef->GetPDGMass());
350
351 if(mat) {
352 q2 = emcorr->EffectiveChargeSquareRatio(pdef,mat,kineticEnergy);
353 } else {
354 G4double q = pdef->GetPDGCharge()/eplus;
355 q2 = q*q;
356 }
357 }
358
359 if(PIXEshellCS) { xsec = PIXEshellCS->CrossSection(Z,shellEnum,escaled,mass,mat); }
360 if(xsec < 1e-100) {
361 xsec = anaPIXEshellCS->CrossSection(Z,shellEnum,escaled,mass,mat);
362 }
363
364 if (q2) {xsec *= q2;}
365
366 return xsec;
367}
static constexpr double eplus
Definition: G4SIunits.hh:184
static G4int GetNumberOfShells(G4int Z)
G4double EffectiveChargeSquareRatio(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double GetPDGCharge() const
const G4String & GetParticleName() const
virtual G4double CrossSection(G4int Z, G4AtomicShellEnumerator shell, G4double incidentEnergy, G4double mass, const G4Material *mat)=0
float proton_mass_c2
Definition: hepunit.py:274

References anaPIXEshellCS, G4VhShellCrossSection::CrossSection(), G4EmCorrections::EffectiveChargeSquareRatio(), emcorr, ePIXEshellCS, eplus, G4AtomicShells::GetNumberOfShells(), G4ParticleDefinition::GetParticleName(), G4ParticleDefinition::GetPDGCharge(), G4ParticleDefinition::GetPDGMass(), PIXEshellCS, source.hepunit::proton_mass_c2, theElectron, thePositron, and Z.

Referenced by ComputeShellIonisationCrossSectionPerAtom().

◆ GetVerboseLevel()

G4int G4VAtomDeexcitation::GetVerboseLevel ( ) const
inlineinherited

Definition at line 254 of file G4VAtomDeexcitation.hh.

255{
256 return verbose;
257}

References G4VAtomDeexcitation::verbose.

◆ InitialiseAtomicDeexcitation()

void G4VAtomDeexcitation::InitialiseAtomicDeexcitation ( )
inherited

Definition at line 87 of file G4VAtomDeexcitation.cc.

88{
90 theParameters->DefineRegParamForDeex(this);
91
92 // Define list of couples
95
96 // needed for unit tests
97 size_t nn = std::max(nCouples, 1);
98 if(activeDeexcitationMedia.size() != nn) {
99 activeDeexcitationMedia.resize(nn, false);
100 activeAugerMedia.resize(nn, false);
101 activePIXEMedia.resize(nn, false);
102 }
103 if(activeZ.size() != 93) { activeZ.resize(93, false); }
104
105 // initialisation of flags and options
106 // normally there is no locksed flags
107 if(!isActiveLocked) { isActive = theParameters->Fluo(); }
108 if(!isAugerLocked) { flagAuger = theParameters->Auger(); }
109 if(!isPIXELocked) { flagPIXE = theParameters->Pixe(); }
110 ignoreCuts = theParameters->DeexcitationIgnoreCut();
111
112 // Define list of regions
113 size_t nRegions = deRegions.size();
114 // check if deexcitation is active for the given run
115 if(!isActive && 0 == nRegions) { return; }
116
117 // if no active regions add a world
118 if(0 == nRegions) {
120 nRegions = deRegions.size();
121 }
122
123 if(0 < verbose) {
124 G4cout << G4endl;
125 G4cout << "### === Deexcitation model " << name
126 << " is activated for " << nRegions;
127 if(1 == nRegions) { G4cout << " region:" << G4endl; }
128 else { G4cout << " regions:" << G4endl;}
129 }
130
131 // Identify active media
132 const G4RegionStore* regionStore = G4RegionStore::GetInstance();
133 for(size_t j=0; j<nRegions; ++j) {
134 const G4Region* reg = regionStore->GetRegion(activeRegions[j], false);
135 if(nullptr != reg && 0 < nCouples) {
136 const G4ProductionCuts* rpcuts = reg->GetProductionCuts();
137 if(0 < verbose) {
138 G4cout << " " << activeRegions[j]
139 << " " << deRegions[j] << " " << AugerRegions[j]
140 << " " << PIXERegions[j] << G4endl;
141 }
142 for(G4int i=0; i<nCouples; ++i) {
143 const G4MaterialCutsCouple* couple =
145 if (couple->GetProductionCuts() == rpcuts) {
149 }
150 }
151 }
152 }
154 //G4cout << nelm << G4endl;
155 for(G4int k=0; k<nelm; ++k) {
156 G4int Z = (*(G4Element::GetElementTable()))[k]->GetZasInt();
157 if(Z > 5 && Z < 93) {
158 activeZ[Z] = true;
159 //G4cout << "!!! Active de-excitation Z= " << Z << G4endl;
160 }
161 }
162
163 // Initialise derived class
165
166 if(0 < verbose && flagAuger) {
167 G4cout << "### === Auger flag: " << flagAuger
168 << G4endl;
169 }
170 if(0 < verbose) {
171 G4cout << "### === Ignore cuts flag: " << ignoreCuts
172 << G4endl;
173 }
174 if(0 < verbose && flagPIXE) {
175 G4cout << "### === PIXE model for hadrons: "
176 << theParameters->PIXECrossSectionModel()
177 << G4endl;
178 G4cout << "### === PIXE model for e+-: "
179 << theParameters->PIXEElectronCrossSectionModel()
180 << G4endl;
181 }
182}
static const G4double reg
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
static G4ElementTable * GetElementTable()
Definition: G4Element.cc:397
static size_t GetNumberOfElements()
Definition: G4Element.cc:404
static G4EmParameters * Instance()
const G4String & PIXECrossSectionModel()
const G4String & PIXEElectronCrossSectionModel()
G4bool Fluo() const
G4bool Pixe() const
void DefineRegParamForDeex(G4VAtomDeexcitation *) const
G4bool DeexcitationIgnoreCut() const
G4bool Auger() const
G4ProductionCuts * GetProductionCuts() const
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
std::size_t GetTableSize() const
static G4ProductionCutsTable * GetProductionCutsTable()
static G4RegionStore * GetInstance()
G4Region * GetRegion(const G4String &name, G4bool verbose=true) const
std::vector< G4String > activeRegions
std::vector< G4bool > AugerRegions
std::vector< G4bool > deRegions
std::vector< G4bool > PIXERegions
void SetDeexcitationActiveRegion(const G4String &rname, G4bool valDeexcitation, G4bool valAuger, G4bool valPIXE)
virtual void InitialiseForNewRun()=0
T max(const T t1, const T t2)
brief Return the largest of the two arguments

References G4VAtomDeexcitation::activeAugerMedia, G4VAtomDeexcitation::activeDeexcitationMedia, G4VAtomDeexcitation::activePIXEMedia, G4VAtomDeexcitation::activeRegions, G4VAtomDeexcitation::activeZ, G4EmParameters::Auger(), G4VAtomDeexcitation::AugerRegions, G4EmParameters::DeexcitationIgnoreCut(), G4EmParameters::DefineRegParamForDeex(), G4VAtomDeexcitation::deRegions, G4VAtomDeexcitation::flagAuger, G4VAtomDeexcitation::flagPIXE, G4EmParameters::Fluo(), G4cout, G4endl, G4Element::GetElementTable(), G4RegionStore::GetInstance(), G4ProductionCutsTable::GetMaterialCutsCouple(), G4Element::GetNumberOfElements(), G4MaterialCutsCouple::GetProductionCuts(), G4ProductionCutsTable::GetProductionCutsTable(), G4RegionStore::GetRegion(), G4ProductionCutsTable::GetTableSize(), G4VAtomDeexcitation::ignoreCuts, G4VAtomDeexcitation::InitialiseForNewRun(), G4EmParameters::Instance(), G4VAtomDeexcitation::isActive, G4VAtomDeexcitation::isActiveLocked, G4VAtomDeexcitation::isAugerLocked, G4VAtomDeexcitation::isPIXELocked, G4INCL::Math::max(), G4VAtomDeexcitation::name, G4VAtomDeexcitation::nCouples, G4InuclParticleNames::nn, G4EmParameters::Pixe(), G4EmParameters::PIXECrossSectionModel(), G4EmParameters::PIXEElectronCrossSectionModel(), G4VAtomDeexcitation::PIXERegions, reg, G4VAtomDeexcitation::SetDeexcitationActiveRegion(), G4VAtomDeexcitation::theCoupleTable, G4VAtomDeexcitation::verbose, and Z.

Referenced by LBE::ConstructGeneral(), and G4LossTableManager::ResetParameters().

◆ InitialiseForExtraAtom()

void G4UAtomicDeexcitation::InitialiseForExtraAtom ( G4int  Z)
overridevirtual

Implements G4VAtomDeexcitation.

Definition at line 173 of file G4UAtomicDeexcitation.cc.

174{}

◆ InitialiseForNewRun()

void G4UAtomicDeexcitation::InitialiseForNewRun ( )
overridevirtual

initialisation methods

Implements G4VAtomDeexcitation.

Definition at line 103 of file G4UAtomicDeexcitation.cc.

104{
105 if(!IsFluoActive()) { return; }
107 if(!IsPIXEActive()) { return; }
108
109 if(!anaPIXEshellCS) {
110 anaPIXEshellCS = new G4teoCrossSection("ECPSSR_Analytical");
111 }
112 G4cout << G4endl;
113 G4cout << "### === G4UAtomicDeexcitation::InitialiseForNewRun()" << G4endl;
114
116 G4String namePIXExsModel = param->PIXECrossSectionModel();
117 G4String namePIXExsElectronModel = param->PIXEElectronCrossSectionModel();
118
119 // Check if old cross section for p/ion should be deleted
120 if(PIXEshellCS && namePIXExsModel != PIXEshellCS->GetName())
121 {
122 delete PIXEshellCS;
123 PIXEshellCS = nullptr;
124 }
125
126 // Instantiate new proton/ion cross section
127 if(!PIXEshellCS) {
128 if (namePIXExsModel == "ECPSSR_FormFactor")
129 {
130 PIXEshellCS = new G4teoCrossSection(namePIXExsModel);
131 }
132 else if(namePIXExsModel == "ECPSSR_ANSTO")
133 {
134 PIXEshellCS = new G4teoCrossSection(namePIXExsModel);
135 }
136 else if(namePIXExsModel == "Empirical")
137 {
138 PIXEshellCS = new G4empCrossSection(namePIXExsModel);
139 }
140 }
141
142 // Check if old cross section for e+- should be deleted
143 if(ePIXEshellCS && namePIXExsElectronModel != ePIXEshellCS->GetName())
144 {
145 delete ePIXEshellCS;
146 ePIXEshellCS = nullptr;
147 }
148
149 // Instantiate new e+- cross section
150 if(!ePIXEshellCS)
151 {
152 if(namePIXExsElectronModel == "Empirical")
153 {
154 ePIXEshellCS = new G4empCrossSection("Empirical");
155 }
156 else if(namePIXExsElectronModel == "ECPSSR_Analytical")
157 {
158 ePIXEshellCS = new G4teoCrossSection("ECPSSR_Analytical");
159 }
160 else if (namePIXExsElectronModel == "Penelope")
161 {
163 }
164 else
165 {
167 }
168 }
169}
void Initialise()
needs to be called once from other code before start of run
const G4String & GetName() const

References anaPIXEshellCS, ePIXEshellCS, G4cout, G4endl, G4VhShellCrossSection::GetName(), G4AtomicTransitionManager::Initialise(), G4EmParameters::Instance(), G4VAtomDeexcitation::IsFluoActive(), G4VAtomDeexcitation::IsPIXEActive(), G4EmParameters::PIXECrossSectionModel(), G4EmParameters::PIXEElectronCrossSectionModel(), PIXEshellCS, and transitionManager.

◆ IsAugerActive()

G4bool G4VAtomDeexcitation::IsAugerActive ( ) const
inlineinherited

Definition at line 213 of file G4VAtomDeexcitation.hh.

214{
215 return flagAuger;
216}

References G4VAtomDeexcitation::flagAuger.

Referenced by GenerateAuger().

◆ IsAugerCascadeActive()

G4bool G4VAtomDeexcitation::IsAugerCascadeActive ( ) const
inlineinherited

Definition at line 223 of file G4VAtomDeexcitation.hh.

224{
225 return flagAuger;
226}

References G4VAtomDeexcitation::flagAuger.

Referenced by GenerateAuger(), GenerateFluorescence(), and GenerateParticles().

◆ IsFluoActive()

G4bool G4VAtomDeexcitation::IsFluoActive ( ) const
inlineinherited

◆ IsPIXEActive()

G4bool G4VAtomDeexcitation::IsPIXEActive ( ) const
inlineinherited

◆ operator=()

G4UAtomicDeexcitation & G4UAtomicDeexcitation::operator= ( const G4UAtomicDeexcitation right)
delete

◆ SelectTypeOfTransition()

G4int G4UAtomicDeexcitation::SelectTypeOfTransition ( G4int  Z,
G4int  shellId 
)
private

Decides wether a radiative transition is possible and, if it is, returns the identity of the starting shell for the transition

Definition at line 398 of file G4UAtomicDeexcitation.cc.

399{
400 if (shellId <=0 ) {
401 //G4Exception("G4UAtomicDeexcitation::SelecttypeOfTransition()","de0002",
402 // JustWarning, "Energy deposited locally");
403 return 0;
404 }
405
406 G4int provShellId = -1;
407 G4int shellNum = 0;
409
410 const G4FluoTransition* refShell =
411 transitionManager->ReachableShell(Z,maxNumOfShells-1);
412
413 // This loop gives shellNum the value of the index of shellId
414 // in the vector storing the list of the shells reachable through
415 // a radiative transition
416 if ( shellId <= refShell->FinalShellId())
417 {
418 while (shellId != transitionManager->ReachableShell(Z,shellNum)->FinalShellId())
419 {
420 if(shellNum ==maxNumOfShells-1)
421 {
422 break;
423 }
424 shellNum++;
425 }
426 G4int transProb = 0; //AM change 29/6/07 was 1
427
428 G4double partialProb = G4UniformRand();
429 G4double partSum = 0;
430 const G4FluoTransition* aShell = transitionManager->ReachableShell(Z,shellNum);
431 G4int trSize = (aShell->TransitionProbabilities()).size();
432
433 // Loop over the shells wich can provide an electron for a
434 // radiative transition towards shellId:
435 // in every loop the partial sum of the first transProb shells
436 // is calculated and compared with a random number [0,1].
437 // If the partial sum is greater, the shell whose index is transProb
438 // is chosen as the starting shell for a radiative transition
439 // and its identity is returned
440 // Else, terminateded the loop, -1 is returned
441 while(transProb < trSize){
442 partSum += aShell->TransitionProbability(transProb);
443
444 if(partialProb <= partSum)
445 {
446 provShellId = aShell->OriginatingShellId(transProb);
447 break;
448 }
449 transProb++;
450 }
451 // here provShellId is the right one or is -1.
452 // if -1, the control is passed to the Auger generation part of the package
453 }
454 else
455 {
456 provShellId = -1;
457 }
458 return provShellId;
459}
const G4FluoTransition * ReachableShell(G4int Z, size_t shellIndex) const
const G4DataVector & TransitionProbabilities() const
Return the probabilities of the transitions.
G4int OriginatingShellId(G4int index) const
Given the index of the originating shells returns its identity.
G4double TransitionProbability(G4int index) const
G4int FinalShellId() const
Return the identity if the vacancy.

References G4FluoTransition::FinalShellId(), G4UniformRand, G4AtomicTransitionManager::NumberOfReachableShells(), G4FluoTransition::OriginatingShellId(), G4AtomicTransitionManager::ReachableShell(), transitionManager, G4FluoTransition::TransitionProbabilities(), G4FluoTransition::TransitionProbability(), and Z.

Referenced by GenerateParticles().

◆ SetAuger()

void G4VAtomDeexcitation::SetAuger ( G4bool  val)
inlineinherited

◆ SetAugerCascade()

void G4VAtomDeexcitation::SetAugerCascade ( G4bool  val)
inlineinherited

Definition at line 218 of file G4VAtomDeexcitation.hh.

219{
220 SetAuger(val);
221}

References G4VAtomDeexcitation::SetAuger().

◆ SetCutForAugerElectrons()

void G4UAtomicDeexcitation::SetCutForAugerElectrons ( G4double  cut)

Set threshold energy for Auger electron production.

Definition at line 378 of file G4UAtomicDeexcitation.cc.

379{
380 minElectronEnergy = cut;
381}

References minElectronEnergy.

◆ SetCutForSecondaryPhotons()

void G4UAtomicDeexcitation::SetCutForSecondaryPhotons ( G4double  cut)

Set threshold energy for fluorescence.

Definition at line 371 of file G4UAtomicDeexcitation.cc.

372{
373 minGammaEnergy = cut;
374}

References minGammaEnergy.

◆ SetDeexcitationActiveRegion()

void G4VAtomDeexcitation::SetDeexcitationActiveRegion ( const G4String rname,
G4bool  valDeexcitation,
G4bool  valAuger,
G4bool  valPIXE 
)
inherited

Definition at line 187 of file G4VAtomDeexcitation.cc.

191{
192 // no PIXE in parallel world
193 if(rname == "DefaultRegionForParallelWorld") { return; }
194
195 G4String ss = rname;
196 /*
197 G4cout << "### G4VAtomDeexcitation::SetDeexcitationActiveRegion " << ss
198 << " " << valDeexcitation << " " << valAuger
199 << " " << valPIXE << G4endl;
200 */
201 if(ss == "world" || ss == "World" || ss == "WORLD") {
202 ss = "DefaultRegionForTheWorld";
203 }
204 size_t n = deRegions.size();
205 for(size_t i=0; i<n; ++i) {
206
207 // Region already exist
208 if(ss == activeRegions[i]) {
209 deRegions[i] = valDeexcitation;
210 AugerRegions[i] = valAuger;
211 PIXERegions[i] = valPIXE;
212 return;
213 }
214 }
215 // New region
216 activeRegions.push_back(ss);
217 deRegions.push_back(valDeexcitation);
218 AugerRegions.push_back(valAuger);
219 PIXERegions.push_back(valPIXE);
220
221 // if de-excitation defined for the world volume
222 // it should be active for all G4Regions
223 if(ss == "DefaultRegionForTheWorld") {
225 G4int nn = regions->size();
226 for(G4int i=0; i<nn; ++i) {
227 if(ss == (*regions)[i]->GetName()) { continue; }
228 SetDeexcitationActiveRegion((*regions)[i]->GetName(), valDeexcitation,
229 valAuger, valPIXE);
230
231 }
232 }
233}
const G4String & GetName() const

References G4VAtomDeexcitation::activeRegions, G4VAtomDeexcitation::AugerRegions, G4VAtomDeexcitation::deRegions, G4RegionStore::GetInstance(), G4VAtomDeexcitation::GetName(), CLHEP::detail::n, G4InuclParticleNames::nn, G4VAtomDeexcitation::PIXERegions, and G4VAtomDeexcitation::SetDeexcitationActiveRegion().

Referenced by G4EmLowEParameters::DefineRegParamForDeex(), G4VAtomDeexcitation::InitialiseAtomicDeexcitation(), and G4VAtomDeexcitation::SetDeexcitationActiveRegion().

◆ SetFluo()

void G4VAtomDeexcitation::SetFluo ( G4bool  val)
inlineinherited

◆ SetPIXE()

void G4VAtomDeexcitation::SetPIXE ( G4bool  val)
inlineinherited

Definition at line 228 of file G4VAtomDeexcitation.hh.

229{
230 if(!isPIXELocked) { flagPIXE = val; isPIXELocked = true; }
231}

References G4VAtomDeexcitation::flagPIXE, and G4VAtomDeexcitation::isPIXELocked.

◆ SetVerboseLevel()

void G4VAtomDeexcitation::SetVerboseLevel ( G4int  val)
inlineinherited

Definition at line 249 of file G4VAtomDeexcitation.hh.

250{
251 verbose = val;
252}

References G4VAtomDeexcitation::verbose.

Referenced by G4LossTableManager::ResetParameters().

Field Documentation

◆ activeAugerMedia

std::vector<G4bool> G4VAtomDeexcitation::activeAugerMedia
privateinherited

◆ activeDeexcitationMedia

std::vector<G4bool> G4VAtomDeexcitation::activeDeexcitationMedia
privateinherited

◆ activePIXEMedia

std::vector<G4bool> G4VAtomDeexcitation::activePIXEMedia
privateinherited

◆ activeRegions

std::vector<G4String> G4VAtomDeexcitation::activeRegions
privateinherited

◆ activeZ

std::vector<G4bool> G4VAtomDeexcitation::activeZ
privateinherited

◆ anaPIXEshellCS

G4VhShellCrossSection* G4UAtomicDeexcitation::anaPIXEshellCS
private

◆ AugerRegions

std::vector<G4bool> G4VAtomDeexcitation::AugerRegions
privateinherited

◆ deRegions

std::vector<G4bool> G4VAtomDeexcitation::deRegions
privateinherited

◆ emcorr

G4EmCorrections* G4UAtomicDeexcitation::emcorr
private

◆ ePIXEshellCS

G4VhShellCrossSection* G4UAtomicDeexcitation::ePIXEshellCS
private

◆ flagAuger

G4bool G4VAtomDeexcitation::flagAuger = false
privateinherited

◆ flagPIXE

G4bool G4VAtomDeexcitation::flagPIXE = false
privateinherited

◆ gamma

const G4ParticleDefinition* G4VAtomDeexcitation::gamma
privateinherited

◆ ignoreCuts

G4bool G4VAtomDeexcitation::ignoreCuts = false
privateinherited

◆ isActive

G4bool G4VAtomDeexcitation::isActive = false
privateinherited

◆ isActiveLocked

G4bool G4VAtomDeexcitation::isActiveLocked = false
privateinherited

◆ isAugerLocked

G4bool G4VAtomDeexcitation::isAugerLocked = false
privateinherited

◆ isPIXELocked

G4bool G4VAtomDeexcitation::isPIXELocked = false
privateinherited

◆ minElectronEnergy

G4double G4UAtomicDeexcitation::minElectronEnergy
private

◆ minGammaEnergy

G4double G4UAtomicDeexcitation::minGammaEnergy
private

Data member which stores the shells to be filled by the radiative transition

Definition at line 141 of file G4UAtomicDeexcitation.hh.

Referenced by GenerateFluorescence(), GenerateParticles(), and SetCutForSecondaryPhotons().

◆ name

G4String G4VAtomDeexcitation::name
privateinherited

◆ nCouples

G4int G4VAtomDeexcitation::nCouples = 0
privateinherited

◆ newShellId

G4int G4UAtomicDeexcitation::newShellId
private

◆ PIXERegions

std::vector<G4bool> G4VAtomDeexcitation::PIXERegions
privateinherited

◆ PIXEshellCS

G4VhShellCrossSection* G4UAtomicDeexcitation::PIXEshellCS
private

Data member for the calculation of the proton and alpha ionisation XS.

Definition at line 127 of file G4UAtomicDeexcitation.hh.

Referenced by G4UAtomicDeexcitation(), GetShellIonisationCrossSectionPerAtom(), InitialiseForNewRun(), and ~G4UAtomicDeexcitation().

◆ theCoupleTable

const G4ProductionCutsTable* G4VAtomDeexcitation::theCoupleTable = nullptr
privateinherited

◆ theElectron

const G4ParticleDefinition* G4UAtomicDeexcitation::theElectron
private

◆ thePositron

const G4ParticleDefinition* G4UAtomicDeexcitation::thePositron
private

◆ transitionManager

G4AtomicTransitionManager* G4UAtomicDeexcitation::transitionManager
private

◆ vacancyArray

std::vector<int> G4UAtomicDeexcitation::vacancyArray
private

◆ vdyn

std::vector<G4DynamicParticle*> G4VAtomDeexcitation::vdyn
privateinherited

◆ verbose

G4int G4VAtomDeexcitation::verbose = 1
privateinherited

The documentation for this class was generated from the following files: