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 @@
#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;
}
}
......@@ -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);
}
......@@ -33,6 +33,7 @@ class BA_CORE_API_ SpecularBeamWavelengthItem : public BeamWavelengthItem
{
public:
SpecularBeamWavelengthItem();
void setToRange(const RealLimits& limits);
};
#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