From 38a63ec3ea6f757536ce30fd442a967f3ef90537 Mon Sep 17 00:00:00 2001
From: Stewart Martin-Haugh <stewart.martin-haugh@cern.ch>
Date: Fri, 29 Sep 2023 18:08:23 +0200
Subject: [PATCH] Use identity to reduce number of calls to log functions in
 tracking calculations

Use identity to reduce number of calls to log functions in tracking calculations
---
 Tools/PROCTools/data/q449_AOD_digest.ref      |  2 +-
 Tools/WorkflowTestRunner/python/References.py |  8 ++---
 .../TrkExUtils/src/MaterialInteraction.cxx    | 30 +++++++++++--------
 3 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/Tools/PROCTools/data/q449_AOD_digest.ref b/Tools/PROCTools/data/q449_AOD_digest.ref
index 9d48865b79f..a4cf64b380a 100644
--- a/Tools/PROCTools/data/q449_AOD_digest.ref
+++ b/Tools/PROCTools/data/q449_AOD_digest.ref
@@ -19,7 +19,7 @@
       431493  1096123504         258         340          52           5           0           8           0           8          11           0          11
       431493  1096125003         349         449          84           7           0          10           0          10          17           0          17
       431493  1096125237         355         495          76           6           1           8           0           8          15           0          15
-      431493  1096125348         295         346          63           6           2           8           0           8           8           0           8
+      431493  1096125348         295         346          63           6           1           8           0           8           8           0           8
       431493  1096125522         251         303          64           9           1           7           0           7          16           0          16
       431493  1096127413         396         579         105           7           1          11           0          11          22           0          22
       431493  1096127722         221         418          74           9           1           7           0           7           7           0           7
diff --git a/Tools/WorkflowTestRunner/python/References.py b/Tools/WorkflowTestRunner/python/References.py
index ad7c13f9f3c..d6a9ab82d8a 100644
--- a/Tools/WorkflowTestRunner/python/References.py
+++ b/Tools/WorkflowTestRunner/python/References.py
@@ -22,10 +22,10 @@ references_map = {
     "d1726": "v1",
     "d1759": "v3",
     # Reco
-    "q442": "v22",
-    "q443": "v18",
-    "q445": "v26",
-    "q449": "v30",
+    "q442": "v23",
+    "q443": "v19",
+    "q445": "v27",
+    "q449": "v31",
     # Derivations
     "data_PHYS_Run2": "v11",
     "data_PHYS_Run3": "v10",
diff --git a/Tracking/TrkExtrapolation/TrkExUtils/src/MaterialInteraction.cxx b/Tracking/TrkExtrapolation/TrkExUtils/src/MaterialInteraction.cxx
index fc6323a73d8..59123ab10c8 100644
--- a/Tracking/TrkExtrapolation/TrkExUtils/src/MaterialInteraction.cxx
+++ b/Tracking/TrkExtrapolation/TrkExUtils/src/MaterialInteraction.cxx
@@ -68,7 +68,7 @@ MeanExcitationEnergy(const Trk::Material& mat) {
 [[gnu::always_inline]]
 #endif
 inline double
-DensityEffect(const double zOverAtimesRho, const double eta2,
+DensityEffect(const double zOverAtimesRho, const double eta,
               const double gamma, const double I) {
 
   // density effect. Done for gamma > 10  ( p > 1GeV for muons)
@@ -78,7 +78,10 @@ DensityEffect(const double zOverAtimesRho, const double eta2,
     // PDG 2022 Table 34.1
     double eplasma = 28.816e-6 * std::sqrt(1000. * zOverAtimesRho);
     // PDG 2022 Eq. 34.6
-    return 2. * std::log(eplasma / I) + std::log(eta2) - 1.;
+    //2. * std::log(eplasma / I) + std::log(eta2) - 1.
+    //applying logarithmic identities becomes 
+    // 2*(log(eplasma/I) + log(eta))  = 2*log(eplasma*eta/I)
+    return 2. * std::log(eplasma*eta / I) - 1.;
   }
   return 0;
 }
@@ -99,7 +102,9 @@ inline double
 LandauMPV(const double kazL, const double eta2, const double I,
           const double beta, const double delta) {
   // PDG 2022 Eq 34.12
-  return -kazL * (std::log(2. * s_me * eta2 / I) + std::log(kazL / I) + 0.2 -
+  // then apply logarithmic identity
+  // log(2. * s_me * eta2 / I) + log(kazL / I) = log(2. * s_me* eta2 * kazL/(I*I))
+  return -kazL * (std::log(2. * s_me * eta2*kazL/(I*I)) + 0.2 -
                   (beta * beta) - delta);
 }
 
@@ -138,9 +143,9 @@ double Trk::MaterialInteraction::dEdl_ionization(
     //  sigmaL --> FWHM of Landau
     sigma = 4 * kaz;
   } else {
-    double eta2 = beta * gamma;
-    eta2 *= eta2;
-    const double delta = DensityEffect(zOverAtimesRho, eta2, gamma, I);
+    const double eta = beta * gamma;
+    const double eta2 = eta*eta;
+    const double delta = DensityEffect(zOverAtimesRho, eta, gamma, I);
     // tmax - cut off energy
     const double tMax =
         2. * eta2 * s_me / (1. + 2. * gamma * mfrac + mfrac * mfrac);
@@ -175,9 +180,9 @@ double Trk::MaterialInteraction::dEdXBetheBloch(
   double kaz = KAZ(mat.zOverAtimesRho());
 
   if (particle != Trk::electron) {
-    double eta2 = beta * gamma;
-    eta2 *= eta2;
-    double delta = DensityEffect(zOverAtimesRho, eta2, gamma, iPot);
+    const double eta = beta * gamma;
+    const double eta2 = eta*eta;
+    double delta = DensityEffect(zOverAtimesRho, eta, gamma, iPot);
     // mass fraction
     double mfrac = s_me / m;
     // tmax - cut off energy
@@ -210,10 +215,9 @@ double Trk::MaterialInteraction::dE_MPV_ionization(
   const double I = MeanExcitationEnergy(mat);
   const double zOverAtimesRho = mat.zOverAtimesRho();
   double kaz = KAZ(zOverAtimesRho);
-  double eta2 = beta * gamma;
-
-  eta2 *= eta2;
-  const double delta = DensityEffect(zOverAtimesRho, eta2, gamma, I);
+  const double eta = beta * gamma;
+  const double eta2 = eta*eta;
+  const double delta = DensityEffect(zOverAtimesRho, eta, gamma, I);
   // divide by beta^2 for non-electrons
   kaz /= beta * beta;
   kazL = kaz * path;
-- 
GitLab