File indexing completed on 2023-03-17 11:26:42
0001 #ifndef CartesianState_H
0002 #define CartesianState_H
0003
0004 #include "FWCore/Utilities/interface/Visibility.h"
0005 #include "DataFormats/GeometryVector/interface/Basic3DVector.h"
0006 #include "VectorDoublet.h"
0007
0008 class dso_internal CartesianState {
0009 public:
0010 typedef double Scalar;
0011 typedef Basic3DVector<Scalar> Vector3D;
0012 typedef VectorDoublet<Vector3D, Vector3D> Vector;
0013
0014 CartesianState() {}
0015 CartesianState(const Vector& v, Scalar s) : par_(v), charge_(s) {}
0016 CartesianState(const Vector3D& pos, const Vector3D& mom, Scalar s) : par_(pos, mom), charge_(s) {}
0017
0018 const Vector3D& position() const { return par_.first(); }
0019 const Vector3D& momentum() const { return par_.second(); }
0020
0021 const Vector& parameters() const { return par_; }
0022
0023 Scalar charge() const { return charge_; }
0024
0025 private:
0026 Vector par_;
0027 Scalar charge_;
0028 };
0029
0030 inline CartesianState operator+(const CartesianState& a, const CartesianState& b) {
0031 return CartesianState(a.parameters() + b.parameters(), a.charge());
0032 }
0033
0034 inline CartesianState operator-(const CartesianState& a, const CartesianState& b) {
0035 return CartesianState(a.parameters() - b.parameters(), a.charge());
0036 }
0037
0038 inline CartesianState operator*(const CartesianState& v, const CartesianState::Scalar& s) {
0039 return CartesianState(v.parameters() * s, v.charge());
0040 }
0041 inline CartesianState operator*(const CartesianState::Scalar& s, const CartesianState& v) {
0042 return CartesianState(v.parameters() * s, v.charge());
0043 }
0044
0045 inline CartesianState operator/(const CartesianState& v, const CartesianState::Scalar& s) {
0046 return CartesianState(v.parameters() / s, v.charge());
0047 }
0048
0049 #endif