| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

CircleTraj.cpp

Go to the documentation of this file.
00001 // $Id: CircleTraj.cpp,v 1.12 2007/10/16 11:50:59 wouter Exp $
00002 // Include files
00003 
00004 // local
00005 #include "Kernel/CircleTraj.h"
00006 
00007 #include "Math/GenVector/AxisAngle.h"
00008 #include <math.h>
00009 
00010 using namespace LHCb;
00011 using namespace ROOT::Math;
00012 using namespace Gaudi;
00013 
00014 std::auto_ptr<Trajectory> CircleTraj::clone() const
00015 {
00016   return std::auto_ptr<Trajectory>(new CircleTraj(*this));
00017 }
00018 
00019 CircleTraj::CircleTraj( const Point& origin,
00020                         const Vector& dir1,
00021                         const Vector& dir2,
00022                         double radius)
00023   : Trajectory(0.,radius*std::asin((dir1.unit()).Cross(dir2.unit()).r())),
00024     m_origin(origin),
00025     m_normal(dir1.Cross(dir2).unit()),
00026     m_dirStart(dir1.unit()),
00027     m_radius(radius)
00028 {
00029 };
00030 
00031 CircleTraj::CircleTraj( const Point& origin,
00032                         const Vector& normal,
00033                         const Vector& origin2point,
00034                         const Range& range)
00035   : Trajectory(range),
00036     m_origin(origin),
00037     m_normal(normal.unit()),
00038     m_dirStart(origin2point-origin2point.Dot(m_normal)*m_normal),
00039     m_radius(m_dirStart.r())
00040 {
00041 };
00042 
00044 Trajectory::Point CircleTraj::position( double s ) const
00045 {
00046   return m_origin+m_radius*AxisAngle(m_normal,s/m_radius)(m_dirStart);
00047 };
00048 
00050 Trajectory::Vector CircleTraj::direction( double s ) const
00051 {
00052   return m_normal.Cross(AxisAngle(m_normal,s/m_radius)(m_dirStart));
00053 };
00054 
00056 Trajectory::Vector CircleTraj::curvature( double s ) const 
00057 {
00058   return (-1.0/m_radius)*AxisAngle(m_normal,s/m_radius)(m_dirStart);
00059 };
00060 
00063 void CircleTraj::expansion( double s,
00064                             Point& p,
00065                             Vector& dp,
00066                             Vector& ddp ) const
00067 {
00068   Vector r(  AxisAngle(m_normal,s/m_radius)(m_dirStart) );
00069   ddp =  (-1.0/m_radius)*r;
00070   dp  = m_normal.Cross(r);
00071   p   = m_origin+m_radius*r;
00072 };
00073 
00076 double CircleTraj::muEstimate( const Point& point ) const
00077 {
00078   // get vector from origin, to point after projecting it 
00079   // into the plane of the circle. (i.e. this vector is normal
00080   // to m_normal)
00081   Vector r( (point - m_normal.Dot(point-m_origin)*m_normal)-m_origin );
00082 
00083   // Determine delta phi angle between arclength=0 angle and angle of r
00084   double dphi = r.phi() - m_dirStart.phi();
00085   
00086   // Check whether angle outside of [-pi/2,+pi/2]
00087   if( m_dirStart.Dot( r ) < 0) {
00088     if( dphi > M_PI ) dphi -= 2*M_PI;
00089     else              dphi += 2*M_PI;
00090   }
00091 
00092   return m_radius * dphi;
00093 };
00094 
00097 double CircleTraj::distTo1stError( double /*arclen*/, double tolerance, int /*direction*/) const 
00098 {
00099   // require 2nd order term to be less than tolerance...
00100   return std::sqrt(2*tolerance*m_radius);
00101 };
00102 
00105 double CircleTraj::distTo2ndError( double /*arclen*/, double tolerance , int /*direction*/ ) const
00106 {
00107   // require 3rd order term to be less than tolerance
00108   // cbrt is in the C99 standard -- hope it is available on all platforms...
00109   // return cbrt(6*tolerance*m_radius*m_radius);
00110   // cbrt is NOT available on windows at this time...
00111   return pow(6*tolerance*m_radius*m_radius,double(1)/3);
00112 };
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:03:13 2011 for LHCbKernel by doxygen 1.4.7