140 G4double geometryStepLength, newSafety ;
141 fParticleIsLooping = false ;
166 G4ThreeVector OriginShift = startPosition - fPreviousSftOrigin ;
168 if( MagSqShift >=
sqr(fPreviousSafety) )
170 currentSafety = 0.0 ;
174 currentSafety = fPreviousSafety - std::sqrt(MagSqShift) ;
182 fGeometryLimitedStep = false ;
192 G4bool fieldExertsForce = false ;
194 if( (particleMagneticCharge != 0.0) )
214 if( !fieldExertsForce )
217 if( fShortStepOptimisation && (currentMinimumStep <= currentSafety) )
221 geometryStepLength = currentMinimumStep ;
222 fGeometryLimitedStep = false ;
228 linearStepLength = fLinearNavigator->
ComputeStep( startPosition,
234 fPreviousSftOrigin = startPosition ;
235 fPreviousSafety = newSafety ;
240 currentSafety = newSafety ;
242 fGeometryLimitedStep= (linearStepLength <= currentMinimumStep);
243 if( fGeometryLimitedStep )
246 geometryStepLength = linearStepLength ;
251 geometryStepLength = currentMinimumStep ;
254 endpointDistance = geometryStepLength ;
258 fTransportEndPosition = startPosition+geometryStepLength*startMomentumDir ;
262 fTransportEndMomentumDir = startMomentumDir ;
265 fParticleIsLooping = false ;
266 fMomentumChanged = false ;
267 fEndGlobalTimeComputed = false ;
280 particleMagneticCharge );
284 ->GetEquationOfMotion();
301 if( currentMinimumStep > 0 )
305 lengthAlongCurve = fFieldPropagator->
ComputeStep( aFieldTrack,
309 fGeometryLimitedStep= lengthAlongCurve < currentMinimumStep;
310 if( fGeometryLimitedStep ) {
311 geometryStepLength = lengthAlongCurve ;
313 geometryStepLength = currentMinimumStep ;
318 geometryStepLength = lengthAlongCurve= 0.0 ;
319 fGeometryLimitedStep = false ;
324 fPreviousSftOrigin = startPosition ;
325 fPreviousSafety = currentSafety ;
330 fTransportEndPosition = aFieldTrack.
GetPosition() ;
334 fMomentumChanged = true ;
340 fEndGlobalTimeComputed =
true;
342 fTransportEndSpin = aFieldTrack.
GetSpin();
344 endpointDistance = (fTransportEndPosition - startPosition).mag() ;
350 if( currentMinimumStep == 0.0 )
352 if( currentSafety == 0.0 ) fGeometryLimitedStep = true ;
358 if( currentSafety < endpointDistance )
363 if( particleMagneticCharge != 0.0 ) {
367 currentSafety = endSafety ;
368 fPreviousSftOrigin = fTransportEndPosition ;
369 fPreviousSafety = currentSafety ;
375 currentSafety += endpointDistance ;
377 #ifdef G4DEBUG_TRANSPORT
379 G4cout <<
"***G4MonopoleTransportation::AlongStepGPIL ** " <<
G4endl ;
380 G4cout <<
" Called Navigator->ComputeSafety at " << fTransportEndPosition
381 <<
" and it returned safety= " << endSafety <<
G4endl ;
382 G4cout <<
" Adding endpoint distance " << endpointDistance
383 <<
" to obtain pseudo-safety= " << currentSafety <<
G4endl ;
393 return geometryStepLength ;
const G4ThreeVector & GetPolarization() const
virtual void SetChargeMomentumMass(G4ChargeState particleCharge, G4double MomentumXc, G4double MassXc2)=0
G4double GetProperTime() const
G4double GetVelocity() const
G4double GetKineticEnergy() const
const G4DynamicParticle * GetDynamicParticle() const
const G4MagIntegratorStepper * GetStepper() const
const G4ThreeVector & GetPosition() const
const G4ThreeVector & GetMomentumDir() const
G4ThreeVector GetSpin() const
virtual G4double ComputeStep(const G4ThreeVector &pGlobalPoint, const G4ThreeVector &pDirection, const G4double pCurrentProposedStepLength, G4double &pNewSafety)
G4double GetTotalMomentum() const
virtual void ConfigureForTrack(const G4Track *)
G4double GetKineticEnergy() const
G4ThreeVector GetPosition() const
G4GLOB_DLL std::ostream G4cout
G4double MagneticCharge() const
const G4ThreeVector & GetMomentumDirection() const
G4double GetCharge() const
void ProposeTrueStepLength(G4double truePathLength)
G4double GetGlobalTime() const
G4FieldManager * FindAndSetFieldManager(G4VPhysicalVolume *pCurrentPhysVol)
G4double ComputeStep(G4FieldTrack &pFieldTrack, G4double pCurrentProposedStepLength, G4double &pNewSafety, G4VPhysicalVolume *pPhysVol=0)
const G4ThreeVector & GetMomentumDirection() const
void SetStepperAndChordFinder(G4int val)
G4double GetPDGMass() const
G4bool IsParticleLooping() const
G4double GetLabTimeOfFlight() const
G4ChordFinder * GetChordFinder()
G4VPhysicalVolume * GetVolume() const
G4double GetPDGSpin() const
void SetCurrentSafety(G4double val, const G4ThreeVector &pos)
const G4Field * GetDetectorField() const
virtual G4double ComputeSafety(const G4ThreeVector &globalpoint, const G4double pProposedMaxLength=DBL_MAX, const G4bool keepState=true)
G4MagInt_Driver * GetIntegrationDriver()