/*************************************************************************** * * $Id$ * * Author: Brian Lasiuk, Thomas Ullrich, April 1998 *************************************************************************** * * Description: * * Remarks: Since not all compilers support member templates * we have to specialize the templated member on these * platforms. If member templates are not supported the * ST_NO_MEMBER_TEMPLATES flag has to be set. tu. * * In the near future when all compilers can handle member * templates this class should be cleaned up. A lot of * redundant code can be removed as soon as the compilers * are up-to-date. tu * *************************************************************************** * * $Log$ * Revision 1.1.1.1 2007/03/07 10:14:49 mchojnacki * First version on CVS * * Revision 1.11 2005/09/22 20:09:20 fisyak * Make AliFemtoLorentzVector persistent * * Revision 1.10 2005/07/06 18:49:56 fisyak * Replace AliFemtoHelixD, AliFemtoLorentzVectorD,AliFemtoLorentzVectorF,AliFemtoMatrixD,AliFemtoMatrixF,AliFemtoPhysicalHelixD,AliFemtoThreeVectorD,AliFemtoThreeVectorF by templated version * * Revision 1.9 2005/03/28 06:02:45 perev * Defence FPE added * * Revision 1.8 2003/09/02 17:59:35 perev * gcc 3.2 updates + WarnOff * * Revision 1.7 2003/05/01 19:24:31 ullrich * Corrected problem in boost(). * * Revision 1.6 1999/10/15 15:56:36 ullrich * Changed output format in operator<<, added operator>> * * Revision 1.5 1999/06/04 18:01:36 ullrich * New operators operator() and operator[] which can be used * as lvalues. * * Revision 1.4 1999/04/14 23:12:07 fisyak * Add __CINT__ to handle references * * Revision 1.3 1999/02/17 11:38:36 ullrich * Removed specialization for 'long double'. * * Revision 1.2 1999/02/14 23:11:42 fisyak * Fixes for Rootcint * * Revision 1.1 1999/01/30 03:59:02 fisyak * Root Version of AliFemtoarClassLibrary * * Revision 1.1 1999/01/23 00:27:52 ullrich * Initial Revision * **************************************************************************/ #ifndef ST_LORENTZ_VECTOR_HH #define ST_LORENTZ_VECTOR_HH #include "AliFemtoThreeVector.h" template class AliFemtoLorentzVector { public: AliFemtoLorentzVector(T = 0, T = 0, T = 0, T = 0); virtual ~AliFemtoLorentzVector(); #ifndef ST_NO_MEMBER_TEMPLATES template AliFemtoLorentzVector(const AliFemtoThreeVector&, T); template AliFemtoLorentzVector(T, const AliFemtoThreeVector&); template AliFemtoLorentzVector(const AliFemtoLorentzVector&); template AliFemtoLorentzVector& operator=(const AliFemtoLorentzVector&); // AliFemtoLorentzVector(const AliFemtoLorentzVector&); use default // AliFemtoLorentzVector& operator=(const AliFemtoLorentzVector&); use default #else AliFemtoLorentzVector(const AliFemtoThreeVector&, T); AliFemtoLorentzVector(T, const AliFemtoThreeVector&); AliFemtoLorentzVector(const AliFemtoLorentzVector&); AliFemtoLorentzVector(const AliFemtoThreeVector&, T); AliFemtoLorentzVector(T, const AliFemtoThreeVector&); AliFemtoLorentzVector(const AliFemtoLorentzVector&); AliFemtoLorentzVector& operator=(const AliFemtoLorentzVector&); AliFemtoLorentzVector& operator=(const AliFemtoLorentzVector&); #endif T x() const; T y() const; T z() const; T t() const; T px() const; T py() const; T pz() const; T e() const; T operator() (size_t) const; T operator[] (size_t) const; T& operator() (size_t); T& operator[] (size_t); const AliFemtoThreeVector& vect() const; void setX(T); void setY(T); void setZ(T); void setPx(T); void setPy(T); void setPz(T); void setE(T); void setT(T); #ifndef ST_NO_MEMBER_TEMPLATES template void setVect(const AliFemtoThreeVector&); #else void setVect(const AliFemtoThreeVector&); void setVect(const AliFemtoThreeVector&); #endif T perp() const; T perp2() const; T pseudoRapidity() const; T phi() const; T theta() const; T cosTheta() const; T plus() const; T minus() const; T m() const; T m2() const; T mt() const; T mt2() const; T rapidity() const; #ifndef ST_NO_MEMBER_TEMPLATES template AliFemtoLorentzVector boost(const AliFemtoLorentzVector&) const; #else AliFemtoLorentzVector boost(const AliFemtoLorentzVector&) const; AliFemtoLorentzVector boost(const AliFemtoLorentzVector&) const; #endif AliFemtoLorentzVector operator- (); AliFemtoLorentzVector operator+ (); AliFemtoLorentzVector& operator*= (double); AliFemtoLorentzVector& operator/= (double); #ifndef ST_NO_MEMBER_TEMPLATES template bool operator == (const AliFemtoLorentzVector&) const; template bool operator != (const AliFemtoLorentzVector&) const; template AliFemtoLorentzVector& operator+= (const AliFemtoLorentzVector&); template AliFemtoLorentzVector& operator-= (const AliFemtoLorentzVector&); #else bool operator == (const AliFemtoLorentzVector&) const; bool operator != (const AliFemtoLorentzVector&) const; bool operator == (const AliFemtoLorentzVector&) const; bool operator != (const AliFemtoLorentzVector&) const; AliFemtoLorentzVector& operator+= (const AliFemtoLorentzVector&); AliFemtoLorentzVector& operator-= (const AliFemtoLorentzVector&); AliFemtoLorentzVector& operator+= (const AliFemtoLorentzVector&); AliFemtoLorentzVector& operator-= (const AliFemtoLorentzVector&); #endif protected: AliFemtoThreeVector mThreeVector; T mX4; #ifdef __ROOT__ ClassDef(AliFemtoLorentzVector,3) #endif }; #ifndef __CINT__ // // Implementation of member functions // template AliFemtoLorentzVector::AliFemtoLorentzVector(T x, T y, T z, T t) : mThreeVector(x, y, z), mX4(t) { /* nop */ } template AliFemtoLorentzVector::~AliFemtoLorentzVector() { /* nopt */ } template const AliFemtoThreeVector& AliFemtoLorentzVector::vect() const { return mThreeVector; } template T AliFemtoLorentzVector::m2() const { return (mX4*mX4 - mThreeVector*mThreeVector); } template T AliFemtoLorentzVector::plus() const { return (e() + pz()); } template T AliFemtoLorentzVector::minus() const { return (e() - pz()); } template T AliFemtoLorentzVector::m() const { T mass2 = m2(); if (mass2 < 0) return -::sqrt(-mass2); else return ::sqrt(mass2); } template T AliFemtoLorentzVector::mt2() const { return this->perp2() + m2(); } template T AliFemtoLorentzVector::mt() const { // // change to more optimal code ? // return e()*e() - pz()*pz(); T massPerp2 = mt2(); if (massPerp2 < 0) return -::sqrt(-massPerp2); else return ::sqrt(massPerp2); } template void AliFemtoLorentzVector::setPx(T x) {mThreeVector.setX(x);} template void AliFemtoLorentzVector::setPy(T y) {mThreeVector.setY(y);} template void AliFemtoLorentzVector::setPz(T z) {mThreeVector.setZ(z);} template void AliFemtoLorentzVector::setX(T x) {mThreeVector.setX(x);} template void AliFemtoLorentzVector::setY(T y) {mThreeVector.setY(y);} template void AliFemtoLorentzVector::setZ(T z) {mThreeVector.setZ(z);} template void AliFemtoLorentzVector::setT(T t) {mX4 = t;} template void AliFemtoLorentzVector::setE(T e) {mX4 = e;} template T AliFemtoLorentzVector::x() const {return mThreeVector.x();} template T AliFemtoLorentzVector::y() const {return mThreeVector.y();} template T AliFemtoLorentzVector::z() const {return mThreeVector.z();} template T AliFemtoLorentzVector::px() const {return mThreeVector.x();} template T AliFemtoLorentzVector::py() const {return mThreeVector.y();} template T AliFemtoLorentzVector::pz() const {return mThreeVector.z();} template T AliFemtoLorentzVector::e() const {return mX4;} template T AliFemtoLorentzVector::t() const {return mX4;} template T AliFemtoLorentzVector::perp() const {return mThreeVector.perp();} template T AliFemtoLorentzVector::perp2() const {return mThreeVector.perp2();} template T AliFemtoLorentzVector::pseudoRapidity() const {return mThreeVector.pseudoRapidity();} template T AliFemtoLorentzVector::phi() const {return mThreeVector.phi();} template T AliFemtoLorentzVector::theta() const {return mThreeVector.theta();} template T AliFemtoLorentzVector::cosTheta() const {return mThreeVector.cosTheta();} template T AliFemtoLorentzVector::operator() (size_t i) const { if (i < 3) return mThreeVector(i); else if (i == 3) return mX4; else { #ifndef ST_NO_EXCEPTIONS throw out_of_range("AliFemtoLorentzVector::operator(): bad index"); #else cerr << "AliFemtoLorentzVector::operator(): bad index." << endl; #endif return 0; } } template T& AliFemtoLorentzVector::operator() (size_t i) { if (i < 3) return mThreeVector(i); else if (i == 3) return mX4; else { #ifndef ST_NO_EXCEPTIONS throw out_of_range("AliFemtoLorentzVector::operator(): bad index"); #else cerr << "AliFemtoLorentzVector::operator(): bad index." << endl; #endif return mX4; } } template T AliFemtoLorentzVector::operator[] (size_t i) const { if (i < 3) return mThreeVector[i]; else if (i == 3) return mX4; else { #ifndef ST_NO_EXCEPTIONS throw out_of_range("AliFemtoLorentzVector::operator[]: bad index"); #else cerr << "AliFemtoLorentzVector::operator[]: bad index." << endl; #endif return 0; } } template T& AliFemtoLorentzVector::operator[] (size_t i) { if (i < 3) return mThreeVector[i]; else if (i == 3) return mX4; else { #ifndef ST_NO_EXCEPTIONS throw out_of_range("AliFemtoLorentzVector::operator[]: bad index"); #else cerr << "AliFemtoLorentzVector::operator[]: bad index." << endl; #endif return mX4; } } template T AliFemtoLorentzVector::rapidity() const { return 0.5*::log((mX4+mThreeVector.z())/(mX4-mThreeVector.z())+1e-20); } template AliFemtoLorentzVector AliFemtoLorentzVector::operator- () { return AliFemtoLorentzVector(-mX4,-mThreeVector); } template AliFemtoLorentzVector AliFemtoLorentzVector::operator+ () { return *this; } template AliFemtoLorentzVector& AliFemtoLorentzVector::operator*= (double c) { mThreeVector *= c; mX4 *= c; return *this; } template AliFemtoLorentzVector& AliFemtoLorentzVector::operator/= (double c) { mThreeVector /= c; mX4 /= c; return *this; } #ifndef ST_NO_MEMBER_TEMPLATES #ifndef WIN32 template template AliFemtoLorentzVector::AliFemtoLorentzVector(const AliFemtoThreeVector &vec, T t) : mThreeVector(vec), mX4(t) { /* nop */ } template template AliFemtoLorentzVector::AliFemtoLorentzVector(T t, const AliFemtoThreeVector &vec) : mThreeVector(vec), mX4(t) { /* nop */ } template template AliFemtoLorentzVector::AliFemtoLorentzVector(const AliFemtoLorentzVector &vec) : mThreeVector(vec.vect()), mX4(vec.t()) { /* nop */ } template template AliFemtoLorentzVector AliFemtoLorentzVector::boost(const AliFemtoLorentzVector& pframe) const { T mass = abs(pframe); AliFemtoThreeVector eta = (-1./mass)*pframe.vect(); // gamma*beta T gamma = fabs(pframe.e())/mass; AliFemtoThreeVector pl = ((this->vect()*eta)/(eta*eta))*eta; // longitudinal momentum return AliFemtoLorentzVector(gamma*this->e() - this->vect()*eta, this->vect() + (gamma-1.)*pl - this->e()*eta); } template template void AliFemtoLorentzVector::setVect(const AliFemtoThreeVector& v) { mThreeVector = v; } template template AliFemtoLorentzVector& AliFemtoLorentzVector::operator=(const AliFemtoLorentzVector& vec) { mThreeVector = vec.vect(); mX4 = vec.t(); return *this; } template template bool AliFemtoLorentzVector::operator== (const AliFemtoLorentzVector& v) const { return (mThreeVector == v.vect()) && (mX4 == v.t()); } template template bool AliFemtoLorentzVector::operator!= (const AliFemtoLorentzVector& v) const { return !(*this == v); } template template AliFemtoLorentzVector& AliFemtoLorentzVector::operator+= (const AliFemtoLorentzVector& v) { mThreeVector += v.vect(); mX4 += v.t(); return *this; } template template AliFemtoLorentzVector& AliFemtoLorentzVector::operator-= (const AliFemtoLorentzVector& v) { mThreeVector -= v.vect(); mX4 -= v.t(); return *this; } #endif #else template AliFemtoLorentzVector::AliFemtoLorentzVector(const AliFemtoThreeVector &vec, T t) : mThreeVector(vec), mX4(t) { /* nop */ } template AliFemtoLorentzVector::AliFemtoLorentzVector(const AliFemtoThreeVector &vec, T t) : mThreeVector(vec), mX4(t) { /* nop */ } template AliFemtoLorentzVector::AliFemtoLorentzVector(T t, const AliFemtoThreeVector &vec) : mThreeVector(vec), mX4(t) { /* nop */ } template AliFemtoLorentzVector::AliFemtoLorentzVector(T t, const AliFemtoThreeVector &vec) : mThreeVector(vec), mX4(t) { /* nop */ } template AliFemtoLorentzVector::AliFemtoLorentzVector(const AliFemtoLorentzVector &vec) : mThreeVector(vec.vect()), mX4(vec.t()) { /* nop */ } template AliFemtoLorentzVector::AliFemtoLorentzVector(const AliFemtoLorentzVector &vec) : mThreeVector(vec.vect()), mX4(vec.t()) { /* nop */ } template AliFemtoLorentzVector AliFemtoLorentzVector::boost(const AliFemtoLorentzVector& pframe) const { T mass = abs(pframe); AliFemtoThreeVector eta = (-1./mass)*pframe.vect(); // gamma*beta T gamma = fabs(pframe.e())/mass; AliFemtoThreeVector pl = ((this->vect()*eta)/(eta*eta))*eta; // longitudinal momentum return AliFemtoLorentzVector(gamma*this->e() - this->vect()*eta, this->vect() + (gamma-1.)*pl - this->e()*eta); } template AliFemtoLorentzVector AliFemtoLorentzVector::boost(const AliFemtoLorentzVector& pframe) const { T mass = abs(pframe); AliFemtoThreeVector eta = (-1./mass)*pframe.vect(); // gamma*beta T gamma = fabs(pframe.e())/mass; AliFemtoThreeVector pl = ((this->vect()*eta)/(eta*eta))*eta; // longitudinal momentum return AliFemtoLorentzVector(gamma*this->e() - this->vect()*eta, this->vect() + (gamma-1.)*pl - this->e()*eta); } template void AliFemtoLorentzVector::setVect(const AliFemtoThreeVector& v) { mThreeVector = v; } template void AliFemtoLorentzVector::setVect(const AliFemtoThreeVector& v) { mThreeVector = v; } template AliFemtoLorentzVector& AliFemtoLorentzVector::operator=(const AliFemtoLorentzVector& vec) { mThreeVector = vec.vect(); mX4 = vec.t(); return *this; } template AliFemtoLorentzVector& AliFemtoLorentzVector::operator=(const AliFemtoLorentzVector& vec) { mThreeVector = vec.vect(); mX4 = vec.t(); return *this; } template bool AliFemtoLorentzVector::operator== (const AliFemtoLorentzVector& v) const { return (this->vect() == v.vect()) && (mX4 == v.t()); } template bool AliFemtoLorentzVector::operator== (const AliFemtoLorentzVector& v) const { return (mThreeVector == v.vect()) && (mX4 == v.t()); } template bool AliFemtoLorentzVector::operator!= (const AliFemtoLorentzVector& v) const { return !(*this == v); } template bool AliFemtoLorentzVector::operator!= (const AliFemtoLorentzVector& v) const { return !(*this == v); } template AliFemtoLorentzVector& AliFemtoLorentzVector::operator+= (const AliFemtoLorentzVector& v) { mThreeVector += v.vect(); mX4 += v.t(); return *this; } template AliFemtoLorentzVector& AliFemtoLorentzVector::operator+= (const AliFemtoLorentzVector& v) { mThreeVector += v.vect(); mX4 += v.t(); return *this; } template AliFemtoLorentzVector& AliFemtoLorentzVector::operator-= (const AliFemtoLorentzVector& v) { mThreeVector -= v.vect(); mX4 -= v.t(); return *this; } template AliFemtoLorentzVector& AliFemtoLorentzVector::operator-= (const AliFemtoLorentzVector& v) { mThreeVector -= v.vect(); mX4 -= v.t(); return *this; } #endif // ST_NO_MEMBER_TEMPLATES #endif /* ! __CINT__ */ #ifdef __CINT__ template<> AliFemtoLorentzVector operator+ (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator+ (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator+ (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator+ (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator- (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator- (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator- (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator- (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator* (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator* (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator* (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator* (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator* (const double v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator* (const double v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator* (const AliFemtoLorentzVector& v1, const double v2); template<> AliFemtoLorentzVector operator* (const AliFemtoLorentzVector& v1, const double v2); template<> AliFemtoLorentzVector operator/ (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator/ (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator/ (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator/ (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator/ (const double v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator/ (const double v1, const AliFemtoLorentzVector& v2); template<> AliFemtoLorentzVector operator/ (const AliFemtoLorentzVector& v1, const double v2); template<> AliFemtoLorentzVector operator/ (const AliFemtoLorentzVector& v1, const double v2); template<> istream& operator>> (istream& is, const AliFemtoLorentzVector& v); template<> ostream& operator<< (ostream& os, const AliFemtoLorentzVector& v); template<> istream& operator>> (istream& is, const AliFemtoLorentzVector& v); template<> ostream& operator<< (ostream& os, const AliFemtoLorentzVector& v); template<> double abs(const AliFemtoLorentzVector& v); template<> float abs(const AliFemtoLorentzVector& v); #else // // Non-member operators // template AliFemtoLorentzVector operator+ (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2) { return AliFemtoLorentzVector(v1) += v2; } template AliFemtoLorentzVector operator- (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2) { return AliFemtoLorentzVector(v1) -= v2; } template T operator* (const AliFemtoLorentzVector& v1, const AliFemtoLorentzVector& v2) { return v1.t()*v2.t() - v1.vect()*v2.vect(); } template AliFemtoLorentzVector operator* (const AliFemtoLorentzVector& v, double c) { return AliFemtoLorentzVector(v) *= c; } template AliFemtoLorentzVector operator* (double c, const AliFemtoLorentzVector& v) { return AliFemtoLorentzVector(v) *= c; } template AliFemtoLorentzVector operator/ (const AliFemtoLorentzVector& v, X c) { return AliFemtoLorentzVector(v) /= c; } template ostream& operator<< (ostream& os, const AliFemtoLorentzVector& v) { return os << v.vect() << "\t\t" << v.t(); } template istream& operator>>(istream& is, AliFemtoLorentzVector& v) { T x, y, z, t; is >> x >> y >> z >> t; v.setX(x); v.setY(y); v.setZ(z); v.setT(t); return is; } // // Non-member functions // template T abs(const AliFemtoLorentzVector& v) {return v.m();} #endif /* __CINT__ */ #endif