47 #include "G4ForceCondition.hh" 48 #include "G4GPILSelection.hh" 49 #include "G4SteppingControl.hh" 60 G4cout<<
"G4SteppingManager::GetProcessNumber: is called track=" 67 G4cerr <<
"ERROR - G4SteppingManager::GetProcessNumber()" << G4endl
68 <<
" ProcessManager is NULL for particle = " 69 <<
fTrack->GetDefinition()->GetParticleName() <<
", PDG_code = " 71 G4Exception(
"G4SteppingManager::GetProcessNumber()",
"Tracking0011",
81 G4cout <<
"G4SteppingManager::GetProcessNumber: #ofAtRest=" 90 G4cout <<
"G4SteppingManager::GetProcessNumber:#ofAlongStp=" 99 G4cout <<
"G4SteppingManager::GetProcessNumber: #ofPostStep=" 107 G4cerr <<
"ERROR - G4SteppingManager::GetProcessNumber()" << G4endl
109 <<
" ; is smaller then one of MAXofAtRestLoops= " 113 G4Exception(
"G4SteppingManager::GetProcessNumber()",
115 "The array size is smaller than the actual No of processes.");
168 (*fSelectedPostStepDoItVector)[np] = InActivated;
182 case ExclusivelyForced:
183 (*fSelectedPostStepDoItVector)[np] = ExclusivelyForced;
185 fStep->GetPostStepPoint()
190 G4Exception(
"G4SteppingManager::DefinePhysicalStepLength()",
"Tracking1001",
FatalException,
"This feature no more supported");
194 (*fSelectedPostStepDoItVector)[np] = Forced;
197 (*fSelectedPostStepDoItVector)[np] = StronglyForced;
200 (*fSelectedPostStepDoItVector)[np] = InActivated;
208 (*fSelectedPostStepDoItVector)[nrest] = InActivated;
217 fStep->GetPostStepPoint()
245 safetyProposedToAndByProcess,
258 fStep->GetPostStepPoint()
263 if(kp == MAXofAlongStepLoops-1)
288 G4double lifeTime, shortestLifeTime;
293 unsigned int NofInactiveProc=0;
297 (*fSelectedAtRestDoItVector)[ri] = InActivated;
308 (*fSelectedAtRestDoItVector)[ri] = Forced;
311 (*fSelectedAtRestDoItVector)[ri] = InActivated;
312 if(lifeTime < shortestLifeTime ){
313 shortestLifeTime = lifeTime;
323 if(NofInactiveProc==MAXofAtRestLoops){
324 G4Exception(
"G4SteppingManager::InvokeAtRestDoItProcs()",
"Tracking0013",
328 fStep->SetStepLength( 0. );
329 fTrack->SetStepLength( 0. );
344 fStep->GetPostStepPoint()
351 G4Track* tempSecondaryTrack;
356 for(
G4int DSecLoop=0 ; DSecLoop< num2ndaries; DSecLoop++){
359 if(tempSecondaryTrack->GetDefinition()->GetApplyCutsFlag())
363 tempSecondaryTrack->SetParentID(
fTrack->GetTrackID() );
370 if(tempSecondaryTrack->GetKineticEnergy() <=
DBL_MIN){
371 G4ProcessManager* pm = tempSecondaryTrack->GetDefinition()->GetProcessManager();
372 if(!pm && tempSecondaryTrack->GetDefinition()->IsGeneralIon())
375 tempSecondaryTrack->SetTrackStatus( fStopButAlive );
379 delete tempSecondaryTrack;
393 fStep->UpdateTrack();
395 fTrack->SetTrackStatus( fStopAndKill );
427 G4Track* tempSecondaryTrack;
432 for(
G4int DSecLoop=0 ; DSecLoop< num2ndaries; DSecLoop++){
435 if(tempSecondaryTrack->GetDefinition()->GetApplyCutsFlag())
439 tempSecondaryTrack->SetParentID(
fTrack->GetTrackID() );
446 if(tempSecondaryTrack->GetKineticEnergy() <=
DBL_MIN){
447 G4ProcessManager* pm = tempSecondaryTrack->GetDefinition()->GetProcessManager();
448 if(!pm && tempSecondaryTrack->GetDefinition()->IsGeneralIon())
451 tempSecondaryTrack->SetTrackStatus( fStopButAlive );
455 delete tempSecondaryTrack;
471 fStep->UpdateTrack();
472 G4TrackStatus fNewStatus =
fTrack->GetTrackStatus();
474 if ( fNewStatus == fAlive &&
fTrack->GetKineticEnergy() <=
DBL_MIN ) {
476 else fNewStatus = fStopAndKill;
477 fTrack->SetTrackStatus( fNewStatus );
493 G4int Cond = (*fSelectedPostStepDoItVector)[MAXofPostStepLoops-np-1];
494 if(Cond != InActivated){
495 if( ((Cond == NotForced) && (
fStepStatus == fPostStepDoItProc)) ||
496 ((Cond == Forced) && (
fStepStatus != fExclusivelyForcedProc)) ||
498 ((Cond == ExclusivelyForced) && (
fStepStatus == fExclusivelyForcedProc)) ||
499 ((Cond == StronglyForced) )
503 if ((np==0) && (
fTrack->GetNextVolume() == 0)){
512 if(
fTrack->GetTrackStatus() == fStopAndKill) {
514 G4int Cond2 = (*fSelectedPostStepDoItVector)[MAXofPostStepLoops-np1-1];
515 if (Cond2 == StronglyForced) {
539 fStep->UpdateTrack();
545 G4Track* tempSecondaryTrack;
550 for(
G4int DSecLoop=0 ; DSecLoop< num2ndaries; DSecLoop++){
553 if(tempSecondaryTrack->GetDefinition()->GetApplyCutsFlag())
557 tempSecondaryTrack->SetParentID(
fTrack->GetTrackID() );
564 if(tempSecondaryTrack->GetKineticEnergy() <=
DBL_MIN){
565 G4ProcessManager* pm = tempSecondaryTrack->GetDefinition()->GetProcessManager();
566 if(!pm && tempSecondaryTrack->GetDefinition()->IsGeneralIon())
569 tempSecondaryTrack->SetTrackStatus( fStopButAlive );
573 delete tempSecondaryTrack;
594 G4bool tBelowCutEnergyAndSafety =
false;
597 if (tPtclIdx<0) {
return; }
604 if( aSecondary->GetKineticEnergy()<tProdThreshold )
606 tBelowCutEnergyAndSafety =
true;
607 if(std::abs(aSecondary->GetDynamicParticle()->GetCharge()) >
DBL_MIN)
611 aSecondary->GetKineticEnergy(),
617 if( tBelowCutEnergyAndSafety )
619 if( !(aSecondary->IsGoodForTracking()) )
626 fStep->AddTotalEnergyDeposit(
627 aSecondary->GetKineticEnergy() );
628 aSecondary->SetKineticEnergy(0.0);
G4double CalculateSafety()
static G4LossTableManager * Instance()
static G4int GetIndex(const G4String &name)
G4ProcessVector * fPostStepGetPhysIntVector
G4ProcessVector * GetAtRestProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
virtual void PostStepDoItOneByOne()=0
G4ProcessVector * fPostStepDoItVector
G4VSteppingVerbose * fVerbose
void InvokeAlongStepDoItProcs()
G4ProcessManager * GetProcessManager() const
G4ParticleDefinition * GetGenericIon() const
G4ProcessVector * fAlongStepGetPhysIntVector
G4SelectedPostStepDoItVector * fSelectedPostStepDoItVector
const std::vector< G4double > * GetEnergyCutsVector(size_t pcIdx) const
G4ProcessVector * GetPostStepProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
size_t MAXofAlongStepLoops
size_t fAtRestDoItProcTriggered
G4VProcess * fCurrentProcess
G4double AtRestGPIL(const G4Track &track, G4ForceCondition *condition)
G4double fPreviousStepSize
void DefinePhysicalStepLength()
virtual void DPSLAlongStep()=0
G4GLOB_DLL std::ostream G4cout
virtual void DPSLPostStep()=0
size_t fPostStepDoItProcTriggered
G4int fN2ndariesPostStepDoIt
void ApplyProductionCut(G4Track *)
G4int fN2ndariesAlongStepDoIt
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4ProcessVector * GetAlongStepProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
static G4ProductionCutsTable * GetProductionCutsTable()
static G4ParticleTable * GetParticleTable()
G4ProcessVector * fAlongStepDoItVector
void InvokePostStepDoItProcs()
G4TrackVector * fSecondary
size_t MAXofPostStepLoops
virtual G4VParticleChange * AlongStepDoIt(const G4Track &track, const G4Step &stepData)=0
virtual void AlongStepDoItOneByOne()=0
G4int GetCoupleIndex(const G4MaterialCutsCouple *aCouple) const
G4ForceCondition fCondition
G4int fN2ndariesAtRestDoIt
G4GPILSelection fGPILSelection
virtual G4VParticleChange * PostStepDoIt(const G4Track &track, const G4Step &stepData)=0
G4ProcessVector * fAtRestGetPhysIntVector
G4VParticleChange * fParticleChange
G4double GetRange(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
virtual void DPSLStarted()=0
G4SelectedAtRestDoItVector * fSelectedAtRestDoItVector
G4ProcessVector * fAtRestDoItVector
static const size_t SizeOfSelectedDoItVector
G4GLOB_DLL std::ostream G4cerr
void InvokeAtRestDoItProcs()
virtual G4VParticleChange * AtRestDoIt(const G4Track &track, const G4Step &stepData)=0
G4StepPoint * fPreStepPoint