/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Reconstruction/TrackUtil/TrackUtil-00-00-08/TrackUtil/Lpar.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:     <package>
00004 // Module:      Lpar
00005 // 
00006 // Description: <one line class summary>
00007 //
00008 // Usage:
00009 //    <usage>
00010 //
00011 // Author:      KATAYAMA Nobuhiko
00012 // Created:     Fri Feb  6 10:21:31 JST 1998
00013 // $Id: Lpar.h,v 1.3 2009/11/30 02:22:44 zhangy Exp $
00014 //
00015 
00016 #if !defined(PACKAGE_LPAR_H_INCLUDED)
00017 #define PACKAGE_LPAR_H_INCLUDED
00018 
00019 // system include files
00020 #include <iosfwd>
00021 #include <cmath>
00022 #include <iostream>
00023 #include "TrackUtil/Helix.h"
00024 #include "GaudiKernel/StatusCode.h"
00025 #include "GaudiKernel/IInterface.h"
00026 #include "GaudiKernel/Kernel.h"
00027 #include "GaudiKernel/Service.h"
00028 #include "GaudiKernel/ISvcLocator.h"
00029 #include "GaudiKernel/SvcFactory.h"
00030 #include "GaudiKernel/IDataProviderSvc.h"
00031 #include "GaudiKernel/Bootstrap.h"
00032 
00033 #include "MagneticField/IMagneticFieldSvc.h"
00034 #include "MagneticField/MagneticFieldSvc.h"
00035 
00036 // user include files
00037 #include "CLHEP/Matrix/Vector.h"
00038 #include "CLHEP/Matrix/Matrix.h"
00039 #ifndef CLHEP_POINT3D_H
00040 #include "CLHEP/Geometry/Point3D.h"
00041 #endif
00042 #ifndef ENABLE_BACKWARDS_COMPATIBILITY
00043 typedef HepGeom::Point3D<double> HepPoint3D;
00044 #endif
00045 using namespace CLHEP;
00046 
00047 // forward declarations
00048 
00049 class Lpar
00050 {
00051     // friend classes and functions
00052 
00053   public:
00054     // constants, enums and typedefs
00055 
00056     // Constructors and destructor
00057     Lpar();
00058 
00059     virtual ~Lpar();
00060   private:
00061     IMagneticFieldSvc* m_pmgnIMF;
00062         
00063   public: 
00064     // assignment operator(s)
00065     inline const Lpar& operator=( const Lpar& );
00066 
00067     // member functions
00068     inline void neg();
00069     void circle(double x1, double y1, double x2, double y2,
00070                 double x3, double y3);
00071 
00072     // const member functions
00073     double kappa() const { return m_kappa; }
00074     double radius() const { return 0.5/std::fabs(m_kappa);}
00075     HepVector center() const;
00076     double s(double x, double y) const;
00077     inline double d(double x, double y) const;
00078     inline double dr(double x, double y) const;
00079     double s(double r, int dir=0) const;
00080     double phi(double r, int dir=0) const;
00081     inline int sd(double r, double x, double y, 
00082                   double limit, double & s, double & d) const;
00083     inline HepVector Hpar(const HepPoint3D & pivot) const;
00084     // static member functions
00085 
00086     // friend functions and classes
00087     friend class Lpav;
00088     friend std::ostream & operator<<(std::ostream &o, Lpar &);
00089     friend int intersect(const Lpar&, const Lpar&, HepVector&, HepVector&);
00090 
00091   protected:
00092     // protected member functions
00093 
00094     // protected const member functions
00095   private:
00096     // Private class cpar
00097     class Cpar {
00098     public:
00099       Cpar(const Lpar&);
00100       double xi() const{ return 1 + 2 * m_cu * m_da; }
00101       double sfi() const { return m_sfi; }
00102       double cfi() const { return m_cfi; }
00103       double da() const { return m_da; }
00104       double cu() const { return m_cu; }
00105       double fi() const { return m_fi; }
00106     private:
00107       double m_cu;
00108       double m_fi;
00109       double m_da;
00110       double m_sfi;
00111       double m_cfi;
00112     };
00113   friend class Lpar::Cpar;
00114     // Constructors and destructor
00115     inline Lpar( const Lpar& );
00116 
00117     // comparison operators
00118     bool operator==( const Lpar& ) const;
00119     bool operator!=( const Lpar& ) const;
00120 
00121     // private member functions
00122     void scale(double s) { m_kappa /= s; m_gamma *= s; }
00123     inline void rotate(double c, double s);
00124     inline void move (double x, double y);
00125 
00126     // private const member functions
00127     double alpha() const { return m_alpha; }
00128     double beta() const { return m_beta; }
00129     double gamma() const { return m_gamma; }
00130     inline double check() const;
00131     HepMatrix dldc() const;
00132     inline double d0(double x, double y) const;
00133     double kr2g(double r) const { return m_kappa * r * r + m_gamma; }
00134     double x(double r) const;
00135     double y(double r) const;
00136     void xhyh(double x, double y, double&xh, double&yh) const;
00137     double xi2() const { return 1 + 4 * m_kappa * m_gamma; } 
00138     bool xy(double, double&, double&, int dir=0) const;
00139     inline double r_max() const;
00140     double xc() const { return - m_alpha/2/m_kappa; }
00141     double yc() const { return - m_beta/2/m_kappa; }
00142     double da() const {  return 2 * gamma() / (std::sqrt(xi2()) + 1); }
00143     inline double arcfun(double xh, double yh) const;
00144 
00145     // data members
00146     double m_alpha;
00147     double m_beta;
00148     double m_gamma;
00149     double m_kappa;
00150 
00151 
00152   //  static const double BELLE_ALPHA;
00153 
00154     // static data members
00155 
00156 };
00157 
00158 // inline function definitions
00159 
00160 // inline Lpar::Lpar(double a, double b, double k, double g) {
00161 //   m_alpha = a; m_beta = b; m_kappa = k; m_gamma = g;
00162 // }
00163 
00164 inline Lpar::Lpar() {
00165   m_alpha = 0;
00166   m_beta = 1;
00167   m_gamma = 0;
00168   m_kappa = 0;
00169   StatusCode scmgn = Gaudi::svcLocator()->service("MagneticFieldSvc",m_pmgnIMF);
00170    if(scmgn!=StatusCode::SUCCESS) {
00171      std::cout<< "Unable to open Magnetic field service"<<std::endl;
00172    }
00173 }
00174 
00175 inline Lpar::Lpar(const Lpar&l) {
00176   m_alpha = l.m_alpha;
00177   m_beta = l.m_beta;
00178   m_gamma = l.m_gamma;
00179   m_kappa = l.m_kappa;
00180 }
00181 
00182 inline const Lpar&Lpar::operator=(const Lpar&l) {
00183     if (this != &l) {
00184         m_alpha = l.m_alpha;
00185         m_beta = l.m_beta;
00186         m_gamma = l.m_gamma;
00187         m_kappa = l.m_kappa;
00188     }
00189   return *this;
00190 }
00191 
00192 inline void Lpar::rotate(double c, double s) {
00193   double aLpar =  c * m_alpha + s * m_beta;
00194   double betar = -s * m_alpha + c * m_beta;
00195   m_alpha = aLpar;
00196   m_beta = betar;
00197 }
00198 
00199 inline void Lpar::move (double x, double y) {
00200   m_gamma += m_kappa * ( x * x + y * y ) + m_alpha * x + m_beta * y;
00201   m_alpha += 2 * m_kappa * x;
00202   m_beta  += 2 * m_kappa * y; 
00203 }
00204 
00205 inline double Lpar::check() const {
00206   return m_alpha * m_alpha + m_beta * m_beta - 4 * m_kappa * m_gamma - 1;
00207 }
00208 
00209 inline void Lpar::neg() {
00210   m_alpha = -m_alpha;
00211   m_beta = -m_beta;
00212   m_gamma = -m_gamma;
00213   m_kappa = -m_kappa;
00214 }
00215 
00216 inline double Lpar::d0(double x, double y) const {
00217   return m_alpha * x + m_beta * y + m_gamma + m_kappa * ( x * x + y * y);
00218 }
00219 
00220 inline double Lpar::d(double x, double y) const {
00221   double dd = d0(x,y);
00222   const double approx_limit = 0.2;
00223   if(std::fabs(m_kappa*dd)>approx_limit) return -1;
00224   return dd * ( 1 - m_kappa * dd );
00225 }
00226 
00227 inline double Lpar::dr(double x, double y) const {
00228   double dx = xc() - x;
00229   double dy = yc() - y;
00230   double r = 0.5/std::fabs(m_kappa);
00231   return std::fabs(std::sqrt(dx * dx + dy * dy) - r);
00232 }
00233 
00234 inline double Lpar::r_max() const {
00235   if (m_kappa==0) return 100000000.0;
00236   if (m_gamma==0) return 1/std::fabs(m_kappa);
00237   return std::fabs(2*m_gamma/(std::sqrt(1+4*m_gamma*m_kappa)-1));
00238 }
00239 
00240 inline double Lpar::arcfun(double xh, double yh) const {
00241   //
00242   // Duet way of calculating Sperp.
00243   //
00244   double r2kap = 2.0 * m_kappa;
00245   double xi = std::sqrt(xi2());
00246   double xinv = 1.0 / xi;
00247   double ar2kap = std::fabs(r2kap);
00248   double cross = m_alpha * yh - m_beta * xh;
00249   double a1 = ar2kap * cross * xinv;
00250   double a2 = r2kap * (m_alpha * xh + m_beta * yh) * xinv + xi;
00251   if (a1>=0 && a2>0 && a1<0.3) {
00252     double arg2 = a1*a1;
00253     return cross * ( 1.0 + arg2 * (1./6. + arg2 * (3./40.))) * xinv;
00254   } else {
00255     double at2 = std::atan2(a1,a2);
00256     if (at2<0) at2 += (2*M_PI);
00257     return at2/ar2kap;
00258   }
00259 }
00260 
00261 inline int Lpar::sd(double r, double x, double y, 
00262                     double limit, double & s, double & d) const{
00263   if ((x*yc()-y*xc())*m_kappa<0) return 0;
00264   double dd = d0(x,y);
00265   d = dd * ( 1 - m_kappa * dd );
00266   double d_cross_limit = d*limit;
00267   if (d_cross_limit < 0 || d_cross_limit > limit*limit) return 0;
00268   double rc = std::sqrt(m_alpha*m_alpha+m_beta*m_beta)/(2*m_kappa);
00269   double rho = 1./(-2*m_kappa);
00270   double cosPhi = (rc*rc + rho*rho - r*r)/(-2*rc*rho);
00271   double phi = std::acos(cosPhi);
00272   s = std::fabs(rho)*phi;
00273   d *= r/(std::fabs(rc)*std::sin(phi));
00274   if (abs(d) > abs(limit)) return 0;
00275   d_cross_limit = d*limit;
00276   if (d_cross_limit > limit*limit) return 0;
00277   return 1;
00278 }
00279 
00280 inline HepVector Lpar::Hpar(const HepPoint3D & pivot) const{
00281   HepVector a(5);
00282   double m_bField = -10000*(m_pmgnIMF->getReferField());
00283   double m_alpha = 10000. / 2.99792458 / m_bField;
00284   double dd = d0(pivot.x(),pivot.y());
00285   a(1) = dd * ( m_kappa * dd - 1 );
00286   a(2) = (m_kappa>0) ? std::atan2(yc() - pivot.y(), xc() - pivot.x()) + M_PI 
00287     : std::atan2(pivot.y() - yc(), pivot.x() - xc()) - M_PI + 2*M_PI;
00288   //a(3) = -2.0*BELLE_ALPHA*m_kappa;
00289   a(3) = -2.0*m_alpha*m_kappa;
00290   a(4) = 0;
00291   a(5) = 0;
00292   return a;
00293 }
00294 
00295 #endif /* PACKAGE_LPAR_H_INCLUDED */
00296 

Generated on Tue Nov 29 23:13:23 2016 for BOSS_7.0.2 by  doxygen 1.4.7