BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
FitComparisonController.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/FitComparisonController.cpp
6 //! @brief Implements class FitComparisonController
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"
24 
25 namespace {
26 // different limits on relative difference plot are required
27 // to provide the best appearance
28 const double relative_diff_min_2d = 1e-05;
29 const double relative_diff_max_2d = 1.0;
30 } // namespace
31 
33 public:
34  DiffItemController(const QString& data_type, QObject* parent);
35  ~DiffItemController() override;
36  void setItem(JobItem* job_item);
39  void subscribe();
40  void unsubscribe();
41 
42 private:
46 };
47 
49 
51  : QObject(parent)
52  , m_diff_item_controller(new DiffItemController("IntensityData", this))
53  , m_appearanceRepeater(new PropertyRepeater(this))
54  , m_xAxisRepeater(new PropertyRepeater(this))
55  , m_yAxisRepeater(new PropertyRepeater(this))
56  , m_zAxisRepeater(new PropertyRepeater(this))
57 {
58 }
59 
61 {
63  return dynamic_cast<IntensityDataItem*>(m_diff_item_controller->diffItem());
64 }
65 
67 {
68  ASSERT(job_item);
69 
70  clear();
72 
73  auto sim_data_item = dynamic_cast<IntensityDataItem*>(job_item->dataItem());
74  auto real_data_item = dynamic_cast<IntensityDataItem*>(job_item->realDataItem()->dataItem());
75 
76  double zmin = real_data_item->getLowerZ();
77  double zmax = real_data_item->getUpperZ();
78  sim_data_item->setLowerAndUpperZ(zmin, zmax);
79 
80  diffItem()->xAxisItem()->setItemValue(BasicAxisItem::P_TITLE, sim_data_item->getXaxisTitle());
81  diffItem()->yAxisItem()->setItemValue(BasicAxisItem::P_TITLE, sim_data_item->getYaxisTitle());
82  diffItem()->setLowerAndUpperZ(relative_diff_min_2d, relative_diff_max_2d);
84 
85  m_appearanceRepeater->addItem(real_data_item);
86  m_appearanceRepeater->addItem(sim_data_item);
88 
89  m_xAxisRepeater->addItem(real_data_item->xAxisItem());
90  m_xAxisRepeater->addItem(sim_data_item->xAxisItem());
91  m_xAxisRepeater->addItem(diffItem()->xAxisItem());
92 
93  m_yAxisRepeater->addItem(real_data_item->yAxisItem());
94  m_yAxisRepeater->addItem(sim_data_item->yAxisItem());
95  m_yAxisRepeater->addItem(diffItem()->yAxisItem());
96 
97  m_zAxisRepeater->addItem(real_data_item->zAxisItem());
98  m_zAxisRepeater->addItem(sim_data_item->zAxisItem());
99 }
100 
102 {
104 }
105 
107 {
108  diffItem()->resetView();
109  diffItem()->setLowerAndUpperZ(relative_diff_min_2d, relative_diff_max_2d);
110 }
111 
113 {
115 
120 }
121 
122 DiffItemController::DiffItemController(const QString& data_type, QObject* parent)
123  : QObject(parent)
124  , m_current_item(nullptr)
125  , m_tempIntensityDataModel(new SessionModel("TempIntensityDataModel", this))
126  , m_diff_item(dynamic_cast<DataItem*>(m_tempIntensityDataModel->insertNewItem(data_type)))
127 {
129 }
130 
132 {
133  unsubscribe();
134 }
135 
136 void DiffItemController::setItem(JobItem* job_item)
137 {
138  ASSERT(job_item);
139  if (m_current_item)
140  unsubscribe();
141  m_current_item = job_item;
142  subscribe();
143  updateDiffData();
144 }
145 
147 {
149 
150  auto sim_data = m_current_item->dataItem();
151  auto real_data = m_current_item->realDataItem()->dataItem();
152  ASSERT(sim_data && real_data);
153 
154  if (!sim_data->getOutputData()) // job failed
155  return;
156 
158  *real_data->getOutputData())
159  .release());
160 }
161 
163 {
164  return m_diff_item;
165 }
166 
168 {
169  if (!m_current_item) {
170  ASSERT(false);
171  return;
172  }
173 
174  // on simulation data change
175  m_current_item->dataItem()->mapper()->setOnValueChange([this]() { updateDiffData(); }, this);
176 
177  // on diff item units change
179  [this](const QString& name) {
182  },
183  this);
184 }
185 
187 {
188  if (!m_current_item)
189  return;
191  m_diff_item->mapper()->unsubscribe(this);
192  m_current_item = nullptr;
193 }
#define ASSERT(condition)
Definition: Assert.h:31
Defines various axis items.
Defines namespace DataUtils.
FitComparisonController2D::DiffItemController DiffItemController
Defines class FitComparisonController.
Defines class IntensityDataItem.
Defines class JobItem.
Defines class PropertyRepeater.
Defines class RealDataItem.
Defines class SessionModel.
Defines class SpecularDataItem.
static const QString P_TITLE
Definition: AxesItems.h:29
Provides common functionality for IntensityDataItem and SpecularDataItem.
Definition: DataItem.h:29
virtual void updateAxesUnits(const InstrumentItem *instrument)=0
virtual void setOutputData(OutputData< double > *data)=0
The given pointer becomes owned by this class!!
Definition: DataItem.cpp:24
static const QString P_AXES_UNITS
Definition: DataItem.h:34
DiffItemController(const QString &data_type, QObject *parent)
DiffItemController(const QString &data_type, QObject *parent)
void setItem(JobItem *job_item)
DiffItemController * m_diff_item_controller
PropertyRepeater * m_appearanceRepeater
FitComparisonController2D(QObject *parent=nullptr)
double getLowerZ() const
returns lower and upper zoom ranges of z-axis
void setLowerAndUpperZ(double zmin, double zmax)
void setAxesRangeToData() override
set zoom range of x,y axes to axes of input data
void resetView()
Set axes viewport to original data.
const BasicAxisItem * yAxisItem() const
const BasicAxisItem * xAxisItem() const
InstrumentItem * instrumentItem()
Definition: JobItem.cpp:224
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
void setOnPropertyChange(std::function< void(QString)> f, const void *caller=0)
Definition: ModelMapper.cpp:35
Tracks property change (axes range, units etc) for the collection of IntensityDataItems and sets same...
void addItem(SessionItem *sessionItem)
DataItem * dataItem()
ModelMapper * mapper()
Returns the current model mapper of this item. Creates new one if necessary.
void setItemValue(const QString &tag, const QVariant &variant)
Directly set value of item under given tag.
std::unique_ptr< OutputData< double > > createRelativeDifferenceData(const OutputData< double > &data, const OutputData< double > &reference)
Definition: DataUtils.cpp:69
QString const & name(EShape k)
Definition: particles.cpp:21