]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TGeant4/TG4SteppingAction.cxx
Enable clusterizing from any Digits branch
[u/mrichter/AliRoot.git] / TGeant4 / TG4SteppingAction.cxx
CommitLineData
6fc5df41 1// $Id$
2// Category: event
3//
e5967ab3 4// Author: I.Hrivnacova
5//
6// Class TG4SteppingAction
7// -----------------------
6fc5df41 8// See the class description in the header file.
9
10#include "TG4SteppingAction.h"
6fc5df41 11#include "TG4VSensitiveDetector.h"
e5967ab3 12#include "TG4SDServices.h"
6fc5df41 13#include "TG4Globals.h"
14
4148f156 15#include <G4Track.hh>
16#include <G4SteppingManager.hh>
17
72095f7c 18//_____________________________________________________________________________
4148f156 19TG4SteppingAction::TG4SteppingAction()
20 : fMaxNofSteps(kMaxNofSteps),
21 fStandardVerboseLevel(0),
22 fLoopVerboseLevel(1),
23 fLoopStepCounter(0)
24 {
6fc5df41 25//
26}
27
72095f7c 28//_____________________________________________________________________________
6fc5df41 29TG4SteppingAction::TG4SteppingAction(const TG4SteppingAction& right) {
30//
31 TG4Globals::Exception("TG4SteppingAction is protected from copying.");
32}
33
72095f7c 34//_____________________________________________________________________________
6fc5df41 35TG4SteppingAction::~TG4SteppingAction() {
36//
37}
38
39// operators
40
72095f7c 41//_____________________________________________________________________________
6fc5df41 42TG4SteppingAction&
43TG4SteppingAction::operator=(const TG4SteppingAction &right)
44{
45 // check assignement to self
46 if (this == &right) return *this;
47
48 TG4Globals::Exception("TG4SteppingAction is protected from assigning.");
49
50 return *this;
51}
52
4148f156 53// protected methods
54
72095f7c 55//_____________________________________________________________________________
4148f156 56void TG4SteppingAction::PrintTrackInfo(const G4Track* track) const
57{
58// Prints the track info
59// - taken from private G4TrackingManager::Verbose()
60// and the standard header for verbose tracking
61// - taken from G4SteppingVerbose::TrackingStarted().
62// ---
63
64 // print track info
65 G4cout << G4endl;
66 G4cout << "*******************************************************"
67 << "**************************************************"
68 << G4endl;
69 G4cout << "* G4Track Information: "
70 << " Particle = " << track->GetDefinition()->GetParticleName()
71 << ","
72 << " Track ID = " << track->GetTrackID()
73 << ","
74 << " Parent ID = " << track->GetParentID()
75 << G4endl;
76 G4cout << "*******************************************************"
77 << "**************************************************"
78 << G4endl;
79 G4cout << G4endl;
80
81 // print header
82#ifdef G4_USE_G4BESTUNIT_FOR_VERBOSE
83 G4cout << G4std::setw( 5) << "Step#" << " "
84 << G4std::setw( 8) << "X" << " "
85 << G4std::setw( 8) << "Y" << " "
86 << G4std::setw( 8) << "Z" << " "
87 << G4std::setw( 9) << "KineE" << " "
88 << G4std::setw( 8) << "dE" << " "
89 << G4std::setw(12) << "StepLeng" << " "
90 << G4std::setw(12) << "TrackLeng" << " "
91 << G4std::setw(12) << "NextVolume" << " "
92 << G4std::setw( 8) << "ProcName" << G4endl;
93#else
94 G4cout << G4std::setw( 5) << "Step#" << " "
95 << G4std::setw( 8) << "X(mm)" << " "
96 << G4std::setw( 8) << "Y(mm)" << " "
97 << G4std::setw( 8) << "Z(mm)" << " "
98 << G4std::setw( 9) << "KinE(MeV)" << " "
99 << G4std::setw( 8) << "dE(MeV)" << " "
100 << G4std::setw( 8) << "StepLeng" << " "
101 << G4std::setw( 9) << "TrackLeng" << " "
102 << G4std::setw(11) << "NextVolume" << " "
103 << G4std::setw( 8) << "ProcName" << G4endl;
104#endif
105}
106
6fc5df41 107// public methods
108
72095f7c 109//_____________________________________________________________________________
6fc5df41 110void TG4SteppingAction::UserSteppingAction(const G4Step* step)
111{
112// Called by G4 kernel at the end of each step.
113// ---
e5967ab3 114
4148f156 115 G4Track* track = step->GetTrack();
116
117 // reset parameters at beginning of tracking
118 G4int stepNumber = track->GetCurrentStepNumber();
119 if (stepNumber == 1) {
120 fStandardVerboseLevel = fpSteppingManager->GetverboseLevel();
121 fLoopStepCounter = 0;
122 }
123 else if (fLoopStepCounter) {
124 // count steps after detecting looping track
125 fLoopStepCounter++;
126 if (fLoopStepCounter == kMaxNofLoopSteps) {
127
128 // stop the looping track
129 track->SetTrackStatus(fStopAndKill);
130
131 // reset back parameters
132 fpSteppingManager->SetVerboseLevel(fStandardVerboseLevel);
133 fLoopStepCounter = 0;
134 }
135 }
136 else if (stepNumber> fMaxNofSteps) {
137
138 // print looping info
139 if (fLoopVerboseLevel > 0) {
140 G4cout << "*** Particle reached max step number ("
141 << fMaxNofSteps << "). ***" << G4endl;
142 if (fStandardVerboseLevel == 0) PrintTrackInfo(track);
143 }
144
145 // set loop verbose level
146 fpSteppingManager->SetVerboseLevel(fLoopVerboseLevel);
147
148 // start looping counter
149 fLoopStepCounter++;
150 }
151
6fc5df41 152 // call stepping action of derived class
153 SteppingAction(step);
154
155 // let sensitive detector process boundary step
156 // if crossing geometry border
157 // (this ensures compatibility with G3 that
158 // makes boundary step of zero length)
159
160 if (step->GetPostStepPoint()->GetStepStatus() == fGeomBoundary &&
c2c02aa6 161 step->GetTrack()->GetTrackStatus() == fAlive &&
6fc5df41 162 step->GetTrack()->GetNextVolume() != 0) {
163
e5967ab3 164#ifdef TGEANT4_DEBUG
165 TG4VSensitiveDetector* tsd
166 = TG4SDServices::Instance()
167 ->GetSensitiveDetector(
168 step->GetPostStepPoint()->GetPhysicalVolume()
169 ->GetLogicalVolume()->GetSensitiveDetector());
170
171 if (tsd) = tsd->ProcessHitsOnBoundary((G4Step*)step);
172#else
173 TG4VSensitiveDetector* tsd
174 = (TG4VSensitiveDetector*) step->GetPostStepPoint()->GetPhysicalVolume()
6fc5df41 175 ->GetLogicalVolume()->GetSensitiveDetector();
176
e5967ab3 177 if (tsd) tsd->ProcessHitsOnBoundary((G4Step*)step);
178#endif
6fc5df41 179 }
180}
181