BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
ParameterTranslators.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Models/ParameterTranslators.cpp
6 //! @brief Implements subclasses of IParameterTranslator
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 
20 
21 namespace {
22 const QStringList expectedRoughnessPars =
23  QStringList() << QString::fromStdString("Sigma") << QString::fromStdString("Hurst")
24  << QString::fromStdString("CorrelationLength");
25 }
26 
28 
29 ModelTypeTranslator::ModelTypeTranslator(QString gui_model_type, QString domain_name)
30  : m_gui_model_type{std::move(gui_model_type)}, m_domain_name{std::move(domain_name)}
31 {
32 }
33 
35 {
37 }
38 
39 QStringList ModelTypeTranslator::translate(const QStringList& list) const
40 {
41  if (list.back() != m_gui_model_type)
42  return list;
43 
44  QStringList result = list;
45  result.removeLast();
46  result << m_domain_name;
47  return result;
48 }
49 
50 AddElementTranslator::AddElementTranslator(QString gui_name, QString additional_name)
51  : m_gui_name{std::move(gui_name)}, m_additional_name{std::move(additional_name)}
52 {
53 }
54 
56 {
58 }
59 
60 QStringList AddElementTranslator::translate(const QStringList& list) const
61 {
62  if (list.back() != m_gui_name)
63  return list;
64 
65  QStringList result = list;
66  result << m_additional_name;
67  return result;
68 }
69 
70 QStringList RotationTranslator::translate(const QStringList& list) const
71 {
72  if (list.back() != "Rotation")
73  return list;
74 
75  ASSERT(list.size() == 3);
76  QStringList result = list;
77  result.removeLast();
78  return result;
79 }
80 
81 QStringList DistributionNoneTranslator::translate(const QStringList& list) const
82 {
83  if (list.back() != "DistributionNone")
84  return list;
85 
86  Q_UNUSED(list);
87  return QStringList(); // removing "DistributionNone/Value"
88 }
89 
90 //! Converts "/Layer1/LayerBasicRoughness/Sigma" into "/LayerInterface0/LayerBasicRoughness/Sigma"
91 
92 RoughnessTranslator::RoughnessTranslator(const SessionItem* p_parent) : m_parent(p_parent) {}
93 
95 {
96  return new RoughnessTranslator(m_parent);
97 }
98 
99 QStringList RoughnessTranslator::translate(const QStringList& list) const
100 {
101  if (list.empty())
102  return {};
103 
104  if (!list.back().contains("Layer") || !expectedRoughnessPars.contains(list.front()))
105  return list;
106 
107  QStringList result = list;
108 
109  QString layerName = result.takeLast();
110  int layerIndex = getLayerIndex(layerName);
111  QString postfix = numberOfLayers() == 2 ? QString() : QString::number(layerIndex - 1);
112 
113  result.push_back(QString::fromStdString("LayerInterface") + postfix);
114  return result;
115 }
116 
117 //! Extract layer index from the string "Layer11"
118 
119 int RoughnessTranslator::getLayerIndex(QString layerName) const
120 {
121  layerName.remove("Layer");
122  bool ok(true);
123  int layerIndex = layerName.toInt(&ok);
124  if (!ok)
125  throw GUIHelpers::Error("RoughnessTranslator::getLayerIndex() -> Error. Can't parse.");
126  return layerIndex;
127 }
128 
130 {
131  QVector<SessionItem*> list = m_parent->getChildrenOfType("Layer");
132  return list.size();
133 }
134 
136  QStringList additional_names)
137  : m_gui_name{std::move(gui_name)}
138  , m_base_name{std::move(base_name)}
139  , m_additional_names{std::move(additional_names)}
140 {
141 }
142 
144 {
146 }
147 
148 QStringList VectorParameterTranslator::translate(const QStringList& list) const
149 {
150  if (list.empty())
151  return {};
152 
153  if (list.back() != m_gui_name)
154  return list;
155 
156  ASSERT(list.size() == 2);
157 
158  QStringList result;
159  if (list.front() == VectorItem::P_X) {
160  result << QString::fromStdString(IParametricComponent::XComponentName(m_base_name));
161  } else if (list.front() == VectorItem::P_Y) {
162  result << QString::fromStdString(IParametricComponent::YComponentName(m_base_name));
163  } else if (list.front() == VectorItem::P_Z) {
164  result << QString::fromStdString(IParametricComponent::ZComponentName(m_base_name));
165  } else {
166  GUIHelpers::Error("VectorParameterTranslator::translate() -> Unexpected list structure");
167  }
168  for (auto add_name : m_additional_names) {
169  result << add_name;
170  }
171  return result;
172 }
#define ASSERT(condition)
Definition: Assert.h:31
Defines class GUIHelpers functions.
Defines class MesoCrystalItem.
Defines interface IParameterTranslator and subclasses.
Defines class ParticleItem.
Defines class VectorItem.
AddElementTranslator * clone() const override
AddElementTranslator(QString gui_name, QString additional_name)
QStringList translate(const QStringList &list) const override
QStringList translate(const QStringList &list) const override
static std::string XComponentName(const std::string &base_name)
static std::string ZComponentName(const std::string &base_name)
static std::string YComponentName(const std::string &base_name)
virtual ~IPathTranslator()
ModelTypeTranslator * clone() const override
QStringList translate(const QStringList &list) const override
ModelTypeTranslator(QString gui_model_type, QString domain_name)
QStringList translate(const QStringList &list) const override
RoughnessTranslator * clone() const override
const SessionItem * m_parent
QStringList translate(const QStringList &list) const override
int getLayerIndex(QString layerName) const
Extract layer index from the string "Layer11".
RoughnessTranslator(const SessionItem *p_parent)
Converts "/Layer1/LayerBasicRoughness/Sigma" into "/LayerInterface0/LayerBasicRoughness/Sigma".
QVector< SessionItem * > getChildrenOfType(const QString &model_type) const
Returns a vector of all children of the given type.
static const QString P_Z
Definition: VectorItem.h:26
static const QString P_Y
Definition: VectorItem.h:25
static const QString P_X
Definition: VectorItem.h:24
VectorParameterTranslator * clone() const override
QStringList translate(const QStringList &list) const override
VectorParameterTranslator(QString gui_name, std::string base_name, QStringList additional_names={})
MVVM_MODEL_EXPORT std::string base_name(const std::string &path)
Provide the filename of a file path.
Definition: fileutils.cpp:78
Definition: filesystem.h:81