![]() |
![]() |
00001 #ifndef CartesianState_H 00002 #define CartesianState_H 00003 00004 #include "DataFormats/GeometryVector/interface/Basic3DVector.h" 00005 #include "TrackPropagation/RungeKutta/interface/VectorDoublet.h" 00006 00007 class CartesianState { 00008 public: 00009 00010 typedef double Scalar; 00011 typedef Basic3DVector<Scalar> Vector3D; 00012 typedef VectorDoublet<Vector3D,Vector3D> Vector; 00013 00014 CartesianState() {} 00015 CartesianState( const Vector& v, Scalar s) : par_(v), charge_(s) {} 00016 CartesianState( const Vector3D& pos, const Vector3D& mom, Scalar s) : 00017 par_(pos,mom), charge_(s) {} 00018 00019 const Vector3D& position() const { return par_.first();} 00020 const Vector3D& momentum() const { return par_.second();} 00021 00022 const Vector& parameters() const { return par_;} 00023 00024 Scalar charge() const { return charge_;} 00025 00026 private: 00027 00028 Vector par_; 00029 Scalar charge_; 00030 00031 }; 00032 00033 inline CartesianState 00034 operator+( const CartesianState& a, const CartesianState& b) { 00035 return CartesianState(a.parameters()+b.parameters(), a.charge()); 00036 } 00037 00038 inline CartesianState 00039 operator-( const CartesianState& a, const CartesianState& b) { 00040 return CartesianState(a.parameters()-b.parameters(), a.charge()); 00041 } 00042 00043 inline CartesianState operator*( const CartesianState& v, const CartesianState::Scalar& s) { 00044 return CartesianState( v.parameters()*s, v.charge()); 00045 } 00046 inline CartesianState operator*( const CartesianState::Scalar& s, const CartesianState& v) { 00047 return CartesianState( v.parameters()*s, v.charge()); 00048 } 00049 00050 inline CartesianState operator/( const CartesianState& v, const CartesianState::Scalar& s) { 00051 return CartesianState( v.parameters()/s, v.charge()); 00052 } 00053 00054 00055 #endif