Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // G4ParticleChangeForLoss class implementation 27 // 28 // Author: Hisaya Kurashige, 23 March 1998 29 // Revision: Vladimir Ivantchenko, 16 January 2004 30 // -------------------------------------------------------------------- 31 32 #include "G4ParticleChangeForLoss.hh" 33 #include "G4SystemOfUnits.hh" 34 #include "G4ExceptionSeverity.hh" 35 36 // -------------------------------------------------------------------- 37 G4ParticleChangeForLoss::G4ParticleChangeForLoss() 38 { 39 // Disable flag that is enabled in G4VParticleChange if G4VERBOSE. 40 debugFlag = false; 41 SetNumberOfSecondaries(1); 42 } 43 44 // -------------------------------------------------------------------- 45 void G4ParticleChangeForLoss::DumpInfo() const 46 { 47 // use base-class DumpInfo 48 G4VParticleChange::DumpInfo(); 49 50 G4long oldprc = G4cout.precision(8); 51 G4cout << " -----------------------------------------------" << G4endl; 52 G4cout << " G4ParticleChangeForLoss proposes: " << G4endl; 53 G4cout << " Charge (eplus) : " << std::setw(20) 54 << currentCharge / eplus << G4endl; 55 G4cout << " Kinetic Energy (MeV): " << std::setw(20) 56 << proposedKinEnergy / MeV << G4endl; 57 G4cout << " Momentum Direct - x : " << std::setw(20) 58 << proposedMomentumDirection.x() << G4endl; 59 G4cout << " Momentum Direct - y : " << std::setw(20) 60 << proposedMomentumDirection.y() << G4endl; 61 G4cout << " Momentum Direct - z : " << std::setw(20) 62 << proposedMomentumDirection.z() << G4endl; 63 G4cout.precision(oldprc); 64 } 65 66 // -------------------------------------------------------------------- 67 G4Step* G4ParticleChangeForLoss::UpdateStepForAlongStep(G4Step* pStep) 68 { 69 const G4StepPoint* pPreStepPoint = pStep->GetPreStepPoint(); 70 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint(); 71 72 // accumulate change of the kinetic energy 73 G4double preKinEnergy = pPreStepPoint->GetKineticEnergy(); 74 G4double kinEnergy = 75 pPostStepPoint->GetKineticEnergy() + (proposedKinEnergy - preKinEnergy); 76 77 pPostStepPoint->SetCharge(currentCharge); 78 79 // calculate velocity 80 if(kinEnergy > 0.0) 81 { 82 pPostStepPoint->SetKineticEnergy(kinEnergy); 83 84 // assuming that mass>0, zero mass particles do not have energy loss 85 pPostStepPoint->SetVelocity(CLHEP::c_light*ComputeBeta(kinEnergy)); 86 } 87 else 88 { 89 pPostStepPoint->SetKineticEnergy(0.0); 90 pPostStepPoint->SetVelocity(0.0); 91 } 92 93 if(isParentWeightProposed) 94 { 95 pPostStepPoint->SetWeight(theParentWeight); 96 } 97 98 pStep->AddTotalEnergyDeposit(theLocalEnergyDeposit); 99 pStep->AddNonIonizingEnergyDeposit(theNonIonizingEnergyDeposit); 100 return pStep; 101 } 102 103 // -------------------------------------------------------------------- 104 G4Step* G4ParticleChangeForLoss::UpdateStepForPostStep(G4Step* pStep) 105 { 106 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint(); 107 108 pPostStepPoint->SetCharge(currentCharge); 109 pPostStepPoint->SetMomentumDirection(proposedMomentumDirection); 110 if(proposedKinEnergy > 0.0) 111 { 112 pPostStepPoint->SetKineticEnergy(proposedKinEnergy); 113 114 // assuming that mass>0, zero mass particles do not have energy loss 115 pPostStepPoint->SetVelocity(CLHEP::c_light*ComputeBeta(proposedKinEnergy)); 116 } 117 else 118 { 119 pPostStepPoint->SetKineticEnergy(0.0); 120 pPostStepPoint->SetVelocity(0.0); 121 } 122 pPostStepPoint->SetPolarization(proposedPolarization); 123 124 if(isParentWeightProposed) 125 { 126 pPostStepPoint->SetWeight(theParentWeight); 127 } 128 129 pStep->AddTotalEnergyDeposit(theLocalEnergyDeposit); 130 pStep->AddNonIonizingEnergyDeposit(theNonIonizingEnergyDeposit); 131 return pStep; 132 } 133