Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions
G4UniversalFluctuation Class Reference

#include <G4UniversalFluctuation.hh>

Inheritance diagram for G4UniversalFluctuation:
G4VEmFluctuationModel

Public Member Functions

 G4UniversalFluctuation (const G4String &nam="UniFluc")
 
virtual ~G4UniversalFluctuation ()
 
virtual G4double SampleFluctuations (const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double, G4double, G4double)
 
virtual G4double Dispersion (const G4Material *, const G4DynamicParticle *, G4double, G4double)
 
virtual void InitialiseMe (const G4ParticleDefinition *)
 
virtual void SetParticleAndCharge (const G4ParticleDefinition *, G4double q2)
 
- Public Member Functions inherited from G4VEmFluctuationModel
 G4VEmFluctuationModel (const G4String &nam)
 
virtual ~G4VEmFluctuationModel ()
 
G4String GetName () const
 

Detailed Description

Definition at line 62 of file G4UniversalFluctuation.hh.

Constructor & Destructor Documentation

G4UniversalFluctuation::G4UniversalFluctuation ( const G4String nam = "UniFluc")

Definition at line 86 of file G4UniversalFluctuation.cc.

References DBL_MAX.

88  particle(0),
89  minNumberInteractionsBohr(10.0),
90  theBohrBeta2(50.0*keV/proton_mass_c2),
91  minLoss(10.*eV),
92  nmaxCont(16.),
93  rate(0.55),
94  fw(4.)
95 {
96  lastMaterial = 0;
97 
98  particleMass = chargeSquare = ipotFluct = electronDensity = f1Fluct = f2Fluct
99  = e1Fluct = e2Fluct = e1LogFluct = e2LogFluct = ipotLogFluct = e0 = esmall
100  = e1 = e2 = 0;
101  m_Inv_particleMass = m_massrate = DBL_MAX;
102 }
float proton_mass_c2
Definition: hepunit.py:275
G4VEmFluctuationModel(const G4String &nam)
#define DBL_MAX
Definition: templates.hh:83
G4UniversalFluctuation::~G4UniversalFluctuation ( )
virtual

Definition at line 106 of file G4UniversalFluctuation.cc.

107 {}

Member Function Documentation

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

Implements G4VEmFluctuationModel.

Definition at line 357 of file G4UniversalFluctuation.cc.

References G4InuclParticleNames::gam, G4DynamicParticle::GetDefinition(), G4Material::GetElectronDensity(), G4DynamicParticle::GetKineticEnergy(), InitialiseMe(), and python.hepunit::twopi_mc2_rcl2.

362 {
363  if(dp->GetDefinition() != particle) { InitialiseMe(dp->GetDefinition()); }
364 
365  electronDensity = material->GetElectronDensity();
366 
367  G4double gam = (dp->GetKineticEnergy())*m_Inv_particleMass + 1.0;
368  G4double beta2 = 1.0 - 1.0/(gam*gam);
369 
370  G4double siga = (1.0/beta2 - 0.5) * twopi_mc2_rcl2 * tmax * length
371  * electronDensity * chargeSquare;
372 
373  return siga;
374 }
G4double GetKineticEnergy() const
G4ParticleDefinition * GetDefinition() const
G4double GetElectronDensity() const
Definition: G4Material.hh:215
virtual void InitialiseMe(const G4ParticleDefinition *)
double G4double
Definition: G4Types.hh:76
void G4UniversalFluctuation::InitialiseMe ( const G4ParticleDefinition part)
virtual

Reimplemented from G4VEmFluctuationModel.

Definition at line 111 of file G4UniversalFluctuation.cc.

References python.hepunit::electron_mass_c2, python.hepunit::eplus, G4ParticleDefinition::GetPDGCharge(), and G4ParticleDefinition::GetPDGMass().

Referenced by Dispersion(), G4IonFluctuations::InitialiseMe(), and SampleFluctuations().

112 {
113  particle = part;
114  particleMass = part->GetPDGMass();
115  G4double q = part->GetPDGCharge()/eplus;
116 
117  // Derived quantities
118  m_Inv_particleMass = 1.0 / particleMass;
119  m_massrate = electron_mass_c2 * m_Inv_particleMass ;
120  chargeSquare = q*q;
121 }
float electron_mass_c2
Definition: hepunit.py:274
G4double GetPDGMass() const
double G4double
Definition: G4Types.hh:76
G4double GetPDGCharge() const
G4double G4UniversalFluctuation::SampleFluctuations ( const G4MaterialCutsCouple couple,
const G4DynamicParticle dp,
G4double  tmax,
G4double  length,
G4double  averageLoss 
)
virtual

Implements G4VEmFluctuationModel.

Definition at line 126 of file G4UniversalFluctuation.cc.

References python.hepunit::electron_mass_c2, G4Exp(), G4Log(), G4Poisson(), G4UniformRand, G4InuclParticleNames::gam, G4DynamicParticle::GetDefinition(), G4Material::GetElectronDensity(), G4IonisParamMat::GetEnergy0fluct(), G4IonisParamMat::GetEnergy1fluct(), G4IonisParamMat::GetEnergy2fluct(), G4IonisParamMat::GetF1fluct(), G4IonisParamMat::GetF2fluct(), G4Material::GetIonisation(), G4DynamicParticle::GetKineticEnergy(), G4IonisParamMat::GetLogEnergy1fluct(), G4IonisParamMat::GetLogEnergy2fluct(), G4IonisParamMat::GetLogMeanExcEnergy(), G4MaterialCutsCouple::GetMaterial(), G4IonisParamMat::GetMeanExcitationEnergy(), InitialiseMe(), eplot::material, G4INCL::Math::max(), G4INCL::DeJongSpin::shoot(), and python.hepunit::twopi_mc2_rcl2.

Referenced by G4IonFluctuations::SampleFluctuations().

131 {
132  // Calculate actual loss from the mean loss.
133  // The model used to get the fluctuations is essentially the same
134  // as in Glandz in Geant3 (Cern program library W5013, phys332).
135  // L. Urban et al. NIM A362, p.416 (1995) and Geant4 Physics Reference Manual
136 
137  // shortcut for very small loss or from a step nearly equal to the range
138  // (out of validity of the model)
139  //
140  G4double meanLoss = averageLoss;
141  G4double tkin = dp->GetKineticEnergy();
142  //G4cout<< "Emean= "<< meanLoss<< " tmax= "<< tmax<< " L= "<<length<<G4endl;
143  if (meanLoss < minLoss) { return meanLoss; }
144 
145  if(dp->GetDefinition() != particle) { InitialiseMe(dp->GetDefinition()); }
146 
147  G4double tau = tkin * m_Inv_particleMass;
148  G4double gam = tau + 1.0;
149  G4double gam2 = gam*gam;
150  G4double beta2 = tau*(tau + 2.0)/gam2;
151 
152  G4double loss(0.), siga(0.);
153 
154  const G4Material* material = couple->GetMaterial();
155 
156  // Gaussian regime
157  // for heavy particles only and conditions
158  // for Gauusian fluct. has been changed
159  //
160  if ((particleMass > electron_mass_c2) &&
161  (meanLoss >= minNumberInteractionsBohr*tmax))
162  {
163  G4double tmaxkine = 2.*electron_mass_c2*beta2*gam2/
164  (1.+m_massrate*(2.*gam+m_massrate)) ;
165  if (tmaxkine <= 2.*tmax)
166  {
167  electronDensity = material->GetElectronDensity();
168  siga = sqrt((1.0/beta2 - 0.5) * twopi_mc2_rcl2 * tmax * length
169  * electronDensity * chargeSquare);
170 
171  G4double sn = meanLoss/siga;
172 
173  // thick target case
174  if (sn >= 2.0) {
175 
176  G4double twomeanLoss = meanLoss + meanLoss;
177  do {
178  loss = G4RandGauss::shoot(meanLoss,siga);
179  } while (0.0 > loss || twomeanLoss < loss);
180 
181  // Gamma distribution
182  } else {
183 
184  G4double neff = sn*sn;
185  loss = meanLoss*G4RandGamma::shoot(neff,1.0)/neff;
186  }
187  //G4cout << "Gauss: " << loss << G4endl;
188  return loss;
189  }
190  }
191 
192  // Glandz regime : initialisation
193  //
194  if (material != lastMaterial) {
195  f1Fluct = material->GetIonisation()->GetF1fluct();
196  f2Fluct = material->GetIonisation()->GetF2fluct();
197  e1Fluct = material->GetIonisation()->GetEnergy1fluct();
198  e2Fluct = material->GetIonisation()->GetEnergy2fluct();
199  e1LogFluct = material->GetIonisation()->GetLogEnergy1fluct();
200  e2LogFluct = material->GetIonisation()->GetLogEnergy2fluct();
201  ipotFluct = material->GetIonisation()->GetMeanExcitationEnergy();
202  ipotLogFluct = material->GetIonisation()->GetLogMeanExcEnergy();
203  e0 = material->GetIonisation()->GetEnergy0fluct();
204  esmall = 0.5*sqrt(e0*ipotFluct);
205  lastMaterial = material;
206  }
207 
208  // very small step or low-density material
209  if(tmax <= e0) { return meanLoss; }
210 
211  G4double losstot = 0.;
212  G4int nstep = 1;
213  if(meanLoss < 25.*ipotFluct)
214  {
215  if(G4UniformRand()*ipotFluct< 0.04*meanLoss)
216  { nstep = 1; }
217  else
218  {
219  nstep = 2;
220  meanLoss *= 0.5;
221  }
222  }
223 
224  for (G4int istep=0; istep < nstep; ++istep) {
225 
226  loss = 0.;
227 
228  G4double a1 = 0. , a2 = 0., a3 = 0. ;
229 
230  if(tmax > ipotFluct) {
231  G4double w2 = G4Log(2.*electron_mass_c2*beta2*gam2)-beta2;
232 
233  if(w2 > ipotLogFluct) {
234  G4double C = meanLoss*(1.-rate)/(w2-ipotLogFluct);
235  a1 = C*f1Fluct*(w2-e1LogFluct)/e1Fluct;
236  if(w2 > e2LogFluct) {
237  a2 = C*f2Fluct*(w2-e2LogFluct)/e2Fluct;
238  }
239  if(a1 < nmaxCont) {
240  //small energy loss
241  G4double sa1 = sqrt(a1);
242  if(G4UniformRand() < G4Exp(-sa1))
243  {
244  e1 = esmall;
245  a1 = meanLoss*(1.-rate)/e1;
246  a2 = 0.;
247  e2 = e2Fluct;
248  }
249  else
250  {
251  a1 = sa1 ;
252  e1 = sa1*e1Fluct;
253  e2 = e2Fluct;
254  }
255 
256  } else {
257  //not small energy loss
258  //correction to get better fwhm value
259  a1 /= fw;
260  e1 = fw*e1Fluct;
261  e2 = e2Fluct;
262  }
263  }
264  }
265 
266  G4double w1 = tmax/e0;
267  if(tmax > e0) {
268  a3 = rate*meanLoss*(tmax-e0)/(e0*tmax*G4Log(w1));
269  if(a1+a2 <= 0.) {
270  a3 /= rate;
271  }
272  }
273  //'nearly' Gaussian fluctuation if a1>nmaxCont&&a2>nmaxCont&&a3>nmaxCont
274  G4double emean = 0.;
275  G4double sig2e = 0., sige = 0.;
276  G4double p1 = 0., p2 = 0., p3 = 0.;
277 
278  // excitation of type 1
279  if(a1 > nmaxCont)
280  {
281  emean += a1*e1;
282  sig2e += a1*e1*e1;
283  }
284  else if(a1 > 0.)
285  {
286  p1 = G4double(G4Poisson(a1));
287  loss += p1*e1;
288  if(p1 > 0.) {
289  loss += (1.-2.*G4UniformRand())*e1;
290  }
291  }
292 
293  // excitation of type 2
294  if(a2 > nmaxCont)
295  {
296  emean += a2*e2;
297  sig2e += a2*e2*e2;
298  }
299  else if(a2 > 0.)
300  {
301  p2 = G4double(G4Poisson(a2));
302  loss += p2*e2;
303  if(p2 > 0.)
304  loss += (1.-2.*G4UniformRand())*e2;
305  }
306  if(emean > 0.)
307  {
308  sige = sqrt(sig2e);
309  loss += max(0.,G4RandGauss::shoot(emean,sige));
310  }
311 
312  // ionisation
313  G4double lossc = 0.;
314  if(a3 > 0.) {
315  emean = 0.;
316  sig2e = 0.;
317  sige = 0.;
318  p3 = a3;
319  G4double alfa = 1.;
320  if(a3 > nmaxCont)
321  {
322  alfa = w1*(nmaxCont+a3)/(w1*nmaxCont+a3);
323  G4double alfa1 = alfa*G4Log(alfa)/(alfa-1.);
324  G4double namean = a3*w1*(alfa-1.)/((w1-1.)*alfa);
325  emean += namean*e0*alfa1;
326  sig2e += e0*e0*namean*(alfa-alfa1*alfa1);
327  p3 = a3-namean;
328  }
329 
330  G4double w2 = alfa*e0;
331  G4double w = (tmax-w2)/tmax;
332  G4int nb = G4Poisson(p3);
333  if(nb > 0) {
334  for (G4int k=0; k<nb; k++) { lossc += w2/(1.-w*G4UniformRand()); }
335  }
336 
337  if(emean > 0.)
338  {
339  sige = sqrt(sig2e);
340  lossc += max(0.,G4RandGauss::shoot(emean,sige));
341  }
342  }
343 
344  loss += lossc;
345 
346  losstot += loss;
347  }
348  //G4cout << "Vavilov: " << losstot << " Nstep= " << nstep << G4endl;
349 
350  return losstot;
351 
352 }
ThreeVector shoot(const G4int Ap, const G4int Af)
G4IonisParamMat * GetIonisation() const
Definition: G4Material.hh:224
G4long G4Poisson(G4double mean)
Definition: G4Poisson.hh:51
G4double GetKineticEnergy() const
G4double GetEnergy2fluct() const
G4double GetLogEnergy2fluct() const
G4ParticleDefinition * GetDefinition() const
G4double GetLogMeanExcEnergy() const
int G4int
Definition: G4Types.hh:78
string material
Definition: eplot.py:19
G4double GetEnergy0fluct() const
#define G4UniformRand()
Definition: Randomize.hh:87
G4double GetElectronDensity() const
Definition: G4Material.hh:215
float electron_mass_c2
Definition: hepunit.py:274
virtual void InitialiseMe(const G4ParticleDefinition *)
G4double G4Log(G4double x)
Definition: G4Log.hh:227
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:180
G4double GetLogEnergy1fluct() const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double GetMeanExcitationEnergy() const
G4double GetF2fluct() const
double G4double
Definition: G4Types.hh:76
G4double GetF1fluct() const
const G4Material * GetMaterial() const
G4double GetEnergy1fluct() const
void G4UniversalFluctuation::SetParticleAndCharge ( const G4ParticleDefinition part,
G4double  q2 
)
virtual

Reimplemented from G4VEmFluctuationModel.

Definition at line 379 of file G4UniversalFluctuation.cc.

References DBL_MAX, python.hepunit::electron_mass_c2, and G4ParticleDefinition::GetPDGMass().

Referenced by G4IonFluctuations::SetParticleAndCharge().

381 {
382  if(part != particle) {
383  particle = part;
384  particleMass = part->GetPDGMass();
385 
386  // Derived quantities
387  if( particleMass != 0.0 ){
388  m_Inv_particleMass = 1.0 / particleMass;
389  m_massrate = electron_mass_c2 * m_Inv_particleMass ;
390  }else{
391  m_Inv_particleMass = DBL_MAX;
392  m_massrate = DBL_MAX;
393  }
394  }
395  chargeSquare = q2;
396 }
float electron_mass_c2
Definition: hepunit.py:274
G4double GetPDGMass() const
#define DBL_MAX
Definition: templates.hh:83

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