BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
FitComparisonViewController.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/FitWidgets/FitComparisonViewController.cpp
6 //! @brief Implements classes DiffItemController, FitComparison1DViewController
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 
16 #include "Device/Data/DataUtils.h"
25 
26 namespace {
27 const double relative_diff_min_1d = 1e-05;
28 const double relative_diff_max_1d = 4.0;
29 } // namespace
30 
32  : QObject(parent)
33  , m_diff_item_controller(new DiffItemController("SpecularData", this))
34  , m_diff_view_item(nullptr)
35  , m_appearanceRepeater(new PropertyRepeater(this))
36  , m_xAxisRepeater(new PropertyRepeater(this))
37 {
38 }
39 
41 {
42  return m_diff_view_item;
43 }
44 
46 {
47  ASSERT(job_item);
48 
49  clear();
51  createDiffViewItem(job_item);
52 
53  auto job_data_view = job_item->dataItemView();
54 
55  m_appearanceRepeater->addItem(job_data_view);
57 
58  m_xAxisRepeater->addItem(job_data_view->xAxisItem());
59  m_xAxisRepeater->addItem(diffItemView()->xAxisItem());
60 
61  m_diff_view_item->setXaxisTitle(job_data_view->getXaxisTitle());
62  m_diff_view_item->setYaxisTitle("Relative difference");
63  m_diff_view_item->setLowerY(relative_diff_min_1d);
64  m_diff_view_item->setUpperY(relative_diff_max_1d);
65 }
66 
68 {
70 }
71 
73 {
74  if (!m_diff_view_item)
75  return;
77  m_diff_view_item->setLowerY(relative_diff_min_1d);
78  m_diff_view_item->setUpperY(relative_diff_max_1d);
79 }
80 
82 {
86  if (m_diff_view_item)
88 }
89 
91 {
95  container->addItem(m_diff_item_controller->diffItem());
96 
97  m_diff_view_item->setJobItem(job_item);
98  auto job_data_view = job_item->dataItemView();
99  auto units_value = job_data_view->getItemValue(Data1DViewItem::P_AXES_UNITS);
101 }
102 
104 {
105  auto parent = m_diff_view_item->parent();
106  auto old_view_item = parent->takeRow(parent->rowOfChild(m_diff_view_item));
107  ASSERT(old_view_item == m_diff_view_item);
108  delete (old_view_item);
109  m_diff_view_item = nullptr;
110 }
111 
112 DiffItemController::DiffItemController(const QString& data_type, QObject* parent)
113  : QObject(parent)
114  , m_current_item(nullptr)
115  , m_private_model(new SessionModel("TempIntensityDataModel", this))
116  , m_diff_item(dynamic_cast<DataItem*>(m_private_model->insertNewItem(data_type)))
117 {
118  ASSERT(m_diff_item);
119 }
120 
122 {
123  unsubscribe();
124 }
125 
127 {
128  ASSERT(job_item);
129  if (m_current_item)
130  unsubscribe();
131  m_current_item = job_item;
132  subscribe();
133  updateDiffData();
134 }
135 
137 {
139 
140  auto sim_data = m_current_item->dataItem();
141  auto real_data = m_current_item->realDataItem()->dataItem();
142  ASSERT(sim_data && real_data);
143 
144  if (!sim_data->getOutputData()) // job failed
145  return;
146 
148  *real_data->getOutputData())
149  .release());
150 }
151 
153 {
154  if (!m_current_item) {
155  ASSERT(false);
156  return;
157  }
158 
159  // on simulation data change
160  m_current_item->dataItem()->mapper()->setOnValueChange([this]() { updateDiffData(); }, this);
161 }
162 
164 {
165  m_diff_item->mapper()->unsubscribe(this);
166  if (!m_current_item)
167  return;
169  m_current_item = nullptr;
170 }
#define ASSERT(condition)
Definition: Assert.h:31
Defines various axis items.
Defines class Data1DViewItem.
Declares class DataItem.
Defines class DataPropertyContainer.
Defines namespace DataUtils.
Defines classes DiffItemController, FitComparison1DViewController.
Defines class JobItem.
Defines class PropertyRepeater.
Defines class RealDataItem.
Defines class SessionModel.
View model for 1D DataItem.
static const QString P_AXES_UNITS
void resetView()
Set axes viewport to original data.
void setJobItem(JobItem *job_item)
Sets job item (for unit conversion) if DataItemView is dynamically created outside of JobModel.
void setUpperY(double value)
void setLowerY(double value)
void setXaxisTitle(const QString &title)
static const QString T_DATA_PROPERTIES
void setYaxisTitle(const QString &title)
Provides common functionality for IntensityDataItem and SpecularDataItem.
Definition: DataItem.h:29
virtual void setOutputData(OutputData< double > *data)=0
The given pointer becomes owned by this class!!
Definition: DataItem.cpp:24
void setJobItem(JobItem *job_item)
DiffItemController(const QString &data_type, QObject *parent)
Data1DViewItem * dataItemView()
Definition: JobItem.cpp:269
DataItem * dataItem()
Definition: JobItem.cpp:118
RealDataItem * realDataItem()
Definition: JobItem.cpp:259
void unsubscribe(const void *caller)
Cancells all subscribtion of given caller.
Definition: ModelMapper.cpp:98
void setOnValueChange(std::function< void(void)> f, const void *caller=0)
Definition: ModelMapper.cpp:30
Tracks property change (axes range, units etc) for the collection of IntensityDataItems and sets same...
void addItem(SessionItem *sessionItem)
DataItem * dataItem()
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
SessionItem * takeRow(int row)
Removes row from item and returns the item.
SessionModel * model() const
Returns model of this item.
Definition: SessionItem.cpp:66
void setItemValue(const QString &tag, const QVariant &variant)
Directly set value of item under given tag.
T * insertItem(SessionItem *parent=nullptr, int row=-1, QString tag="")
Definition: SessionModel.h:125
std::unique_ptr< OutputData< double > > createRelativeDifferenceData(const OutputData< double > &data, const OutputData< double > &reference)
Definition: DataUtils.cpp:69