Go to the documentation of this file.00001 #ifndef NavPropagator_H_
00002 #define NavPropagator_H_
00003
00004 #include "TrackingTools/GeomPropagators/interface/Propagator.h"
00005 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00006
00007 #include "TrackingTools/MaterialEffects/interface/VolumeMediumProperties.h"
00008 #include "TrackingTools/MaterialEffects/interface/VolumeMaterialEffectsUpdator.h"
00009 #include "TrackingTools/MaterialEffects/interface/VolumeMultipleScatteringEstimator.h"
00010 #include "TrackingTools/MaterialEffects/interface/VolumeEnergyLossEstimator.h"
00011
00012 #include <map>
00013
00014 class MagneticField;
00015 class VolumeBasedMagneticField;
00016 class RKPropagatorInS;
00017 class NavVolume;
00018 class MagVolume;
00019
00020
00021 class NavPropagator : public Propagator {
00022
00023 public:
00024
00025 NavPropagator( const MagneticField* field,
00026 PropagationDirection dir = alongMomentum);
00027
00028 ~NavPropagator();
00029
00030
00031
00032
00033
00034
00035
00036 using Propagator::propagate;
00037 using Propagator::propagateWithPath;
00038
00040 TrajectoryStateOnSurface propagate(const TrajectoryStateOnSurface& ts,
00041 const Plane& plane) const {
00042 return propagateWithPath(ts,plane).first;
00043 }
00045 std::pair<TrajectoryStateOnSurface,double>
00046 propagateWithPath(const TrajectoryStateOnSurface& ,
00047 const Plane& plane) const;
00048
00050 TrajectoryStateOnSurface propagate(const FreeTrajectoryState& ts,
00051 const Plane& plane) const {
00052 return propagateWithPath(ts,plane).first;
00053 }
00055 std::pair<TrajectoryStateOnSurface,double>
00056 propagateWithPath(const FreeTrajectoryState& ,
00057 const Plane& plane) const;
00058
00060 TrajectoryStateOnSurface propagate(const FreeTrajectoryState& fts,
00061 const Cylinder& cylinder) const {
00062 return propagateWithPath(fts,cylinder).first;
00063 }
00065 std::pair<TrajectoryStateOnSurface,double>
00066 propagateWithPath(const FreeTrajectoryState& fts,
00067 const Cylinder& cylinder) const;
00068
00069 virtual NavPropagator * clone() const {return new NavPropagator(*this);}
00070
00071 virtual const MagneticField* magneticField() const;
00072
00073 private:
00074
00075 typedef std::pair<TrajectoryStateOnSurface,double> TsosWP;
00076 typedef RKPropagatorInS PropagatorType;
00077 typedef std::map<const MagVolume*, NavVolume*> MagVolumeMap;
00078 typedef TrajectoryStateOnSurface TSOS;
00079
00080
00081 const VolumeBasedMagneticField* theField;
00082 mutable MagVolumeMap theNavVolumeMap;
00083 bool isIronVolume[272];
00084
00085
00086 const NavVolume* findVolume( const TrajectoryStateOnSurface& inputState) const;
00087
00088 const NavVolume* navVolume( const MagVolume* magVolume) const;
00089
00090 bool destinationCrossed( const TSOS& startState,
00091 const TSOS& endState, const Plane& plane) const;
00092
00093 TrajectoryStateOnSurface noNextVolume( TrajectoryStateOnSurface startingState) const;
00094
00095 std::pair<TrajectoryStateOnSurface,double>
00096 propagateInVolume( const NavVolume* currentVolume,
00097 const TrajectoryStateOnSurface& startingState,
00098 const Plane& targetPlane) const;
00099
00100 const VolumeMediumProperties theAirMedium;
00101 const VolumeMediumProperties theIronMedium;
00102 const VolumeMultipleScatteringEstimator theMSEstimator;
00103 const VolumeEnergyLossEstimator theELEstimator;
00104 const VolumeMaterialEffectsUpdator theMaterialUpdator;
00105 };
00106
00107 #endif