CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_4_5_patch3/src/TrackPropagation/RungeKutta/interface/RKPropagatorInS.h

Go to the documentation of this file.
00001 #ifndef RKPropagatorInS_H
00002 #define RKPropagatorInS_H
00003 
00004 #include "TrackingTools/GeomPropagators/interface/Propagator.h"
00005 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00006 #include "DataFormats/GeometryVector/interface/Basic3DVector.h"
00007 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00008 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
00009 #include "DataFormats/TrajectoryState/interface/TrackCharge.h"
00010 #include "MagneticField/VolumeGeometry/interface/MagVolume.h"
00011 #include "FWCore/Utilities/interface/Visibility.h"
00012 
00013 
00014 class GlobalTrajectoryParameters;
00015 class GlobalParametersWithPath;
00016 class MagVolume;
00017 class RKLocalFieldProvider;
00018 class CartesianStateAdaptor;
00019 
00020 class RKPropagatorInS : public Propagator {
00021 public:
00022 
00023   // RKPropagatorInS( PropagationDirection dir = alongMomentum) : Propagator(dir), theVolume(0) {}
00024   // tolerance (see below) used to be 1.e-5 --> this was observed to cause problems with convergence 
00025   // when propagating to cylinder with large radius (~10 meter) MM 22/6/07
00026 
00027   explicit RKPropagatorInS( const MagVolume& vol, PropagationDirection dir = alongMomentum,
00028                             double tolerance = 5.e-5) : 
00029     Propagator(dir), theVolume( &vol), theTolerance( tolerance) {}
00030 
00031   ~RKPropagatorInS() {}
00032 
00033   using Propagator::propagate;
00034   using Propagator::propagateWithPath;
00035 
00036   virtual TrajectoryStateOnSurface 
00037   propagate (const FreeTrajectoryState&, const Plane&) const;
00038 
00039   virtual TrajectoryStateOnSurface 
00040   propagate (const FreeTrajectoryState&, const Cylinder&) const;
00041 
00042   virtual std::pair< TrajectoryStateOnSurface, double> 
00043   propagateWithPath (const FreeTrajectoryState&, const Plane&) const;
00044 
00045   virtual std::pair< TrajectoryStateOnSurface, double> 
00046   propagateWithPath (const FreeTrajectoryState&, const Cylinder&) const;
00047 
00048   TrajectoryStateOnSurface propagate(const TrajectoryStateOnSurface& ts, 
00049                                      const Plane& plane) const {
00050     return propagateWithPath( *ts.freeState(),plane).first;
00051   }
00052   
00053 
00054 
00055   virtual Propagator * clone() const;
00056 
00057   virtual const MagneticField* magneticField() const {return theVolume;}
00058 
00059 private:
00060 
00061   typedef std::pair<TrajectoryStateOnSurface,double>     TsosWP;
00062 
00063   const MagVolume* theVolume;
00064   double           theTolerance;
00065 
00066   GlobalTrajectoryParameters gtpFromLocal( const Basic3DVector<double>& lpos,
00067                                            const Basic3DVector<double>& lmom,
00068                                            TrackCharge ch, const Surface& surf) const dso_internal;
00069 
00070   GlobalTrajectoryParameters gtpFromVolumeLocal( const CartesianStateAdaptor& state, 
00071                                                  TrackCharge charge) const  dso_internal;
00072     
00073   RKLocalFieldProvider fieldProvider() const;
00074   RKLocalFieldProvider fieldProvider( const Cylinder& cyl) const dso_internal;
00075 
00076   PropagationDirection invertDirection( PropagationDirection dir) const dso_internal;
00077 
00078   Basic3DVector<double> rkPosition( const GlobalPoint& pos) const dso_internal;
00079   Basic3DVector<double> rkMomentum( const GlobalVector& mom) const dso_internal;
00080   GlobalPoint           globalPosition( const Basic3DVector<double>& pos) const dso_internal;
00081   GlobalVector          globalMomentum( const Basic3DVector<double>& mom) const dso_internal;
00082 
00083   GlobalParametersWithPath propagateParametersOnPlane( const FreeTrajectoryState& ts, 
00084                                                        const Plane& plane) const dso_internal;
00085   GlobalParametersWithPath propagateParametersOnCylinder( const FreeTrajectoryState& ts, 
00086                                                           const Cylinder& cyl) const dso_internal;
00087 
00088 };
00089 
00090 #endif