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 // G4ParticleChangeForTransport class implemen << 27 // 26 // 28 // Author: Hisaya Kurashige, 10 May 1998 << 27 // 29 // ------------------------------------------- << 28 // >> 29 // -------------------------------------------------------------- >> 30 // GEANT 4 class implementation file >> 31 // >> 32 // >> 33 // >> 34 // ------------------------------------------------------------ >> 35 // Implemented for the new scheme 10 May. 1998 H.Kurahige >> 36 // Correct tratment of fpNextTouchable 12 May. 1998 H.Kurashige >> 37 // Change to the next volume only if energy>0 19 Jan. 2004 V.Ivanchenko >> 38 // -------------------------------------------------------------- 30 39 31 #include "G4ParticleChangeForTransport.hh" 40 #include "G4ParticleChangeForTransport.hh" 32 #include "G4TouchableHandle.hh" 41 #include "G4TouchableHandle.hh" 33 #include "G4Track.hh" 42 #include "G4Track.hh" 34 #include "G4Step.hh" 43 #include "G4Step.hh" 35 #include "G4TrackFastVector.hh" 44 #include "G4TrackFastVector.hh" 36 #include "G4DynamicParticle.hh" 45 #include "G4DynamicParticle.hh" 37 46 38 // ------------------------------------------- << 47 G4ParticleChangeForTransport::G4ParticleChangeForTransport() 39 G4ParticleChangeForTransport::G4ParticleChange << 48 : G4ParticleChange(), isMomentumChanged(false), theMaterialChange(0), >> 49 theMaterialCutsCoupleChange(0), theSensitiveDetectorChange(0), >> 50 fpVectorOfAuxiliaryPointsPointer(0) 40 { 51 { 41 // Disable flag that is enabled in G4VPartic << 52 if (verboseLevel>2) { 42 debugFlag = false; << 53 G4cout << "G4ParticleChangeForTransport::G4ParticleChangeForTransport() " >> 54 << G4endl; >> 55 } 43 } 56 } 44 57 45 // ------------------------------------------- << 58 G4ParticleChangeForTransport::~G4ParticleChangeForTransport() >> 59 { >> 60 if (verboseLevel>2) { >> 61 G4cout << "G4ParticleChangeForTransport::~G4ParticleChangeForTransport() " >> 62 << G4endl; >> 63 } >> 64 } >> 65 >> 66 G4ParticleChangeForTransport:: >> 67 G4ParticleChangeForTransport(const G4ParticleChangeForTransport &r) >> 68 : G4ParticleChange(r), >> 69 fpVectorOfAuxiliaryPointsPointer(0) >> 70 { >> 71 if (verboseLevel>0) { >> 72 G4cout << "G4ParticleChangeForTransport:: copy constructor is called " >> 73 << G4endl; >> 74 } >> 75 theTouchableHandle = r.theTouchableHandle; >> 76 isMomentumChanged = r.isMomentumChanged; >> 77 theMaterialChange = r.theMaterialChange; >> 78 theMaterialCutsCoupleChange = r.theMaterialCutsCoupleChange; >> 79 theSensitiveDetectorChange = r.theSensitiveDetectorChange; >> 80 } >> 81 >> 82 // assignemnt operator >> 83 G4ParticleChangeForTransport & >> 84 G4ParticleChangeForTransport::operator=(const G4ParticleChangeForTransport &r) >> 85 { >> 86 if (verboseLevel>1) { >> 87 G4cout << "G4ParticleChangeForTransport:: assignment operator is called " >> 88 << G4endl; >> 89 } >> 90 if (this != &r) >> 91 { >> 92 theListOfSecondaries = r.theListOfSecondaries; >> 93 theSizeOftheListOfSecondaries = r.theSizeOftheListOfSecondaries; >> 94 theNumberOfSecondaries = r.theNumberOfSecondaries; >> 95 theStatusChange = r.theStatusChange; >> 96 theTouchableHandle = r.theTouchableHandle; >> 97 theMaterialChange = r.theMaterialChange; >> 98 theMaterialCutsCoupleChange = r.theMaterialCutsCoupleChange; >> 99 theSensitiveDetectorChange = r.theSensitiveDetectorChange; >> 100 theMomentumDirectionChange = r.theMomentumDirectionChange; >> 101 thePolarizationChange = r.thePolarizationChange; >> 102 thePositionChange = r.thePositionChange; >> 103 theTimeChange = r.theTimeChange; >> 104 theEnergyChange = r.theEnergyChange; >> 105 theVelocityChange = r.theVelocityChange; >> 106 theTrueStepLength = r.theTrueStepLength; >> 107 theLocalEnergyDeposit = r.theLocalEnergyDeposit; >> 108 theSteppingControlFlag = r.theSteppingControlFlag; >> 109 } >> 110 return *this; >> 111 } >> 112 >> 113 //---------------------------------------------------------------- >> 114 // methods for updating G4Step >> 115 // >> 116 46 G4Step* G4ParticleChangeForTransport::UpdateSt 117 G4Step* G4ParticleChangeForTransport::UpdateStepForAtRest(G4Step* pStep) 47 { 118 { 48 // Update the G4Step specific attributes << 119 // Nothing happens for AtRestDoIt >> 120 if (verboseLevel>0) { >> 121 G4cout << "G4ParticleChangeForTransport::UpdateStepForAtRest() is called" >> 122 << G4endl; >> 123 G4cout << " Nothing happens for this method " << G4endl; >> 124 } >> 125 // Update the G4Step specific attributes 49 return UpdateStepInfo(pStep); 126 return UpdateStepInfo(pStep); 50 } 127 } 51 128 52 // ------------------------------------------- << 129 53 G4Step* G4ParticleChangeForTransport::UpdateSt 130 G4Step* G4ParticleChangeForTransport::UpdateStepForAlongStep(G4Step* pStep) 54 { 131 { 55 // Smooth curved tajectory representation: l 132 // Smooth curved tajectory representation: let the Step know about 56 // the auxiliary trajectory points (jacek 30 133 // the auxiliary trajectory points (jacek 30/10/2002) 57 pStep->SetPointerToVectorOfAuxiliaryPoints(f 134 pStep->SetPointerToVectorOfAuxiliaryPoints(fpVectorOfAuxiliaryPointsPointer); 58 135 59 // Most of the code assumes that transportat << 136 // copy of G4ParticleChange::UpdateStepForAlongStep 60 // so the pre- and post-step point are still << 137 // i.e. no effect for touchable >> 138 >> 139 // A physics process always calculates the final state of the >> 140 // particle relative to the initial state at the beginning >> 141 // of the Step, i.e., based on information of G4Track (or >> 142 // equivalently the PreStepPoint). >> 143 // So, the differences (delta) between these two states have to be >> 144 // calculated and be accumulated in PostStepPoint. >> 145 >> 146 // Take note that the return type of GetMomentumChange is a >> 147 // pointer to G4ThreeVector. Also it is a normalized >> 148 // momentum vector. >> 149 61 G4StepPoint* pPreStepPoint = pStep->GetPreS 150 G4StepPoint* pPreStepPoint = pStep->GetPreStepPoint(); 62 G4StepPoint* pPostStepPoint = pStep->GetPost 151 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint(); >> 152 G4Track* aTrack = pStep->GetTrack(); >> 153 G4double mass = aTrack->GetDynamicParticle()->GetMass(); >> 154 >> 155 // uodate kinetic energy >> 156 // now assume that no energy change in transportation >> 157 // However it is not true in electric fields >> 158 // Case for changing energy will be implemented in future >> 159 63 160 64 // update momentum direction and energy 161 // update momentum direction and energy 65 if(isMomentumChanged) << 162 if (isMomentumChanged) { 66 { << 163 G4double energy; 67 pPostStepPoint->SetMomentumDirection(theMo << 164 energy= pPostStepPoint->GetKineticEnergy() 68 pPostStepPoint->SetKineticEnergy(theEnergy << 165 + (theEnergyChange - pPreStepPoint->GetKineticEnergy()); >> 166 >> 167 // calculate new momentum >> 168 G4ThreeVector pMomentum = pPostStepPoint->GetMomentum() >> 169 + ( CalcMomentum(theEnergyChange, theMomentumDirectionChange, mass) >> 170 - pPreStepPoint->GetMomentum()); >> 171 G4double tMomentum = pMomentum.mag(); >> 172 G4ThreeVector direction(1.0,0.0,0.0); >> 173 if( tMomentum > 0. ){ >> 174 G4double inv_Momentum= 1.0 / tMomentum; >> 175 direction= pMomentum * inv_Momentum; >> 176 } >> 177 pPostStepPoint->SetMomentumDirection(direction); >> 178 pPostStepPoint->SetKineticEnergy( energy ); 69 } 179 } 70 if(isVelocityChanged) << 180 if (isVelocityChanged) pPostStepPoint->SetVelocity(theVelocityChange); 71 pPostStepPoint->SetVelocity(theVelocityCha << 181 >> 182 // stop case should not occur >> 183 //pPostStepPoint->SetMomentumDirection(G4ThreeVector(1., 0., 0.)); >> 184 72 185 73 // update polarization 186 // update polarization 74 pPostStepPoint->SetPolarization(thePolarizat << 187 pPostStepPoint->AddPolarization( thePolarizationChange >> 188 - pPreStepPoint->GetPolarization()); 75 189 76 // update position and time 190 // update position and time 77 pPostStepPoint->SetPosition(thePositionChang << 191 pPostStepPoint->AddPosition( thePositionChange 78 pPostStepPoint->AddGlobalTime(theTimeChange << 192 - pPreStepPoint->GetPosition() ); 79 pPostStepPoint->AddLocalTime(theTimeChange - << 193 pPostStepPoint->AddGlobalTime( theTimeChange 80 pPostStepPoint->SetProperTime(theProperTimeC << 194 - pPreStepPoint->GetLocalTime()); >> 195 pPostStepPoint->AddLocalTime( theTimeChange >> 196 - pPreStepPoint->GetLocalTime()); >> 197 pPostStepPoint->AddProperTime( theProperTimeChange >> 198 - pPreStepPoint->GetProperTime()); 81 199 82 #ifdef G4VERBOSE 200 #ifdef G4VERBOSE 83 if(debugFlag) { CheckIt(*theCurrentTrack); } << 201 if (debugFlag) CheckIt(*aTrack); 84 #endif 202 #endif 85 203 86 // Update the G4Step specific attributes << 204 // Update the G4Step specific attributes 87 pStep->SetStepLength( theTrueStepLength ); << 205 //pStep->SetStepLength( theTrueStepLength ); 88 pStep->SetControlFlag(theSteppingControlFlag << 206 // pStep->AddTotalEnergyDeposit( theLocalEnergyDeposit ); 89 << 207 pStep->SetControlFlag( theSteppingControlFlag ); 90 return pStep; 208 return pStep; >> 209 // return UpdateStepInfo(pStep); 91 } 210 } 92 211 93 // ------------------------------------------- << 94 G4Step* G4ParticleChangeForTransport::UpdateSt 212 G4Step* G4ParticleChangeForTransport::UpdateStepForPostStep(G4Step* pStep) 95 { 213 { 96 // A physics process always calculates the f 214 // A physics process always calculates the final state of the particle 97 215 98 // Change volume only if some kinetic energy 216 // Change volume only if some kinetic energy remains 99 G4StepPoint* pPostStepPoint = pStep->GetPost 217 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint(); 100 if(pPostStepPoint->GetKineticEnergy() > 0.0) << 218 if(pPostStepPoint->GetKineticEnergy() > 0.0) { 101 { << 219 102 // update next touchable 220 // update next touchable 103 // (touchable can be changed only at PostS 221 // (touchable can be changed only at PostStepDoIt) 104 pPostStepPoint->SetTouchableHandle(theTouc << 222 pPostStepPoint->SetTouchableHandle( theTouchableHandle ); 105 223 106 pPostStepPoint->SetMaterial(theMaterialCha << 224 pPostStepPoint->SetMaterial( theMaterialChange ); 107 pPostStepPoint->SetMaterialCutsCouple(theM << 225 pPostStepPoint->SetMaterialCutsCouple( theMaterialCutsCoupleChange ); 108 pPostStepPoint->SetSensitiveDetector(theSe << 226 pPostStepPoint->SetSensitiveDetector( theSensitiveDetectorChange ); 109 } 227 } 110 if(this->GetFirstStepInVolume()) << 228 if( this->GetFirstStepInVolume() ){ 111 { << 112 pStep->SetFirstStepFlag(); 229 pStep->SetFirstStepFlag(); 113 } << 230 }else{ 114 else << 231 pStep->ClearFirstStepFlag(); 115 { << 232 } 116 pStep->ClearFirstStepFlag(); << 233 if( this->GetLastStepInVolume() ){ 117 } << 118 if(this->GetLastStepInVolume()) << 119 { << 120 pStep->SetLastStepFlag(); 234 pStep->SetLastStepFlag(); 121 } << 235 }else{ 122 else << 236 pStep->ClearLastStepFlag(); 123 { << 124 pStep->ClearLastStepFlag(); << 125 } 237 } 126 // It used to call base class's method 238 // It used to call base class's method 127 // - but this would copy uninitialised dat 239 // - but this would copy uninitialised data members 128 // return G4ParticleChange::UpdateStepForPos 240 // return G4ParticleChange::UpdateStepForPostStep(pStep); 129 241 130 // Copying what the base class does would in 242 // Copying what the base class does would instead 131 // - also not useful 243 // - also not useful 132 // return G4VParticleChange::UpdateStepInfo( 244 // return G4VParticleChange::UpdateStepInfo(pStep); 133 245 134 return pStep; 246 return pStep; 135 } 247 } 136 248 137 // ------------------------------------------- << 249 >> 250 //---------------------------------------------------------------- >> 251 // methods for printing messages >> 252 // >> 253 138 void G4ParticleChangeForTransport::DumpInfo() 254 void G4ParticleChangeForTransport::DumpInfo() const 139 { 255 { 140 // use base-class DumpInfo << 256 // use base-class DumpInfo 141 G4ParticleChange::DumpInfo(); 257 G4ParticleChange::DumpInfo(); 142 G4cout << " Touchable (pointer) : " < << 258 143 << theTouchableHandle() << G4endl; << 259 G4int oldprc = G4cout.precision(3); >> 260 G4cout << " Touchable (pointer) : " >> 261 << std::setw(20) << theTouchableHandle() << G4endl; >> 262 G4cout.precision(oldprc); 144 } 263 } >> 264 145 265