check for max number of steps moved from AliSteppingAction here
[u/mrichter/AliRoot.git] / TGeant4 / TG4SteppingAction.cxx
index 6c8a3d4365a28fa28f59255e8c2899fe323419e3..07dcaec197570be1f247ef012c0602129e24833a 100644 (file)
@@ -7,7 +7,15 @@
 #include "TG4VSensitiveDetector.h"
 #include "TG4Globals.h"
 
-TG4SteppingAction::TG4SteppingAction() {
+#include <G4Track.hh>
+#include <G4SteppingManager.hh>
+
+TG4SteppingAction::TG4SteppingAction() 
+  : fMaxNofSteps(kMaxNofSteps),
+    fStandardVerboseLevel(0),
+    fLoopVerboseLevel(1),
+    fLoopStepCounter(0)
+ {
 //
 }
 
@@ -33,6 +41,59 @@ TG4SteppingAction::operator=(const TG4SteppingAction &right)
   return *this;
 }
 
+// protected methods
+
+void TG4SteppingAction::PrintTrackInfo(const G4Track* track) const
+{
+// Prints the track info
+// - taken from private G4TrackingManager::Verbose()
+// and the standard header for verbose tracking
+// - taken from G4SteppingVerbose::TrackingStarted().
+// ---
+
+  // print track info
+  G4cout << G4endl;
+  G4cout << "*******************************************************"
+         << "**************************************************"
+         << G4endl;
+  G4cout << "* G4Track Information: " 
+         << "  Particle = " << track->GetDefinition()->GetParticleName() 
+         << "," 
+        << "   Track ID = " << track->GetTrackID() 
+         << "," 
+        << "   Parent ID = " << track->GetParentID() 
+         << G4endl;
+  G4cout << "*******************************************************"
+         << "**************************************************"
+         << G4endl;
+  G4cout << G4endl;
+      
+  // print header    
+#ifdef G4_USE_G4BESTUNIT_FOR_VERBOSE
+    G4cout << G4std::setw( 5) << "Step#"  << " "
+           << G4std::setw( 8) << "X"      << "     "
+          << G4std::setw( 8) << "Y"      << "     "  
+          << G4std::setw( 8) << "Z"      << "     "
+          << G4std::setw( 9) << "KineE"  << "     "
+          << G4std::setw( 8) << "dE"     << "     "  
+          << G4std::setw(12) << "StepLeng"   << " "  
+          << G4std::setw(12) << "TrackLeng"  << " "
+          << G4std::setw(12) << "NextVolume" << " "
+          << G4std::setw( 8) << "ProcName"   << G4endl;             
+#else
+    G4cout << G4std::setw( 5) << "Step#"      << " "
+          << G4std::setw( 8) << "X(mm)"      << " "
+          << G4std::setw( 8) << "Y(mm)"      << " "  
+          << G4std::setw( 8) << "Z(mm)"      << " "
+          << G4std::setw( 9) << "KinE(MeV)"  << " "
+          << G4std::setw( 8) << "dE(MeV)"    << " "  
+          << G4std::setw( 8) << "StepLeng"   << " "  
+          << G4std::setw( 9) << "TrackLeng"  << " "
+          << G4std::setw(11) << "NextVolume" << " "
+          << G4std::setw( 8) << "ProcName"   << G4endl;             
+#endif
+}
+
 // public methods
 
 void TG4SteppingAction::UserSteppingAction(const G4Step* step)
@@ -40,6 +101,43 @@ void TG4SteppingAction::UserSteppingAction(const G4Step* step)
 // Called by G4 kernel at the end of each step.
 // ---
 
+  G4Track* track = step->GetTrack();  
+
+  // reset parameters at beginning of tracking
+  G4int stepNumber = track->GetCurrentStepNumber();
+  if (stepNumber == 1) { 
+    fStandardVerboseLevel = fpSteppingManager->GetverboseLevel();
+    fLoopStepCounter = 0;
+  }  
+  else if (fLoopStepCounter) {
+      // count steps after detecting looping track
+      fLoopStepCounter++;
+      if (fLoopStepCounter == kMaxNofLoopSteps) {
+
+        // stop the looping track
+        track->SetTrackStatus(fStopAndKill);      
+
+        // reset back parameters
+        fpSteppingManager->SetVerboseLevel(fStandardVerboseLevel);
+        fLoopStepCounter = 0;
+      } 
+    }  
+    else if (stepNumber> fMaxNofSteps) { 
+      
+       // print looping info
+       if (fLoopVerboseLevel > 0) {
+          G4cout << "*** Particle reached max step number ("
+                << fMaxNofSteps << "). ***" << G4endl;
+         if (fStandardVerboseLevel == 0) PrintTrackInfo(track);
+       }       
+
+       // set loop verbose level 
+       fpSteppingManager->SetVerboseLevel(fLoopVerboseLevel);
+      
+       // start looping counter
+       fLoopStepCounter++;
+    }
+      
   // call stepping action of derived class
   SteppingAction(step);