diff --git a/Core/Instrument/RectangularDetector.cpp b/Core/Instrument/RectangularDetector.cpp index 9494d9ffc59fa2298e6bdd1f5c028def29332ca2..93e969f9d84b32e5377142264bd97d8184bac9ac 100644 --- a/Core/Instrument/RectangularDetector.cpp +++ b/Core/Instrument/RectangularDetector.cpp @@ -16,6 +16,7 @@ #include "Beam.h" #include "BornAgainNamespace.h" #include "IDetectorResolution.h" +#include "RegionOfInterest.h" #include "SimulationElement.h" #include "MathConstants.h" #include "Units.h" @@ -175,18 +176,29 @@ AxesUnits RectangularDetector::defaultAxesUnits() const return AxesUnits::MM; } -RectangularPixel* RectangularDetector::toSinglePixel() const +RectangularPixel* RectangularDetector::regionOfInterestPixel() const { const IAxis& u_axis = getAxis(BornAgain::X_AXIS_INDEX); const IAxis& v_axis = getAxis(BornAgain::Y_AXIS_INDEX); - double u_min = u_axis.getMin(); - double v_min = v_axis.getMin(); + double u_min, v_min, width, height; + auto p_roi = regionOfInterest(); + if (p_roi) { + u_min = p_roi->getXlow(); + v_min = p_roi->getYlow(); + width = p_roi->getXup() - p_roi->getXlow(); + height = p_roi->getYup() - p_roi->getYlow(); + } else { + u_min = u_axis.getMin(); + v_min = v_axis.getMin(); + width = getWidth(); + height = getHeight(); + } const kvector_t corner_position(m_normal_to_detector + (u_min - m_u0) * m_u_unit + (v_min - m_v0) * m_v_unit); - const kvector_t width = getWidth() * m_u_unit; - const kvector_t height = getHeight() * m_v_unit; - return new RectangularPixel(corner_position, width, height); + const kvector_t uaxis_vector = width * m_u_unit; + const kvector_t vaxis_vector = height * m_v_unit; + return new RectangularPixel(corner_position, uaxis_vector, vaxis_vector); } IPixel* RectangularDetector::createPixel(size_t index) const diff --git a/Core/Instrument/RectangularDetector.h b/Core/Instrument/RectangularDetector.h index ac1ea9b010bfa7f9c8f112d3a3b027a2e6be6f0b..0cf04e82878733fdaf49b6e61aed3c244d2d4b2c 100644 --- a/Core/Instrument/RectangularDetector.h +++ b/Core/Instrument/RectangularDetector.h @@ -79,7 +79,7 @@ public: //! return default axes units AxesUnits defaultAxesUnits() const override; - RectangularPixel* toSinglePixel() const; + RectangularPixel* regionOfInterestPixel() const; protected: //! Create an IPixel for the given OutputData object and index diff --git a/Core/Instrument/UnitConverters.cpp b/Core/Instrument/UnitConverters.cpp index b006ce10c6b4776f3609da750c188ae11357552e..40d6a34e1b07d2d4e67564276653ab10eca5a76c 100644 --- a/Core/Instrument/UnitConverters.cpp +++ b/Core/Instrument/UnitConverters.cpp @@ -17,6 +17,7 @@ #include "BornAgainNamespace.h" #include "MathConstants.h" #include "RectangularDetector.h" +#include "RegionOfInterest.h" #include "SphericalDetector.h" #include "Units.h" @@ -86,7 +87,14 @@ UnitConverterSimple::UnitConverterSimple(const UnitConverterSimple& other) void UnitConverterSimple::addDetectorAxis(const IDetector& detector, size_t i_axis) { auto& axis = detector.getAxis(i_axis); - addAxisData(axis.getName(), axis.getMin(), axis.getMax(), defaultUnits(), axis.size()); + auto p_roi = detector.regionOfInterest(); + if (p_roi) { + auto P_roi_axis = p_roi->clipAxisToRoi(i_axis, axis); + addAxisData(axis.getName(), P_roi_axis->getMin(), P_roi_axis->getMax(), defaultUnits(), + P_roi_axis->size()); + } else { + addAxisData(axis.getName(), axis.getMin(), axis.getMax(), defaultUnits(), axis.size()); + } } void UnitConverterSimple::checkIndex(size_t i_axis) const @@ -160,7 +168,7 @@ RectangularConverter::RectangularConverter(const RectangularDetector& detector, + std::to_string(static_cast<int>(detector.dimension()))); addDetectorAxis(detector, 0); addDetectorAxis(detector, 1); - mP_detector_pixel.reset(detector.toSinglePixel()); + mP_detector_pixel.reset(detector.regionOfInterestPixel()); } RectangularConverter::~RectangularConverter() =default; diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py index c26ff99222a7ebef6592cecc4f8ddcda7f714073..5e0407468649caebd51ec50f5e6a406b6c2caf35 100644 --- a/auto/Wrap/libBornAgainCore.py +++ b/auto/Wrap/libBornAgainCore.py @@ -26173,9 +26173,9 @@ class RectangularDetector(IDetector2D): return _libBornAgainCore.RectangularDetector_defaultAxesUnits(self) - def toSinglePixel(self): - """toSinglePixel(RectangularDetector self) -> RectangularPixel""" - return _libBornAgainCore.RectangularDetector_toSinglePixel(self) + def regionOfInterestPixel(self): + """regionOfInterestPixel(RectangularDetector self) -> RectangularPixel""" + return _libBornAgainCore.RectangularDetector_regionOfInterestPixel(self) RectangularDetector_swigregister = _libBornAgainCore.RectangularDetector_swigregister RectangularDetector_swigregister(RectangularDetector) diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp index 4fae02bd6af128d867a832e89d25d8f8985de843..4421b04a3cd5a01761d92538a8ebc254cf603567 100644 --- a/auto/Wrap/libBornAgainCore_wrap.cpp +++ b/auto/Wrap/libBornAgainCore_wrap.cpp @@ -109940,7 +109940,7 @@ fail: } -SWIGINTERN PyObject *_wrap_RectangularDetector_toSinglePixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_RectangularDetector_regionOfInterestPixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; RectangularDetector *arg1 = (RectangularDetector *) 0 ; void *argp1 = 0 ; @@ -109948,13 +109948,13 @@ SWIGINTERN PyObject *_wrap_RectangularDetector_toSinglePixel(PyObject *SWIGUNUSE PyObject * obj0 = 0 ; RectangularPixel *result = 0 ; - if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_toSinglePixel",&obj0)) SWIG_fail; + if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_regionOfInterestPixel",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 | 0 ); if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_toSinglePixel" "', argument " "1"" of type '" "RectangularDetector const *""'"); + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_regionOfInterestPixel" "', argument " "1"" of type '" "RectangularDetector const *""'"); } arg1 = reinterpret_cast< RectangularDetector * >(argp1); - result = (RectangularPixel *)((RectangularDetector const *)arg1)->toSinglePixel(); + result = (RectangularPixel *)((RectangularDetector const *)arg1)->regionOfInterestPixel(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectangularPixel, 0 | 0 ); return resultobj; fail: @@ -126470,7 +126470,7 @@ static PyMethodDef SwigMethods[] = { "return default axes units \n" "\n" ""}, - { (char *)"RectangularDetector_toSinglePixel", _wrap_RectangularDetector_toSinglePixel, METH_VARARGS, (char *)"RectangularDetector_toSinglePixel(RectangularDetector self) -> RectangularPixel"}, + { (char *)"RectangularDetector_regionOfInterestPixel", _wrap_RectangularDetector_regionOfInterestPixel, METH_VARARGS, (char *)"RectangularDetector_regionOfInterestPixel(RectangularDetector self) -> RectangularPixel"}, { (char *)"RectangularDetector_swigregister", RectangularDetector_swigregister, METH_VARARGS, NULL}, { (char *)"new_RectangularPixel", _wrap_new_RectangularPixel, METH_VARARGS, (char *)"\n" "new_RectangularPixel(kvector_t corner_pos, kvector_t width, kvector_t height) -> RectangularPixel\n"