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 // GEANT4 Class header file 29 // GEANT4 Class header file 30 // 30 // 31 // 31 // 32 // File name: G4PAIModel 32 // File name: G4PAIModel 33 // 33 // 34 // Author: V. Grichine based on Vladimi 34 // Author: V. Grichine based on Vladimir Ivanchenko code 35 // 35 // 36 // Creation date: 05.10.2003 36 // Creation date: 05.10.2003 37 // 37 // 38 // Modifications: 38 // Modifications: 39 // 08-04-05 Major optimisation of internal int 39 // 08-04-05 Major optimisation of internal interfaces (V.Ivantchenko) 40 // 26-09-07 Fixed tmax computation (V.Ivantche 40 // 26-09-07 Fixed tmax computation (V.Ivantchenko) 41 // 19.08.13 V.Ivanchenko extract data handling 41 // 19.08.13 V.Ivanchenko extract data handling to G4PAIModelData class 42 // added sharing of internal data bet 42 // added sharing of internal data between threads (MT migration) 43 // 43 // 44 // 44 // 45 // Class Description: 45 // Class Description: 46 // 46 // 47 // Implementation of PAI model of energy loss 47 // Implementation of PAI model of energy loss and 48 // delta-electron production by heavy charged 48 // delta-electron production by heavy charged particles 49 49 50 // ------------------------------------------- 50 // ------------------------------------------------------------------- 51 // 51 // 52 52 53 #ifndef G4PAIModel_h 53 #ifndef G4PAIModel_h 54 #define G4PAIModel_h 1 54 #define G4PAIModel_h 1 55 55 56 #include <CLHEP/Units/PhysicalConstants.h> 56 #include <CLHEP/Units/PhysicalConstants.h> 57 57 58 #include "G4VEmModel.hh" 58 #include "G4VEmModel.hh" 59 #include "G4VEmFluctuationModel.hh" 59 #include "G4VEmFluctuationModel.hh" 60 #include "globals.hh" 60 #include "globals.hh" 61 #include <vector> 61 #include <vector> 62 62 63 class G4Region; 63 class G4Region; 64 class G4MaterialCutsCouple; 64 class G4MaterialCutsCouple; 65 class G4ParticleChangeForLoss; 65 class G4ParticleChangeForLoss; 66 class G4PAIModelData; 66 class G4PAIModelData; 67 67 68 class G4PAIModel final : public G4VEmModel, pu 68 class G4PAIModel final : public G4VEmModel, public G4VEmFluctuationModel 69 { 69 { 70 70 71 public: 71 public: 72 72 73 explicit G4PAIModel(const G4ParticleDefiniti 73 explicit G4PAIModel(const G4ParticleDefinition* p = nullptr, 74 const G4String& nam = "PAI"); 74 const G4String& nam = "PAI"); 75 75 76 ~G4PAIModel() final; 76 ~G4PAIModel() final; 77 77 78 void Initialise(const G4ParticleDefinition*, 78 void Initialise(const G4ParticleDefinition*, const G4DataVector&) final; 79 79 80 void InitialiseLocal(const G4ParticleDefinit 80 void InitialiseLocal(const G4ParticleDefinition*, 81 G4VEmModel* masterModel 81 G4VEmModel* masterModel) final; 82 82 83 G4double MinEnergyCut(const G4ParticleDefini 83 G4double MinEnergyCut(const G4ParticleDefinition*, 84 const G4MaterialCutsCo 84 const G4MaterialCutsCouple* couple) final; 85 85 86 G4double ComputeDEDXPerVolume(const G4Materi 86 G4double ComputeDEDXPerVolume(const G4Material*, 87 const G4ParticleDefinition*, 87 const G4ParticleDefinition*, 88 G4double kineticEnergy, 88 G4double kineticEnergy, 89 G4double cutEnergy) final; 89 G4double cutEnergy) final; 90 90 91 G4double CrossSectionPerVolume(const G4Mater 91 G4double CrossSectionPerVolume(const G4Material*, 92 const G4ParticleDefinition*, 92 const G4ParticleDefinition*, 93 G4double kineticEnergy, 93 G4double kineticEnergy, 94 G4double cutEnergy, 94 G4double cutEnergy, 95 G4double maxEnergy) final; 95 G4double maxEnergy) final; 96 96 97 void SampleSecondaries(std::vector<G4Dynamic 97 void SampleSecondaries(std::vector<G4DynamicParticle*>*, 98 const G4MaterialCutsCouple*, 98 const G4MaterialCutsCouple*, 99 const G4DynamicParticle*, 99 const G4DynamicParticle*, 100 G4double tmin, 100 G4double tmin, 101 G4double maxEnergy) final; 101 G4double maxEnergy) final; 102 102 103 G4double SampleFluctuations(const G4Material 103 G4double SampleFluctuations(const G4MaterialCutsCouple*, 104 const G4DynamicParticle*, 104 const G4DynamicParticle*, 105 const G4double, const G4double, 105 const G4double, const G4double, 106 const G4double, 106 const G4double, const G4double) final; 107 107 108 G4double Dispersion(const G4Material*, const 108 G4double Dispersion(const G4Material*, const G4DynamicParticle*, 109 const G4double, const G4double, 109 const G4double, const G4double, 110 const G4double) final; 110 const G4double) final; 111 111 112 void DefineForRegion(const G4Region* r) fina 112 void DefineForRegion(const G4Region* r) final; 113 113 114 inline G4PAIModelData* GetPAIModelData(); 114 inline G4PAIModelData* GetPAIModelData(); 115 115 116 inline const std::vector<const G4MaterialCut 116 inline const std::vector<const G4MaterialCutsCouple*>& GetVectorOfCouples(); 117 117 118 inline G4double ComputeMaxEnergy(G4double sc 118 inline G4double ComputeMaxEnergy(G4double scaledEnergy); 119 119 120 inline void SetVerboseLevel(G4int verbose); 120 inline void SetVerboseLevel(G4int verbose); 121 121 122 // hide assignment operator 122 // hide assignment operator 123 G4PAIModel & operator=(const G4PAIModel &ri 123 G4PAIModel & operator=(const G4PAIModel &right) = delete; 124 G4PAIModel(const G4PAIModel&) = delete; 124 G4PAIModel(const G4PAIModel&) = delete; 125 125 126 protected: 126 protected: 127 127 128 G4double MaxSecondaryEnergy(const G4Particle 128 G4double MaxSecondaryEnergy(const G4ParticleDefinition*, 129 G4double kinEner 129 G4double kinEnergy) final; 130 130 131 private: 131 private: 132 132 133 inline G4int FindCoupleIndex(const G4Materia 133 inline G4int FindCoupleIndex(const G4MaterialCutsCouple*); 134 134 135 inline void SetParticle(const G4ParticleDefi 135 inline void SetParticle(const G4ParticleDefinition* p); 136 136 137 G4int fVerbose; 137 G4int fVerbose; 138 138 139 G4PAIModelData* fModelData; 139 G4PAIModelData* fModelData; 140 140 141 std::vector<const G4MaterialCutsCouple*> fMa 141 std::vector<const G4MaterialCutsCouple*> fMaterialCutsCoupleVector; 142 std::vector<const G4Region*> fPAIRegion 142 std::vector<const G4Region*> fPAIRegionVector; 143 143 144 const G4ParticleDefinition* fParticle; 144 const G4ParticleDefinition* fParticle; 145 const G4ParticleDefinition* fElectron; 145 const G4ParticleDefinition* fElectron; 146 const G4ParticleDefinition* fPositron; 146 const G4ParticleDefinition* fPositron; 147 G4ParticleChangeForLoss* fParticleChange; 147 G4ParticleChangeForLoss* fParticleChange; 148 148 149 G4double fMass; 149 G4double fMass; 150 G4double fRatio; 150 G4double fRatio; 151 G4double fChargeSquare; 151 G4double fChargeSquare; 152 G4double fLowestTcut; 152 G4double fLowestTcut; 153 }; 153 }; 154 154 155 inline G4PAIModelData* G4PAIModel::GetPAIModel 155 inline G4PAIModelData* G4PAIModel::GetPAIModelData() 156 { 156 { 157 return fModelData; 157 return fModelData; 158 } 158 } 159 159 160 inline const std::vector<const G4MaterialCutsC 160 inline const std::vector<const G4MaterialCutsCouple*>& 161 G4PAIModel::GetVectorOfCouples() 161 G4PAIModel::GetVectorOfCouples() 162 { 162 { 163 return fMaterialCutsCoupleVector; 163 return fMaterialCutsCoupleVector; 164 } 164 } 165 165 166 inline G4double G4PAIModel::ComputeMaxEnergy(G 166 inline G4double G4PAIModel::ComputeMaxEnergy(G4double scaledEnergy) 167 { 167 { 168 return MaxSecondaryEnergy(fParticle, scaledE 168 return MaxSecondaryEnergy(fParticle, scaledEnergy/fRatio); 169 } 169 } 170 170 171 inline void G4PAIModel::SetVerboseLevel(G4int 171 inline void G4PAIModel::SetVerboseLevel(G4int verbose) 172 { 172 { 173 fVerbose=verbose; 173 fVerbose=verbose; 174 } 174 } 175 175 176 inline G4int G4PAIModel::FindCoupleIndex(const 176 inline G4int G4PAIModel::FindCoupleIndex(const G4MaterialCutsCouple* couple) 177 { 177 { 178 G4int idx = -1; 178 G4int idx = -1; 179 G4int jMatMax = (G4int)fMaterialCutsCoupleVe 179 G4int jMatMax = (G4int)fMaterialCutsCoupleVector.size(); 180 for(G4int jMat = 0;jMat < jMatMax; ++jMat) { 180 for(G4int jMat = 0;jMat < jMatMax; ++jMat) { 181 if(couple == fMaterialCutsCoupleVector[jMa 181 if(couple == fMaterialCutsCoupleVector[jMat]) { 182 idx = jMat; 182 idx = jMat; 183 break; 183 break; 184 } 184 } 185 } 185 } 186 return idx; 186 return idx; 187 } 187 } 188 188 189 inline void G4PAIModel::SetParticle(const G4Pa 189 inline void G4PAIModel::SetParticle(const G4ParticleDefinition* p) 190 { 190 { 191 if(fParticle != p) { 191 if(fParticle != p) { 192 fParticle = p; 192 fParticle = p; 193 fMass = fParticle->GetPDGMass(); 193 fMass = fParticle->GetPDGMass(); 194 fRatio = CLHEP::proton_mass_c2/fMass; 194 fRatio = CLHEP::proton_mass_c2/fMass; 195 G4double q = fParticle->GetPDGCharge()/CLH 195 G4double q = fParticle->GetPDGCharge()/CLHEP::eplus; 196 fChargeSquare = q*q; 196 fChargeSquare = q*q; 197 } 197 } 198 } 198 } 199 199 200 #endif 200 #endif 201 201