/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Reconstruction/MdcPatRec/MdcRecoUtil/MdcRecoUtil-00-01-08/MdcRecoUtil/DifVector.h

Go to the documentation of this file.
00001 //--------------------------------------------------------------------------
00002 // File and Version Information:
00003 //      $Id: DifVector.h,v 1.3 2009/12/23 02:59:56 zhangy Exp $
00004 //
00005 // Description:
00006 //      Class Header for |DifVector|
00007 //      A 3-vector based on differential numbers
00008 //
00009 // Environment:
00010 //      Software developed for the BaBar Detector at the SLAC B-Factory.
00011 //
00012 // Author List:
00013 //      A. Snyder
00014 //
00015 // Copyright Information:
00016 //      Copyright (C) 1996      SLAC
00017 // 
00018 // History:
00019 //      Migration for BESIII MDC
00020 //
00021 //------------------------------------------------------------------------
00022 
00023 #ifndef DifVector_H
00024 #define DifVector_H
00025 
00026 #include "MdcRecoUtil/DifNumber.h"
00027 #include "CLHEP/Vector/ThreeVector.h"
00028 #include <iosfwd>
00029 class DifRotation;
00030 using CLHEP::Hep3Vector;
00031 
00032 class DifVector {
00033 
00034 public:
00035 
00036   //constructors
00037   DifVector();                  // null - default
00038   DifVector                     // construct from components
00039   (const DifNumber& x,const DifNumber& y,const DifNumber& z);
00040   DifVector
00041   (double x,double y,double z);
00042   DifVector                     // construct from |Hep3Vector|
00043   (const Hep3Vector& v);
00044   DifVector(const DifVector& v); // copy
00045 
00046   //destructor
00047   ~DifVector() {}               // destroy
00048 
00049   //given error on parameters calculate error on vector
00050   HepSymMatrix errorMatrix              // caclulate error matrix
00051   (const HepSymMatrix& e)const;
00052   
00053   //give jacobian transformation matrix wrt independent parameters;
00054   HepMatrix jacobian()const;
00055 
00056   //operators 
00057   inline DifVector& operator+=(const DifVector& v);
00058   inline DifVector& operator-=(const DifVector& v);
00059   inline DifVector& operator*=(const DifNumber& n);
00060   inline DifVector& operator*=(const double& n);
00061   DifVector& operator/=(const DifNumber& n);
00062   DifVector& operator/=(const double& n);
00063   inline DifVector& operator=(const DifVector & v);
00064   inline DifVector operator-()const;
00065 
00066   inline friend DifVector operator+     // vector sum
00067   (const DifVector& a,const DifVector& b);
00068   inline friend DifVector operator-     // vector difference
00069   (const DifVector& a,const DifVector& b); 
00070   inline friend DifNumber operator*     // scalar product
00071   (const DifVector& a,const DifVector& b);
00072   inline friend DifVector operator*     // vector*scalar
00073   (const DifVector& v,const DifNumber& n);
00074   inline friend DifVector operator*     // scalar*vector
00075   (const DifNumber& n,const DifVector& v);
00076   inline friend DifVector operator/     // vector/scalar
00077   (const DifVector& v,const DifNumber& n);
00078   inline friend DifVector operator*     // vector*scalar
00079   (const DifVector& v,const double& n);
00080   inline friend DifVector operator*     // scalar*vector
00081   (const double& n,const DifVector& v);
00082   inline friend DifVector operator/     // vector/scalar
00083   (const DifVector& v,const double& n);
00084 
00085 
00086   //other operations 
00087   inline friend DifVector cross(const DifVector& a,const DifVector& b);
00088 
00089   //access 
00090   inline int nPar()const;       // return number of params
00091 
00092   //i/o
00093   void print()const;    // print out
00094 
00095 
00096   //manipulations
00097 
00098   //misc
00099   inline DifVector& flipsign(); // flip sign of all components
00100   inline DifVector& normalize();        // norm to unit vector
00101   inline DifVector& zeroDerivatives(); // zero derivatives
00102   
00103 
00104   //rotations
00105   inline DifVector& rotate(const DifVector& axis,const DifNumber& angle); // rotate around axis
00106   inline DifVector& rotate(const DifVector& axis, const DifNumber& cosine, const DifNumber& sine);// rotate with cos and sine
00107   DifVector& rotate(const DifNumber& alpha,const DifNumber& beta,const DifNumber& gamma); // euler angles
00108   DifVector& rotate(const DifRotation& r); // rotatation matrix
00109   inline DifVector& rotateX(const DifNumber& angle);    // around x
00110   inline DifVector& rotateX(const DifNumber& cosine,const DifNumber& sine);
00111   inline DifVector& rotateY(const DifNumber& angle);    // around y
00112   inline DifVector& rotateY(const DifNumber& cosine,const DifNumber& sine);
00113   inline DifVector& rotateZ(const DifNumber& angle);    // around z
00114   inline DifVector& rotateZ(const DifNumber& cosine,const DifNumber& sine);
00115 
00116   inline DifVector& rotate(const DifVector& axis,const double& angle); // rotate around axis
00117   inline DifVector& rotate(const DifVector& axis, const double& cosine, const double& sine);// rotate with cos and sine
00118   DifVector& rotate(const double& alpha,const double& beta,const double& gamma); // euler angles
00119   inline DifVector& rotateX(const double& angle);       // around x
00120   inline DifVector& rotateX(const double& cosine,const double& sine);
00121   inline DifVector& rotateY(const double& angle);       // around y
00122   inline DifVector& rotateY(const double& cosine,const double& sine);
00123   inline DifVector& rotateZ(const double& angle);       // around z
00124   inline DifVector& rotateZ(const double& cosine,const double& sine);
00125 
00126   //algebra
00127   inline  DifVector transverse  // part tranverse to |v|
00128   (const DifVector& v)const;
00129   inline  DifNumber dot         // scalr product
00130   (const DifVector& v)const; 
00131   inline DifNumber length()const; // length of vector
00132   inline DifNumber lengthSq()const; // length squared
00133   inline DifVector unit()const; // direction
00134   inline DifNumber perp()const; // perp comp
00135   inline DifNumber perpSq()const; // perp squared
00136 
00137 
00138   //polar corrdinates
00139   DifNumber r()const;           // length by any other name
00140   DifNumber phi()const;         // azimutal angle
00141   DifNumber theta()const;       // polar angle
00142   DifNumber cosTheta()const;    // cosine of polar angle
00143 
00144   //data members - public .. yes, folks that's intentional!
00145 public:
00146 
00147   //x,y,z components of 3-vector
00148   DifNumber x;
00149   DifNumber y;
00150   DifNumber z;
00151 
00152 
00153 };
00154 /*SKIP
00155 //io 
00156 inline std::ostream& operator<<(std::ostream& o,const DifVector& n) {
00157   n.print(o);
00158   return o;
00159 }
00160 */
00161 #include "MdcRecoUtil/DifVector.icc"
00162 
00163 #endif
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 

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