Geant4  10.02.p03
G4UniversalFluctuation Class Reference

#include <G4UniversalFluctuation.hh>

Inheritance diagram for G4UniversalFluctuation:
Collaboration diagram for G4UniversalFluctuation:

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 ()
 
const G4StringGetName () const
 

Private Member Functions

G4UniversalFluctuationoperator= (const G4UniversalFluctuation &right)
 
 G4UniversalFluctuation (const G4UniversalFluctuation &)
 

Private Attributes

const G4ParticleDefinitionparticle
 
const G4MateriallastMaterial
 
G4double particleMass
 
G4double m_Inv_particleMass
 
G4double m_massrate
 
G4double chargeSquare
 
G4double ipotFluct
 
G4double electronDensity
 
G4double f1Fluct
 
G4double f2Fluct
 
G4double e1Fluct
 
G4double e2Fluct
 
G4double e1LogFluct
 
G4double e2LogFluct
 
G4double ipotLogFluct
 
G4double e0
 
G4double esmall
 
G4double e1
 
G4double e2
 
G4double minNumberInteractionsBohr
 
G4double theBohrBeta2
 
G4double minLoss
 
G4double nmaxCont
 
G4double rate
 
G4double fw
 
G4int sizearray
 
G4doublerndmarray
 

Detailed Description

Definition at line 62 of file G4UniversalFluctuation.hh.

Constructor & Destructor Documentation

◆ G4UniversalFluctuation() [1/2]

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

Definition at line 86 of file G4UniversalFluctuation.cc.

88  particle(0),
91  minLoss(10.*eV),
92  nmaxCont(16.),
93  rate(0.55),
94  fw(4.)
95 {
96  lastMaterial = 0;
97 
100  = e1 = e2 = 0;
102  sizearray = 30;
103  rndmarray = new G4double[30];
104 }
const G4Material * lastMaterial
float proton_mass_c2
Definition: hepunit.py:275
const G4ParticleDefinition * particle
static const double eV
Definition: G4SIunits.hh:212
static const double keV
Definition: G4SIunits.hh:213
double G4double
Definition: G4Types.hh:76
G4VEmFluctuationModel(const G4String &nam)
#define DBL_MAX
Definition: templates.hh:83

◆ ~G4UniversalFluctuation()

G4UniversalFluctuation::~G4UniversalFluctuation ( )
virtual

Definition at line 108 of file G4UniversalFluctuation.cc.

109 {
110  delete [] rndmarray;
111 }

◆ G4UniversalFluctuation() [2/2]

G4UniversalFluctuation::G4UniversalFluctuation ( const G4UniversalFluctuation )
private

Member Function Documentation

◆ Dispersion()

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

Implements G4VEmFluctuationModel.

Definition at line 370 of file G4UniversalFluctuation.cc.

375 {
376  if(dp->GetDefinition() != particle) { InitialiseMe(dp->GetDefinition()); }
377 
378  electronDensity = material->GetElectronDensity();
379 
381  G4double beta2 = 1.0 - 1.0/(gam*gam);
382 
383  G4double siga = (1.0/beta2 - 0.5) * twopi_mc2_rcl2 * tmax * length
384  * electronDensity * chargeSquare;
385 
386  return siga;
387 }
int twopi_mc2_rcl2
Definition: hepunit.py:294
G4double GetKineticEnergy() const
virtual void InitialiseMe(const G4ParticleDefinition *)
const G4ParticleDefinition * particle
G4double GetElectronDensity() const
Definition: G4Material.hh:217
G4ParticleDefinition * GetDefinition() const
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:

◆ InitialiseMe()

void G4UniversalFluctuation::InitialiseMe ( const G4ParticleDefinition part)
virtual

Reimplemented from G4VEmFluctuationModel.

Definition at line 115 of file G4UniversalFluctuation.cc.

116 {
117  particle = part;
118  particleMass = part->GetPDGMass();
119  G4double q = part->GetPDGCharge()/eplus;
120 
121  // Derived quantities
124  chargeSquare = q*q;
125 }
TString part[npart]
float electron_mass_c2
Definition: hepunit.py:274
const G4ParticleDefinition * particle
double G4double
Definition: G4Types.hh:76
static const double eplus
Definition: G4SIunits.hh:196
G4double GetPDGCharge() const
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator=()

G4UniversalFluctuation& G4UniversalFluctuation::operator= ( const G4UniversalFluctuation right)
private

◆ SampleFluctuations()

G4double G4UniversalFluctuation::SampleFluctuations ( const G4MaterialCutsCouple couple,
const G4DynamicParticle dp,
G4double  tmax,
G4double  length,
G4double  averageLoss 
)
virtual

Implements G4VEmFluctuationModel.

Definition at line 130 of file G4UniversalFluctuation.cc.

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

◆ SetParticleAndCharge()

void G4UniversalFluctuation::SetParticleAndCharge ( const G4ParticleDefinition part,
G4double  q2 
)
virtual

Reimplemented from G4VEmFluctuationModel.

Definition at line 392 of file G4UniversalFluctuation.cc.

394 {
395  if(part != particle) {
396  particle = part;
397  particleMass = part->GetPDGMass();
398 
399  // Derived quantities
400  if( particleMass != 0.0 ){
403  }else{
406  }
407  }
408  chargeSquare = q2;
409 }
TString part[npart]
float electron_mass_c2
Definition: hepunit.py:274
const G4ParticleDefinition * particle
#define DBL_MAX
Definition: templates.hh:83
Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ chargeSquare

G4double G4UniversalFluctuation::chargeSquare
private

Definition at line 101 of file G4UniversalFluctuation.hh.

◆ e0

G4double G4UniversalFluctuation::e0
private

Definition at line 114 of file G4UniversalFluctuation.hh.

◆ e1

G4double G4UniversalFluctuation::e1
private

Definition at line 117 of file G4UniversalFluctuation.hh.

◆ e1Fluct

G4double G4UniversalFluctuation::e1Fluct
private

Definition at line 109 of file G4UniversalFluctuation.hh.

◆ e1LogFluct

G4double G4UniversalFluctuation::e1LogFluct
private

Definition at line 111 of file G4UniversalFluctuation.hh.

◆ e2

G4double G4UniversalFluctuation::e2
private

Definition at line 117 of file G4UniversalFluctuation.hh.

◆ e2Fluct

G4double G4UniversalFluctuation::e2Fluct
private

Definition at line 110 of file G4UniversalFluctuation.hh.

◆ e2LogFluct

G4double G4UniversalFluctuation::e2LogFluct
private

Definition at line 112 of file G4UniversalFluctuation.hh.

◆ electronDensity

G4double G4UniversalFluctuation::electronDensity
private

Definition at line 105 of file G4UniversalFluctuation.hh.

◆ esmall

G4double G4UniversalFluctuation::esmall
private

Definition at line 115 of file G4UniversalFluctuation.hh.

◆ f1Fluct

G4double G4UniversalFluctuation::f1Fluct
private

Definition at line 107 of file G4UniversalFluctuation.hh.

◆ f2Fluct

G4double G4UniversalFluctuation::f2Fluct
private

Definition at line 108 of file G4UniversalFluctuation.hh.

◆ fw

G4double G4UniversalFluctuation::fw
private

Definition at line 123 of file G4UniversalFluctuation.hh.

◆ ipotFluct

G4double G4UniversalFluctuation::ipotFluct
private

Definition at line 104 of file G4UniversalFluctuation.hh.

◆ ipotLogFluct

G4double G4UniversalFluctuation::ipotLogFluct
private

Definition at line 113 of file G4UniversalFluctuation.hh.

◆ lastMaterial

const G4Material* G4UniversalFluctuation::lastMaterial
private

Definition at line 94 of file G4UniversalFluctuation.hh.

◆ m_Inv_particleMass

G4double G4UniversalFluctuation::m_Inv_particleMass
private

Definition at line 99 of file G4UniversalFluctuation.hh.

◆ m_massrate

G4double G4UniversalFluctuation::m_massrate
private

Definition at line 100 of file G4UniversalFluctuation.hh.

◆ minLoss

G4double G4UniversalFluctuation::minLoss
private

Definition at line 121 of file G4UniversalFluctuation.hh.

◆ minNumberInteractionsBohr

G4double G4UniversalFluctuation::minNumberInteractionsBohr
private

Definition at line 119 of file G4UniversalFluctuation.hh.

◆ nmaxCont

G4double G4UniversalFluctuation::nmaxCont
private

Definition at line 122 of file G4UniversalFluctuation.hh.

◆ particle

const G4ParticleDefinition* G4UniversalFluctuation::particle
private

Definition at line 93 of file G4UniversalFluctuation.hh.

◆ particleMass

G4double G4UniversalFluctuation::particleMass
private

Definition at line 96 of file G4UniversalFluctuation.hh.

◆ rate

G4double G4UniversalFluctuation::rate
private

Definition at line 123 of file G4UniversalFluctuation.hh.

◆ rndmarray

G4double* G4UniversalFluctuation::rndmarray
private

Definition at line 126 of file G4UniversalFluctuation.hh.

◆ sizearray

G4int G4UniversalFluctuation::sizearray
private

Definition at line 125 of file G4UniversalFluctuation.hh.

◆ theBohrBeta2

G4double G4UniversalFluctuation::theBohrBeta2
private

Definition at line 120 of file G4UniversalFluctuation.hh.


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