107 G4Exception(
"G4LivermoreIonisationModel::Initialise",
109 "Livermore Ionisation Model is applicable only to electrons");
111 transitionManager->Initialise();
116 delete energySpectrum;
117 energySpectrum =
nullptr;
120 if (verboseLevel > 3)
124 if (crossSectionHandler)
126 delete crossSectionHandler;
127 crossSectionHandler =
nullptr;
130 const size_t nbins = 20;
133 G4int ndec =
G4int(std::log10(emax/emin) + 0.5);
134 if(ndec <= 0) { ndec = 1; }
137 crossSectionHandler =
139 emin,emax,nbins*ndec);
140 crossSectionHandler->Clear();
141 crossSectionHandler->LoadShellData(
"ioni/ion-ss-cs-");
144 crossSectionHandler->BuildMeanFreePathForMaterials(&cuts);
149 if (verboseLevel > 0)
151 G4cout <<
"Livermore Ionisation model is initialized " <<
G4endl
158 if (verboseLevel > 3)
161 crossSectionHandler->PrintData();
163 energySpectrum->PrintData();
166 if(isInitialised) {
return; }
168 isInitialised =
true;
220 const G4double* theAtomicNumDensityVector =
224 for (
size_t iel=0; iel<NumberOfElements; iel++ )
226 G4int iZ = (
G4int)((*theElementVector)[iel]->GetZ());
227 G4int nShells = transitionManager->NumberOfShells(iZ);
228 for (
G4int n=0; n<nShells; n++)
230 G4double e = energySpectrum->AverageEnergy(iZ, 0.0,cutEnergy,
232 G4double cs= crossSectionHandler->FindValue(iZ,kineticEnergy, n);
233 sPower += e * cs * theAtomicNumDensityVector[iel];
235 G4double esp = energySpectrum->Excitation(iZ,kineticEnergy);
236 sPower += esp * theAtomicNumDensityVector[iel];
239 if (verboseLevel > 2)
242 G4cout <<
"Stopping power < " << cutEnergy/keV
243 <<
" keV at " << kineticEnergy/keV <<
" keV = "
244 << sPower/(keV/mm) <<
" keV/mm" <<
G4endl;
253 std::vector<G4DynamicParticle*>* fvect,
262 if (kineticEnergy <= fIntrinsicLowEnergyLimit)
270 G4int Z = crossSectionHandler->SelectRandomAtom(couple, kineticEnergy);
271 G4int shellIndex = crossSectionHandler->SelectRandomShell(Z, kineticEnergy);
272 const G4AtomicShell* shell = transitionManager->Shell(Z,shellIndex);
277 std::min(maxE,energySpectrum->MaxEnergyOfSecondaries(kineticEnergy));
278 G4double energyDelta = energySpectrum->SampleEnergy(Z, cutE, energyMax,
279 kineticEnergy, shellIndex);
281 if (energyDelta == 0.)
291 fvect->push_back(delta);
295 G4double totalMomentum = std::sqrt(kineticEnergy*(kineticEnergy + 2*electron_mass_c2));
298 finalP = finalP.
unit();
301 G4double theEnergyDeposit = bindingEnergy;
305 G4double finalKinEnergy = kineticEnergy - energyDelta - theEnergyDeposit;
306 if(finalKinEnergy < 0.0)
308 theEnergyDeposit += finalKinEnergy;
309 finalKinEnergy = 0.0;
317 if (theEnergyDeposit < 0)
319 G4cout <<
"G4LivermoreIonisationModel: Negative energy deposit: "
320 << theEnergyDeposit/eV <<
" eV" <<
G4endl;
321 theEnergyDeposit = 0.0;
327 if (verboseLevel > 1)
329 G4cout <<
"-----------------------------------------------------------" <<
G4endl;
330 G4cout <<
"Energy balance from G4LivermoreIonisation" <<
G4endl;
331 G4cout <<
"Incoming primary energy: " << kineticEnergy/keV <<
" keV" <<
G4endl;
332 G4cout <<
"-----------------------------------------------------------" <<
G4endl;
333 G4cout <<
"Outgoing primary energy: " << finalKinEnergy/keV <<
" keV" <<
G4endl;
334 G4cout <<
"Delta ray " << energyDelta/keV <<
" keV" <<
G4endl;
335 G4cout <<
"Fluorescence: " << (bindingEnergy-theEnergyDeposit)/keV <<
" keV" <<
G4endl;
336 G4cout <<
"Local energy deposit " << theEnergyDeposit/keV <<
" keV" <<
G4endl;
337 G4cout <<
"Total final state: " << (finalKinEnergy+energyDelta+bindingEnergy)
339 G4cout <<
"-----------------------------------------------------------" <<
G4endl;
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
G4ThreeVector GetMomentum() const