4 // See the class description in the header file.
6 #include "TG4SpecialControls.h"
9 #include <G4StepStatus.hh>
10 #include <G4ProcessManager.hh>
11 #include <G4ProcessVector.hh>
13 //_____________________________________________________________________________
14 TG4SpecialControls::TG4SpecialControls(const G4String& aName)
16 fSwitchControls(kUnswitch)
20 G4cout << GetProcessName() << " is created "<< G4endl;
24 //_____________________________________________________________________________
25 TG4SpecialControls::TG4SpecialControls(const TG4SpecialControls& right) {
27 TG4Globals::Exception(
28 "TG4SpecialControls is protected from copying.");
31 //_____________________________________________________________________________
32 TG4SpecialControls::~TG4SpecialControls() {
38 //_____________________________________________________________________________
39 TG4SpecialControls& TG4SpecialControls::operator=(
40 const TG4SpecialControls& right)
42 // check assignement to self
43 if (this == &right) return *this;
45 TG4Globals::Exception(
46 "TG4SpecialControls is protected from assigning.");
53 //_____________________________________________________________________________
54 G4double TG4SpecialControls::PostStepGetPhysicalInteractionLength(
55 const G4Track& track, G4double previousStepSize,
56 G4ForceCondition* condition)
58 // Returns the Step-size (actual length) which is allowed
62 *condition = NotForced;
64 G4double proposedStep = DBL_MAX;
65 G4double minStep = (1.0e-9)*m;
66 // must be greater than DBL_MIN - so that particle can get out of
68 // proposedStep = 0.; causes navigator to fall into panic
71 = track.GetStep()->GetPreStepPoint()->GetStepStatus();
73 = (TG4Limits*) track.GetVolume()->GetLogicalVolume()->GetUserLimits();
75 if (fSwitchControls != kUnswitch) {
76 if (status == fGeomBoundary) {
77 if ((limits) && (limits->IsControl())) {
78 // particle is exiting a logical volume with special controls
79 // and entering another logical volume with special controls
80 proposedStep = minStep;
81 fSwitchControls = kReswitch;
82 if (verboseLevel>0) G4cout << "kReswitch" << G4endl;
85 // particle is exiting a logical volume with special controls
86 // and entering a logical volume without special controls
87 proposedStep = minStep;
88 fSwitchControls = kUnswitch;
89 if (verboseLevel>0) G4cout << "kUnswitch" << G4endl;
93 else if ((limits) && (limits->IsControl())) {
94 // particle is entering a logical volume with special controls
95 // that have not yet been set
96 proposedStep = minStep;
97 fSwitchControls = kSwitch;
98 if (verboseLevel>0) G4cout << "kSwitch" << G4endl;
103 //_____________________________________________________________________________
104 G4VParticleChange* TG4SpecialControls::PostStepDoIt(
105 const G4Track& track, const G4Step& step)
107 // Changes processes activation of the current track
108 // according to the current user limits.
112 = (TG4Limits*) track.GetVolume()->GetLogicalVolume()->GetUserLimits();
114 G4ProcessManager* processManager
115 = track.GetDefinition()->GetProcessManager();
116 G4ProcessVector* processVector = processManager->GetProcessList();
117 // processManager->DumpInfo();
119 if ((fSwitchControls==kUnswitch) || (fSwitchControls==kReswitch)) {
120 // set processes activation back
121 for (G4int i=0; i<fSwitchedProcesses.entries(); i++) {
122 if (verboseLevel>0) {
123 G4cout << "Reset process activation back in"
124 << track.GetVolume()->GetName()
128 ->SetProcessActivation(fSwitchedProcesses[i],fSwitchedControls[i]);
130 fSwitchedProcesses.clear();
131 fSwitchedControls.clear();
134 if ((fSwitchControls==kSwitch) || (fSwitchControls==kReswitch)) {
135 // set TG4Limits processes controls
136 for (G4int i=0; i<processManager->GetProcessListLength(); i++) {
137 G4int control = limits->GetControl((*processVector)[i]);
138 if (control != kUnset) {
139 // store the current processes controls;
140 fSwitchedProcesses.insert((*processVector)[i]);
141 //fSwitchedControls.insert(processManager->GetProcessActivation(i));
142 fSwitchedControls.push_back(processManager->GetProcessActivation(i));
143 if (control == kInActivate) {
144 if (verboseLevel>0) {
145 G4cout << "Set process inactivation for "
146 << (*processVector)[i]->GetProcessName() << " in "
147 << track.GetVolume()->GetName()
150 processManager->SetProcessActivation(i,false);
153 // ((control == kActivate) || (control == kActivate2))
154 if (verboseLevel>0) {
155 G4cout << "Set process activation for "
156 << (*processVector)[i]->GetProcessName() << " in "
157 << track.GetVolume()->GetName()
160 processManager->SetProcessActivation(i,true);
165 // processManager->DumpInfo();
166 aParticleChange.Initialize(track);
167 aParticleChange.SetStatusChange(fAlive);
168 return &aParticleChange;