#include "ATOOLS/Math/Poincare.H" #include "ATOOLS/Math/MathTools.H" #include "ATOOLS/Org/Exception.H" #include "ATOOLS/Org/Message.H" using namespace ATOOLS; Poincare::Poincare(): m_status(0), m_beta(1.,0.,0.,0.), m_rsq(1.), m_usen(false) { } Poincare::Poincare(const Vec4D& v1,const Vec4D& v2,const int mode): m_status(mode?3:2), m_beta(1.,0.,0.,0.), m_rsq(1.), m_usen(false) { if (m_status==3) { m_beta=v1; m_n=v2; return; } ATOOLS::Vec3D b(v1), a(v2); m_ct=a*b/(a.Abs()*b.Abs()); m_n=Vec4D(0.0,cross(a,b)); m_usen=m_n.PSpat2(); if (!m_usen) { m_n=Vec4D(0.0,cross(a,Vec3D::XVEC)); m_usen=m_n.PSpat2(); if (!m_usen) { m_n=Vec4D(0.0,cross(a,Vec3D::YVEC)); m_usen=m_n.PSpat2(); if (!m_usen) { m_n=Vec4D(0.0,cross(a,Vec3D::ZVEC)); m_usen=m_n.PSpat2(); } } } m_usen&=m_ct<1.0; m_nsq=m_n.PSpat2(); m_nabs=sqrt(m_nsq); if(sqr(m_ct)>1.0) { if (!IsEqual(sqr(m_ct),1.0)) { int prc(msg_Error().precision()); msg_Error().precision(14); msg_Error()<0.0?1.0:-1.0; } m_st=-sqrt(1.0-sqr(m_ct)); if (m_usen) { a=1.0/a.Abs()*a; b=1.0/b.Abs()*b; Vec3D n(m_n), at(n*(n*a)/m_nsq), ap(a-at); Vec3D ta(at+m_ct*ap-m_st/m_nabs*cross(n,ap)); if (!ATOOLS::IsZero((ta-b).Sqr(),1.0e-6)) msg_Error()< rel. dev. (" <=0) && !(m_ct<0)) || (!(m_st>=0) && !(m_st<0)) || m_n.Nan()) return false; } return true; } bool Poincare::CheckLambda() const { if (!IsEqual(m_beta.Abs2(),m_n.Abs2())) return false; return true; } void Poincare::Invert() { if (m_status==3) { std::swap(m_beta,m_n); return; } for (short unsigned int i(1);i<4;++i) { m_beta[i]=-m_beta[i]; m_n[i]=-m_n[i]; } } Vec4D Poincare_Sequence::operator*(const Vec4D &p) const { Vec4D np(p); for (const_iterator pit(begin());pit!=end();++pit) np=(*pit)*np; return np; } void Poincare_Sequence::Invert() { Poincare_Sequence copy(*this); reverse_iterator cit(copy.rbegin()); for (iterator pit(begin());pit!=end();++pit,++cit) { cit->Invert(); *pit=*cit; } }