BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
PointwiseAxisItem.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Models/PointwiseAxisItem.cpp
6 //! @brief Implements pointwise axis item
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
17 #include "Device/Data/OutputData.h"
21 
22 namespace {
23 std::unique_ptr<OutputData<double>> makeOutputData(const IAxis& axis);
24 }
25 
26 const QString PointwiseAxisItem::P_NATIVE_AXIS_UNITS = "NativeAxisUnits";
27 const QString PointwiseAxisItem::P_FILE_NAME = "FileName";
28 
29 PointwiseAxisItem::PointwiseAxisItem() : BasicAxisItem("PointwiseAxis"), m_instrument(nullptr)
30 {
31  getItem(P_MIN_DEG)->setEnabled(false);
32  getItem(P_NBINS)->setEnabled(false);
33  getItem(P_MAX_DEG)->setEnabled(false);
34  addProperty(P_FILE_NAME, "undefined")->setVisible(false);
35  addProperty(P_NATIVE_AXIS_UNITS, "nbins")->setVisible(false);
36 
38  mapper()->setOnPropertyChange([this](const QString& name) {
39  if (name == P_FILE_NAME)
41  });
42 }
43 
45 
46 void PointwiseAxisItem::init(const IAxis& axis, const QString& units_label)
47 {
49  m_axis = std::unique_ptr<IAxis>(axis.clone());
50  setItemValue(P_NATIVE_AXIS_UNITS, units_label);
52 }
53 
55 {
56  return m_axis.get();
57 }
58 
59 const QString PointwiseAxisItem::getUnitsLabel() const
60 {
61  return getItemValue(P_NATIVE_AXIS_UNITS).toString();
62 }
63 
64 std::unique_ptr<IAxis> PointwiseAxisItem::createAxis(double scale) const
65 {
66  if (!checkValidity())
67  return nullptr;
68 
69  const auto converter = m_instrument->createUnitConverter();
70  const auto converted_axis = converter->createConvertedAxis(0, Axes::Units::DEGREES);
71 
72  // applying scaling
73  std::vector<double> centers = converted_axis->binCenters();
74  std::for_each(centers.begin(), centers.end(), [scale](double& value) { value *= scale; });
75 
76  return std::make_unique<PointwiseAxis>(converted_axis->getName(), std::move(centers));
77 }
78 
79 bool PointwiseAxisItem::load(const QString& projectDir)
80 {
82  auto data = IntensityDataIOFactory::readOutputData(filename.toStdString());
83  if (!data)
84  return false;
85 
86  m_axis = std::unique_ptr<IAxis>(data->axis(0).clone());
89  return true;
90 }
91 
92 bool PointwiseAxisItem::save(const QString& projectDir)
93 {
94  if (!containsNonXMLData())
95  return false;
96 
99  return true;
100 }
101 
103 {
104  return static_cast<bool>(m_axis);
105 }
106 
108 {
109  return m_last_modified;
110 }
111 
113 {
114  return getItemValue(PointwiseAxisItem::P_FILE_NAME).toString();
115 }
116 
117 void PointwiseAxisItem::setLastModified(const QDateTime& dtime)
118 {
119  m_last_modified = dtime;
120 }
121 
123 {
124  return m_axis && m_instrument && getUnitsLabel() != "nbins";
125 }
126 
128 {
129  SessionItem* parent_item = parent();
130  while (parent_item && !parent_item->is<SpecularInstrumentItem>())
131  parent_item = parent_item->parent();
132  m_instrument = static_cast<SpecularInstrumentItem*>(parent_item);
133 }
134 
136 {
137  if (!checkValidity())
138  return;
139 
140  const auto converter = m_instrument->createUnitConverter();
141  setLowerBound(converter->calculateMin(0, Axes::Units::DEGREES));
142  setUpperBound(converter->calculateMax(0, Axes::Units::DEGREES));
143  setBinCount(static_cast<int>(m_axis->size()));
144 
145  emitDataChanged();
146 }
147 
148 namespace {
149 std::unique_ptr<OutputData<double>> makeOutputData(const IAxis& axis)
150 {
151  std::unique_ptr<OutputData<double>> result(new OutputData<double>);
152  result->addAxis(axis);
153  return result;
154 }
155 } // namespace
Defines interface IUnitConverter and possible axis units.
Defines InstrumentItems classes.
Defines class IntensityDataIOFactory.
Defines and implements templated class OutputData.
Defines pointwise axis item.
Defines class PointwiseAxis.
void setBinCount(int value)
Definition: AxesItems.cpp:37
static const QString P_NBINS
Definition: AxesItems.h:26
static const QString P_MAX_DEG
Definition: AxesItems.h:28
void setLowerBound(double value)
Definition: AxesItems.cpp:47
void setUpperBound(double value)
Definition: AxesItems.cpp:57
static const QString P_MIN_DEG
Definition: AxesItems.h:27
Interface for one-dimensional axes.
Definition: IAxis.h:25
virtual IAxis * clone() const =0
clone function
static OutputData< double > * readOutputData(const std::string &file_name)
Reads file and returns newly created OutputData object.
static void writeOutputData(const OutputData< double > &data, const std::string &file_name)
Writes OutputData in file.
void setOnPropertyChange(std::function< void(QString)> f, const void *caller=0)
Definition: ModelMapper.cpp:35
void setLastModified(const QDateTime &dtime)
void findInstrument()
Sets internal m_instrument to containing SpecularInstrumentItem.
bool save(const QString &projectDir) override
Saves non-XML data in projectDir and returns success flag.
~PointwiseAxisItem() override
bool checkValidity() const
const SpecularInstrumentItem * m_instrument
const QString getUnitsLabel() const
QString fileName() const override
Reports file name to save/load non-XML data.
std::unique_ptr< IAxis > createAxis(double scale) const override
std::unique_ptr< IAxis > m_axis
bool containsNonXMLData() const override
Checks if object owns non-XML data.
const IAxis * axis() const
static const QString P_FILE_NAME
QDateTime lastModified() const override
Indicates last modification timepoint.
bool load(const QString &projectDir) override
Loads non-XML data from projectDir and returns success flag.
void init(const IAxis &axis, const QString &units_label)
static const QString P_NATIVE_AXIS_UNITS
virtual QString fileName() const =0
Reports file name to save/load non-XML data.
bool is() const
Definition: SessionItem.h:175
SessionItem * addProperty(const QString &name, const QVariant &variant)
Add new property item and register new tag.
QVariant value() const
Get value.
void setVisible(bool enabled)
Flags accessors.
QVariant getItemValue(const QString &tag) const
Directly access value of item under given tag.
ModelMapper * mapper()
Returns the current model mapper of this item. Creates new one if necessary.
SessionItem * parent() const
Returns parent of this item.
Definition: SessionItem.cpp:73
void setItemValue(const QString &tag, const QVariant &variant)
Directly set value of item under given tag.
void emitDataChanged(int role=Qt::DisplayRole)
Notify model about data changes.
void setEnabled(bool enabled)
SessionItem * getItem(const QString &tag="", int row=0) const
Returns item in given row of given tag.
std::unique_ptr< IUnitConverter > createUnitConverter() const
std::string filename(const std::string &path)
Returns path without directory part ("Foo/Bar/Doz.int.gz" -> "Doz.int.gz")
QString currentDateTime()
Definition: GUIHelpers.cpp:210
QString projectDir(const QString &projectFileName)
Returns project directory deduced from project file name.
QString const & name(EShape k)
Definition: particles.cpp:21