#ifndef ALIUNICORPAIR_H
#define ALIUNICORPAIR_H
#include <cmath>
#include <TObject.h>
#include <TLorentzVector.h>
class AliUnicorPair : public TObject {
public:
AliUnicorPair() : fP0(), fP1(), fP(), fQ(), fBeta(), fBetat(), fBetaz(), fUbeta(),
fUbetat(), fUbetaz(), fCMp(), fCMq(), fBuf() {}
virtual ~AliUnicorPair() {}
void Set0(double m,double p,double theta,double phi) {fP0.SetXYZM(0,0,p,m); fP0.SetTheta(theta); fP0.SetPhi(phi);}
void Set1(double m,double p,double theta,double phi) {fP1.SetXYZM(0,0,p,m); fP1.SetTheta(theta); fP1.SetPhi(phi);}
void SetMXYZ0(double m,double px,double py,double pz) {fP0.SetXYZM(px,py,pz,m);}
void SetMXYZ1(double m,double px,double py,double pz) {fP1.SetXYZM(px,py,pz,m);}
void CalcLAB() {fCMp=fP=fP0+fP1; fCMq=fQ=fP1-fP0; fBeta=fP.BoostVector();
fBetaz.SetXYZ(0,0,fBeta.Z()); fBetat=fBeta; fBetat.SetZ(0);
fUbeta=fBeta.Unit(); fUbetat=fBetat.Unit(); fUbetaz=fBetaz.Unit();}
double Rapidity() const {return fP.Rapidity();}
double Pt() const {return fP.Pt();}
double Phi() const {return fP.Phi();}
double DTheta() const {return fP1.Theta()-fP0.Theta();}
double DPhi() const {return TVector2::Phi_mpi_pi(fP1.Phi()-fP0.Phi());}
void CalcPairCM() {fCMp.Boost(-fBeta); fCMq.Boost(-fBeta);}
void CalcLcmsCM() {fCMp.Boost(-fBetaz); fCMq.Boost(-fBetaz);}
void Swap() {fBuf=fP0; fP0=fP1; fP1=fBuf; fQ=-fQ; fCMq=-fCMq;}
double Minv() const {return fP.M();}
double Qinv2() const {return -fQ.M2();}
double QCM() const {return fCMq.Vect().Mag();}
double QCMpar() const {return fCMq.Vect()*fUbeta;}
double QCMper() const {return sqrt(fabs(QCM()*QCM()-QCMpar()*QCMpar()));}
double QCMout() const {return +fCMq.Vect().X()*fUbetat.X()+fCMq.Vect().Y()*fUbetat.Y();}
double QCMside() const {return -fCMq.Vect().X()*fUbetat.Y()+fCMq.Vect().Y()*fUbetat.X();}
double QCMlong() const {return fCMq.Vect().Z();}
double QCMTheta() const {return fCMq.Theta();}
double QCMPhi() const {return fCMq.Phi();}
double QCMPhiOut() const {return atan2(QCMside(),QCMout());}
protected:
TLorentzVector fP0;
TLorentzVector fP1;
TLorentzVector fP;
TLorentzVector fQ;
TVector3 fBeta;
TVector3 fBetat;
TVector3 fBetaz;
TVector3 fUbeta;
TVector3 fUbetat;
TVector3 fUbetaz;
TLorentzVector fCMp;
TLorentzVector fCMq;
TLorentzVector fBuf;
ClassDef(AliUnicorPair,1)
};
#endif