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 TG4SpecialControls::TG4SpecialControls(const G4String& aName)
15 fSwitchControls(kUnswitch)
19 G4cout << GetProcessName() << " is created "<< G4endl;
23 TG4SpecialControls::TG4SpecialControls(const TG4SpecialControls& right) {
25 TG4Globals::Exception(
26 "TG4SpecialControls is protected from copying.");
29 TG4SpecialControls::~TG4SpecialControls() {
35 TG4SpecialControls& TG4SpecialControls::operator=(
36 const TG4SpecialControls& right)
38 // check assignement to self
39 if (this == &right) return *this;
41 TG4Globals::Exception(
42 "TG4SpecialControls is protected from assigning.");
49 G4double TG4SpecialControls::PostStepGetPhysicalInteractionLength(
50 const G4Track& track, G4double previousStepSize,
51 G4ForceCondition* condition)
53 // Returns the Step-size (actual length) which is allowed
57 *condition = NotForced;
59 G4double proposedStep = DBL_MAX;
60 G4double minStep = (1.0e-9)*m;
61 // must be greater than DBL_MIN - so that particle can get out of
63 // proposedStep = 0.; causes navigator to fall into panic
66 = track.GetStep()->GetPreStepPoint()->GetStepStatus();
68 = (TG4Limits*) track.GetVolume()->GetLogicalVolume()->GetUserLimits();
70 if (fSwitchControls != kUnswitch) {
71 if (status == fGeomBoundary) {
72 if ((limits) && (limits->IsControl())) {
73 // particle is exiting a logical volume with special controls
74 // and entering another logical volume with special controls
75 proposedStep = minStep;
76 fSwitchControls = kReswitch;
77 if (verboseLevel>0) G4cout << "kReswitch" << G4endl;
80 // particle is exiting a logical volume with special controls
81 // and entering a logical volume without special controls
82 proposedStep = minStep;
83 fSwitchControls = kUnswitch;
84 if (verboseLevel>0) G4cout << "kUnswitch" << G4endl;
88 else if ((limits) && (limits->IsControl())) {
89 // particle is entering a logical volume with special controls
90 // that have not yet been set
91 proposedStep = minStep;
92 fSwitchControls = kSwitch;
93 if (verboseLevel>0) G4cout << "kSwitch" << G4endl;
98 G4VParticleChange* TG4SpecialControls::PostStepDoIt(
99 const G4Track& track, const G4Step& step)
101 // Changes processes activation of the current track
102 // according to the current user limits.
106 = (TG4Limits*) track.GetVolume()->GetLogicalVolume()->GetUserLimits();
108 G4ProcessManager* processManager
109 = track.GetDefinition()->GetProcessManager();
110 G4ProcessVector* processVector = processManager->GetProcessList();
111 // processManager->DumpInfo();
113 if ((fSwitchControls==kUnswitch) || (fSwitchControls==kReswitch)) {
114 // set processes activation back
115 for (G4int i=0; i<fSwitchedProcesses.entries(); i++) {
116 if (verboseLevel>0) {
117 G4cout << "Reset process activation back in"
118 << track.GetVolume()->GetName()
122 ->SetProcessActivation(fSwitchedProcesses[i],fSwitchedControls[i]);
124 fSwitchedProcesses.clear();
125 fSwitchedControls.clear();
128 if ((fSwitchControls==kSwitch) || (fSwitchControls==kReswitch)) {
129 // set TG4Limits processes controls
130 for (G4int i=0; i<processManager->GetProcessListLength(); i++) {
131 G4int control = limits->GetControl((*processVector)[i]);
132 if (control != kUnset) {
133 // store the current processes controls;
134 fSwitchedProcesses.insert((*processVector)[i]);
135 //fSwitchedControls.insert(processManager->GetProcessActivation(i));
136 fSwitchedControls.push_back(processManager->GetProcessActivation(i));
137 if (control == kInActivate) {
138 if (verboseLevel>0) {
139 G4cout << "Set process inactivation for "
140 << (*processVector)[i]->GetProcessName() << " in "
141 << track.GetVolume()->GetName()
144 processManager->SetProcessActivation(i,false);
147 // ((control == kActivate) || (control == kActivate2))
148 if (verboseLevel>0) {
149 G4cout << "Set process activation for "
150 << (*processVector)[i]->GetProcessName() << " in "
151 << track.GetVolume()->GetName()
154 processManager->SetProcessActivation(i,true);
159 // processManager->DumpInfo();
160 aParticleChange.Initialize(track);
161 aParticleChange.SetStatusChange(fAlive);
162 return &aParticleChange;