Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4DNARuddIonisationDynamicModel Class Reference

#include <G4DNARuddIonisationDynamicModel.hh>

Inheritance diagram for G4DNARuddIonisationDynamicModel:

Public Member Functions

 G4DNARuddIonisationDynamicModel (const G4ParticleDefinition *p=nullptr, const G4String &nam="DNARuddIonisationDynamicModel")
 ~G4DNARuddIonisationDynamicModel () override
void Initialise (const G4ParticleDefinition *, const G4DataVector &) override
G4double ProbabilityDensityFunction (G4double ekin) override
G4double CrossSectionPerVolume (const G4Material *material, const G4ParticleDefinition *p, G4double ekin, G4double emin, G4double emax) override
void SampleSecondaries (std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
void StartTracking (G4Track *) override
G4DNARuddIonisationDynamicModeloperator= (const G4DNARuddIonisationDynamicModel &right)=delete
 G4DNARuddIonisationDynamicModel (const G4DNARuddIonisationDynamicModel &)=delete
Public Member Functions inherited from G4VEmModel
 G4VEmModel (const G4String &nam)
virtual ~G4VEmModel ()
virtual void InitialiseLocal (const G4ParticleDefinition *, G4VEmModel *masterModel)
virtual void InitialiseForMaterial (const G4ParticleDefinition *, const G4Material *)
virtual void InitialiseForElement (const G4ParticleDefinition *, G4int Z)
virtual G4double ComputeDEDXPerVolume (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
virtual G4double GetPartialCrossSection (const G4Material *, G4int level, const G4ParticleDefinition *, G4double kineticEnergy)
virtual G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
virtual G4double ComputeCrossSectionPerShell (const G4ParticleDefinition *, G4int Z, G4int shellIdx, G4double kinEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
virtual G4double ChargeSquareRatio (const G4Track &)
virtual G4double GetChargeSquareRatio (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
virtual G4double GetParticleCharge (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
virtual void CorrectionsAlongStep (const G4Material *, const G4ParticleDefinition *, const G4double kinEnergy, const G4double cutEnergy, const G4double &length, G4double &eloss)
virtual G4double Value (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy)
virtual G4double MinPrimaryEnergy (const G4Material *, const G4ParticleDefinition *, G4double cut=0.0)
virtual G4double MinEnergyCut (const G4ParticleDefinition *, const G4MaterialCutsCouple *)
virtual void SetupForMaterial (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
virtual void DefineForRegion (const G4Region *)
virtual void FillNumberOfSecondaries (G4int &numberOfTriplets, G4int &numberOfRecoil)
virtual void ModelDescription (std::ostream &outFile) const
void InitialiseElementSelectors (const G4ParticleDefinition *, const G4DataVector &)
std::vector< G4EmElementSelector * > * GetElementSelectors ()
void SetElementSelectors (std::vector< G4EmElementSelector * > *)
G4double ComputeDEDX (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
G4double CrossSection (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
G4double ComputeMeanFreePath (const G4ParticleDefinition *, G4double kineticEnergy, const G4Material *, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *, const G4Element *, G4double kinEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
const G4ElementSelectRandomAtom (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
const G4ElementSelectTargetAtom (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double logKineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
const G4ElementSelectRandomAtom (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
const G4ElementGetCurrentElement (const G4Material *mat=nullptr) const
G4int SelectRandomAtomNumber (const G4Material *) const
const G4IsotopeGetCurrentIsotope (const G4Element *elm=nullptr) const
G4int SelectIsotopeNumber (const G4Element *) const
void SetParticleChange (G4VParticleChange *, G4VEmFluctuationModel *f=nullptr)
void SetCrossSectionTable (G4PhysicsTable *, G4bool isLocal)
G4ElementDataGetElementData ()
G4PhysicsTableGetCrossSectionTable ()
G4VEmFluctuationModelGetModelOfFluctuations ()
G4VEmAngularDistributionGetAngularDistribution ()
G4VEmModelGetTripletModel ()
void SetTripletModel (G4VEmModel *)
void SetAngularDistribution (G4VEmAngularDistribution *)
G4double HighEnergyLimit () const
G4double LowEnergyLimit () const
G4double HighEnergyActivationLimit () const
G4double LowEnergyActivationLimit () const
G4double PolarAngleLimit () const
G4double SecondaryThreshold () const
G4bool DeexcitationFlag () const
G4bool ForceBuildTableFlag () const
G4bool UseAngularGeneratorFlag () const
void SetAngularGeneratorFlag (G4bool)
void SetHighEnergyLimit (G4double)
void SetLowEnergyLimit (G4double)
void SetActivationHighEnergyLimit (G4double)
void SetActivationLowEnergyLimit (G4double)
G4bool IsActive (G4double kinEnergy) const
void SetPolarAngleLimit (G4double)
void SetSecondaryThreshold (G4double)
void SetDeexcitationFlag (G4bool val)
void SetForceBuildTable (G4bool val)
void SetFluctuationFlag (G4bool val)
G4bool IsMaster () const
void SetUseBaseMaterials (G4bool val)
G4bool UseBaseMaterials () const
G4double MaxSecondaryKinEnergy (const G4DynamicParticle *dynParticle)
const G4StringGetName () const
void SetCurrentCouple (const G4MaterialCutsCouple *)
G4bool IsLocked () const
void SetLocked (G4bool)
void SetLPMFlag (G4bool)
void SetMasterThread (G4bool)
G4VEmModeloperator= (const G4VEmModel &right)=delete
 G4VEmModel (const G4VEmModel &)=delete
Public Member Functions inherited from G4VSIntegration
 G4VSIntegration ()=default
virtual ~G4VSIntegration ()=default
virtual const G4StringModelName () const
void InitialiseIntegrator (G4double accuracy, G4double fact1, G4double fact2, G4double de, G4double dmin, G4double dmax)
G4double ComputeIntegral (const G4double emin, const G4double emax)
G4double SampleValue ()
 G4VSIntegration (const G4VSIntegration &)=delete
G4VSIntegrationoperator= (const G4VSIntegration &)=delete
G4bool operator== (const G4VSIntegration &right) const =delete
G4bool operator!= (const G4VSIntegration &right) const =delete
void SetVerbose (G4int verb)

Protected Attributes

G4ParticleChangeForGammafParticleChangeForGamma {nullptr}
Protected Attributes inherited from G4VEmModel
G4ElementDatafElementData = nullptr
G4VParticleChangepParticleChange = nullptr
G4PhysicsTablexSectionTable = nullptr
const G4MaterialpBaseMaterial = nullptr
const std::vector< G4double > * theDensityFactor = nullptr
const std::vector< G4int > * theDensityIdx = nullptr
G4double inveplus
G4double pFactor = 1.0
std::size_t currentCoupleIndex = 0
std::size_t basedCoupleIndex = 0
G4bool lossFlucFlag = true

Additional Inherited Members

Protected Member Functions inherited from G4VEmModel
G4ParticleChangeForLossGetParticleChangeForLoss ()
G4ParticleChangeForGammaGetParticleChangeForGamma ()
virtual G4double MaxSecondaryEnergy (const G4ParticleDefinition *, G4double kineticEnergy)
const G4MaterialCutsCoupleCurrentCouple () const
void SetCurrentElement (const G4Element *)

Detailed Description

Definition at line 48 of file G4DNARuddIonisationDynamicModel.hh.

Constructor & Destructor Documentation

◆ G4DNARuddIonisationDynamicModel() [1/2]

G4DNARuddIonisationDynamicModel::G4DNARuddIonisationDynamicModel ( const G4ParticleDefinition * p = nullptr,
const G4String & nam = "DNARuddIonisationDynamicModel" )
explicit

Definition at line 83 of file G4DNARuddIonisationDynamicModel.cc.

85 : G4VEmModel(nam)
86{
87 fEmCorrections = G4LossTableManager::Instance()->EmCorrections();
88 fGpow = G4Pow::GetInstance();
89 fLowestEnergy = 100*CLHEP::eV;
90 fAbsorptionEnergy = 50*CLHEP::eV;
91
92 // Mark this model as "applicable" for atomic deexcitation
94
95 // Define default angular generator
96 SetAngularDistribution(new G4DNARuddAngle());
97
98 if (nullptr == xsdata_p) {
99 isFirst = true;
100 LoadData();
101 }
102}
static G4LossTableManager * Instance()
G4EmCorrections * EmCorrections()
static G4Pow * GetInstance()
Definition G4Pow.cc:41
void SetDeexcitationFlag(G4bool val)
G4VEmModel(const G4String &nam)
Definition G4VEmModel.cc:67
void SetAngularDistribution(G4VEmAngularDistribution *)

Referenced by G4DNARuddIonisationDynamicModel(), and operator=().

◆ ~G4DNARuddIonisationDynamicModel()

G4DNARuddIonisationDynamicModel::~G4DNARuddIonisationDynamicModel ( )
override

Definition at line 106 of file G4DNARuddIonisationDynamicModel.cc.

107{
108 if (isFirst) {
109 delete xsdata_alpha;
110 delete xsdata_alphap;
111 delete xsdata_p;
112 delete xsdata_hydrogen;
113 delete xsdata_helium;
114 }
115}

◆ G4DNARuddIonisationDynamicModel() [2/2]

G4DNARuddIonisationDynamicModel::G4DNARuddIonisationDynamicModel ( const G4DNARuddIonisationDynamicModel & )
delete

Member Function Documentation

◆ CrossSectionPerVolume()

G4double G4DNARuddIonisationDynamicModel::CrossSectionPerVolume ( const G4Material * material,
const G4ParticleDefinition * p,
G4double ekin,
G4double emin,
G4double emax )
overridevirtual

Reimplemented from G4VEmModel.

Definition at line 250 of file G4DNARuddIonisationDynamicModel.cc.

254{
255 // check if model is applicable for given material
256 G4double density = (material->GetIndex() < fpWaterDensity->size())
257 ? (*fpWaterDensity)[material->GetIndex()] : 0.0;
258 if (0.0 == density) { return 0.0; }
259
260 // check on kinetic energy (not scaled energy) to stop low-energy ion
261 if (kinE < fAbsorptionEnergy) { return DBL_MAX; }
262
263 // ion may be different
264 if (fParticle != part) { SetParticle(part); }
265
266 // cross section for scaled energy
267 G4double e = kinE*fMassRate;
268
269 G4double sigma = (e > fLowestEnergy) ? xsdata->LogLogValue(e, idx)
270 : xsdata->LogLogValue(fLowestEnergy, idx) * e / fLowestEnergy;
271
272 sigma *= density;
273 if (isIon) {
274 sigma *= fEmCorrections->EffectiveChargeSquareRatio(part, material, kinE);
275 }
276
277 if (verbose > 1) {
278 G4cout << "G4DNARuddIonisationDynamicModel for " << part->GetParticleName()
279 << " Ekin(keV)=" << kinE/CLHEP::keV
280 << " sigma(cm^2)=" << sigma/CLHEP::cm2 << G4endl;
281 }
282 return sigma;
283}
double G4double
Definition G4Types.hh:83
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
std::size_t GetIndex() const
#define DBL_MAX
Definition templates.hh:62

◆ Initialise()

void G4DNARuddIonisationDynamicModel::Initialise ( const G4ParticleDefinition * p,
const G4DataVector &  )
overridevirtual

Implements G4VEmModel.

Definition at line 152 of file G4DNARuddIonisationDynamicModel.cc.

154{
155 if (p != fParticle) { SetParticle(p); }
156
157 // particle change object may be externally set
158 if (nullptr == fParticleChangeForGamma) {
160 }
161 const G4String& pname = p->GetParticleName();
162
163 // the same definition of generic ion as in G4VEmProcess class
164 if (p->GetParticleType() == "nucleus" && p->GetParticleSubType() == "generic") {
165 if (pname != "deuteron" && pname != "triton" &&
166 pname != "He3" && pname != "alpha" && pname != "alpha+" &&
167 pname != "helium" && pname != "hydrogen") {
168 isIon = true;
169 }
170 }
171
172 // initialisation once in each thread
173 if (!isInitialised) {
174 isInitialised = true;
175 xsdata = xsdata_p;
176
177 if (pname == "helium") {
178 isHelium = true;
179 xsdata = xsdata_helium;
180 slaterEffectiveCharge[0]=1.7;
181 slaterEffectiveCharge[1]=1.15;
182 slaterEffectiveCharge[2]=1.15;
183 sCoefficient[0]=0.5;
184 sCoefficient[1]=0.25;
185 sCoefficient[2]=0.25;
186 fLowestEnergy = 1*CLHEP::keV;
187 } else if (pname == "alpha+") {
188 isHelium = true;
189 xsdata = xsdata_alphap;
190 // The following values are provided by M. Dingfelder (priv. comm)
191 slaterEffectiveCharge[0]=2.0;
192 slaterEffectiveCharge[1]=2.0;
193 slaterEffectiveCharge[2]=2.0;
194 sCoefficient[0]=0.7;
195 sCoefficient[1]=0.15;
196 sCoefficient[2]=0.15;
197 } else if (pname == "alpha") {
198 isHelium = true;
199 xsdata = xsdata_alpha;
200 } else if (pname == "hydrogen") {
201 xsdata = xsdata_hydrogen;
202 } else if (pname != "proton") {
203 isIon = true;
204 }
205 if (isHelium) { fLowestEnergy = 1*CLHEP::keV; }
206
207 // defined stationary mode
209
210 // initialise atomic de-excitation
211 fAtomDeexcitation = G4LossTableManager::Instance()->AtomDeexcitation();
212
213 // chemistry
215 if (chem->IsChemistryActivated()) {
216 fChemistry = chem;
217 }
218
219 InitialiseIntegrator(0.1, 0.25, 1.05, 4*CLHEP::eV, 0.2*CLHEP::eV, 10*CLHEP::keV);
220
221 if (verbose > 0) {
222 G4cout << "### G4DNARuddIonisationDynamicModel::Initialise(..) "
223 << fParticle->GetParticleName() << G4endl;
224 }
225 }
226}
static G4DNAChemistryManager * Instance()
static G4EmParameters * Instance()
G4bool DNAStationary() const
G4VAtomDeexcitation * AtomDeexcitation()
const G4String & GetParticleType() const
const G4String & GetParticleName() const
const G4String & GetParticleSubType() const
G4ParticleChangeForGamma * GetParticleChangeForGamma()
void InitialiseIntegrator(G4double accuracy, G4double fact1, G4double fact2, G4double de, G4double dmin, G4double dmax)

◆ operator=()

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

◆ ProbabilityDensityFunction()

G4double G4DNARuddIonisationDynamicModel::ProbabilityDensityFunction ( G4double ekin)
overridevirtual

Implements G4VSIntegration.

Definition at line 458 of file G4DNARuddIonisationDynamicModel.cc.

459{
460 // Shells ids are 0 1 2 3 4 (4 is k shell)
461 // !!Attention, "energyTransfer" here is the energy transfered to the electron which means
462 // that the secondary kinetic energy is w = energyTransfer - bindingEnergy
463 //
464 // ds S F1(nu) + w * F2(nu)
465 // ---- = G(k) * ---- -------------------------------------------
466 // dw Bj (1+w)^3 * [1 + exp{alpha * (w - wc) / nu}]
467 //
468 // w is the secondary electron kinetic Energy in eV
469 //
470 // All the other parameters can be found in Rudd's Papers
471 //
472 // M.Eugene Rudd, 1988, User-Friendly model for the energy distribution of
473 // electrons from protons or electron collisions. Nucl. Tracks Rad. Meas.Vol 16 N0 2/3 pp 219-218
474 //
475 G4double w = e/bEnergy;
476 G4double x = alphaConst*(w - wc)/v;
477 G4double y = (x > -15.) ? 1.0 + G4Exp(x) : 1.0;
478
479 G4double res = CorrectionFactor() * (F1 + w*F2) /
480 (fGpow->powN((1. + w)/u, 3) * y);
481
482 if (isHelium) {
483 G4double energyTransfer = e + bEnergy;
484 G4double Zeff = 2.0 -
485 (sCoefficient[0] * S_1s(fScaledEnergy, energyTransfer, slaterEffectiveCharge[0], 1.) +
486 sCoefficient[1] * S_2s(fScaledEnergy, energyTransfer, slaterEffectiveCharge[1], 2.) +
487 sCoefficient[2] * S_2p(fScaledEnergy, energyTransfer, slaterEffectiveCharge[2], 2.) );
488
489 res *= Zeff * Zeff;
490 }
491 return std::max(res, 0.0);
492}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:132

◆ SampleSecondaries()

void G4DNARuddIonisationDynamicModel::SampleSecondaries ( std::vector< G4DynamicParticle * > * fvect,
const G4MaterialCutsCouple * couple,
const G4DynamicParticle * dpart,
G4double tmin,
G4double maxEnergy )
overridevirtual

Implements G4VEmModel.

Definition at line 288 of file G4DNARuddIonisationDynamicModel.cc.

292{
293 const G4ParticleDefinition* pd = dpart->GetDefinition();
294 if (fParticle != pd) { SetParticle(pd); }
295
296 // stop ion with energy below low energy limit
297 G4double kinE = dpart->GetKineticEnergy();
298 // ion shoud be stopped - check on kinetic energy and not scaled energy
299 if (kinE <= fAbsorptionEnergy) {
300 fParticleChangeForGamma->SetProposedKineticEnergy(0.);
301 fParticleChangeForGamma->ProposeTrackStatus(fStopButAlive);
302 fParticleChangeForGamma->ProposeLocalEnergyDeposit(kinE);
303 return;
304 }
305
306 fScaledEnergy = kinE*fMassRate;
307 fSelectedShell = SelectShell();
308 G4double bindingEnergy = (useDNAWaterStructure)
309 ? waterStructure.IonisationEnergy(fSelectedShell) : Bj[fSelectedShell];
310
311 //Si: additional protection if tcs interpolation method is modified
312 if (kinE < bindingEnergy) { return; }
313
314 G4double esec = SampleElectronEnergy();
315 G4double esum = 0.0;
316
317 // sample deexcitation
318 // here we assume that H2O electronic levels are the same as Oxygen.
319 // this can be considered true with a rough 10% error in energy on K-shell,
320 G4int Z = 8;
321 G4ThreeVector deltaDir =
323 fSelectedShell,
324 couple->GetMaterial());
325
326 // SI: only atomic deexcitation from K shell is considered
327 if (fAtomDeexcitation != nullptr && fSelectedShell == 4) {
328 auto as = G4AtomicShellEnumerator(0);
329 auto ashell = fAtomDeexcitation->GetAtomicShell(Z, as);
330 fAtomDeexcitation->GenerateParticles(fvect, ashell, Z, 0, 0);
331
332 // compute energy sum from de-excitation
333 for (auto const & ptr : *fvect) {
334 esum += ptr->GetKineticEnergy();
335 }
336 }
337 // check energy balance
338 // remaining excitation energy of water molecule
339 G4double exc = std::max(bindingEnergy - esum, 0.0);
340
341 // remaining projectile energy
342 G4double scatteredEnergy = kinE - bindingEnergy - esec;
343 if(scatteredEnergy < -tolerance || exc < -tolerance) {
344 G4cout << "G4DNARuddIonisationDynamicModel::SampleSecondaries: "
345 << "negative final E(keV)=" << scatteredEnergy/CLHEP::keV << " Ein(keV)="
346 << kinE/CLHEP::keV << " " << pd->GetParticleName()
347 << " Edelta(keV)=" << esec/CLHEP::keV << " MeV, Exc(keV)=" << exc/CLHEP::keV
348 << G4endl;
349 }
350 scatteredEnergy = std::max(scatteredEnergy, 0.0);
351 /*
352 G4cout << "Eprim(keV)=" << kinE/CLHEP::keV << " Efin(keV)=" << scatteredEnergy/CLHEP::keV
353 << " Esec(keV)=" << esec/CLHEP::keV << " Exc(keV)=" << exc/CLHEP::keV
354 << " tolerance(keV)=" << tolerance/CLHEP::keV << G4endl;
355 */
356 // projectile
357 if (!statCode) {
358 fParticleChangeForGamma->SetProposedKineticEnergy(scatteredEnergy);
359 fParticleChangeForGamma->ProposeLocalEnergyDeposit(exc);
360 } else {
361 fParticleChangeForGamma->SetProposedKineticEnergy(kinE);
362 fParticleChangeForGamma->ProposeLocalEnergyDeposit(kinE - scatteredEnergy);
363 }
364
365 // delta-electron
366 auto dp = new G4DynamicParticle(G4Electron::Electron(), deltaDir, esec);
367 fvect->push_back(dp);
368
369 // create radical
370 if (nullptr != fChemistry) {
371 fChemistry->CreateWaterMolecule(eIonizedMolecule, fSelectedShell, fTrack);
372 }
373}
@ eIonizedMolecule
CLHEP::Hep3Vector G4ThreeVector
@ fStopButAlive
int G4int
Definition G4Types.hh:85
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
Definition G4Electron.cc:91
const G4Material * GetMaterial() const
virtual G4ThreeVector & SampleDirectionForShell(const G4DynamicParticle *dp, G4double finalTotalEnergy, G4int Z, G4int shellID, const G4Material *)
G4VEmAngularDistribution * GetAngularDistribution()
G4double bindingEnergy(G4int A, G4int Z)

◆ StartTracking()

void G4DNARuddIonisationDynamicModel::StartTracking ( G4Track * track)
overridevirtual

Reimplemented from G4VEmModel.

Definition at line 242 of file G4DNARuddIonisationDynamicModel.cc.

243{
244 fTrack = track;
245}

Member Data Documentation

◆ fParticleChangeForGamma

G4ParticleChangeForGamma* G4DNARuddIonisationDynamicModel::fParticleChangeForGamma {nullptr}
protected

Definition at line 116 of file G4DNARuddIonisationDynamicModel.hh.

116{nullptr};

Referenced by Initialise(), and SampleSecondaries().


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