From 62f356598da8985361d62d2e3a1c4fad6a1fd0ec Mon Sep 17 00:00:00 2001
From: Dmitry Yurov <d.yurov@fz-juelich.de>
Date: Tue, 21 Nov 2017 15:40:27 +0100
Subject: [PATCH] Enabled IDetector in SimulationArea

Redmine: #1895
---
 Core/Instrument/IDetector2D.cpp    |  7 ++-----
 Core/Instrument/SimulationArea.cpp | 24 +++++++++++++-----------
 Core/Instrument/SimulationArea.h   | 11 ++++++-----
 3 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/Core/Instrument/IDetector2D.cpp b/Core/Instrument/IDetector2D.cpp
index 3f20aeac080..ce3f9b94fa7 100644
--- a/Core/Instrument/IDetector2D.cpp
+++ b/Core/Instrument/IDetector2D.cpp
@@ -147,13 +147,10 @@ SimulationElement IDetector2D::getSimulationElement(size_t index, const Beam &be
 size_t IDetector2D::numberOfSimulationElements() const
 {
     size_t result(0);
-    try {
+    if (this->dimension() != 0) {
         SimulationArea area(this);
-        for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it)
+        for (SimulationArea::iterator it = area.begin(); it != area.end(); ++it)
             ++result;
-    } catch (Exceptions::RuntimeErrorException e)
-    {
-        (void)e;  // do nothing, just return zero
     }
     return result;
 }
diff --git a/Core/Instrument/SimulationArea.cpp b/Core/Instrument/SimulationArea.cpp
index 8833ac3a3f0..3a62e449366 100644
--- a/Core/Instrument/SimulationArea.cpp
+++ b/Core/Instrument/SimulationArea.cpp
@@ -14,25 +14,26 @@
 // ************************************************************************** //
 
 #include "SimulationArea.h"
-#include "IDetector2D.h"
+#include "IDetector.h"
 #include "Exceptions.h"
+#include "DetectorMask.h"
 #include "Rectangle.h"
 #include "IntensityDataFunctions.h"
 #include "BornAgainNamespace.h"
 #include "RegionOfInterest.h"
 #include <sstream>
 
-SimulationArea::SimulationArea(const IDetector2D* detector)
+SimulationArea::SimulationArea(const IDetector* detector)
     : m_detector(detector)
     , m_max_index(0)
 {
-    if(m_detector==nullptr)
-        throw Exceptions::RuntimeErrorException("SimulationArea::SimulationArea: nullpointer passed"
-                                                " as detector");
+    if (m_detector == nullptr)
+        throw std::runtime_error("SimulationArea::SimulationArea: null pointer passed"
+                                 " as detector");
 
-    if (m_detector->dimension()!=2)
-        throw Exceptions::RuntimeErrorException(
-            "SimulationArea::SimulationArea: detector is not two-dimensional");
+    if (m_detector->dimension() == 0)
+        throw std::runtime_error(
+            "SimulationArea::SimulationArea: detector of unspecified dimensionality");
 
     if(m_detector->regionOfInterest())
         m_max_index = m_detector->regionOfInterest()->roiSize();
@@ -56,10 +57,11 @@ bool SimulationArea::isMasked(size_t index) const
         std::ostringstream message;
         message << "SimulationArea::isActive: index " << index << " is out of range, "
                 << "total size = " << totalSize();
-        throw Exceptions::RuntimeErrorException(message.str());
+        throw std::runtime_error(message.str());
     }
 
-    return m_detector->detectorMask()->isMasked(detectorIndex(index));
+    return (m_detector->detectorMask()
+            && m_detector->detectorMask()->isMasked(detectorIndex(index)));
 }
 
 size_t SimulationArea::roiIndex(size_t index) const
@@ -77,7 +79,7 @@ size_t SimulationArea::detectorIndex(size_t index) const
 
 // --------------------------------------------------------------------------------------
 
-SimulationRoiArea::SimulationRoiArea(const IDetector2D *detector)
+SimulationRoiArea::SimulationRoiArea(const IDetector *detector)
     : SimulationArea(detector)
 {}
 
diff --git a/Core/Instrument/SimulationArea.h b/Core/Instrument/SimulationArea.h
index 06dda609a64..c51909383f2 100644
--- a/Core/Instrument/SimulationArea.h
+++ b/Core/Instrument/SimulationArea.h
@@ -18,7 +18,8 @@
 
 #include "WinDllMacros.h"
 #include "SimulationAreaIterator.h"
-class IDetector2D;
+
+class IDetector;
 
 //! Holds iteration logic over active detector channels in the presence of masked areas
 //! and RegionOfInterest defined.
@@ -28,13 +29,13 @@ class BA_CORE_API_ SimulationArea
 {
 public:
     using iterator = SimulationAreaIterator;
-    explicit SimulationArea(const IDetector2D* detector);
+    explicit SimulationArea(const IDetector* detector);
     virtual ~SimulationArea() {}
 
     SimulationAreaIterator begin();
     SimulationAreaIterator end();
 
-    //! returns trus if given iterator index correspond to masked detector channel
+    //! returns true if given iterator index correspond to masked detector channel
     virtual bool isMasked(size_t index) const;
 
     size_t totalSize() const;
@@ -46,7 +47,7 @@ public:
     size_t detectorIndex(size_t index) const;
 
 protected:
-    const IDetector2D* m_detector;
+    const IDetector* m_detector;
     size_t m_max_index;
 };
 
@@ -63,7 +64,7 @@ inline size_t SimulationArea::totalSize() const
 class BA_CORE_API_ SimulationRoiArea : public SimulationArea
 {
 public:
-    explicit SimulationRoiArea(const IDetector2D* detector);
+    explicit SimulationRoiArea(const IDetector* detector);
 
     virtual bool isMasked(size_t) const;
 
-- 
GitLab