The error propagation package serves to propagate one particle together with its error from a given trajectory state until a user-defined target is reached (a surface, a volume, a given track length,...).
The error propagator package computes the average trajectory that a particle would follow. This means that the physics list must have the following characteristics:
It has also to be taken into account that when the propagation is done backwards (in the direction opposed to the one the original track traveled) the energy loss has to be changed into an energy gain.
All this is done in the
G4ErrorPhysicsList class, that is automatically set by
G4ErrorPropagatorManager as the GEANT4 physics list.
G4ErrorEnergyLoss as unique electromagnetic process. This process uses the GEANT4 class
G4EnergyLossForExtrapolator to compute the average energy loss for forwards or backwards propagation.
To avoid getting too different energy loss calculation when the propagation is done forwards (when the energy at the beginning of the step is used) or backwards (when the energy at the end of the step is used, always smaller than at the beginning)
G4ErrorEnergyLoss computes once the energy loss and then replaces the original energy loss by subtracting/adding half of this value (what is approximately the same as computing the energy loss with the energy at the middle of the step).
In this way, a better calculation of the energy loss is obtained with a minimal impact on the total CPU time.
The user may use his/her own physics list instead of
G4ErrorPhysicsList. As it is not needed to define a physics list when running this package, the user may have not realized that somewhere else in his/her application it has been defined; therefore a warning will be sent to advert the user that he is using a physics list different to
G4ErrorPhysicsList. If a new physics list is used, it should also initialize the
G4ErrorMessenger with the classes that serve to limit the step:
G4ErrorEnergyLoss* eLossProcess = new G4ErrorEnergyLoss; G4ErrorStepLengthLimitProcess* stepLengthLimitProcess = new G4ErrorStepLengthLimitProcess; G4ErrorMagFieldLimitProcess* magFieldLimitProcess = new G4ErrorMagFieldLimitProcess; new G4ErrorMessenger( stepLengthLimitProcess, magFieldLimitProcess, eLossProcess );
To ease the use of this package in the reconstruction code, the physics list, whether
G4ErrorPhysicsList or the user's one, will be automatically initialized before starting the track propagation if it has not been done by the user.
The user has to provide the particle trajectory state at the initial point.
To do this it has to create an object of one of the children classes of
G4ErrorTrajState( const G4String& partType, const G4Point3D& pos, const G4Vector3D& mom, const G4ErrorTrajErr& errmat = G4ErrorTrajErr(5,0) );
A particle trajectory is characterized by five independent variables as a function of one parameter (e.g. the path length). Among the five variables, one is related to the curvature (to the absolute value of the momentum), two are related to the direction of the particle and the other two are related to the spatial location.
There are two possible representations of these five parameters in the error propagator package: as a free trajectory state, class
G4ErrorTrajStateFree, or as a trajectory state on a surface, class
fInvP is the inverse of the momentum.
fPhi are the dip and azimuthal angles related to the momentum components in the following way:
p_x = p cos(lambda) cos(phi) p_y = p cos(lambda) sin(phi) p_z = p sin(lambda)
lambda = 90 - theta, where
theta is the usual angle with respect to the Z axis.
fZperp are the coordinates of the trajectory in a local orthonormal reference frame with the X axis along the particle direction, the Y axis being parallel to the X-Y plane (obtained by the vectorial product of the global Z axis and the momentum).
In the trajectory state on a surface representation the five trajectory parameters are
fInvP is the inverse of the momentum;
fPW are the momentum components in an orthonormal coordinate system with axis U, V and W;
fW are the position components on this coordinate system.
G4ErrorSurfaceTrajState( const G4String& partType, const G4Point3D& pos, const G4Vector3D& mom, const G4Vector3D& vecV, const G4Vector3D& vecW, const G4ErrorTrajErr& errmat = G4ErrorTrajErr(5,0) );
G4ErrorSurfaceTrajState( const G4String& partType, const G4Point3D& pos, const G4Vector3D& mom, const G4Plane3D& plane, const G4ErrorTrajErr& errmat = G4ErrorTrajErr(5,0) );
The 5X5 error matrix should also be provided at the creation of the trajectory state as a
If it is not provided a default object will be created filled with null values.
G4ErrorTrajErr is a
G4ErrorSymMatrix, a simplified version of
The error matrix is given in units of GeV and cm. Therefore you should do the conversion if your code is using other units.
The user has to define up to where the propagation must be done: the target.
The target can be a surface
G4ErrorSurfaceTarget, which is not part of the GEANT4 geometry.
It can also be the surface of a GEANT4 volume
G4ErrorGeomVolumeTarget, so that the particle will be stopped when it enters this volume.
Or it can be that the particle is stopped when a certain track length is reached, by implementing a
G4ErrorSurfaceTargetas target, the track is propagated until the surface is reached. This surface is not part of GEANT4 geometry, but usually traverses many GEANT4 volumes. The class
G4ErrorNavigatortakes care of the double navigation: for each step the step length is calculated as the minimum of the step length in the full geometry (up to a GEANT4 volume surface) and the distance to the user-defined surface. To do it,
G4Navigatorand overwrites the methods
ComputeSafety(). Two types of surface are currently supported (more types could be easily implemented at user request): plane and cylindrical.
G4ErrorPlaneSurfaceTargetimplements an infinite plane surface. The surface can be given as the four coefficients of the plane equation
ax+by+cz+d = 0:
G4ErrorPlaneSurfaceTarget(G4double a=0, G4double b=0, G4double c=0, G4double d=0);
G4ErrorPlaneSurfaceTarget(const G4Normal3D &n, const G4Point3D &p);
G4ErrorPlaneSurfaceTarget(const G4Point3D &p1, const G4Point3D &p2, const G4Point3D &p3);
G4ErrorCylSurfaceTargetimplements an infinite-length cylindrical surface (a cylinder without end-caps). The surface can be given as the radius, the translation and the rotation
G4ErrorCylSurfaceTarget( const G4double& radius, const G4ThreeVector& trans=G4ThreeVector(), const G4RotationMatrix& rotm=G4RotationMatrix() );
G4ErrorCylSurfaceTarget( const G4double& radius, const G4AffineTransform& trans );
When the user chooses a
G4ErrorGeomVolumeTarget as target, the track is propagated until the surface of a GEANT4 volume is reached. User can choose if the track will be stopped only when the track enters the volume, only when the track exits the volume or in both cases.
G4ErrorGeomVolumeTarget( const G4String& name );
When the user chooses a
G4ErrorTrackLengthTarget as target, the track is propagated until the given track length is reached.
G4ErrorTrackLengthTarget(const G4double maxTrkLength );
It is implemented as a
G4VDiscreteProcess and it limits the step in
To ease its use, the process is registered to all particles in the constructor.
The user needs to propagate just one track, so there is no need of run and events. neither of
G4ErrorPropagator creates a track from the information given in the
G4ErrorTrajState and manages the step propagation.
The propagation is done by the standard GEANT4 methods, invoking
G4SteppingManager::Stepping() to propagate each step.
After one step is propagated,
G4ErrorPropagator takes cares of propagating the track errors for this step, what is done by
The equations of error propagation are only implemented in the representation of
Therefore if the user has provided instead a
G4ErrorTrajStateOnSurface object, it will be transformed into a
G4ErrorTrajStateFree at the beginning of tracking, and at the end it is converted back into
G4ErrorTrajStateOnSurface on the target surface (on the normal plane to the surface at the final point).
G4VUserTrackingAction::PreUserTrackingAction( const G4Track* ) and
G4VUserTrackingAction::PreUserTrackingAction( const G4Track* ) are also invoked at the beginning and at the end of the track propagation.
G4ErrorPropagator stops the tracking when one of the three conditions is true:
In case the defined target is not reached,
G4ErrorPropagator::Propagate() returns a negative value.
The propagation of a trajectory state until a user defined target can be done by invoking the method of
G4int Propagate( G4ErrorTrajState* currentTS, const G4ErrorTarget* target, G4ErrorMode mode = G4ErrorMode_PropForwards );
You can get the pointer to the only instance of
G4ErrorPropagatorManager* g4emgr = G4ErrorPropagatorManager::GetErrorPropagatorManager();
G4int PropagateOneStep( G4ErrorTrajState* currentTS, G4ErrorMode mode = G4ErrorMode_PropForwards );
G4ErrorPropagatorData::GetG4ErrorPropagatorData()->SetTarget( theG4eTarget );
The formulas assume propagation along an helix. This means that it is necessary to make steps small enough to assure magnetic field constantness and not too big energy loss.
G4UImanager::GetUIpointer()->ApplyCommand("/geant4e/limits/stepLength MY_VALUE MY_UNIT");