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

#include <G4EmCorrections.hh>

Public Member Functions

 G4EmCorrections (G4int verb)
 
virtual ~G4EmCorrections ()
 
G4double HighOrderCorrections (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy, G4double cutEnergy)
 
G4double IonHighOrderCorrections (const G4ParticleDefinition *, const G4MaterialCutsCouple *, G4double kineticEnergy)
 
G4double ComputeIonCorrections (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double IonBarkasCorrection (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double Bethe (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double SpinCorrection (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double KShellCorrection (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double LShellCorrection (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double ShellCorrection (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double ShellCorrectionSTD (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double DensityCorrection (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double BarkasCorrection (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double BlochCorrection (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double MottCorrection (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
void AddStoppingData (G4int Z, G4int A, const G4String &materialName, G4PhysicsVector *dVector)
 
void InitialiseForNewRun ()
 
G4double EffectiveChargeCorrection (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double GetParticleCharge (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
G4double EffectiveChargeSquareRatio (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
void SetIonisationModels (G4VEmModel *m1=nullptr, G4VEmModel *m2=nullptr)
 
G4int GetNumberOfStoppingVectors () const
 
void SetVerbose (G4int verb)
 

Detailed Description

Definition at line 70 of file G4EmCorrections.hh.

Constructor & Destructor Documentation

◆ G4EmCorrections()

G4EmCorrections::G4EmCorrections ( G4int  verb)
explicit

Definition at line 111 of file G4EmCorrections.cc.

112{
113 particle = nullptr;
114 curParticle= nullptr;
115 material = nullptr;
116 curMaterial= nullptr;
117 theElementVector = nullptr;
118 atomDensity= nullptr;
119 curVector = nullptr;
120 ionLEModel = nullptr;
121 ionHEModel = nullptr;
122
123 kinEnergy = 0.0;
124 verbose = verb;
125 massFactor = 1.0;
126 eth = 2.0*CLHEP::MeV;
127 nbinCorr = 20;
128 eCorrMin = 25.*CLHEP::keV;
129 eCorrMax = 250.*CLHEP::MeV;
130
132 g4calc = G4Pow::GetInstance();
133
134 nIons = ncouples = numberOfElements = idx = currentZ = 0;
135 mass = tau = gamma = bg2 = beta2 = beta = ba2 = tmax = charge = q2 = 0.0;
136
137 // Constants
138 alpha2 = CLHEP::fine_structure_const*CLHEP::fine_structure_const;
139
140 // G.S. Khandelwal Nucl. Phys. A116(1968)97 - 111.
141 // "Shell corrections for K- and L- electrons
142
143 nK = 20;
144 nL = 26;
145 nEtaK = 29;
146 nEtaL = 28;
147
148 isMaster = false;
149
150 // fill vectors
151 if(BarkasCorr == nullptr) { Initialise(); }
152}
G4IonTable * GetIonTable() const
static G4ParticleTable * GetParticleTable()
static G4Pow * GetInstance()
Definition: G4Pow.cc:41

◆ ~G4EmCorrections()

G4EmCorrections::~G4EmCorrections ( )
virtual

Definition at line 156 of file G4EmCorrections.cc.

157{
158 for(G4int i=0; i<nIons; ++i) {delete stopData[i];}
159 if(isMaster) {
160 delete BarkasCorr;
161 delete ThetaK;
162 delete ThetaL;
163 BarkasCorr = ThetaK = ThetaL = nullptr;
164 }
165}
int G4int
Definition: G4Types.hh:85

Member Function Documentation

◆ AddStoppingData()

void G4EmCorrections::AddStoppingData ( G4int  Z,
G4int  A,
const G4String materialName,
G4PhysicsVector dVector 
)

Definition at line 815 of file G4EmCorrections.cc.

818{
819 G4int i = 0;
820 for(; i<nIons; ++i) {
821 if(Z == Zion[i] && A == Aion[i] && mname == materialName[i]) break;
822 }
823 if(i == nIons) {
824 Zion.push_back(Z);
825 Aion.push_back(A);
826 materialName.push_back(mname);
827 materialList.push_back(nullptr);
828 ionList.push_back(nullptr);
829 stopData.push_back(dVector);
830 nIons++;
831 if(verbose > 1) {
832 G4cout << "AddStoppingData Z= " << Z << " A= " << A << " " << mname
833 << " idx= " << i << G4endl;
834 }
835 }
836}
double A(double temperature)
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout

Referenced by G4ionIonisation::AddStoppingData().

◆ BarkasCorrection()

G4double G4EmCorrections::BarkasCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 676 of file G4EmCorrections.cc.

679{
680 // . Z^3 Barkas effect in the stopping power of matter for charged particles
681 // J.C Ashley and R.H.Ritchie
682 // Physical review B Vol.5 No.7 1 April 1972 pp. 2393-2397
683 // valid for kineticEnergy > 0.5 MeV
684
685 SetupKinematics(p, mat, e);
686 G4double BarkasTerm = 0.0;
687
688 for (G4int i = 0; i<numberOfElements; ++i) {
689
690 G4double Z = (*theElementVector)[i]->GetZ();
691 G4int iz = (*theElementVector)[i]->GetZasInt();
692 if(iz == 47) {
693 BarkasTerm += atomDensity[i]*0.006812*G4Exp(-G4Log(beta)*0.9);
694 } else if(iz >= 64) {
695 BarkasTerm += atomDensity[i]*0.002833*G4Exp(-G4Log(beta)*1.2);
696 } else {
697
698 G4double X = ba2 / Z;
699 G4double b = 1.3;
700 if(1 == iz) {
701 if(material->GetName() == "G4_lH2") { b = 0.6; }
702 else { b = 1.8; }
703 }
704 else if(2 == iz) { b = 0.6; }
705 else if(10 >= iz) { b = 1.8; }
706 else if(17 >= iz) { b = 1.4; }
707 else if(18 == iz) { b = 1.8; }
708 else if(25 >= iz) { b = 1.4; }
709 else if(50 >= iz) { b = 1.35;}
710
711 G4double W = b/std::sqrt(X);
712
713 G4double val = BarkasCorr->Value(W);
714 if(W > BarkasCorr->Energy(46)) {
715 val *= BarkasCorr->Energy(46)/W;
716 }
717 // G4cout << "i= " << i << " b= " << b << " W= " << W
718 // << " Z= " << Z << " X= " << X << " val= " << val<< G4endl;
719 BarkasTerm += val*atomDensity[i] / (std::sqrt(Z*X)*X);
720 }
721 }
722
723 BarkasTerm *= 1.29*charge/material->GetTotNbOfAtomsPerVolume();
724
725 return BarkasTerm;
726}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:179
G4double G4Log(G4double x)
Definition: G4Log.hh:226
double G4double
Definition: G4Types.hh:83
G4double GetTotNbOfAtomsPerVolume() const
Definition: G4Material.hh:207
const G4String & GetName() const
Definition: G4Material.hh:175
G4double Energy(std::size_t index) const
G4double Value(G4double theEnergy, std::size_t &lastidx) const

Referenced by G4LindhardSorensenIonModel::ComputeDEDXPerVolume(), ComputeIonCorrections(), G4LindhardSorensenIonModel::CorrectionsAlongStep(), HighOrderCorrections(), and IonBarkasCorrection().

◆ Bethe()

G4double G4EmCorrections::Bethe ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 325 of file G4EmCorrections.cc.

328{
329 SetupKinematics(p, mat, e);
330 G4double eexc = material->GetIonisation()->GetMeanExcitationEnergy();
331 G4double eexc2 = eexc*eexc;
332 G4double dedx = 0.5*G4Log(2.0*electron_mass_c2*bg2*tmax/eexc2)-beta2;
333 return dedx;
334}
G4double GetMeanExcitationEnergy() const
G4IonisParamMat * GetIonisation() const
Definition: G4Material.hh:224

◆ BlochCorrection()

G4double G4EmCorrections::BlochCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 730 of file G4EmCorrections.cc.

733{
734 SetupKinematics(p, mat, e);
735
736 G4double y2 = q2/ba2;
737
738 G4double term = 1.0/(1.0 + y2);
739 G4double del;
740 G4double j = 1.0;
741 do {
742 j += 1.0;
743 del = 1.0/(j* (j*j + y2));
744 term += del;
745 // Loop checking, 03-Aug-2015, Vladimir Ivanchenko
746 } while (del > 0.01*term);
747
748 G4double res = -y2*term;
749 return res;
750}

Referenced by ComputeIonCorrections(), and HighOrderCorrections().

◆ ComputeIonCorrections()

G4double G4EmCorrections::ComputeIonCorrections ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 243 of file G4EmCorrections.cc.

246{
247 // . Z^3 Barkas effect in the stopping power of matter for charged particles
248 // J.C Ashley and R.H.Ritchie
249 // Physical review B Vol.5 No.7 1 April 1972 pagg. 2393-2397
250 // and ICRU49 report
251 // valid for kineticEnergy < 0.5 MeV
252 // Other corrections from S.P.Ahlen Rev. Mod. Phys., Vol 52, No1, 1980
253 SetupKinematics(p, mat, e);
254 if(tau <= 0.0) { return 0.0; }
255
256 G4double Barkas = BarkasCorrection (p, mat, e);
257 G4double Bloch = BlochCorrection (p, mat, e);
258 G4double Mott = MottCorrection (p, mat, e);
259
260 G4double sum = 2.0*(Barkas*(charge - 1.0)/charge + Bloch) + Mott;
261
262 if(verbose > 1) {
263 G4cout << "EmCorrections: E(MeV)= " << e/MeV << " Barkas= " << Barkas
264 << " Bloch= " << Bloch << " Mott= " << Mott
265 << " Sum= " << sum << G4endl;
266 }
267 sum *= material->GetElectronDensity() * q2 * twopi_mc2_rcl2 /beta2;
268
269 if(verbose > 1) { G4cout << " Sum= " << sum << G4endl; }
270 return sum;
271}
G4double MottCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double BarkasCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double BlochCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double GetElectronDensity() const
Definition: G4Material.hh:215

Referenced by IonHighOrderCorrections().

◆ DensityCorrection()

G4double G4EmCorrections::DensityCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 649 of file G4EmCorrections.cc.

652{
653 SetupKinematics(p, mat, e);
654
655 G4double cden = material->GetIonisation()->GetCdensity();
656 G4double mden = material->GetIonisation()->GetMdensity();
657 G4double aden = material->GetIonisation()->GetAdensity();
658 G4double x0den = material->GetIonisation()->GetX0density();
659 G4double x1den = material->GetIonisation()->GetX1density();
660
661 G4double dedx = 0.0;
662
663 // density correction
664 static const G4double twoln10 = 2.0*G4Log(10.0);
665 G4double x = G4Log(bg2)/twoln10;
666 if ( x >= x0den ) {
667 dedx = twoln10*x - cden ;
668 if ( x < x1den ) dedx += aden*G4Exp(G4Log(x1den-x)*mden) ;
669 }
670
671 return dedx;
672}
G4double GetMdensity() const
G4double GetX1density() const
G4double GetX0density() const
G4double GetCdensity() const
G4double GetAdensity() const

◆ EffectiveChargeCorrection()

G4double G4EmCorrections::EffectiveChargeCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 766 of file G4EmCorrections.cc.

769{
770 G4double factor = 1.0;
771 if(p->GetPDGCharge() <= 2.5*CLHEP::eplus || nIons <= 0) { return factor; }
772
773 if(verbose > 1) {
774 G4cout << "EffectiveChargeCorrection: " << p->GetParticleName()
775 << " in " << mat->GetName()
776 << " ekin(MeV)= " << ekin/MeV << G4endl;
777 }
778
779 if(p != curParticle || mat != curMaterial) {
780 curParticle = p;
781 curMaterial = mat;
782 curVector = nullptr;
783 currentZ = p->GetAtomicNumber();
784 if(verbose > 1) {
785 G4cout << "G4EmCorrections::EffectiveChargeCorrection: Zion= "
786 << currentZ << " Aion= " << p->GetPDGMass()/amu_c2 << G4endl;
787 }
788 massFactor = proton_mass_c2/p->GetPDGMass();
789 idx = -1;
790
791 for(G4int i=0; i<nIons; ++i) {
792 if(materialList[i] == mat && currentZ == Zion[i]) {
793 idx = i;
794 break;
795 }
796 }
797 //G4cout << " idx= " << idx << " dz= " << G4endl;
798 if(idx >= 0) {
799 if(!ionList[idx]) { BuildCorrectionVector(); }
800 if(ionList[idx]) { curVector = stopData[idx]; }
801 } else { return factor; }
802 }
803 if(curVector) {
804 factor = curVector->Value(ekin*massFactor);
805 if(verbose > 1) {
806 G4cout << "E= " << ekin << " factor= " << factor << " massfactor= "
807 << massFactor << G4endl;
808 }
809 }
810 return factor;
811}
G4int GetAtomicNumber() const
G4double GetPDGCharge() const
const G4String & GetParticleName() const

Referenced by G4BraggIonModel::CorrectionsAlongStep(), G4BetheBlochModel::CorrectionsAlongStep(), G4BraggIonModel::GetChargeSquareRatio(), G4BraggModel::GetChargeSquareRatio(), G4AtimaEnergyLossModel::GetChargeSquareRatio(), and G4BetheBlochModel::GetChargeSquareRatio().

◆ EffectiveChargeSquareRatio()

G4double G4EmCorrections::EffectiveChargeSquareRatio ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)
inline

◆ GetNumberOfStoppingVectors()

G4int G4EmCorrections::GetNumberOfStoppingVectors ( ) const
inline

Definition at line 303 of file G4EmCorrections.hh.

304{
305 return nIons;
306}

Referenced by G4ionIonisation::StreamProcessInfo().

◆ GetParticleCharge()

G4double G4EmCorrections::GetParticleCharge ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)
inline

Definition at line 309 of file G4EmCorrections.hh.

312{
313 return effCharge.EffectiveCharge(p,mat,kineticEnergy);
314}
G4double EffectiveCharge(const G4ParticleDefinition *p, const G4Material *material, G4double kineticEnergy)

Referenced by G4AtimaEnergyLossModel::GetParticleCharge(), G4BetheBlochModel::GetParticleCharge(), G4BraggIonModel::GetParticleCharge(), and G4BraggModel::GetParticleCharge().

◆ HighOrderCorrections()

G4double G4EmCorrections::HighOrderCorrections ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy,
G4double  cutEnergy 
)

Definition at line 198 of file G4EmCorrections.cc.

201{
202 // . Z^3 Barkas effect in the stopping power of matter for charged particles
203 // J.C Ashley and R.H.Ritchie
204 // Physical review B Vol.5 No.7 1 April 1972 pagg. 2393-2397
205 // and ICRU49 report
206 // valid for kineticEnergy < 0.5 MeV
207 // Other corrections from S.P.Ahlen Rev. Mod. Phys., Vol 52, No1, 1980
208
209 SetupKinematics(p, mat, e);
210 if(tau <= 0.0) { return 0.0; }
211
212 G4double Barkas = BarkasCorrection (p, mat, e);
213 G4double Bloch = BlochCorrection (p, mat, e);
214 G4double Mott = MottCorrection (p, mat, e);
215
216 G4double sum = (2.0*(Barkas + Bloch) + Mott);
217
218 if(verbose > 1) {
219 G4cout << "EmCorrections: E(MeV)= " << e/MeV << " Barkas= " << Barkas
220 << " Bloch= " << Bloch << " Mott= " << Mott
221 << " Sum= " << sum << " q2= " << q2 << G4endl;
222 G4cout << " ShellCorrection: " << ShellCorrection(p, mat, e)
223 << " Kshell= " << KShellCorrection(p, mat, e)
224 << " Lshell= " << LShellCorrection(p, mat, e)
225 << " " << mat->GetName() << G4endl;
226 }
227 sum *= material->GetElectronDensity() * q2 * twopi_mc2_rcl2 /beta2;
228 return sum;
229}
G4double LShellCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double KShellCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double ShellCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)

Referenced by G4MuBetheBlochModel::ComputeDEDXPerVolume(), and G4BetheBlochModel::ComputeDEDXPerVolume().

◆ InitialiseForNewRun()

void G4EmCorrections::InitialiseForNewRun ( )

Definition at line 915 of file G4EmCorrections.cc.

916{
918 ncouples = tb->GetTableSize();
919 if(currmat.size() != ncouples) {
920 currmat.resize(ncouples);
921 for(std::map< G4int, std::vector<G4double> >::iterator it =
922 thcorr.begin(); it != thcorr.end(); ++it){
923 (it->second).clear();
924 }
925 thcorr.clear();
926 for(size_t i=0; i<ncouples; ++i) {
927 currmat[i] = tb->GetMaterialCutsCouple(i)->GetMaterial();
928 G4String nam = currmat[i]->GetName();
929 for(G4int j=0; j<nIons; ++j) {
930 if(nam == materialName[j]) { materialList[j] = currmat[i]; }
931 }
932 }
933 }
934}
const G4Material * GetMaterial() const
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
std::size_t GetTableSize() const
static G4ProductionCutsTable * GetProductionCutsTable()

Referenced by G4ionIonisation::InitialiseEnergyLossProcess().

◆ IonBarkasCorrection()

G4double G4EmCorrections::IonBarkasCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 233 of file G4EmCorrections.cc.

236{
237 return 2.0*BarkasCorrection(p, mat, e)*
238 material->GetElectronDensity() * q2 * twopi_mc2_rcl2 /beta2;
239}

Referenced by G4BetheBlochModel::ComputeDEDXPerVolume().

◆ IonHighOrderCorrections()

G4double G4EmCorrections::IonHighOrderCorrections ( const G4ParticleDefinition p,
const G4MaterialCutsCouple couple,
G4double  kineticEnergy 
)

Definition at line 275 of file G4EmCorrections.cc.

278{
279 // . Z^3 Barkas effect in the stopping power of matter for charged particles
280 // J.C Ashley and R.H.Ritchie
281 // Physical review B Vol.5 No.7 1 April 1972 pagg. 2393-2397
282 // and ICRU49 report
283 // valid for kineticEnergy < 0.5 MeV
284 // Other corrections from S.P.Ahlen Rev. Mod. Phys., Vol 52, No1, 1980
285
286 G4double sum = 0.0;
287
288 if(ionHEModel) {
290 if(Z >= 100) Z = 99;
291 else if(Z < 1) Z = 1;
292
293 G4double ethscaled = eth*p->GetPDGMass()/proton_mass_c2;
294 G4int ionPDG = p->GetPDGEncoding();
295 if(thcorr.find(ionPDG)==thcorr.end()) { // Not found: fill the map
296 std::vector<G4double> v;
297 for(size_t i=0; i<ncouples; ++i){
298 v.push_back(ethscaled*ComputeIonCorrections(p,currmat[i],ethscaled));
299 }
300 thcorr.insert(std::pair< G4int, std::vector<G4double> >(ionPDG,v));
301 }
302
303 //G4cout << " map size=" << thcorr.size() << G4endl;
304 //for(std::map< G4int, std::vector<G4double> >::iterator
305 // it = thcorr.begin(); it != thcorr.end(); ++it){
306 // G4cout << "\t map element: first (key)=" << it->first
307 // << "\t second (vector): vec size=" << (it->second).size() << G4endl;
308 // for(size_t i=0; i<(it->second).size(); ++i){
309 // G4cout << "\t \t vec element: [" << i << "]=" << (it->second)[i]
310 //<< G4endl; } }
311
312 G4double rest = (thcorr.find(ionPDG)->second)[couple->GetIndex()];
313
314 sum = ComputeIonCorrections(p,couple->GetMaterial(),e) - rest/e;
315
316 if(verbose > 1) {
317 G4cout << " Sum= " << sum << " dSum= " << rest/e << G4endl;
318 }
319 }
320 return sum;
321}
const G4double inveplus
G4double ComputeIonCorrections(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
int G4lrint(double ad)
Definition: templates.hh:134

Referenced by G4BetheBlochModel::CorrectionsAlongStep().

◆ KShellCorrection()

G4double G4EmCorrections::KShellCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 349 of file G4EmCorrections.cc.

352{
353 SetupKinematics(p, mat, e);
354 G4double term = 0.0;
355 for (G4int i = 0; i<numberOfElements; ++i) {
356
357 G4double Z = (*theElementVector)[i]->GetZ();
358 G4int iz = (*theElementVector)[i]->GetZasInt();
359 G4double f = 1.0;
360 G4double Z2= (Z-0.3)*(Z-0.3);
361 if(1 == iz) {
362 f = 0.5;
363 Z2 = 1.0;
364 }
365 G4double eta = ba2/Z2;
366 G4double tet = Z2*(1. + Z2*0.25*alpha2);
367 if(11 < iz) { tet = ThetaK->Value(Z); }
368 term += f*atomDensity[i]*KShell(tet,eta)/Z;
369 }
370
371 term /= material->GetTotNbOfAtomsPerVolume();
372
373 return term;
374}

Referenced by HighOrderCorrections().

◆ LShellCorrection()

G4double G4EmCorrections::LShellCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 378 of file G4EmCorrections.cc.

381{
382 SetupKinematics(p, mat, e);
383 G4double term = 0.0;
384 for (G4int i = 0; i<numberOfElements; ++i) {
385
386 G4double Z = (*theElementVector)[i]->GetZ();
387 G4int iz = (*theElementVector)[i]->GetZasInt();
388 if(2 < iz) {
389 G4double Zeff = Z - ZD[10];
390 if(iz < 10) { Zeff = Z - ZD[iz]; }
391 G4double Z2= Zeff*Zeff;
392 G4double f = 0.125;
393 G4double eta = ba2/Z2;
394 G4double tet = ThetaL->Value(Z);
395 G4int nmax = std::min(4,G4AtomicShells::GetNumberOfShells(iz));
396 for(G4int j=1; j<nmax; ++j) {
398 if(15 >= iz) {
399 if(3 > j) { tet = 0.25*Z2*(1.0 + 5*Z2*alpha2/16.); }
400 else { tet = 0.25*Z2*(1.0 + Z2*alpha2/16.); }
401 }
402 //G4cout << " LShell: j= " << j << " ne= " << ne << " e(eV)= " << e/eV
403 // << " ThetaL= " << tet << G4endl;
404 term += f*ne*atomDensity[i]*LShell(tet,eta)/Z;
405 }
406 }
407 }
408
409 term /= material->GetTotNbOfAtomsPerVolume();
410
411 return term;
412}
static G4int GetNumberOfElectrons(G4int Z, G4int SubshellNb)
static G4int GetNumberOfShells(G4int Z)

Referenced by HighOrderCorrections().

◆ MottCorrection()

G4double G4EmCorrections::MottCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 754 of file G4EmCorrections.cc.

757{
758 SetupKinematics(p, mat, e);
759 G4double mterm = CLHEP::pi*fine_structure_const*beta*charge;
760 return mterm;
761}

Referenced by ComputeIonCorrections(), and HighOrderCorrections().

◆ SetIonisationModels()

void G4EmCorrections::SetIonisationModels ( G4VEmModel m1 = nullptr,
G4VEmModel m2 = nullptr 
)
inline

Definition at line 297 of file G4EmCorrections.hh.

298{
299 if(mod1) { ionLEModel = mod1; }
300 if(mod2) { ionHEModel = mod2; }
301}

Referenced by G4ionIonisation::InitialiseEnergyLossProcess().

◆ SetVerbose()

void G4EmCorrections::SetVerbose ( G4int  verb)
inline

Definition at line 324 of file G4EmCorrections.hh.

325{
326 verbose = verb;
327}

Referenced by G4LossTableManager::ResetParameters().

◆ ShellCorrection()

G4double G4EmCorrections::ShellCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 546 of file G4EmCorrections.cc.

549{
550 SetupKinematics(p, mat, ekin);
551
552 G4double term = 0.0;
553 //G4cout << "### G4EmCorrections::ShellCorrection " << mat->GetName()
554 // << " " << ekin/MeV << " MeV " << G4endl;
555 for (G4int i = 0; i<numberOfElements; ++i) {
556
557 G4double res = 0.0;
558 G4double res0 = 0.0;
559 G4double Z = (*theElementVector)[i]->GetZ();
560 G4int iz = (*theElementVector)[i]->GetZasInt();
561 G4double Z2= (Z-0.3)*(Z-0.3);
562 G4double f = 1.0;
563 if(1 == iz) {
564 f = 0.5;
565 Z2 = 1.0;
566 }
567 G4double eta = ba2/Z2;
568 G4double tet = Z2*(1. + Z2*0.25*alpha2);
569 if(11 < iz) { tet = ThetaK->Value(Z); }
570 res0 = f*KShell(tet,eta);
571 res += res0;
572 //G4cout << " Z= " << iz << " Shell 0" << " tet= " << tet
573 // << " eta= " << eta << " resK= " << res0 << G4endl;
574 if(2 < iz) {
575 G4double Zeff = Z - ZD[10];
576 if(iz < 10) { Zeff = Z - ZD[iz]; }
577 Z2= Zeff*Zeff;
578 eta = ba2/Z2;
579 f = 0.125;
580 tet = ThetaL->Value(Z);
582 G4int nmax = std::min(4, ntot);
583 G4double norm = 0.0;
584 G4double eshell = 0.0;
585 for(G4int j=1; j<nmax; ++j) {
587 if(15 >= iz) {
588 if(3 > j) { tet = 0.25*Z2*(1.0 + 5*Z2*alpha2/16.); }
589 else { tet = 0.25*Z2*(1.0 + Z2*alpha2/16.); }
590 }
591 norm += ne;
592 eshell += tet*ne;
593 res0 = f*ne*LShell(tet,eta);
594 res += res0;
595 //G4cout << " Z= " << iz << " Shell " << j << " Ne= " << ne
596 // << " tet= " << tet << " eta= " << eta
597 // << " resL= " << res0 << G4endl;
598 }
599 if(ntot > nmax) {
600 eshell /= norm;
601
602 static const G4double HM[53] = {
603 12.0, 12.0, 12.0, 12.0, 11.9, 11.7, 11.5, 11.2, 10.8, 10.4,
604 10.0, 9.51, 8.97, 8.52, 8.03, 7.46, 6.95, 6.53, 6.18, 5.87,
605 5.61, 5.39, 5.19, 5.01, 4.86, 4.72, 4.62, 4.53, 4.44, 4.38,
606 4.32, 4.26, 4.20, 4.15, 4.1, 4.04, 4.00, 3.95, 3.93, 3.91,
607 3.90, 3.89, 3.89, 3.88, 3.88, 3.88, 3.88, 3.88, 3.89, 3.89,
608 3.90, 3.92, 3.93 };
609 static const G4double HN[31] = {
610 75.5, 61.9, 52.2, 45.1, 39.6, 35.4, 31.9, 29.1, 27.2, 25.8,
611 24.5, 23.6, 22.7, 22.0, 21.4, 20.9, 20.5, 20.2, 19.9, 19.7,
612 19.5, 19.3, 19.2, 19.1, 18.4, 18.8, 18.7, 18.6, 18.5, 18.4,
613 18.2};
614
615 // Add M-shell
616 if(28 > iz) {
617 res += f*(iz - 10)*LShell(eshell,HM[iz-11]*eta);
618 } else if(63 > iz) {
619 res += f*18*LShell(eshell,HM[iz-11]*eta);
620 } else {
621 res += f*18*LShell(eshell,HM[52]*eta);
622 }
623 // Add N-shell
624 if(32 < iz) {
625 if(60 > iz) {
626 res += f*(iz - 28)*LShell(eshell,HN[iz-33]*eta);
627 } else if(63 > iz) {
628 res += 4*LShell(eshell,HN[iz-33]*eta);
629 } else {
630 res += 4*LShell(eshell,HN[30]*eta);
631 }
632 // Add O-P-shells
633 if(60 < iz) {
634 res += f*(iz - 60)*LShell(eshell,150*eta);
635 }
636 }
637 }
638 }
639 term += res*atomDensity[i]/Z;
640 }
641
642 term /= material->GetTotNbOfAtomsPerVolume();
643 //G4cout << "# Shell Correction= " << term << G4endl;
644 return term;
645}

Referenced by G4MuBetheBlochModel::ComputeDEDXPerVolume(), G4BetheBlochModel::ComputeDEDXPerVolume(), G4LindhardSorensenIonModel::ComputeDEDXPerVolume(), and HighOrderCorrections().

◆ ShellCorrectionSTD()

G4double G4EmCorrections::ShellCorrectionSTD ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 512 of file G4EmCorrections.cc.

515{
516 SetupKinematics(p, mat, e);
517 G4double taulim= 8.0*MeV/mass;
518 G4double bg2lim= taulim * (taulim+2.0);
519
520 G4double* shellCorrectionVector =
522 G4double sh = 0.0;
523 G4double x = 1.0;
524 G4double taul = material->GetIonisation()->GetTaul();
525
526 if ( bg2 >= bg2lim ) {
527 for (G4int k=0; k<3; ++k) {
528 x *= bg2 ;
529 sh += shellCorrectionVector[k]/x;
530 }
531
532 } else {
533 for (G4int k=0; k<3; ++k) {
534 x *= bg2lim ;
535 sh += shellCorrectionVector[k]/x;
536 }
537 sh *= G4Log(tau/taul)/G4Log(taulim/taul);
538 }
539 sh *= 0.5;
540 return sh;
541}
G4double * GetShellCorrectionVector() const
G4double GetTaul() const

◆ SpinCorrection()

G4double G4EmCorrections::SpinCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 338 of file G4EmCorrections.cc.

341{
342 SetupKinematics(p, mat, e);
343 G4double dedx = 0.5*tmax/(kinEnergy + mass);
344 return 0.5*dedx*dedx;
345}

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