CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_5_3_14/src/TrackingTools/GeomPropagators/interface/Propagator.h

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