00001 #ifndef GeomPropagators_BeamHaloPropagator_H
00002 #define GeomPropagators_BeamHaloPropagator_H
00003
00014
00015 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
00016 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00017 #include "TrackingTools/GeomPropagators/interface/Propagator.h"
00018 #include "MagneticField/Engine/interface/MagneticField.h"
00019 #include "DataFormats/GeometrySurface/interface/ReferenceCounted.h"
00020 #include "DataFormats/TrajectorySeed/interface/PropagationDirection.h"
00021
00022
00023
00024 class BeamHaloPropagator : public Propagator {
00025
00026 public:
00027
00028
00030 BeamHaloPropagator(Propagator* aEndCapTkProp, Propagator* aCrossTkProp, const MagneticField* field,
00031 PropagationDirection dir = alongMomentum);
00032
00034 BeamHaloPropagator(const Propagator& aEndCapTkProp,const Propagator& aCrossTkProp, const MagneticField* field,
00035 PropagationDirection dir = alongMomentum);
00036
00037
00039 BeamHaloPropagator( const BeamHaloPropagator& );
00040
00042 virtual ~BeamHaloPropagator() ;
00043
00045 virtual BeamHaloPropagator* clone() const {
00046 return new BeamHaloPropagator(getEndCapTkPropagator(),getCrossTkPropagator(),magneticField(),propagationDirection());
00047 }
00048
00049
00050 void setPropagationDirection (PropagationDirection dir)
00051 {
00052 Propagator::setPropagationDirection(dir);
00053 getEndCapTkPropagator()->setPropagationDirection(dir);
00054 getCrossTkPropagator()->setPropagationDirection(dir);
00055 }
00056
00057
00058
00059
00060 TrajectoryStateOnSurface propagate(const FreeTrajectoryState& fts,
00061 const Surface& surface) const;
00062
00063 TrajectoryStateOnSurface propagate(const TrajectoryStateOnSurface& tsos,
00064 const Surface& surface) const {
00065 return Propagator::propagate(tsos,surface);
00066 }
00067
00068 TrajectoryStateOnSurface propagate(const FreeTrajectoryState& fts,
00069 const Plane& plane) const;
00070
00071 TrajectoryStateOnSurface propagate(const TrajectoryStateOnSurface& tsos,
00072 const Plane& plane) const {
00073 return Propagator::propagate(tsos, plane);
00074 }
00075
00076 TrajectoryStateOnSurface propagate(const FreeTrajectoryState& fts,
00077 const Cylinder& cylinder) const;
00078
00079 TrajectoryStateOnSurface propagate(const TrajectoryStateOnSurface& tsos,
00080 const Cylinder& cylinder) const {
00081 return Propagator::propagate(tsos, cylinder);
00082 }
00083
00084 std::pair<TrajectoryStateOnSurface,double>
00085 propagateWithPath(const FreeTrajectoryState& fts,
00086 const Surface& surface) const {
00087 return Propagator::propagateWithPath(fts,surface);
00088 }
00089
00090 std::pair<TrajectoryStateOnSurface,double>
00091 propagateWithPath(const TrajectoryStateOnSurface& tsos,
00092 const Surface& surface) const {
00093 return Propagator::propagateWithPath(tsos,surface);
00094 }
00095
00096 std::pair<TrajectoryStateOnSurface,double>
00097 propagateWithPath(const FreeTrajectoryState& fts,
00098 const Plane& plane) const;
00099
00100 std::pair<TrajectoryStateOnSurface,double>
00101 propagateWithPath(const TrajectoryStateOnSurface& tsos,
00102 const Plane& plane) const {
00103 return Propagator::propagateWithPath(tsos, plane);
00104 }
00105
00106 std::pair<TrajectoryStateOnSurface,double>
00107 propagateWithPath(const FreeTrajectoryState& fts,
00108 const Cylinder& cylinder) const;
00109
00110 std::pair<TrajectoryStateOnSurface,double>
00111 propagateWithPath(const TrajectoryStateOnSurface& tsos,
00112 const Cylinder& cylinder) const {
00113 return Propagator::propagateWithPath(tsos, cylinder);
00114 }
00115
00117 bool crossingTk(const FreeTrajectoryState& fts, const Plane& plane) const ;
00118
00120 Propagator* getEndCapTkPropagator() const ;
00122 Propagator* getCrossTkPropagator() const ;
00124 virtual const MagneticField* magneticField() const {return theField;}
00125
00126 private:
00127 void directionCheck(PropagationDirection dir)const;
00128
00129 mutable Propagator* theEndCapTkProp;
00130 mutable Propagator* theCrossTkProp;
00131 const MagneticField* theField;
00132
00133 protected:
00134
00135 };
00136
00137 #endif
00138
00139