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

#include <G4mplIonisationWithDeltaModel.hh>

+ Inheritance diagram for G4mplIonisationWithDeltaModel:

Public Member Functions

 G4mplIonisationWithDeltaModel (G4double mCharge, const G4String &nam="mplIonisationWithDelta")
 
virtual ~G4mplIonisationWithDeltaModel ()
 
virtual void Initialise (const G4ParticleDefinition *, const G4DataVector &)
 
virtual G4double ComputeDEDXPerVolume (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy)
 
virtual G4double ComputeCrossSectionPerElectron (const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy)
 
virtual G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *, G4double kineticEnergy, G4double Z, G4double A, G4double cutEnergy, G4double maxEnergy)
 
virtual void SampleSecondaries (std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
 
virtual G4double SampleFluctuations (const G4Material *, const G4DynamicParticle *, G4double &tmax, G4double &length, G4double &meanLoss)
 
virtual G4double Dispersion (const G4Material *, const G4DynamicParticle *, G4double &tmax, G4double &length)
 
void SetParticle (const G4ParticleDefinition *p)
 
- Public Member Functions inherited from G4VEmModel
 G4VEmModel (const G4String &nam)
 
virtual ~G4VEmModel ()
 
virtual void Initialise (const G4ParticleDefinition *, const G4DataVector &)=0
 
virtual void SampleSecondaries (std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin=0.0, G4double tmax=DBL_MAX)=0
 
virtual G4double ComputeDEDXPerVolume (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
 
virtual G4double CrossSectionPerVolume (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
virtual G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., 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 StartTracking (G4Track *)
 
virtual void CorrectionsAlongStep (const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double &eloss, G4double &niel, G4double length)
 
virtual G4double Value (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy)
 
virtual G4double MinPrimaryEnergy (const G4Material *, const G4ParticleDefinition *)
 
virtual void SetupForMaterial (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
virtual void DefineForRegion (const G4Region *)
 
void InitialiseElementSelectors (const G4ParticleDefinition *, const G4DataVector &)
 
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)
 
G4int SelectIsotopeNumber (const G4Element *)
 
const G4ElementSelectRandomAtom (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
const G4ElementSelectRandomAtom (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
void SetParticleChange (G4VParticleChange *, G4VEmFluctuationModel *f=0)
 
void SetCrossSectionTable (G4PhysicsTable *)
 
G4PhysicsTableGetCrossSectionTable ()
 
G4VEmFluctuationModelGetModelOfFluctuations ()
 
G4VEmAngularDistributionGetAngularDistribution ()
 
void SetAngularDistribution (G4VEmAngularDistribution *)
 
G4double HighEnergyLimit () const
 
G4double LowEnergyLimit () const
 
G4double HighEnergyActivationLimit () const
 
G4double LowEnergyActivationLimit () const
 
G4double PolarAngleLimit () const
 
G4double SecondaryThreshold () const
 
G4bool LPMFlag () const
 
G4bool DeexcitationFlag () const
 
G4bool ForceBuildTableFlag () const
 
void SetHighEnergyLimit (G4double)
 
void SetLowEnergyLimit (G4double)
 
void SetActivationHighEnergyLimit (G4double)
 
void SetActivationLowEnergyLimit (G4double)
 
G4bool IsActive (G4double kinEnergy)
 
void SetPolarAngleLimit (G4double)
 
void SetSecondaryThreshold (G4double)
 
void SetLPMFlag (G4bool val)
 
void SetDeexcitationFlag (G4bool val)
 
void ForceBuildTable (G4bool val)
 
G4double MaxSecondaryKinEnergy (const G4DynamicParticle *dynParticle)
 
const G4StringGetName () const
 
void SetCurrentCouple (const G4MaterialCutsCouple *)
 
const G4ElementGetCurrentElement () const
 
- Public Member Functions inherited from G4VEmFluctuationModel
 G4VEmFluctuationModel (const G4String &nam)
 
virtual ~G4VEmFluctuationModel ()
 
virtual G4double SampleFluctuations (const G4Material *, const G4DynamicParticle *, G4double &tmax, G4double &length, G4double &meanLoss)=0
 
virtual G4double Dispersion (const G4Material *, const G4DynamicParticle *, G4double &tmax, G4double &length)=0
 
virtual void InitialiseMe (const G4ParticleDefinition *)
 
virtual void SetParticleAndCharge (const G4ParticleDefinition *, G4double q2)
 
G4String GetName () const
 

Protected Member Functions

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

Additional Inherited Members

- Protected Attributes inherited from G4VEmModel
G4VParticleChangepParticleChange
 
G4PhysicsTablexSectionTable
 
const std::vector< G4double > * theDensityFactor
 
const std::vector< G4int > * theDensityIdx
 

Detailed Description

Definition at line 57 of file G4mplIonisationWithDeltaModel.hh.

Constructor & Destructor Documentation

◆ G4mplIonisationWithDeltaModel()

G4mplIonisationWithDeltaModel::G4mplIonisationWithDeltaModel ( G4double  mCharge,
const G4String nam = "mplIonisationWithDelta" 
)

Definition at line 69 of file G4mplIonisationWithDeltaModel.cc.

72 magCharge(mCharge),
73 twoln10(log(100.0)),
74 betalow(0.01),
75 betalim(0.1),
76 beta2lim(betalim*betalim),
77 bg2lim(beta2lim*(1.0 + beta2lim))
78{
79 nmpl = G4int(abs(magCharge) * 2 * fine_structure_const + 0.5);
80 if(nmpl > 6) { nmpl = 6; }
81 else if(nmpl < 1) { nmpl = 1; }
82 pi_hbarc2_over_mc2 = pi * hbarc * hbarc / electron_mass_c2;
83 chargeSquare = magCharge * magCharge;
84 dedxlim = 45.*nmpl*nmpl*GeV*cm2/g;
85 fParticleChange = 0;
86 theElectron = G4Electron::Electron();
87 G4cout << "### Monopole ionisation model with d-electron production, Gmag= "
88 << magCharge/eplus << G4endl;
89 monopole = 0;
90 mass = 0.0;
91}
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
static G4Electron * Electron()
Definition: G4Electron.cc:94
const G4double pi

◆ ~G4mplIonisationWithDeltaModel()

G4mplIonisationWithDeltaModel::~G4mplIonisationWithDeltaModel ( )
virtual

Definition at line 95 of file G4mplIonisationWithDeltaModel.cc.

96{}

Member Function Documentation

◆ ComputeCrossSectionPerAtom()

G4double G4mplIonisationWithDeltaModel::ComputeCrossSectionPerAtom ( const G4ParticleDefinition p,
G4double  kineticEnergy,
G4double  Z,
G4double  A,
G4double  cutEnergy,
G4double  maxEnergy 
)
virtual

Reimplemented from G4VEmModel.

Definition at line 219 of file G4mplIonisationWithDeltaModel.cc.

225{
226 G4double cross =
227 Z*ComputeCrossSectionPerElectron(p,kineticEnergy,cutEnergy,maxEnergy);
228 return cross;
229}
double G4double
Definition: G4Types.hh:64
virtual G4double ComputeCrossSectionPerElectron(const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy)

◆ ComputeCrossSectionPerElectron()

G4double G4mplIonisationWithDeltaModel::ComputeCrossSectionPerElectron ( const G4ParticleDefinition p,
G4double  kineticEnergy,
G4double  cutEnergy,
G4double  maxEnergy 
)
virtual

Definition at line 200 of file G4mplIonisationWithDeltaModel.cc.

205{
206 if(!monopole) { SetParticle(p); }
207 G4double cross = 0.0;
208 G4double tmax = MaxSecondaryEnergy(p, kineticEnergy);
209 G4double maxEnergy = min(tmax,maxKinEnergy);
210 if(cutEnergy < maxEnergy) {
211 cross = (1.0/cutEnergy - 1.0/maxEnergy)*twopi_mc2_rcl2*chargeSquare;
212 }
213 return cross;
214}
virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition *, G4double kinEnergy)
void SetParticle(const G4ParticleDefinition *p)

Referenced by ComputeCrossSectionPerAtom().

◆ ComputeDEDXPerVolume()

G4double G4mplIonisationWithDeltaModel::ComputeDEDXPerVolume ( const G4Material material,
const G4ParticleDefinition p,
G4double  kineticEnergy,
G4double  cutEnergy 
)
virtual

Reimplemented from G4VEmModel.

Definition at line 125 of file G4mplIonisationWithDeltaModel.cc.

129{
130 if(!monopole) { SetParticle(p); }
131 G4double tmax = MaxSecondaryEnergy(p,kineticEnergy);
132 G4double cutEnergy = std::min(tmax, maxEnergy);
133 G4double tau = kineticEnergy / mass;
134 G4double gam = tau + 1.0;
135 G4double bg2 = tau * (tau + 2.0);
136 G4double beta2 = bg2 / (gam * gam);
137 G4double beta = sqrt(beta2);
138
139 // low-energy asymptotic formula
140 G4double dedx = dedxlim*beta*material->GetDensity();
141
142 // above asymptotic
143 if(beta > betalow) {
144
145 // high energy
146 if(beta >= betalim) {
147 dedx = ComputeDEDXAhlen(material, bg2, cutEnergy);
148
149 } else {
150
151 G4double dedx1 = dedxlim*betalow*material->GetDensity();
152 G4double dedx2 = ComputeDEDXAhlen(material, bg2lim, cutEnergy);
153
154 // extrapolation between two formula
155 G4double kapa2 = beta - betalow;
156 G4double kapa1 = betalim - beta;
157 dedx = (kapa1*dedx1 + kapa2*dedx2)/(kapa1 + kapa2);
158 }
159 }
160 return dedx;
161}
G4double GetDensity() const
Definition: G4Material.hh:179

◆ Dispersion()

G4double G4mplIonisationWithDeltaModel::Dispersion ( const G4Material material,
const G4DynamicParticle dp,
G4double tmax,
G4double length 
)
virtual

Implements G4VEmFluctuationModel.

Definition at line 321 of file G4mplIonisationWithDeltaModel.cc.

325{
326 G4double siga = 0.0;
327 G4double tau = dp->GetKineticEnergy()/mass;
328 if(tau > 0.0) {
329 G4double electronDensity = material->GetElectronDensity();
330 G4double gam = tau + 1.0;
331 G4double invbeta2 = (gam*gam)/(tau * (tau+2.0));
332 siga = (invbeta2 - 0.5) * twopi_mc2_rcl2 * tmax * length
333 * electronDensity * chargeSquare;
334 }
335 return siga;
336}
G4double GetKineticEnergy() const
G4double GetElectronDensity() const
Definition: G4Material.hh:216

Referenced by SampleFluctuations().

◆ Initialise()

void G4mplIonisationWithDeltaModel::Initialise ( const G4ParticleDefinition p,
const G4DataVector  
)
virtual

Implements G4VEmModel.

Definition at line 115 of file G4mplIonisationWithDeltaModel.cc.

117{
118 if(!monopole) { SetParticle(p); }
119 if(!fParticleChange) { fParticleChange = GetParticleChangeForLoss(); }
120}
G4ParticleChangeForLoss * GetParticleChangeForLoss()
Definition: G4VEmModel.cc:95

◆ MaxSecondaryEnergy()

G4double G4mplIonisationWithDeltaModel::MaxSecondaryEnergy ( const G4ParticleDefinition ,
G4double  kinEnergy 
)
protectedvirtual

Reimplemented from G4VEmModel.

Definition at line 341 of file G4mplIonisationWithDeltaModel.cc.

343{
344 G4double tau = kinEnergy/mass;
345 return 2.0*electron_mass_c2*tau*(tau + 2.);
346}

Referenced by ComputeCrossSectionPerElectron(), ComputeDEDXPerVolume(), and SampleSecondaries().

◆ SampleFluctuations()

G4double G4mplIonisationWithDeltaModel::SampleFluctuations ( const G4Material material,
const G4DynamicParticle dp,
G4double tmax,
G4double length,
G4double meanLoss 
)
virtual

Implements G4VEmFluctuationModel.

Definition at line 292 of file G4mplIonisationWithDeltaModel.cc.

298{
299 G4double siga = Dispersion(material,dp,tmax,length);
300 G4double loss = meanLoss;
301 siga = sqrt(siga);
302 G4double twomeanLoss = meanLoss + meanLoss;
303
304 if(twomeanLoss < siga) {
305 G4double x;
306 do {
307 loss = twomeanLoss*G4UniformRand();
308 x = (loss - meanLoss)/siga;
309 } while (1.0 - 0.5*x*x < G4UniformRand());
310 } else {
311 do {
312 loss = G4RandGauss::shoot(meanLoss,siga);
313 } while (0.0 > loss || loss > twomeanLoss);
314 }
315 return loss;
316}
#define G4UniformRand()
Definition: Randomize.hh:53
virtual G4double Dispersion(const G4Material *, const G4DynamicParticle *, G4double &tmax, G4double &length)

◆ SampleSecondaries()

void G4mplIonisationWithDeltaModel::SampleSecondaries ( std::vector< G4DynamicParticle * > *  vdp,
const G4MaterialCutsCouple ,
const G4DynamicParticle dp,
G4double  tmin,
G4double  maxEnergy 
)
virtual

Implements G4VEmModel.

Definition at line 234 of file G4mplIonisationWithDeltaModel.cc.

239{
240 G4double kineticEnergy = dp->GetKineticEnergy();
241 G4double tmax = MaxSecondaryEnergy(dp->GetDefinition(),kineticEnergy);
242
243 G4double maxKinEnergy = std::min(maxEnergy,tmax);
244 if(minKinEnergy >= maxKinEnergy) { return; }
245
246 //G4cout << "G4mplIonisationWithDeltaModel::SampleSecondaries: E(GeV)= "
247 // << kineticEnergy/GeV << " M(GeV)= " << mass/GeV
248 // << " tmin(MeV)= " << minKinEnergy/MeV << G4endl;
249
250 G4double totEnergy = kineticEnergy + mass;
251 G4double etot2 = totEnergy*totEnergy;
252 G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*mass)/etot2;
253
254 // sampling without nuclear size effect
256 G4double deltaKinEnergy = minKinEnergy*maxKinEnergy
257 /(minKinEnergy*(1.0 - q) + maxKinEnergy*q);
258
259 // delta-electron is produced
260 G4double totMomentum = totEnergy*sqrt(beta2);
261 G4double deltaMomentum =
262 sqrt(deltaKinEnergy * (deltaKinEnergy + 2.0*electron_mass_c2));
263 G4double cost = deltaKinEnergy * (totEnergy + electron_mass_c2) /
264 (deltaMomentum * totMomentum);
265 if(cost > 1.0) { cost = 1.0; }
266
267 G4double sint = sqrt((1.0 - cost)*(1.0 + cost));
268
269 G4double phi = twopi * G4UniformRand() ;
270
271 G4ThreeVector deltaDirection(sint*cos(phi),sint*sin(phi), cost);
272 G4ThreeVector direction = dp->GetMomentumDirection();
273 deltaDirection.rotateUz(direction);
274
275 // create G4DynamicParticle object for delta ray
276 G4DynamicParticle* delta =
277 new G4DynamicParticle(theElectron,deltaDirection,deltaKinEnergy);
278
279 vdp->push_back(delta);
280
281 // Change kinematics of primary particle
282 kineticEnergy -= deltaKinEnergy;
283 G4ThreeVector finalP = direction*totMomentum - deltaDirection*deltaMomentum;
284 finalP = finalP.unit();
285
286 fParticleChange->SetProposedKineticEnergy(kineticEnergy);
287 fParticleChange->SetProposedMomentumDirection(finalP);
288}
Hep3Vector unit() const
Hep3Vector & rotateUz(const Hep3Vector &)
Definition: ThreeVector.cc:72
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void SetProposedMomentumDirection(const G4ThreeVector &dir)

◆ SetParticle()

void G4mplIonisationWithDeltaModel::SetParticle ( const G4ParticleDefinition p)

Definition at line 100 of file G4mplIonisationWithDeltaModel.cc.

101{
102 monopole = p;
103 mass = monopole->GetPDGMass();
104 G4double emin =
105 std::min(LowEnergyLimit(),0.1*mass*(1/sqrt(1 - betalow*betalow) - 1));
106 G4double emax =
107 std::max(HighEnergyLimit(),10*mass*(1/sqrt(1 - beta2lim) - 1));
108 SetLowEnergyLimit(emin);
109 SetHighEnergyLimit(emax);
110}
void SetHighEnergyLimit(G4double)
Definition: G4VEmModel.hh:585
G4double LowEnergyLimit() const
Definition: G4VEmModel.hh:529
G4double HighEnergyLimit() const
Definition: G4VEmModel.hh:522
void SetLowEnergyLimit(G4double)
Definition: G4VEmModel.hh:592

Referenced by ComputeCrossSectionPerElectron(), ComputeDEDXPerVolume(), Initialise(), and G4mplIonisation::InitialiseEnergyLossProcess().


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