///////////////////////////////////////////////////////////////////////////
//
// Copyright 2010
//
// This file is part of starlight.
//
// starlight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// starlight is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with starlight. If not, see .
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: 28 $: revision of last commit
// $Author:: bgrube $: author of last commit
// $Date:: 2010-12-10 19:30:01 +0100 #$: date of last commit
//
// Description:
//
//
//
///////////////////////////////////////////////////////////////////////////
#ifndef LORENTZVECTOR_H
#define LORENTZVECTOR_H
#include "vector3.h"
#include
class lorentzVector
{
public:
lorentzVector();
virtual ~lorentzVector();
lorentzVector(double x, double y, double z, double t);
//lorentzVector(double px, double py, double pz, double e);
void SetXYZT(double x, double y, double z, double t);
void SetPxPyPzE(double px, double py, double pz, double e) { SetXYZT(px, py, pz, e); };
double GetPx() const { return fSpaceVec.GetVector()[0]; }
double GetPy() const { return fSpaceVec.GetVector()[1]; }
double GetPz() const { return fSpaceVec.GetVector()[2]; }
double GetE() const { return fTime; }
lorentzVector& operator +=(const lorentzVector& vec)
{
fSpaceVec += vec.fSpaceVec;
fTime += vec.fTime;
return *this;
}
lorentzVector& operator -=(const lorentzVector& vec)
{
fSpaceVec -= vec.fSpaceVec;
fTime -= vec.fTime;
return *this;
}
double M2() const { return fTime * fTime - fSpaceVec.Mag2(); }
double M () const
{
const double mag2 = M2();
return (mag2 < 0) ? -sqrt(-mag2) : sqrt(mag2);
}
vector3 BoostVector() const
{ return vector3(fSpaceVec.X() / fTime, fSpaceVec.Y() / fTime, fSpaceVec.Z() / fTime); }
void Boost(const vector3& beta)
{
const double beta2 = beta.Mag2();
const double gamma = 1 / sqrt(1 - beta2);
const double betaTimesMom = beta.X() * fSpaceVec.X() + beta.Y() * fSpaceVec.Y() + beta.Z() * fSpaceVec.Z();
const double gamma2 = (beta2 > 0) ? (gamma - 1) / beta2 : 0;
SetXYZT(fSpaceVec.X() + gamma2 * betaTimesMom * beta.X() + gamma * beta.X() * fTime,
fSpaceVec.Y() + gamma2 * betaTimesMom * beta.Y() + gamma * beta.Y() * fTime,
fSpaceVec.Z() + gamma2 * betaTimesMom * beta.Z() + gamma * beta.Z() * fTime,
gamma * (fTime + betaTimesMom));
}
friend std::ostream& operator << (std::ostream& out,
const lorentzVector& vec)
{
out << "(" << vec.GetPx() << ", " << vec.GetPy() << ", " << vec.GetPz()
<< "; " << vec.GetE() << ")";
return out;
}
private:
vector3 fSpaceVec;
double fTime;
};
#endif // LORENTZVECTOR_H