BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
Data1DViewItem.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Models/Data1DViewItem.cpp
6 //! @brief Implements class Data1DViewItem
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 
24 
25 namespace {
26 const QString x_axis_default_name = "X [nbins]";
27 const QString y_axis_default_name = "Signal [a.u.]";
28 
29 const double default_min = 0.0;
30 const double default_max = 1.0;
31 } // namespace
32 
33 const QString Data1DViewItem::P_TITLE = "Title";
34 const QString Data1DViewItem::P_XAXIS = "x-axis";
35 const QString Data1DViewItem::P_YAXIS = "y-axis";
36 const QString Data1DViewItem::P_AXES_UNITS = "Axes Units";
37 const QString Data1DViewItem::T_DATA_PROPERTIES = "Data property container";
38 
39 Data1DViewItem::Data1DViewItem() : SessionItem("Data1DViewItem"), m_job_item(nullptr)
40 {
41  addProperty(P_TITLE, QString())->setVisible(false);
42 
43  auto basicAxis = addProperty<BasicAxisItem>(P_XAXIS);
44  basicAxis->getItem(BasicAxisItem::P_NBINS)->setVisible(false);
45 
46  auto amplitudeAxis = addProperty<AmplitudeAxisItem>(P_YAXIS);
47  amplitudeAxis->getItem(BasicAxisItem::P_NBINS)->setVisible(false);
48  amplitudeAxis->getItem(BasicAxisItem::P_TITLE)->setVisible(true);
49  amplitudeAxis->getItem(AmplitudeAxisItem::P_IS_VISIBLE)->setValue(true);
50  amplitudeAxis->getItem(AmplitudeAxisItem::P_IS_VISIBLE)->setVisible(false);
51 
52  registerTag(T_DATA_PROPERTIES, 1, 1, QStringList() << "DataPropertyContainer");
53 
54  ComboProperty combo = ComboProperty() << "nbins";
56 
57  mapper()->setOnPropertyChange([this](const QString& name) {
58  if (name != P_AXES_UNITS)
59  return;
62  });
63 
64  setLowerX(default_min);
65  setUpperX(default_max);
66  setLowerY(default_min);
67  setUpperY(default_max);
70 }
71 
73 {
74 
75  return xAxisItem()->binCount();
76 }
77 
79 {
80  return xAxisItem()->lowerBound();
81 }
82 
84 {
85  return xAxisItem()->upperBound();
86 }
87 
89 {
90  return yAxisItem()->lowerBound();
91 }
92 
94 {
95  return yAxisItem()->upperBound();
96 }
97 
99 {
100  return yAxisItem()->isLogScale();
101 }
102 
104 {
105  return xAxisItem()->title();
106 }
107 
109 {
110  return yAxisItem()->title();
111 }
112 
113 void Data1DViewItem::setXaxisTitle(const QString& title)
114 {
115  xAxisItem()->setTitle(title);
116 }
117 
118 void Data1DViewItem::setYaxisTitle(const QString& title)
119 {
120  yAxisItem()->setTitle(title);
121 }
122 
123 //! set zoom range of x,y axes to axes of input data
125 {
126  const auto data =
128 
129  // For data loading from disk: items appear earlier than
130  // actual data.
131  if (!data)
132  return;
133 
134  setLowerX(data->axis(0).lowerBound());
135  setUpperX(data->axis(0).upperBound());
136 
137  auto data_range = dataRange(data.get());
138  setLowerY(data_range.first);
139  setUpperY(data_range.second);
140 }
141 
143 {
144  // TODO: implement when applying DataITem1DView in ImportView
145  throw GUIHelpers::Error("Error in DataItem1DView::resetToDefault: not implemented");
146 }
147 
148 QPair<QVector<double>, QVector<double>> Data1DViewItem::graphData(Data1DProperties* property_item)
149 {
150  const auto data = DataViewUtils::getTranslatedData(this, property_item->dataItem());
151  if (!data)
152  return {};
153 
154 #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
155  auto centers = data->axis(0).binCenters();
156  auto values = data->getRawDataVector();
157  return {QVector<double>(centers.begin(), centers.end()),
158  QVector<double>(values.begin(), values.end())};
159 #else
160  return {QVector<double>::fromStdVector(data->axis(0).binCenters()),
161  QVector<double>::fromStdVector(data->getRawDataVector())};
162 #endif
163 }
164 
166 {
167  if (m_job_item != nullptr)
168  return m_job_item; // returning preset job item
169 
170  auto item = parent();
171  do {
172  if (item->modelType() == "JobItem") {
173  m_job_item = dynamic_cast<JobItem*>(item);
174  return m_job_item;
175  }
176  } while ((item = item->parent()));
177  throw GUIHelpers::Error(
178  "Error in DataItem1DView::jobItem: passed item is not owned by any job item");
179 }
180 
181 void Data1DViewItem::setLowerX(double value)
182 {
184 }
185 
186 void Data1DViewItem::setUpperX(double value)
187 {
189 }
190 
191 void Data1DViewItem::setLowerY(double value)
192 {
194 }
195 
196 void Data1DViewItem::setUpperY(double value)
197 {
199 }
200 
201 void Data1DViewItem::setLog(bool log_flag)
202 {
203  yAxisItem()->setLogScale(log_flag);
204 }
205 
207 {
208  return item<DataPropertyContainer>(T_DATA_PROPERTIES);
209 }
210 
212 {
213  return item<BasicAxisItem>(P_XAXIS);
214 }
215 
217 {
218  return item<BasicAxisItem>(P_XAXIS);
219 }
220 
222 {
223  return item<AmplitudeAxisItem>(P_YAXIS);
224 }
225 
227 {
228  return item<AmplitudeAxisItem>(P_YAXIS);
229 }
230 
231 //! Set axes viewport to original data.
232 
234 {
236 }
237 
238 //! Init ymin, ymax to match the intensity values range.
239 QPair<double, double> Data1DViewItem::dataRange(const OutputData<double>* data) const
240 {
241  if (!data)
242  return QPair<double, double>(default_min, default_max);
243 
244  double min(*std::min_element(data->begin(), data->end()));
245  double max(*std::max_element(data->begin(), data->end()));
246 
247  min /= 2.0;
248  min = std::numeric_limits<double>::epsilon() < min ? min : default_min;
249  max *= 2.0;
250  max = max > min ? max : default_max;
251 
252  return QPair<double, double>(min, max);
253 }
Defines various axis items.
Defines class ComboProperty.
Defines class Data1DViewItem.
Declares class DataItem.
Defines class DataProperties and its descendants.
Defines class DataPropertyContainer.
Defines namespace DataViewUtils.
Defines class GUIHelpers functions.
const QString y_axis_default_name
const QString x_axis_default_name
Defines class JobItem.
bool isLogScale() const
Definition: AxesItems.cpp:113
void setLogScale(bool value)
Definition: AxesItems.cpp:118
static const QString P_NBINS
Definition: AxesItems.h:26
static const QString P_TITLE
Definition: AxesItems.h:29
double upperBound() const
Definition: AxesItems.cpp:52
QString title() const
Definition: AxesItems.cpp:62
static const QString P_IS_VISIBLE
Definition: AxesItems.h:25
int binCount() const
Definition: AxesItems.cpp:32
double lowerBound() const
Definition: AxesItems.cpp:42
void setLowerBound(double value)
Definition: AxesItems.cpp:47
void setUpperBound(double value)
Definition: AxesItems.cpp:57
void setTitle(const QString &title)
Definition: AxesItems.cpp:67
Custom property to define list of string values with multiple selections.
Definition: ComboProperty.h:25
QVariant variant() const
Constructs variant enclosing given ComboProperty.
Holds data required for 1D DataItem representation.
JobItem * jobItem()
Returns either parenting JobItem or job item set with DataItem1DView::setJobItem.
void setLog(bool log_flag)
static const QString P_YAXIS
JobItem * m_job_item
double getUpperY() const
bool isLog() const
static const QString P_TITLE
const AmplitudeAxisItem * yAxisItem() const
int getNbins() const
Number of bins in data.
void setAxesRangeToData()
set zoom range of x,y axes to axes of input data
static const QString P_AXES_UNITS
DataPropertyContainer * propertyContainerItem()
void resetView()
Set axes viewport to original data.
double getLowerY() const
returns lower and upper zoom ranges of y-axis
const BasicAxisItem * xAxisItem() const
QString getYaxisTitle() const
void setUpperY(double value)
QString getXaxisTitle() const
double getLowerX() const
returns lower and upper zoom ranges of x-axis
QPair< QVector< double >, QVector< double > > graphData(Data1DProperties *property_item)
Returns point data for drawing.
void setLowerX(double value)
void setLowerY(double value)
static const QString P_XAXIS
void setUpperX(double value)
void setXaxisTitle(const QString &title)
QPair< double, double > dataRange(const OutputData< double > *data) const
Init ymin, ymax to match the intensity values range.
double getUpperX() const
static const QString T_DATA_PROPERTIES
void setYaxisTitle(const QString &title)
void resetToDefault()
Returns data view to default state (no dimensional units, default axes' names)
DataItem * dataItem()
void setOnPropertyChange(std::function< void(QString)> f, const void *caller=0)
Definition: ModelMapper.cpp:35
iterator end()
Returns read/write iterator that points to the one past last element.
Definition: OutputData.h:93
iterator begin()
Returns read/write iterator that points to the first element.
Definition: OutputData.h:343
SessionItem * addProperty(const QString &name, const QVariant &variant)
Add new property item and register new tag.
bool registerTag(const QString &name, int min=0, int max=-1, QStringList modelTypes={})
Add new tag to this item with given name, min, max and types.
QVariant value() const
Get value.
void setVisible(bool enabled)
Flags accessors.
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
T * item(const QString &tag) const
Definition: SessionItem.h:151
std::unique_ptr< OutputData< double > > getTranslatedData(Data1DViewItem *view_item, DataItem *data_item)
void updateAxesTitle(Data1DViewItem *view_item)
QVector< double > fromStdVector(const std::vector< double > &data)
Definition: GUIHelpers.cpp:225
QString const & name(EShape k)
Definition: particles.cpp:21