Skip to content
Snippets Groups Projects
Commit d9adf670 authored by Yurov, Dmitry's avatar Yurov, Dmitry
Browse files

Prevent BA crash on linking q-space user data to specular instrument

Redmine: #2217
parent 7a225bf6
No related branches found
No related tags found
No related merge requests found
...@@ -28,12 +28,16 @@ ...@@ -28,12 +28,16 @@
#include "SessionItemUtils.h" #include "SessionItemUtils.h"
#include "SpecularBeamInclinationItem.h" #include "SpecularBeamInclinationItem.h"
#include "Units.h" #include "Units.h"
#include <cmath>
using SessionItemUtils::GetVectorItem; using SessionItemUtils::GetVectorItem;
namespace namespace
{ {
const QString polarization_tooltip = "Polarization of the beam, given as the Bloch vector"; 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); const QString BeamItem::P_INTENSITY = QString::fromStdString(BornAgain::Intensity);
...@@ -199,12 +203,18 @@ void SpecularBeamItem::updateToData(const IAxis& axis, QString units) ...@@ -199,12 +203,18 @@ void SpecularBeamItem::updateToData(const IAxis& axis, QString units)
inclinationAxisGroup()->setCurrentType(Constants::BasicAxisType); inclinationAxisGroup()->setCurrentType(Constants::BasicAxisType);
auto axis_item = currentInclinationAxisItem(); auto axis_item = currentInclinationAxisItem();
axis_item->setItemValue(BasicAxisItem::P_NBINS, static_cast<int>(axis.size())); 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; return;
} }
auto axis_group = inclinationAxisGroup(); auto axis_group = inclinationAxisGroup();
axis_group->setCurrentType(Constants::PointwiseAxisType); axis_group->setCurrentType(Constants::PointwiseAxisType);
auto axis_item = static_cast<PointwiseAxisItem*>(axis_group->currentItem()); 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); axis_item->init(axis, units);
} }
...@@ -226,3 +236,14 @@ double GISASBeamItem::getInclinationAngle() const ...@@ -226,3 +236,14 @@ double GISASBeamItem::getInclinationAngle() const
Q_ASSERT(inclination); Q_ASSERT(inclination);
return inclination->inclinationAngle(); 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;
}
}
...@@ -43,3 +43,12 @@ SpecularBeamWavelengthItem::SpecularBeamWavelengthItem() ...@@ -43,3 +43,12 @@ SpecularBeamWavelengthItem::SpecularBeamWavelengthItem()
: BeamWavelengthItem(Constants::SpecularBeamWavelengthType, : BeamWavelengthItem(Constants::SpecularBeamWavelengthType,
Constants::SymmetricDistributionGroup) 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);
}
...@@ -33,6 +33,7 @@ class BA_CORE_API_ SpecularBeamWavelengthItem : public BeamWavelengthItem ...@@ -33,6 +33,7 @@ class BA_CORE_API_ SpecularBeamWavelengthItem : public BeamWavelengthItem
{ {
public: public:
SpecularBeamWavelengthItem(); SpecularBeamWavelengthItem();
void setToRange(const RealLimits& limits);
}; };
#endif // BEAMWAVELENGTHITEM_H #endif // BEAMWAVELENGTHITEM_H
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment