00001
00002
00003
00004
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
00079
00080
00081 Vector r( (point - m_normal.Dot(point-m_origin)*m_normal)-m_origin );
00082
00083
00084 double dphi = r.phi() - m_dirStart.phi();
00085
00086
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 , double tolerance, int ) const
00098 {
00099
00100 return std::sqrt(2*tolerance*m_radius);
00101 };
00102
00105 double CircleTraj::distTo2ndError( double , double tolerance , int ) const
00106 {
00107
00108
00109
00110
00111 return pow(6*tolerance*m_radius*m_radius,double(1)/3);
00112 };