I would like to propose that the TParticle class gets new methods (this should be fully backwards compatible so no need to change the class version): [code]public :

Double_t Ek() const { return fE-fCalcMass; }

Double_t PhiP(const TParticle &p) // the angle between mommenta of particles

{

Double_t v = P()*p.P();
if (v == 0) v = 1; else v = (fPx*p.Px()+fPy

*p.Py()+fPz*p.Pz())/v;

if (v > 1) v = 1; else if (v < -1) v = -1; // just a precaution

return TMath::ACos(v);

}

Double_t PhiX() const { return TMath::Pi()+TMath::ATan2(-fPy,-fPz); } // note that PhiX() returns an angle between 0 and 2pi

Double_t PhiY() const { return TMath::Pi()+TMath::ATan2(-fPz,-fPx); } // note that PhiY() returns an angle between 0 and 2pi

Double_t PhiZ() const { return Phi(); } // note that PhiZ() returns an angle between 0 and 2pi

Double_t ThetaX() const { return (fPx==0)?TMath::PiOver2():TMath::ACos(fPx/P()); }

Double_t ThetaY() const { return (fPy==0)?TMath::PiOver2():TMath::ACos(fPy/P()); }

Double_t ThetaZ() const { return Theta(); }

Double_t GetPolarTheta() const { return fPolarTheta; }

Double_t GetPolarPhi() const { return fPolarPhi; }

void GetPolarisation(Double_t &theta, Double_t &phi) const { theta = fPolarTheta; phi = fPolarPhi; }

void SetPolarTheta(Double_t theta) { fPolarTheta = theta; }

void SetPolarPhi(Double_t phi) { fPolarPhi = phi; }

void SetPolarisation(Double_t theta, Double_t phi) { fPolarTheta = theta; fPolarPhi = phi; }[/code]