source: trunk/source/tracking/src/G4SteppingManager.cc @ 1250

Last change on this file since 1250 was 1228, checked in by garnier, 14 years ago

update geant4.9.3 tag

File size: 12.0 KB
Line 
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//
27// $Id: G4SteppingManager.cc,v 1.50 2009/02/27 08:09:50 tsasaki Exp $
28// GEANT4 tag $Name: geant4-09-03 $
29//
30//---------------------------------------------------------------
31//
32// G4SteppingManager.cc
33//
34// Description:
35//   This class represents the manager who steers to move the give
36//   particle from the TrackingManger by one Step.
37//
38// Contact:
39//   Questions and comments to this code should be sent to
40//     Katsuya Amako  (e-mail: Katsuya.Amako@kek.jp)
41//     Takashi Sasaki (e-mail: Takashi.Sasaki@kek.jp)
42//
43//---------------------------------------------------------------
44
45#include "G4SteppingManager.hh"
46#include "G4SteppingVerbose.hh"
47#include "G4UImanager.hh"
48#include "G4ForceCondition.hh"
49#include "G4GPILSelection.hh"
50#include "G4SteppingControl.hh"
51#include "G4TransportationManager.hh"
52#include "G4UserLimits.hh"
53#include "G4VSensitiveDetector.hh"    // Include from 'hits/digi'
54#include "G4GeometryTolerance.hh"
55
56//////////////////////////////////////
57G4SteppingManager::G4SteppingManager()
58//////////////////////////////////////
59  : fUserSteppingAction(NULL), verboseLevel(0)
60{
61
62// Construct simple 'has-a' related objects
63   fStep = new G4Step();
64   fSecondary = fStep->NewSecondaryVector();
65   fPreStepPoint  = fStep->GetPreStepPoint();
66   fPostStepPoint = fStep->GetPostStepPoint();
67#ifdef G4VERBOSE
68   if(G4VSteppingVerbose::GetInstance()==0) {
69     fVerbose =  new G4SteppingVerbose();
70     G4VSteppingVerbose::SetInstance(fVerbose);
71     fVerbose -> SetManager(this);
72     KillVerbose = true;
73   }
74   else { 
75      fVerbose = G4VSteppingVerbose::GetInstance();
76      fVerbose -> SetManager(this);
77      KillVerbose = false;
78   }
79#endif
80   SetNavigator(G4TransportationManager::GetTransportationManager()
81                   ->GetNavigatorForTracking());
82
83   fSelectedAtRestDoItVector
84      = new G4SelectedAtRestDoItVector(SizeOfSelectedDoItVector,0);
85   fSelectedAlongStepDoItVector
86      = new G4SelectedAlongStepDoItVector(SizeOfSelectedDoItVector,0);
87   fSelectedPostStepDoItVector
88      = new G4SelectedPostStepDoItVector(SizeOfSelectedDoItVector,0);
89
90   SetNavigator(G4TransportationManager::GetTransportationManager()
91     ->GetNavigatorForTracking());
92
93   physIntLength = DBL_MAX; 
94   kCarTolerance = 0.5*G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();
95}
96
97///////////////////////////////////////
98G4SteppingManager::~G4SteppingManager()
99///////////////////////////////////////
100{
101
102// Destruct simple 'has-a' objects
103   fStep->DeleteSecondaryVector();
104///////////////////////////   delete fSecondary;
105   delete fStep;
106   delete fSelectedAtRestDoItVector;
107   delete fSelectedAlongStepDoItVector;
108   delete fSelectedPostStepDoItVector;
109   if (fUserSteppingAction) delete fUserSteppingAction;
110#ifdef G4VERBOSE
111   if(KillVerbose) delete fVerbose;
112#endif
113}
114
115
116//////////////////////////////////////////
117G4StepStatus G4SteppingManager::Stepping()
118//////////////////////////////////////////
119{
120
121//--------
122// Prelude
123//--------
124#ifdef G4VERBOSE
125            // !!!!! Verbose
126             if(verboseLevel>0) fVerbose->NewStep();
127             else 
128             if(verboseLevel==-1) { 
129                 G4VSteppingVerbose::SetSilent(1);
130             }
131             else
132                 G4VSteppingVerbose::SetSilent(0);
133#endif
134
135// Store last PostStepPoint to PreStepPoint, and swap current and nex
136// volume information of G4Track. Reset total energy deposit in one Step.
137   fStep->CopyPostToPreStepPoint();
138   fStep->ResetTotalEnergyDeposit();
139
140// Switch next touchable in track to current one
141   fTrack->SetTouchableHandle(fTrack->GetNextTouchableHandle());
142
143// Reset the secondary particles
144   fN2ndariesAtRestDoIt = 0;
145   fN2ndariesAlongStepDoIt = 0;
146   fN2ndariesPostStepDoIt = 0;
147
148//JA Set the volume before it is used (in DefineStepLength() for User Limit)
149   fCurrentVolume = fStep->GetPreStepPoint()->GetPhysicalVolume();
150
151// Reset the step's auxiliary points vector pointer
152   fStep->SetPointerToVectorOfAuxiliaryPoints(0);
153
154//-----------------
155// AtRest Processes
156//-----------------
157
158   if( fTrack->GetTrackStatus() == fStopButAlive ){
159     if( MAXofAtRestLoops>0 ){
160        InvokeAtRestDoItProcs();
161        fStepStatus = fAtRestDoItProc;
162        fStep->GetPostStepPoint()->SetStepStatus( fStepStatus );
163       
164#ifdef G4VERBOSE
165            // !!!!! Verbose
166             if(verboseLevel>0) fVerbose->AtRestDoItInvoked();
167#endif
168
169     }
170     // Make sure the track is killed
171     fTrack->SetTrackStatus( fStopAndKill );
172   }
173
174//---------------------------------
175// AlongStep and PostStep Processes
176//---------------------------------
177
178
179   else{
180     // Find minimum Step length demanded by active disc./cont. processes
181     DefinePhysicalStepLength();
182
183     // Store the Step length (geometrical length) to G4Step and G4Track
184     fStep->SetStepLength( PhysicalStep );
185     fTrack->SetStepLength( PhysicalStep );
186     G4double GeomStepLength = PhysicalStep;
187
188     // Store StepStatus to PostStepPoint
189     fStep->GetPostStepPoint()->SetStepStatus( fStepStatus );
190
191     // Invoke AlongStepDoIt
192     InvokeAlongStepDoItProcs();
193
194     // Update track by taking into account all changes by AlongStepDoIt
195     fStep->UpdateTrack();
196
197     // Update safety after invocation of all AlongStepDoIts
198     endpointSafOrigin= fPostStepPoint->GetPosition();
199//     endpointSafety=  std::max( proposedSafety - GeomStepLength, 0.);
200     endpointSafety=  std::max( proposedSafety - GeomStepLength, kCarTolerance);
201
202     fStep->GetPostStepPoint()->SetSafety( endpointSafety );
203
204#ifdef G4VERBOSE
205                         // !!!!! Verbose
206           if(verboseLevel>0) fVerbose->AlongStepDoItAllDone();
207#endif
208
209     // Invoke PostStepDoIt
210     InvokePostStepDoItProcs();
211
212#ifdef G4VERBOSE
213                 // !!!!! Verbose
214     if(verboseLevel>0) fVerbose->PostStepDoItAllDone();
215#endif
216   }
217
218//-------
219// Finale
220//-------
221
222// Update 'TrackLength' and remeber the Step length of the current Step
223   fTrack->AddTrackLength(fStep->GetStepLength());
224   fPreviousStepSize = fStep->GetStepLength();
225   fStep->SetTrack(fTrack);
226#ifdef G4VERBOSE
227                         // !!!!! Verbose
228
229           if(verboseLevel>0) fVerbose->StepInfo();
230#endif
231// Send G4Step information to Hit/Dig if the volume is sensitive
232   fCurrentVolume = fStep->GetPreStepPoint()->GetPhysicalVolume();
233   StepControlFlag =  fStep->GetControlFlag();
234   if( fCurrentVolume != 0 && StepControlFlag != AvoidHitInvocation) {
235      fSensitive = fStep->GetPreStepPoint()->
236                                   GetSensitiveDetector();
237      if( fSensitive != 0 ) {
238        fSensitive->Hit(fStep);
239      }
240   }
241
242// User intervention process.
243   if( fUserSteppingAction != NULL ) {
244      fUserSteppingAction->UserSteppingAction(fStep);
245   }
246   G4UserSteppingAction* regionalAction
247    = fStep->GetPreStepPoint()->GetPhysicalVolume()->GetLogicalVolume()->GetRegion()
248      ->GetRegionalSteppingAction();
249   if( regionalAction ) regionalAction->UserSteppingAction(fStep);
250
251// Stepping process finish. Return the value of the StepStatus.
252   return fStepStatus;
253
254}
255
256///////////////////////////////////////////////////////////
257void G4SteppingManager::SetInitialStep(G4Track* valueTrack)
258///////////////////////////////////////////////////////////
259{
260
261// Set up several local variables.
262   PreStepPointIsGeom = false;
263   FirstStep = true;
264   fParticleChange = NULL;
265   fPreviousStepSize = 0.;
266   fStepStatus = fUndefined;
267
268   fTrack = valueTrack;
269   Mass = fTrack->GetDynamicParticle()->GetMass();
270
271   PhysicalStep = 0.;
272   GeometricalStep = 0.;
273   CorrectedStep = 0.;
274   PreStepPointIsGeom = false;
275   FirstStep = false;
276   fStepStatus = fUndefined;
277
278   TempInitVelocity = 0.;
279   TempVelocity = 0.;
280   sumEnergyChange = 0.;
281
282
283// If the primary track has 'Suspend' or 'PostponeToNextEvent' state,
284// set the track state to 'Alive'.
285   if( (fTrack->GetTrackStatus()==fSuspend) ||
286       (fTrack->GetTrackStatus()==fPostponeToNextEvent) ){ 
287      fTrack->SetTrackStatus(fAlive);
288   }
289
290// If the primary track has 'zero' kinetic energy, set the track
291// state to 'StopButAlive'.
292   if(fTrack->GetKineticEnergy() <= 0.0){
293      fTrack->SetTrackStatus( fStopButAlive );
294   }
295
296
297// Set Touchable to track and a private attribute of G4SteppingManager
298 
299
300  if ( ! fTrack->GetTouchableHandle() ) {
301     G4ThreeVector direction= fTrack->GetMomentumDirection();
302     fNavigator->LocateGlobalPointAndSetup( fTrack->GetPosition(),
303                                            &direction, false, false );
304     fTouchableHandle = fNavigator->CreateTouchableHistory();
305
306     fTrack->SetTouchableHandle( fTouchableHandle );
307     fTrack->SetNextTouchableHandle( fTouchableHandle );
308  }else{
309     fTrack->SetNextTouchableHandle( fTouchableHandle = fTrack->GetTouchableHandle() );
310     G4VPhysicalVolume* oldTopVolume= fTrack->GetTouchableHandle()->GetVolume();
311     G4VPhysicalVolume* newTopVolume=
312     fNavigator->ResetHierarchyAndLocate( fTrack->GetPosition(), 
313        fTrack->GetMomentumDirection(),
314        *((G4TouchableHistory*)fTrack->GetTouchableHandle()()) );
315//     if(newTopVolume != oldTopVolume ){
316     if(newTopVolume != oldTopVolume || oldTopVolume->GetRegularStructureId() == 1 ) { 
317        fTouchableHandle = fNavigator->CreateTouchableHistory();
318        fTrack->SetTouchableHandle( fTouchableHandle );
319        fTrack->SetNextTouchableHandle( fTouchableHandle );
320     }
321  }
322// Set vertex information of G4Track at here
323   if ( fTrack->GetCurrentStepNumber() == 0 ) {
324     fTrack->SetVertexPosition( fTrack->GetPosition() );
325     fTrack->SetVertexMomentumDirection( fTrack->GetMomentumDirection() );
326     fTrack->SetVertexKineticEnergy( fTrack->GetKineticEnergy() );
327     fTrack->SetLogicalVolumeAtVertex( fTrack->GetVolume()->GetLogicalVolume() );
328   }
329// Initial set up for attributes of 'G4SteppingManager'
330   fCurrentVolume = fTouchableHandle->GetVolume();
331
332// If track is already outside the world boundary, kill it
333   if( fCurrentVolume==0 ){
334       // If the track is a primary, stop processing
335       if(fTrack->GetParentID()==0)
336       {
337        G4cerr << "Primary particle starting at "
338               << fTrack->GetPosition()
339               << " is outside of the world volume." << G4endl;
340        G4Exception("G4SteppingManager::Primary vertex outside of the world");
341       }
342
343       fTrack->SetTrackStatus( fStopAndKill );
344       G4cerr << "G4SteppingManager::SetInitialStep(): warning: "
345              << "initial track position is outside world! "
346              << fTrack->GetPosition() << G4endl;
347   }
348   else {
349// Initial set up for attribues of 'Step'
350       fStep->InitializeStep( fTrack );
351   }
352#ifdef G4VERBOSE
353                         // !!!!! Verbose
354           if(verboseLevel>0) fVerbose->TrackingStarted();
355#endif
356}
357
Note: See TracBrowser for help on using the repository browser.