diff --git a/Device/Detector/IDetector.cpp b/Device/Detector/IDetector.cpp index dd976601c1e690db8cb8110b39f031415de5d416..6bceef47dd6dfdff0ab0b924f6f189141848af0c 100644 --- a/Device/Detector/IDetector.cpp +++ b/Device/Detector/IDetector.cpp @@ -192,9 +192,10 @@ void IDetector::setDataToDetectorMap(OutputData<double>& detectorMap, { if (elements.empty()) return; - iterateOverNonMaskedPoints([&](const_iterator it) { - detectorMap[it.roiIndex()] = elements[it.elementIndex()].intensity(); - }); + + size_t elementIndex = 0; + for (auto it = beginNonMaskedPoints(); it != endNonMaskedPoints(); ++it) + detectorMap[it.roiIndex()] = elements[elementIndex++].intensity(); } size_t IDetector::numberOfSimulationElements() const diff --git a/Device/Detector/IDetector.h b/Device/Detector/IDetector.h index 3e14fd4a680751fc55997ffb337f6634ad39bff8..8218f47dc4f6d3f84e4a1f4b062eec6908a3d157 100644 --- a/Device/Detector/IDetector.h +++ b/Device/Detector/IDetector.h @@ -119,6 +119,7 @@ public: #ifndef SWIG //! Returns empty detector map in given axes units. + //! This map is a data array limited to the size of the "Region of interest" std::unique_ptr<OutputData<double>> createDetectorMap() const; #endif // USER_API diff --git a/Device/Detector/SimulationAreaIterator.cpp b/Device/Detector/SimulationAreaIterator.cpp index 339e6e4fcb15ba9f6ffcebb91c240bed4f4e23e9..1b7cdc361e2fb3cd8ff3ddb05990cbcb20746b79 100644 --- a/Device/Detector/SimulationAreaIterator.cpp +++ b/Device/Detector/SimulationAreaIterator.cpp @@ -19,7 +19,6 @@ SimulationAreaIterator::SimulationAreaIterator(const IDetector* detector, Mode m : m_detector(detector) , m_index(start_at_index) , m_maxIndex(m_detector->sizeOfRegionOfInterest()) - , m_element_index(0) , m_mode(mode) { if (m_index > m_maxIndex) @@ -58,10 +57,9 @@ size_t SimulationAreaIterator::detectorIndex() const SimulationAreaIterator& SimulationAreaIterator::operator++() { size_t index = nextIndex(m_index); - if (index != m_index) { - ++m_element_index; + if (index != m_index) m_index = index; - } + return *this; } @@ -77,7 +75,6 @@ size_t SimulationAreaIterator::nextIndex(size_t currentIndex) // #baROI + this can be optimized: Check whether a RegionOfInterest is present, then do not // check every single point - size_t result = ++currentIndex; if (result < m_maxIndex) { while (isMasked(result)) { diff --git a/Device/Detector/SimulationAreaIterator.h b/Device/Detector/SimulationAreaIterator.h index cb98af7871390a5d576c4ae67e99abfb555a739c..d938bbc31a69a2f59a5cebf440db101aa7fb611f 100644 --- a/Device/Detector/SimulationAreaIterator.h +++ b/Device/Detector/SimulationAreaIterator.h @@ -50,7 +50,6 @@ public: SimulationAreaIterator createEnd() const; size_t index() const { return m_index; } - size_t elementIndex() const { return m_element_index; } size_t roiIndex() const; size_t detectorIndex() const; @@ -71,9 +70,8 @@ private: bool isMasked(size_t index) const; const IDetector* m_detector; - size_t m_index; //!< ROI related index - size_t m_maxIndex; //!< ROI related maximum index - size_t m_element_index; //!< sequential number for SimulationElementVector + size_t m_index; //!< ROI related index + size_t m_maxIndex; //!< ROI related maximum index Mode m_mode; }; diff --git a/Tests/UnitTests/Core/Instrument/SimulationAreaTest.cpp b/Tests/UnitTests/Core/Instrument/SimulationAreaTest.cpp index 40506f399af4db6bfdfb411efb1c96f6cdc498c7..894ed78547e7270721dcec13cf89e3d1c614292d 100644 --- a/Tests/UnitTests/Core/Instrument/SimulationAreaTest.cpp +++ b/Tests/UnitTests/Core/Instrument/SimulationAreaTest.cpp @@ -17,14 +17,12 @@ TEST_F(SimulationAreaTest, iteratorOperations) // begin iterator SimulationAreaIterator it_begin = detector.beginNonMaskedPoints(); EXPECT_EQ(it_begin.index(), 0u); - EXPECT_EQ(it_begin.elementIndex(), 0u); EXPECT_TRUE(it_begin == detector.beginNonMaskedPoints()); EXPECT_FALSE(it_begin != detector.beginNonMaskedPoints()); // end iterator SimulationAreaIterator it_end = detector.endNonMaskedPoints(); EXPECT_EQ(it_end.index(), detector.totalSize()); - EXPECT_EQ(it_end.elementIndex(), 0u); // has initial value // begin/end comparison EXPECT_TRUE(it_begin != it_end); @@ -38,18 +36,15 @@ TEST_F(SimulationAreaTest, iteratorOperations) // increment it++; EXPECT_EQ(it.index(), 1u); - EXPECT_EQ(it.elementIndex(), 1u); EXPECT_TRUE(it != it_begin); EXPECT_FALSE(it == it_begin); ++it; EXPECT_EQ(it.index(), 2u); - EXPECT_EQ(it.elementIndex(), 2u); // incrementing well behind the end for (size_t i = 0; i < 100; ++i) ++it; EXPECT_EQ(it.index(), detector.totalSize()); - EXPECT_EQ(it.elementIndex(), detector.totalSize()); } //! Iteration over non-masked detector @@ -59,18 +54,14 @@ TEST_F(SimulationAreaTest, detectorIteration) SphericalDetector detector(4, -1.0, 3.0, 2, 0.0, 2.0); std::vector<size_t> expectedIndexes = {0, 1, 2, 3, 4, 5, 6, 7}; - std::vector<size_t> expectedElementIndexes = {0, 1, 2, 3, 4, 5, 6, 7}; std::vector<size_t> indexes; - std::vector<size_t> elementIndexes; std::vector<size_t> detectorIndexes; for (auto it = detector.beginNonMaskedPoints(); it != detector.endNonMaskedPoints(); ++it) { indexes.push_back(it.index()); - elementIndexes.push_back(it.elementIndex()); detectorIndexes.push_back(it.detectorIndex()); } EXPECT_EQ(indexes, expectedIndexes); - EXPECT_EQ(elementIndexes, expectedElementIndexes); EXPECT_EQ(detectorIndexes, expectedIndexes); } @@ -83,15 +74,10 @@ TEST_F(SimulationAreaTest, maskedIteration) detector.addMask(Rectangle(3.1, 3.1, 3.9, 3.9), true); std::vector<size_t> expectedIndexes = {0, 1, 2, 3, 4, 7, 8, 11, 12, 15, 16, 17, 18}; - std::vector<size_t> expectedElementIndexes = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; std::vector<size_t> indexes; - std::vector<size_t> elementIndexes; - for (auto it = detector.beginNonMaskedPoints(); it != detector.endNonMaskedPoints(); ++it) { + for (auto it = detector.beginNonMaskedPoints(); it != detector.endNonMaskedPoints(); ++it) indexes.push_back(it.index()); - elementIndexes.push_back(it.elementIndex()); - } EXPECT_EQ(indexes, expectedIndexes); - EXPECT_EQ(elementIndexes, expectedElementIndexes); } //! Iteration over the detector with first and last bin masked @@ -104,16 +90,11 @@ TEST_F(SimulationAreaTest, maskedCornerIteration) std::vector<size_t> expectedIndexes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}; - std::vector<size_t> expectedElementIndexes = {0, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17}; std::vector<size_t> indexes; std::vector<size_t> elementIndexes; - for (auto it = detector.beginNonMaskedPoints(); it != detector.endNonMaskedPoints(); ++it) { + for (auto it = detector.beginNonMaskedPoints(); it != detector.endNonMaskedPoints(); ++it) indexes.push_back(it.index()); - elementIndexes.push_back(it.elementIndex()); - } EXPECT_EQ(indexes, expectedIndexes); - EXPECT_EQ(elementIndexes, expectedElementIndexes); } //! Iteration when whole detector is masked @@ -124,14 +105,11 @@ TEST_F(SimulationAreaTest, allMaskedIteration) detector.addMask(Rectangle(-0.9, 0.1, 3.9, 3.9), true); std::vector<size_t> indexes; - std::vector<size_t> elementIndexes; - for (auto it = detector.beginNonMaskedPoints(); it != detector.endNonMaskedPoints(); ++it) { + for (auto it = detector.beginNonMaskedPoints(); it != detector.endNonMaskedPoints(); ++it) indexes.push_back(it.index()); - elementIndexes.push_back(it.elementIndex()); - } + EXPECT_EQ(indexes.size(), size_t(0)); - EXPECT_EQ(elementIndexes.size(), size_t(0)); } //! Iteration when RegionOfInterest and masks are present @@ -144,35 +122,29 @@ TEST_F(SimulationAreaTest, maskAndRoiIteration) std::vector<size_t> expectedRoiIndexes = {1, 2, 3, 4, 5, 6, 7, 8}; std::vector<size_t> expectedDetectorIndexes = {6, 7, 9, 10, 11, 13, 14, 15}; - std::vector<size_t> expectedElementIndexes = {0, 1, 2, 3, 4, 5, 6, 7}; std::vector<size_t> indexes; std::vector<size_t> elementIndexes; std::vector<size_t> detectorIndexes; std::vector<size_t> roiIndexes; for (auto it = detector.beginNonMaskedPoints(); it != detector.endNonMaskedPoints(); ++it) { indexes.push_back(it.index()); - elementIndexes.push_back(it.elementIndex()); detectorIndexes.push_back(it.detectorIndex()); roiIndexes.push_back(it.roiIndex()); } EXPECT_EQ(indexes, expectedRoiIndexes); - EXPECT_EQ(elementIndexes, expectedElementIndexes); EXPECT_EQ(detectorIndexes, expectedDetectorIndexes); EXPECT_EQ(roiIndexes, expectedRoiIndexes); // Now same as above, but using IDetector::iterate indexes.clear(); - elementIndexes.clear(); detectorIndexes.clear(); roiIndexes.clear(); detector.iterateOverNonMaskedPoints([&](IDetector::const_iterator it) { indexes.push_back(it.index()); - elementIndexes.push_back(it.elementIndex()); detectorIndexes.push_back(it.detectorIndex()); roiIndexes.push_back(it.roiIndex()); }); EXPECT_EQ(indexes, expectedRoiIndexes); - EXPECT_EQ(elementIndexes, expectedElementIndexes); EXPECT_EQ(detectorIndexes, expectedDetectorIndexes); EXPECT_EQ(roiIndexes, expectedRoiIndexes); } @@ -187,36 +159,29 @@ TEST_F(SimulationAreaTest, maskAndRoiIterationVisitMasks) std::vector<size_t> expectedRoiIndexes = {0, 1, 2, 3, 4, 5, 6, 7, 8}; std::vector<size_t> expectedDetectorIndexes = {5, 6, 7, 9, 10, 11, 13, 14, 15}; - std::vector<size_t> expectedElementIndexes = {0, 1, 2, 3, 4, 5, 6, 7, 8}; std::vector<size_t> indexes; - std::vector<size_t> elementIndexes; std::vector<size_t> detectorIndexes; std::vector<size_t> roiIndexes; for (auto it = detector.beginRegionOfInterestPoints(); it != detector.endRegionOfInterestPoints(); ++it) { indexes.push_back(it.index()); - elementIndexes.push_back(it.elementIndex()); detectorIndexes.push_back(it.detectorIndex()); roiIndexes.push_back(it.roiIndex()); } EXPECT_EQ(indexes, expectedRoiIndexes); - EXPECT_EQ(elementIndexes, expectedElementIndexes); EXPECT_EQ(detectorIndexes, expectedDetectorIndexes); EXPECT_EQ(roiIndexes, expectedRoiIndexes); // Now same as above, but using IDetector::iterate indexes.clear(); - elementIndexes.clear(); detectorIndexes.clear(); roiIndexes.clear(); detector.iterateOverRegionOfInterest([&](IDetector::const_iterator it) { indexes.push_back(it.index()); - elementIndexes.push_back(it.elementIndex()); detectorIndexes.push_back(it.detectorIndex()); roiIndexes.push_back(it.roiIndex()); }); EXPECT_EQ(indexes, expectedRoiIndexes); - EXPECT_EQ(elementIndexes, expectedElementIndexes); EXPECT_EQ(detectorIndexes, expectedDetectorIndexes); EXPECT_EQ(roiIndexes, expectedRoiIndexes); } @@ -231,20 +196,16 @@ TEST_F(SimulationAreaTest, indexInRoi) std::vector<size_t> expectedIndexes = {1, 2, 3, 4, 5, 6, 7, 8}; std::vector<size_t> expectedDetectorIndexes = {6, 7, 9, 10, 11, 13, 14, 15}; - std::vector<size_t> expectedElementIndexes = {0, 1, 2, 3, 4, 5, 6, 7}; std::vector<size_t> expectedRoi = {1, 2, 3, 4, 5, 6, 7, 8}; std::vector<size_t> indexes; - std::vector<size_t> elementIndexes; std::vector<size_t> roiIndexes; std::vector<size_t> detectorIndexes; for (auto it = detector.beginNonMaskedPoints(); it != detector.endNonMaskedPoints(); ++it) { indexes.push_back(it.index()); - elementIndexes.push_back(it.elementIndex()); roiIndexes.push_back(it.roiIndex()); detectorIndexes.push_back(it.detectorIndex()); } EXPECT_EQ(indexes, expectedIndexes); - EXPECT_EQ(elementIndexes, expectedElementIndexes); EXPECT_EQ(roiIndexes, expectedRoi); EXPECT_EQ(detectorIndexes, expectedDetectorIndexes); } diff --git a/Tests/UnitTests/Core/Instrument/SpecularDetector1DTest.cpp b/Tests/UnitTests/Core/Instrument/SpecularDetector1DTest.cpp index 907f93090aee6d935db39289422291ab72420858..76d5289a97e3693ff0be611a5b2a4bd97635a01c 100644 --- a/Tests/UnitTests/Core/Instrument/SpecularDetector1DTest.cpp +++ b/Tests/UnitTests/Core/Instrument/SpecularDetector1DTest.cpp @@ -62,15 +62,10 @@ TEST_F(SpecularDetectorTest, Clone) // checking iteration over the map of cloned detector const std::vector<size_t> expectedDetectorIndexes = {0, 1, 2, 3, 4}; - const std::vector<size_t> expectedElementIndexes = expectedDetectorIndexes; std::vector<size_t> detectorIndexes; - std::vector<size_t> elementIndexes; - for (auto it = clone->beginNonMaskedPoints(); it != clone->endNonMaskedPoints(); ++it) { + for (auto it = clone->beginNonMaskedPoints(); it != clone->endNonMaskedPoints(); ++it) detectorIndexes.push_back(it.detectorIndex()); - elementIndexes.push_back(it.elementIndex()); - } EXPECT_EQ(detectorIndexes, expectedDetectorIndexes); - EXPECT_EQ(elementIndexes, expectedElementIndexes); EXPECT_EQ(clone->detectionProperties().analyzerDirection(), analyzer); EXPECT_EQ(clone->detectionProperties().analyzerEfficiency(), 0.33); diff --git a/Tests/UnitTests/Core/Instrument/SphericalDetectorTest.cpp b/Tests/UnitTests/Core/Instrument/SphericalDetectorTest.cpp index 76a81cef8f240abcf342ffa44a7a7be358d6463f..198c68aec9d5710a8197735792e8a8e7ad7b569e 100644 --- a/Tests/UnitTests/Core/Instrument/SphericalDetectorTest.cpp +++ b/Tests/UnitTests/Core/Instrument/SphericalDetectorTest.cpp @@ -205,15 +205,10 @@ TEST_F(SphericalDetectorTest, Clone) // checking iteration over the map of cloned detector std::vector<size_t> expectedDetectorIndexes = {6, 9, 10, 13, 14, 17}; - std::vector<size_t> expectedElementIndexes = {0, 1, 2, 3, 4, 5}; std::vector<size_t> detectorIndexes; - std::vector<size_t> elementIndexes; - for (auto it = clone->beginNonMaskedPoints(); it != clone->endNonMaskedPoints(); ++it) { + for (auto it = clone->beginNonMaskedPoints(); it != clone->endNonMaskedPoints(); ++it) detectorIndexes.push_back(it.detectorIndex()); - elementIndexes.push_back(it.elementIndex()); - } EXPECT_EQ(detectorIndexes, expectedDetectorIndexes); - EXPECT_EQ(elementIndexes, expectedElementIndexes); } // Test retrieval of analyzer properties