134 G4hRDEnergyLoss::taulow,
135 G4hRDEnergyLoss::tauhigh,
136 G4hRDEnergyLoss::ltaulow,
137 G4hRDEnergyLoss::ltauhigh;
164 MaxExcitationNumber (1.e6),
166 nmaxDirectFluct (100),
171 MinKineticEnergy(0.0)
175 if (!RecorderOfProcess) RecorderOfProcess =
new G4PhysicsTable*[100];
193 return NumberOfProcesses;
200 NumberOfProcesses=number;
257 if (!RecorderOfProcess) RecorderOfProcess =
new G4PhysicsTable*[100];
270 if( ((
Charge>0.) && (theDEDXTable==0)) ||
271 ((
Charge<0.) && (theDEDXTable==0))
282 if(CounterOfProcess == NumberOfProcesses)
296 if(CounterOfProcess == NumberOfProcesses)
306 if(CounterOfProcess == NumberOfProcesses)
313 for (
size_t J=0; J<numOfCouples; J++)
327 for (
G4int process=0; process < NumberOfProcesses; process++)
329 pointer= RecorderOfProcess[process];
330 Value += (*pointer)[J]->
331 GetValue(LowEdgeEnergy,isOutRange) ;
337 theDEDXTable->
insert(aVector) ;
347 BuildRangeTable( aParticleType);
350 BuildTimeTables( aParticleType) ;
353 BuildRangeCoeffATable( aParticleType);
354 BuildRangeCoeffBTable( aParticleType);
355 BuildRangeCoeffCTable( aParticleType);
359 BuildInverseRangeTable(aParticleType);
412 for (
size_t J=0; J<numOfCouples; J++)
418 BuildRangeVector(J, aVector);
419 theRangeTable->
insert(aVector);
461 for (
size_t J=0; J<numOfCouples; J++)
469 BuildLabTimeVector(J, aVector);
470 theLabTimeTable->
insert(aVector);
475 BuildProperTimeVector(J, bVector);
476 theProperTimeTable->
insert(bVector);
482 void G4hRDEnergyLoss::BuildRangeVector(
G4int materialIndex,
499 G4double de = (energy2 - energy1) * del ;
502 for (
G4int i=1; i<
n; i++) {
505 range += 0.5*de*(1.0/dedx1 + 1.0/dedx2);
516 void G4hRDEnergyLoss::BuildLabTimeVector(
G4int materialIndex,
523 G4double tlim=5.*
keV,parlowen=0.4,ppar=0.5-parlowen ;
525 G4double losslim,clim,taulim,timelim,
526 LowEdgeEnergy,tau,Value ;
531 losslim = physicsVector->
GetValue(tlim,isOut);
547 Value = clim*std::exp(ppar*std::log(tau/taulim)) ;
552 ltaulow = std::log(taulim);
553 ltauhigh = std::log(tau);
554 Value = timelim+LabTimeIntLog(physicsVector,nbin);
559 }
while (tau<=taulim) ;
566 ltaulow = std::log(tauold);
567 ltauhigh = std::log(tau);
568 Value = oldValue+LabTimeIntLog(physicsVector,nbin);
577 void G4hRDEnergyLoss::BuildProperTimeVector(
G4int materialIndex,
584 G4double tlim=5.*
keV,parlowen=0.4,ppar=0.5-parlowen ;
586 G4double losslim,clim,taulim,timelim,
587 LowEdgeEnergy,tau,Value ;
592 losslim = physicsVector->
GetValue(tlim,isOut);
608 Value = clim*std::exp(ppar*std::log(tau/taulim)) ;
613 ltaulow = std::log(taulim);
614 ltauhigh = std::log(tau);
615 Value = timelim+ProperTimeIntLog(physicsVector,nbin);
620 }
while (tau<=taulim) ;
627 ltaulow = std::log(tauold);
628 ltauhigh = std::log(tau);
629 Value = oldValue+ProperTimeIntLog(physicsVector,nbin);
643 G4double dtau,Value,taui,ti,lossi,ci;
645 dtau = (tauhigh-taulow)/nbin;
648 for (
G4int i=0; i<=nbin; i++)
650 taui = taulow + dtau*i ;
652 lossi = physicsVector->
GetValue(ti,isOut);
675 G4double ltt,dltau,Value,ui,taui,ti,lossi,ci;
677 ltt = ltauhigh-ltaulow;
681 for (
G4int i=0; i<=nbin; i++)
683 ui = ltaulow+dltau*i;
686 lossi = physicsVector->
GetValue(ti,isOut);
696 Value += ci*taui/lossi;
709 G4double ltt,dltau,Value,ui,taui,ti,lossi,ci;
711 ltt = ltauhigh-ltaulow;
715 for (
G4int i=0; i<=nbin; i++)
717 ui = ltaulow+dltau*i;
720 lossi = physicsVector->
GetValue(ti,isOut);
743 G4double ltt,dltau,Value,ui,taui,ti,lossi,ci;
745 ltt = ltauhigh-ltaulow;
749 for (
G4int i=0; i<=nbin; i++)
751 ui = ltaulow+dltau*i;
754 lossi = physicsVector->
GetValue(ti,isOut);
781 if(thepRangeCoeffATable)
783 delete thepRangeCoeffATable; }
785 theRangeCoeffATable = thepRangeCoeffATable ;
790 if(thepbarRangeCoeffATable)
792 delete thepbarRangeCoeffATable; }
794 theRangeCoeffATable = thepbarRangeCoeffATable ;
802 G4double Ti , Tim , Tip , Ri , Rim , Rip , Value ;
806 for (
G4int J=0; J<numOfCouples; J++)
817 Ri = rangeVector->
GetValue(Ti,isOut) ;
834 Rim = rangeVector->
GetValue(Tim,isOut);
841 Rip = rangeVector->
GetValue(Tip,isOut);
843 Value = (w1*Rip + w2*Ri + w3*Rim)/(Ti*Ti) ;
849 theRangeCoeffATable->
insert(aVector);
865 if(thepRangeCoeffBTable)
867 delete thepRangeCoeffBTable; }
869 theRangeCoeffBTable = thepRangeCoeffBTable ;
874 if(thepbarRangeCoeffBTable)
876 delete thepbarRangeCoeffBTable; }
878 theRangeCoeffBTable = thepbarRangeCoeffBTable ;
884 G4double w = R1*(RTable-1.)*(RTable-1.);
886 G4double w1 = -R1/w , w2 = R1*(R2+1.)/w , w3 = -R2*R1/w ;
887 G4double Ti , Tim , Tip , Ri , Rim , Rip , Value ;
891 for (
G4int J=0; J<numOfCouples; J++)
902 Ri = rangeVector->
GetValue(Ti,isOut) ;
910 Rim = rangeVector->
GetValue(Tim,isOut);
917 Rip = rangeVector->
GetValue(Tip,isOut);
920 Value = (w1*Rip + w2*Ri + w3*Rim)/Ti;
925 theRangeCoeffBTable->
insert(aVector);
941 if(thepRangeCoeffCTable)
943 delete thepRangeCoeffCTable; }
945 theRangeCoeffCTable = thepRangeCoeffCTable ;
950 if(thepbarRangeCoeffCTable)
952 delete thepbarRangeCoeffCTable; }
954 theRangeCoeffCTable = thepbarRangeCoeffCTable ;
960 G4double w = R1*(RTable-1.)*(RTable-1.);
961 G4double w1 = 1./w , w2 = -RTable*R1/w , w3 = RTable*R2/w ;
962 G4double Ti , Tim , Tip , Ri , Rim , Rip , Value ;
966 for (
G4int J=0; J<numOfCouples; J++)
976 Ri = rangeVector->
GetValue(Ti,isOut) ;
982 Rim = rangeVector->
GetValue(Tim,isOut);
989 Rip = rangeVector->
GetValue(Tip,isOut);
991 Value = w1*Rip + w2*Ri + w3*Rim ;
996 theRangeCoeffCTable->
insert(aVector);
1002 void G4hRDEnergyLoss::
1022 theRangeCoeffATable = thepRangeCoeffATable ;
1023 theRangeCoeffBTable = thepRangeCoeffBTable ;
1024 theRangeCoeffCTable = thepRangeCoeffCTable ;
1036 theRangeCoeffATable = thepbarRangeCoeffATable ;
1037 theRangeCoeffBTable = thepbarRangeCoeffBTable ;
1038 theRangeCoeffCTable = thepbarRangeCoeffCTable ;
1042 for (
size_t i=0; i<numOfCouples; i++)
1052 if (rlow <
DBL_MIN) rlow = 1.e-8;
1053 if (rhigh > 1.e16) rhigh = 1.e16;
1054 if (rhigh < 1.e-8) rhigh =1.e-8;
1061 if (tmpTrick <= 0. || tmpTrick <
DBL_MIN) tmpTrick = 1.e-8;
1062 if (tmpTrick > 1.e16) tmpTrick = 1.e16;
1064 rhigh *= std::exp(std::log(tmpTrick)/((
G4double)(nbins-1)));
1076 for (
size_t j=1; j<nbins; j++) {
1080 for (ihigh=ilow+1; ihigh<nbins; ihigh++) {
1083 if(range2 >= range || ihigh == nbins-1) {
1091 G4double e = std::log(energy1) + std::log(energy2/energy1)*std::log(range/range1)/std::log(range2/range1);
1095 theInverseRangeTable->
insert(v);
1102 void G4hRDEnergyLoss::InvertRangeVector(
G4int materialIndex,
1110 G4int binnumber = -1 ;
1119 if( rangebin < LowEdgeRange )
1125 rangebin = (*theRangeTable)(materialIndex)->GetValue(Tbin,isOut) ;
1127 while ((rangebin < LowEdgeRange) && (binnumber < TotBin )) ;
1132 else if(binnumber == TotBin-1)
1136 A = (*(*theRangeCoeffATable)(materialIndex))(binnumber-1) ;
1137 B = (*(*theRangeCoeffBTable)(materialIndex))(binnumber-1) ;
1138 C = (*(*theRangeCoeffCTable)(materialIndex))(binnumber-1) ;
1140 KineticEnergy = (LowEdgeRange -
C )/B ;
1143 discr = B*B - 4.*A*(C-LowEdgeRange);
1144 discr = discr>0. ? std::sqrt(discr) : 0.;
1145 KineticEnergy = 0.5*(discr-
B)/A ;
1149 aVector->
PutValue(i,KineticEnergy) ;
1157 G4bool wasModified =
false;
1162 for (
size_t j=0; j<numOfCouples; j++){
static G4ThreadLocal G4double RTable
static c2_factory< G4double > c2
static G4ThreadLocal G4PhysicsTable * theProperTimepTable
static G4ThreadLocal G4double LowestKineticEnergy
static G4ThreadLocal G4PhysicsTable * theRangepbarTable
static G4ThreadLocal G4PhysicsTable * theLabTimepTable
static G4ThreadLocal G4PhysicsTable * theDEDXpbarTable
G4double GetValue(G4double theEnergy, G4bool &isOutRange) const
static void MinusNumberOfProcesses()
static G4int GetNumberOfProcesses()
void insert(G4PhysicsVector *)
static G4ThreadLocal G4bool rndmStepFlag
static G4ThreadLocal G4double c3lim
static G4ThreadLocal G4double LOGRTable
static G4ThreadLocal G4double ParticleMass
static G4ThreadLocal G4double Charge
G4bool IsRecalcNeeded() const
static G4ThreadLocal G4double c1lim
static G4ThreadLocal G4PhysicsTable ** RecorderOfpbarProcess
static G4ThreadLocal G4PhysicsTable * theProperTimepbarTable
double B(double temperature)
size_t GetVectorLength() const
static G4ThreadLocal G4double finalRange
G4double GetLowEdgeEnergy(size_t binNumber) const
static G4ThreadLocal G4PhysicsTable * theInverseRangepbarTable
static G4ThreadLocal G4int TotBin
static G4ThreadLocal G4PhysicsTable ** RecorderOfpProcess
double A(double temperature)
const XML_Char int const XML_Char * value
size_t GetTableSize() const
const G4ParticleDefinition const G4Material *G4double range
static G4ThreadLocal G4PhysicsTable * theRangepTable
static G4AntiProton * AntiProton()
static constexpr double eplus
void PutValue(size_t index, G4double theValue)
static G4Proton * Proton()
static G4ThreadLocal G4double dRoverRange
static G4ThreadLocal G4int CounterOfpProcess
static void BuildDEDXTable(const G4ParticleDefinition &aParticleType)
static G4ThreadLocal G4double HighestKineticEnergy
static G4ProductionCutsTable * GetProductionCutsTable()
static G4ThreadLocal G4int CounterOfpbarProcess
G4double GetPDGMass() const
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
static void SetNumberOfProcesses(G4int number)
static void PlusNumberOfProcesses()
static G4ThreadLocal G4double pbartableElectronCutInRange
G4double energy(const ThreeVector &p, const G4double m)
G4bool CutsWhereModified()
static G4ThreadLocal G4bool EnlossFlucFlag
G4hRDEnergyLoss(const G4String &)
static G4ThreadLocal G4double c2lim
static void SetRndmStep(G4bool value)
static void SetdRoverRange(G4double value)
G4PhysicsTable * theLossTable
static G4ThreadLocal G4PhysicsTable * theLabTimepbarTable
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)
G4double GetPDGCharge() const
static G4ThreadLocal G4PhysicsTable * theInverseRangepTable
static constexpr double keV
static void SetEnlossFluc(G4bool value)
static void SetStepFunction(G4double c1, G4double c2)
static G4ThreadLocal G4double ptableElectronCutInRange
static G4ThreadLocal G4PhysicsTable * theDEDXpTable