Geant4-11
Public Member Functions | Protected Member Functions | Protected Attributes | Private Attributes
G4UrbanFluctuation Class Reference

#include <G4UrbanFluctuation.hh>

Inheritance diagram for G4UrbanFluctuation:
G4UniversalFluctuation G4VEmFluctuationModel

Public Member Functions

G4double Dispersion (const G4Material *, const G4DynamicParticle *, const G4double, const G4double, const G4double) override
 
 G4UrbanFluctuation (const G4String &nam="UrbanFluc")
 
 G4UrbanFluctuation (const G4UrbanFluctuation &)=delete
 
const G4StringGetName () const
 
void InitialiseMe (const G4ParticleDefinition *) override
 
G4UrbanFluctuationoperator= (const G4UrbanFluctuation &right)=delete
 
G4double SampleFluctuations (const G4MaterialCutsCouple *, const G4DynamicParticle *, const G4double, const G4double, const G4double, const G4double) override
 
void SetParticleAndCharge (const G4ParticleDefinition *, G4double q2) override
 
 ~G4UrbanFluctuation () override
 

Protected Member Functions

void AddExcitation (CLHEP::HepRandomEngine *rndm, const G4double ax, const G4double ex, G4double &eav, G4double &eloss, G4double &esig2)
 
void SampleGauss (CLHEP::HepRandomEngine *rndm, const G4double eav, const G4double esig2, G4double &eloss)
 
G4double SampleGlandz (CLHEP::HepRandomEngine *rndm, const G4Material *, const G4double tcut) override
 

Protected Attributes

G4double a0 = 42.0
 
G4double chargeSquare = 1.0
 
G4double e0 = 0.0
 
G4double fw = 4.0
 
G4double ipotFluct = 0.0
 
G4double ipotLogFluct = 0.0
 
G4double m_Inv_particleMass = DBL_MAX
 
G4double m_massrate = DBL_MAX
 
G4double meanLoss = 0.0
 
G4double minLoss
 
G4double minNumberInteractionsBohr = 10.0
 
G4double nmaxCont = 8.0
 
const G4ParticleDefinitionparticle = nullptr
 
G4double particleMass = 0.0
 
G4double rate = 0.56
 
G4doublerndmarray = nullptr
 
G4int sizearray = 30
 
G4double w2 = 0.0
 

Private Attributes

G4double e1Fluct = 0.0
 
G4double e1LogFluct = 0.0
 
G4double e2Fluct = 0.0
 
G4double e2LogFluct = 0.0
 
G4double esmall = 0.0
 
G4double f1Fluct = 0.0
 
G4double f2Fluct = 0.0
 
G4LossTableManagerfManager
 
const G4MateriallastMaterial = nullptr
 
const G4String name
 

Detailed Description

Definition at line 54 of file G4UrbanFluctuation.hh.

Constructor & Destructor Documentation

◆ G4UrbanFluctuation() [1/2]

G4UrbanFluctuation::G4UrbanFluctuation ( const G4String nam = "UrbanFluc")
explicit

Definition at line 55 of file G4UrbanFluctuation.cc.

57{}
G4UniversalFluctuation(const G4String &nam="UniFluc")

◆ ~G4UrbanFluctuation()

G4UrbanFluctuation::~G4UrbanFluctuation ( )
override

Definition at line 61 of file G4UrbanFluctuation.cc.

62{}

◆ G4UrbanFluctuation() [2/2]

G4UrbanFluctuation::G4UrbanFluctuation ( const G4UrbanFluctuation )
delete

Member Function Documentation

◆ AddExcitation()

void G4UniversalFluctuation::AddExcitation ( CLHEP::HepRandomEngine rndm,
const G4double  ax,
const G4double  ex,
G4double eav,
G4double eloss,
G4double esig2 
)
inlineprotectedinherited

Definition at line 129 of file G4UniversalFluctuation.hh.

133{
134 if(ax > nmaxCont) {
135 eav += ax*ex;
136 esig2 += ax*ex*ex;
137 } else {
138 const G4int p = G4Poisson(ax);
139 if(p > 0) { eloss += ((p + 1) - 2.*rndm->flat())*ex; }
140 }
141}
G4long G4Poisson(G4double mean)
Definition: G4Poisson.hh:50
int G4int
Definition: G4Types.hh:85
virtual double flat()=0

References CLHEP::HepRandomEngine::flat(), G4Poisson(), and G4UniversalFluctuation::nmaxCont.

Referenced by G4UniversalFluctuation::SampleGlandz(), and SampleGlandz().

◆ Dispersion()

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

Implements G4VEmFluctuationModel.

Definition at line 244 of file G4UniversalFluctuation.cc.

250{
251 if(dp->GetDefinition() != particle) { InitialiseMe(dp->GetDefinition()); }
252 const G4double beta = dp->GetBeta();
253 return (tmax/(beta*beta) - 0.5*tcut) * CLHEP::twopi_mc2_rcl2 * length
254 * material->GetElectronDensity() * chargeSquare;
255}
double G4double
Definition: G4Types.hh:83
G4ParticleDefinition * GetDefinition() const
G4double GetBeta() const
const G4ParticleDefinition * particle
void InitialiseMe(const G4ParticleDefinition *) override
static constexpr double twopi_mc2_rcl2
string material
Definition: eplot.py:19

References anonymous_namespace{G4PionRadiativeDecayChannel.cc}::beta, G4UniversalFluctuation::chargeSquare, G4DynamicParticle::GetBeta(), G4DynamicParticle::GetDefinition(), G4UniversalFluctuation::InitialiseMe(), eplot::material, G4UniversalFluctuation::particle, and CLHEP::twopi_mc2_rcl2.

◆ GetName()

const G4String & G4VEmFluctuationModel::GetName ( ) const
inlineinherited

Definition at line 121 of file G4VEmFluctuationModel.hh.

122{
123 return name;
124}

References G4VEmFluctuationModel::name.

Referenced by G4LossTableManager::Register(), and G4EmConfigurator::SetModelForRegion().

◆ InitialiseMe()

void G4UniversalFluctuation::InitialiseMe ( const G4ParticleDefinition part)
overridevirtualinherited

Reimplemented from G4VEmFluctuationModel.

Definition at line 74 of file G4UniversalFluctuation.cc.

75{
76 particle = part;
77 particleMass = part->GetPDGMass();
78 const G4double q = part->GetPDGCharge()/CLHEP::eplus;
79
80 // Derived quantities
83 chargeSquare = q*q;
84}
G4double GetPDGCharge() const
static constexpr double eplus
static constexpr double electron_mass_c2

References G4UniversalFluctuation::chargeSquare, CLHEP::electron_mass_c2, CLHEP::eplus, G4ParticleDefinition::GetPDGCharge(), G4ParticleDefinition::GetPDGMass(), G4UniversalFluctuation::m_Inv_particleMass, G4UniversalFluctuation::m_massrate, G4UniversalFluctuation::particle, and G4UniversalFluctuation::particleMass.

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

◆ operator=()

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

◆ SampleFluctuations()

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

Implements G4VEmFluctuationModel.

Definition at line 89 of file G4UniversalFluctuation.cc.

95{
96 // Calculate actual loss from the mean loss.
97 // The model used to get the fluctuations is essentially the same
98 // as in Glandz in Geant3 (Cern program library W5013, phys332).
99 // L. Urban et al. NIM A362, p.416 (1995) and Geant4 Physics Reference Manual
100
101 // shortcut for very small loss or from a step nearly equal to the range
102 // (out of validity of the model)
103 //
104 if (averageLoss < minLoss) { return averageLoss; }
105 meanLoss = averageLoss;
106 const G4double tkin = dp->GetKineticEnergy();
107 //G4cout<< "Emean= "<< meanLoss<< " tmax= "<< tmax<< " L= "<<length<<G4endl;
108
109 if(dp->GetDefinition() != particle) { InitialiseMe(dp->GetDefinition()); }
110
111 CLHEP::HepRandomEngine* rndmEngineF = G4Random::getTheEngine();
112
113 const G4double gam = tkin * m_Inv_particleMass + 1.0;
114 const G4double gam2 = gam*gam;
115 const G4double beta = dp->GetBeta();
116 const G4double beta2 = beta*beta;
117
118 G4double loss(0.), siga(0.);
119
120 const G4Material* material = couple->GetMaterial();
121
122 // Gaussian regime
123 // for heavy particles only and conditions
124 // for Gauusian fluct. has been changed
125 //
127 meanLoss >= minNumberInteractionsBohr*tcut && tmax <= 2.*tcut) {
128
129 siga = std::sqrt((tmax/beta2 - 0.5*tcut)*CLHEP::twopi_mc2_rcl2*
130 length*chargeSquare*material->GetElectronDensity());
131 const G4double sn = meanLoss/siga;
132
133 // thick target case
134 if (sn >= 2.0) {
135
136 const G4double twomeanLoss = meanLoss + meanLoss;
137 do {
138 loss = G4RandGauss::shoot(rndmEngineF, meanLoss, siga);
139 // Loop checking, 03-Aug-2015, Vladimir Ivanchenko
140 } while (0.0 > loss || twomeanLoss < loss);
141
142 // Gamma distribution
143 } else {
144
145 const G4double neff = sn*sn;
146 loss = meanLoss*G4RandGamma::shoot(rndmEngineF, neff, 1.0)/neff;
147 }
148 //G4cout << "Gauss: " << loss << G4endl;
149 return loss;
150 }
151
152 auto ioni = material->GetIonisation();
153 e0 = ioni->GetEnergy0fluct();
154
155 // very small step or low-density material
156 if(tcut <= e0) { return meanLoss; }
157
158 ipotFluct = ioni->GetMeanExcitationEnergy();
159 ipotLogFluct = ioni->GetLogMeanExcEnergy();
160
161 // width correction for small cuts
162 const G4double scaling = std::min(1.+0.5*CLHEP::keV/tcut, 1.50);
163 meanLoss /= scaling;
164
165 w2 = (tcut > ipotFluct) ?
166 G4Log(2.*CLHEP::electron_mass_c2*beta2*gam2)-beta2 : 0.0;
167 return SampleGlandz(rndmEngineF, material, tcut)*scaling;
168}
G4double G4Log(G4double x)
Definition: G4Log.hh:226
G4double GetKineticEnergy() const
const G4Material * GetMaterial() const
virtual G4double SampleGlandz(CLHEP::HepRandomEngine *rndm, const G4Material *, const G4double tcut)
static constexpr double keV
ThreeVector shoot(const G4int Ap, const G4int Af)
T min(const T t1, const T t2)
brief Return the smallest of the two arguments

References anonymous_namespace{G4PionRadiativeDecayChannel.cc}::beta, G4UniversalFluctuation::chargeSquare, G4UniversalFluctuation::e0, CLHEP::electron_mass_c2, G4Log(), G4InuclParticleNames::gam, G4DynamicParticle::GetBeta(), G4DynamicParticle::GetDefinition(), G4DynamicParticle::GetKineticEnergy(), G4MaterialCutsCouple::GetMaterial(), G4UniversalFluctuation::InitialiseMe(), G4UniversalFluctuation::ipotFluct, G4UniversalFluctuation::ipotLogFluct, CLHEP::keV, G4UniversalFluctuation::m_Inv_particleMass, eplot::material, G4UniversalFluctuation::meanLoss, G4INCL::Math::min(), G4UniversalFluctuation::minLoss, G4UniversalFluctuation::minNumberInteractionsBohr, G4UniversalFluctuation::particle, G4UniversalFluctuation::particleMass, G4UniversalFluctuation::SampleGlandz(), G4INCL::DeJongSpin::shoot(), CLHEP::twopi_mc2_rcl2, and G4UniversalFluctuation::w2.

Referenced by G4IonFluctuations::SampleFluctuations().

◆ SampleGauss()

void G4UniversalFluctuation::SampleGauss ( CLHEP::HepRandomEngine rndm,
const G4double  eav,
const G4double  esig2,
G4double eloss 
)
inlineprotectedinherited

Definition at line 146 of file G4UniversalFluctuation.hh.

149{
150 G4double x = eav;
151 const G4double sig = std::sqrt(esig2);
152 if(eav < 0.25*sig) {
153 x += (2.*rndm->flat() - 1.)*eav;
154 } else {
155 do {
156 x = G4RandGauss::shoot(rndm, eav, sig);
157 } while (x < 0.0 || x > 2*eav);
158 // Loop checking, 23-Feb-2016, Vladimir Ivanchenko
159 }
160 eloss += x;
161}

References CLHEP::HepRandomEngine::flat(), and G4INCL::DeJongSpin::shoot().

Referenced by G4UniversalFluctuation::SampleGlandz(), and SampleGlandz().

◆ SampleGlandz()

G4double G4UrbanFluctuation::SampleGlandz ( CLHEP::HepRandomEngine rndm,
const G4Material material,
const G4double  tcut 
)
overrideprotectedvirtual

Reimplemented from G4UniversalFluctuation.

Definition at line 66 of file G4UrbanFluctuation.cc.

69{
70 if (material != lastMaterial) {
71 auto ioni = material->GetIonisation();
72 f1Fluct = ioni->GetF1fluct();
73 f2Fluct = ioni->GetF2fluct();
74 e1Fluct = ioni->GetEnergy1fluct();
75 e2Fluct = ioni->GetEnergy2fluct();
76 e1LogFluct = ioni->GetLogEnergy1fluct();
77 e2LogFluct = ioni->GetLogEnergy2fluct();
78 esmall = 0.5*std::sqrt(e0*ipotFluct);
80 }
81
82 G4double a1(0.0), a2(0.0), a3(0.0);
83 G4double loss = 0.0;
86
87 if(tcut > ipotFluct) {
88 if(w2 > ipotLogFluct) {
89 if(w2 > e2LogFluct) {
90 const G4double C = meanLoss*(1.-rate)/(w2-ipotLogFluct);
93 } else {
94 a1 = meanLoss*(1.-rate)/e1;
95 }
96 if(a1 < a0) {
97 const G4double fwnow = 0.5+(fw-0.5)*std::sqrt(a1/a0);
98 a1 /= fwnow;
99 e1 *= fwnow;
100 } else {
101 a1 /= fw;
102 e1 *= fw;
103 }
104 }
105 }
106
107 const G4double w1 = tcut/e0;
108 a3 = rate*meanLoss*(tcut-e0)/(e0*tcut*G4Log(w1));
109 if(a1+a2 <= 0.) { a3 /= rate; }
110
111 //'nearly' Gaussian fluctuation if a1>nmaxCont&&a2>nmaxCont&&a3>nmaxCont
112 G4double emean = 0.;
113 G4double sig2e = 0.;
114
115 // excitation of type 1
116 if(a1 > 0.0) { AddExcitation(rndmEngineF, a1, e1, emean, loss, sig2e); }
117
118 // excitation of type 2
119 if(a2 > 0.0) { AddExcitation(rndmEngineF, a2, e2, emean, loss, sig2e); }
120
121 if(sig2e > 0.0) { SampleGauss(rndmEngineF, emean, sig2e, loss); }
122
123 // ionisation
124 if(a3 > 0.) {
125 emean = 0.;
126 sig2e = 0.;
127 G4double p3 = a3;
128 G4double alfa = 1.;
129 if(a3 > nmaxCont) {
130 alfa = w1*(nmaxCont+a3)/(w1*nmaxCont+a3);
131 const G4double alfa1 = alfa*G4Log(alfa)/(alfa-1.);
132 const G4double namean = a3*w1*(alfa-1.)/((w1-1.)*alfa);
133 emean += namean*e0*alfa1;
134 sig2e += e0*e0*namean*(alfa-alfa1*alfa1);
135 p3 -= namean;
136 }
137
138 const G4double w3 = alfa*e0;
139 if(tcut > w3) {
140 const G4double w = (tcut-w3)/tcut;
141 const G4int nnb = G4Poisson(p3);
142 if(nnb > 0) {
143 if(nnb > sizearray) {
144 sizearray = nnb;
145 delete [] rndmarray;
146 rndmarray = new G4double[nnb];
147 }
148 rndmEngineF->flatArray(nnb, rndmarray);
149 for (G4int k=0; k<nnb; ++k) { loss += w3/(1.-w*rndmarray[k]); }
150 }
151 }
152 if(sig2e > 0.0) { SampleGauss(rndmEngineF, emean, sig2e, loss); }
153 }
154 //G4cout << "### loss=" << loss << G4endl;
155 return loss;
156}
static const G4double e1[44]
static const G4double e2[44]
G4double C(G4double temp)
void AddExcitation(CLHEP::HepRandomEngine *rndm, const G4double ax, const G4double ex, G4double &eav, G4double &eloss, G4double &esig2)
void SampleGauss(CLHEP::HepRandomEngine *rndm, const G4double eav, const G4double esig2, G4double &eloss)
const G4Material * lastMaterial

References G4UniversalFluctuation::a0, G4UniversalFluctuation::AddExcitation(), C(), G4UniversalFluctuation::e0, e1, e1Fluct, e1LogFluct, e2, e2Fluct, e2LogFluct, esmall, f1Fluct, f2Fluct, CLHEP::HepRandomEngine::flatArray(), G4UniversalFluctuation::fw, G4Log(), G4Poisson(), G4UniversalFluctuation::ipotFluct, G4UniversalFluctuation::ipotLogFluct, lastMaterial, eplot::material, G4UniversalFluctuation::meanLoss, G4UniversalFluctuation::nmaxCont, G4UniversalFluctuation::rate, G4UniversalFluctuation::rndmarray, G4UniversalFluctuation::SampleGauss(), G4UniversalFluctuation::sizearray, and G4UniversalFluctuation::w2.

◆ SetParticleAndCharge()

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

Field Documentation

◆ a0

G4double G4UniversalFluctuation::a0 = 42.0
protectedinherited

◆ chargeSquare

G4double G4UniversalFluctuation::chargeSquare = 1.0
protectedinherited

◆ e0

G4double G4UniversalFluctuation::e0 = 0.0
protectedinherited

◆ e1Fluct

G4double G4UrbanFluctuation::e1Fluct = 0.0
private

Definition at line 79 of file G4UrbanFluctuation.hh.

Referenced by SampleGlandz().

◆ e1LogFluct

G4double G4UrbanFluctuation::e1LogFluct = 0.0
private

Definition at line 81 of file G4UrbanFluctuation.hh.

Referenced by SampleGlandz().

◆ e2Fluct

G4double G4UrbanFluctuation::e2Fluct = 0.0
private

Definition at line 80 of file G4UrbanFluctuation.hh.

Referenced by SampleGlandz().

◆ e2LogFluct

G4double G4UrbanFluctuation::e2LogFluct = 0.0
private

Definition at line 82 of file G4UrbanFluctuation.hh.

Referenced by SampleGlandz().

◆ esmall

G4double G4UrbanFluctuation::esmall = 0.0
private

Definition at line 83 of file G4UrbanFluctuation.hh.

Referenced by SampleGlandz().

◆ f1Fluct

G4double G4UrbanFluctuation::f1Fluct = 0.0
private

Definition at line 77 of file G4UrbanFluctuation.hh.

Referenced by SampleGlandz().

◆ f2Fluct

G4double G4UrbanFluctuation::f2Fluct = 0.0
private

Definition at line 78 of file G4UrbanFluctuation.hh.

Referenced by SampleGlandz().

◆ fManager

G4LossTableManager* G4VEmFluctuationModel::fManager
privateinherited

◆ fw

G4double G4UniversalFluctuation::fw = 4.0
protectedinherited

◆ ipotFluct

G4double G4UniversalFluctuation::ipotFluct = 0.0
protectedinherited

◆ ipotLogFluct

G4double G4UniversalFluctuation::ipotLogFluct = 0.0
protectedinherited

◆ lastMaterial

const G4Material* G4UrbanFluctuation::lastMaterial = nullptr
private

Definition at line 76 of file G4UrbanFluctuation.hh.

Referenced by SampleGlandz().

◆ m_Inv_particleMass

G4double G4UniversalFluctuation::m_Inv_particleMass = DBL_MAX
protectedinherited

◆ m_massrate

G4double G4UniversalFluctuation::m_massrate = DBL_MAX
protectedinherited

◆ meanLoss

G4double G4UniversalFluctuation::meanLoss = 0.0
protectedinherited

◆ minLoss

G4double G4UniversalFluctuation::minLoss
protectedinherited

◆ minNumberInteractionsBohr

G4double G4UniversalFluctuation::minNumberInteractionsBohr = 10.0
protectedinherited

◆ name

const G4String G4VEmFluctuationModel::name
privateinherited

◆ nmaxCont

G4double G4UniversalFluctuation::nmaxCont = 8.0
protectedinherited

◆ particle

const G4ParticleDefinition* G4UniversalFluctuation::particle = nullptr
protectedinherited

◆ particleMass

G4double G4UniversalFluctuation::particleMass = 0.0
protectedinherited

◆ rate

G4double G4UniversalFluctuation::rate = 0.56
protectedinherited

◆ rndmarray

G4double* G4UniversalFluctuation::rndmarray = nullptr
protectedinherited

◆ sizearray

G4int G4UniversalFluctuation::sizearray = 30
protectedinherited

◆ w2

G4double G4UniversalFluctuation::w2 = 0.0
protectedinherited

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