70 #include "G4EnergyLossMessenger.hh"
114 G4double G4eLowEnergyLoss::LowerBoundEloss = 10.*
eV ;
115 G4double G4eLowEnergyLoss::UpperBoundEloss = 100.*
GeV ;
116 G4int G4eLowEnergyLoss::NbinEloss = 360 ;
118 G4double G4eLowEnergyLoss::LOGRTable ;
121 G4EnergyLossMessenger* G4eLowEnergyLoss::eLossMessenger = 0;
130 MinKineticEnergy(1.*
eV),
135 RecorderOfProcess(0),
143 if(!eLossMessenger) eLossMessenger =
new G4EnergyLossMessenger();
194 return LowerBoundEloss;
199 return UpperBoundEloss;
216 G4double lrate = std::log(UpperBoundEloss/LowerBoundEloss);
217 LOGRTable=lrate/NbinEloss;
218 RTable =std::exp(LOGRTable);
268 for (
size_t J=0; J<numOfCouples; J++)
273 LowerBoundEloss, UpperBoundEloss, NbinEloss);
276 for (
G4int i=0; i<NbinEloss; i++)
284 pointer= RecorderOfProcess[process];
285 Value += (*pointer)[J]->GetValue(LowEdgeEnergy,isOutRange);
291 theDEDXTable->
insert(aVector) ;
307 LowerBoundEloss,UpperBoundEloss,NbinEloss);
312 LowerBoundEloss,UpperBoundEloss,NbinEloss);
315 LowerBoundEloss,UpperBoundEloss,NbinEloss);
319 theeRangeCoeffATable,
320 LowerBoundEloss,UpperBoundEloss,NbinEloss);
323 theeRangeCoeffBTable,
324 LowerBoundEloss,UpperBoundEloss,NbinEloss);
327 theeRangeCoeffCTable,
328 LowerBoundEloss,UpperBoundEloss,NbinEloss);
332 theeRangeCoeffATable,
333 theeRangeCoeffBTable,
334 theeRangeCoeffCTable,
336 LowerBoundEloss,UpperBoundEloss,NbinEloss);
343 LowerBoundEloss,UpperBoundEloss,NbinEloss);
349 LowerBoundEloss,UpperBoundEloss,NbinEloss);
352 LowerBoundEloss,UpperBoundEloss,NbinEloss);
356 thepRangeCoeffATable,
357 LowerBoundEloss,UpperBoundEloss,NbinEloss);
360 thepRangeCoeffBTable,
361 LowerBoundEloss,UpperBoundEloss,NbinEloss);
364 thepRangeCoeffCTable,
365 LowerBoundEloss,UpperBoundEloss,NbinEloss);
369 thepRangeCoeffATable,
370 thepRangeCoeffBTable,
371 thepRangeCoeffCTable,
373 LowerBoundEloss,UpperBoundEloss,NbinEloss);
393 LowerBoundEloss, UpperBoundEloss, 1.,NbinEloss);
404 static const G4double faclow = 1.5 ;
421 else if ( E< faclow*LowerBoundEloss)
423 if (Step >= fRangeNow) finalT = 0.;
425 else finalT = E*(1.-std::sqrt(Step/fRangeNow)) ;
428 else if (E>=UpperBoundEloss) finalT = E - Step*fdEdx;
430 else if (Step >= fRangeNow) finalT = 0.;
434 if(Step/fRangeNow < linLossLimit) finalT = E-Step*fdEdx ;
446 MeanLoss = E-finalT ;
449 if ((
EnlossFlucFlag) && (finalT > 0.) && (finalT < E)&&(E > LowerBoundEloss))
452 if (finalT < 0.) finalT = 0.;
468 std::vector<G4DynamicParticle*>* deexcitationProducts = 0;
469 if (theFluo) deexcitationProducts =
DeexciteAtom(couple,E,edep);
471 size_t nSecondaries = 0;
472 if (deexcitationProducts != 0) nSecondaries = deexcitationProducts->size();
475 if (nSecondaries > 0) {
488 for (
size_t i=0; i<nSecondaries; i++) {
512 delete deexcitationProducts;
static void SetLowerBoundEloss(G4double val)
void insert(G4PhysicsVector *)
static G4PhysicsTable * theInverseRangePositronTable
G4double GetKineticEnergy() const
static G4PhysicsTable * theProperTimePositronTable
G4double GetStepLength() const
const G4DynamicParticle * GetDynamicParticle() const
static G4int CounterOfElectronProcess
static G4int NbOfProcesses
static G4int GetNbOfProcesses()
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
static G4PhysicsTable * theRangeElectronTable
static G4double GetLowerBoundEloss()
static G4double ParticleMass
G4double GetLowEdgeEnergy(size_t binNumber) const
static void SetUpperBoundEloss(G4double val)
G4VParticleChange * AlongStepDoIt(const G4Track &track, const G4Step &Step)
static G4PhysicsTable * BuildRangeTable(G4PhysicsTable *theDEDXTable, G4PhysicsTable *theRangeTable, G4double Tmin, G4double Tmax, G4int nbin)
static G4PhysicsTable * BuildProperTimeTable(G4PhysicsTable *theDEDXTable, G4PhysicsTable *ProperTimeTable, G4double Tmin, G4double Tmax, G4int nbin)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
static G4PhysicsTable * BuildLabTimeTable(G4PhysicsTable *theDEDXTable, G4PhysicsTable *theLabTimeTable, G4double Tmin, G4double Tmax, G4int nbin)
G4StepPoint * GetPreStepPoint() const
static G4PhysicsTable * theLabTimePositronTable
G4GLOB_DLL std::ostream G4cout
size_t GetTableSize() const
const G4ThreeVector & GetPosition() const
static G4PhysicsTable * theDEDXElectronTable
static G4PhysicsTable * BuildRangeCoeffBTable(G4PhysicsTable *theRangeTable, G4PhysicsTable *theCoeffBTable, G4double Tmin, G4double Tmax, G4int nbin)
static constexpr double eplus
static G4bool EnlossFlucFlag
void PutValue(size_t index, G4double theValue)
void BuildDEDXTable(const G4ParticleDefinition &aParticleType)
static constexpr double eV
G4eLowEnergyLoss(const G4String &)
static G4PhysicsTable * theRangePositronTable
static void MinusNbOfProcesses()
static void SetNbinEloss(G4int nb)
static G4PhysicsTable ** RecorderOfPositronProcess
virtual void Initialize(const G4Track &)
static G4PhysicsTable * theInverseRangeElectronTable
G4double MinKineticEnergy
static G4ProductionCutsTable * GetProductionCutsTable()
static G4double GetUpperBoundEloss()
static G4Positron * Positron()
static G4PhysicsTable ** RecorderOfElectronProcess
G4double GetPDGMass() const
static G4PhysicsTable * theLabTimeElectronTable
static G4PhysicsTable * BuildInverseRangeTable(G4PhysicsTable *theRangeTable, G4PhysicsTable *theRangeCoeffATable, G4PhysicsTable *theRangeCoeffBTable, G4PhysicsTable *theRangeCoeffCTable, G4PhysicsTable *theInverseRangeTable, G4double Tmin, G4double Tmax, G4int nbin)
void SetNumberOfSecondaries(G4int totSecondaries)
static G4int GetNbinEloss()
static G4PhysicsTable * theProperTimeElectronTable
G4StepPoint * GetPostStepPoint() const
void ProposeEnergy(G4double finalEnergy)
G4ParticleChange aParticleChange
static constexpr double GeV
void AddSecondary(G4Track *aSecondary)
static G4Electron * Electron()
static void PlusNbOfProcesses()
G4double GetGlobalTime() const
G4PhysicsTable * theLossTable
static G4int CounterOfPositronProcess
static void SetNbOfProcesses(G4int nb)
void ProposeTrackStatus(G4TrackStatus status)
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 G4PhysicsTable * theDEDXPositronTable
virtual std::vector< G4DynamicParticle * > * DeexciteAtom(const G4MaterialCutsCouple *, G4double, G4double)
G4double GetLossWithFluct(const G4DynamicParticle *aParticle, const G4MaterialCutsCouple *couple, G4double MeanLoss, G4double step)
G4double GetPDGCharge() const
static G4double GetPreciseEnergyFromRange(const G4ParticleDefinition *aParticle, G4double range, const G4Material *aMaterial)
static G4PhysicsTable * BuildRangeCoeffATable(G4PhysicsTable *theRangeTable, G4PhysicsTable *theCoeffATable, G4double Tmin, G4double Tmax, G4int nbin)
static G4PhysicsTable * BuildRangeCoeffCTable(G4PhysicsTable *theRangeTable, G4PhysicsTable *theCoeffCTable, G4double Tmin, G4double Tmax, G4int nbin)