Geant4 11.1.1
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)
 
 ~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 *mod1=nullptr, G4VEmModel *mod2=nullptr)
 
G4int GetNumberOfStoppingVectors () const
 
void SetVerbose (G4int verb)
 
G4EmCorrectionsoperator= (const G4EmCorrections &right)=delete
 
 G4EmCorrections (const G4EmCorrections &)=delete
 

Detailed Description

Definition at line 71 of file G4EmCorrections.hh.

Constructor & Destructor Documentation

◆ G4EmCorrections() [1/2]

G4EmCorrections::G4EmCorrections ( G4int  verb)
explicit

Definition at line 114 of file G4EmCorrections.cc.

115{
116 verbose = verb;
117 eth = 2.0*CLHEP::MeV;
118 eCorrMin = 25.*CLHEP::keV;
119 eCorrMax = 1.*CLHEP::GeV;
120
122 g4calc = G4Pow::GetInstance();
123
124 // G.S. Khandelwal Nucl. Phys. A116(1968)97 - 111.
125 // "Shell corrections for K- and L- electrons
126 nK = 20;
127 nL = 26;
128 nEtaK = 29;
129 nEtaL = 28;
130
131 // fill vectors
132 if(sBarkasCorr == nullptr) {
133#ifdef G4MULTITHREADED
134 G4MUTEXLOCK(&theCorrMutex);
135 if (sBarkasCorr == nullptr) {
136#endif
137 Initialise();
138 isMaster = true;
139#ifdef G4MULTITHREADED
140 }
141 G4MUTEXUNLOCK(&theCorrMutex);
142#endif
143 }
144}
#define G4MUTEXLOCK(mutex)
Definition: G4Threading.hh:251
#define G4MUTEXUNLOCK(mutex)
Definition: G4Threading.hh:254
G4IonTable * GetIonTable() const
static G4ParticleTable * GetParticleTable()
static G4Pow * GetInstance()
Definition: G4Pow.cc:41

◆ ~G4EmCorrections()

G4EmCorrections::~G4EmCorrections ( )

Definition at line 148 of file G4EmCorrections.cc.

149{
150 for(G4int i=0; i<nIons; ++i) {delete stopData[i];}
151 if(isMaster) {
152 delete sBarkasCorr;
153 delete sThetaK;
154 delete sThetaL;
155 sBarkasCorr = sThetaK = sThetaL = nullptr;
156 }
157}
int G4int
Definition: G4Types.hh:85

◆ G4EmCorrections() [2/2]

G4EmCorrections::G4EmCorrections ( const G4EmCorrections )
delete

Member Function Documentation

◆ AddStoppingData()

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

Definition at line 808 of file G4EmCorrections.cc.

811{
812 G4int i = 0;
813 for(; i<nIons; ++i) {
814 if(Z == Zion[i] && A == Aion[i] && mname == materialName[i]) break;
815 }
816 if(i == nIons) {
817 Zion.push_back(Z);
818 Aion.push_back(A);
819 materialName.push_back(mname);
820 materialList.push_back(nullptr);
821 ionList.push_back(nullptr);
822 stopData.push_back(dVector);
823 nIons++;
824 if(verbose > 1) {
825 G4cout << "AddStoppingData Z= " << Z << " A= " << A << " " << mname
826 << " idx= " << i << G4endl;
827 }
828 }
829}
const G4int Z[17]
const G4double A[17]
#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 667 of file G4EmCorrections.cc.

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

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

◆ Bethe()

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

Definition at line 317 of file G4EmCorrections.cc.

320{
321 SetupKinematics(p, mat, e);
322 const G4double eexc = material->GetIonisation()->GetMeanExcitationEnergy();
323 const G4double eexc2 = eexc*eexc;
324 return 0.5*G4Log(2.0*electron_mass_c2*bg2*tmax/eexc2)-beta2;
325}
G4double GetMeanExcitationEnergy() const
G4IonisParamMat * GetIonisation() const
Definition: G4Material.hh:221

◆ BlochCorrection()

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

Definition at line 721 of file G4EmCorrections.cc.

724{
725 SetupKinematics(p, mat, e);
726
727 G4double y2 = q2/ba2;
728
729 G4double term = 1.0/(1.0 + y2);
730 G4double del;
731 G4double j = 1.0;
732 do {
733 j += 1.0;
734 del = 1.0/(j* (j*j + y2));
735 term += del;
736 // Loop checking, 03-Aug-2015, Vladimir Ivanchenko
737 } while (del > 0.01*term);
738
739 G4double res = -y2*term;
740 return res;
741}

Referenced by ComputeIonCorrections(), and HighOrderCorrections().

◆ ComputeIonCorrections()

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

Definition at line 235 of file G4EmCorrections.cc.

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

Referenced by IonHighOrderCorrections().

◆ DensityCorrection()

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

Definition at line 640 of file G4EmCorrections.cc.

643{
644 SetupKinematics(p, mat, e);
645
646 G4double cden = material->GetIonisation()->GetCdensity();
647 G4double mden = material->GetIonisation()->GetMdensity();
648 G4double aden = material->GetIonisation()->GetAdensity();
649 G4double x0den = material->GetIonisation()->GetX0density();
650 G4double x1den = material->GetIonisation()->GetX1density();
651
652 G4double dedx = 0.0;
653
654 // density correction
655 static const G4double twoln10 = 2.0*G4Log(10.0);
656 G4double x = G4Log(bg2)/twoln10;
657 if ( x >= x0den ) {
658 dedx = twoln10*x - cden ;
659 if ( x < x1den ) dedx += aden*G4Exp(G4Log(x1den-x)*mden) ;
660 }
661
662 return dedx;
663}
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 757 of file G4EmCorrections.cc.

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

Referenced by G4BraggModel::GetChargeSquareRatio(), and G4AtimaEnergyLossModel::GetChargeSquareRatio().

◆ EffectiveChargeSquareRatio()

◆ GetNumberOfStoppingVectors()

G4int G4EmCorrections::GetNumberOfStoppingVectors ( ) const
inline

Definition at line 307 of file G4EmCorrections.hh.

308{
309 return nIons;
310}

Referenced by G4ionIonisation::StreamProcessInfo().

◆ GetParticleCharge()

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

Definition at line 313 of file G4EmCorrections.hh.

316{
317 return effCharge.EffectiveCharge(p,mat,kineticEnergy);
318}
G4double EffectiveCharge(const G4ParticleDefinition *p, const G4Material *material, G4double kineticEnergy)

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

◆ HighOrderCorrections()

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

Definition at line 190 of file G4EmCorrections.cc.

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

901{
903 ncouples = tb->GetTableSize();
904 if(currmat.size() != ncouples) {
905 currmat.resize(ncouples);
906 for(auto it = thcorr.begin(); it != thcorr.end(); ++it){
907 (it->second).clear();
908 }
909 thcorr.clear();
910 for(std::size_t i=0; i<ncouples; ++i) {
911 currmat[i] = tb->GetMaterialCutsCouple((G4int)i)->GetMaterial();
912 G4String nam = currmat[i]->GetName();
913 for(G4int j=0; j<nIons; ++j) {
914 if(nam == materialName[j]) { materialList[j] = currmat[i]; }
915 }
916 }
917 }
918}
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 225 of file G4EmCorrections.cc.

228{
229 return 2.0*BarkasCorrection(p, mat, e)*
230 material->GetElectronDensity() * q2 * twopi_mc2_rcl2 /beta2;
231}

Referenced by G4BetheBlochModel::ComputeDEDXPerVolume().

◆ IonHighOrderCorrections()

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

Definition at line 267 of file G4EmCorrections.cc.

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

◆ KShellCorrection()

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

Definition at line 340 of file G4EmCorrections.cc.

343{
344 SetupKinematics(p, mat, e);
345 G4double term = 0.0;
346 for (G4int i = 0; i<numberOfElements; ++i) {
347
348 G4double Z = (*theElementVector)[i]->GetZ();
349 G4int iz = (*theElementVector)[i]->GetZasInt();
350 G4double f = 1.0;
351 G4double Z2= (Z-0.3)*(Z-0.3);
352 if(1 == iz) {
353 f = 0.5;
354 Z2 = 1.0;
355 }
356 G4double eta = ba2/Z2;
357 G4double tet = Z2*(1. + Z2*0.25*alpha2);
358 if(11 < iz) { tet = sThetaK->Value(Z); }
359 term += f*atomDensity[i]*KShell(tet,eta)/Z;
360 }
361
362 term /= material->GetTotNbOfAtomsPerVolume();
363
364 return term;
365}
const G4double alpha2

Referenced by HighOrderCorrections().

◆ LShellCorrection()

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

Definition at line 369 of file G4EmCorrections.cc.

372{
373 SetupKinematics(p, mat, e);
374 G4double term = 0.0;
375 for (G4int i = 0; i<numberOfElements; ++i) {
376
377 G4double Z = (*theElementVector)[i]->GetZ();
378 G4int iz = (*theElementVector)[i]->GetZasInt();
379 if(2 < iz) {
380 G4double Zeff = Z - ZD[10];
381 if(iz < 10) { Zeff = Z - ZD[iz]; }
382 G4double Z2= Zeff*Zeff;
383 G4double f = 0.125;
384 G4double eta = ba2/Z2;
385 G4double tet = sThetaL->Value(Z);
386 G4int nmax = std::min(4,G4AtomicShells::GetNumberOfShells(iz));
387 for(G4int j=1; j<nmax; ++j) {
389 if(15 >= iz) {
390 if(3 > j) { tet = 0.25*Z2*(1.0 + 5*Z2*alpha2/16.); }
391 else { tet = 0.25*Z2*(1.0 + Z2*alpha2/16.); }
392 }
393 //G4cout << " LShell: j= " << j << " ne= " << ne << " e(eV)= " << e/eV
394 // << " ThetaL= " << tet << G4endl;
395 term += f*ne*atomDensity[i]*LShell(tet,eta)/Z;
396 }
397 }
398 }
399
400 term /= material->GetTotNbOfAtomsPerVolume();
401
402 return term;
403}
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 745 of file G4EmCorrections.cc.

748{
749 SetupKinematics(p, mat, e);
750 G4double mterm = CLHEP::pi*fine_structure_const*beta*charge;
751 return mterm;
752}

Referenced by ComputeIonCorrections(), and HighOrderCorrections().

◆ operator=()

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

◆ SetIonisationModels()

void G4EmCorrections::SetIonisationModels ( G4VEmModel mod1 = nullptr,
G4VEmModel mod2 = nullptr 
)
inline

Definition at line 301 of file G4EmCorrections.hh.

302{
303 if(nullptr != mod1) { ionLEModel = mod1; }
304 if(nullptr != mod2) { ionHEModel = mod2; }
305}

Referenced by G4ionIonisation::InitialiseEnergyLossProcess().

◆ SetVerbose()

void G4EmCorrections::SetVerbose ( G4int  verb)
inline

Definition at line 328 of file G4EmCorrections.hh.

329{
330 verbose = verb;
331}

Referenced by G4LossTableManager::ResetParameters().

◆ ShellCorrection()

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

Definition at line 537 of file G4EmCorrections.cc.

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

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

◆ ShellCorrectionSTD()

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

Definition at line 503 of file G4EmCorrections.cc.

506{
507 SetupKinematics(p, mat, e);
508 G4double taulim= 8.0*MeV/mass;
509 G4double bg2lim= taulim * (taulim+2.0);
510
511 G4double* shellCorrectionVector =
513 G4double sh = 0.0;
514 G4double x = 1.0;
515 G4double taul = material->GetIonisation()->GetTaul();
516
517 if ( bg2 >= bg2lim ) {
518 for (G4int k=0; k<3; ++k) {
519 x *= bg2 ;
520 sh += shellCorrectionVector[k]/x;
521 }
522
523 } else {
524 for (G4int k=0; k<3; ++k) {
525 x *= bg2lim ;
526 sh += shellCorrectionVector[k]/x;
527 }
528 sh *= G4Log(tau/taul)/G4Log(taulim/taul);
529 }
530 sh *= 0.5;
531 return sh;
532}
G4double * GetShellCorrectionVector() const
G4double GetTaul() const

◆ SpinCorrection()

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

Definition at line 329 of file G4EmCorrections.cc.

332{
333 SetupKinematics(p, mat, e);
334 const G4double dedx = 0.5*tmax/(kinEnergy + mass);
335 return 0.5*dedx*dedx;
336}

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