PHVector.C
//---------------------------------------------------------------------------------------
// Class: PHVector header
//
// Created by: Jane M. Burward-Hoy and Federica Messer
//
// Purpose: The Phenix 3D vector class is privately derived from HepVector3D base class.
// The constructor, destructor, copy, and assignment constructor functions
// are declared here.
//
// Last update: 10/19/99
//
//------------------------------------------------------------------------------
#include "PHVector.h"
#include "PHGeometron.h"
PHVector::PHVector()
{
setX(0.);
setY(0.);
setZ(0.);
}
PHVector::PHVector(double x, double y, double z )
{
setX(x);
setY(y);
setZ(z);
}
PHVector::~PHVector()
{
}
PHVector::PHVector(const PHVector &v)
{
setX(v.x());
setY(v.y());
setZ(v.z());
}
PHVector::PHVector(const PHPoint &v)
{
setX(v.getX());
setY(v.getY());
setZ(v.getZ());
}
PHVector::PHVector(const HepVector3D &v)
{
setX(v.x());
setY(v.y());
setZ(v.z());
}
PHVector::PHVector(const Hep3Vector &v)
{
setX(v.x());
setY(v.y());
setZ(v.z());
}
PHVector& PHVector::operator=(const PHVector &v)
{
setX(v.x());
setY(v.y());
setZ(v.z());
return *this;
}
PHVector& PHVector::operator=(const PHPoint &v)
{
setX(v.getX());
setY(v.getY());
setZ(v.getZ());
return *this;
}
PHVector& PHVector::operator=(const HepVector3D &v)
{
setX(v.x());
setY(v.y());
setZ(v.z());
return *this;
}
PHVector& PHVector::operator=(const Hep3Vector &v)
{
setX(v.x());
setY(v.y());
setZ(v.z());
return *this;
}
PHVector PHVector::operator- (const PHVector &p) const
{
PHVector newVector;
newVector.setX(getX()-p.x());
newVector.setY(getY()-p.y());
newVector.setZ(getZ()-p.z());
return newVector;
}
PHVector PHVector::operator- ()
{
setX(-getX());
setY(-getY());
setZ(-getZ());
return *this;
}
PHVector PHVector::operator+ (const PHVector &p) const
{
PHVector newVector;
newVector.setX(getX()+p.x());
newVector.setY(getY()+p.y());
newVector.setZ(getZ()+p.z());
return newVector;
}
PHVector PHVector::operator* (const double &a) const
{
PHVector newVector;
newVector.setX(getX()*a);
newVector.setY(getY()*a);
newVector.setZ(getZ()*a);
return newVector;
}
double PHVector::dot(const PHVector &v) const
{
PHGeometron* geometry = PHGeometron::instance();
return (geometry->dot(*this,v));
}
PHVector PHVector::cross(const PHVector &v) const
{
PHGeometron* geometry = PHGeometron::instance();
return (geometry->cross(*this,v));
}
double PHVector::angle(const PHVector& v) const
{
PHGeometron* geometry = PHGeometron::instance();
return geometry->angle(*this,v);
}
/*
PHVector PHVector::orthogonal() const
{
PHVector newVector;
newVector = (PHVector)(Hep3Vector::orthogonal());
return newVector;
}
*/
double PHVector::length() const
{
return sqrt(pow(x(),2)+ pow(y(),2)+ pow(z(),2));
}
double PHVector::lengthSqr() const
{
return (pow(x(),2)+ pow(y(),2) + pow(z(),2));
}
void PHVector::normalize()
{
double a, b, c;
a = b = c = 1.0;
if (lengthSqr() != 0.0) {
if (x() < 0.) a = -1.0;
if (y() < 0.) b = -1.0;
if (z() < 0.) c = -1.0;
setX(a * sqrt( pow( x(),2 )/lengthSqr() ) );
setY(b * sqrt( pow( y(),2 )/lengthSqr() ) );
setZ(c * sqrt( pow( z(),2 )/lengthSqr() ) );
}else{
cout << "PHVector::normalize() -- Length of the Vector is 0.0" << endl;
}
}
ostream& operator<<(ostream& os, const PHVector &p)
{
return (os << "( " << p.getX() << ", " << p.getY() << ", " << p.getZ() << " ) ");
}
void PHVector::print() const
{
cout << "( " << getX() << ", " << getY() << ", " << getZ() << " ) " << endl;
}