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

#include <G4EmCorrections.hh>

Public Member Functions

 G4EmCorrections ()
 
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)
 
G4double NuclearDEDX (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy, G4bool fluct=true)
 
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=0, G4VEmModel *m2=0)
 
G4int GetNumberOfStoppingVectors ()
 

Detailed Description

Definition at line 71 of file G4EmCorrections.hh.

Constructor & Destructor Documentation

G4EmCorrections::G4EmCorrections ( )

Definition at line 77 of file G4EmCorrections.cc.

References G4ParticleTable::GetIonTable(), G4ParticleTable::GetParticleTable(), G4NistManager::Instance(), python.hepunit::keV, and python.hepunit::MeV.

78 {
79  particle = 0;
80  curParticle= 0;
81  material = 0;
82  curMaterial= 0;
83  curVector = 0;
84  kinEnergy = 0.0;
85  ionLEModel = 0;
86  ionHEModel = 0;
87  nIons = 0;
88  verbose = 1;
89  ncouples = 0;
90  massFactor = 1.0;
91  eth = 2.0*MeV;
92  nbinCorr = 20;
93  eCorrMin = 25.*keV;
94  eCorrMax = 250.*MeV;
95  nist = G4NistManager::Instance();
97  BarkasCorr = ThetaK = ThetaL = 0;
98  Initialise();
99 }
static G4NistManager * Instance()
G4IonTable * GetIonTable() const
static G4ParticleTable * GetParticleTable()
G4EmCorrections::~G4EmCorrections ( )
virtual

Definition at line 103 of file G4EmCorrections.cc.

104 {
105  // for(G4int i=0; i<nIons; ++i) {delete stopData[i];}
106  // delete BarkasCorr;
107  // delete ThetaK;
108  // delete ThetaL;
109 }

Member Function Documentation

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

Definition at line 791 of file G4EmCorrections.cc.

References G4cout, and G4endl.

Referenced by G4ionIonisation::AddStoppingData().

794 {
795  G4int i = 0;
796  for(; i<nIons; ++i) {
797  if(Z == Zion[i] && A == Aion[i] && mname == materialName[i]) break;
798  }
799  if(i == nIons) {
800  Zion.push_back(Z);
801  Aion.push_back(A);
802  materialName.push_back(mname);
803  materialList.push_back(0);
804  ionList.push_back(0);
805  stopData.push_back(dVector);
806  nIons++;
807  if(verbose>1) {
808  G4cout << "AddStoppingData Z= " << Z << " A= " << A << " " << mname
809  << " idx= " << i << G4endl;
810  }
811  }
812 }
int G4int
Definition: G4Types.hh:78
G4GLOB_DLL std::ostream G4cout
#define G4endl
Definition: G4ios.hh:61
G4double G4EmCorrections::BarkasCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 575 of file G4EmCorrections.cc.

References test::b, G4PhysicsVector::Energy(), G4Material::GetName(), G4Material::GetTotNbOfAtomsPerVolume(), iz, and G4PhysicsVector::Value().

Referenced by ComputeIonCorrections(), HighOrderCorrections(), and IonBarkasCorrection().

578 {
579  // . Z^3 Barkas effect in the stopping power of matter for charged particles
580  // J.C Ashley and R.H.Ritchie
581  // Physical review B Vol.5 No.7 1 April 1972 pp. 2393-2397
582  // valid for kineticEnergy > 0.5 MeV
583 
584  SetupKinematics(p, mat, e);
585  G4double BarkasTerm = 0.0;
586 
587  for (G4int i = 0; i<numberOfElements; ++i) {
588 
589  G4double Z = (*theElementVector)[i]->GetZ();
590  G4int iz = G4int(Z);
591  if(iz == 47) {
592  BarkasTerm += atomDensity[i]*0.006812*std::pow(beta,-0.9);
593  } else if(iz >= 64) {
594  BarkasTerm += atomDensity[i]*0.002833*std::pow(beta,-1.2);
595  } else {
596 
597  G4double X = ba2 / Z;
598  G4double b = 1.3;
599  if(1 == iz) {
600  if(material->GetName() == "G4_lH2") { b = 0.6; }
601  else { b = 1.8; }
602  }
603  else if(2 == iz) { b = 0.6; }
604  else if(10 >= iz) { b = 1.8; }
605  else if(17 >= iz) { b = 1.4; }
606  else if(18 == iz) { b = 1.8; }
607  else if(25 >= iz) { b = 1.4; }
608  else if(50 >= iz) { b = 1.35;}
609 
610  G4double W = b/std::sqrt(X);
611 
612  G4double val = BarkasCorr->Value(W);
613  if(W > BarkasCorr->Energy(46)) {
614  val *= BarkasCorr->Energy(46)/W;
615  }
616  // G4cout << "i= " << i << " b= " << b << " W= " << W
617  // << " Z= " << Z << " X= " << X << " val= " << val<< G4endl;
618  BarkasTerm += val*atomDensity[i] / (std::sqrt(Z*X)*X);
619  }
620  }
621 
622  BarkasTerm *= 1.29*charge/material->GetTotNbOfAtomsPerVolume();
623 
624  // temporary protection
625  //if(charge < -7.0 ) { BarkasTerm *= (-7.0/charge); }
626 
627  return BarkasTerm;
628 }
const G4String & GetName() const
Definition: G4Material.hh:176
int G4int
Definition: G4Types.hh:78
G4double iz
Definition: TRTMaterials.hh:39
G4double Energy(size_t index) const
G4double Value(G4double theEnergy, size_t &lastidx) const
G4double GetTotNbOfAtomsPerVolume() const
Definition: G4Material.hh:207
double G4double
Definition: G4Types.hh:76
G4double G4EmCorrections::Bethe ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 249 of file G4EmCorrections.cc.

References python.hepunit::electron_mass_c2, G4Material::GetIonisation(), and G4IonisParamMat::GetMeanExcitationEnergy().

252 {
253  SetupKinematics(p, mat, e);
254  G4double eexc = material->GetIonisation()->GetMeanExcitationEnergy();
255  G4double eexc2 = eexc*eexc;
256  G4double dedx = 0.5*std::log(2.0*electron_mass_c2*bg2*tmax/eexc2)-beta2;
257  return dedx;
258 }
G4IonisParamMat * GetIonisation() const
Definition: G4Material.hh:224
float electron_mass_c2
Definition: hepunit.py:274
G4double GetMeanExcitationEnergy() const
double G4double
Definition: G4Types.hh:76
G4double G4EmCorrections::BlochCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 632 of file G4EmCorrections.cc.

Referenced by ComputeIonCorrections(), and HighOrderCorrections().

635 {
636  SetupKinematics(p, mat, e);
637 
638  G4double y2 = q2/ba2;
639 
640  G4double term = 1.0/(1.0 + y2);
641  G4double del;
642  G4double j = 1.0;
643  do {
644  j += 1.0;
645  del = 1.0/(j* (j*j + y2));
646  term += del;
647  } while (del > 0.01*term);
648 
649  G4double res = -y2*term;
650  // temporary protection
651  //if(q2 > 49. && res < -0.2) { res = -0.2; }
652 
653  return res;
654 }
double G4double
Definition: G4Types.hh:76
G4double G4EmCorrections::ComputeIonCorrections ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 168 of file G4EmCorrections.cc.

References BarkasCorrection(), BlochCorrection(), G4cout, G4endl, G4Material::GetElectronDensity(), python.hepunit::MeV, MottCorrection(), and python.hepunit::twopi_mc2_rcl2.

Referenced by IonHighOrderCorrections().

171 {
172  // . Z^3 Barkas effect in the stopping power of matter for charged particles
173  // J.C Ashley and R.H.Ritchie
174  // Physical review B Vol.5 No.7 1 April 1972 pagg. 2393-2397
175  // and ICRU49 report
176  // valid for kineticEnergy < 0.5 MeV
177  // Other corrections from S.P.Ahlen Rev. Mod. Phys., Vol 52, No1, 1980
178  SetupKinematics(p, mat, e);
179  if(tau <= 0.0) { return 0.0; }
180 
181  G4double Barkas = BarkasCorrection (p, mat, e);
182  G4double Bloch = BlochCorrection (p, mat, e);
183  G4double Mott = MottCorrection (p, mat, e);
184 
185  G4double sum = 2.0*(Barkas*(charge - 1.0)/charge + Bloch) + Mott;
186 
187  if(verbose > 1) {
188  G4cout << "EmCorrections: E(MeV)= " << e/MeV << " Barkas= " << Barkas
189  << " Bloch= " << Bloch << " Mott= " << Mott
190  << " Sum= " << sum << G4endl;
191  }
192  sum *= material->GetElectronDensity() * q2 * twopi_mc2_rcl2 /beta2;
193 
194  if(verbose > 1) { G4cout << " Sum= " << sum << G4endl; }
195  return sum;
196 }
G4double MottCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double BlochCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4GLOB_DLL std::ostream G4cout
G4double GetElectronDensity() const
Definition: G4Material.hh:215
G4double BarkasCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
G4double G4EmCorrections::DensityCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 548 of file G4EmCorrections.cc.

References G4IonisParamMat::GetAdensity(), G4IonisParamMat::GetCdensity(), G4Material::GetIonisation(), G4IonisParamMat::GetMdensity(), G4IonisParamMat::GetX0density(), and G4IonisParamMat::GetX1density().

551 {
552  SetupKinematics(p, mat, e);
553 
554  G4double cden = material->GetIonisation()->GetCdensity();
555  G4double mden = material->GetIonisation()->GetMdensity();
556  G4double aden = material->GetIonisation()->GetAdensity();
557  G4double x0den = material->GetIonisation()->GetX0density();
558  G4double x1den = material->GetIonisation()->GetX1density();
559 
560  G4double twoln10 = 2.0*std::log(10.0);
561  G4double dedx = 0.0;
562 
563  // density correction
564  G4double x = std::log(bg2)/twoln10;
565  if ( x >= x0den ) {
566  dedx = twoln10*x - cden ;
567  if ( x < x1den ) dedx += aden*std::pow((x1den-x),mden) ;
568  }
569 
570  return dedx;
571 }
G4IonisParamMat * GetIonisation() const
Definition: G4Material.hh:224
G4double GetAdensity() const
G4double GetX1density() const
G4double GetX0density() const
G4double GetCdensity() const
double G4double
Definition: G4Types.hh:76
G4double GetMdensity() const
G4double G4EmCorrections::EffectiveChargeCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 742 of file G4EmCorrections.cc.

References python.hepunit::amu_c2, python.hepunit::eplus, G4cout, G4endl, G4ParticleDefinition::GetAtomicNumber(), G4ParticleDefinition::GetPDGCharge(), G4ParticleDefinition::GetPDGMass(), python.hepunit::proton_mass_c2, and G4PhysicsVector::Value().

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

745 {
746  G4double factor = 1.0;
747  if(p->GetPDGCharge() <= 2.5*eplus || nIons <= 0) return factor;
748  /*
749  if(verbose > 1) {
750  G4cout << "EffectiveChargeCorrection: " << p->GetParticleName()
751  << " in " << mat->GetName()
752  << " ekin(MeV)= " << ekin/MeV << G4endl;
753  }
754  */
755  if(p != curParticle || mat != curMaterial) {
756  curParticle = p;
757  curMaterial = mat;
758  curVector = 0;
759  currentZ = p->GetAtomicNumber();
760  if(verbose > 1) {
761  G4cout << "G4EmCorrections::EffectiveChargeCorrection: Zion= "
762  << currentZ << " Aion= " << p->GetPDGMass()/amu_c2 << G4endl;
763  }
764  massFactor = proton_mass_c2/p->GetPDGMass();
765  idx = -1;
766 
767  for(G4int i=0; i<nIons; ++i) {
768  if(materialList[i] == mat && currentZ == Zion[i]) {
769  idx = i;
770  break;
771  }
772  }
773  // G4cout << " idx= " << idx << " dz= " << G4endl;
774  if(idx >= 0) {
775  if(!ionList[idx]) BuildCorrectionVector();
776  if(ionList[idx]) curVector = stopData[idx];
777  } else { return factor; }
778  }
779  if(curVector) {
780  factor = curVector->Value(ekin*massFactor);
781  if(verbose > 1) {
782  G4cout << "E= " << ekin << " factor= " << factor << " massfactor= "
783  << massFactor << G4endl;
784  }
785  }
786  return factor;
787 }
const char * p
Definition: xmltok.h:285
int G4int
Definition: G4Types.hh:78
G4int GetAtomicNumber() const
G4GLOB_DLL std::ostream G4cout
float proton_mass_c2
Definition: hepunit.py:275
G4double Value(G4double theEnergy, size_t &lastidx) const
G4double GetPDGMass() const
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
float amu_c2
Definition: hepunit.py:277
G4double GetPDGCharge() const
G4double G4EmCorrections::EffectiveChargeSquareRatio ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)
inline
G4int G4EmCorrections::GetNumberOfStoppingVectors ( )
inline

Definition at line 321 of file G4EmCorrections.hh.

Referenced by G4ionIonisation::PrintInfo().

322 {
323  return nIons;
324 }
G4double G4EmCorrections::GetParticleCharge ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)
inline

Definition at line 327 of file G4EmCorrections.hh.

References G4ionEffectiveCharge::EffectiveCharge().

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

330 {
331  return effCharge.EffectiveCharge(p,mat,kineticEnergy);
332 }
G4double EffectiveCharge(const G4ParticleDefinition *p, const G4Material *material, G4double kineticEnergy)
G4double G4EmCorrections::HighOrderCorrections ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy,
G4double  cutEnergy 
)

Definition at line 113 of file G4EmCorrections.cc.

References BarkasCorrection(), BlochCorrection(), G4cout, G4endl, G4Material::GetElectronDensity(), G4Material::GetName(), KShellCorrection(), LShellCorrection(), python.hepunit::MeV, MottCorrection(), ShellCorrection(), and python.hepunit::twopi_mc2_rcl2.

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

116 {
117  // . Z^3 Barkas effect in the stopping power of matter for charged particles
118  // J.C Ashley and R.H.Ritchie
119  // Physical review B Vol.5 No.7 1 April 1972 pagg. 2393-2397
120  // and ICRU49 report
121  // valid for kineticEnergy < 0.5 MeV
122  // Other corrections from S.P.Ahlen Rev. Mod. Phys., Vol 52, No1, 1980
123 
124  SetupKinematics(p, mat, e);
125  if(tau <= 0.0) { return 0.0; }
126 
127  G4double Barkas = BarkasCorrection (p, mat, e);
128  G4double Bloch = BlochCorrection (p, mat, e);
129  G4double Mott = MottCorrection (p, mat, e);
130 
131  G4double sum = (2.0*(Barkas + Bloch) + Mott);
132 
133  if(verbose > 1) {
134  G4cout << "EmCorrections: E(MeV)= " << e/MeV << " Barkas= " << Barkas
135  << " Bloch= " << Bloch << " Mott= " << Mott
136  << " Sum= " << sum << " q2= " << q2 << G4endl;
137  G4cout << " ShellCorrection: " << ShellCorrection(p, mat, e)
138  << " Kshell= " << KShellCorrection(p, mat, e)
139  << " Lshell= " << LShellCorrection(p, mat, e)
140  << " " << mat->GetName() << G4endl;
141  }
142  sum *= material->GetElectronDensity() * q2 * twopi_mc2_rcl2 /beta2;
143  return sum;
144 }
const G4String & GetName() const
Definition: G4Material.hh:176
G4double MottCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double BlochCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4GLOB_DLL std::ostream G4cout
G4double GetElectronDensity() const
Definition: G4Material.hh:215
G4double BarkasCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double ShellCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double KShellCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double LShellCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
void G4EmCorrections::InitialiseForNewRun ( )

Definition at line 892 of file G4EmCorrections.cc.

References G4MaterialCutsCouple::GetMaterial(), G4ProductionCutsTable::GetMaterialCutsCouple(), G4ProductionCutsTable::GetProductionCutsTable(), and G4ProductionCutsTable::GetTableSize().

Referenced by G4ionIonisation::InitialiseEnergyLossProcess().

893 {
895  ncouples = tb->GetTableSize();
896  if(currmat.size() != ncouples) {
897  currmat.resize(ncouples);
898  for(std::map< G4int, std::vector<G4double> >::iterator it =
899  thcorr.begin(); it != thcorr.end(); ++it){
900  (it->second).clear();
901  }
902  thcorr.clear();
903  for(size_t i=0; i<ncouples; ++i) {
904  currmat[i] = tb->GetMaterialCutsCouple(i)->GetMaterial();
905  G4String nam = currmat[i]->GetName();
906  for(G4int j=0; j<nIons; ++j) {
907  if(nam == materialName[j]) { materialList[j] = currmat[i]; }
908  }
909  }
910  }
911 }
int G4int
Definition: G4Types.hh:78
static G4ProductionCutsTable * GetProductionCutsTable()
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
const G4Material * GetMaterial() const
G4double G4EmCorrections::IonBarkasCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 148 of file G4EmCorrections.cc.

References BarkasCorrection(), G4Material::GetElectronDensity(), and python.hepunit::twopi_mc2_rcl2.

Referenced by G4BetheBlochModel::ComputeDEDXPerVolume().

151 {
152  // . Z^3 Barkas effect in the stopping power of matter for charged particles
153  // J.C Ashley and R.H.Ritchie
154  // Physical review B Vol.5 No.7 1 April 1972 pagg. 2393-2397
155  // and ICRU49 report
156  // valid for kineticEnergy < 0.5 MeV
157 
158  SetupKinematics(p, mat, e);
159  G4double res = 0.0;
160  if(tau > 0.0)
161  res = 2.0*BarkasCorrection(p, mat, e)*
162  material->GetElectronDensity() * q2 * twopi_mc2_rcl2 /beta2;
163  return res;
164 }
G4double GetElectronDensity() const
Definition: G4Material.hh:215
G4double BarkasCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
double G4double
Definition: G4Types.hh:76
G4double G4EmCorrections::IonHighOrderCorrections ( const G4ParticleDefinition p,
const G4MaterialCutsCouple couple,
G4double  kineticEnergy 
)

Definition at line 200 of file G4EmCorrections.cc.

References ComputeIonCorrections(), python.hepunit::eplus, G4cout, G4endl, G4MaterialCutsCouple::GetIndex(), G4MaterialCutsCouple::GetMaterial(), G4ParticleDefinition::GetPDGCharge(), G4ParticleDefinition::GetPDGEncoding(), G4ParticleDefinition::GetPDGMass(), python.hepunit::proton_mass_c2, and test::v.

Referenced by G4BetheBlochModel::CorrectionsAlongStep().

203 {
204 // . Z^3 Barkas effect in the stopping power of matter for charged particles
205 // J.C Ashley and R.H.Ritchie
206 // Physical review B Vol.5 No.7 1 April 1972 pagg. 2393-2397
207 // and ICRU49 report
208 // valid for kineticEnergy < 0.5 MeV
209 // Other corrections from S.P.Ahlen Rev. Mod. Phys., Vol 52, No1, 1980
210 
211  G4double sum = 0.0;
212 
213  if(ionHEModel) {
214  G4int Z = G4int(p->GetPDGCharge()/eplus + 0.5);
215  if(Z >= 100) Z = 99;
216  else if(Z < 1) Z = 1;
217 
218  G4double ethscaled = eth*p->GetPDGMass()/proton_mass_c2;
219  G4int ionPDG = p->GetPDGEncoding();
220  if(thcorr.find(ionPDG)==thcorr.end()) { // Not found: fill the map
221  std::vector<G4double> v;
222  for(size_t i=0; i<ncouples; ++i){
223  v.push_back(ethscaled*ComputeIonCorrections(p,currmat[i],ethscaled));
224  }
225  thcorr.insert(std::pair< G4int, std::vector<G4double> >(ionPDG,v));
226  }
227 
228  //G4cout << " map size=" << thcorr.size() << G4endl;
229  //for(std::map< G4int, std::vector<G4double> >::iterator
230  // it = thcorr.begin(); it != thcorr.end(); ++it){
231  // G4cout << "\t map element: first (key)=" << it->first
232  // << "\t second (vector): vec size=" << (it->second).size() << G4endl;
233  // for(size_t i=0; i<(it->second).size(); ++i){
234  // G4cout << "\t \t vec element: [" << i << "]=" << (it->second)[i] << G4endl;
235  // }
236  //}
237 
238  G4double rest = (thcorr.find(ionPDG)->second)[couple->GetIndex()];
239 
240  sum = ComputeIonCorrections(p,couple->GetMaterial(),e) - rest/e;
241 
242  if(verbose > 1) { G4cout << " Sum= " << sum << " dSum= " << rest/e << G4endl; }
243  }
244  return sum;
245 }
int G4int
Definition: G4Types.hh:78
G4GLOB_DLL std::ostream G4cout
float proton_mass_c2
Definition: hepunit.py:275
G4double GetPDGMass() const
#define G4endl
Definition: G4ios.hh:61
G4double ComputeIonCorrections(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
double G4double
Definition: G4Types.hh:76
G4double GetPDGCharge() const
const G4Material * GetMaterial() const
G4double G4EmCorrections::KShellCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 273 of file G4EmCorrections.cc.

References G4Material::GetTotNbOfAtomsPerVolume(), iz, and G4PhysicsVector::Value().

Referenced by HighOrderCorrections().

276 {
277  SetupKinematics(p, mat, e);
278  G4double term = 0.0;
279  for (G4int i = 0; i<numberOfElements; ++i) {
280 
281  G4double Z = (*theElementVector)[i]->GetZ();
282  G4int iz = G4int(Z);
283  G4double f = 1.0;
284  G4double Z2= (Z-0.3)*(Z-0.3);
285  if(1 == iz) {
286  f = 0.5;
287  Z2 = 1.0;
288  }
289  G4double eta = ba2/Z2;
290  G4double tet = Z2*(1. + Z2*0.25*alpha2);
291  if(11 < iz) { tet = ThetaK->Value(Z); }
292  term += f*atomDensity[i]*KShell(tet,eta)/Z;
293  }
294 
295  term /= material->GetTotNbOfAtomsPerVolume();
296 
297  return term;
298 }
int G4int
Definition: G4Types.hh:78
G4double iz
Definition: TRTMaterials.hh:39
G4double Value(G4double theEnergy, size_t &lastidx) const
G4double GetTotNbOfAtomsPerVolume() const
Definition: G4Material.hh:207
double G4double
Definition: G4Types.hh:76
G4double G4EmCorrections::LShellCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 302 of file G4EmCorrections.cc.

References G4AtomicShells::GetNumberOfElectrons(), G4AtomicShells::GetNumberOfShells(), G4Material::GetTotNbOfAtomsPerVolume(), iz, G4INCL::Math::min(), nmax, and G4PhysicsVector::Value().

Referenced by HighOrderCorrections().

305 {
306  SetupKinematics(p, mat, e);
307  G4double term = 0.0;
308  for (G4int i = 0; i<numberOfElements; ++i) {
309 
310  G4double Z = (*theElementVector)[i]->GetZ();
311  G4int iz = G4int(Z);
312  if(2 < iz) {
313  G4double Zeff = Z - ZD[10];
314  if(iz < 10) { Zeff = Z - ZD[iz]; }
315  G4double Z2= Zeff*Zeff;
316  G4double f = 0.125;
317  G4double eta = ba2/Z2;
318  G4double tet = ThetaL->Value(Z);
320  for(G4int j=1; j<nmax; ++j) {
322  if(15 >= iz) {
323  if(3 > j) { tet = 0.25*Z2*(1.0 + 5*Z2*alpha2/16.); }
324  else { tet = 0.25*Z2*(1.0 + Z2*alpha2/16.); }
325  }
326  //G4cout << " LShell: j= " << j << " ne= " << ne << " e(eV)= " << e/eV
327  // << " ThetaL= " << tet << G4endl;
328  term += f*ne*atomDensity[i]*LShell(tet,eta)/Z;
329  }
330  }
331  }
332 
333  term /= material->GetTotNbOfAtomsPerVolume();
334 
335  return term;
336 }
int G4int
Definition: G4Types.hh:78
G4double iz
Definition: TRTMaterials.hh:39
const G4int nmax
G4double Value(G4double theEnergy, size_t &lastidx) const
G4double GetTotNbOfAtomsPerVolume() const
Definition: G4Material.hh:207
static G4int GetNumberOfElectrons(G4int Z, G4int SubshellNb)
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
double G4double
Definition: G4Types.hh:76
static G4int GetNumberOfShells(G4int Z)
G4double G4EmCorrections::MottCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 658 of file G4EmCorrections.cc.

References python.hepunit::fine_structure_const.

Referenced by ComputeIonCorrections(), and HighOrderCorrections().

661 {
662  SetupKinematics(p, mat, e);
663  G4double mterm = CLHEP::pi*fine_structure_const*beta*charge;
664  return mterm;
665 }
double G4double
Definition: G4Types.hh:76
G4double G4EmCorrections::NuclearDEDX ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy,
G4bool  fluct = true 
)

Definition at line 669 of file G4EmCorrections.cc.

References python.hepunit::amu_c2, python.hepunit::eplus, g(), G4Element::GetA(), G4ParticleDefinition::GetPDGCharge(), G4Element::GetZ(), and python.hepunit::mole.

Referenced by G4EmCalculator::ComputeNuclearDEDX().

673 {
674  G4double nloss = 0.0;
675  if(e <= 0.0) return nloss;
676  SetupKinematics(p, mat, e);
677 
678  lossFlucFlag = fluct;
679 
680  // Projectile nucleus
681  G4double z1 = std::fabs(particle->GetPDGCharge()/eplus);
682  G4double mass1 = mass/amu_c2;
683 
684  // loop for the elements in the material
685  for (G4int iel=0; iel<numberOfElements; iel++) {
686  const G4Element* element = (*theElementVector)[iel] ;
687  G4double z2 = element->GetZ();
688  G4double mass2 = element->GetA()*mole/g ;
689  nloss += (NuclearStoppingPower(kinEnergy, z1, z2, mass1, mass2))
690  * atomDensity[iel] ;
691  }
692  nloss *= theZieglerFactor;
693  return nloss;
694 }
G4double GetZ() const
Definition: G4Element.hh:131
G4double GetA() const
Definition: G4Element.hh:138
int G4int
Definition: G4Types.hh:78
function g(Y1, Y2, PT2)
Definition: hijing1.383.f:5205
double G4double
Definition: G4Types.hh:76
float amu_c2
Definition: hepunit.py:277
G4double GetPDGCharge() const
void G4EmCorrections::SetIonisationModels ( G4VEmModel m1 = 0,
G4VEmModel m2 = 0 
)
inline

Definition at line 315 of file G4EmCorrections.hh.

Referenced by G4ionIonisation::InitialiseEnergyLossProcess().

316 {
317  if(mod1) { ionLEModel = mod1; }
318  if(mod2) { ionHEModel = mod2; }
319 }
G4double G4EmCorrections::ShellCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 459 of file G4EmCorrections.cc.

References G4AtomicShells::GetNumberOfElectrons(), G4AtomicShells::GetNumberOfShells(), G4Material::GetTotNbOfAtomsPerVolume(), iz, G4INCL::Math::min(), nmax, and G4PhysicsVector::Value().

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

462 {
463  SetupKinematics(p, mat, ekin);
464 
465  G4double term = 0.0;
466  //G4cout << "### G4EmCorrections::ShellCorrection " << mat->GetName()
467  // << " " << ekin/MeV << " MeV " << G4endl;
468  for (G4int i = 0; i<numberOfElements; ++i) {
469 
470  G4double res = 0.0;
471  G4double res0 = 0.0;
472  G4double Z = (*theElementVector)[i]->GetZ();
473  G4int iz = G4int(Z);
474  G4double Z2= (Z-0.3)*(Z-0.3);
475  G4double f = 1.0;
476  if(1 == iz) {
477  f = 0.5;
478  Z2 = 1.0;
479  }
480  G4double eta = ba2/Z2;
481  G4double tet = Z2*(1. + Z2*0.25*alpha2);
482  if(11 < iz) { tet = ThetaK->Value(Z); }
483  res0 = f*KShell(tet,eta);
484  res += res0;
485  //G4cout << " Z= " << iz << " Shell 0" << " tet= " << tet
486  // << " eta= " << eta << " resK= " << res0 << G4endl;
487  if(2 < iz) {
488  G4double Zeff = Z - ZD[10];
489  if(iz < 10) { Zeff = Z - ZD[iz]; }
490  Z2= Zeff*Zeff;
491  eta = ba2/Z2;
492  f = 0.125;
493  tet = ThetaL->Value(Z);
495  G4int nmax = std::min(4, ntot);
496  G4double norm = 0.0;
497  G4double eshell = 0.0;
498  for(G4int j=1; j<nmax; ++j) {
500  if(15 >= iz) {
501  if(3 > j) { tet = 0.25*Z2*(1.0 + 5*Z2*alpha2/16.); }
502  else { tet = 0.25*Z2*(1.0 + Z2*alpha2/16.); }
503  }
504  norm += ne;
505  eshell += tet*ne;
506  res0 = f*ne*LShell(tet,eta);
507  res += res0;
508  //G4cout << " Z= " << iz << " Shell " << j << " Ne= " << ne
509  // << " tet= " << tet << " eta= " << eta
510  // << " resL= " << res0 << G4endl;
511  }
512  if(ntot > nmax) {
513  eshell /= norm;
514  // Add M-shell
515  if(28 > iz) {
516  res += f*(iz - 10)*LShell(eshell,HM[iz-11]*eta);
517  } else if(63 > iz) {
518  res += f*18*LShell(eshell,HM[iz-11]*eta);
519  } else {
520  res += f*18*LShell(eshell,HM[52]*eta);
521  }
522  // Add N-shell
523  if(32 < iz) {
524  if(60 > iz) {
525  res += f*(iz - 28)*LShell(eshell,HN[iz-33]*eta);
526  } else if(63 > iz) {
527  res += 4*LShell(eshell,HN[iz-33]*eta);
528  } else {
529  res += 4*LShell(eshell,HN[30]*eta);
530  }
531  // Add O-P-shells
532  if(60 < iz) {
533  res += f*(iz - 60)*LShell(eshell,150*eta);
534  }
535  }
536  }
537  }
538  term += res*atomDensity[i]/Z;
539  }
540 
541  term /= material->GetTotNbOfAtomsPerVolume();
542  //G4cout << "# Shell Correction= " << term << G4endl;
543  return term;
544 }
int G4int
Definition: G4Types.hh:78
G4double iz
Definition: TRTMaterials.hh:39
const G4int nmax
G4double Value(G4double theEnergy, size_t &lastidx) const
G4double GetTotNbOfAtomsPerVolume() const
Definition: G4Material.hh:207
static G4int GetNumberOfElectrons(G4int Z, G4int SubshellNb)
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
double G4double
Definition: G4Types.hh:76
static G4int GetNumberOfShells(G4int Z)
G4double G4EmCorrections::ShellCorrectionSTD ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 425 of file G4EmCorrections.cc.

References G4Material::GetIonisation(), G4IonisParamMat::GetShellCorrectionVector(), G4IonisParamMat::GetTaul(), python.hepunit::MeV, and test::x.

428 {
429  SetupKinematics(p, mat, e);
430  G4double taulim= 8.0*MeV/mass;
431  G4double bg2lim= taulim * (taulim+2.0);
432 
433  G4double* shellCorrectionVector =
435  G4double sh = 0.0;
436  G4double x = 1.0;
437  G4double taul = material->GetIonisation()->GetTaul();
438 
439  if ( bg2 >= bg2lim ) {
440  for (G4int k=0; k<3; k++) {
441  x *= bg2 ;
442  sh += shellCorrectionVector[k]/x;
443  }
444 
445  } else {
446  for (G4int k=0; k<3; k++) {
447  x *= bg2lim ;
448  sh += shellCorrectionVector[k]/x;
449  }
450  sh *= std::log(tau/taul)/std::log(taulim/taul);
451  }
452  sh *= 0.5;
453  return sh;
454 }
G4IonisParamMat * GetIonisation() const
Definition: G4Material.hh:224
G4double GetTaul() const
int G4int
Definition: G4Types.hh:78
G4double * GetShellCorrectionVector() const
double G4double
Definition: G4Types.hh:76
G4double G4EmCorrections::SpinCorrection ( const G4ParticleDefinition p,
const G4Material mat,
G4double  kineticEnergy 
)

Definition at line 262 of file G4EmCorrections.cc.

265 {
266  SetupKinematics(p, mat, e);
267  G4double dedx = 0.5*tmax/(kinEnergy + mass);
268  return 0.5*dedx*dedx;
269 }
double G4double
Definition: G4Types.hh:76

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