From beb87a2c2611c47b1972a4791df57e3cf84a65d9 Mon Sep 17 00:00:00 2001
From: Danny Hindson <danny.hindson@stfc.ac.uk>
Date: Thu, 23 Jan 2020 10:30:43 +0000
Subject: [PATCH] Incorporate review comment relating to debug logging

Logging stats are only generated now if the logging level is debug
---
 .../SampleCorrections/MCAbsorptionStrategy.h  |  6 +-
 .../SampleCorrections/MCInteractionVolume.h   |  8 ++-
 .../Algorithms/src/MonteCarloAbsorption.cpp   |  7 +--
 .../MCAbsorptionStrategy.cpp                  | 16 ++---
 .../SampleCorrections/MCInteractionVolume.cpp | 62 ++++++++++---------
 .../test/MCAbsorptionStrategyTest.h           | 15 +++--
 .../Algorithms/test/MCInteractionVolumeTest.h | 38 +++++++-----
 7 files changed, 83 insertions(+), 69 deletions(-)

diff --git a/Framework/Algorithms/inc/MantidAlgorithms/SampleCorrections/MCAbsorptionStrategy.h b/Framework/Algorithms/inc/MantidAlgorithms/SampleCorrections/MCAbsorptionStrategy.h
index 47c0d2b6679..6c1cd2b3b12 100644
--- a/Framework/Algorithms/inc/MantidAlgorithms/SampleCorrections/MCAbsorptionStrategy.h
+++ b/Framework/Algorithms/inc/MantidAlgorithms/SampleCorrections/MCAbsorptionStrategy.h
@@ -18,6 +18,7 @@ class Sample;
 namespace Kernel {
 class PseudoRandomNumberGenerator;
 class V3D;
+class Logger;
 } // namespace Kernel
 namespace Algorithms {
 class IBeamProfile;
@@ -35,11 +36,10 @@ class MANTID_ALGORITHMS_DLL MCAbsorptionStrategy {
 public:
   MCAbsorptionStrategy(const IBeamProfile &beamProfile,
                        const API::Sample &sample, size_t nevents,
-                       size_t maxScatterPtAttempts);
+                       size_t maxScatterPtAttempts, Kernel::Logger &logger);
   std::tuple<double, double> calculate(Kernel::PseudoRandomNumberGenerator &rng,
                                        const Kernel::V3D &finalPos,
-                                       double lambdaBefore, double lambdaAfter,
-                                       std::string &debugString);
+                                       double lambdaBefore, double lambdaAfter);
 
 private:
   const IBeamProfile &m_beamProfile;
diff --git a/Framework/Algorithms/inc/MantidAlgorithms/SampleCorrections/MCInteractionVolume.h b/Framework/Algorithms/inc/MantidAlgorithms/SampleCorrections/MCInteractionVolume.h
index 80eac35fec6..2e27737805d 100644
--- a/Framework/Algorithms/inc/MantidAlgorithms/SampleCorrections/MCInteractionVolume.h
+++ b/Framework/Algorithms/inc/MantidAlgorithms/SampleCorrections/MCInteractionVolume.h
@@ -9,6 +9,7 @@
 
 #include "MantidAlgorithms/DllConfig.h"
 #include "MantidGeometry/Objects/BoundingBox.h"
+#include "MantidKernel/Logger.h"
 #include <boost/optional.hpp>
 
 namespace Mantid {
@@ -36,18 +37,20 @@ class MANTID_ALGORITHMS_DLL MCInteractionVolume {
 public:
   MCInteractionVolume(const API::Sample &sample,
                       const Geometry::BoundingBox &activeRegion,
+                      Kernel::Logger &logger,
                       const size_t maxScatterAttempts = 5000);
   // No creation from temporaries as we store a reference to the object in
   // the sample
   MCInteractionVolume(const API::Sample &&sample,
-                      const Geometry::BoundingBox &&activeRegion) = delete;
+                      const Geometry::BoundingBox &&activeRegion,
+                      Kernel::Logger &logger) = delete;
 
   const Geometry::BoundingBox &getBoundingBox() const;
   double calculateAbsorption(Kernel::PseudoRandomNumberGenerator &rng,
                              const Kernel::V3D &startPos,
                              const Kernel::V3D &endPos, double lambdaBefore,
                              double lambdaAfter);
-  std::string generateScatterPointStats() const;
+  void generateScatterPointStats();
   Kernel::V3D generatePoint(Kernel::PseudoRandomNumberGenerator &rng);
 
 private:
@@ -62,6 +65,7 @@ private:
   const Geometry::SampleEnvironment *m_env;
   const Geometry::BoundingBox m_activeRegion;
   const size_t m_maxScatterAttempts;
+  Kernel::Logger &m_logger;
 };
 
 } // namespace Algorithms
diff --git a/Framework/Algorithms/src/MonteCarloAbsorption.cpp b/Framework/Algorithms/src/MonteCarloAbsorption.cpp
index abf3fefe620..ca8ac64e5e5 100644
--- a/Framework/Algorithms/src/MonteCarloAbsorption.cpp
+++ b/Framework/Algorithms/src/MonteCarloAbsorption.cpp
@@ -241,7 +241,7 @@ MatrixWorkspace_uptr MonteCarloAbsorption::doSimulation(
 
   // Configure strategy
   MCAbsorptionStrategy strategy(*beamProfile, inputWS.sample(), nevents,
-                                maxScatterPtAttempts);
+                                maxScatterPtAttempts, g_log);
 
   const auto &spectrumInfo = simulationWS.spectrumInfo();
 
@@ -276,12 +276,9 @@ MatrixWorkspace_uptr MonteCarloAbsorption::doSimulation(
       } else {
         // elastic case already initialized
       }
-      std::string debugString;
 
       std::tie(outY[j], std::ignore) =
-          strategy.calculate(rng, detPos, lambdaIn, lambdaOut, debugString);
-
-      g_log.debug(debugString);
+          strategy.calculate(rng, detPos, lambdaIn, lambdaOut);
 
       // Ensure we have the last point for the interpolation
       if (lambdaStepSize > 1 && j + lambdaStepSize >= nbins && j + 1 != nbins) {
diff --git a/Framework/Algorithms/src/SampleCorrections/MCAbsorptionStrategy.cpp b/Framework/Algorithms/src/SampleCorrections/MCAbsorptionStrategy.cpp
index 3ce29eec39d..ecc657117f2 100644
--- a/Framework/Algorithms/src/SampleCorrections/MCAbsorptionStrategy.cpp
+++ b/Framework/Algorithms/src/SampleCorrections/MCAbsorptionStrategy.cpp
@@ -28,10 +28,11 @@ namespace Algorithms {
 MCAbsorptionStrategy::MCAbsorptionStrategy(const IBeamProfile &beamProfile,
                                            const API::Sample &sample,
                                            size_t nevents,
-                                           size_t maxScatterPtAttempts)
+                                           size_t maxScatterPtAttempts,
+                                           Kernel::Logger &logger)
     : m_beamProfile(beamProfile),
-      m_scatterVol(
-          MCInteractionVolume(sample, beamProfile.defineActiveRegion(sample))),
+      m_scatterVol(MCInteractionVolume(
+          sample, beamProfile.defineActiveRegion(sample), logger)),
       m_nevents(nevents), m_maxScatterAttempts(maxScatterPtAttempts),
       m_error(1.0 / std::sqrt(m_nevents)) {}
 
@@ -46,9 +47,10 @@ MCAbsorptionStrategy::MCAbsorptionStrategy(const IBeamProfile &beamProfile,
  * @param debugString String describing debug information from calculation
  * @return A tuple of the <correction factor, associated error>.
  */
-std::tuple<double, double> MCAbsorptionStrategy::calculate(
-    Kernel::PseudoRandomNumberGenerator &rng, const Kernel::V3D &finalPos,
-    double lambdaBefore, double lambdaAfter, std::string &debugString) {
+std::tuple<double, double>
+MCAbsorptionStrategy::calculate(Kernel::PseudoRandomNumberGenerator &rng,
+                                const Kernel::V3D &finalPos,
+                                double lambdaBefore, double lambdaAfter) {
   const auto scatterBounds = m_scatterVol.getBoundingBox();
   double factor(0.0);
 
@@ -76,7 +78,7 @@ std::tuple<double, double> MCAbsorptionStrategy::calculate(
     } while (true);
   }
 
-  debugString += m_scatterVol.generateScatterPointStats();
+  m_scatterVol.generateScatterPointStats();
 
   using std::make_tuple;
   return make_tuple(factor / static_cast<double>(m_nevents), m_error);
diff --git a/Framework/Algorithms/src/SampleCorrections/MCInteractionVolume.cpp b/Framework/Algorithms/src/SampleCorrections/MCInteractionVolume.cpp
index 47aef7b9ccd..71bdaf1274b 100644
--- a/Framework/Algorithms/src/SampleCorrections/MCInteractionVolume.cpp
+++ b/Framework/Algorithms/src/SampleCorrections/MCInteractionVolume.cpp
@@ -31,9 +31,10 @@ namespace Algorithms {
  */
 MCInteractionVolume::MCInteractionVolume(
     const API::Sample &sample, const Geometry::BoundingBox &activeRegion,
-    const size_t maxScatterAttempts)
+    Kernel::Logger &logger, const size_t maxScatterAttempts)
     : m_sample(sample.getShape().clone()), m_env(nullptr),
-      m_activeRegion(activeRegion), m_maxScatterAttempts(maxScatterAttempts) {
+      m_activeRegion(activeRegion), m_maxScatterAttempts(maxScatterAttempts),
+      m_logger(logger) {
   if (!m_sample->hasValidShape()) {
     throw std::invalid_argument(
         "MCInteractionVolume() - Sample shape does not have a valid shape.");
@@ -203,34 +204,37 @@ double MCInteractionVolume::calculateAbsorption(
  * the simulated scatter points occurred in
  * @return The generated string
  */
-std::string MCInteractionVolume::generateScatterPointStats() const {
-  std::stringstream scatterPointSummary;
-  scatterPointSummary << std::fixed;
-  scatterPointSummary << std::setprecision(2);
-
-  scatterPointSummary << "Scatter point counts:" << std::endl;
-
-  int totalScatterPoints =
-      std::accumulate(m_envScatterPoints.begin(), m_envScatterPoints.end(),
-                      m_sampleScatterPoints);
-
-  scatterPointSummary << "Total scatter points: " << totalScatterPoints
-                      << std::endl;
-
-  double percentage =
-      static_cast<double>(m_sampleScatterPoints) / totalScatterPoints * 100;
-  scatterPointSummary << "Sample: " << m_sampleScatterPoints << " ("
-                      << percentage << "%)" << std::endl;
-
-  for (std::vector<int>::size_type i = 0; i < m_envScatterPoints.size(); i++) {
-    percentage =
-        static_cast<double>(m_envScatterPoints[i]) / totalScatterPoints * 100;
-    scatterPointSummary << "Environment part " << i << " ("
-                        << m_env->getComponent(i).id()
-                        << "): " << m_envScatterPoints[i] << " (" << percentage
-                        << "%)" << std::endl;
+void MCInteractionVolume::generateScatterPointStats() {
+  if (m_logger.is(Kernel::Logger::Priority::PRIO_DEBUG)) {
+    std::stringstream scatterPointSummary;
+    scatterPointSummary << std::fixed;
+    scatterPointSummary << std::setprecision(2);
+
+    scatterPointSummary << "Scatter point counts:" << std::endl;
+
+    int totalScatterPoints =
+        std::accumulate(m_envScatterPoints.begin(), m_envScatterPoints.end(),
+                        m_sampleScatterPoints);
+
+    scatterPointSummary << "Total scatter points: " << totalScatterPoints
+                        << std::endl;
+
+    double percentage =
+        static_cast<double>(m_sampleScatterPoints) / totalScatterPoints * 100;
+    scatterPointSummary << "Sample: " << m_sampleScatterPoints << " ("
+                        << percentage << "%)" << std::endl;
+
+    for (std::vector<int>::size_type i = 0; i < m_envScatterPoints.size();
+         i++) {
+      percentage =
+          static_cast<double>(m_envScatterPoints[i]) / totalScatterPoints * 100;
+      scatterPointSummary << "Environment part " << i << " ("
+                          << m_env->getComponent(i).id()
+                          << "): " << m_envScatterPoints[i] << " ("
+                          << percentage << "%)" << std::endl;
+    }
+    m_logger.debug(scatterPointSummary.str());
   }
-  return scatterPointSummary.str();
 }
 
 } // namespace Algorithms
diff --git a/Framework/Algorithms/test/MCAbsorptionStrategyTest.h b/Framework/Algorithms/test/MCAbsorptionStrategyTest.h
index 31fcefa7323..3d763ee1140 100644
--- a/Framework/Algorithms/test/MCAbsorptionStrategyTest.h
+++ b/Framework/Algorithms/test/MCAbsorptionStrategyTest.h
@@ -13,6 +13,7 @@
 #include "MantidAlgorithms/SampleCorrections/RectangularBeamProfile.h"
 #include "MantidGeometry/Instrument/ReferenceFrame.h"
 #include "MantidGeometry/Objects/BoundingBox.h"
+#include "MantidKernel/Logger.h"
 #include "MantidKernel/WarningSuppressions.h"
 #include "MonteCarloTesting.h"
 
@@ -42,7 +43,7 @@ public:
         .WillOnce(Return(testSampleSphere.getShape().getBoundingBox()));
     const size_t nevents(10), maxTries(100);
     MCAbsorptionStrategy mcabsorb(testBeamProfile, testSampleSphere, nevents,
-                                  maxTries);
+                                  maxTries, g_log);
     // 3 random numbers per event expected
     MockRNG rng;
     EXPECT_CALL(rng, nextValue())
@@ -57,9 +58,8 @@ public:
     const double lambdaBefore(2.5), lambdaAfter(3.5);
 
     double factor(0.0), error(0.0);
-    std::string debugString;
     std::tie(factor, error) =
-        mcabsorb.calculate(rng, endPos, lambdaBefore, lambdaAfter, debugString);
+        mcabsorb.calculate(rng, endPos, lambdaBefore, lambdaAfter);
     TS_ASSERT_DELTA(0.0043828472, factor, 1e-08);
     TS_ASSERT_DELTA(1.0 / std::sqrt(nevents), error, 1e-08);
   }
@@ -81,15 +81,13 @@ public:
         ReferenceFrame(Y, Z, Right, "source"), V3D(), 1, 1);
     const size_t nevents(10), maxTries(1);
     MCAbsorptionStrategy mcabs(testBeamProfile, testThinAnnulus, nevents,
-                               maxTries);
+                               maxTries, g_log);
     MockRNG rng;
     EXPECT_CALL(rng, nextValue()).WillRepeatedly(Return(0.5));
     const double lambdaBefore(2.5), lambdaAfter(3.5);
     const V3D endPos(0.7, 0.7, 1.4);
-    std::string debugString;
-    TS_ASSERT_THROWS(
-        mcabs.calculate(rng, endPos, lambdaBefore, lambdaAfter, debugString),
-        const std::runtime_error &)
+    TS_ASSERT_THROWS(mcabs.calculate(rng, endPos, lambdaBefore, lambdaAfter),
+                     const std::runtime_error &)
   }
 
 private:
@@ -106,6 +104,7 @@ private:
                                                const Mantid::API::Sample &));
     GNU_DIAG_ON_SUGGEST_OVERRIDE
   };
+  Mantid::Kernel::Logger g_log{"MCAbsorptionStrategyTest"};
 };
 
 #endif /* MANTID_ALGORITHMS_MCABSORPTIONSTRATEGYTEST_H_ */
diff --git a/Framework/Algorithms/test/MCInteractionVolumeTest.h b/Framework/Algorithms/test/MCInteractionVolumeTest.h
index 5e0c057231c..0e652195fb2 100644
--- a/Framework/Algorithms/test/MCInteractionVolumeTest.h
+++ b/Framework/Algorithms/test/MCInteractionVolumeTest.h
@@ -10,6 +10,7 @@
 #include <cxxtest/TestSuite.h>
 
 #include "MantidAlgorithms/SampleCorrections/MCInteractionVolume.h"
+#include "MantidKernel/Logger.h"
 #include "MantidKernel/MersenneTwister.h"
 #include "MonteCarloTesting.h"
 
@@ -35,7 +36,7 @@ public:
   void test_Bounding_Volume_Matches_Sample() {
     auto sample = createTestSample(TestSampleType::SolidSphere);
     const auto sampleBox = sample.getShape().getBoundingBox();
-    MCInteractionVolume interactor(sample, sampleBox);
+    MCInteractionVolume interactor(sample, sampleBox, g_log);
 
     const auto interactionBox = interactor.getBoundingBox();
     TS_ASSERT_EQUALS(sampleBox.minPoint(), interactionBox.minPoint());
@@ -54,7 +55,8 @@ public:
         .WillRepeatedly(Return(0.25));
 
     auto sample = createTestSample(TestSampleType::SolidSphere);
-    MCInteractionVolume interactor(sample, sample.getShape().getBoundingBox());
+    MCInteractionVolume interactor(sample, sample.getShape().getBoundingBox(),
+                                   g_log);
     const double factor = interactor.calculateAbsorption(
         rng, startPos, endPos, lambdaBefore, lambdaAfter);
     TS_ASSERT_DELTA(0.0028357258, factor, 1e-8);
@@ -74,7 +76,8 @@ public:
         .Times(Exactly(3))
         .WillRepeatedly(Return(0.25));
 
-    MCInteractionVolume interactor(sample, sample.getShape().getBoundingBox());
+    MCInteractionVolume interactor(sample, sample.getShape().getBoundingBox(),
+                                   g_log);
     const double factorSeg1 = interactor.calculateAbsorption(
         rng, startPos, endPos, lambdaBefore, lambdaAfter);
     TS_ASSERT_DELTA(0.030489479, factorSeg1, 1e-8);
@@ -110,8 +113,8 @@ public:
         .WillOnce(Return(0.5))  // r2
         .WillOnce(Return(0.5)); // r3
 
-    MCInteractionVolume interactor(sample,
-                                   sample.getEnvironment().boundingBox());
+    MCInteractionVolume interactor(
+        sample, sample.getEnvironment().boundingBox(), g_log);
     const double factorContainer = interactor.calculateAbsorption(
         rng, startPos, endPos, lambdaBefore, lambdaAfter);
     TS_ASSERT_DELTA(0.69223681, factorContainer, 1e-8);
@@ -136,13 +139,13 @@ public:
   void test_Construction_With_Invalid_Sample_Shape_Throws_Error() {
     Mantid::API::Sample sample;
     // nothing
-    TS_ASSERT_THROWS(
-        MCInteractionVolume mcv(sample, sample.getShape().getBoundingBox()),
-        const std::invalid_argument &);
+    TS_ASSERT_THROWS(MCInteractionVolume mcv(
+                         sample, sample.getShape().getBoundingBox(), g_log),
+                     const std::invalid_argument &);
     // valid shape
     sample.setShape(ComponentCreationHelper::createSphere(1));
-    TS_ASSERT_THROWS_NOTHING(
-        MCInteractionVolume mcv(sample, sample.getShape().getBoundingBox()));
+    TS_ASSERT_THROWS_NOTHING(MCInteractionVolume mcv(
+        sample, sample.getShape().getBoundingBox(), g_log));
   }
 
   void test_Throws_If_Point_Cannot_Be_Generated() {
@@ -155,8 +158,9 @@ public:
     MersenneTwister rng;
     rng.setSeed(1);
     const size_t maxTries(1);
+    Mantid::Kernel::Logger g_log("MCInteractionVolumeTest");
     MCInteractionVolume interactor(sample, sample.getShape().getBoundingBox(),
-                                   maxTries);
+                                   g_log, maxTries);
     TS_ASSERT_THROWS(interactor.calculateAbsorption(rng, startPos, endPos,
                                                     lambdaBefore, lambdaAfter),
                      const std::runtime_error &);
@@ -172,8 +176,9 @@ public:
     sample.setEnvironment(
         std::make_unique<Mantid::Geometry::SampleEnvironment>(*kit));
 
+    Mantid::Kernel::Logger g_log("MCInteractionVolumeTest");
     MCInteractionVolume interactor(
-        sample, kit->getComponent(0).getBoundingBox(), maxAttempts);
+        sample, kit->getComponent(0).getBoundingBox(), g_log, maxAttempts);
 
     // Generate "random" sequence
     MockRNG rng;
@@ -191,7 +196,7 @@ public:
 
     // Selects second component
     MCInteractionVolume interactor2(
-        sample, kit->getComponent(1).getBoundingBox(), maxAttempts);
+        sample, kit->getComponent(1).getBoundingBox(), g_log, maxAttempts);
 
     EXPECT_CALL(rng, nextInt(_, _)).Times(Exactly(1)).WillOnce(Return(2));
     EXPECT_CALL(rng, nextValue())
@@ -207,7 +212,7 @@ public:
 
     // Selects third component
     MCInteractionVolume interactor3(
-        sample, kit->getComponent(2).getBoundingBox(), maxAttempts);
+        sample, kit->getComponent(2).getBoundingBox(), g_log, maxAttempts);
     EXPECT_CALL(rng, nextInt(_, _)).Times(Exactly(1)).WillOnce(Return(3));
     EXPECT_CALL(rng, nextValue())
         .Times(3)
@@ -240,11 +245,14 @@ public:
         std::make_unique<Mantid::Geometry::SampleEnvironment>(*kit));
 
     MCInteractionVolume interactor(sample, kit->getContainer().getBoundingBox(),
-                                   maxAttempts);
+                                   g_log, maxAttempts);
     // Restrict region to can
     TS_ASSERT_THROWS(interactor.generatePoint(rng), const std::runtime_error &);
     Mock::VerifyAndClearExpectations(&rng);
   }
+
+private:
+  Mantid::Kernel::Logger g_log{"MCInteractionVolumeTest"};
 };
 
 #endif /* MANTID_ALGORITHMS_MCINTERACTIONVOLUMETEST_H_ */
-- 
GitLab