From 300d785201e33646eced205d35b1c6bbac4932cd Mon Sep 17 00:00:00 2001
From: Elmar Ritsch <Elmar.Ritsch@cern.ch>
Date: Fri, 22 Apr 2016 14:52:01 +0200
Subject: [PATCH] Improve performance of heavily used BFieldCache::getB method
 by moving short->float type conversions out of tight for-loop. New
 BFieldCache::getB method is about 1.4 times faster. Bit-wise identical output
 is guaranteed (MagFieldServices-00-01-36)

	* Improve performance of heavily used BFieldCache::getB method by moving
	short->float type conversions out of tight for-loop. New BFieldCache::getB
	method is about 1.4 times faster.
		* Bit-wise identical output is guaranteed
	* Tagging as MagFieldServices-00-01-36
---
 .../MagFieldServices/MagFieldServices/AtlasFieldSvc.h       | 4 ++--
 .../MagFieldServices/MagFieldServices/BFieldCache.h         | 6 +++---
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/MagneticField/MagFieldServices/MagFieldServices/AtlasFieldSvc.h b/MagneticField/MagFieldServices/MagFieldServices/AtlasFieldSvc.h
index 34fe1162b061..e191ea7179b5 100644
--- a/MagneticField/MagFieldServices/MagFieldServices/AtlasFieldSvc.h
+++ b/MagneticField/MagFieldServices/MagFieldServices/AtlasFieldSvc.h
@@ -67,8 +67,8 @@ namespace MagField {
       /** get B field value at given position */
       /** xyz[3] is in mm, bxyz[3] is in kT */
       /** if deriv[9] is given, field derivatives are returned in kT/mm */
-      virtual void getField(const double *xyz, double *bxyz, double *deriv = 0);
-      virtual void getFieldZR(const double *xyz, double *bxyz, double *deriv = 0);
+      virtual void getField(const double *xyz, double *bxyz, double *deriv = 0) override final;
+      virtual void getFieldZR(const double *xyz, double *bxyz, double *deriv = 0) override final;
 
     private:
       /* // Methods called to get field
diff --git a/MagneticField/MagFieldServices/MagFieldServices/BFieldCache.h b/MagneticField/MagFieldServices/MagFieldServices/BFieldCache.h
index 31d3d3418dce..f97aeaa6a6b0 100644
--- a/MagneticField/MagFieldServices/MagFieldServices/BFieldCache.h
+++ b/MagneticField/MagFieldServices/MagFieldServices/BFieldCache.h
@@ -43,7 +43,7 @@ private:
     double m_rmin, m_rmax; // bin range in r
     double m_phimin, m_phimax; // bin range in phi
     float m_invz, m_invr, m_invphi; // 1/(bin size) in z, r, phi
-    short m_field[3][8]; // (Bz,Br,Bphi) at 8 corners of the bin
+    float m_field[3][8]; // (Bz,Br,Bphi) at 8 corners of the bin
     float m_scale; // unit of m_field in kT
 };
 
@@ -67,7 +67,7 @@ BFieldCache::getB( const double *xyz, double r, double phi, double *B, double *d
     // interpolate field values in z, r, phi
     float Bzrphi[3];
     for ( int i = 0; i < 3; i++ ) { // z, r, phi components
-        const short *field = m_field[i];
+        const float *field = m_field[i];
         Bzrphi[i] = m_scale*( gz*( gr*( gphi*field[0] + fphi*field[1] ) +
                                    fr*( gphi*field[2] + fphi*field[3] ) ) +
                               fz*( gr*( gphi*field[4] + fphi*field[5] ) +
@@ -95,7 +95,7 @@ BFieldCache::getB( const double *xyz, double r, double phi, double *B, double *d
         float sphi = m_scale*m_invphi;
         float dBdz[3], dBdr[3], dBdphi[3];
         for ( int j = 0; j < 3; j++ ) { // Bz, Br, Bphi components
-            const short *field = m_field[j];
+            const float *field = m_field[j];
             dBdz[j]   = sz*( gr*( gphi*(field[4]-field[0]) + fphi*(field[5]-field[1]) ) +
                              fr*( gphi*(field[6]-field[2]) + fphi*(field[7]-field[3]) ) );
             dBdr[j]   = sr*( gz*( gphi*(field[2]-field[0]) + fphi*(field[3]-field[1]) ) +
-- 
GitLab