Go to the documentation of this file.00001 #ifndef CommonDet_Propagator_H
00002 #define CommonDet_Propagator_H
00003
00004 #include "DataFormats/TrajectorySeed/interface/PropagationDirection.h"
00005 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
00006 #include <utility>
00007
00008 class FreeTrajectoryState;
00009 class TrajectoryStateOnSurface;
00010 class Plane;
00011 class Cylinder;
00012 class Surface;
00013 class MagneticField;
00014
00015 namespace reco{class BeamSpot;}
00016
00038 class Propagator {
00039 public:
00040
00041 Propagator (PropagationDirection dir = alongMomentum) :
00042 theDir(dir) {}
00043 virtual ~Propagator() {}
00044
00052 virtual TrajectoryStateOnSurface
00053 propagate (const FreeTrajectoryState&, const Surface&) const;
00054
00055 virtual TrajectoryStateOnSurface
00056 propagate (const FreeTrajectoryState&, const Plane&) const = 0;
00057
00058 virtual TrajectoryStateOnSurface
00059 propagate (const FreeTrajectoryState&, const Cylinder&) const = 0;
00060
00071 virtual TrajectoryStateOnSurface
00072 propagate (const TrajectoryStateOnSurface&, const Surface&) const;
00073
00074 virtual TrajectoryStateOnSurface
00075 propagate (const TrajectoryStateOnSurface&, const Plane&) const;
00076
00077 virtual TrajectoryStateOnSurface
00078 propagate (const TrajectoryStateOnSurface&, const Cylinder&) const;
00079
00080 virtual FreeTrajectoryState
00081 propagate(const FreeTrajectoryState&,
00082 const reco::BeamSpot&) const;
00083
00093 virtual std::pair< TrajectoryStateOnSurface, double>
00094 propagateWithPath (const FreeTrajectoryState&, const Surface&) const;
00095
00096 virtual std::pair< TrajectoryStateOnSurface, double>
00097 propagateWithPath (const FreeTrajectoryState&, const Plane&) const = 0;
00098
00099 virtual std::pair< TrajectoryStateOnSurface, double>
00100 propagateWithPath (const FreeTrajectoryState&, const Cylinder&) const=0;
00101
00112 virtual std::pair< TrajectoryStateOnSurface, double>
00113 propagateWithPath (const TrajectoryStateOnSurface&, const Surface&) const;
00114
00115 virtual std::pair< TrajectoryStateOnSurface, double>
00116 propagateWithPath (const TrajectoryStateOnSurface&, const Plane&) const;
00117
00118 virtual std::pair< TrajectoryStateOnSurface, double>
00119 propagateWithPath (const TrajectoryStateOnSurface&, const Cylinder&) const;
00120
00121 virtual std::pair<FreeTrajectoryState, double>
00122 propagateWithPath(const FreeTrajectoryState&,
00123 const GlobalPoint&, const GlobalPoint&) const;
00124
00132 virtual void setPropagationDirection(PropagationDirection dir) const {
00133 theDir = dir;
00134 }
00135
00143 virtual PropagationDirection propagationDirection() const {
00144 return theDir;
00145 }
00146
00157 virtual bool setMaxDirectionChange( float phiMax) { return false;}
00158
00159 virtual Propagator * clone() const = 0;
00160
00161 virtual const MagneticField* magneticField() const = 0;
00162
00163 private:
00164
00165 mutable PropagationDirection theDir;
00166 };
00167
00168 class SetPropagationDirection {
00169 private:
00170 Propagator const & prop;
00171 PropagationDirection oldDir;
00172 public:
00173 SetPropagationDirection(Propagator const & iprop, PropagationDirection dir) :
00174 prop(iprop),
00175 oldDir(iprop.propagationDirection()) {
00176 prop.setPropagationDirection(dir);
00177 }
00178 ~SetPropagationDirection() {
00179 prop.setPropagationDirection(oldDir);
00180 }
00181 };
00182
00183
00184 #endif // CommonDet_Propagator_H