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