Newer
Older
// ************************************************************************************************
// BornAgain: simulate and fit reflection and scattering
//! @brief Implements BeamItem hierarchy
//! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
// ************************************************************************************************
#include "GUI/Model/Device/BeamAngleItems.h"
#include "GUI/Model/Device/BeamWavelengthItem.h"
#include "GUI/Model/Device/FootprintItems.h"
#include "GUI/Model/Device/PointwiseAxisItem.h"
#include <cmath>
namespace Tag {
const QString Intensity("Intensity");
const QString Wavelength("Wavelength");
const QString AzimuthalAngle("AzimuthalAngle");
const QString InclinationAngle("InclinationAngle");
}
// defines wavelength limits according to given maximum q value
double upper_lim = std::nextafter(4.0 * M_PI / max_q, 0.0);
RealLimits result = RealLimits::positive();
result.setUpperLimit(upper_lim);
return result;
m_intensity.init("Intensity", "Beam intensity in neutrons (or gammas) per sec.", 1e+08,
Unit::unitless, 3, RealLimits::limited(0.0, 1e+32), "intensity");
Pospelov, Gennady
committed
m_azimuthalAngleItem.reset(new BeamAzimuthalAngleItem());
Pospelov, Gennady
committed
}
Serialize::rwProperty(s, Tag::Intensity, m_intensity);
Serialize::rwClass(s, Tag::Wavelength, *m_wavelengthItem);
Serialize::rwClass(s, Tag::AzimuthalAngle, *m_azimuthalAngleItem);
Serialize::rwClass(s, Tag::InclinationAngle, *m_inclinationAngleItem);
double BeamItem::wavelength() const
{
return m_wavelengthItem->wavelength();
Pospelov, Gennady
committed
}
void BeamItem::setWavelength(double value)
{
m_wavelengthItem->resetToValue(value);
Pospelov, Gennady
committed
}
BeamWavelengthItem* BeamItem::wavelengthItem() const
{
void BeamItem::setInclinationAngle(double value)
{
m_inclinationAngleItem->resetToValue(value);
Pospelov, Gennady
committed
}
BeamDistributionItem* BeamItem::inclinationAngleItem() const
{
double BeamItem::getAzimuthalAngle() const
{
return m_azimuthalAngleItem->azimuthalAngle();
Pospelov, Gennady
committed
}
void BeamItem::setAzimuthalAngle(double value)
{
m_azimuthalAngleItem->resetToValue(value);
Pospelov, Gennady
committed
}
BeamAzimuthalAngleItem* BeamItem::azimuthalAngleItem() const
{
std::shared_ptr<Beam> BeamItem::createBeam() const
double inclination_angle = Units::deg2rad(getInclinationAngle());
double azimuthal_angle = Units::deg2rad(getAzimuthalAngle());
std::make_shared<Beam>(intensity(), lambda, Direction(inclination_angle, azimuthal_angle));
template <typename T>
void BeamItem::initWavelength()
template <typename T>
void BeamItem::initInclinationAngle()
m_inclinationAngleItem.reset(new T());
// Specular beam item
/* ------------------------------------------------------------------------- */
SpecularBeamItem::SpecularBeamItem(const InstrumentItem* owningInstrument)
m_inclinationAngleItem.reset(new SpecularBeamInclinationItem(owningInstrument));
initWavelength<SpecularBeamWavelengthItem>();
m_footprint.init<FootprintItemCatalog>("Type", "Footprint type", "footprint");
void SpecularBeamItem::serialize(Streamer& s)
Serialize::rwBaseClass<BeamItem>(s, "BeamItem", this);
Serialize::rwSelected<FootprintItemCatalog>(s, m_footprint);
double SpecularBeamItem::getInclinationAngle() const
{
void SpecularBeamItem::setInclinationAngle(double value)
{
value = 0.0;
BeamItem::setInclinationAngle(value);
}
SpecularBeamInclinationItem* SpecularBeamItem::inclinationAngleItem() const
{
return dynamic_cast<SpecularBeamInclinationItem*>(BeamItem::inclinationAngleItem());
BasicAxisItem* SpecularBeamItem::inclinationAxis() const
return inclinationAngleItem()->alphaAxis();
FootprintItem* SpecularBeamItem::footprint() const
SelectionDescriptor<FootprintItem*> SpecularBeamItem::footprintSelection() const
{
void SpecularBeamItem::setGaussianFootprint(double value)
{
m_footprint.set(new FootprintGaussianItem(value));
}
void SpecularBeamItem::setSquareFootprint(double value)
{
m_footprint.set(new FootprintSquareItem(value));
void SpecularBeamItem::updateToData(const IAxis& axis, QString units)

Wuttke, Joachim
committed
if (units == "nbins") {
inclinationAngleItem()->initUniformAxis(axis);
inclinationAngleItem()->selectUniformAxis();
} else {
inclinationAngleItem()->initPointwiseAxis(axis, units);
inclinationAngleItem()->selectPointwiseAxis();
void SpecularBeamItem::updateWavelength()
{
auto* item = inclinationAngleItem()->alphaAxis();
auto* wavelength = dynamic_cast<SpecularBeamWavelengthItem*>(wavelengthItem());
if (auto* pointwiseAxis = dynamic_cast<PointwiseAxisItem*>(item)) {
const auto* axis = pointwiseAxis->axis();
if (axis && pointwiseAxis->getUnitsLabel() == "q-space")
wavelength->setToRange(getLimits(axis->max()));
wavelength->setToRange(RealLimits::positive());
// GISAS beam item
/* ------------------------------------------------------------------------- */
GISASBeamItem::GISASBeamItem()
initInclinationAngle<BeamInclinationAngleItem>();
double GISASBeamItem::getInclinationAngle() const
{
return m_inclinationAngleGetter
? m_inclinationAngleGetter()
: dynamic_cast<BeamInclinationAngleItem*>(inclinationAngleItem())
->inclinationAngle();
}
void GISASBeamItem::setInclinationAngleGetter(std::function<double()> getter)
{
m_inclinationAngleGetter = getter;