BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
BeamDistributionItem.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Models/BeamDistributionItem.cpp
6 //! @brief Implements class BeamDistributionItem
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 "Base/Const/Units.h"
22 
23 const QString BeamDistributionItem::P_DISTRIBUTION = "Distribution";
24 
26 {
28 
29  mapper()->setOnChildPropertyChange([this, show_mean](SessionItem* item, const QString&) {
30  if (item->modelType() == "GroupProperty" && item->parent() == this)
31  initDistributionItem(show_mean);
32  });
33 }
34 
35 //! returns parameter distribution to add into the ISimulation
36 std::unique_ptr<ParameterDistribution>
37 BeamDistributionItem::getParameterDistributionForName(const std::string& parameter_name) const
38 {
39  std::unique_ptr<ParameterDistribution> P_par_distr{};
40  if (auto distributionItem = dynamic_cast<DistributionItem*>(getGroupItem(P_DISTRIBUTION))) {
41  auto P_distribution = createDistribution1D();
42 
43  if (P_distribution) {
44  int nbr_samples =
45  distributionItem->getItemValue(DistributionItem::P_NUMBER_OF_SAMPLES).toInt();
46  double sigma_factor(0);
47  if (distributionItem->isTag(DistributionItem::P_SIGMA_FACTOR)) {
48  sigma_factor =
49  distributionItem->getItemValue(DistributionItem::P_SIGMA_FACTOR).toInt();
50  }
51 
52  RealLimitsItem* limitsItem = dynamic_cast<RealLimitsItem*>(
53  distributionItem->getGroupItem(DistributionItem::P_LIMITS));
54  ASSERT(limitsItem);
55 
57 
58  P_par_distr = std::make_unique<ParameterDistribution>(
59  parameter_name, *P_distribution, nbr_samples, sigma_factor, limits);
60  }
61  }
62  return P_par_distr;
63 }
64 
65 //! Propagates the value and limits stored in DistributionNone type into alls distributions.
66 
68 {
69  auto groupItem = item<GroupItem>(P_DISTRIBUTION);
70 
71  SessionItem* distributionNone = nullptr;
72  for (auto item : groupItem->getItems(GroupItem::T_ITEMS)) {
73  if (item->modelType() == "DistributionNone") {
74  distributionNone = item;
75  break;
76  }
77  }
78 
79  if (!distributionNone)
80  return;
81 
82  const RealLimits limits = distributionNone->getItem(DistributionNoneItem::P_MEAN)->limits();
83  const QString editor_type =
84  distributionNone->getItem(DistributionNoneItem::P_MEAN)->editorType();
85 
86  for (auto item : groupItem->getItems(GroupItem::T_ITEMS)) {
87  DistributionItem* distrItem = dynamic_cast<DistributionItem*>(item);
88  distrItem->showMean(show_mean);
89 
90  if (item == distributionNone)
91  continue;
92 
93  distrItem->init_parameters(
94  distributionNone->getItemValue(DistributionNoneItem::P_MEAN).toDouble(), limits);
95  if (auto symmetric_distr = dynamic_cast<SymmetricDistributionItem*>(distrItem))
96  symmetric_distr->getItem(SymmetricDistributionItem::P_MEAN)
97  ->setEditorType(editor_type)
98  .setLimits(limits);
99 
100  // hiding limits from the editor
101  if (distrItem->isTag(DistributionItem::P_LIMITS))
102  distrItem->getItem(DistributionItem::P_LIMITS)->setVisible(false);
103  }
104 }
105 
106 //! Returns mean value of the distribution.
107 
109 {
110  std::unique_ptr<IDistribution1D> domainDistr = createDistribution1D();
111  if (domainDistr)
112  return domainDistr->getMean() / scaleFactor();
113  else
115 }
116 
118 {
119  SessionItem* distributionItem =
121  ASSERT(distributionItem);
122  distributionItem->setItemValue(DistributionNoneItem::P_MEAN, value);
123 }
124 
125 //! Scales the values provided by distribution (to perform deg->rad conversion in the case
126 //! of AngleDistributionItems.
127 
129 {
130  return 1.0;
131 }
132 
134 {
135  ASSERT(group_type == "Distribution extended group"
136  || group_type == "Symmetric distribution group");
137  addGroupProperty(P_DISTRIBUTION, group_type);
138 }
139 
140 std::unique_ptr<IDistribution1D> BeamDistributionItem::createDistribution1D() const
141 {
142  if (auto distItem = dynamic_cast<DistributionItem*>(getGroupItem(P_DISTRIBUTION)))
143  return distItem->createDistribution(scaleFactor());
144 
145  return {};
146 }
#define ASSERT(condition)
Definition: Assert.h:31
Defines class BeamDistributionItem.
Defines classes representing one-dimensional distributions.
Defines class GroupItem.
Defines class ParameterDistribution.
Defines interface IParameterTranslator and subclasses.
Defines RealLimitsItems's classes.
Defines some unit conversion factors and other constants in namespace Units.
void initDistributionItem(bool show_mean)
Propagates the value and limits stored in DistributionNone type into alls distributions.
std::unique_ptr< ParameterDistribution > getParameterDistributionForName(const std::string &parameter_name) const
returns parameter distribution to add into the ISimulation
static const QString P_DISTRIBUTION
virtual std::unique_ptr< IDistribution1D > createDistribution1D() const
void resetToValue(double value)
BeamDistributionItem(const QString &name, bool show_mean)
virtual double scaleFactor() const
Scales the values provided by distribution (to perform deg->rad conversion in the case of AngleDistri...
void register_distribution_group(const QString &group_type)
virtual double meanValue() const
Returns mean value of the distribution.
void init_parameters(double value, const RealLimits &limits=RealLimits::limitless())
Provides initialization of the distribution with some reasonable parameters around given value.
static const QString P_LIMITS
virtual void showMean(bool)=0
static const QString P_NUMBER_OF_SAMPLES
static const QString P_SIGMA_FACTOR
static const QString T_ITEMS
Definition: GroupItem.h:27
void setOnChildPropertyChange(std::function< void(SessionItem *, QString)> f, const void *caller=0)
Calls back on child property change, report childItem and property name.
Definition: ModelMapper.cpp:49
virtual RealLimits createRealLimits(double scale_factor=1.0) const =0
Limits for a real fit parameter.
Definition: RealLimits.h:24
bool isTag(const QString &name) const
Returns true if tag is available.
T & groupItem(const QString &groupName) const
Definition: SessionItem.h:168
SessionItem * getGroupItem(const QString &groupName) const
Access subitem of group item.
QVariant value() const
Get value.
void setVisible(bool enabled)
Flags accessors.
QString editorType() const
QVariant getItemValue(const QString &tag) const
Directly access value of item under given tag.
SessionItem * addGroupProperty(const QString &groupTag, const QString &groupType)
Creates new group item and register new tag, returns GroupItem.
ModelMapper * mapper()
Returns the current model mapper of this item. Creates new one if necessary.
void addTranslator(const IPathTranslator &translator)
T * item(const QString &tag) const
Definition: SessionItem.h:151
void setItemValue(const QString &tag, const QVariant &variant)
Directly set value of item under given tag.
SessionItem * setGroupProperty(const QString &groupTag, const QString &modelType) const
Set the current type of group item.
RealLimits limits() const
SessionItem * getItem(const QString &tag="", int row=0) const
Returns item in given row of given tag.
static const QString P_MEAN
QString const & name(EShape k)
Definition: particles.cpp:21