38 #include "G4ForceCondition.hh" 39 #include "G4GPILSelection.hh" 71 return std::numeric_limits<T>::has_infinity
72 && value == std::numeric_limits<T>::infinity();
82 fpTrackingManager = 0;
99 fSelectedAtRestDoItVector(
G4VITProcess::GetMaxProcessIndex(), 0),
100 fSelectedPostStepDoItVector(
G4VITProcess::GetMaxProcessIndex(), 0)
141 if(
this == &right)
return *
this;
173 std::map<const G4ParticleDefinition*, ProcessGeneralInfo*>::iterator it;
175 for(it = fProcessGeneralInfoMap.begin(); it != fProcessGeneralInfoMap.end();
185 fProcessGeneralInfoMap.clear();
192 fInitialized =
false;
202 if(fInitialized)
return;
206 ->GetNavigatorForTracking());
233 fpStep->DeleteSecondaryVector();
237 if(fpSecondary)
delete fpSecondary;
251 fpTrackingManager = 0;
253 fInitialized =
false;
256 fInitialized =
false;
261 fpTrackContainer = 0;
269 fLeadingTracks.Reset();
276 fLeadingTracks.PrepareLeadingTracks();
283 if(
this == &rhs)
return *
this;
294 G4cout<<
"G4ITStepProcessor::CloneProcesses: is called"<<
G4endl;
301 theParticleIterator->
reset();
303 while((*theParticleIterator)())
310 G4cerr <<
"ERROR - G4ITStepProcessor::GetProcessNumber()" << G4endl<<
" ProcessManager is NULL for particle = " 313 G4Exception(
"G4ITStepProcessor::GetProcessNumber()",
"ITStepProcessor0001",
318 ActiveOnlyITProcess(pm);
330 for(
int i = 0; i < processVector->
size(); i++)
332 G4VProcess* base_process = (*processVector)[i];
349 G4cout<<
"G4ITStepProcessor::GetProcessNumber: is called track"<<
G4endl;
353 G4cerr <<
"ERROR - G4SteppingManager::GetProcessNumber()" << G4endl<<
" ProcessManager is NULL for particle = " 356 G4Exception(
"G4SteppingManager::GetProcessNumber()",
"ITStepProcessor0002",
361 std::map<const G4ParticleDefinition*, ProcessGeneralInfo*>::iterator it =
362 fProcessGeneralInfoMap.find(particle);
363 if(it != fProcessGeneralInfoMap.end())
365 G4Exception(
"G4SteppingManager::SetupGeneralProcessInfo()",
366 "ITStepProcessor0003",
377 fpProcessInfo->fpAtRestGetPhysIntVector =
380 G4cout <<
"G4ITStepProcessor::GetProcessNumber: #ofAtRest=" 381 << fpProcessInfo->MAXofAtRestLoops <<
G4endl;
385 fpProcessInfo->MAXofAlongStepLoops =
387 fpProcessInfo->fpAlongStepDoItVector =
389 fpProcessInfo->fpAlongStepGetPhysIntVector =
392 G4cout <<
"G4ITStepProcessor::GetProcessNumber:#ofAlongStp=" 393 << fpProcessInfo->MAXofAlongStepLoops <<
G4endl;
397 fpProcessInfo->MAXofPostStepLoops =
400 fpProcessInfo->fpPostStepGetPhysIntVector =
403 G4cout <<
"G4ITStepProcessor::GetProcessNumber: #ofPostStep=" 404 << fpProcessInfo->MAXofPostStepLoops <<
G4endl;
407 if (SizeOfSelectedDoItVector<fpProcessInfo->MAXofAtRestLoops ||
408 SizeOfSelectedDoItVector<fpProcessInfo->MAXofAlongStepLoops ||
409 SizeOfSelectedDoItVector<fpProcessInfo->MAXofPostStepLoops )
411 G4cerr <<
"ERROR - G4ITStepProcessor::GetProcessNumber()" << G4endl
413 <<
" ; is smaller then one of MAXofAtRestLoops= " 414 << fpProcessInfo->MAXofAtRestLoops << G4endl
415 <<
" or MAXofAlongStepLoops= " << fpProcessInfo->MAXofAlongStepLoops
416 <<
" or MAXofPostStepLoops= " << fpProcessInfo->MAXofPostStepLoops <<
G4endl;
417 G4Exception(
"G4ITStepProcessor::GetProcessNumber()",
419 "The array size is smaller than the actual No of processes.");
422 if(!fpProcessInfo->fpAtRestDoItVector &&
423 !fpProcessInfo->fpAlongStepDoItVector &&
424 !fpProcessInfo->fpPostStepDoItVector)
427 exceptionDescription <<
"No DoIt process found ";
428 G4Exception(
"G4ITStepProcessor::DoStepping",
"ITStepProcessor0005",
433 if(fpProcessInfo->fpAlongStepGetPhysIntVector
434 && fpProcessInfo->MAXofAlongStepLoops>0)
437 ((*fpProcessInfo->fpAlongStepGetPhysIntVector)
438 [fpProcessInfo->MAXofAlongStepLoops-1]);
440 if(fpProcessInfo->fpTransportation == 0)
443 exceptionDescription <<
"No transportation process found ";
444 G4Exception(
"G4ITStepProcessor::SetupGeneralProcessInfo",
445 "ITStepProcessor0006",
449 fProcessGeneralInfoMap[particle] = fpProcessInfo;
460 fpITrack =
GetIT(fpTrack);
461 fpStep =
const_cast<G4Step*
>(fpTrack->GetStep());
465 fpTrackingInfo = fpITrack->GetTrackingInfo();
470 G4cerr <<
"Track ID : " << fpTrack->GetTrackID() <<
G4endl;
473 errMsg <<
"No IT pointer was attached to the track you try to process.";
475 "ITStepProcessor0007",
491 std::map<const G4ParticleDefinition*, ProcessGeneralInfo*>::iterator it =
492 fProcessGeneralInfoMap.find(particle);
494 if(it == fProcessGeneralInfoMap.end())
496 SetupGeneralProcessInfo(particle,
498 if(fpProcessInfo == 0)
502 "ITStepProcessor0008",
504 exceptionDescription);
510 fpProcessInfo = it->second;
518 fpSecondary = fpStep->GetfSecondary();
519 fpPreStepPoint = fpStep->GetPreStepPoint();
520 fpPostStepPoint = fpStep->GetPostStepPoint();
523 ->GetStepProcessorState();
534 fN2ndariesAtRestDoIt = 0;
535 fN2ndariesAlongStepDoIt = 0;
536 fN2ndariesPostStepDoIt = 0;
548 fAtRestDoItProcTriggered = 0;
551 unsigned int NofInactiveProc=0;
553 for(
size_t ri=0; ri < fpProcessInfo->MAXofAtRestLoops; ri++ )
555 fpCurrentProcess =
dynamic_cast<G4VITProcess*
>((*fpProcessInfo->fpAtRestGetPhysIntVector)[ri]);
556 if (fpCurrentProcess== 0)
558 (fpState->fSelectedAtRestDoItVector)[ri] = InActivated;
563 fCondition=NotForced;
565 fpTrackingInfo->GetProcessState(fpCurrentProcess->GetProcessID()));
567 lifeTime = fpCurrentProcess->AtRestGPIL( *fpTrack, &fCondition );
568 fpCurrentProcess->ResetProcessState();
570 if(fCondition==Forced)
572 (fpState->fSelectedAtRestDoItVector)[ri] = Forced;
576 (fpState->fSelectedAtRestDoItVector)[ri] = InActivated;
577 if(lifeTime < shortestLifeTime )
579 shortestLifeTime = lifeTime;
580 fAtRestDoItProcTriggered =
G4int(ri);
585 (fpState->fSelectedAtRestDoItVector)[fAtRestDoItProcTriggered] = NotForced;
592 fTimeStep = shortestLifeTime;
596 if(NofInactiveProc==fpProcessInfo->MAXofAtRestLoops)
598 G4cerr <<
"ERROR - G4ITStepProcessor::InvokeAtRestDoItProcs()" <<
G4endl 599 <<
" No AtRestDoIt process is active!" <<
G4endl;
610 SetPreviousStepTime(previousTimeStep);
616 G4Track *
track = *it;
620 <<
" ID: " << track->GetTrackID()
621 <<
" at time : " << track->GetGlobalTime()
626 DefinePhysicalStepLength(track);
638 assert(fpTrack != 0);
647 if (fpTrack->GetTrackStatus() == fStopAndKill)
650 fpTrackingManager->EndTracking(fpTrack);
655 if (
IsInf(fTimeStep))
666 fLeadingTracks.Reset();
668 fILTimeStep = GetInteractionTime();
676 fLeadingTracks.Push(fpTrack);
678 else if(fabs(fILTimeStep - fTimeStep) <
DBL_EPSILON )
686 fLeadingTracks.Push(fpTrack);
702 DoDefinePhysicalStepLength();
714 if(!fpTrack->GetTouchableHandle())
726 fpNavigator->NewNavigatorState();
727 fpITrack->GetTrackingInfo()->SetNavigatorState(fpNavigator
728 ->GetNavigatorState());
731 fpNavigator->LocateGlobalPointAndSetup(fpTrack->GetPosition(),
736 fpState->fTouchableHandle = fpNavigator->CreateTouchableHistory();
738 fpTrack->SetTouchableHandle(fpState->fTouchableHandle);
739 fpTrack->SetNextTouchableHandle(fpState->fTouchableHandle);
743 fpState->fTouchableHandle = fpTrack->GetTouchableHandle();
744 fpTrack->SetNextTouchableHandle(fpState->fTouchableHandle);
750 if(fpITrack->GetTrackingInfo()->GetNavigatorState())
752 fpNavigator->SetNavigatorState(fpITrack->GetTrackingInfo()
753 ->GetNavigatorState());
754 fpITrack->GetTrackingInfo()->SetNavigatorState(fpNavigator
755 ->GetNavigatorState());
761 fpITrack->GetTrackingInfo()->SetNavigatorState(fpNavigator
762 ->GetNavigatorState());
766 fpTrack->GetTouchableHandle()->GetVolume();
779 fpNavigator->ResetHierarchyAndLocate(fpTrack->GetPosition(),
780 fpTrack->GetMomentumDirection(),
782 ->GetTouchableHandle()()));
787 fpState->fTouchableHandle = fpNavigator->CreateTouchableHistory();
788 fpTrack->SetTouchableHandle(fpState->fTouchableHandle);
789 fpTrack->SetNextTouchableHandle(fpState->fTouchableHandle);
793 fpCurrentVolume = fpState->fTouchableHandle->GetVolume();
798 if((fpTrack->GetTrackStatus() == fSuspend) || (fpTrack->GetTrackStatus()
799 == fPostponeToNextEvent))
801 fpTrack->SetTrackStatus(fAlive);
806 if(fpTrack->GetKineticEnergy() <= 0.0)
808 fpTrack->SetTrackStatus(fStopButAlive);
812 if(fpTrack->GetCurrentStepNumber() == 0)
814 fpTrack->SetVertexPosition(fpTrack->GetPosition());
815 fpTrack->SetVertexMomentumDirection(fpTrack->GetMomentumDirection());
816 fpTrack->SetVertexKineticEnergy(fpTrack->GetKineticEnergy());
817 fpTrack->SetLogicalVolumeAtVertex(fpTrack->GetVolume()->GetLogicalVolume());
821 if(fpCurrentVolume == 0)
824 if(fpTrack->GetParentID() == 0)
826 G4cerr <<
"ERROR - G4ITStepProcessor::SetInitialStep()" <<
G4endl<<
" Primary particle starting at - " 827 << fpTrack->GetPosition()
828 <<
" - is outside of the world volume." <<
G4endl;
829 G4Exception(
"G4ITStepProcessor::SetInitialStep()",
"ITStepProcessor0011",
833 fpTrack->SetTrackStatus( fStopAndKill );
834 G4cout <<
"WARNING - G4ITStepProcessor::SetInitialStep()" <<
G4endl 835 <<
" Initial track position is outside world! - " 836 << fpTrack->GetPosition() <<
G4endl;
841 fpStep->InitializeStep( fpTrack );
844 if(fpTrack->GetTrackStatus() == fStopAndKill)
return;
846 fpState->fStepStatus = fUndefined;
856 fpStep =
new G4Step();
857 fpTrack->SetStep(fpStep);
858 fpSecondary = fpStep->NewSecondaryVector();
867 fpTrackingManager->StartTracking(fpTrack);
873 fpState->fPreviousStepSize = fpTrack->GetStepLength();
890 fpStep->CopyPostToPreStepPoint();
891 fpStep->ResetTotalEnergyDeposit();
894 fpCurrentVolume = fpStep->GetPreStepPoint()->GetPhysicalVolume();
907 fpStep->SetPointerToVectorOfAuxiliaryPoints(0);
910 fpTrack->SetTouchableHandle(fpTrack->GetNextTouchableHandle());
911 fpState->fTouchableHandle = fpTrack->GetTouchableHandle();
912 fpTrack->SetNextTouchableHandle(fpState->fTouchableHandle);
946 fpNavigator->SetNavigatorState(fpITrack->GetTrackingInfo()
947 ->GetNavigatorState());
963 if(fpVerbose) fpVerbose->DPSLStarted();
966 G4TrackStatus trackStatus = fpTrack->GetTrackStatus();
968 if(trackStatus == fStopAndKill)
973 if(trackStatus == fStopButAlive)
975 fpITrack->GetTrackingInfo()->SetNavigatorState(fpNavigator
976 ->GetNavigatorState());
977 fpNavigator->ResetNavigatorState();
978 return GetAtRestIL();
985 fpState->fPhysicalStep =
DBL_MAX;
988 double proposedTimeStep =
DBL_MAX;
989 G4VProcess* processWithPostStepGivenByTimeStep(0);
992 fPostStepDoItProcTriggered = fpProcessInfo->MAXofPostStepLoops;
993 fPostStepAtTimeDoItProcTriggered = fpProcessInfo->MAXofPostStepLoops;
1001 for(
size_t np = 0; np < fpProcessInfo->MAXofPostStepLoops; np++)
1003 fpCurrentProcess =
dynamic_cast<G4VITProcess*
>((*fpProcessInfo
1004 ->fpPostStepGetPhysIntVector)[np]);
1005 if(fpCurrentProcess == 0)
1007 (fpState->fSelectedPostStepDoItVector)[np] = InActivated;
1011 fCondition = NotForced;
1012 fpCurrentProcess->
SetProcessState(fpTrackingInfo->GetProcessState(fpCurrentProcess
1018 fPhysIntLength = fpCurrentProcess->PostStepGPIL(*fpTrack,
1019 fpState->fPreviousStepSize,
1024 if(fpVerbose) fpVerbose->DPSLPostStep();
1027 fpCurrentProcess->ResetProcessState();
1032 case ExclusivelyForced:
1033 (fpState->fSelectedPostStepDoItVector)[np] = ExclusivelyForced;
1034 fpState->fStepStatus = fExclusivelyForcedProc;
1035 fpStep->GetPostStepPoint()->SetProcessDefinedStep(fpCurrentProcess);
1040 G4Exception(
"G4ITStepProcessor::DefinePhysicalStepLength()",
1041 "ITStepProcessor0008",
1043 "This feature is no more supported");
1047 (fpState->fSelectedPostStepDoItVector)[np] = Forced;
1050 case StronglyForced:
1051 (fpState->fSelectedPostStepDoItVector)[np] = StronglyForced;
1055 (fpState->fSelectedPostStepDoItVector)[np] = InActivated;
1059 if(fCondition == ExclusivelyForced)
1061 for(
size_t nrest = np + 1; nrest < fpProcessInfo->MAXofPostStepLoops;
1064 (fpState->fSelectedPostStepDoItVector)[nrest] = InActivated;
1075 if(fpCurrentProcess->ProposesTimeStep())
1077 fPhysIntLength *= -1;
1078 if(fPhysIntLength < proposedTimeStep)
1080 proposedTimeStep = fPhysIntLength;
1081 fPostStepAtTimeDoItProcTriggered = np;
1082 processWithPostStepGivenByTimeStep = fpCurrentProcess;
1087 fpState->fPhysicalStep = fPhysIntLength;
1088 fpState->fStepStatus = fPostStepDoItProc;
1089 fPostStepDoItProcTriggered =
G4int(np);
1090 fpStep->GetPostStepPoint()->SetProcessDefinedStep(fpCurrentProcess);
1097 fpState->fProposedSafety =
DBL_MAX;
1098 G4double safetyProposedToAndByProcess = fpState->fProposedSafety;
1100 for(
size_t kp = 0; kp < fpProcessInfo->MAXofAlongStepLoops; kp++)
1102 fpCurrentProcess =
dynamic_cast<G4VITProcess*
>((*fpProcessInfo
1103 ->fpAlongStepGetPhysIntVector)[kp]);
1104 if(fpCurrentProcess == 0)
continue;
1108 fpTrackingInfo->GetProcessState(fpCurrentProcess->GetProcessID()));
1110 fpCurrentProcess->AlongStepGPIL(*fpTrack,
1111 fpState->fPreviousStepSize,
1112 fpState->fPhysicalStep,
1113 safetyProposedToAndByProcess,
1118 if(fpVerbose) fpVerbose->DPSLAlongStep();
1123 fpState->fPhysicalStep = fPhysIntLength;
1128 if(fGPILSelection == CandidateForSelection)
1130 fpState->fStepStatus = fAlongStepDoItProc;
1131 fpStep->GetPostStepPoint()->SetProcessDefinedStep(fpCurrentProcess);
1135 if(kp == fpProcessInfo->MAXofAlongStepLoops - 1)
1139 if(!fpTransportation)
1142 exceptionDescription <<
"No transportation process found ";
1143 G4Exception(
"G4ITStepProcessor::DoDefinePhysicalStepLength",
1144 "ITStepProcessor0009",
1146 exceptionDescription);
1149 fTimeStep = fpTransportation->GetInteractionTimeLeft();
1151 if(fpTrack->GetNextVolume() != 0) fpState->fStepStatus = fGeomBoundary;
1152 else fpState->fStepStatus = fWorldBoundary;
1157 if(kp == fpProcessInfo->MAXofAlongStepLoops - 1)
1161 if(!fpTransportation)
1164 exceptionDescription <<
"No transportation process found ";
1165 G4Exception(
"G4ITStepProcessor::DoDefinePhysicalStepLength",
1166 "ITStepProcessor0010",
1168 exceptionDescription);
1171 fTimeStep = fpTransportation->GetInteractionTimeLeft();
1176 if(proposedTimeStep < fTimeStep)
1178 if(fPostStepAtTimeDoItProcTriggered < fpProcessInfo->MAXofPostStepLoops)
1180 if((fpState->fSelectedPostStepDoItVector)[fPostStepAtTimeDoItProcTriggered] == InActivated)
1182 (fpState->fSelectedPostStepDoItVector)[fPostStepAtTimeDoItProcTriggered] =
1186 fpState->fStepStatus = fPostStepDoItProc;
1187 fpStep->GetPostStepPoint()->SetProcessDefinedStep(processWithPostStepGivenByTimeStep);
1189 fTimeStep = proposedTimeStep;
1191 fpTransportation->ComputeStep(*fpTrack,
1194 fpState->fPhysicalStep);
1200 if(fPostStepDoItProcTriggered < fpProcessInfo->MAXofPostStepLoops)
1202 if((fpState->fSelectedPostStepDoItVector)[fPostStepDoItProcTriggered] == InActivated)
1204 (fpState->fSelectedPostStepDoItVector)[fPostStepDoItProcTriggered] =
1211 fpCurrentProcess->ResetProcessState();
1218 fpState->fProposedSafety = safetyProposedToAndByProcess;
1221 safetyProposedToAndByProcess = fpState->fProposedSafety;
1225 fpITrack->GetTrackingInfo()->SetNavigatorState(fpNavigator->GetNavigatorState());
1226 fpNavigator->ResetNavigatorState();
G4ProcessVector * GetProcessList() const
void PrepareLeadingTracks()
G4ProcessVector * GetAtRestProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
std::ostringstream G4ExceptionDescription
G4TouchableHandle fTouchableHandle
G4ProcessManager * GetProcessManager() const
G4double GetSurfaceTolerance() const
virtual const G4String & GetName() const =0
G4ProcessVector * GetPostStepProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
G4SelectedAtRestDoItVector fSelectedAtRestDoItVector
G4SelectedPostStepDoItVector fSelectedPostStepDoItVector
G4VProcess * SetProcessActivation(G4VProcess *aProcess, G4bool fActive)
void DefinePhysicalStepLength(G4Track *)
G4IT * GetIT(const G4Track *track)
const G4String & GetParticleName() const
static G4ITTransportationManager * GetTransportationManager()
G4GLOB_DLL std::ostream G4cout
void reset(G4bool ifSkipIon=true)
G4int GetPDGEncoding() const
void ActiveOnlyITProcess()
virtual G4int GetRegularStructureId() const =0
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
virtual void Initialize()
G4ProcessVector * GetAlongStepProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
G4double ComputeInteractionLength(double previousTimeStep)
void SetProcessState(G4shared_ptr< G4ProcessState_Lock > aProcInfo)
static G4ParticleTable * GetParticleTable()
G4ITStepProcessorState & operator=(const G4ITStepProcessorState &)
G4ITStepProcessor & operator=(const G4ITStepProcessor &other)
G4VITSteppingVerbose * GetSteppingVerbose()
void DoDefinePhysicalStepLength()
static G4ITTrackHolder * Instance()
virtual ~G4ITStepProcessor()
G4VITSteppingVerbose * fpVerbose
G4double fPreviousStepSize
void SetupGeneralProcessInfo(G4ParticleDefinition *, G4ProcessManager *)
void SetStepProcessor(const G4ITStepProcessor *stepProcessor)
virtual ~G4ITStepProcessorState()
void ResetLeadingTracks()
G4PTblDicIterator * GetIterator() const
#define theParticleIterator
static G4GeometryTolerance * GetInstance()
static const size_t SizeOfSelectedDoItVector
void ForceReInitialization()
G4GLOB_DLL std::ostream G4cerr