diff --git a/GUI/coregui/Models/BeamItems.cpp b/GUI/coregui/Models/BeamItems.cpp index df83ac2aa244a9d941b98e3bb8110444695c8ade..60b028f5e682931bfbe11506661a7b34e9413720 100644 --- a/GUI/coregui/Models/BeamItems.cpp +++ b/GUI/coregui/Models/BeamItems.cpp @@ -28,12 +28,16 @@ #include "SessionItemUtils.h" #include "SpecularBeamInclinationItem.h" #include "Units.h" +#include <cmath> using SessionItemUtils::GetVectorItem; namespace { const QString polarization_tooltip = "Polarization of the beam, given as the Bloch vector"; + +// defines wavelength limits according to given maximum q value +RealLimits getLimits(double max_q); } const QString BeamItem::P_INTENSITY = QString::fromStdString(BornAgain::Intensity); @@ -199,12 +203,18 @@ void SpecularBeamItem::updateToData(const IAxis& axis, QString units) inclinationAxisGroup()->setCurrentType(Constants::BasicAxisType); auto axis_item = currentInclinationAxisItem(); axis_item->setItemValue(BasicAxisItem::P_NBINS, static_cast<int>(axis.size())); + auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH)); + wl_item->setToRange(RealLimits::positive()); return; } auto axis_group = inclinationAxisGroup(); axis_group->setCurrentType(Constants::PointwiseAxisType); auto axis_item = static_cast<PointwiseAxisItem*>(axis_group->currentItem()); + if (units == Constants::UnitsQyQz) { + auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH)); + wl_item->setToRange(getLimits(axis.getMax())); + } axis_item->init(axis, units); } @@ -226,3 +236,14 @@ double GISASBeamItem::getInclinationAngle() const Q_ASSERT(inclination); return inclination->inclinationAngle(); } + +namespace +{ +RealLimits getLimits(double max_q) +{ + double upper_lim = std::nextafter(4.0 * M_PI / max_q, 0.0); + RealLimits result = RealLimits::positive(); + result.setUpperLimit(upper_lim); + return result; +} +} diff --git a/GUI/coregui/Models/BeamWavelengthItem.cpp b/GUI/coregui/Models/BeamWavelengthItem.cpp index 9ee036c185607ab4b893379ed3721ee3965ebf22..bd9d8567bd8e84f0a9d9ed0b1c1aed841adf60c4 100644 --- a/GUI/coregui/Models/BeamWavelengthItem.cpp +++ b/GUI/coregui/Models/BeamWavelengthItem.cpp @@ -43,3 +43,12 @@ SpecularBeamWavelengthItem::SpecularBeamWavelengthItem() : BeamWavelengthItem(Constants::SpecularBeamWavelengthType, Constants::SymmetricDistributionGroup) {} + +void SpecularBeamWavelengthItem::setToRange(const RealLimits& limits) +{ + SessionItem* valueItem = + getGroupItem(P_DISTRIBUTION)->getItem(SymmetricDistributionItem::P_MEAN); + if (!limits.isInRange(wavelength())) + valueItem->setValue(limits.hasUpperLimit() ? limits.upperLimit() : limits.lowerLimit()); + valueItem->setLimits(limits); +} diff --git a/GUI/coregui/Models/BeamWavelengthItem.h b/GUI/coregui/Models/BeamWavelengthItem.h index 6d8a9c015805b053094e271b36d038f66b433971..687225180d96531f718a069ff4689b33355d48f3 100644 --- a/GUI/coregui/Models/BeamWavelengthItem.h +++ b/GUI/coregui/Models/BeamWavelengthItem.h @@ -33,6 +33,7 @@ class BA_CORE_API_ SpecularBeamWavelengthItem : public BeamWavelengthItem { public: SpecularBeamWavelengthItem(); + void setToRange(const RealLimits& limits); }; #endif // BEAMWAVELENGTHITEM_H