#include <G4StackManager.hh>
Public Member Functions | |
G4StackManager () | |
~G4StackManager () | |
G4int | PushOneTrack (G4Track *newTrack, G4VTrajectory *newTrajectory=0) |
G4Track * | PopNextTrack (G4VTrajectory **newTrajectory) |
G4int | PrepareNewEvent () |
void | ReClassify () |
void | SetNumberOfAdditionalWaitingStacks (G4int iAdd) |
void | TransferStackedTracks (G4ClassificationOfNewTrack origin, G4ClassificationOfNewTrack destination) |
void | TransferOneStackedTrack (G4ClassificationOfNewTrack origin, G4ClassificationOfNewTrack destination) |
void | clear () |
void | ClearUrgentStack () |
void | ClearWaitingStack (int i=0) |
void | ClearPostponeStack () |
G4int | GetNTotalTrack () const |
G4int | GetNUrgentTrack () const |
G4int | GetNWaitingTrack (int i=0) const |
G4int | GetNPostponedTrack () const |
void | SetVerboseLevel (G4int const value) |
void | SetUserStackingAction (G4UserStackingAction *value) |
Definition at line 62 of file G4StackManager.hh.
G4StackManager::G4StackManager | ( | ) |
Definition at line 39 of file G4StackManager.cc.
00040 :userStackingAction(0),verboseLevel(0),numberOfAdditionalWaitingStacks(0) 00041 { 00042 theMessenger = new G4StackingMessenger(this); 00043 #ifdef G4_USESMARTSTACK 00044 urgentStack = new G4SmartTrackStack; 00045 // G4cout<<"+++ G4StackManager uses G4SmartTrackStack. +++"<<G4endl; 00046 #else 00047 urgentStack = new G4TrackStack(5000); 00048 // G4cout<<"+++ G4StackManager uses ordinary G4TrackStack. +++"<<G4endl; 00049 #endif 00050 waitingStack = new G4TrackStack(1000); 00051 postponeStack = new G4TrackStack(1000); 00052 }
G4StackManager::~G4StackManager | ( | ) |
Definition at line 54 of file G4StackManager.cc.
References G4cout, G4endl, and G4TrackStack::GetMaxNTrack().
00055 { 00056 if(userStackingAction) delete userStackingAction; 00057 00058 if(verboseLevel>0) 00059 { 00060 G4cout << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << G4endl; 00061 G4cout << " Maximum number of tracks in the urgent stack : " << urgentStack->GetMaxNTrack() << G4endl; 00062 G4cout << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << G4endl; 00063 } 00064 delete urgentStack; 00065 delete waitingStack; 00066 delete postponeStack; 00067 delete theMessenger; 00068 if(numberOfAdditionalWaitingStacks>0) { 00069 for(int i=0;i<numberOfAdditionalWaitingStacks;i++) { 00070 delete additionalWaitingStacks[i]; 00071 } 00072 } 00073 }
void G4StackManager::clear | ( | ) |
Definition at line 454 of file G4StackManager.cc.
References ClearUrgentStack(), and ClearWaitingStack().
Referenced by G4EventManager::AbortCurrentEvent().
00455 { 00456 ClearUrgentStack(); 00457 ClearWaitingStack(); 00458 for(int i=1;i<=numberOfAdditionalWaitingStacks;i++) {ClearWaitingStack(i);} 00459 }
void G4StackManager::ClearPostponeStack | ( | ) |
Definition at line 475 of file G4StackManager.cc.
References G4TrackStack::clearAndDestroy().
Referenced by G4StackingMessenger::SetNewValue().
00476 { 00477 postponeStack->clearAndDestroy(); 00478 }
void G4StackManager::ClearUrgentStack | ( | ) |
Definition at line 461 of file G4StackManager.cc.
References G4TrackStack::clearAndDestroy().
Referenced by clear(), and G4StackingMessenger::SetNewValue().
00462 { 00463 urgentStack->clearAndDestroy(); 00464 }
void G4StackManager::ClearWaitingStack | ( | int | i = 0 |
) |
Definition at line 466 of file G4StackManager.cc.
References G4TrackStack::clearAndDestroy().
Referenced by clear(), and G4StackingMessenger::SetNewValue().
00467 { 00468 if(i==0) { 00469 waitingStack->clearAndDestroy(); 00470 } else { 00471 if(i<=numberOfAdditionalWaitingStacks) additionalWaitingStacks[i-1]->clearAndDestroy(); 00472 } 00473 }
G4int G4StackManager::GetNPostponedTrack | ( | ) | const |
Definition at line 501 of file G4StackManager.cc.
References G4TrackStack::GetNTrack().
Referenced by PrepareNewEvent(), and G4StackingMessenger::SetNewValue().
00502 { 00503 return postponeStack->GetNTrack(); 00504 }
G4int G4StackManager::GetNTotalTrack | ( | ) | const |
Definition at line 480 of file G4StackManager.cc.
References G4TrackStack::GetNTrack(), and CLHEP::detail::n.
00481 { 00482 int n = urgentStack->GetNTrack() + waitingStack->GetNTrack() + postponeStack->GetNTrack(); 00483 for(int i=1;i<=numberOfAdditionalWaitingStacks;i++) {n += additionalWaitingStacks[i-1]->GetNTrack();} 00484 return n; 00485 }
G4int G4StackManager::GetNUrgentTrack | ( | ) | const |
Definition at line 487 of file G4StackManager.cc.
References G4TrackStack::GetNTrack().
Referenced by PopNextTrack(), PushOneTrack(), ReClassify(), and G4StackingMessenger::SetNewValue().
00488 { 00489 return urgentStack->GetNTrack(); 00490 }
G4int G4StackManager::GetNWaitingTrack | ( | int | i = 0 |
) | const |
Definition at line 492 of file G4StackManager.cc.
References G4TrackStack::GetNTrack().
Referenced by PopNextTrack(), and G4StackingMessenger::SetNewValue().
00493 { 00494 if(i==0) { return waitingStack->GetNTrack(); } 00495 else { 00496 if(i<=numberOfAdditionalWaitingStacks) { return additionalWaitingStacks[i-1]->GetNTrack();} 00497 } 00498 return 0; 00499 }
G4Track * G4StackManager::PopNextTrack | ( | G4VTrajectory ** | newTrajectory | ) |
Definition at line 135 of file G4StackManager.cc.
References G4cout, G4endl, GetNUrgentTrack(), GetNWaitingTrack(), G4Track::GetParentID(), G4StackedTrack::GetTrack(), G4Track::GetTrackID(), G4StackedTrack::GetTrajectory(), G4UserStackingAction::NewStage(), G4TrackStack::PopFromStack(), and G4TrackStack::TransferTo().
00136 { 00137 #ifdef G4VERBOSE 00138 if( verboseLevel > 1 ) 00139 { 00140 G4cout << "### pop requested out of " 00141 << GetNUrgentTrack() << " stacked tracks." << G4endl; 00142 } 00143 #endif 00144 00145 while( GetNUrgentTrack() == 0 ) 00146 { 00147 #ifdef G4VERBOSE 00148 if( verboseLevel > 1 ) G4cout << "### " << GetNWaitingTrack() 00149 << " waiting tracks are re-classified to" << G4endl; 00150 #endif 00151 waitingStack->TransferTo(urgentStack); 00152 if(numberOfAdditionalWaitingStacks>0) { 00153 for(int i=0;i<numberOfAdditionalWaitingStacks;i++) { 00154 if(i==0) { 00155 additionalWaitingStacks[0]->TransferTo(waitingStack); 00156 } else { 00157 additionalWaitingStacks[i]->TransferTo(additionalWaitingStacks[i-1]); 00158 } 00159 } 00160 } 00161 if(userStackingAction) userStackingAction->NewStage(); 00162 #ifdef G4VERBOSE 00163 if( verboseLevel > 1 ) G4cout << " " << GetNUrgentTrack() 00164 << " urgent tracks and " << GetNWaitingTrack() 00165 << " waiting tracks." << G4endl; 00166 #endif 00167 if( ( GetNUrgentTrack()==0 ) && ( GetNWaitingTrack()==0 ) ) return 0; 00168 } 00169 00170 G4StackedTrack selectedStackedTrack = urgentStack->PopFromStack(); 00171 G4Track * selectedTrack = selectedStackedTrack.GetTrack(); 00172 *newTrajectory = selectedStackedTrack.GetTrajectory(); 00173 00174 #ifdef G4VERBOSE 00175 if( verboseLevel > 2 ) 00176 { 00177 G4cout << "Selected G4StackedTrack : " << &selectedStackedTrack 00178 << " with G4Track " << selectedStackedTrack.GetTrack() 00179 << " (trackID " << selectedStackedTrack.GetTrack()->GetTrackID() 00180 << ", parentID " << selectedStackedTrack.GetTrack()->GetParentID() 00181 << ")" << G4endl; 00182 } 00183 #endif 00184 00185 return selectedTrack; 00186 }
G4int G4StackManager::PrepareNewEvent | ( | ) |
Definition at line 232 of file G4StackManager.cc.
References G4UserStackingAction::ClassifyNewTrack(), G4TrackStack::clearAndDestroy(), FatalException, fKill, fPostpone, fUrgent, fWaiting, G4cout, G4endl, G4Exception(), GetNPostponedTrack(), G4TrackStack::GetNTrack(), G4StackedTrack::GetTrack(), G4StackedTrack::GetTrajectory(), G4TrackStack::PopFromStack(), G4UserStackingAction::PrepareNewEvent(), G4TrackStack::PushToStack(), G4Track::SetParentID(), G4Track::SetTrackID(), and G4TrackStack::TransferTo().
00233 { 00234 if(userStackingAction) userStackingAction->PrepareNewEvent(); 00235 00236 urgentStack->clearAndDestroy(); // Set the urgentStack in a defined state. Not doing it would affect reproducibility. 00237 00238 G4int n_passedFromPrevious = 0; 00239 00240 if( GetNPostponedTrack() > 0 ) 00241 { 00242 #ifdef G4VERBOSE 00243 if( verboseLevel > 1 ) 00244 { 00245 G4cout << GetNPostponedTrack() 00246 << " postponed tracked are now shifted to the stack." << G4endl; 00247 } 00248 #endif 00249 00250 G4StackedTrack aStackedTrack; 00251 G4TrackStack tmpStack; 00252 00253 postponeStack->TransferTo(&tmpStack); 00254 00255 while( tmpStack.GetNTrack() > 0 ) 00256 { 00257 aStackedTrack=tmpStack.PopFromStack(); 00258 G4Track* aTrack = aStackedTrack.GetTrack(); 00259 aTrack->SetParentID(-1); 00260 G4ClassificationOfNewTrack classification; 00261 if(userStackingAction) 00262 { classification = userStackingAction->ClassifyNewTrack( aTrack ); } 00263 else 00264 { classification = DefaultClassification( aTrack ); } 00265 00266 if(classification==fKill) 00267 { 00268 delete aTrack; 00269 delete aStackedTrack.GetTrajectory(); 00270 } 00271 else 00272 { 00273 aTrack->SetTrackID(-(++n_passedFromPrevious)); 00274 switch (classification) 00275 { 00276 case fUrgent: 00277 urgentStack->PushToStack( aStackedTrack ); 00278 break; 00279 case fWaiting: 00280 waitingStack->PushToStack( aStackedTrack ); 00281 break; 00282 case fPostpone: 00283 postponeStack->PushToStack( aStackedTrack ); 00284 break; 00285 default: 00286 G4int i = classification - 10; 00287 if(i<1||i>numberOfAdditionalWaitingStacks) { 00288 G4ExceptionDescription ED; 00289 ED << "invalid classification " << classification << G4endl; 00290 G4Exception("G4StackManager::PrepareNewEvent","Event0053", 00291 FatalException,ED); 00292 } else { 00293 additionalWaitingStacks[i-1]->PushToStack( aStackedTrack ); 00294 } 00295 break; 00296 } 00297 } 00298 } 00299 } 00300 00301 return n_passedFromPrevious; 00302 }
G4int G4StackManager::PushOneTrack | ( | G4Track * | newTrack, | |
G4VTrajectory * | newTrajectory = 0 | |||
) |
Definition at line 82 of file G4StackManager.cc.
References G4UserStackingAction::ClassifyNewTrack(), FatalException, fKill, fPostpone, fUrgent, fWaiting, G4cout, G4endl, G4Exception(), GetNUrgentTrack(), G4Track::GetParentID(), G4Track::GetTrackID(), and G4TrackStack::PushToStack().
00083 { 00084 G4ClassificationOfNewTrack classification; 00085 if(userStackingAction) 00086 { classification = userStackingAction->ClassifyNewTrack( newTrack ); } 00087 else 00088 { classification = DefaultClassification( newTrack ); } 00089 00090 if(classification==fKill) // delete newTrack without stacking 00091 { 00092 #ifdef G4VERBOSE 00093 if( verboseLevel > 1 ) 00094 { 00095 G4cout << " ---> G4Track " << newTrack << " (trackID " 00096 << newTrack->GetTrackID() << ", parentID " 00097 << newTrack->GetParentID() << ") is not to be stored." << G4endl; 00098 } 00099 #endif 00100 delete newTrack; 00101 delete newTrajectory; 00102 } 00103 else 00104 { 00105 G4StackedTrack newStackedTrack( newTrack, newTrajectory ); 00106 switch (classification) 00107 { 00108 case fUrgent: 00109 urgentStack->PushToStack( newStackedTrack ); 00110 break; 00111 case fWaiting: 00112 waitingStack->PushToStack( newStackedTrack ); 00113 break; 00114 case fPostpone: 00115 postponeStack->PushToStack( newStackedTrack ); 00116 break; 00117 default: 00118 G4int i = classification - 10; 00119 if(i<1||i>numberOfAdditionalWaitingStacks) { 00120 G4ExceptionDescription ED; 00121 ED << "invalid classification " << classification << G4endl; 00122 G4Exception("G4StackManager::PushOneTrack","Event0051", 00123 FatalException,ED); 00124 } else { 00125 additionalWaitingStacks[i-1]->PushToStack( newStackedTrack ); 00126 } 00127 break; 00128 } 00129 } 00130 00131 return GetNUrgentTrack(); 00132 }
void G4StackManager::ReClassify | ( | ) |
Definition at line 188 of file G4StackManager.cc.
References G4UserStackingAction::ClassifyNewTrack(), FatalException, fKill, fPostpone, fUrgent, fWaiting, G4endl, G4Exception(), G4TrackStack::GetNTrack(), GetNUrgentTrack(), G4StackedTrack::GetTrack(), G4StackedTrack::GetTrajectory(), G4TrackStack::PopFromStack(), G4TrackStack::PushToStack(), and G4TrackStack::TransferTo().
00189 { 00190 G4StackedTrack aStackedTrack; 00191 G4TrackStack tmpStack; 00192 00193 if( !userStackingAction ) return; 00194 if( GetNUrgentTrack() == 0 ) return; 00195 00196 urgentStack->TransferTo(&tmpStack); 00197 while( tmpStack.GetNTrack() > 0 ) 00198 { 00199 aStackedTrack=tmpStack.PopFromStack(); 00200 G4ClassificationOfNewTrack classification = 00201 userStackingAction->ClassifyNewTrack( aStackedTrack.GetTrack() ); 00202 switch (classification) 00203 { 00204 case fKill: 00205 delete aStackedTrack.GetTrack(); 00206 delete aStackedTrack.GetTrajectory(); 00207 break; 00208 case fUrgent: 00209 urgentStack->PushToStack( aStackedTrack ); 00210 break; 00211 case fWaiting: 00212 waitingStack->PushToStack( aStackedTrack ); 00213 break; 00214 case fPostpone: 00215 postponeStack->PushToStack( aStackedTrack ); 00216 break; 00217 default: 00218 G4int i = classification - 10; 00219 if(i<1||i>numberOfAdditionalWaitingStacks) { 00220 G4ExceptionDescription ED; 00221 ED << "invalid classification " << classification << G4endl; 00222 G4Exception("G4StackManager::ReClassify","Event0052", 00223 FatalException,ED); 00224 } else { 00225 additionalWaitingStacks[i-1]->PushToStack( aStackedTrack ); 00226 } 00227 break; 00228 } 00229 } 00230 }
void G4StackManager::SetNumberOfAdditionalWaitingStacks | ( | G4int | iAdd | ) |
Definition at line 304 of file G4StackManager.cc.
Referenced by G4EventManager::SetNumberOfAdditionalWaitingStacks().
00305 { 00306 if(iAdd > numberOfAdditionalWaitingStacks) 00307 { 00308 for(int i=numberOfAdditionalWaitingStacks;i<iAdd;i++) 00309 { 00310 G4TrackStack* newStack = new G4TrackStack; 00311 additionalWaitingStacks.push_back(newStack); 00312 } 00313 numberOfAdditionalWaitingStacks = iAdd; 00314 } 00315 else if (iAdd < numberOfAdditionalWaitingStacks) 00316 { 00317 for(int i=numberOfAdditionalWaitingStacks;i>iAdd;i--) 00318 { 00319 delete additionalWaitingStacks[i]; 00320 } 00321 } 00322 }
void G4StackManager::SetUserStackingAction | ( | G4UserStackingAction * | value | ) |
Definition at line 511 of file G4StackManager.cc.
References G4UserStackingAction::SetStackManager().
Referenced by G4EventManager::SetUserAction().
00512 { 00513 userStackingAction = value; 00514 if(userStackingAction) userStackingAction->SetStackManager(this); 00515 }
void G4StackManager::SetVerboseLevel | ( | G4int const | value | ) |
Definition at line 506 of file G4StackManager.cc.
Referenced by G4StackingMessenger::SetNewValue(), and G4EventManager::SetVerboseLevel().
void G4StackManager::TransferOneStackedTrack | ( | G4ClassificationOfNewTrack | origin, | |
G4ClassificationOfNewTrack | destination | |||
) |
Definition at line 385 of file G4StackManager.cc.
References fKill, fPostpone, fUrgent, fWaiting, G4TrackStack::GetNTrack(), G4StackedTrack::GetTrack(), G4StackedTrack::GetTrajectory(), G4TrackStack::PopFromStack(), and G4TrackStack::PushToStack().
00386 { 00387 if(origin==destination) return; 00388 if(origin==fKill) return; 00389 G4TrackStack* originStack = 0; 00390 switch(origin) 00391 { 00392 case fUrgent: 00393 originStack = 0; 00394 break; 00395 case fWaiting: 00396 originStack = waitingStack; 00397 break; 00398 case fPostpone: 00399 originStack = postponeStack; 00400 break; 00401 default: 00402 int i = origin - 10; 00403 if(i<=numberOfAdditionalWaitingStacks) originStack = additionalWaitingStacks[i-1]; 00404 break; 00405 } 00406 00407 G4StackedTrack aStackedTrack; 00408 if(destination==fKill) 00409 { 00410 if( originStack && originStack->GetNTrack() ) { 00411 aStackedTrack = originStack->PopFromStack(); 00412 delete aStackedTrack.GetTrack(); 00413 delete aStackedTrack.GetTrajectory(); 00414 } 00415 else if (urgentStack->GetNTrack() ) { 00416 aStackedTrack = urgentStack->PopFromStack(); 00417 delete aStackedTrack.GetTrack(); 00418 delete aStackedTrack.GetTrajectory(); 00419 } 00420 } 00421 else 00422 { 00423 G4TrackStack* targetStack = 0; 00424 switch(destination) 00425 { 00426 case fUrgent: 00427 targetStack = 0; 00428 break; 00429 case fWaiting: 00430 targetStack = waitingStack; 00431 break; 00432 case fPostpone: 00433 targetStack = postponeStack; 00434 break; 00435 default: 00436 int i = destination - 10; 00437 if(i<=numberOfAdditionalWaitingStacks) targetStack = additionalWaitingStacks[i-1]; 00438 break; 00439 } 00440 if(originStack && originStack->GetNTrack()) { 00441 aStackedTrack = originStack->PopFromStack(); 00442 if(targetStack) { targetStack->PushToStack(aStackedTrack); } 00443 else { urgentStack->PushToStack(aStackedTrack); } 00444 } 00445 else if(urgentStack->GetNTrack()) { 00446 aStackedTrack = urgentStack->PopFromStack(); 00447 if(targetStack) { targetStack->PushToStack(aStackedTrack); } 00448 else { urgentStack->PushToStack(aStackedTrack); } 00449 } 00450 } 00451 return; 00452 }
void G4StackManager::TransferStackedTracks | ( | G4ClassificationOfNewTrack | origin, | |
G4ClassificationOfNewTrack | destination | |||
) |
Definition at line 324 of file G4StackManager.cc.
References G4TrackStack::clearAndDestroy(), fKill, fPostpone, fUrgent, fWaiting, and G4TrackStack::TransferTo().
00325 { 00326 if(origin==destination) return; 00327 if(origin==fKill) return; 00328 G4TrackStack* originStack = 0; 00329 switch(origin) 00330 { 00331 case fUrgent: 00332 originStack = 0; 00333 break; 00334 case fWaiting: 00335 originStack = waitingStack; 00336 break; 00337 case fPostpone: 00338 originStack = postponeStack; 00339 break; 00340 default: 00341 int i = origin - 10; 00342 if(i<=numberOfAdditionalWaitingStacks) originStack = additionalWaitingStacks[i-1]; 00343 break; 00344 } 00345 00346 if(destination==fKill) 00347 { 00348 if(originStack) 00349 { originStack->clearAndDestroy(); } 00350 else 00351 { urgentStack->clearAndDestroy(); } 00352 } 00353 else 00354 { 00355 G4TrackStack* targetStack = 0; 00356 switch(destination) 00357 { 00358 case fUrgent: 00359 targetStack = 0; 00360 break; 00361 case fWaiting: 00362 targetStack = waitingStack; 00363 break; 00364 case fPostpone: 00365 targetStack = postponeStack; 00366 break; 00367 default: 00368 int i = destination - 10; 00369 if(i<=numberOfAdditionalWaitingStacks) targetStack = additionalWaitingStacks[i-1]; 00370 break; 00371 } 00372 if(originStack) 00373 { 00374 if(targetStack) 00375 { originStack->TransferTo(targetStack); } 00376 else 00377 { originStack->TransferTo(urgentStack); } 00378 } 00379 else 00380 { urgentStack->TransferTo(targetStack); } 00381 } 00382 return; 00383 }