87 theIonEffChargeModel(0),
88 theNuclearStoppingModel(0),
89 theIonChuFluctuationModel(0),
90 theIonYangFluctuationModel(0),
91 protonTable(
"ICRU_R49p"),
92 antiprotonTable(
"ICRU_R49p"),
93 theNuclearTable(
"ICRU_R49"),
96 theMeanFreePathTable(0),
97 paramStepLimit (0.005),
98 pixeCrossSectionHandler(0)
105void G4hImpactIonisation::InitializeMe()
111 protonLowEnergy = 1.*keV ;
112 protonHighEnergy = 100.*MeV ;
113 antiprotonLowEnergy = 25.*keV ;
114 antiprotonHighEnergy = 2.*MeV ;
115 minGammaEnergy = 100 * eV;
116 minElectronEnergy = 250.* eV;
122 eMaxPixe = 200. * MeV;
124 G4String defaultPixeModel(
"ecpssr");
125 modelK = defaultPixeModel;
126 modelL = defaultPixeModel;
127 modelM = defaultPixeModel;
141 if (theMeanFreePathTable)
144 delete theMeanFreePathTable;
147 if (betheBlochModel)
delete betheBlochModel;
148 if (protonModel)
delete protonModel;
149 if (antiprotonModel)
delete antiprotonModel;
150 if (theNuclearStoppingModel)
delete theNuclearStoppingModel;
151 if (theIonEffChargeModel)
delete theIonEffChargeModel;
152 if (theIonChuFluctuationModel)
delete theIonChuFluctuationModel;
153 if (theIonYangFluctuationModel)
delete theIonYangFluctuationModel;
155 delete pixeCrossSectionHandler;
171 SetProtonElectronicStoppingPowerModel(dedxTable) ;
176 SetAntiProtonElectronicStoppingPowerModel(dedxTable) ;
182void G4hImpactIonisation::InitializeParametrisation()
188 protonHighEnergy = std::min(protonHighEnergy,protonModel->
HighEnergyLimit(0, 0));
206 G4cout <<
"G4hImpactIonisation::BuildPhysicsTable for "
208 <<
" mass(MeV)= " << particleDef.
GetPDGMass()/MeV
217 G4cout <<
" 0: " << (*pv)[0]->GetProcessName() <<
" " << (*pv)[0]
218 <<
" 1: " << (*pv)[1]->GetProcessName() <<
" " << (*pv)[1]
221 G4cout <<
"ionModel= " << theIonEffChargeModel
222 <<
" MFPtable= " << theMeanFreePathTable
223 <<
" iniMass= " << initialMass
249 InitializeParametrisation() ;
254 chargeSquare = charge*charge ;
263 for (
G4int j=0; j<numOfCouples; ++j) {
275 tCut = std::max(tCut,excEnergy);
276 cutForDelta.push_back(tCut);
281 tCut = std::max(tCut,minGammaEnergy);
282 cutForGamma.push_back(tCut);
292 BuildLossTable(*proton) ;
303 BuildLossTable(*antiproton) ;
315 G4cout <<
"G4hImpactIonisation::BuildPhysicsTable: "
316 <<
"Loss table is built "
321 BuildLambdaTable(particleDef) ;
329 G4cout <<
"G4hImpactIonisation::BuildPhysicsTable: "
330 <<
"DEDX table will be built "
345 G4cout <<
"G4hImpactIonisation::BuildPhysicsTable: end for "
358 G4double lowEdgeEnergy , ionloss, ionlossBB, paramB ;
363 if (particleDef == *proton)
366 highEnergy = protonHighEnergy ;
372 highEnergy = antiprotonHighEnergy ;
390 for (
G4int j=0; j<numOfCouples; ++j) {
401 if ( charge > 0.0 ) {
402 ionloss = ProtonParametrisedDEDX(couple,highEnergy) ;
404 ionloss = AntiProtonParametrisedDEDX(couple,highEnergy) ;
407 ionlossBB = betheBlochModel->
TheValue(&particleDef,material,highEnergy) ;
408 ionlossBB -= DeltaRaysEnergy(couple,highEnergy,proton_mass_c2) ;
411 paramB = ionloss/ionlossBB - 1.0 ;
418 if ( lowEdgeEnergy < highEnergy ) {
420 if ( charge > 0.0 ) {
421 ionloss = ProtonParametrisedDEDX(couple,lowEdgeEnergy) ;
423 ionloss = AntiProtonParametrisedDEDX(couple,lowEdgeEnergy) ;
429 ionloss = betheBlochModel->
TheValue(proton,material,
432 ionloss -= DeltaRaysEnergy(couple,lowEdgeEnergy,proton_mass_c2) ;
434 ionloss *= (1.0 + paramB*highEnergy/lowEdgeEnergy) ;
439 G4cout <<
"E(MeV)= " << lowEdgeEnergy/MeV
440 <<
" dE/dx(MeV/mm)= " << ionloss*mm/MeV
460 G4cout <<
"G4hImpactIonisation::BuildLambdaTable for "
467 chargeSquare = charge*charge ;
475 if (theMeanFreePathTable) {
477 delete theMeanFreePathTable;
484 for (
G4int j=0 ; j < numOfCouples; ++j) {
511 for (
G4int iel=0; iel<numberOfElements; iel++ )
513 Z = (
G4int) (*theElementVector)[iel]->GetZ();
516 G4double microCross = MicroscopicCrossSection( particleDef,
521 sigma += theAtomicNumDensityVector[iel] * microCross ;
526 value = sigma<=0 ?
DBL_MAX : 1./sigma ;
531 theMeanFreePathTable->
insert(aVector);
554 G4double particleMass = initialMass;
559 G4double beta2 = 1. - 1. / (gamma * gamma);
560 G4double var = electron_mass_c2 / particleMass;
561 G4double tMax = 2. * electron_mass_c2 * (gamma*gamma - 1.) / (1. + 2.* gamma*var + var*var);
565 if ( tMax > deltaCutInEnergy )
567 var = deltaCutInEnergy / tMax;
568 totalCrossSection = (1. - var * (1. - beta2 * std::log(var))) / deltaCutInEnergy ;
575 totalCrossSection += 0.5 * (tMax - deltaCutInEnergy) / (energy*energy);
578 else if (spin > 0.9 )
580 totalCrossSection += -std::log(var) /
581 (3. * deltaCutInEnergy) + (tMax - deltaCutInEnergy) * ( (5. + 1. /var)*0.25 / (
energy*
energy) -
582 beta2 / (tMax * deltaCutInEnergy) ) / 3. ;
584 totalCrossSection *= twopi_mc2_rcl2 * atomicNumber / beta2 ;
590 return totalCrossSection ;
606 G4bool isOutRange =
false;
611 charge = dynamicParticle->
GetCharge()/eplus;
612 chargeSquare = theIonEffChargeModel->
TheValue(dynamicParticle, material);
621 meanFreePath = (((*theMeanFreePathTable)(couple->
GetIndex()))->
622 GetValue(kineticEnergy,isOutRange))/chargeSquare;
625 return meanFreePath ;
649 G4double tScaled = kineticEnergy*massRatio ;
654 highEnergy = protonHighEnergy ;
661 if (theBarkas && tScaled > highEnergy)
663 fBarkas = BarkasTerm(material,tScaled)*std::sqrt(chargeSquare)*chargeSquare
664 + BlochTerm(material,tScaled,chargeSquare);
670 highEnergy = antiprotonHighEnergy ;
675 if (theBarkas && tScaled > highEnergy)
677 fBarkas = -BarkasTerm(material,tScaled)*std::sqrt(chargeSquare)*chargeSquare
678 + BlochTerm(material,tScaled,chargeSquare);
693 fRangeNow /= (chargeSquare*massRatio) ;
694 dx /= (chargeSquare*massRatio) ;
696 stepLimit = fRangeNow ;
703 if (stepLimit > fRangeNow) stepLimit = fRangeNow;
706 if(tScaled > highEnergy )
711 if(stepLimit > fRangeNow - dx*0.9) stepLimit = fRangeNow - dx*0.9 ;
718 if (stepLimit > x) stepLimit = x;
745 G4double tScaled = kineticEnergy * massRatio ;
753 eLoss = kineticEnergy ;
759 eLoss = stepLength * fdEdx ;
762 else if (stepLength >= fRangeNow )
764 eLoss = kineticEnergy ;
773 G4double rScaled = fRangeNow * massRatio * chargeSquare ;
774 G4double sScaled = stepLength * massRatio * chargeSquare ;
791 eLoss += fBarkas * stepLength;
797 eLoss = stepLength *fdEdx ;
799 if (nStopping && tScaled < protonHighEnergy)
801 nLoss = (theNuclearStoppingModel->
TheValue(particle, material)) * stepLength;
805 if (eLoss < 0.0) eLoss = 0.0;
807 finalT = kineticEnergy - eLoss - nLoss;
813 eLoss = ElectronicLossFluctuation(particle, couple, eLoss, stepLength) ;
814 if (eLoss < 0.0) eLoss = 0.0;
815 finalT = kineticEnergy - eLoss - nLoss;
830 eLoss = kineticEnergy-finalT;
847 if(kineticEnergy < protonLowEnergy) {
848 eLoss = (protonModel->
TheValue(proton, material, protonLowEnergy))
849 * std::sqrt(kineticEnergy/protonLowEnergy) ;
853 eLoss = protonModel->
TheValue(proton, material, kineticEnergy) ;
857 eLoss -= DeltaRaysEnergy(couple,kineticEnergy,proton_mass_c2) ;
860 G4cout <<
"p E(MeV)= " << kineticEnergy/MeV
861 <<
" dE/dx(MeV/mm)= " << eLoss*mm/MeV
862 <<
" for " << material->
GetName()
863 <<
" model: " << protonModel <<
G4endl;
866 if(eLoss < 0.0) eLoss = 0.0 ;
882 if(antiprotonModel->
IsInCharge(antiproton,material)) {
883 if(kineticEnergy < antiprotonLowEnergy) {
884 eLoss = antiprotonModel->
TheValue(antiproton,material,antiprotonLowEnergy)
885 * std::sqrt(kineticEnergy/antiprotonLowEnergy) ;
889 eLoss = antiprotonModel->
TheValue(antiproton,material,
895 if(kineticEnergy < protonLowEnergy) {
897 * std::sqrt(kineticEnergy/protonLowEnergy) ;
908 eLoss -= DeltaRaysEnergy(couple,kineticEnergy,proton_mass_c2) ;
911 G4cout <<
"pbar E(MeV)= " << kineticEnergy/MeV
912 <<
" dE/dx(MeV/mm)= " << eLoss*mm/MeV
913 <<
" for " << material->
GetName()
914 <<
" model: " << protonModel <<
G4endl;
917 if(eLoss < 0.0) eLoss = 0.0 ;
935 G4double tau = kineticEnergy / particleMass ;
936 G4double rateMass = electron_mass_c2/particleMass ;
942 G4double beta2 = bg2/(gamma*gamma) ;
943 G4double tMax = 2.*electron_mass_c2*bg2/(1.0+2.0*gamma*rateMass+rateMass*rateMass) ;
946 G4double deltaCut = std::max(deltaCutNow, excitationEnergy);
948 if ( deltaCut < tMax)
951 dLoss = ( beta2 * (x-1.) - std::log(x) ) * twopi_mc2_rcl2 * electronDensity / beta2 ;
975 G4double totalEnergy = kineticEnergy + mass ;
976 G4double pSquare = kineticEnergy *( totalEnergy + mass) ;
977 G4double eSquare = totalEnergy * totalEnergy;
978 G4double betaSquare = pSquare / eSquare;
981 G4double gamma = kineticEnergy / mass + 1.;
982 G4double r = electron_mass_c2 / mass;
983 G4double tMax = 2. * electron_mass_c2 *(gamma*gamma - 1.) / (1. + 2.*gamma*r + r*r);
989 if (deltaCut >= tMax)
1006 gRej = 1.0 - betaSquare * x ;
1008 else if (0.5 == spin)
1010 gRej = (1. - betaSquare * x + 0.5 * x*x * rate) / (1. + 0.5 * rate) ;
1014 gRej = (1. - betaSquare * x ) * (1. + x/(3.*xc)) +
1015 x*x * rate * (1. + 0.5*x/xc) / 3.0 /
1016 (1. + 1./(3.*xc) + rate *(1.+ 0.5/xc) / 3.);
1021 G4double deltaKineticEnergy = x * tMax;
1022 G4double deltaTotalMomentum = std::sqrt(deltaKineticEnergy *
1023 (deltaKineticEnergy + 2. * electron_mass_c2 ));
1024 G4double totalMomentum = std::sqrt(pSquare) ;
1025 G4double cosTheta = deltaKineticEnergy * (totalEnergy + electron_mass_c2) / (deltaTotalMomentum*totalMomentum);
1028 if ( cosTheta < -1. ) cosTheta = -1.;
1029 if ( cosTheta > 1. ) cosTheta = 1.;
1033 G4double sinTheta = std::sqrt(1. - cosTheta*cosTheta);
1034 G4double dirX = sinTheta * std::cos(phi);
1035 G4double dirY = sinTheta * std::sin(phi);
1039 deltaDirection.
rotateUz(particleDirection);
1046 deltaDirection.
z());
1050 G4double finalKineticEnergy = kineticEnergy - deltaKineticEnergy;
1051 std::size_t totalNumber = 1;
1057 std::size_t nSecondaries = 0;
1058 std::vector<G4DynamicParticle*>* secondaryVector = 0;
1065 if (pixeCrossSectionHandler == 0)
1070 pixeCrossSectionHandler =
1119 if (finalKineticEnergy >= bindingEnergy)
1135 if (secondaryVector != 0)
1137 nSecondaries = secondaryVector->size();
1138 for (std::size_t i = 0; i<nSecondaries; i++)
1156 if (e < finalKineticEnergy &&
1161 finalKineticEnergy -= e;
1188 (*secondaryVector)[i] = 0;
1203 G4double finalPx = totalMomentum*particleDirection.
x() - deltaTotalMomentum*deltaDirection.
x();
1204 G4double finalPy = totalMomentum*particleDirection.
y() - deltaTotalMomentum*deltaDirection.
y();
1205 G4double finalPz = totalMomentum*particleDirection.
z() - deltaTotalMomentum*deltaDirection.
z();
1206 G4double finalMomentum = std::sqrt(finalPx*finalPx + finalPy*finalPy + finalPz*finalPz) ;
1207 finalPx /= finalMomentum;
1208 finalPy /= finalMomentum;
1209 finalPz /= finalMomentum;
1215 eDeposit = finalKineticEnergy;
1216 finalKineticEnergy = 0.;
1218 particleDirection.
y(),
1219 particleDirection.
z());
1221 GetAtRestProcessVector()->size())
1244 if (secondaryVector != 0)
1246 for (std::size_t l = 0; l < nSecondaries; l++)
1265 delete secondaryVector;
1287 if (tScaled > protonHighEnergy)
1293 dedx = ProtonParametrisedDEDX(couple,tScaled) ;
1298 if (tScaled > antiprotonHighEnergy)
1304 dedx = AntiProtonParametrisedDEDX(couple,tScaled) ;
1307 dedx *= theIonEffChargeModel->
TheValue(aParticle, material, kineticEnergy) ;
1373 if(0.5*MeV > kinE) kinE = 0.5*MeV ;
1374 G4double gamma = 1.0 + kinE / proton_mass_c2 ;
1375 G4double beta2 = 1.0 - 1.0/(gamma*gamma) ;
1376 if(0.0 >= beta2)
return 0.0;
1384 for (
G4int i = 0; i<numberOfElements; i++) {
1387 ZMaterial = (*theElementVector)[i]->GetZ();
1389 G4double X = 137.0 * 137.0 * beta2 / ZMaterial;
1393 G4double EtaChi = Eta0Chi * ( 1.0 + 6.02*std::pow( ZMaterial,-1.19 ) );
1394 G4double W = ( EtaChi * std::pow( ZMaterial,1.0/6.0 ) ) / std::sqrt(X);
1395 G4double FunctionOfW = FTable[46][1]*FTable[46][0]/
W ;
1397 for(
G4int j=0; j<47; j++) {
1399 if(
W < FTable[j][0] ) {
1402 FunctionOfW = FTable[0][1] ;
1405 FunctionOfW = (FTable[j][1] - FTable[j-1][1]) * (
W - FTable[j-1][0])
1406 / (FTable[j][0] - FTable[j-1][0])
1415 BTerm += FunctionOfW /( std::sqrt(ZMaterial * X) * X);
1436 G4double gamma = 1.0 + kineticEnergy / proton_mass_c2 ;
1437 G4double beta2 = 1.0 - 1.0/(gamma*gamma) ;
1438 G4double y = cSquare / (137.0*137.0*beta2) ;
1444 eLoss = 1.0 / (1.0 + y) ;
1447 for(
G4int i=2; de>eLoss*0.01; i++) {
1448 de = 1.0/( i * (i*i + y)) ;
1452 eLoss *= -1.0 * y * cSquare * twopi_mc2_rcl2 *
1460G4double G4hImpactIonisation::ElectronicLossFluctuation(
1474 static const G4double minLoss = 1.*eV ;
1475 static const G4double kappa = 10. ;
1476 static const G4double theBohrBeta2 = 50.0 * keV/proton_mass_c2 ;
1487 G4double deltaCutInKineticEnergyNow = cutForDelta[imaterial];
1490 if(meanLoss < minLoss)
return meanLoss ;
1493 G4double threshold = std::max(deltaCutInKineticEnergyNow,ipotFluct);
1496 G4double rmass = electron_mass_c2/particleMass;
1500 G4double tMax = 2.*electron_mass_c2*tau2/(1.+2.*tau1*rmass+rmass*rmass);
1503 if(tMax > threshold) tMax = threshold;
1507 if(meanLoss > kappa*tMax || tMax < kappa*ipotFluct )
1509 siga = tMax * (1.0-0.5*beta2) * step * twopi_mc2_rcl2
1510 * electronDensity / beta2 ;
1513 if( beta2 > 3.0*theBohrBeta2*zeff || charge < 0.0) {
1514 siga = std::sqrt( siga * chargeSquare ) ;
1519 G4double chu = theIonChuFluctuationModel->TheValue(particle, material);
1520 G4double yang = theIonYangFluctuationModel->TheValue(particle, material);
1521 siga = std::sqrt( siga * (chargeSquare * chu + yang)) ;
1525 loss = G4RandGauss::shoot(meanLoss,siga);
1526 }
while (loss < 0. || loss > 2.0*meanLoss);
1531 static const G4double probLim = 0.01 ;
1532 static const G4double sumaLim = -std::log(probLim) ;
1539 G4double corrfac, na,alfa,rfac,namean,sa,alfa1,ea,sea;
1551 w1 = tMax/ipotFluct;
1552 w2 = std::log(2.*electron_mass_c2*tau2);
1554 C = meanLoss*(1.-rateFluct)/(w2-ipotLogFluct-beta2);
1556 a1 =
C*f1Fluct*(w2-e1LogFluct-beta2)/e1Fluct;
1557 a2 =
C*f2Fluct*(w2-e2LogFluct-beta2)/e2Fluct;
1558 a3 = rateFluct*meanLoss*(tMax-ipotFluct)/(ipotFluct*tMax*std::log(w1));
1559 if(a1 < 0.0) a1 = 0.0;
1560 if(a2 < 0.0) a2 = 0.0;
1561 if(a3 < 0.0) a3 = 0.0;
1572 if(tMax == ipotFluct)
1578 siga=std::sqrt(a3) ;
1579 p3 = std::max(0,
G4int(G4RandGauss::shoot(a3,siga)+0.5));
1592 tMax = tMax-ipotFluct+e0 ;
1593 a3 = meanLoss*(tMax-e0)/(tMax*e0*std::log(tMax/e0));
1597 siga=std::sqrt(a3) ;
1598 p3 = std::max(0,
int(G4RandGauss::shoot(a3,siga)+0.5));
1605 w = (tMax-e0)/tMax ;
1609 corrfac = dp3/
G4float(nmaxCont2) ;
1610 p3 =
G4int(nmaxCont2) ;
1616 loss *= e0*corrfac ;
1626 siga=std::sqrt(a1) ;
1627 p1 = std::max(0,
G4int(G4RandGauss::shoot(a1,siga)+0.5));
1635 siga=std::sqrt(a2) ;
1636 p2 = std::max(0,
G4int(G4RandGauss::shoot(a2,siga)+0.5));
1641 loss = p1*e1Fluct+p2*e2Fluct;
1654 siga=std::sqrt(a3) ;
1655 p3 = std::max(0,
G4int(G4RandGauss::shoot(a3,siga)+0.5));
1668 rfac = dp3/(
G4float(nmaxCont2)+dp3);
1671 na = G4RandGauss::shoot(namean,sa);
1674 alfa = w1*
G4float(nmaxCont2+p3)/
1676 alfa1 = alfa*std::log(alfa)/(alfa-1.);
1677 ea = na*ipotFluct*alfa1;
1678 sea = ipotFluct*std::sqrt(na*(alfa-alfa1*alfa1));
1679 lossc += G4RandGauss::shoot(ea,sea);
1686 w2 = alfa*ipotFluct;
1702 minGammaEnergy = cut;
1709 minElectronEnergy = cut;
1723 G4String comments =
" Knock-on electron cross sections . ";
1724 comments +=
"\n Good description above the mean excitation energy.\n";
1725 comments +=
" Delta ray energy sampled from differential Xsection.";
1730 <<
" in " <<
TotBin <<
" bins."
1731 <<
"\n Electronic stopping power model is "
1733 <<
"\n from " << protonLowEnergy / keV <<
" keV "
1734 <<
" to " << protonHighEnergy / MeV <<
" MeV " <<
"." <<
G4endl ;
1735 G4cout <<
"\n Parametrisation model for antiprotons is "
1737 <<
"\n from " << antiprotonLowEnergy / keV <<
" keV "
1738 <<
" to " << antiprotonHighEnergy / MeV <<
" MeV " <<
"." <<
G4endl ;
1740 G4cout <<
" Parametrization of the Barkas effect is switched on."
1744 G4cout <<
" Nuclear stopping power model is " << theNuclearTable
1756 for (
G4int j=0 ; j < numOfCouples; ++j) {
1763 if(excitationEnergy > deltaCutNow) {
1767 G4cout <<
" material min.delta energy(keV) " <<
G4endl;
1772 << std::setw(15) << excitationEnergy/keV <<
G4endl;
G4double C(G4double temp)
std::vector< const G4Element * > G4ElementVector
G4double condition(const G4ErrorSymMatrix &m)
G4long G4Poisson(G4double mean)
G4GLOB_DLL std::ostream G4cout
Hep3Vector & rotateUz(const Hep3Vector &)
static G4AntiProton * AntiProton()
void ActivateAugerElectronProduction(G4bool val)
Set threshold energy for Auger electron production.
std::vector< G4DynamicParticle * > * GenerateParticles(G4int Z, G4int shellId)
G4double BindingEnergy() const
G4AtomicShell * Shell(G4int Z, size_t shellIndex) const
static G4AtomicTransitionManager * Instance()
void SetMomentumDirection(const G4ThreeVector &aDirection)
const G4ThreeVector & GetMomentumDirection() const
G4double GetCharge() const
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
void SetKineticEnergy(G4double aEnergy)
static G4Electron * Electron()
static G4double GetRange(const G4ParticleDefinition *aParticle, G4double KineticEnergy, const G4Material *aMaterial)
static void Register(const G4ParticleDefinition *p, const G4PhysicsTable *tDEDX, const G4PhysicsTable *tRange, const G4PhysicsTable *tInverseRange, const G4PhysicsTable *tLabTime, const G4PhysicsTable *tProperTime, G4double lowestKineticEnergy, G4double highestKineticEnergy, G4double massRatio, G4int NumberOfBins)
static G4double GetDEDX(const G4ParticleDefinition *aParticle, G4double KineticEnergy, const G4Material *aMaterial)
static G4double GetPreciseEnergyFromRange(const G4ParticleDefinition *aParticle, G4double range, const G4Material *aMaterial)
G4double GetF2fluct() const
G4double GetLogEnergy1fluct() const
G4double GetLogEnergy2fluct() const
G4double GetMeanExcitationEnergy() const
G4double GetF1fluct() const
G4double GetEnergy2fluct() const
G4double GetEnergy1fluct() const
G4double GetRateionexcfluct() const
G4double GetEnergy0fluct() const
G4double GetLogMeanExcEnergy() const
const G4Material * GetMaterial() const
G4ProductionCuts * GetProductionCuts() const
const G4ElementVector * GetElementVector() const
G4double GetTotNbOfAtomsPerVolume() const
G4IonisParamMat * GetIonisation() const
const G4double * GetAtomicNumDensityVector() const
G4double GetElectronDensity() const
std::size_t GetNumberOfElements() const
const G4String & GetName() const
void AddSecondary(G4Track *aSecondary)
void Initialize(const G4Track &) override
void ProposeEnergy(G4double finalEnergy)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
G4ProcessManager * GetProcessManager() const
const G4String & GetParticleType() const
G4double GetPDGMass() const
G4double GetPDGCharge() const
const G4String & GetParticleName() const
const G4String & GetParticleSubType() const
G4double GetPDGSpin() const
void insert(G4PhysicsVector *)
G4double GetLowEdgeEnergy(const std::size_t index) const
void PutValue(const std::size_t index, const G4double value)
G4int SelectRandomShell(G4int Z, G4double e) const
void LoadShellData(const G4String &dataFile)
G4int SelectRandomAtom(const G4Material *material, G4double e) const
G4ProcessVector * GetProcessList() const
G4ProcessVector * GetAtRestProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
std::size_t GetTableSize() const
const std::vector< G4double > * GetEnergyCutsVector(std::size_t pcIdx) const
static G4ProductionCutsTable * GetProductionCutsTable()
G4double GetProductionCut(G4int index) const
static G4Proton * ProtonDefinition()
static G4Proton * Proton()
G4double GetStepLength() const
G4ParticleDefinition * GetDefinition() const
const G4DynamicParticle * GetDynamicParticle() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
virtual G4double HighEnergyLimit(const G4ParticleDefinition *aParticle, const G4Material *material) const =0
virtual G4bool IsInCharge(const G4DynamicParticle *particle, const G4Material *material) const =0
virtual G4double TheValue(const G4DynamicParticle *particle, const G4Material *material)=0
void ProposeTrackStatus(G4TrackStatus status)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
void SetNumberOfSecondaries(G4int totSecondaries)
G4ParticleChange aParticleChange
const G4String & GetProcessName() const
void BuildPhysicsTable(const G4ParticleDefinition &aParticleType)
G4double ComputeDEDX(const G4ParticleDefinition *aParticle, const G4MaterialCutsCouple *couple, G4double kineticEnergy)
void SetCutForAugerElectrons(G4double cut)
void PrintInfoDefinition() const
G4VParticleChange * AlongStepDoIt(const G4Track &trackData, const G4Step &stepData)
void SetElectronicStoppingPowerModel(const G4ParticleDefinition *aParticle, const G4String &dedxTable)
G4VParticleChange * PostStepDoIt(const G4Track &track, const G4Step &Step)
G4double GetMeanFreePath(const G4Track &track, G4double previousStepSize, enum G4ForceCondition *condition)
void SetCutForSecondaryPhotons(G4double cut)
void ActivateAugerElectronProduction(G4bool val)
G4hImpactIonisation(const G4String &processName="hImpactIoni")
static G4ThreadLocal G4PhysicsTable * theDEDXpTable
static G4ThreadLocal G4PhysicsTable * theInverseRangepTable
static G4ThreadLocal G4double finalRange
G4double MinKineticEnergy
static G4ThreadLocal G4PhysicsTable ** RecorderOfpProcess
static G4ThreadLocal G4double dRoverRange
static G4ThreadLocal G4int TotBin
static G4ThreadLocal G4PhysicsTable * theProperTimepTable
G4PhysicsTable * theLossTable
static G4ThreadLocal G4PhysicsTable * theLabTimepTable
static G4ThreadLocal G4PhysicsTable * theRangepTable
static G4ThreadLocal G4int CounterOfpProcess
static G4ThreadLocal G4double HighestKineticEnergy
static G4ThreadLocal G4int CounterOfpbarProcess
static G4ThreadLocal G4PhysicsTable ** RecorderOfpbarProcess
static G4ThreadLocal G4double LowestKineticEnergy
static G4ThreadLocal G4bool EnlossFlucFlag
G4bool CutsWhereModified()
static void BuildDEDXTable(const G4ParticleDefinition &aParticleType)
G4double energy(const ThreeVector &p, const G4double m)