00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef included_G4EnergyLossTables
00034 #define included_G4EnergyLossTables
00035
00036 #include <map>
00037 #include "globals.hh"
00038
00039 #include "G4PhysicsTable.hh"
00040 #include "G4ParticleDefinition.hh"
00041 #include "G4Material.hh"
00042 #include "G4ios.hh"
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 class G4EnergyLossTablesHelper {
00072
00073 friend class G4EnergyLossTables;
00074
00075
00076 public:
00077 G4EnergyLossTablesHelper();
00078
00079 private:
00080 G4EnergyLossTablesHelper(const G4PhysicsTable* aDEDXTable,
00081 const G4PhysicsTable* aRangeTable,
00082 const G4PhysicsTable* anInverseRangeTable,
00083 const G4PhysicsTable* aLabTimeTable,
00084 const G4PhysicsTable* aProperTimeTable,
00085 G4double aLowestKineticEnergy,
00086 G4double aHighestKineticEnergy,
00087 G4double aMassRatio,
00088 G4int aNumberOfBins);
00089
00090 const G4PhysicsTable* theDEDXTable;
00091 const G4PhysicsTable* theRangeTable;
00092 const G4PhysicsTable* theInverseRangeTable;
00093 const G4PhysicsTable* theLabTimeTable;
00094 const G4PhysicsTable* theProperTimeTable;
00095 G4double theLowestKineticEnergy;
00096 G4double theHighestKineticEnergy;
00097 G4double theMassRatio;
00098 G4int theNumberOfBins;
00099 };
00100
00101
00102
00103 class G4MaterialCutsCouple;
00104
00105 class G4EnergyLossTables {
00106
00107 public:
00108
00109
00110
00111 static const G4PhysicsTable* GetDEDXTable(
00112 const G4ParticleDefinition* p);
00113 static const G4PhysicsTable* GetRangeTable(
00114 const G4ParticleDefinition* p);
00115 static const G4PhysicsTable* GetInverseRangeTable(
00116 const G4ParticleDefinition* p);
00117 static const G4PhysicsTable* GetLabTimeTable(
00118 const G4ParticleDefinition* p);
00119 static const G4PhysicsTable* GetProperTimeTable(
00120 const G4ParticleDefinition* p);
00121
00122
00123 static G4double GetDEDX(
00124 const G4ParticleDefinition *aParticle,
00125 G4double KineticEnergy,
00126 const G4Material *aMaterial);
00127 static G4double GetRange(
00128 const G4ParticleDefinition *aParticle,
00129 G4double KineticEnergy,
00130 const G4Material *aMaterial);
00131 static G4double GetLabTime(
00132 const G4ParticleDefinition *aParticle,
00133 G4double KineticEnergy,
00134 const G4Material *aMaterial);
00135 static G4double GetDeltaLabTime(
00136 const G4ParticleDefinition *aParticle,
00137 G4double KineticEnergyStart,
00138 G4double KineticEnergyEnd,
00139 const G4Material *aMaterial);
00140 static G4double GetProperTime(
00141 const G4ParticleDefinition *aParticle,
00142 G4double KineticEnergy,
00143 const G4Material *aMaterial);
00144 static G4double GetDeltaProperTime(
00145 const G4ParticleDefinition *aParticle,
00146 G4double KineticEnergyStart,
00147 G4double KineticEnergyEnd,
00148 const G4Material *aMaterial);
00149
00150 static G4double GetPreciseDEDX(
00151 const G4ParticleDefinition *aParticle,
00152 G4double KineticEnergy,
00153 const G4Material *aMaterial);
00154 static G4double GetPreciseRangeFromEnergy(
00155 const G4ParticleDefinition *aParticle,
00156 G4double KineticEnergy,
00157 const G4Material *aMaterial);
00158 static G4double GetPreciseEnergyFromRange(
00159 const G4ParticleDefinition *aParticle,
00160 G4double range,
00161 const G4Material *aMaterial);
00162
00163
00164 static G4double GetDEDX(
00165 const G4ParticleDefinition *aParticle,
00166 G4double KineticEnergy,
00167 const G4MaterialCutsCouple *couple,
00168 G4bool check = true);
00169 static G4double GetRange(
00170 const G4ParticleDefinition *aParticle,
00171 G4double KineticEnergy,
00172 const G4MaterialCutsCouple *couple,
00173 G4bool check = true);
00174
00175 static G4double GetPreciseDEDX(
00176 const G4ParticleDefinition *aParticle,
00177 G4double KineticEnergy,
00178 const G4MaterialCutsCouple *couple);
00179 static G4double GetPreciseRangeFromEnergy(
00180 const G4ParticleDefinition *aParticle,
00181 G4double KineticEnergy,
00182 const G4MaterialCutsCouple *couple);
00183 static G4double GetPreciseEnergyFromRange(
00184 const G4ParticleDefinition *aParticle,
00185 G4double range,
00186 const G4MaterialCutsCouple *couple,
00187 G4bool check = true);
00188
00189
00190 static void Register(
00191 const G4ParticleDefinition* p,
00192 const G4PhysicsTable* tDEDX,
00193 const G4PhysicsTable* tRange,
00194 const G4PhysicsTable* tInverseRange,
00195 const G4PhysicsTable* tLabTime,
00196 const G4PhysicsTable* tProperTime,
00197 G4double lowestKineticEnergy,
00198 G4double highestKineticEnergy,
00199 G4double massRatio,
00200 G4int NumberOfBins);
00201
00202 public:
00203 typedef const G4ParticleDefinition* K;
00204
00205 private:
00206
00207 static void CPRWarning();
00208 static void ParticleHaveNoLoss(const G4ParticleDefinition* aParticle, const G4String&);
00209
00210 typedef std::map<K,G4EnergyLossTablesHelper,std::less<K> > helper_map;
00211 static helper_map dict;
00212
00213 static G4EnergyLossTablesHelper GetTables(const G4ParticleDefinition* p);
00214
00215 static G4EnergyLossTablesHelper t ;
00216 static G4EnergyLossTablesHelper null_loss ;
00217 static const G4ParticleDefinition* lastParticle ;
00218 static G4double QQPositron ;
00219 static G4double Chargesquare ;
00220 static G4int oldIndex ;
00221 static G4double rmin,rmax,Thigh ;
00222 static G4int let_counter;
00223 static G4int let_max_num_warnings;
00224 static G4bool first_loss;
00225
00226 };
00227
00228
00229
00230 #endif