2 // ********************************************************************
3 // * License and Disclaimer *
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. *
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. *
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 // ********************************************************************
27 // $Id: G4Step.icc 79627 2014-03-10 11:20:02Z gcosmo $
30 //---------------------------------------------------------------
32 //-----------------------------------------------------------------
33 // In-line definitions
34 //-----------------------------------------------------------------
38 G4StepPoint* G4Step::GetPreStepPoint() const
40 return fpPreStepPoint;
44 void G4Step::SetPreStepPoint(G4StepPoint* value)
46 delete fpPreStepPoint;
47 fpPreStepPoint = value;
51 G4StepPoint* G4Step::GetPostStepPoint() const
53 return fpPostStepPoint;
57 void G4Step::SetPostStepPoint(G4StepPoint* value)
59 delete fpPostStepPoint;
60 fpPostStepPoint = value;
64 G4double G4Step::GetStepLength() const
70 void G4Step::SetStepLength(G4double value)
76 G4ThreeVector G4Step::GetDeltaPosition() const
78 return fpPostStepPoint->GetPosition()
79 - fpPreStepPoint->GetPosition();
83 G4double G4Step::GetDeltaTime() const
85 return fpPostStepPoint->GetLocalTime()
86 - fpPreStepPoint->GetLocalTime();
91 G4double G4Step::GetTotalEnergyDeposit() const
93 return fTotalEnergyDeposit;
97 void G4Step::SetTotalEnergyDeposit(G4double value)
99 fTotalEnergyDeposit = value;
103 G4double G4Step::GetNonIonizingEnergyDeposit() const
105 return fNonIonizingEnergyDeposit;
109 void G4Step::SetNonIonizingEnergyDeposit(G4double value)
111 fNonIonizingEnergyDeposit = value;
115 void G4Step::AddTotalEnergyDeposit(G4double value)
117 fTotalEnergyDeposit += value;
121 void G4Step::ResetTotalEnergyDeposit()
123 fTotalEnergyDeposit = 0.;
124 fNonIonizingEnergyDeposit = 0.;
128 void G4Step::AddNonIonizingEnergyDeposit(G4double value)
130 fNonIonizingEnergyDeposit += value;
134 void G4Step::ResetNonIonizingEnergyDeposit()
136 fNonIonizingEnergyDeposit = 0.;
140 void G4Step::SetControlFlag(G4SteppingControl value)
142 fpSteppingControlFlag = value;
146 G4SteppingControl G4Step::GetControlFlag() const
148 return fpSteppingControlFlag;
152 void G4Step::CopyPostToPreStepPoint( )
154 //This method is called at the beggining of each step
155 *(fpPreStepPoint) = *(fpPostStepPoint);
156 fpPostStepPoint->SetStepStatus(fUndefined);
158 // store number of secondaries
159 nSecondaryByLastStep = fSecondary->size();
163 //-------------------------------------------------------------
164 // To implement bi-directional association between G4Step and
165 // and G4Track, a combined usage of 'forward declaration' and
166 // 'include' is necessary.
167 //-------------------------------------------------------------
168 #include "G4Track.hh"
171 G4Track* G4Step::GetTrack() const
177 void G4Step::SetTrack(G4Track* value)
183 // Other member functions
185 void G4Step::InitializeStep( G4Track* aValue )
187 // Initialize G4Step attributes
189 fTotalEnergyDeposit = 0.;
190 fNonIonizingEnergyDeposit = 0.;
192 fpTrack->SetStepLength(0.);
194 nSecondaryByLastStep = 0;
196 // Initialize G4StepPoint attributes.
197 // To avoid the circular dependency between G4Track, G4Step
198 // and G4StepPoint, G4Step has to manage the copy actions.
199 fpPreStepPoint->SetPosition(fpTrack->GetPosition());
200 fpPreStepPoint->SetGlobalTime(fpTrack->GetGlobalTime());
201 fpPreStepPoint->SetLocalTime(fpTrack->GetLocalTime());
202 fpPreStepPoint->SetProperTime(fpTrack->GetProperTime());
203 fpPreStepPoint->SetMomentumDirection(fpTrack->GetMomentumDirection());
204 fpPreStepPoint->SetKineticEnergy(fpTrack->GetKineticEnergy());
205 fpPreStepPoint->SetTouchableHandle(fpTrack->GetTouchableHandle());
206 fpPreStepPoint->SetMaterial( fpTrack->GetTouchable()->GetVolume()->GetLogicalVolume()->GetMaterial());
207 fpPreStepPoint->SetMaterialCutsCouple( fpTrack->GetTouchable()->GetVolume()->GetLogicalVolume()->GetMaterialCutsCouple());
208 fpPreStepPoint->SetSensitiveDetector( fpTrack->GetTouchable()->GetVolume()->GetLogicalVolume()->GetSensitiveDetector());
209 fpPreStepPoint->SetPolarization(fpTrack->GetPolarization());
210 fpPreStepPoint->SetSafety(0.);
211 fpPreStepPoint->SetStepStatus(fUndefined);
212 fpPreStepPoint->SetProcessDefinedStep(0);
213 fpPreStepPoint->SetMass(fpTrack->GetDynamicParticle()->GetMass());
214 fpPreStepPoint->SetCharge(fpTrack->GetDynamicParticle()->GetCharge());
215 fpPreStepPoint->SetWeight(fpTrack->GetWeight());
218 // should be placed after SetMaterial for preStep point
219 fpPreStepPoint->SetVelocity(fpTrack->CalculateVelocity());
221 (*fpPostStepPoint) = (*fpPreStepPoint);
225 void G4Step::UpdateTrack( )
227 // To avoid the circular dependency between G4Track, G4Step
228 // and G4StepPoint, G4Step has to manage the update actions.
230 fpTrack->SetPosition(fpPostStepPoint->GetPosition());
231 fpTrack->SetGlobalTime(fpPostStepPoint->GetGlobalTime());
232 fpTrack->SetLocalTime(fpPostStepPoint->GetLocalTime());
233 fpTrack->SetProperTime(fpPostStepPoint->GetProperTime());
234 // energy, momentum, polarization
235 fpTrack->SetMomentumDirection(fpPostStepPoint->GetMomentumDirection());
236 fpTrack->SetKineticEnergy(fpPostStepPoint->GetKineticEnergy());
237 fpTrack->SetPolarization(fpPostStepPoint->GetPolarization());
239 G4DynamicParticle* pParticle = (G4DynamicParticle*)(fpTrack->GetDynamicParticle());
240 pParticle->SetMass(fpPostStepPoint->GetMass());
241 pParticle->SetCharge(fpPostStepPoint->GetCharge());
243 fpTrack->SetStepLength(fStepLength);
244 // NextTouchable is updated
245 // (G4Track::Touchable points touchable of Pre-StepPoint)
246 fpTrack->SetNextTouchableHandle(fpPostStepPoint->GetTouchableHandle());
247 fpTrack->SetWeight(fpPostStepPoint->GetWeight());
251 fpTrack->SetVelocity(fpPostStepPoint->GetVelocity());
254 inline const G4TrackVector* G4Step::GetSecondary() const
259 inline G4TrackVector* G4Step::GetfSecondary()
264 inline void G4Step::SetSecondary(G4TrackVector* value)
270 G4TrackVector* G4Step::NewSecondaryVector()
272 fSecondary=new G4TrackVector();
276 inline void G4Step::DeleteSecondaryVector()
278 if (fSecondary !=0) {
285 inline G4bool G4Step::IsFirstStepInVolume() const
287 return fFirstStepInVolume;
290 inline G4bool G4Step::IsLastStepInVolume() const
292 return fLastStepInVolume;
296 inline void G4Step::SetFirstStepFlag()
298 fFirstStepInVolume = true;
301 inline void G4Step::ClearFirstStepFlag()
303 fFirstStepInVolume = false;
306 inline void G4Step::SetLastStepFlag()
308 fLastStepInVolume = true;
311 inline void G4Step::ClearLastStepFlag()
313 fLastStepInVolume = false;