diff --git a/GUI/coregui/Models/BeamItems.cpp b/GUI/coregui/Models/BeamItems.cpp index 4427715e7135906be30fcf0f271a54f616e4b2a5..fd3aab175c902407a2e0d94f16ad6b91de1d1e42 100644 --- a/GUI/coregui/Models/BeamItems.cpp +++ b/GUI/coregui/Models/BeamItems.cpp @@ -13,6 +13,7 @@ // ************************************************************************** // #include "BeamItems.h" +#include "AxesItems.h" #include "Beam.h" #include "BeamAngleItems.h" #include "BeamDistributionItem.h" @@ -22,6 +23,7 @@ #include "GUIHelpers.h" #include "ParameterTranslators.h" #include "SessionItemUtils.h" +#include "SpecularBeamInclinationItem.h" #include "Units.h" using SessionItemUtils::GetVectorItem; @@ -151,6 +153,12 @@ void SpecularBeamItem::setInclinationAngle(double value) BeamItem::setInclinationAngle(value); } +BasicAxisItem& SpecularBeamItem::getInclinationAngleAxis() +{ + return getItem(BeamItem::P_INCLINATION_ANGLE) + ->item<BasicAxisItem>(SpecularBeamInclinationItem::P_ALPHA_AXIS); +} + FootprintItem* SpecularBeamItem::currentFootprintItem() const { return &groupItem<FootprintItem>(P_FOOPTPRINT); diff --git a/GUI/coregui/Models/BeamItems.h b/GUI/coregui/Models/BeamItems.h index 3a7a7305a56e3dfdec4d9299e9ca7b2b33cb32bd..f527045743eb6e3cd3fe47357e2b1a79b6a648c7 100644 --- a/GUI/coregui/Models/BeamItems.h +++ b/GUI/coregui/Models/BeamItems.h @@ -17,6 +17,7 @@ #include "SessionItem.h" +class BasicAxisItem; class Beam; class FootprintItem; @@ -62,6 +63,7 @@ public: double getInclinationAngle() const override; void setInclinationAngle(double value) override; + BasicAxisItem& getInclinationAngleAxis(); FootprintItem* currentFootprintItem() const; }; diff --git a/GUI/coregui/Models/DataItem.h b/GUI/coregui/Models/DataItem.h index 8bd0680a76f074bb4ca100f33190f50665673a6e..2ba274af3134ab84e65dce72d6942b63f156d01f 100644 --- a/GUI/coregui/Models/DataItem.h +++ b/GUI/coregui/Models/DataItem.h @@ -45,6 +45,7 @@ public: virtual void setYaxisTitle(QString ytitle) = 0; virtual void setAxesRangeToData() = 0; virtual void updateAxesUnits(const InstrumentItem* instrument) = 0; + virtual std::vector<int> shape() const = 0; //! Returns data to default state (no dimensional units, default axes' names) virtual void resetToDefault() = 0; diff --git a/GUI/coregui/Models/DetectorItems.h b/GUI/coregui/Models/DetectorItems.h index e10858df1471d4f275dea24ec4d34f6cd0573a0a..3a11d88c5e085979b39dc2a8f086284c2968e03b 100644 --- a/GUI/coregui/Models/DetectorItems.h +++ b/GUI/coregui/Models/DetectorItems.h @@ -34,7 +34,18 @@ public: std::unique_ptr<IDetector2D> createDetector() const; + // TODO: consider using index-based access functions + + //! returns the size of x-axis of the detector + virtual int xSize() const = 0; + + //! returns the size of y-axis of the detector + virtual int ySize() const = 0; + + //! sets the size of x-axis of the detector virtual void setXSize(int nx) = 0; + + //! sets the size of y-axis of the detector virtual void setYSize(int ny) = 0; void clearMasks(); diff --git a/GUI/coregui/Models/InstrumentItems.cpp b/GUI/coregui/Models/InstrumentItems.cpp index f012f48d345ae09a4e3e78ba445cad4d5189ac7f..a2e85f5d968507fef17cf674561739e0b0985d07 100644 --- a/GUI/coregui/Models/InstrumentItems.cpp +++ b/GUI/coregui/Models/InstrumentItems.cpp @@ -114,6 +114,12 @@ std::unique_ptr<Instrument> SpecularInstrumentItem::createInstrument() const return InstrumentItem::createInstrument(); } +std::vector<int> SpecularInstrumentItem::shape() const +{ + const auto& axis_item = beamItem()->getInclinationAngleAxis(); + return {axis_item.getItemValue(BasicAxisItem::P_NBINS).toInt()}; +} + const QString Instrument2DItem::P_DETECTOR = "Detector"; Instrument2DItem::Instrument2DItem(const QString& modelType) @@ -167,6 +173,12 @@ GISASInstrumentItem::GISASInstrumentItem() { } +std::vector<int> GISASInstrumentItem::shape() const +{ + auto detector_item = detectorItem(); + return {detector_item->xSize(), detector_item->ySize()}; +} + const QString OffSpecInstrumentItem::P_ALPHA_AXIS = "Alpha axis"; OffSpecInstrumentItem::OffSpecInstrumentItem() @@ -175,6 +187,13 @@ OffSpecInstrumentItem::OffSpecInstrumentItem() addAxisGroupProperty(this, P_ALPHA_AXIS); } +std::vector<int> OffSpecInstrumentItem::shape() const +{ + const int x_size = getItem(P_ALPHA_AXIS)->getItemValue(BasicAxisItem::P_NBINS).toInt(); + auto detector_item = detectorItem(); + return {x_size, detector_item->ySize()}; +} + namespace { void addAxisGroupProperty(SessionItem* parent, const QString& tag) diff --git a/GUI/coregui/Models/InstrumentItems.h b/GUI/coregui/Models/InstrumentItems.h index f0dc2c31eb544b60df7445cad16be45df151b887..18a8cea6fc1f4c53bb00c53f649e543722804d47 100644 --- a/GUI/coregui/Models/InstrumentItems.h +++ b/GUI/coregui/Models/InstrumentItems.h @@ -37,6 +37,7 @@ public: GroupItem* backgroundGroup(); virtual std::unique_ptr<Instrument> createInstrument() const = 0; + virtual std::vector<int> shape() const = 0; protected: explicit InstrumentItem(const QString& modelType); @@ -53,6 +54,7 @@ public: SpecularBeamItem* beamItem() const override; std::unique_ptr<Instrument> createInstrument() const override; + std::vector<int> shape() const override; }; class BA_CORE_API_ Instrument2DItem : public InstrumentItem @@ -81,6 +83,7 @@ class BA_CORE_API_ GISASInstrumentItem : public Instrument2DItem { public: GISASInstrumentItem(); + std::vector<int> shape() const override; }; class BA_CORE_API_ OffSpecInstrumentItem : public Instrument2DItem @@ -89,6 +92,7 @@ public: static const QString P_ALPHA_AXIS; OffSpecInstrumentItem(); + std::vector<int> shape() const override; }; #endif // INSTRUMENTITEMS_H diff --git a/GUI/coregui/Models/IntensityDataItem.cpp b/GUI/coregui/Models/IntensityDataItem.cpp index fefede9d047d62536942903eaefc7aceddafdd25..031cc59d0f88360c6d249c7b6b95d4af8db35974 100644 --- a/GUI/coregui/Models/IntensityDataItem.cpp +++ b/GUI/coregui/Models/IntensityDataItem.cpp @@ -224,6 +224,11 @@ void IntensityDataItem::updateAxesUnits(const InstrumentItem* instrument) converter.convertFromNbins(this); } +std::vector<int> IntensityDataItem::shape() const +{ + return {getNbinsX(), getNbinsY()}; +} + void IntensityDataItem::resetToDefault() { assert(getOutputData() diff --git a/GUI/coregui/Models/IntensityDataItem.h b/GUI/coregui/Models/IntensityDataItem.h index e0cd3a11c03610cdec8f88286fce1ac0e73cb7f1..ba1bd55d246b9e227252c86c0ab16155bc998eca 100644 --- a/GUI/coregui/Models/IntensityDataItem.h +++ b/GUI/coregui/Models/IntensityDataItem.h @@ -39,6 +39,8 @@ public: void setOutputData(OutputData<double>* data) override; void setRawDataVector(const OutputData<double>* data) override; + // TODO: consider using index-based functions for axes' handlers + int getNbinsX() const; int getNbinsY() const; @@ -92,6 +94,7 @@ public: void setYaxisTitle(QString ytitle) override; void setAxesRangeToData() override; void updateAxesUnits(const InstrumentItem* instrument) override; + std::vector<int> shape() const override; //! Returns data to default state (no dimensional units, default axes' names) void resetToDefault() override; diff --git a/GUI/coregui/Models/RealDataItem.cpp b/GUI/coregui/Models/RealDataItem.cpp index 67d205a8ead9ab3e7252b51a7599190fbff4f9a0..65b90affc14be66ec59ce47d0dde5e8ed08e4569 100644 --- a/GUI/coregui/Models/RealDataItem.cpp +++ b/GUI/coregui/Models/RealDataItem.cpp @@ -107,6 +107,16 @@ void RealDataItem::linkToInstrument(const InstrumentItem *instrument, bool make_ updateToInstrument(); } +std::vector<int> RealDataItem::shape() const +{ + auto data_item = dataItem(); + if (!data_item) { + assert(data_item); + return {}; + } + return data_item->shape(); +} + //! Updates the name of file to store intensity data. void RealDataItem::updateIntensityDataFileName() diff --git a/GUI/coregui/Models/RealDataItem.h b/GUI/coregui/Models/RealDataItem.h index 5b90f196f13806e605ac6f3ae6b1b11ac140c23b..37df08ad6a2ce2811caa065ec7ca4f4e36955033 100644 --- a/GUI/coregui/Models/RealDataItem.h +++ b/GUI/coregui/Models/RealDataItem.h @@ -42,6 +42,9 @@ public: void linkToInstrument(const InstrumentItem* instrument, bool make_update = true); + //! Returns the shape of undelying data item + std::vector<int> shape() const; + private: void updateIntensityDataFileName(); void updateToInstrument(); diff --git a/GUI/coregui/Models/RectangularDetectorItem.cpp b/GUI/coregui/Models/RectangularDetectorItem.cpp index 98f4a615c0204781d2e261b9bb5c4019e8d17447..fa1f7c507a73aaad2517b01f1a8ef6011e902858 100644 --- a/GUI/coregui/Models/RectangularDetectorItem.cpp +++ b/GUI/coregui/Models/RectangularDetectorItem.cpp @@ -134,6 +134,16 @@ void RectangularDetectorItem::setDetectorAlignment(const QString& alignment) setItemValue(RectangularDetectorItem::P_ALIGNMENT, combo_property.variant()); } +int RectangularDetectorItem::xSize() const +{ + return getItem(RectangularDetectorItem::P_X_AXIS)->getItemValue(BasicAxisItem::P_NBINS).toInt(); +} + +int RectangularDetectorItem::ySize() const +{ + return getItem(RectangularDetectorItem::P_Y_AXIS)->getItemValue(BasicAxisItem::P_NBINS).toInt(); +} + void RectangularDetectorItem::setXSize(int nx) { getItem(RectangularDetectorItem::P_X_AXIS)->setItemValue(BasicAxisItem::P_NBINS, nx); diff --git a/GUI/coregui/Models/RectangularDetectorItem.h b/GUI/coregui/Models/RectangularDetectorItem.h index 1f9db868ab9592cfa038dd009249f9fcf488ff1f..69f5e56e3ba6a7bb63e3f37af9d7b51c05873191 100644 --- a/GUI/coregui/Models/RectangularDetectorItem.h +++ b/GUI/coregui/Models/RectangularDetectorItem.h @@ -35,6 +35,9 @@ public: RectangularDetectorItem(); void setDetectorAlignment(const QString& alignment); + + int xSize() const override; + int ySize() const override; void setXSize(int nx) override; void setYSize(int ny) override; diff --git a/GUI/coregui/Models/SpecularDataItem.cpp b/GUI/coregui/Models/SpecularDataItem.cpp index 857c348c69e0a727c78d5f65e57b42969db347ea..234f5c29d9cc0581b4bfa4092b18bbff2930ffec 100644 --- a/GUI/coregui/Models/SpecularDataItem.cpp +++ b/GUI/coregui/Models/SpecularDataItem.cpp @@ -155,6 +155,11 @@ void SpecularDataItem::updateAxesUnits(const InstrumentItem* instrument) JobItemUtils::updateDataAxes(this, instrument); } +std::vector<int> SpecularDataItem::shape() const +{ + return {getNbins()}; +} + void SpecularDataItem::resetToDefault() { assert(getOutputData() diff --git a/GUI/coregui/Models/SpecularDataItem.h b/GUI/coregui/Models/SpecularDataItem.h index aebe4824689636e466d16f50968a0f0c677c6d5b..971581c7848daabcbf76c9fe188ca349cc2845be 100644 --- a/GUI/coregui/Models/SpecularDataItem.h +++ b/GUI/coregui/Models/SpecularDataItem.h @@ -69,6 +69,7 @@ public: void setYaxisTitle(QString ytitle) override; void setAxesRangeToData() override; void updateAxesUnits(const InstrumentItem* instrument) override; + std::vector<int> shape() const override; //! Returns data to default state (no dimensional units, default axes' names) void resetToDefault() override; diff --git a/GUI/coregui/Models/SphericalDetectorItem.cpp b/GUI/coregui/Models/SphericalDetectorItem.cpp index 1a8f185f7f85411b64db7fb805363c5bbbce1dae..df35d8bcc4d088f2ae303efad2759f9b112f61f5 100644 --- a/GUI/coregui/Models/SphericalDetectorItem.cpp +++ b/GUI/coregui/Models/SphericalDetectorItem.cpp @@ -65,6 +65,18 @@ std::unique_ptr<IDetector2D> SphericalDetectorItem::createDomainDetector() const return std::move(result); } +int SphericalDetectorItem::xSize() const +{ + return getItem(SphericalDetectorItem::P_PHI_AXIS)->getItemValue(BasicAxisItem::P_NBINS).toInt(); +} + +int SphericalDetectorItem::ySize() const +{ + return getItem(SphericalDetectorItem::P_ALPHA_AXIS) + ->getItemValue(BasicAxisItem::P_NBINS) + .toInt(); +} + void SphericalDetectorItem::setXSize(int nx) { getItem(SphericalDetectorItem::P_PHI_AXIS)->setItemValue(BasicAxisItem::P_NBINS, nx); diff --git a/GUI/coregui/Models/SphericalDetectorItem.h b/GUI/coregui/Models/SphericalDetectorItem.h index db4f9ccbc37e3288b7799b56ac2d1255f4930b6a..348743635740fcaca1185eae05d187a86e1ac595 100644 --- a/GUI/coregui/Models/SphericalDetectorItem.h +++ b/GUI/coregui/Models/SphericalDetectorItem.h @@ -24,6 +24,8 @@ public: static const QString P_ALPHA_AXIS; SphericalDetectorItem(); + int xSize() const override; + int ySize() const override; void setXSize(int nx) override; void setYSize(int ny) override;