76 #define State(theXInfo) (GetState<G4ITTransportationState>()->theXInfo)
83 fThreshold_Warning_Energy( 100 *
MeV ),
84 fThreshold_Important_Energy( 250 *
MeV ),
85 fThresholdTrials( 10 ),
86 fUnimportant_Energy( 1 *
MeV ),
87 fSumEnergyKilled( 0.0 ), fMaxEnergyKilled( 0.0 ),
88 fShortStepOptimisation(false),
89 fVerboseLevel( verbose )
156 if(
this == &right)
return *
this;
164 fCurrentTouchableHandle(0)
195 G4cout <<
" G4ITTransportation: Statistics for looping particles " <<
G4endl;
226 G4double geometryStepLength(-1.0), newSafety(-1.0) ;
228 State(fParticleIsLooping) = false ;
229 State(fEndGlobalTimeComputed) = false ;
230 State(fGeometryLimitedStep) = false ;
257 G4double MagSqShift = OriginShift.mag2() ;
258 if( MagSqShift >=
sqr(
State(fPreviousSafety)) )
260 currentSafety = 0.0 ;
264 currentSafety =
State(fPreviousSafety) - std::sqrt(MagSqShift) ;
279 G4bool fieldExertsForce = false ;
280 if( (particleCharge != 0.0) )
301 if( !fieldExertsForce )
308 geometryStepLength = currentMinimumStep ;
309 State(fGeometryLimitedStep) = false ;
322 State(fPreviousSafety) = newSafety ;
327 currentSafety = newSafety ;
329 State(fGeometryLimitedStep)= (linearStepLength <= currentMinimumStep);
330 if(
State(fGeometryLimitedStep) )
333 geometryStepLength = linearStepLength ;
338 geometryStepLength = currentMinimumStep ;
341 State(endpointDistance) = geometryStepLength ;
345 State(fTransportEndPosition) = startPosition+geometryStepLength*startMomentumDir ;
349 State(fTransportEndMomentumDir) = startMomentumDir ;
352 State(fParticleIsLooping) = false ;
353 State(fMomentumChanged) = false ;
354 State(fEndGlobalTimeComputed) = true ;
368 exceptionDescription <<
"ITTransportation does not support external fields.";
369 exceptionDescription <<
" If you are dealing with a tradiational MC simulation, ";
370 exceptionDescription <<
"please use G4Transportation.";
372 G4Exception(
"G4ITTransportation::AlongStepGetPhysicalInteractionLength",
"NoExternalFieldSupport",
521 if( currentMinimumStep == 0.0 )
523 if( currentSafety == 0.0 )
525 State(fGeometryLimitedStep) = true ;
534 if( currentSafety <
State(endpointDistance) )
539 if( particleCharge != 0.0 )
544 currentSafety = endSafety ;
545 State(fPreviousSftOrigin) =
State(fTransportEndPosition) ;
546 State(fPreviousSafety) = currentSafety ;
552 currentSafety +=
State(endpointDistance) ;
554 #ifdef G4DEBUG_TRANSPORT
556 G4cout <<
"***G4Transportation::AlongStepGPIL ** " <<
G4endl ;
557 G4cout <<
" Called Navigator->ComputeSafety at " <<
State(fTransportEndPosition)
558 <<
" and it returned safety= " << endSafety <<
G4endl ;
559 G4cout <<
" Adding endpoint distance " <<
State(endpointDistance)
560 <<
" to obtain pseudo-safety= " << currentSafety <<
G4endl ;
567 return geometryStepLength ;
573 const double timeStep,
574 double& oPhysicalStep)
583 State(fGeometryLimitedStep) =
false;
589 State(fEndGlobalTimeComputed) = true ;
593 if( !
State(fMomentumChanged) )
597 oPhysicalStep = initialVelocity*timeStep ;
601 State(fTransportEndPosition) = startPosition + oPhysicalStep*startMomentumDir ;
646 if (
State(fEndGlobalTimeComputed) ==
false)
659 deltaTime = stepLength/finalVelocity ;
661 else if( initialVelocity > 0.0 )
663 deltaTime = stepLength/initialVelocity ;
666 State(fCandidateEndGlobalTime) = startTime + deltaTime ;
670 deltaTime =
State(fCandidateEndGlobalTime) - startTime ;
693 if (
State(fParticleIsLooping) )
716 G4cout <<
" G4ITTransportation is killing track that is looping or stuck "
719 <<
" MeV energy." <<
G4endl;
720 G4cout <<
" Number of trials = " <<
State(fNoLooperTrials)
721 <<
" No of calls to AlongStepDoIt = " << noCalls
725 State(fNoLooperTrials)=0;
729 State(fNoLooperTrials) ++;
733 G4cout <<
" G4ITTransportation::AlongStepDoIt(): Particle looping - "
734 <<
" Number of trials = " <<
State(fNoLooperTrials)
735 <<
" No of calls to = " << noCalls
743 State(fNoLooperTrials)=0;
793 if(
State(fGeometryLimitedStep))
802 if(
State(fCurrentTouchableHandle)->GetVolume() == 0 )
805 exceptionDescription <<
"No current touchable found " ;
806 G4Exception(
" G4ITTransportation::PostStepDoIt",
"G4ITTransportation001",
812 LocateGlobalPointAndUpdateTouchableHandle( track.
GetPosition(),
814 State(fCurrentTouchableHandle),
819 if(
State(fCurrentTouchableHandle)->GetVolume() == 0 )
826 G4cout <<
"G4ITTransportation will killed the track because State(fCurrentTouchableHandle)->GetVolume() == 0"<<
G4endl;
832 retCurrentTouchable =
State(fCurrentTouchableHandle) ;
847 #ifdef G4DEBUG_TRANSPORT
852 if( ! (exiting || entering) )
854 G4cout <<
" Transport> : Proposed isLastStep= " << isLastStep
878 #ifdef G4DEBUG_TRANSPORT
880 G4cout <<
" Transport> Proposed isLastStep= " << isLastStep
881 <<
" Geometry did not limit step. Position : "
910 if( pNewVol!=0 && pNewMaterialCutsCouple!=0 && pNewMaterialCutsCouple->
GetMaterial()!=pNewMaterial )
914 pNewMaterialCutsCouple =
972 fieldMgrStore->ClearAllChordFindersState();
void SetMaterialInTouchable(G4Material *fMaterial)
void SetTouchableHandle(const G4TouchableHandle &fTouchable)
const G4ThreeVector & GetPolarization() const
G4double fCandidateEndGlobalTime
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
G4double GetLocalTime() const
G4ParticleChangeForTransport fParticleChange
void SetMaterialCutsCoupleInTouchable(const G4MaterialCutsCouple *fMaterialCutsCouple)
std::ostringstream G4ExceptionDescription
std::vector< G4ThreeVector > * GimmeTrajectoryVectorAndForgetIt() const
G4bool fShortStepOptimisation
CLHEP::Hep3Vector G4ThreeVector
G4double GetVelocity() const
const G4DynamicParticle * GetDynamicParticle() const
G4Material * GetMaterial() const
G4double endpointDistance
static const double nanometer
virtual ~G4ITTransportationState()
virtual G4double ComputeSafety(const G4ThreeVector &globalpoint, const G4double pProposedMaxLength=DBL_MAX, const G4bool keepState=false)
const G4ThreeVector & GetPosition() const
virtual G4double ComputeStep(const G4ThreeVector &pGlobalPoint, const G4ThreeVector &pDirection, const G4double pCurrentProposedStepLength, G4double &pNewSafety)
G4TrackStatus GetTrackStatus() const
G4double fMaxEnergyKilled
virtual G4VParticleChange * PostStepDoIt(const G4Track &track, const G4Step &)
void ProposePolarization(G4double Px, G4double Py, G4double Pz)
virtual G4VParticleChange * AlongStepDoIt(const G4Track &track, const G4Step &stepData)
G4ThreeVector fTransportEndPosition
virtual void LocateGlobalPointWithinVolume(const G4ThreeVector &position)
G4ITTransportation(const G4String &aName="ITTransportation", G4int verbosityLevel=1)
G4double GetVelocity() const
virtual G4double AlongStepGetPhysicalInteractionLength(const G4Track &track, G4double, G4double currentMinimumStep, G4double ¤tSafety, G4GPILSelection *selection)
G4bool ExitedMotherVolume() const
void SetInstantiateProcessState(G4bool flag)
void ProposePosition(G4double x, G4double y, G4double z)
G4ReferenceCountedHandle< G4VTouchable > G4TouchableHandle
G4ITNavigator * fLinearNavigator
G4StepPoint * GetPreStepPoint() const
virtual void Initialize(const G4Track &)
virtual void StartTracking(G4Track *)
G4double CalculateVelocityForOpticalPhoton() const
G4bool DoesGlobalFieldExist()
virtual void ConfigureForTrack(const G4Track *)
G4ITTransportation & operator=(const G4ITTransportation &)
virtual void StartTracking(G4Track *aTrack)
void SetGeometricallyLimitedStep()
G4double GetKineticEnergy() const
static G4ITTransportationManager * GetTransportationManager()
virtual G4double PostStepGetPhysicalInteractionLength(const G4Track &, G4double, G4ForceCondition *pForceCond)
G4GLOB_DLL std::ostream G4cout
virtual void ComputeStep(const G4Track &, const G4Step &, const double timeStep, double &spaceStep)
const G4ThreeVector & GetMomentumDirection() const
G4PropagatorInField * fFieldPropagator
virtual ~G4ITTransportation()
G4bool fInstantiateProcessState
G4bool fGeometryLimitedStep
G4double GetCharge() const
G4bool DoesFieldExist() const
virtual void StartTracking(G4Track *)
void SetInstantiateProcessState(G4bool flag)
const G4ParticleDefinition * GetParticleDefinition() const
void SetProcessSubType(G4int)
G4bool enablePostStepDoIt
G4double GetGlobalTime() const
G4double CalculateVelocity() const
G4FieldManager * FindAndSetFieldManager(G4VPhysicalVolume *pCurrentPhysVol)
const G4TouchableHandle & GetTouchableHandle() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
static G4TransportationManager * GetTransportationManager()
G4FieldManager * GetFieldManager() const
G4double fSumEnergyKilled
static G4ProductionCutsTable * GetProductionCutsTable()
const G4ThreeVector & GetMomentumDirection() const
G4ITNavigator * GetNavigatorForTracking()
G4LogicalVolume * GetLogicalVolume() const
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
static G4FieldManagerStore * GetInstance()
void SetSensitiveDetectorInTouchable(G4VSensitiveDetector *fSensitiveDetector)
static G4ParticleTable * GetParticleTable()
virtual G4VPhysicalVolume * GetVolume(G4int depth=0) const
void SetPointerToVectorOfAuxiliaryPoints(std::vector< G4ThreeVector > *theNewVectorPointer)
void ProposeGlobalTime(G4double t)
G4double fTransportEndKineticEnergy
G4bool fEndGlobalTimeComputed
G4bool EnteredDaughterVolume() const
G4VParticleChange * pParticleChange
void ProposeEnergy(G4double finalEnergy)
G4SafetyHelper * fpSafetyHelper
G4::shared_ptr< G4ProcessState > fpState
G4VPhysicalVolume * GetVolume() const
G4TouchableHandle fCurrentTouchableHandle
void SetCurrentSafety(G4double val, const G4ThreeVector &pos)
void ClearPropagatorState()
G4bool enableAlongStepDoIt
void ProposeLastStepInVolume(G4bool flag)
static char * startPosition
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
void ProposeTrackStatus(G4TrackStatus status)
G4double fUnimportant_Energy
G4double fThreshold_Important_Energy
const G4Field * GetDetectorField() const
G4VITProcess inherits from G4VProcess.
G4double fThreshold_Warning_Energy
G4bool fParticleIsLooping
void SetMomentumChanged(G4bool b)
G4PropagatorInField * GetPropagatorInField() const
void ProposeVelocity(G4double finalVelocity)
G4ProductionCuts * GetProductionCuts() const
G4VSensitiveDetector * GetSensitiveDetector() const
G4double * theInteractionTimeLeft
void ProposeLocalTime(G4double t)
G4ThreeVector fTransportEndSpin
G4double GetStepLength() const
G4ITTransportationState()
Process State.
G4ThreeVector fTransportEndMomentumDir
G4ThreeVector fPreviousSftOrigin
const G4Material * GetMaterial() const