Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 // 27 // 28 // ------------------------------------------- 28 // ------------------------------------------------------------ 29 // GEANT 4 class header file 29 // GEANT 4 class header file 30 // 30 // 31 // History: first implementation, based o 31 // History: first implementation, based on object model of 32 // 2nd December 1995, G.Cosmo 32 // 2nd December 1995, G.Cosmo 33 // ---------- G4hEnergyLoss physics proce 33 // ---------- G4hEnergyLoss physics process ----------- 34 // by Laszlo Urban, 30 May 1997 34 // by Laszlo Urban, 30 May 1997 35 // 35 // 36 // ******************************************* 36 // ************************************************************ 37 // It is the first implementation of the NEW U 37 // It is the first implementation of the NEW UNIFIED ENERGY LOSS PROCESS. 38 // It calculates the continuous energy loss fo 38 // It calculates the continuous energy loss for charged hadrons. 39 // Processes giving contribution to the contin 39 // Processes giving contribution to the continuous loss : 40 // ionisation (= cont.ion.loss + delta ray p 40 // ionisation (= cont.ion.loss + delta ray production) 41 // can be added more easily .......... 41 // can be added more easily .......... 42 // This class creates static proton/antiproton 42 // This class creates static proton/antiproton dE/dx and range tables , 43 // which tables can be used by other processes 43 // which tables can be used by other processes. 44 // The energy loss for other charged hadrons i 44 // The energy loss for other charged hadrons is calculated from the p/pbar 45 // tables with scaled kinetic energy. 45 // tables with scaled kinetic energy. 46 // 46 // 47 // 7/10/98 L.Urban some bugs fixed + some cle 47 // 7/10/98 L.Urban some bugs fixed + some cleanup 48 // 22/10/98 L.Urban cleanup 48 // 22/10/98 L.Urban cleanup 49 // 02/02/99 L.Urban several bugs fixed 49 // 02/02/99 L.Urban several bugs fixed 50 // 31/03/00 V.Ivanchenko rename to lowenergy a 50 // 31/03/00 V.Ivanchenko rename to lowenergy as G4hLowEnergyLoss.hh 51 // 09/08/00 V.Ivanchenko remove GetContinuousS 51 // 09/08/00 V.Ivanchenko remove GetContinuousStepLimit and IsApplicable 52 // 23/11/01 V.Ivanchenko Move static member-fu 52 // 23/11/01 V.Ivanchenko Move static member-functions from header to source 53 // 22/01/03 V.Ivanchenko Cuts per region 53 // 22/01/03 V.Ivanchenko Cuts per region 54 // 18/04/03 V.Ivanchenko Make dRoverRange prot 54 // 18/04/03 V.Ivanchenko Make dRoverRange protected 55 // 55 // 56 // 31 Jul 2008 MGP Short term supply of en 56 // 31 Jul 2008 MGP Short term supply of energy loss of hadrons through clone of 57 // former G4hLowEnergyLoss 57 // former G4hLowEnergyLoss (with some initial cleaning) 58 // To be replaced by rewor 58 // To be replaced by reworked class to deal with condensed/discrete 59 // issues properly 59 // issues properly 60 // 60 // 61 // ------------------------------------------- 61 // -------------------------------------------------------------- 62 62 63 // Class description: 63 // Class description: 64 // Short term supply of energy loss of hadrons 64 // Short term supply of energy loss of hadrons through clone of former G4hLowEnergyLoss 65 // (with some initial cleaning) 65 // (with some initial cleaning) 66 // To be replaced by reworked class to deal wi 66 // To be replaced by reworked class to deal with condensed/discrete issues properly 67 67 68 // ------------------------------------------- 68 // -------------------------------------------------------------- 69 69 70 70 71 #ifndef G4HRDENERGYLOSS_HH 71 #ifndef G4HRDENERGYLOSS_HH 72 #define G4HRDENERGYLOSS_HH 1 72 #define G4HRDENERGYLOSS_HH 1 73 73 74 #include "G4ios.hh" 74 #include "G4ios.hh" 75 #include "globals.hh" 75 #include "globals.hh" 76 #include "Randomize.hh" 76 #include "Randomize.hh" 77 #include "G4VContinuousDiscreteProcess.hh" 77 #include "G4VContinuousDiscreteProcess.hh" 78 #include "G4Material.hh" 78 #include "G4Material.hh" 79 #include "G4Element.hh" 79 #include "G4Element.hh" 80 #include "G4Proton.hh" 80 #include "G4Proton.hh" 81 #include "G4AntiProton.hh" 81 #include "G4AntiProton.hh" 82 #include "G4Electron.hh" 82 #include "G4Electron.hh" 83 #include "G4VParticleChange.hh" 83 #include "G4VParticleChange.hh" 84 #include "G4Track.hh" 84 #include "G4Track.hh" 85 #include "G4Step.hh" 85 #include "G4Step.hh" 86 #include "G4PhysicsLogVector.hh" 86 #include "G4PhysicsLogVector.hh" 87 #include "G4PhysicsLinearVector.hh" 87 #include "G4PhysicsLinearVector.hh" 88 88 89 class G4EnergyLossMessenger; 89 class G4EnergyLossMessenger; 90 90 91 class G4hRDEnergyLoss : public G4VContinuousDi 91 class G4hRDEnergyLoss : public G4VContinuousDiscreteProcess 92 92 93 { 93 { 94 public: 94 public: 95 95 96 G4hRDEnergyLoss(const G4String& ); 96 G4hRDEnergyLoss(const G4String& ); 97 97 98 ~G4hRDEnergyLoss(); 98 ~G4hRDEnergyLoss(); 99 99 100 virtual G4double GetMeanFreePath( 100 virtual G4double GetMeanFreePath( 101 const G4Track& track, 101 const G4Track& track, 102 G4double previousStepSize, 102 G4double previousStepSize, 103 enum G4ForceCondition* condition 103 enum G4ForceCondition* condition 104 ) = 0 ; 104 ) = 0 ; 105 105 106 virtual G4VParticleChange* PostStepDoIt(cons 106 virtual G4VParticleChange* PostStepDoIt(const G4Track& track, 107 const G4Step& Step) = 0 ; 107 const G4Step& Step) = 0 ; 108 108 109 // ---- MGP ---- All this static stuff is ex 109 // ---- MGP ---- All this static stuff is expected to disappear in a future 110 // development cycle 110 // development cycle 111 111 112 // get the number of processes contributing 112 // get the number of processes contributing to the cont.energy loss 113 static G4int GetNumberOfProcesses(); 113 static G4int GetNumberOfProcesses(); 114 114 115 // set the number of processes contributing 115 // set the number of processes contributing to the cont.energy loss 116 static void SetNumberOfProcesses(G4int numbe 116 static void SetNumberOfProcesses(G4int number); 117 117 118 // Increment the number of processes contri 118 // Increment the number of processes contributing to the cont.energy loss 119 static void PlusNumberOfProcesses(); 119 static void PlusNumberOfProcesses(); 120 120 121 // decrement the number of processes contri 121 // decrement the number of processes contributing to the cont.energy loss 122 static void MinusNumberOfProcesses(); 122 static void MinusNumberOfProcesses(); 123 123 124 static void SetdRoverRange(G4double value); 124 static void SetdRoverRange(G4double value); 125 static void SetRndmStep (G4bool value) 125 static void SetRndmStep (G4bool value); 126 static void SetEnlossFluc (G4bool value) 126 static void SetEnlossFluc (G4bool value); 127 static void SetStepFunction (G4double c1, G4 127 static void SetStepFunction (G4double c1, G4double c2); 128 128 129 protected: 129 protected: 130 130 131 G4bool CutsWhereModified(); 131 G4bool CutsWhereModified(); 132 132 133 // G4Material *lastMaterial ; 133 // G4Material *lastMaterial ; 134 const G4double MaxExcitationNumber ; 134 const G4double MaxExcitationNumber ; 135 const G4double probLimFluct ; 135 const G4double probLimFluct ; 136 const long nmaxDirectFluct,nmaxCont1,nmaxCon 136 const long nmaxDirectFluct,nmaxCont1,nmaxCont2 ; 137 137 138 static void BuildDEDXTable(const G4ParticleD 138 static void BuildDEDXTable(const G4ParticleDefinition& aParticleType); 139 139 140 protected: 140 protected: 141 141 142 static G4ThreadLocal G4PhysicsTable* theDEDX 142 static G4ThreadLocal G4PhysicsTable* theDEDXpTable ; 143 static G4ThreadLocal G4PhysicsTable* theDEDX 143 static G4ThreadLocal G4PhysicsTable* theDEDXpbarTable ; 144 static G4ThreadLocal G4PhysicsTable* theRang 144 static G4ThreadLocal G4PhysicsTable* theRangepTable ; 145 static G4ThreadLocal G4PhysicsTable* theRang 145 static G4ThreadLocal G4PhysicsTable* theRangepbarTable ; 146 146 147 //inverse of the range tables 147 //inverse of the range tables 148 static G4ThreadLocal G4PhysicsTable* theInve 148 static G4ThreadLocal G4PhysicsTable* theInverseRangepTable ; 149 static G4ThreadLocal G4PhysicsTable* theInve 149 static G4ThreadLocal G4PhysicsTable* theInverseRangepbarTable ; 150 150 151 //lab and proper time tables 151 //lab and proper time tables 152 static G4ThreadLocal G4PhysicsTable* theLabT 152 static G4ThreadLocal G4PhysicsTable* theLabTimepTable ; 153 static G4ThreadLocal G4PhysicsTable* theLabT 153 static G4ThreadLocal G4PhysicsTable* theLabTimepbarTable ; 154 154 155 static G4ThreadLocal G4PhysicsTable* theProp 155 static G4ThreadLocal G4PhysicsTable* theProperTimepTable ; 156 static G4ThreadLocal G4PhysicsTable* theProp 156 static G4ThreadLocal G4PhysicsTable* theProperTimepbarTable ; 157 157 158 // processes inherited from G4hRDEnergyLoss 158 // processes inherited from G4hRDEnergyLoss 159 // register themselves in the static arra 159 // register themselves in the static array Recorder 160 static G4ThreadLocal G4PhysicsTable** Record 160 static G4ThreadLocal G4PhysicsTable** RecorderOfpProcess; 161 static G4ThreadLocal G4PhysicsTable** Record 161 static G4ThreadLocal G4PhysicsTable** RecorderOfpbarProcess; 162 static G4ThreadLocal G4int CounterOfpProcess 162 static G4ThreadLocal G4int CounterOfpProcess ; 163 static G4ThreadLocal G4int CounterOfpbarProc 163 static G4ThreadLocal G4int CounterOfpbarProcess ; 164 164 165 // particle mass 165 // particle mass 166 static G4ThreadLocal G4double ParticleMass ; 166 static G4ThreadLocal G4double ParticleMass ; 167 167 168 // cut in range 168 // cut in range 169 static G4ThreadLocal G4double ptableElectron 169 static G4ThreadLocal G4double ptableElectronCutInRange; 170 static G4ThreadLocal G4double pbartableElect 170 static G4ThreadLocal G4double pbartableElectronCutInRange; 171 171 172 static G4ThreadLocal G4double Charge ; 172 static G4ThreadLocal G4double Charge ; 173 173 174 static G4ThreadLocal G4double LowestKineticE 174 static G4ThreadLocal G4double LowestKineticEnergy; 175 static G4ThreadLocal G4double HighestKinetic 175 static G4ThreadLocal G4double HighestKineticEnergy; 176 static G4ThreadLocal G4int TotBin; // number 176 static G4ThreadLocal G4int TotBin; // number of bins in table, 177 // calculated in BuildPhysicsTable 177 // calculated in BuildPhysicsTable 178 178 179 static G4ThreadLocal G4double RTable,LOGRTab 179 static G4ThreadLocal G4double RTable,LOGRTable; // LOGRTable=std::log(HighestKineticEnergy 180 // /LowestKineticEnergy)/TotBin 180 // /LowestKineticEnergy)/TotBin 181 // RTable = std::exp(LOGRTable) 181 // RTable = std::exp(LOGRTable) 182 182 183 G4PhysicsTable* theLossTable ; 183 G4PhysicsTable* theLossTable ; 184 184 185 G4double linLossLimit ; 185 G4double linLossLimit ; 186 186 187 G4double MinKineticEnergy ; 187 G4double MinKineticEnergy ; 188 188 189 static G4ThreadLocal G4double dRoverRange ; 189 static G4ThreadLocal G4double dRoverRange ; // maximum allowed deltarange/range 190 // in one step 190 // in one step 191 static G4ThreadLocal G4double finalRange ; 191 static G4ThreadLocal G4double finalRange ; // last step before stop 192 static G4ThreadLocal G4double c1lim,c2lim,c3 192 static G4ThreadLocal G4double c1lim,c2lim,c3lim ; // coeffs for computing steplimit 193 193 194 static G4ThreadLocal G4bool rndmStepFlag ; 194 static G4ThreadLocal G4bool rndmStepFlag ; 195 static G4ThreadLocal G4bool EnlossFlucFlag ; 195 static G4ThreadLocal G4bool EnlossFlucFlag ; 196 196 197 197 198 private: 198 private: 199 199 200 // hide assignment operator 200 // hide assignment operator 201 201 202 G4hRDEnergyLoss(G4hRDEnergyLoss &); 202 G4hRDEnergyLoss(G4hRDEnergyLoss &); 203 G4hRDEnergyLoss & operator=(const G4hRDEnerg 203 G4hRDEnergyLoss & operator=(const G4hRDEnergyLoss &right); 204 204 205 // variables for the integration routines 205 // variables for the integration routines 206 static G4ThreadLocal G4double Mass,taulow,ta 206 static G4ThreadLocal G4double Mass,taulow,tauhigh,ltaulow,ltauhigh; 207 207 208 // ========================================= 208 // ==================================================================== 209 // static part of the class 209 // static part of the class 210 210 211 static void BuildRangeTable(const G4Particle 211 static void BuildRangeTable(const G4ParticleDefinition& aParticleType); 212 212 213 static void BuildInverseRangeTable(const G4P 213 static void BuildInverseRangeTable(const G4ParticleDefinition& aParticleType); 214 214 215 static void BuildTimeTables(const G4Particle 215 static void BuildTimeTables(const G4ParticleDefinition& aParticleType); 216 216 217 static void BuildLabTimeVector(G4int materia 217 static void BuildLabTimeVector(G4int materialIndex, 218 G4PhysicsLogVector* rangeVector); 218 G4PhysicsLogVector* rangeVector); 219 219 220 static void BuildProperTimeVector(G4int mate 220 static void BuildProperTimeVector(G4int materialIndex, 221 G4PhysicsLogVector* rangeVector); 221 G4PhysicsLogVector* rangeVector); 222 222 223 static void InvertRangeVector(G4int material 223 static void InvertRangeVector(G4int materialIndex, 224 G4PhysicsLogVector* rangeVector); 224 G4PhysicsLogVector* rangeVector); 225 225 226 static void BuildRangeVector(G4int materialI 226 static void BuildRangeVector(G4int materialIndex, 227 G4PhysicsLogVector* rangeVector); 227 G4PhysicsLogVector* rangeVector); 228 228 229 static G4double LabTimeIntLog(G4PhysicsVecto 229 static G4double LabTimeIntLog(G4PhysicsVector* physicsVector, G4int nbin); 230 230 231 static G4double ProperTimeIntLog(G4PhysicsVe 231 static G4double ProperTimeIntLog(G4PhysicsVector* physicsVector, G4int nbin); 232 232 233 static G4double RangeIntLin(G4PhysicsVector* 233 static G4double RangeIntLin(G4PhysicsVector* physicsVector, G4int nbin); 234 234 235 static G4double RangeIntLog(G4PhysicsVector* 235 static G4double RangeIntLog(G4PhysicsVector* physicsVector, G4int nbin); 236 236 237 static void BuildRangeCoeffATable( const G4P 237 static void BuildRangeCoeffATable( const G4ParticleDefinition& aParticleType); 238 static void BuildRangeCoeffBTable( const G4P 238 static void BuildRangeCoeffBTable( const G4ParticleDefinition& aParticleType); 239 static void BuildRangeCoeffCTable(const G4Pa 239 static void BuildRangeCoeffCTable(const G4ParticleDefinition& aParticleType); 240 240 241 // ========================================= 241 // ==================================================================== 242 242 243 static G4ThreadLocal G4PhysicsTable* theDEDX 243 static G4ThreadLocal G4PhysicsTable* theDEDXTable; 244 244 245 static G4ThreadLocal G4PhysicsTable* theRang 245 static G4ThreadLocal G4PhysicsTable* theRangeTable; 246 static G4ThreadLocal G4PhysicsTable* theInve 246 static G4ThreadLocal G4PhysicsTable* theInverseRangeTable; 247 247 248 static G4ThreadLocal G4PhysicsTable* theLabT 248 static G4ThreadLocal G4PhysicsTable* theLabTimeTable; 249 static G4ThreadLocal G4PhysicsTable* theProp 249 static G4ThreadLocal G4PhysicsTable* theProperTimeTable; 250 250 251 static G4ThreadLocal G4PhysicsTable** Record 251 static G4ThreadLocal G4PhysicsTable** RecorderOfProcess; 252 static G4ThreadLocal G4int CounterOfProcess; 252 static G4ThreadLocal G4int CounterOfProcess; 253 253 254 static G4ThreadLocal G4PhysicsTable* thepRan 254 static G4ThreadLocal G4PhysicsTable* thepRangeCoeffATable; 255 static G4ThreadLocal G4PhysicsTable* thepRan 255 static G4ThreadLocal G4PhysicsTable* thepRangeCoeffBTable; 256 static G4ThreadLocal G4PhysicsTable* thepRan 256 static G4ThreadLocal G4PhysicsTable* thepRangeCoeffCTable; 257 static G4ThreadLocal G4PhysicsTable* thepbar 257 static G4ThreadLocal G4PhysicsTable* thepbarRangeCoeffATable; 258 static G4ThreadLocal G4PhysicsTable* thepbar 258 static G4ThreadLocal G4PhysicsTable* thepbarRangeCoeffBTable; 259 static G4ThreadLocal G4PhysicsTable* thepbar 259 static G4ThreadLocal G4PhysicsTable* thepbarRangeCoeffCTable; 260 260 261 static G4ThreadLocal G4PhysicsTable* theRang 261 static G4ThreadLocal G4PhysicsTable* theRangeCoeffATable; 262 static G4ThreadLocal G4PhysicsTable* theRang 262 static G4ThreadLocal G4PhysicsTable* theRangeCoeffBTable; 263 static G4ThreadLocal G4PhysicsTable* theRang 263 static G4ThreadLocal G4PhysicsTable* theRangeCoeffCTable; 264 static G4ThreadLocal G4int NumberOfProcesses 264 static G4ThreadLocal G4int NumberOfProcesses ; 265 265 266 }; 266 }; 267 267 268 #endif 268 #endif 269 269