CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch13/src/TrackingTools/GeomPropagators/interface/HelixArbitraryPlaneCrossing2Order.h

Go to the documentation of this file.
00001 #ifndef HELIXARBITRARYPLANECROSSING2ORDER_H_
00002 #define HELIXARBITRARYPLANECROSSING2ORDER_H_
00003 #include "DataFormats/TrajectorySeed/interface/PropagationDirection.h"
00004 #include "TrackingTools/GeomPropagators/interface/HelixPlaneCrossing.h"
00005 
00009 class HelixArbitraryPlaneCrossing2Order : public HelixPlaneCrossing {
00010 
00011 
00012 public:
00015   HelixArbitraryPlaneCrossing2Order(const PositionType& point,
00016                                     const DirectionType& direction,
00017                                     const float curvature,
00018                                     const PropagationDirection propDir = alongMomentum);
00021   HelixArbitraryPlaneCrossing2Order(const double& x0, const double& y0, const double& z0,
00022                                     const double& cosPhi0, const double& sinPhi0,
00023                                     const double& cosTheta, const double& sinTheta,
00024                                     const double& rho,
00025                                     const PropagationDirection propDir = alongMomentum) :
00026     theX0(x0), theY0(y0), theZ0(z0),
00027     theCosPhi0(cosPhi0), theSinPhi0(sinPhi0),
00028     theCosTheta(cosTheta), theSinThetaI(1./sinTheta),
00029     theRho(rho), 
00030     thePropDir(propDir) {}
00031 
00032   // destructor
00033   virtual ~HelixArbitraryPlaneCrossing2Order() {}
00034 
00039   virtual std::pair<bool,double> pathLength(const Plane&);
00040 
00043   virtual PositionType position(double s) const;
00044 
00047   virtual DirectionType direction(double s) const;
00048   //
00049   // double precision vectors
00050   //
00051   typedef Basic3DVector<double>  PositionTypeDouble;
00052   typedef Basic3DVector<double>  DirectionTypeDouble;
00053 
00056   PositionTypeDouble positionInDouble(double s) const;
00057 
00060   DirectionTypeDouble directionInDouble(double s) const;
00061 
00064   inline double smallestPathLength (const double firstPathLength,
00065                                     const double secondPathLength) const {
00066     return fabs(firstPathLength)<fabs(secondPathLength) ? firstPathLength : secondPathLength;
00067   }
00068 
00069 private:
00070 
00073   std::pair<bool,double> solutionByDirection(const double dS1,const double dS2) const;
00074 
00075 private:
00076   const double theX0,theY0,theZ0;
00077   double theCosPhi0,theSinPhi0;
00078   double theCosTheta,theSinThetaI;
00079   const double theRho;
00080   const PropagationDirection thePropDir;
00081 
00082 };
00083 
00084 #endif
00085 
00086