CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/TrackPropagation/RungeKutta/interface/CylindricalState.h

Go to the documentation of this file.
00001 #ifndef CylindricalState_H
00002 #define CylindricalState_H
00003 
00004 #include "TrackPropagation/RungeKutta/interface/RKSmallVector.h"
00005 
00006 #include <iostream>
00007 
00020 class CylindricalState {
00021 public:
00022 
00023   typedef double                                   Scalar;
00024   typedef RKSmallVector<Scalar,5>                  Vector;
00025 
00026   CylindricalState() {}
00027 
00028   CylindricalState( const LocalPoint& pos, const LocalVector& mom, Scalar ch) {
00029       rho_ = pos.perp();
00030       Scalar cosphi = pos.x() / rho_;
00031       Scalar sinphi = pos.y() / rho_;
00032       Scalar p_rho   =  mom.x() * cosphi + mom.y() * sinphi;
00033       Scalar p_phi   = -mom.x() * sinphi + mom.y() * cosphi;
00034 
00035       par_(0) = pos.phi();
00036       par_(1) = pos.z();
00037       par_(2) = p_phi / (p_rho * rho_);
00038       par_(3) = mom.z() / p_rho;
00039       par_(4) = ch / mom.mag();
00040 
00041       prSign_ = p_rho > 0 ? 1.0 : -1.0;
00042 
00043       std::cout << "CylindricalState built from pos " << pos << " mom " << mom << " charge " << ch << std::endl;
00044       std::cout << "p_rho " << p_rho << " p_phi " << p_phi << " dphi_drho " << par_(2) << std::endl;
00045       std::cout << "Which results in                " << position() << " mom " << momentum() 
00046            << " charge " << charge() << std::endl;
00047   }
00048   
00049   CylindricalState( Scalar rho, const Vector& par, Scalar prSign) :
00050       par_(par), rho_(rho), prSign_(prSign) {}
00051 
00052 
00053   const LocalPoint position() const { 
00054       return LocalPoint( LocalPoint::Cylindrical( rho_, par_(0), par_(1)));
00055   }
00056 
00057   const LocalVector momentum() const {
00058       Scalar cosphi = cos( par_(0));
00059       Scalar sinphi = sin( par_(0));
00060       Scalar Q = sqrt(1 + rho_*rho_ * par_(2)*par_(2) + par_(3)*par_(3));
00061       Scalar P = std::abs(1./par_(4));
00062       Scalar p_rho = prSign_*P/Q;
00063       Scalar p_phi = rho_*par_(2)*p_rho;
00064       Scalar p_z   = par_(3)*p_rho;
00065       LocalVector result( p_rho*cosphi - p_phi*sinphi,
00066                           p_rho*sinphi + p_phi*cosphi,
00067                           p_z);
00068       return result;
00069   }
00070 
00071   const Vector& parameters() const { return par_;}
00072 
00073   Scalar charge() const { return par_(4) > 0 ? 1 : -1;}
00074 
00075   Scalar rho() const {return rho_;}
00076 
00077   double prSign() const {return prSign_;}
00078 
00079 private:
00080 
00081   Vector par_;
00082   Scalar rho_;
00083   Scalar prSign_; 
00084 
00085 };
00086 
00087 #endif