From afb3998921a19b6f0a00dfbcb242777a3a424f83 Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Fri, 10 Apr 2020 18:08:35 +0200
Subject: [PATCH] More accurate pixel construction. References in hash
 function.

---
 Core/Instrument/RectangularDetector.cpp |  6 +++---
 Core/Instrument/RectangularDetector.h   |  1 -
 Core/Instrument/SphericalDetector.cpp   | 10 ++++------
 Core/Instrument/SphericalDetector.h     |  3 +--
 Core/Multilayer/ScalarFresnelMap.cpp    |  2 +-
 Core/Multilayer/ScalarFresnelMap.h      |  2 +-
 6 files changed, 10 insertions(+), 14 deletions(-)

diff --git a/Core/Instrument/RectangularDetector.cpp b/Core/Instrument/RectangularDetector.cpp
index 0fd3d7db908..8206694d01a 100644
--- a/Core/Instrument/RectangularDetector.cpp
+++ b/Core/Instrument/RectangularDetector.cpp
@@ -304,10 +304,11 @@ void RectangularDetector::initUandV(double alpha_i)
 }
 
 RectangularPixel::RectangularPixel(kvector_t corner_pos, kvector_t width, kvector_t height)
-    : m_corner_pos(corner_pos), m_width(width), m_height(height)
+    : m_corner_pos(std::move(corner_pos)), m_width(std::move(width)), m_height(std::move(height))
 {
     m_normal = m_width.cross(m_height);
-    m_solid_angle = calculateSolidAngle();
+    auto solid_angle_value = calculateSolidAngle();
+    m_solid_angle = solid_angle_value <= 0.0 ? 1.0 : solid_angle_value;
 }
 
 RectangularPixel* RectangularPixel::clone() const
@@ -344,7 +345,6 @@ double RectangularPixel::getIntegrationFactor(double x, double y) const
 
 double RectangularPixel::getSolidAngle() const
 {
-    if (m_solid_angle<=0.0) return 1.0;
     return m_solid_angle;
 }
 
diff --git a/Core/Instrument/RectangularDetector.h b/Core/Instrument/RectangularDetector.h
index 5d837771077..2d2b8d02c3f 100644
--- a/Core/Instrument/RectangularDetector.h
+++ b/Core/Instrument/RectangularDetector.h
@@ -111,7 +111,6 @@ class RectangularPixel : public IPixel
 {
 public:
     RectangularPixel(kvector_t corner_pos, kvector_t width, kvector_t height);
-    virtual ~RectangularPixel() {}
 
     RectangularPixel* clone() const override;
     RectangularPixel* createZeroSizePixel(double x, double y) const override;
diff --git a/Core/Instrument/SphericalDetector.cpp b/Core/Instrument/SphericalDetector.cpp
index 609a7849a39..8a296640724 100644
--- a/Core/Instrument/SphericalDetector.cpp
+++ b/Core/Instrument/SphericalDetector.cpp
@@ -86,18 +86,17 @@ size_t SphericalDetector::getIndexOfSpecular(const Beam& beam) const
     return totalSize();
 }
 
-SphericalPixel::SphericalPixel(Bin1D alpha_bin, Bin1D phi_bin)
+SphericalPixel::SphericalPixel(const Bin1D& alpha_bin, const Bin1D& phi_bin)
     : m_alpha(alpha_bin.m_lower), m_phi(phi_bin.m_lower),
       m_dalpha(alpha_bin.getBinSize()), m_dphi(phi_bin.getBinSize())
 {
-    m_solid_angle = std::abs(m_dphi*(std::sin(m_alpha+m_dalpha) - std::sin(m_alpha)));
+    auto solid_angle_value = std::abs(m_dphi*(std::sin(m_alpha+m_dalpha) - std::sin(m_alpha)));
+    m_solid_angle = solid_angle_value <= 0.0 ? 1.0 : solid_angle_value;
 }
 
 SphericalPixel* SphericalPixel::clone() const
 {
-    Bin1D alpha_bin(m_alpha, m_alpha+m_dalpha);
-    Bin1D phi_bin(m_phi, m_phi+m_dphi);
-    return new SphericalPixel(alpha_bin, phi_bin);
+    return new SphericalPixel(*this);
 }
 
 SphericalPixel* SphericalPixel::createZeroSizePixel(double x, double y) const
@@ -125,6 +124,5 @@ double SphericalPixel::getIntegrationFactor(double /* x */, double y) const
 
 double SphericalPixel::getSolidAngle() const
 {
-    if (m_solid_angle<=0.0) return 1.0;
     return m_solid_angle;
 }
diff --git a/Core/Instrument/SphericalDetector.h b/Core/Instrument/SphericalDetector.h
index 95168d0aebe..6ed099dcd5b 100644
--- a/Core/Instrument/SphericalDetector.h
+++ b/Core/Instrument/SphericalDetector.h
@@ -64,8 +64,7 @@ protected:
 class SphericalPixel : public IPixel
 {
 public:
-    SphericalPixel(Bin1D alpha_bin, Bin1D phi_bin);
-    virtual ~SphericalPixel() {}
+    SphericalPixel(const Bin1D& alpha_bin, const Bin1D& phi_bin);
 
     SphericalPixel* clone() const override;
     SphericalPixel* createZeroSizePixel(double x, double y) const override;
diff --git a/Core/Multilayer/ScalarFresnelMap.cpp b/Core/Multilayer/ScalarFresnelMap.cpp
index caae9d069dd..fa7aa7df5d9 100644
--- a/Core/Multilayer/ScalarFresnelMap.cpp
+++ b/Core/Multilayer/ScalarFresnelMap.cpp
@@ -27,7 +27,7 @@ ScalarFresnelMap::ScalarFresnelMap(std::unique_ptr<ISpecularStrategy> strategy)
 ScalarFresnelMap::~ScalarFresnelMap() = default;
 
 //! Returns hash value of a pair of doubles, computed by exclusive-or of the component hash values.
-size_t ScalarFresnelMap::Hash2Doubles::operator()(std::pair<double, double> doubles) const noexcept
+size_t ScalarFresnelMap::Hash2Doubles::operator()(const std::pair<double, double>& doubles) const noexcept
 {
     return std::hash<double>{}(doubles.first) ^ std::hash<double>{}(doubles.second);
 }
diff --git a/Core/Multilayer/ScalarFresnelMap.h b/Core/Multilayer/ScalarFresnelMap.h
index 68d19d5b117..f1e582396b1 100644
--- a/Core/Multilayer/ScalarFresnelMap.h
+++ b/Core/Multilayer/ScalarFresnelMap.h
@@ -47,7 +47,7 @@ private:
     class Hash2Doubles
     {
     public:
-        size_t operator()(std::pair<double, double> doubles) const noexcept;
+        size_t operator()(const std::pair<double, double>& doubles) const noexcept;
     };
 
     std::unique_ptr<const ILayerRTCoefficients> getCoefficients(const kvector_t& kvec,
-- 
GitLab