From 20f74f97c6e5be29dc64f3b282f609220c7ad62d Mon Sep 17 00:00:00 2001 From: Lorenzo Moneta <Lorenzo.Moneta@cern.ch> Date: Fri, 1 Feb 2013 13:15:55 +0000 Subject: [PATCH] used Vector::Scalar instead of double in utility functions for compiling with Vc types git-svn-id: http://root.cern.ch/svn/root/branches/dev/rootvc@48449 27541ba8-7e3a-0410-8455-c3a389f83636 --- .../genvector/inc/Math/GenVector/VectorUtil.h | 54 ++++++++++++------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/math/genvector/inc/Math/GenVector/VectorUtil.h b/math/genvector/inc/Math/GenVector/VectorUtil.h index ab16d243387..e0991d82f80 100644 --- a/math/genvector/inc/Math/GenVector/VectorUtil.h +++ b/math/genvector/inc/Math/GenVector/VectorUtil.h @@ -1,4 +1,4 @@ -// @(#)root/mathcore:$Id$ +// @(#)root/mathcore:$Id: 9ef2a4a7bd1b62c1293920c2af2f64791c75bdd8 $ // Authors: W. Brown, M. Fischler, L. Moneta 2005 @@ -58,8 +58,8 @@ namespace ROOT { \f[ \Delta \phi = \phi_2 - \phi_1 \f] */ template <class Vector1, class Vector2> - inline double DeltaPhi( const Vector1 & v1, const Vector2 & v2) { - double dphi = v2.Phi() - v1.Phi(); + inline typename Vector1::Scalar DeltaPhi( const Vector1 & v1, const Vector2 & v2) { + typename Vector1::Scalar dphi = v2.Phi() - v1.Phi(); if ( dphi > M_PI ) { dphi -= 2.0*M_PI; } else if ( dphi <= -M_PI ) { @@ -79,9 +79,9 @@ namespace ROOT { \f[ \Delta R2 = ( \Delta \phi )^2 + ( \Delta \eta )^2 \f] */ template <class Vector1, class Vector2> - inline double DeltaR2( const Vector1 & v1, const Vector2 & v2) { - double dphi = DeltaPhi(v1,v2); - double deta = v2.Eta() - v1.Eta(); + inline typename Vector1::Scalar DeltaR2( const Vector1 & v1, const Vector2 & v2) { + typename Vector1::Scalar dphi = DeltaPhi(v1,v2); + typename Vector1::Scalar deta = v2.Eta() - v1.Eta(); return dphi*dphi + deta*deta; } @@ -92,9 +92,9 @@ namespace ROOT { \param v2 Vector 2 \return Angle between the two vectors \f[ \Delta R = \sqrt{ ( \Delta \phi )^2 + ( \Delta \eta )^2 } \f] - */ + */ template <class Vector1, class Vector2> - inline double DeltaR( const Vector1 & v1, const Vector2 & v2) { + inline typename Vector1::Scalar DeltaR( const Vector1 & v1, const Vector2 & v2) { return std::sqrt( DeltaR2(v1,v2) ); } @@ -214,18 +214,33 @@ namespace ROOT { \f[ M_{12} = \sqrt{ (\vec{v1} + \vec{v2} ) \cdot (\vec{v1} + \vec{v2} ) } \f] */ template <class Vector1, class Vector2> - inline double InvariantMass( const Vector1 & v1, const Vector2 & v2) { - double ee = (v1.E() + v2.E() ); - double xx = (v1.X() + v2.X() ); - double yy = (v1.Y() + v2.Y() ); - double zz = (v1.Z() + v2.Z() ); - double mm2 = ee*ee - xx*xx - yy*yy - zz*zz; + inline typename Vector1::Scalar InvariantMass( const Vector1 & v1, const Vector2 & v2) { + typedef typename Vector1::Scalar Scalar; + Scalar ee = (v1.E() + v2.E() ); + Scalar xx = (v1.X() + v2.X() ); + Scalar yy = (v1.Y() + v2.Y() ); + Scalar zz = (v1.Z() + v2.Z() ); + Scalar mm2 = ee*ee - xx*xx - yy*yy - zz*zz; return mm2 < 0.0 ? -std::sqrt(-mm2) : std::sqrt(mm2); // PxPyPzE4D<double> q(xx,yy,zz,ee); // return q.M(); //return ( v1 + v2).mag(); } + template <class Vector1, class Vector2> + inline typename Vector1::Scalar InvariantMass2( const Vector1 & v1, const Vector2 & v2) { + typedef typename Vector1::Scalar Scalar; + Scalar ee = (v1.E() + v2.E() ); + Scalar xx = (v1.X() + v2.X() ); + Scalar yy = (v1.Y() + v2.Y() ); + Scalar zz = (v1.Z() + v2.Z() ); + Scalar mm2 = ee*ee - xx*xx - yy*yy - zz*zz; + return mm2 ; // < 0.0 ? -std::sqrt(-mm2) : std::sqrt(mm2); +// PxPyPzE4D<double> q(xx,yy,zz,ee); +// return q.M(); + //return ( v1 + v2).mag(); + } + // rotation and transformations @@ -339,15 +354,16 @@ namespace ROOT { X(), Y(), Z(), T() and SetXYZT methods. The beta of the boost must be <= 1 or a nul Lorentz Vector will be returned */ - template <class LVector> - LVector boostX(const LVector & v, double beta) { + template <class LVector, class T> + LVector boostX(const LVector & v, T beta) { if (beta >= 1) { GenVector::Throw ("Beta Vector supplied to set Boost represents speed >= c"); return LVector(); } - double gamma = 1.0/ std::sqrt(1.0 - beta*beta); - double x2 = gamma * v.X() + gamma * beta * v.T(); - double t2 = gamma * beta * v.X() + gamma * v.T(); + T gamma = 1.0/ std::sqrt(1.0 - beta*beta); + typename LVector::Scalar x2 = gamma * v.X() + gamma * beta * v.T(); + typename LVector::Scalar t2 = gamma * beta * v.X() + gamma * v.T(); + LVector lv; lv.SetXYZT(x2,v.Y(),v.Z(),t2); return lv; -- GitLab