81 theDEDXTable(aDEDXTable), theRangeTable(aRangeTable),
82 theInverseRangeTable(anInverseRangeTable),
83 theLabTimeTable(aLabTimeTable),
84 theProperTimeTable(aProperTimeTable),
85 theLowestKineticEnergy(aLowestKineticEnergy),
86 theHighestKineticEnergy(aHighestKineticEnergy),
87 theMassRatio(aMassRatio),
88 theNumberOfBins(aNumberOfBins)
122 tLabTime,tProperTime,lowestKineticEnergy,
123 highestKineticEnergy, massRatio,NumberOfBins);
141 helper_map::iterator it;
142 if((it=dict->find(p))==dict->end())
return 0;
143 return (*it).second.theDEDXTable;
152 helper_map::iterator it;
153 if((it=dict->find(p))==dict->end())
return 0;
154 return (*it).second.theRangeTable;
163 helper_map::iterator it;
164 if((it=dict->find(p))==dict->end())
return 0;
165 return (*it).second.theInverseRangeTable;
174 helper_map::iterator it;
175 if((it=dict->find(p))==dict->end())
return 0;
176 return (*it).second.theLabTimeTable;
185 helper_map::iterator it;
186 if((it=dict->find(p))==dict->end())
return 0;
187 return (*it).second.theProperTimeTable;
198 helper_map::iterator it;
199 if ((it=dict->find(p))==dict->end()) {
217 *t= GetTables(aParticle);
226 ParticleHaveNoLoss(aParticle,
"dEdx");
231 G4double scaledKineticEnergy = KineticEnergy*t->theMassRatio;
237 dEdx =(*dEdxTable)(materialIndex)->GetValue(
238 t->theLowestKineticEnergy,isOut)
239 *std::sqrt(scaledKineticEnergy/t->theLowestKineticEnergy);
241 }
else if (scaledKineticEnergy>t->theHighestKineticEnergy) {
243 dEdx = (*dEdxTable)(materialIndex)->GetValue(
244 t->theHighestKineticEnergy,isOut);
248 dEdx = (*dEdxTable)(materialIndex)->GetValue(
249 scaledKineticEnergy,isOut);
253 return dEdx*Chargesquare;
268 *t= GetTables(aParticle);
274 ParticleHaveNoLoss(aParticle,
"LabTime");
278 const G4double parlowen=0.4 , ppar=0.5-parlowen ;
280 G4double scaledKineticEnergy = KineticEnergy*t->theMassRatio;
286 time = std::exp(ppar*std::log(scaledKineticEnergy/t->theLowestKineticEnergy))*
287 (*labtimeTable)(materialIndex)->GetValue(
288 t->theLowestKineticEnergy,isOut);
291 }
else if (scaledKineticEnergy>t->theHighestKineticEnergy) {
293 time = (*labtimeTable)(materialIndex)->GetValue(
294 t->theHighestKineticEnergy,isOut);
298 time = (*labtimeTable)(materialIndex)->GetValue(
299 scaledKineticEnergy,isOut);
303 return time/t->theMassRatio ;
319 *t= GetTables(aParticle);
325 ParticleHaveNoLoss(aParticle,
"LabTime");
329 const G4double parlowen=0.4 , ppar=0.5-parlowen ;
330 const G4double dToverT = 0.05 , facT = 1. -dToverT ;
331 G4double timestart,timeend,deltatime,dTT;
335 G4double scaledKineticEnergy = KineticEnergyStart*t->theMassRatio;
339 timestart = std::exp(ppar*std::log(scaledKineticEnergy/t->theLowestKineticEnergy))*
340 (*labtimeTable)(materialIndex)->GetValue(
341 t->theLowestKineticEnergy,isOut);
344 }
else if (scaledKineticEnergy>t->theHighestKineticEnergy) {
346 timestart = (*labtimeTable)(materialIndex)->GetValue(
347 t->theHighestKineticEnergy,isOut);
351 timestart = (*labtimeTable)(materialIndex)->GetValue(
352 scaledKineticEnergy,isOut);
356 dTT = (KineticEnergyStart - KineticEnergyEnd)/KineticEnergyStart ;
359 scaledKineticEnergy = facT*KineticEnergyStart*t->theMassRatio;
361 scaledKineticEnergy = KineticEnergyEnd*t->theMassRatio;
363 if (scaledKineticEnergy<t->theLowestKineticEnergy) {
365 timeend = std::exp(ppar*std::log(scaledKineticEnergy/t->theLowestKineticEnergy))*
366 (*labtimeTable)(materialIndex)->GetValue(
367 t->theLowestKineticEnergy,isOut);
370 }
else if (scaledKineticEnergy>t->theHighestKineticEnergy) {
372 timeend = (*labtimeTable)(materialIndex)->GetValue(
373 t->theHighestKineticEnergy,isOut);
377 timeend = (*labtimeTable)(materialIndex)->GetValue(
378 scaledKineticEnergy,isOut);
382 deltatime = timestart - timeend ;
385 deltatime *= dTT/dToverT;
387 return deltatime/t->theMassRatio ;
402 *t= GetTables(aParticle);
407 if (!propertimeTable) {
408 ParticleHaveNoLoss(aParticle,
"ProperTime");
412 const G4double parlowen=0.4 , ppar=0.5-parlowen ;
414 G4double scaledKineticEnergy = KineticEnergy*t->theMassRatio;
420 time = std::exp(ppar*std::log(scaledKineticEnergy/t->theLowestKineticEnergy))*
421 (*propertimeTable)(materialIndex)->GetValue(
422 t->theLowestKineticEnergy,isOut);
425 }
else if (scaledKineticEnergy>t->theHighestKineticEnergy) {
427 time = (*propertimeTable)(materialIndex)->GetValue(
428 t->theHighestKineticEnergy,isOut);
432 time = (*propertimeTable)(materialIndex)->GetValue(
433 scaledKineticEnergy,isOut);
437 return time/t->theMassRatio ;
453 *t= GetTables(aParticle);
458 if (!propertimeTable) {
459 ParticleHaveNoLoss(aParticle,
"ProperTime");
463 const G4double parlowen=0.4 , ppar=0.5-parlowen ;
464 const G4double dToverT = 0.05 , facT = 1. -dToverT ;
465 G4double timestart,timeend,deltatime,dTT;
469 G4double scaledKineticEnergy = KineticEnergyStart*t->theMassRatio;
473 timestart = std::exp(ppar*std::log(scaledKineticEnergy/t->theLowestKineticEnergy))*
474 (*propertimeTable)(materialIndex)->GetValue(
475 t->theLowestKineticEnergy,isOut);
478 }
else if (scaledKineticEnergy>t->theHighestKineticEnergy) {
480 timestart = (*propertimeTable)(materialIndex)->GetValue(
481 t->theHighestKineticEnergy,isOut);
485 timestart = (*propertimeTable)(materialIndex)->GetValue(
486 scaledKineticEnergy,isOut);
490 dTT = (KineticEnergyStart - KineticEnergyEnd)/KineticEnergyStart ;
493 scaledKineticEnergy = facT*KineticEnergyStart*t->theMassRatio;
495 scaledKineticEnergy = KineticEnergyEnd*t->theMassRatio;
497 if (scaledKineticEnergy<t->theLowestKineticEnergy) {
499 timeend = std::exp(ppar*std::log(scaledKineticEnergy/t->theLowestKineticEnergy))*
500 (*propertimeTable)(materialIndex)->GetValue(
501 t->theLowestKineticEnergy,isOut);
504 }
else if (scaledKineticEnergy>t->theHighestKineticEnergy) {
506 timeend = (*propertimeTable)(materialIndex)->GetValue(
507 t->theHighestKineticEnergy,isOut);
511 timeend = (*propertimeTable)(materialIndex)->GetValue(
512 scaledKineticEnergy,isOut);
516 deltatime = timestart - timeend ;
519 deltatime *= dTT/dToverT ;
521 return deltatime/t->theMassRatio ;
536 *t= GetTables(aParticle);
546 ParticleHaveNoLoss(aParticle,
"Range");
551 G4double scaledKineticEnergy = KineticEnergy*t->theMassRatio;
557 Range = std::sqrt(scaledKineticEnergy/t->theLowestKineticEnergy)*
558 (*rangeTable)(materialIndex)->GetValue(
559 t->theLowestKineticEnergy,isOut);
561 }
else if (scaledKineticEnergy>t->theHighestKineticEnergy) {
563 Range = (*rangeTable)(materialIndex)->GetValue(
564 t->theHighestKineticEnergy,isOut)+
565 (scaledKineticEnergy-t->theHighestKineticEnergy)/
566 (*dEdxTable)(materialIndex)->GetValue(
567 t->theHighestKineticEnergy,isOut);
571 Range = (*rangeTable)(materialIndex)->GetValue(
572 scaledKineticEnergy,isOut);
576 return Range/(Chargesquare*t->theMassRatio);
592 *t= GetTables(aParticle);
601 if (!inverseRangeTable) {
602 ParticleHaveNoLoss(aParticle,
"InverseRange");
606 G4double scaledrange,scaledKineticEnergy ;
611 if(materialIndex != oldIndex)
613 oldIndex = materialIndex ;
614 rmin = (*inverseRangeTable)(materialIndex)->
615 GetLowEdgeEnergy(0) ;
616 rmax = (*inverseRangeTable)(materialIndex)->
617 GetLowEdgeEnergy(t->theNumberOfBins-2) ;
618 Thigh = (*inverseRangeTable)(materialIndex)->
619 GetValue(rmax,isOut) ;
622 scaledrange = range*Chargesquare*t->theMassRatio ;
624 if(scaledrange < rmin)
626 scaledKineticEnergy = t->theLowestKineticEnergy*
627 scaledrange*scaledrange/(rmin*rmin) ;
631 if(scaledrange < rmax)
633 scaledKineticEnergy = (*inverseRangeTable)(materialIndex)->
634 GetValue( scaledrange,isOut) ;
638 scaledKineticEnergy = Thigh +
640 (*dEdxTable)(materialIndex)->
641 GetValue(Thigh,isOut) ;
645 return scaledKineticEnergy/t->theMassRatio ;
660 *t= GetTables(aParticle);
669 ParticleHaveNoLoss(aParticle,
"dEdx");
674 G4double scaledKineticEnergy = KineticEnergy*t->theMassRatio;
680 dEdx = std::sqrt(scaledKineticEnergy/t->theLowestKineticEnergy)
681 *(*dEdxTable)(materialIndex)->GetValue(
682 t->theLowestKineticEnergy,isOut);
684 }
else if (scaledKineticEnergy>t->theHighestKineticEnergy) {
686 dEdx = (*dEdxTable)(materialIndex)->GetValue(
687 t->theHighestKineticEnergy,isOut);
691 dEdx = (*dEdxTable)(materialIndex)->GetValue(
692 scaledKineticEnergy,isOut) ;
696 return dEdx*Chargesquare;
711 *t= GetTables(aParticle);
721 ParticleHaveNoLoss(aParticle,
"Range");
726 G4double Thighr = t->theHighestKineticEnergy*t->theLowestKineticEnergy/
727 (*rangeTable)(materialIndex)->
728 GetLowEdgeEnergy(1) ;
730 G4double scaledKineticEnergy = KineticEnergy*t->theMassRatio;
736 Range = std::sqrt(scaledKineticEnergy/t->theLowestKineticEnergy)*
737 (*rangeTable)(materialIndex)->GetValue(
738 t->theLowestKineticEnergy,isOut);
740 }
else if (scaledKineticEnergy>Thighr) {
742 Range = (*rangeTable)(materialIndex)->GetValue(
744 (scaledKineticEnergy-Thighr)/
745 (*dEdxTable)(materialIndex)->GetValue(
750 Range = (*rangeTable)(materialIndex)->GetValue(
751 scaledKineticEnergy,isOut) ;
755 return Range/(Chargesquare*t->theMassRatio);
770 *t= GetTables(aParticle);
781 else ParticleHaveNoLoss(aParticle,
"dEdx");
786 G4double scaledKineticEnergy = KineticEnergy*t->theMassRatio;
792 dEdx =(*dEdxTable)(materialIndex)->GetValue(
793 t->theLowestKineticEnergy,isOut)
794 *std::sqrt(scaledKineticEnergy/t->theLowestKineticEnergy);
796 }
else if (scaledKineticEnergy>t->theHighestKineticEnergy) {
798 dEdx = (*dEdxTable)(materialIndex)->GetValue(
799 t->theHighestKineticEnergy,isOut);
803 dEdx = (*dEdxTable)(materialIndex)->GetValue(
804 scaledKineticEnergy,isOut);
808 return dEdx*Chargesquare;
823 *t= GetTables(aParticle);
839 G4double scaledKineticEnergy = KineticEnergy*t->theMassRatio;
845 Range = std::sqrt(scaledKineticEnergy/t->theLowestKineticEnergy)*
846 (*rangeTable)(materialIndex)->GetValue(
847 t->theLowestKineticEnergy,isOut);
849 }
else if (scaledKineticEnergy>t->theHighestKineticEnergy) {
851 Range = (*rangeTable)(materialIndex)->GetValue(
852 t->theHighestKineticEnergy,isOut)+
853 (scaledKineticEnergy-t->theHighestKineticEnergy)/
854 (*dEdxTable)(materialIndex)->GetValue(
855 t->theHighestKineticEnergy,isOut);
859 Range = (*rangeTable)(materialIndex)->GetValue(
860 scaledKineticEnergy,isOut);
864 return Range/(Chargesquare*t->theMassRatio);
880 *t= GetTables(aParticle);
890 if (!inverseRangeTable) {
896 G4double scaledrange,scaledKineticEnergy ;
901 if(materialIndex != oldIndex)
903 oldIndex = materialIndex ;
904 rmin = (*inverseRangeTable)(materialIndex)->
905 GetLowEdgeEnergy(0) ;
906 rmax = (*inverseRangeTable)(materialIndex)->
907 GetLowEdgeEnergy(t->theNumberOfBins-2) ;
908 Thigh = (*inverseRangeTable)(materialIndex)->
909 GetValue(rmax,isOut) ;
912 scaledrange = range*Chargesquare*t->theMassRatio ;
914 if(scaledrange < rmin)
916 scaledKineticEnergy = t->theLowestKineticEnergy*
917 scaledrange*scaledrange/(rmin*rmin) ;
921 if(scaledrange < rmax)
923 scaledKineticEnergy = (*inverseRangeTable)(materialIndex)->
924 GetValue( scaledrange,isOut) ;
928 scaledKineticEnergy = Thigh +
930 (*dEdxTable)(materialIndex)->
931 GetValue(Thigh,isOut) ;
935 return scaledKineticEnergy/t->theMassRatio ;
949 *t= GetTables(aParticle);
961 G4double scaledKineticEnergy = KineticEnergy*t->theMassRatio;
967 dEdx = std::sqrt(scaledKineticEnergy/t->theLowestKineticEnergy)
968 *(*dEdxTable)(materialIndex)->GetValue(
969 t->theLowestKineticEnergy,isOut);
971 }
else if (scaledKineticEnergy>t->theHighestKineticEnergy) {
973 dEdx = (*dEdxTable)(materialIndex)->GetValue(
974 t->theHighestKineticEnergy,isOut);
978 dEdx = (*dEdxTable)(materialIndex)->GetValue(
979 scaledKineticEnergy,isOut) ;
983 return dEdx*Chargesquare;
997 *t= GetTables(aParticle);
1006 if ( !dEdxTable || !rangeTable)
1011 G4double Thighr = t->theHighestKineticEnergy*t->theLowestKineticEnergy/
1012 (*rangeTable)(materialIndex)->
1013 GetLowEdgeEnergy(1) ;
1015 G4double scaledKineticEnergy = KineticEnergy*t->theMassRatio;
1021 Range = std::sqrt(scaledKineticEnergy/t->theLowestKineticEnergy)*
1022 (*rangeTable)(materialIndex)->GetValue(
1023 t->theLowestKineticEnergy,isOut);
1025 }
else if (scaledKineticEnergy>Thighr) {
1027 Range = (*rangeTable)(materialIndex)->GetValue(
1029 (scaledKineticEnergy-Thighr)/
1030 (*dEdxTable)(materialIndex)->GetValue(
1035 Range = (*rangeTable)(materialIndex)->GetValue(
1036 scaledKineticEnergy,isOut) ;
1040 return Range/(Chargesquare*t->theMassRatio);
1047 if (let_counter < let_max_num_warnings) {
1050 G4cout <<
"##### G4EnergyLossTable WARNING: The obsolete interface is used!" <<
G4endl;
1051 G4cout <<
"##### RESULTS ARE NOT GARANTEED!" <<
G4endl;
1052 G4cout <<
"##### Please, substitute G4Material by G4MaterialCutsCouple" <<
G4endl;
1053 G4cout <<
"##### Obsolete interface will be removed soon" <<
G4endl;
1057 }
else if (let_counter == let_max_num_warnings) {
1059 G4cout <<
"##### G4EnergyLossTable WARNING closed" <<
G4endl;
static G4double GetDeltaProperTime(const G4ParticleDefinition *aParticle, G4double KineticEnergyStart, G4double KineticEnergyEnd, const G4Material *aMaterial)
const G4PhysicsTable * theProperTimeTable
static G4EnergyLossTablesHelper * null_loss
static G4LossTableManager * Instance()
G4double GetDEDX(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
static const G4PhysicsTable * GetDEDXTable(const G4ParticleDefinition *p)
const G4PhysicsTable * theDEDXTable
static void ParticleHaveNoLoss(const G4ParticleDefinition *aParticle, const G4String &)
const G4PhysicsTable * theRangeTable
static G4EnergyLossTablesHelper * t
static G4double GetDeltaLabTime(const G4ParticleDefinition *aParticle, G4double KineticEnergyStart, G4double KineticEnergyEnd, const G4Material *aMaterial)
G4EnergyLossTablesHelper()
static G4double QQPositron
G4GLOB_DLL std::ostream G4cout
const G4PhysicsTable * theLabTimeTable
static G4double GetLabTime(const G4ParticleDefinition *aParticle, G4double KineticEnergy, const G4Material *aMaterial)
static G4double GetPreciseRangeFromEnergy(const G4ParticleDefinition *aParticle, G4double KineticEnergy, const G4Material *aMaterial)
static G4EnergyLossTablesHelper GetTables(const G4ParticleDefinition *p)
G4double GetEnergy(const G4ParticleDefinition *aParticle, G4double range, const G4MaterialCutsCouple *couple)
static const G4PhysicsTable * GetLabTimeTable(const G4ParticleDefinition *p)
std::map< K, G4EnergyLossTablesHelper, std::less< K > > helper_map
static const G4PhysicsTable * GetRangeTable(const G4ParticleDefinition *p)
G4double theHighestKineticEnergy
static G4double GetDEDX(const G4ParticleDefinition *aParticle, G4double KineticEnergy, const G4Material *aMaterial)
static G4double GetProperTime(const G4ParticleDefinition *aParticle, G4double KineticEnergy, const G4Material *aMaterial)
const G4PhysicsTable * theInverseRangeTable
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 const G4PhysicsTable * GetInverseRangeTable(const G4ParticleDefinition *p)
static G4ParticleDefinition * lastParticle
static G4double GetPreciseEnergyFromRange(const G4ParticleDefinition *aParticle, G4double range, const G4Material *aMaterial)
static G4double GetPreciseDEDX(const G4ParticleDefinition *aParticle, G4double KineticEnergy, const G4Material *aMaterial)
G4double GetRange(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
static const G4PhysicsTable * GetProperTimeTable(const G4ParticleDefinition *p)
static G4double GetRange(const G4ParticleDefinition *aParticle, G4double KineticEnergy, const G4Material *aMaterial)
G4double GetPDGCharge() const
static G4double Chargesquare
G4double theLowestKineticEnergy
static G4int let_max_num_warnings