BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
SampleValidator.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Models/SampleValidator.cpp
6 //! @brief Implements class SampleValidator
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 
22 
23 SampleValidator::SampleValidator() : m_valid_sample(true) {}
24 
26 {
27  m_validation_message.clear();
28  m_valid_sample = true;
29 }
30 
32 {
33  for (const SessionItem* child : parentItem->children()) {
34  validateItem(child);
35  iterateItems(child);
36  }
37 }
38 
40 {
41  if (!item)
42  return;
43 
44  QString diagnosis;
45 
46  if (item->modelType() == "MultiLayer") {
47  diagnosis = validateMultiLayerItem(item);
48  } else if (item->modelType() == "ParticleLayout") {
49  diagnosis = validateParticleLayoutItem(item);
50  } else if (item->modelType() == "ParticleCoreShell") {
51  diagnosis = validateParticleCoreShellItem(item);
52  } else if (item->modelType() == "ParticleComposition") {
53  diagnosis = validateParticleCompositionItem(item);
54  } else if (item->modelType() == "ParticleDistribution") {
55  diagnosis = validateParticleDistributionItem(item);
56  }
57  if (!diagnosis.isEmpty()) {
58  m_valid_sample = false;
59  m_validation_message += QString("* ") + diagnosis + "\n";
60  }
61 }
62 
64 {
65  QString result;
66 
67  QVector<SessionItem*> layers = item->getItems(MultiLayerItem::T_LAYERS);
68 
69  if (layers.isEmpty()) {
70  result = "MultiLayer should contain at least one layer.";
71  } else if (layers.size() == 1) {
72  if (layers.front()->getItems(LayerItem::T_LAYOUTS).isEmpty()) {
73  result = "The single layer in your MultiLayer should contain ParticleLayout.";
74  }
75  }
76  return result;
77 }
78 
80 {
81  QString result;
82 
83  QVector<SessionItem*> particles = item->getItems(ParticleLayoutItem::T_PARTICLES);
84  if (particles.isEmpty())
85  result = "ParticleLayout doesn't contain any particles.";
86 
87  return result;
88 }
89 
91 {
92  QString result;
93 
96 
97  if (core == nullptr || shell == nullptr)
98  result = "ParticleCoreShell doesn't have either core or shell defined.";
99 
100  return result;
101 }
102 
104 {
105  QString result;
106  if (item->getItems(ParticleCompositionItem::T_PARTICLES).isEmpty())
107  result = "ParticleComposition doesn't have any particles.";
108 
109  return result;
110 }
111 
113 {
114  QString result;
115  if (item->getItems(ParticleDistributionItem::T_PARTICLES).isEmpty())
116  result = "ParticleDistribution doesn't have any particle.";
117 
118  return result;
119 }
120 
122 {
123  initValidator();
124 
125  validateItem(multilayer);
126  iterateItems(multilayer);
127 
128  if (!m_valid_sample) {
130  "Can't setup DWBA simulation for given MultiLayer.\n" + m_validation_message;
131  }
132  return m_valid_sample;
133 }
Defines class LayerItem.
Defines class MultiLayerItem.
Defines class ParticleCompositionItem.
Defines class ParticleCoreShellItem.
Defines class ParticleDistributionItem.
Defines class ParticleLayoutItem.
Defines class SampleValidator.
static const QString T_LAYOUTS
Definition: LayerItem.h:26
static const QString T_LAYERS
static const QString T_PARTICLES
static const QString T_CORE
static const QString T_SHELL
static const QString T_PARTICLES
static const QString T_PARTICLES
void validateItem(const SessionItem *item)
QString validateMultiLayerItem(const SessionItem *item)
QString m_validation_message
QString validateParticleCoreShellItem(const SessionItem *item)
QString validateParticleDistributionItem(const SessionItem *item)
QString validateParticleLayoutItem(const SessionItem *item)
void iterateItems(const SessionItem *parentItem)
bool isValidMultiLayer(const MultiLayerItem *multilayer)
QString validateParticleCompositionItem(const SessionItem *item)
QVector< SessionItem * > getItems(const QString &tag="") const
Returns vector of all items of given tag.
QVector< SessionItem * > children() const
Returns vector of all children.
QString modelType() const
Get model type.
SessionItem * getItem(const QString &tag="", int row=0) const
Returns item in given row of given tag.