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 // G4ParticleChangeForLoss << 27 // 26 // 28 // Class description: << 27 // $Id: G4ParticleChangeForLoss.hh,v 1.22 2009/06/17 17:25:57 vnivanch Exp $ >> 28 // GEANT4 tag $Name: geant4-09-03-patch-01 $ 29 // 29 // 30 // Concrete class for ParticleChange for Energ << 30 // 31 << 31 // ------------------------------------------------------------ 32 // Author: Hisaya Kurashige, 23 March 1998 << 32 // GEANT 4 class header file 33 // Revision: Vladimir Ivantchenko, 16 January << 33 // 34 // 24 August 2 << 34 // 35 // ------------------------------------------- << 35 // ------------------------------------------------------------ 36 #ifndef G4ParticleChangeForLoss_hh << 36 // Implemented for the new scheme 23 Mar. 1998 H.Kurahige 37 #define G4ParticleChangeForLoss_hh 1 << 37 // >> 38 // Modified: >> 39 // 16.01.04 V.Ivanchenko update for model variant of energy loss >> 40 // 15.04.05 V.Ivanchenko inline update methods >> 41 // 30.01.06 V.Ivanchenko add ProposedMomentumDirection for AlongStep >> 42 // and ProposeWeight for PostStep >> 43 // 07.06.06 V.Ivanchenko RemoveProposedMomentumDirection from AlongStep >> 44 // 28.08.06 V.Ivanchenko Added access to current track and polarizaion >> 45 // 17.06.09 V.Ivanchenko Added SetLowEnergyLimit method >> 46 // >> 47 // ------------------------------------------------------------ >> 48 // >> 49 // Class Description >> 50 // This class is a concrete class for ParticleChange for EnergyLoss >> 51 // >> 52 #ifndef G4ParticleChangeForLoss_h >> 53 #define G4ParticleChangeForLoss_h 1 38 54 >> 55 #include "globals.hh" >> 56 #include "G4ios.hh" 39 #include "G4VParticleChange.hh" 57 #include "G4VParticleChange.hh" 40 #include "G4DynamicParticle.hh" << 41 58 42 class G4ParticleChangeForLoss final : public G << 59 class G4DynamicParticle; >> 60 >> 61 class G4ParticleChangeForLoss: public G4VParticleChange 43 { 62 { 44 public: 63 public: 45 << 64 // default constructor 46 G4ParticleChangeForLoss(); 65 G4ParticleChangeForLoss(); 47 66 48 ~G4ParticleChangeForLoss() override = defaul << 67 // destructor 49 << 68 virtual ~G4ParticleChangeForLoss(); 50 G4ParticleChangeForLoss(const G4ParticleChan << 51 G4ParticleChangeForLoss& operator=(const G4P << 52 69 >> 70 // with description >> 71 // ---------------------------------------------------- 53 // --- the following methods are for updatin 72 // --- the following methods are for updating G4Step ----- 54 73 55 G4Step* UpdateStepForAlongStep(G4Step* step) << 74 G4Step* UpdateStepForAlongStep(G4Step* Step); 56 G4Step* UpdateStepForPostStep(G4Step* step) << 75 G4Step* UpdateStepForPostStep(G4Step* Step); >> 76 // A physics process gives the final state of the particle >> 77 // based on information of G4Track >> 78 >> 79 void InitializeForAlongStep(const G4Track&); >> 80 void InitializeForPostStep(const G4Track&); >> 81 //Initialize all propoerties by using G4Track information >> 82 >> 83 void AddSecondary(G4DynamicParticle* aParticle); >> 84 // Add next secondary >> 85 >> 86 G4double GetProposedCharge() const; >> 87 void SetProposedCharge(G4double theCharge); >> 88 // Get/Set theCharge >> 89 >> 90 G4double GetCharge() const; >> 91 void ProposeCharge(G4double finalCharge); >> 92 // Get/Propose the final dynamical Charge in G4DynamicParticle >> 93 >> 94 G4double GetProposedKineticEnergy() const; >> 95 void SetProposedKineticEnergy(G4double proposedKinEnergy); >> 96 // Get/Set the final kinetic energy of the current particle. >> 97 >> 98 const G4ThreeVector& GetProposedMomentumDirection() const; >> 99 void SetProposedMomentumDirection(const G4ThreeVector& dir); >> 100 const G4ThreeVector& GetMomentumDirection() const; >> 101 void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz); >> 102 void ProposeMomentumDirection(const G4ThreeVector& Pfinal); >> 103 // Get/Propose the MomentumDirection vector: it is the final momentum direction. >> 104 >> 105 const G4ThreeVector& GetProposedPolarization() const; >> 106 void ProposePolarization(const G4ThreeVector& dir); >> 107 void ProposePolarization(G4double Px, G4double Py, G4double Pz); >> 108 >> 109 const G4Track* GetCurrentTrack() const; >> 110 >> 111 void SetLowEnergyLimit(G4double elimit); >> 112 >> 113 virtual void DumpInfo() const; >> 114 >> 115 // for Debug >> 116 virtual G4bool CheckIt(const G4Track&); >> 117 >> 118 protected: >> 119 // hide copy constructor and assignment operaor as protected >> 120 G4ParticleChangeForLoss(const G4ParticleChangeForLoss &right); >> 121 G4ParticleChangeForLoss & operator=(const G4ParticleChangeForLoss &right); 57 122 58 // Initialize all used properties << 123 private: 59 inline void InitializeForAlongStep(const G4T << 60 inline void InitializeForPostStep(const G4Tr << 61 << 62 // Get/Set dynamic charge << 63 inline G4double GetProposedCharge() const; << 64 inline void SetProposedCharge(G4double theCh << 65 << 66 // Get/Set the final kinetic energy of the c << 67 inline G4double GetProposedKineticEnergy() c << 68 inline void SetProposedKineticEnergy(G4doubl << 69 << 70 // Get/Propose the MomentumDirection vector: << 71 // direction << 72 inline const G4ThreeVector& GetProposedMomen << 73 inline void SetProposedMomentumDirection(con << 74 inline void ProposeMomentumDirection(const G << 75 << 76 inline const G4ThreeVector& GetProposedPolar << 77 inline void ProposePolarization(const G4Thre << 78 inline void ProposePolarization(G4double Px, << 79 124 80 void DumpInfo() const final; << 125 const G4Track* currentTrack; >> 126 // The pointer to G4Track 81 127 82 private: << 128 G4double proposedKinEnergy; >> 129 // The final kinetic energy of the current particle. 83 130 84 G4double proposedKinEnergy = 0.0; << 131 G4double lowEnergyLimit; 85 // The final kinetic energy of the current p << 132 // The limit kinetic energy below which particle is stopped 86 133 87 G4double currentCharge = 0.0; << 134 G4double currentCharge; 88 // The final charge of the current parti << 135 // The final charge of the current particle. 89 136 90 G4ThreeVector proposedMomentumDirection; 137 G4ThreeVector proposedMomentumDirection; 91 // The final momentum direction of the curre << 138 // The final momentum direction of the current particle. 92 139 93 G4ThreeVector proposedPolarization; 140 G4ThreeVector proposedPolarization; 94 // The final polarization of the current par << 141 // The final polarization of the current particle. 95 }; 142 }; 96 143 97 // ---------------------- << 144 // ------------------------------------------------------------ 98 // Inline methods << 99 // ---------------------- << 100 145 101 inline << 146 inline G4double G4ParticleChangeForLoss::GetProposedKineticEnergy() const 102 G4double G4ParticleChangeForLoss::GetProposedK << 103 { 147 { 104 return proposedKinEnergy; 148 return proposedKinEnergy; 105 } 149 } 106 150 107 inline << 151 inline void G4ParticleChangeForLoss::SetProposedKineticEnergy(G4double energy) 108 void G4ParticleChangeForLoss::SetProposedKinet << 109 { 152 { 110 proposedKinEnergy = energy; 153 proposedKinEnergy = energy; 111 } 154 } 112 155 113 inline G4double G4ParticleChangeForLoss::GetPr 156 inline G4double G4ParticleChangeForLoss::GetProposedCharge() const 114 { 157 { 115 return currentCharge; 158 return currentCharge; 116 } 159 } 117 160 118 inline << 161 inline G4double G4ParticleChangeForLoss::GetCharge() const 119 void G4ParticleChangeForLoss::SetProposedCharg << 162 { >> 163 return currentCharge; >> 164 } >> 165 >> 166 inline void G4ParticleChangeForLoss::SetProposedCharge(G4double theCharge) >> 167 { >> 168 currentCharge = theCharge; >> 169 } >> 170 >> 171 inline void G4ParticleChangeForLoss::ProposeCharge(G4double theCharge) 120 { 172 { 121 currentCharge = theCharge; 173 currentCharge = theCharge; 122 } 174 } 123 175 124 inline 176 inline 125 const G4ThreeVector& << 177 const G4ThreeVector& G4ParticleChangeForLoss::GetProposedMomentumDirection() const 126 G4ParticleChangeForLoss::GetProposedMomentumDi << 127 { 178 { 128 return proposedMomentumDirection; 179 return proposedMomentumDirection; 129 } 180 } 130 181 131 inline 182 inline 132 void G4ParticleChangeForLoss::ProposeMomentumD << 183 const G4ThreeVector& G4ParticleChangeForLoss::GetMomentumDirection() const >> 184 { >> 185 return proposedMomentumDirection; >> 186 } >> 187 >> 188 inline >> 189 void G4ParticleChangeForLoss::ProposeMomentumDirection(const G4ThreeVector& dir) 133 { 190 { 134 proposedMomentumDirection = dir; 191 proposedMomentumDirection = dir; 135 } 192 } 136 193 137 inline 194 inline 138 void << 195 void G4ParticleChangeForLoss::SetProposedMomentumDirection(const G4ThreeVector& dir) 139 G4ParticleChangeForLoss::SetProposedMomentumDi << 140 { 196 { 141 proposedMomentumDirection = dir; 197 proposedMomentumDirection = dir; 142 } 198 } 143 199 144 inline 200 inline 145 const G4ThreeVector& G4ParticleChangeForLoss:: << 201 void G4ParticleChangeForLoss::ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz) >> 202 { >> 203 proposedMomentumDirection.setX(Px); >> 204 proposedMomentumDirection.setY(Py); >> 205 proposedMomentumDirection.setZ(Pz); >> 206 } >> 207 >> 208 inline const G4Track* G4ParticleChangeForLoss::GetCurrentTrack() const >> 209 { >> 210 return currentTrack; >> 211 } >> 212 >> 213 inline >> 214 const G4ThreeVector& G4ParticleChangeForLoss::GetProposedPolarization() const 146 { 215 { 147 return proposedPolarization; 216 return proposedPolarization; 148 } 217 } 149 218 150 inline 219 inline 151 void G4ParticleChangeForLoss::ProposePolarizat << 220 void G4ParticleChangeForLoss::ProposePolarization(const G4ThreeVector& dir) 152 { 221 { 153 proposedPolarization = dir; 222 proposedPolarization = dir; 154 } 223 } 155 224 156 inline void G4ParticleChangeForLoss::ProposePo << 225 inline 157 << 226 void G4ParticleChangeForLoss::ProposePolarization(G4double Px, G4double Py, G4double Pz) 158 << 159 { 227 { 160 proposedPolarization.set(Px, Py, Pz); << 228 proposedPolarization.setX(Px); >> 229 proposedPolarization.setY(Py); >> 230 proposedPolarization.setZ(Pz); 161 } 231 } 162 232 163 inline << 233 inline void G4ParticleChangeForLoss::InitializeForAlongStep(const G4Track& track) 164 void G4ParticleChangeForLoss::InitializeForAlo << 165 { 234 { 166 InitializeSecondaries(); << 235 theStatusChange = track.GetTrackStatus(); 167 InitializeLocalEnergyDeposit(); << 236 theLocalEnergyDeposit = 0.0; 168 InitializeParentWeight(track); << 237 theNonIonizingEnergyDeposit = 0.0; 169 InitializeStatusChange(track); << 238 InitializeSecondaries(track); >> 239 theParentWeight = track.GetWeight(); 170 proposedKinEnergy = track.GetKineticEnergy() 240 proposedKinEnergy = track.GetKineticEnergy(); 171 currentCharge = track.GetDynamicParticle()-> 241 currentCharge = track.GetDynamicParticle()->GetCharge(); 172 } 242 } 173 243 174 inline << 244 inline void G4ParticleChangeForLoss::InitializeForPostStep(const G4Track& track) 175 void G4ParticleChangeForLoss::InitializeForPos << 176 { 245 { 177 InitializeForAlongStep(track); << 246 theStatusChange = track.GetTrackStatus(); >> 247 theLocalEnergyDeposit = 0.0; >> 248 theNonIonizingEnergyDeposit = 0.0; >> 249 InitializeSecondaries(track); >> 250 theParentWeight = track.GetWeight(); >> 251 proposedKinEnergy = track.GetKineticEnergy(); >> 252 currentCharge = track.GetDynamicParticle()->GetCharge(); 178 proposedMomentumDirection = track.GetMomentu 253 proposedMomentumDirection = track.GetMomentumDirection(); 179 proposedPolarization = track.GetPolarization 254 proposedPolarization = track.GetPolarization(); >> 255 currentTrack = &track; >> 256 } >> 257 >> 258 //---------------------------------------------------------------- >> 259 // methods for updating G4Step >> 260 // >> 261 >> 262 inline G4Step* G4ParticleChangeForLoss::UpdateStepForAlongStep(G4Step* pStep) >> 263 { >> 264 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint(); >> 265 >> 266 // accumulate change of the kinetic energy >> 267 G4double kinEnergy = pPostStepPoint->GetKineticEnergy() + >> 268 (proposedKinEnergy - pStep->GetPreStepPoint()->GetKineticEnergy()); >> 269 >> 270 // update kinetic energy and charge >> 271 if (kinEnergy < lowEnergyLimit) { >> 272 theLocalEnergyDeposit += kinEnergy; >> 273 kinEnergy = 0.0; >> 274 } else { >> 275 pPostStepPoint->SetCharge( currentCharge ); >> 276 } >> 277 pPostStepPoint->SetKineticEnergy( kinEnergy ); >> 278 >> 279 // update weight >> 280 // this feature is commented out, it should be overwritten in case >> 281 // if energy loss processes will use biasing >> 282 // G4double newWeight = theParentWeight*(pPostStepPoint->GetWeight()) >> 283 // /(pPreStepPoint->GetWeight()); >> 284 // pPostStepPoint->SetWeight( newWeight ); >> 285 pStep->AddTotalEnergyDeposit( theLocalEnergyDeposit ); >> 286 pStep->AddNonIonizingEnergyDeposit( theNonIonizingEnergyDeposit ); >> 287 return pStep; >> 288 } >> 289 >> 290 inline G4Step* G4ParticleChangeForLoss::UpdateStepForPostStep(G4Step* pStep) >> 291 { >> 292 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint(); >> 293 pPostStepPoint->SetCharge( currentCharge ); >> 294 pPostStepPoint->SetMomentumDirection( proposedMomentumDirection ); >> 295 pPostStepPoint->SetKineticEnergy( proposedKinEnergy ); >> 296 pPostStepPoint->SetPolarization( proposedPolarization ); >> 297 // update weight if process cannot do that >> 298 if (!fSetParentWeightByProcess) >> 299 pPostStepPoint->SetWeight( theParentWeight ); >> 300 >> 301 pStep->AddTotalEnergyDeposit( theLocalEnergyDeposit ); >> 302 pStep->AddNonIonizingEnergyDeposit( theNonIonizingEnergyDeposit ); >> 303 return pStep; >> 304 } >> 305 >> 306 inline void G4ParticleChangeForLoss::AddSecondary(G4DynamicParticle* aParticle) >> 307 { >> 308 // create track >> 309 G4Track* aTrack = new G4Track(aParticle, currentTrack->GetGlobalTime(), >> 310 currentTrack->GetPosition()); >> 311 >> 312 // Touchable handle is copied to keep the pointer >> 313 aTrack->SetTouchableHandle(currentTrack->GetTouchableHandle()); >> 314 >> 315 // add a secondary >> 316 G4VParticleChange::AddSecondary(aTrack); >> 317 } >> 318 >> 319 inline void G4ParticleChangeForLoss::SetLowEnergyLimit(G4double elimit) >> 320 { >> 321 lowEnergyLimit = elimit; 180 } 322 } 181 323 182 #endif 324 #endif >> 325 183 326