CLHEP/Geometry/BasicVector3D.h

// -*- C++ -*-
// $Id: BasicVector3D.h,v 1.1 2001/06/14 13:40:47 evc Exp $
// ---------------------------------------------------------------------------
//
// This file is a part of the CLHEP - a Class Library for High Energy Physics.
//
// BasicVector3D is a base class for HepPoint3D, HepVector3D and HepNormal3D.
// It was implemented to decouple the functionality of those classes from
// the functionality of Hep3Vector.
//
// Author: Evgeni Chernyaev <Evgueni.Tcherniaev@cern.ch>
//
// History:
// 12.06.01 E.Chernyaev - CLHEP-1.7: initial version
//

#ifndef BASIC_VECTOR3D_H
#define BASIC_VECTOR3D_H

#include "CLHEP/config/CLHEP.h"
#include "CLHEP/config/iostream.h"
#include "CLHEP/Vector/ThreeVector.h"

class BasicVector3D {
protected:
  Hep3Vector v_;

  // Default constructor. This class should not be instantiated directly.
  inline BasicVector3D() : v_(0,0,0) {}

public:
  // Safe indexing of the coordinates when using with matrices, arrays, etc.
  enum { X=0, Y=1, Z=2, NUM_COORDINATES=3, SIZE=NUM_COORDINATES };

  // Destructor.
  ~BasicVector3D() {}

  // Copy constructor.
  inline BasicVector3D(const BasicVector3D & v) : v_(v.v_) {}

  // Constructor from three doubles.
  inline BasicVector3D(double x, double y, double z) : v_(x,y,z) {}

  // Constructor from Hep3Vector.
  inline explicit BasicVector3D(const Hep3Vector & v) : v_(v) {}

  // Conversion (cast) to Hep3Vector.
  inline operator const Hep3Vector & () const { return v_; }
  inline operator Hep3Vector & () { return v_; }

  // Modify/assignment
  inline BasicVector3D &
  operator= (const BasicVector3D & v) { v_ = v.v_; return *this; }
  inline BasicVector3D &
  operator+=(const BasicVector3D & v) { v_ += v.v_; return *this; }
  inline BasicVector3D &
  operator-=(const BasicVector3D & v) { v_ -= v.v_; return *this; }
  inline BasicVector3D & operator*=(double a) { v_ *= a; return *this; }
  inline BasicVector3D & operator/=(double a) { v_ /= a; return *this; }

  // Get components by index.
  inline double operator () (int i) const { return v_(i); }
  inline double operator [] (int i) const { return v_[i]; }

  // Set components by index.
  inline double & operator () (int i) { return v_(i); }
  inline double & operator [] (int i) { return v_[i]; }

  // Get components in cartesian coordinate system.
  inline double x() const { return v_.x(); }
  inline double y() const { return v_.y(); }
  inline double z() const { return v_.z(); }

  // Set components in cartesian coordinate system.
  inline void setX(double a) { v_.setX(a); }
  inline void setY(double a) { v_.setY(a); }
  inline void setZ(double a) { v_.setZ(a); }
  inline void set(double x, double y, double z) { v_.set(x,y,z); }

  // Get component in spherical (polar) coordinate system.
  inline double phi()      const { return v_.phi(); }
  inline double theta()    const { return v_.theta(); }
  inline double cosTheta() const { return v_.cosTheta(); }
  inline double mag2()     const { return v_.mag2(); }
  inline double mag()      const { return v_.mag(); }

  // Set component in spherical (polar) coordinate system.
  inline void setPhi  (double a) { v_.setPhi(a); }
  inline void setTheta(double a) { v_.setTheta(a); }
  inline void setMag  (double a) { v_.setMag(a); }

  // Get transverse component squared (rho in cylindrical coordinate system).
  inline double perp2() const { return v_.perp2(); }
  inline double perp()  const { return v_.perp(); }

  // Set transverse component keeping phi and z constant.
  inline void setPerp(double a) { v_.setPerp(a); }

  // The transverse component w.r.t. given axis.
  inline double perp2(const BasicVector3D & v) const { return v_.perp2(v); }
  inline double perp(const BasicVector3D & v)  const { return v_.perp(v); }

  // Unit vector parallel to this.
  inline BasicVector3D unit() const { return BasicVector3D(v_.unit()); } 

  // Vector orthogonal to this.
  inline BasicVector3D orthogonal() const {
    return BasicVector3D(v_.orthogonal());
  }

  // Scalar product.
  inline double dot(const BasicVector3D & v) const { return v_.dot(v.v_); }

  // Cross product.
  inline BasicVector3D cross(const BasicVector3D & v) const {
    return BasicVector3D(v_.cross(v.v_));
  }

  // The angle w.r.t. another 3-vector.
  inline double angle(const BasicVector3D & v) const {
    return v_.angle(v.v_);
  }

  // Returns the pseudo-rapidity, i.e. -ln(tan(theta/2))
  inline double pseudoRapidity() const { return v_.pseudoRapidity(); }
  
  // Rotate around the axes.
  inline BasicVector3D & rotateX(double a) { v_.rotateX(a); return *this; }
  inline BasicVector3D & rotateY(double a) { v_.rotateY(a); return *this; }
  inline BasicVector3D & rotateZ(double a) { v_.rotateZ(a); return *this; }

  // Rotates around the axis specified by another BasicVector3D.
  inline BasicVector3D & rotate(double a, const BasicVector3D & v) {
    v_.rotate(a,v.v_); return *this;
  }
};

// Stream operators
inline HepStd::ostream &
operator<<(HepStd::ostream & os, const BasicVector3D & v) {
  return (os << (const Hep3Vector &)(v));
}
inline HepStd::istream &
operator>>(HepStd::istream & is, BasicVector3D & v) {
  return (is >> (Hep3Vector &)(v));
}

// Arithmetics
inline BasicVector3D
operator+(const BasicVector3D & v) {
  return v;
}
inline BasicVector3D
operator+(const BasicVector3D & a, const BasicVector3D & b) {
  return BasicVector3D(a.x()+b.x(),a.y()+b.y(),a.z()+b.z());
}
inline BasicVector3D
operator-(const BasicVector3D & v) {
  return BasicVector3D(-v.x(),-v.y(),-v.z());
}
inline BasicVector3D
operator-(const BasicVector3D & a, const BasicVector3D & b) {
  return BasicVector3D(a.x()-b.x(),a.y()-b.y(),a.z()-b.z());
}
inline BasicVector3D
operator*(const BasicVector3D & v, double a) {
  return BasicVector3D(v.x()*a,v.y()*a,v.z()*a);
}
inline double
operator*(const BasicVector3D & a, const BasicVector3D & b) {
  return a.dot(b);
}
inline BasicVector3D
operator*(double a, const BasicVector3D & v) {
  return BasicVector3D(a*v.x(),a*v.y(),a*v.z());
}
inline BasicVector3D
operator/(const BasicVector3D & v, double a) {
  return BasicVector3D((const Hep3Vector &)(v)/a);
}

// Comparisons
inline HepBoolean
operator==(const BasicVector3D & a, const BasicVector3D & b) {
  return (a.x()==b.x() && a.y()==b.y() && a.z()==b.z());
}
inline HepBoolean
operator!=(const BasicVector3D & a, const BasicVector3D & b) {
  return (a.x()!=b.x() || a.y()!=b.y() || a.z()!=b.z());
}

#endif /* BASIC_VECTOR3D_H */

Generated by GNU enscript 1.6.1.