#include <G4VAtomDeexcitation.hh>
Inheritance diagram for G4VAtomDeexcitation:
Definition at line 63 of file G4VAtomDeexcitation.hh.
G4VAtomDeexcitation::G4VAtomDeexcitation | ( | const G4String & | modname = "Deexcitation" , |
|
const G4String & | pixename = "" | |||
) |
Definition at line 65 of file G4VAtomDeexcitation.cc.
00067 : lowestKinEnergy(keV), verbose(1), name(modname), namePIXE(pname), 00068 nameElectronPIXE(""), isActive(false), flagAuger(false), flagPIXE(false) 00069 { 00070 vdyn.reserve(5); 00071 theCoupleTable = 0; 00072 }
G4VAtomDeexcitation::~G4VAtomDeexcitation | ( | ) | [virtual] |
void G4VAtomDeexcitation::AlongStepDeexcitation | ( | std::vector< G4Track * > & | tracks, | |
const G4Step & | step, | |||
G4double & | eLoss, | |||
G4int | coupleIndex | |||
) |
Definition at line 198 of file G4VAtomDeexcitation.cc.
References G4AtomicShell::BindingEnergy(), G4InuclSpecialFunctions::bindingEnergy(), CheckAugerActiveRegion(), DBL_MAX, G4lrint(), G4UniformRand, GenerateParticles(), GetAtomicShell(), G4Track::GetDefinition(), G4Material::GetElementVector(), G4ProductionCutsTable::GetEnergyCutsVector(), G4StepPoint::GetGlobalTime(), G4StepPoint::GetKineticEnergy(), G4StepPoint::GetMaterial(), G4Material::GetNumberOfElements(), G4StepPoint::GetPosition(), G4Step::GetPostStepPoint(), G4Step::GetPreStepPoint(), GetShellIonisationCrossSectionPerAtom(), G4Step::GetStepLength(), G4Step::GetTrack(), and G4Material::GetVecNbOfAtomsPerVolume().
Referenced by G4VEnergyLossProcess::AlongStepDoIt().
00202 { 00203 G4double truelength = step.GetStepLength(); 00204 if(!flagPIXE && !activePIXEMedia[coupleIndex]) { return; } 00205 if(eLossMax <= 0.0 || truelength <= 0.0) { return; } 00206 00207 // step parameters 00208 const G4StepPoint* preStep = step.GetPreStepPoint(); 00209 G4ThreeVector prePos = preStep->GetPosition(); 00210 G4ThreeVector delta = step.GetPostStepPoint()->GetPosition() - prePos; 00211 G4double preTime = preStep->GetGlobalTime(); 00212 G4double dt = step.GetPostStepPoint()->GetGlobalTime() - preTime; 00213 00214 // particle parameters 00215 const G4Track* track = step.GetTrack(); 00216 const G4ParticleDefinition* part = track->GetDefinition(); 00217 G4double ekin = preStep->GetKineticEnergy(); 00218 00219 // media parameters 00220 G4double gCut = (*theCoupleTable->GetEnergyCutsVector(0))[coupleIndex]; 00221 G4double eCut = DBL_MAX; 00222 if(CheckAugerActiveRegion(coupleIndex)) { 00223 eCut = (*theCoupleTable->GetEnergyCutsVector(1))[coupleIndex]; 00224 } 00225 00226 //G4cout<<"!Sample PIXE gCut(MeV)= "<<gCut<<" eCut(MeV)= "<<eCut 00227 // <<" Ekin(MeV)= " << ekin/MeV << G4endl; 00228 00229 const G4Material* material = preStep->GetMaterial(); 00230 const G4ElementVector* theElementVector = material->GetElementVector(); 00231 const G4double* theAtomNumDensityVector = material->GetVecNbOfAtomsPerVolume(); 00232 G4int nelm = material->GetNumberOfElements(); 00233 00234 // loop over deexcitations 00235 for(G4int i=0; i<nelm; ++i) { 00236 G4int Z = G4lrint((*theElementVector)[i]->GetZ()); 00237 if(activeZ[Z] && Z < 93) { 00238 G4int nshells = std::min(9,(*theElementVector)[i]->GetNbOfAtomicShells()); 00239 G4double rho = truelength*theAtomNumDensityVector[i]; 00240 //G4cout << " Z " << Z <<" is active x(mm)= " << truelength/mm << G4endl; 00241 for(G4int ii=0; ii<nshells; ++ii) { 00242 G4AtomicShellEnumerator as = G4AtomicShellEnumerator(ii); 00243 const G4AtomicShell* shell = GetAtomicShell(Z, as); 00244 G4double bindingEnergy = shell->BindingEnergy(); 00245 00246 if(gCut > bindingEnergy) { break; } 00247 00248 if(eLossMax > bindingEnergy) { 00249 G4double sig = rho* 00250 GetShellIonisationCrossSectionPerAtom(part, Z, as, ekin, material); 00251 00252 // mfp is mean free path in units of step size 00253 if(sig > 0.0) { 00254 G4double mfp = 1.0/sig; 00255 G4double stot = 0.0; 00256 //G4cout << " Shell " << ii << " mfp(mm)= " << mfp/mm << G4endl; 00257 // sample ionisation points 00258 do { 00259 stot -= mfp*std::log(G4UniformRand()); 00260 if( stot > 1.0 || eLossMax < bindingEnergy) { break; } 00261 // sample deexcitation 00262 vdyn.clear(); 00263 GenerateParticles(&vdyn, shell, Z, gCut, eCut); 00264 G4int nsec = vdyn.size(); 00265 if(nsec > 0) { 00266 G4ThreeVector r = prePos + stot*delta; 00267 G4double time = preTime + stot*dt; 00268 for(G4int j=0; j<nsec; ++j) { 00269 G4DynamicParticle* dp = vdyn[j]; 00270 G4double e = dp->GetKineticEnergy(); 00271 00272 // save new secondary if there is enough energy 00273 if(eLossMax >= e) { 00274 eLossMax -= e; 00275 G4Track* t = new G4Track(dp, time, r); 00276 tracks.push_back(t); 00277 } else { 00278 delete dp; 00279 } 00280 } 00281 } 00282 } while (stot < 1.0); 00283 } 00284 } 00285 } 00286 } 00287 } 00288 return; 00289 }
Definition at line 277 of file G4VAtomDeexcitation.hh.
Referenced by AlongStepDeexcitation(), and GenerateParticles().
Definition at line 271 of file G4VAtomDeexcitation.hh.
Referenced by G4PenelopePhotoElectricModel::SampleSecondaries(), G4PenelopeIonisationModel::SampleSecondaries(), G4PenelopeComptonModel::SampleSecondaries(), G4PEEffectFluoModel::SampleSecondaries(), G4LowEPComptonModel::SampleSecondaries(), G4LivermorePolarizedPhotoElectricModel::SampleSecondaries(), G4LivermorePhotoElectricModel::SampleSecondaries(), G4LivermoreComptonModifiedModel::SampleSecondaries(), G4LivermoreComptonModel::SampleSecondaries(), and G4KleinNishinaModel::SampleSecondaries().
virtual G4double G4VAtomDeexcitation::ComputeShellIonisationCrossSectionPerAtom | ( | const G4ParticleDefinition * | , | |
G4int | Z, | |||
G4AtomicShellEnumerator | shell, | |||
G4double | kinE, | |||
const G4Material * | mat = 0 | |||
) | [pure virtual] |
Implemented in G4UAtomicDeexcitation.
Referenced by G4EmCalculator::ComputeShellIonisationCrossSectionPerAtom().
virtual void G4VAtomDeexcitation::GenerateParticles | ( | std::vector< G4DynamicParticle * > * | secVect, | |
const G4AtomicShell * | , | |||
G4int | Z, | |||
G4double | gammaCut, | |||
G4double | eCut | |||
) | [pure virtual] |
Implemented in G4UAtomicDeexcitation.
void G4VAtomDeexcitation::GenerateParticles | ( | std::vector< G4DynamicParticle * > * | secVect, | |
const G4AtomicShell * | , | |||
G4int | Z, | |||
G4int | coupleIndex | |||
) | [inline] |
Definition at line 284 of file G4VAtomDeexcitation.hh.
References CheckAugerActiveRegion(), DBL_MAX, and G4ProductionCutsTable::GetEnergyCutsVector().
Referenced by AlongStepDeexcitation(), G4NuclearDecayChannel::DecayIt(), G4PenelopePhotoElectricModel::SampleSecondaries(), G4PenelopeIonisationModel::SampleSecondaries(), G4PenelopeComptonModel::SampleSecondaries(), G4PEEffectFluoModel::SampleSecondaries(), G4MuElecInelasticModel::SampleSecondaries(), G4LowEPComptonModel::SampleSecondaries(), G4LivermorePolarizedPhotoElectricModel::SampleSecondaries(), G4LivermorePhotoElectricModel::SampleSecondaries(), G4LivermoreComptonModifiedModel::SampleSecondaries(), G4LivermoreComptonModel::SampleSecondaries(), G4KleinNishinaModel::SampleSecondaries(), G4DNARuddIonisationModel::SampleSecondaries(), G4DNARuddIonisationExtendedModel::SampleSecondaries(), and G4DNABornIonisationModel::SampleSecondaries().
00288 { 00289 G4double gCut = DBL_MAX; 00290 if (theCoupleTable) { 00291 gCut = (*(theCoupleTable->GetEnergyCutsVector(0)))[idx]; 00292 } 00293 if(gCut < as->BindingEnergy()) { 00294 G4double eCut = DBL_MAX; 00295 if(CheckAugerActiveRegion(idx)) { 00296 if (theCoupleTable) { 00297 eCut = (*(theCoupleTable->GetEnergyCutsVector(1)))[idx]; 00298 } 00299 } 00300 GenerateParticles(v, as, Z, gCut, eCut); 00301 } 00302 }
virtual const G4AtomicShell* G4VAtomDeexcitation::GetAtomicShell | ( | G4int | Z, | |
G4AtomicShellEnumerator | shell | |||
) | [pure virtual] |
Implemented in G4UAtomicDeexcitation.
Referenced by AlongStepDeexcitation(), G4NuclearDecayChannel::DecayIt(), G4PEEffectFluoModel::SampleSecondaries(), G4MuElecInelasticModel::SampleSecondaries(), G4LowEPComptonModel::SampleSecondaries(), G4LivermorePolarizedPhotoElectricModel::SampleSecondaries(), G4LivermorePhotoElectricModel::SampleSecondaries(), G4LivermoreComptonModifiedModel::SampleSecondaries(), G4LivermoreComptonModel::SampleSecondaries(), G4KleinNishinaModel::SampleSecondaries(), G4DNARuddIonisationModel::SampleSecondaries(), G4DNARuddIonisationExtendedModel::SampleSecondaries(), and G4DNABornIonisationModel::SampleSecondaries().
const std::vector< G4bool > & G4VAtomDeexcitation::GetListOfActiveAtoms | ( | ) | const [inline] |
const G4String & G4VAtomDeexcitation::GetName | ( | ) | const [inline] |
virtual G4double G4VAtomDeexcitation::GetShellIonisationCrossSectionPerAtom | ( | const G4ParticleDefinition * | , | |
G4int | Z, | |||
G4AtomicShellEnumerator | shell, | |||
G4double | kinE, | |||
const G4Material * | mat = 0 | |||
) | [pure virtual] |
Implemented in G4UAtomicDeexcitation.
Referenced by AlongStepDeexcitation(), and G4EmCalculator::GetShellIonisationCrossSectionPerAtom().
G4int G4VAtomDeexcitation::GetVerboseLevel | ( | ) | const [inline] |
void G4VAtomDeexcitation::InitialiseAtomicDeexcitation | ( | ) |
Definition at line 81 of file G4VAtomDeexcitation.cc.
References G4cout, G4endl, G4lrint(), G4Material::GetElementVector(), G4RegionStore::GetInstance(), G4ProductionCutsTable::GetMaterialCutsCouple(), G4Material::GetNumberOfElements(), G4Region::GetProductionCuts(), G4ProductionCutsTable::GetProductionCutsTable(), G4RegionStore::GetRegion(), G4ProductionCutsTable::GetTableSize(), InitialiseForNewRun(), IsPIXEActive(), and SetDeexcitationActiveRegion().
Referenced by G4RadioactiveDecay::BuildPhysicsTable(), and G4LossTableManager::BuildPhysicsTable().
00082 { 00083 // Define list of couples 00084 theCoupleTable = G4ProductionCutsTable::GetProductionCutsTable(); 00085 size_t numOfCouples = theCoupleTable->GetTableSize(); 00086 00087 // needed for unit tests 00088 if(0 == numOfCouples) { numOfCouples = 1; } 00089 00090 activeDeexcitationMedia.resize(numOfCouples, false); 00091 activeAugerMedia.resize(numOfCouples, false); 00092 activePIXEMedia.resize(numOfCouples, false); 00093 activeZ.resize(93, false); 00094 00095 // check if deexcitation is active for the given run 00096 if( !isActive ) { return; } 00097 00098 // Define list of regions 00099 size_t nRegions = deRegions.size(); 00100 00101 if(0 == nRegions) { 00102 SetDeexcitationActiveRegion("World",isActive,flagAuger,flagPIXE); 00103 nRegions = 1; 00104 } 00105 00106 if(0 < verbose) { 00107 G4cout << G4endl; 00108 G4cout << "### === Deexcitation model " << name 00109 << " is activated for " << nRegions; 00110 if(1 == nRegions) { G4cout << " region:" << G4endl; } 00111 else { G4cout << " regions:" << G4endl;} 00112 } 00113 00114 // Identify active media 00115 G4RegionStore* regionStore = G4RegionStore::GetInstance(); 00116 for(size_t j=0; j<nRegions; ++j) { 00117 const G4Region* reg = regionStore->GetRegion(activeRegions[j], false); 00118 const G4ProductionCuts* rpcuts = reg->GetProductionCuts(); 00119 if(0 < verbose) { 00120 G4cout << " " << activeRegions[j] << G4endl; 00121 } 00122 00123 for(size_t i=0; i<numOfCouples; ++i) { 00124 const G4MaterialCutsCouple* couple = 00125 theCoupleTable->GetMaterialCutsCouple(i); 00126 if (couple->GetProductionCuts() == rpcuts) { 00127 activeDeexcitationMedia[i] = deRegions[j]; 00128 activeAugerMedia[i] = AugerRegions[j]; 00129 activePIXEMedia[i] = PIXERegions[j]; 00130 const G4Material* mat = couple->GetMaterial(); 00131 const G4ElementVector* theElementVector = 00132 mat->GetElementVector(); 00133 G4int nelm = mat->GetNumberOfElements(); 00134 if(deRegions[j]) { 00135 for(G4int k=0; k<nelm; ++k) { 00136 G4int Z = G4lrint(((*theElementVector)[k])->GetZ()); 00137 if(Z > 5 && Z < 93) { 00138 activeZ[Z] = true; 00139 //G4cout << "!!! Active de-excitation Z= " << Z << G4endl; 00140 } 00141 } 00142 } 00143 } 00144 } 00145 } 00146 00147 // Initialise derived class 00148 InitialiseForNewRun(); 00149 00150 if(0 < verbose && flagPIXE) { 00151 G4cout << "### === PIXE model for hadrons: " << namePIXE 00152 << " " << IsPIXEActive() 00153 << G4endl; 00154 G4cout << "### === PIXE model for e+-: " << nameElectronPIXE 00155 << " " << IsPIXEActive() 00156 << G4endl; 00157 } 00158 }
virtual void G4VAtomDeexcitation::InitialiseForExtraAtom | ( | G4int | Z | ) | [pure virtual] |
Implemented in G4UAtomicDeexcitation.
virtual void G4VAtomDeexcitation::InitialiseForNewRun | ( | ) | [pure virtual] |
G4bool G4VAtomDeexcitation::IsAugerActive | ( | ) | const [inline] |
G4bool G4VAtomDeexcitation::IsFluoActive | ( | ) | const [inline] |
Definition at line 198 of file G4VAtomDeexcitation.hh.
Referenced by G4NuclearDecayChannel::DecayIt(), G4LivermorePolarizedPhotoElectricModel::Initialise(), G4LivermorePhotoElectricModel::Initialise(), and G4UAtomicDeexcitation::InitialiseForNewRun().
G4bool G4VAtomDeexcitation::IsPIXEActive | ( | ) | const [inline] |
Definition at line 220 of file G4VAtomDeexcitation.hh.
Referenced by G4VEnergyLossProcess::BuildPhysicsTable(), InitialiseAtomicDeexcitation(), and G4UAtomicDeexcitation::InitialiseForNewRun().
const G4String & G4VAtomDeexcitation::PIXECrossSectionModel | ( | ) | const [inline] |
Definition at line 243 of file G4VAtomDeexcitation.hh.
Referenced by G4UAtomicDeexcitation::InitialiseForNewRun().
const G4String & G4VAtomDeexcitation::PIXEElectronCrossSectionModel | ( | ) | const [inline] |
Definition at line 249 of file G4VAtomDeexcitation.hh.
Referenced by G4UAtomicDeexcitation::InitialiseForNewRun().
void G4VAtomDeexcitation::SetAuger | ( | G4bool | ) | [inline] |
Definition at line 203 of file G4VAtomDeexcitation.hh.
Referenced by G4EmProcessOptions::SetAuger().
void G4VAtomDeexcitation::SetDeexcitationActiveRegion | ( | const G4String & | rname, | |
G4bool | valDeexcitation, | |||
G4bool | valAuger, | |||
G4bool | valPIXE | |||
) |
Definition at line 163 of file G4VAtomDeexcitation.cc.
References CLHEP::detail::n.
Referenced by InitialiseAtomicDeexcitation(), and G4EmProcessOptions::SetDeexcitationActiveRegion().
00167 { 00168 G4String ss = rname; 00169 //G4cout << "### G4VAtomDeexcitation::SetDeexcitationActiveRegion " << ss 00170 // << " " << valDeexcitation << " " << valAuger 00171 // << " " << valPIXE << G4endl; 00172 if(ss == "world" || ss == "World" || ss == "WORLD") { 00173 ss = "DefaultRegionForTheWorld"; 00174 } 00175 size_t n = deRegions.size(); 00176 if(n > 0) { 00177 for(size_t i=0; i<n; ++i) { 00178 00179 // Region already exist 00180 if(ss == activeRegions[i]) { 00181 deRegions[i] = valDeexcitation; 00182 AugerRegions[i] = valAuger; 00183 PIXERegions[i] = valPIXE; 00184 return; 00185 } 00186 } 00187 } 00188 // New region 00189 activeRegions.push_back(ss); 00190 deRegions.push_back(valDeexcitation); 00191 AugerRegions.push_back(valAuger); 00192 PIXERegions.push_back(valPIXE); 00193 }
void G4VAtomDeexcitation::SetFluo | ( | G4bool | ) | [inline] |
Definition at line 193 of file G4VAtomDeexcitation.hh.
Referenced by G4EmStandardPhysics_option4::ConstructProcess(), G4EmStandardPhysics_option3::ConstructProcess(), G4EmPenelopePhysics::ConstructProcess(), G4EmLowEPPhysics::ConstructProcess(), G4EmLivermorePolarizedPhysics::ConstructProcess(), G4EmLivermorePhysics::ConstructProcess(), G4EmDNAPhysicsChemistry::ConstructProcess(), G4EmDNAPhysics::ConstructProcess(), and G4EmProcessOptions::SetFluo().
void G4VAtomDeexcitation::SetPIXE | ( | G4bool | ) | [inline] |
void G4VAtomDeexcitation::SetPIXECrossSectionModel | ( | const G4String & | ) | [inline] |
Definition at line 231 of file G4VAtomDeexcitation.hh.
References CLHEP::detail::n.
Referenced by G4UAtomicDeexcitation::InitialiseForNewRun(), and G4EmProcessOptions::SetPIXECrossSectionModel().
00232 { 00233 namePIXE = n; 00234 }
void G4VAtomDeexcitation::SetPIXEElectronCrossSectionModel | ( | const G4String & | ) | [inline] |
Definition at line 237 of file G4VAtomDeexcitation.hh.
References CLHEP::detail::n.
Referenced by G4UAtomicDeexcitation::InitialiseForNewRun(), and G4EmProcessOptions::SetPIXEElectronCrossSectionModel().
00238 { 00239 nameElectronPIXE = n; 00240 }
void G4VAtomDeexcitation::SetVerboseLevel | ( | G4int | ) | [inline] |
Definition at line 260 of file G4VAtomDeexcitation.hh.
Referenced by G4LossTableManager::SetVerbose().