67 fParticleIsLooping( false ),
70 fThreshold_Warning_Energy( 100 *
MeV ),
71 fThreshold_Important_Energy( 250 *
MeV ),
72 fThresholdTrials( 10 ),
75 fSumEnergyKilled( 0.0 ), fMaxEnergyKilled( 0.0 ),
76 fShortStepOptimisation(false),
116 G4cout <<
" G4MonopoleTransportation: Statistics for looping particles " 135 G4GPILSelection* selection )
140 G4double geometryStepLength, newSafety ;
152 *selection = CandidateForSelection ;
170 currentSafety = 0.0 ;
192 G4bool fieldExertsForce = false ;
194 if( (particleMagneticCharge != 0.0) )
214 if( !fieldExertsForce )
221 geometryStepLength = currentMinimumStep ;
234 fPreviousSftOrigin = startPosition ;
240 currentSafety = newSafety ;
246 geometryStepLength = linearStepLength ;
251 geometryStepLength = currentMinimumStep ;
280 particleMagneticCharge );
284 ->GetEquationOfMotion();
294 track.GetMomentumDirection(),
296 track.GetKineticEnergy(),
299 track.GetGlobalTime(),
300 track.GetProperTime(),
302 if( currentMinimumStep > 0 )
309 track.GetVolume() ) ;
312 geometryStepLength = lengthAlongCurve ;
314 geometryStepLength = currentMinimumStep ;
319 geometryStepLength = lengthAlongCurve= 0.0 ;
325 fPreviousSftOrigin = startPosition ;
351 if( currentMinimumStep == 0.0 )
364 if( particleMagneticCharge != 0.0 ) {
368 currentSafety = endSafety ;
378 #ifdef G4DEBUG_TRANSPORT 380 G4cout <<
"***G4MonopoleTransportation::AlongStepGPIL ** " <<
G4endl ;
382 <<
" and it returned safety= " << endSafety <<
G4endl ;
384 <<
" to obtain pseudo-safety= " << currentSafety <<
G4endl ;
394 return geometryStepLength ;
403 const G4Step& stepData )
405 static G4int noCalls=0;
428 G4double startTime = track.GetGlobalTime() ;
434 G4double finalVelocity = track.GetVelocity() ;
435 G4double initialVelocity = stepData.GetPreStepPoint()->GetVelocity() ;
436 G4double stepLength = track.GetStepLength() ;
444 deltaTime = stepLength/finalVelocity ;
446 else if (finalVelocity > 0.0)
450 meanInverseVelocity = 0.5
451 * ( 1.0 / initialVelocity + 1.0 / finalVelocity ) ;
452 deltaTime = stepLength * meanInverseVelocity ;
454 else if( initialVelocity > 0.0 )
456 deltaTime = stepLength/initialVelocity ;
469 G4double restMass = track.GetDynamicParticle()->GetMass() ;
470 G4double deltaProperTime = deltaTime*( restMass/track.GetTotalEnergy() ) ;
472 fParticleChange.ProposeProperTime(track.GetProperTime() + deltaProperTime) ;
496 G4cout <<
" G4MonopoleTransportation is killing track that is looping or stuck " 498 <<
" This track has " << track.GetKineticEnergy() /
MeV 499 <<
" MeV energy." <<
G4endl;
501 <<
" No of calls to AlongStepDoIt = " << noCalls
511 G4cout <<
" G4MonopoleTransportation::AlongStepDoIt(): Particle looping - " 513 <<
" No of calls to = " << noCalls
542 G4ForceCondition* pForceCond )
544 *pForceCond = Forced ;
572 LocateGlobalPointAndUpdateTouchableHandle( track.GetPosition(),
573 track.GetMomentumDirection(),
598 retCurrentTouchable = track.GetTouchableHandle() ;
625 if( pNewVol!=0 && pNewMaterialCutsCouple!=0 &&
626 pNewMaterialCutsCouple->
GetMaterial()!=pNewMaterial )
630 pNewMaterialCutsCouple =
635 fParticleChange.SetMaterialCutsCoupleInTouchable( pNewMaterialCutsCouple );
const G4Monopole * fParticleDef
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
virtual G4double AlongStepGetPhysicalInteractionLength(const G4Track &track, G4double previousStepSize, G4double currentMinimumStep, G4double ¤tSafety, G4GPILSelection *selection)
const G4Material * GetMaterial() const
virtual void SetChargeMomentumMass(G4ChargeState particleCharge, G4double MomentumXc, G4double MassXc2)=0
G4bool IsParticleLooping() const
CLHEP::Hep3Vector G4ThreeVector
void ClearAllChordFindersState()
G4Material * GetMaterial() const
virtual G4double ComputeStep(const G4ThreeVector &pGlobalPoint, const G4ThreeVector &pDirection, const G4double pCurrentProposedStepLength, G4double &pNewSafety)
G4ProductionCuts * GetProductionCuts() const
virtual void StartTracking(G4Track *aTrack)
virtual G4VParticleChange * PostStepDoIt(const G4Track &track, const G4Step &stepData)
G4PropagatorInField * fFieldPropagator
G4double GetTotalMomentum() const
G4ThreeVector fPreviousSftOrigin
~G4MonopoleTransportation()
G4bool fGeometryLimitedStep
G4double fThreshold_Important_Energy
G4bool fShortStepOptimisation
G4double fThreshold_Warning_Energy
G4double fTransportEndKineticEnergy
G4ParticleChangeForTransport fParticleChange
Definition of the G4MonopoleTransportation class.
G4SafetyHelper * fpSafetyHelper
G4bool fParticleIsLooping
virtual void StartTracking(G4Track *)
virtual void ConfigureForTrack(const G4Track *)
Definition of the G4Monopole class.
void SetGeometricallyLimitedStep()
G4GLOB_DLL std::ostream G4cout
G4double fSumEnergyKilled
virtual G4double PostStepGetPhysicalInteractionLength(const G4Track &, G4double previousStepSize, G4ForceCondition *pForceCond)
G4SafetyHelper * GetSafetyHelper() const
void SetProcessSubType(G4int)
G4double GetPDGSpin() const
G4Navigator * GetNavigatorForTracking() const
G4double MagneticCharge() const
static G4MonopoleFieldSetup * GetMonopoleFieldSetup()
const G4MagIntegratorStepper * GetStepper() const
G4ThreeVector fTransportEndSpin
G4double fMaxEnergyKilled
G4FieldManager * FindAndSetFieldManager(G4VPhysicalVolume *pCurrentPhysVol)
virtual G4VPhysicalVolume * GetVolume(G4int depth=0) const
G4bool DoesGlobalFieldExist()
static G4TransportationManager * GetTransportationManager()
G4ThreeVector fTransportEndPosition
G4Navigator * fLinearNavigator
G4MonopoleTransportation(const G4Monopole *p, G4int verbosityLevel=1)
G4double ComputeStep(G4FieldTrack &pFieldTrack, G4double pCurrentProposedStepLength, G4double &pNewSafety, G4VPhysicalVolume *pPhysVol=0)
static G4ProductionCutsTable * GetProductionCutsTable()
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
G4double GetCharge() const
G4bool fEndGlobalTimeComputed
void SetStepperAndChordFinder(G4int val)
static G4FieldManagerStore * GetInstance()
static G4ParticleTable * GetParticleTable()
#define fPreviousSftOrigin
std::vector< G4ThreeVector > * GimmeTrajectoryVectorAndForgetIt() const
G4TouchableHandle fCurrentTouchableHandle
const G4ThreeVector & GetMomentumDirection() const
G4ChordFinder * GetChordFinder()
G4double GetLabTimeOfFlight() const
G4double GetPDGMass() const
const G4ThreeVector & GetMomentumDir() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
virtual G4VParticleChange * AlongStepDoIt(const G4Track &track, const G4Step &stepData)
G4ThreeVector GetSpin() const
G4VSensitiveDetector * GetSensitiveDetector() const
G4double fCandidateEndGlobalTime
G4ThreeVector fTransportEndMomentumDir
void SetCurrentSafety(G4double val, const G4ThreeVector &pos)
void ClearPropagatorState()
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
G4ThreeVector GetPosition() const
G4double endpointDistance
G4PropagatorInField * GetPropagatorInField() const
virtual G4double ComputeSafety(const G4ThreeVector &globalpoint, const G4double pProposedMaxLength=DBL_MAX, const G4bool keepState=true)
G4LogicalVolume * GetLogicalVolume() const
G4MagInt_Driver * GetIntegrationDriver()
virtual void LocateGlobalPointWithinVolume(const G4ThreeVector &position)
G4MonopoleFieldSetup * fMagSetup
const G4Field * GetDetectorField() const