Skip to content
Snippets Groups Projects
Commit f4683b9f authored by Matthias Puchner's avatar Matthias Puchner
Browse files

cleanup/simplify ToDomain (namespaces, files)

parent e59c67d1
No related branches found
No related tags found
1 merge request!532Reduce SessionItem signaling
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file GUI/Model/To/DomainObjectBuilder.cpp
//! @brief Implements DomainObjectBuilder namespace
//!
//! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
// ************************************************************************************************
#include "GUI/Model/To/DomainObjectBuilder.h"
#include "GUI/Model/Instrument/InstrumentItems.h"
#include "GUI/Model/Sample/InterferenceItems.h"
#include "GUI/Model/Sample/LayerItem.h"
#include "GUI/Model/Sample/MultiLayerItem.h"
#include "GUI/Model/Sample/ParticleLayoutItem.h"
#include "GUI/Model/To/ToDomain.h"
#include "GUI/Util/Error.h"
std::unique_ptr<MultiLayer>
GUI::Model::DomainObjectBuilder::buildMultiLayer(const MultiLayerItem& multiLayerItem)
{
auto P_multilayer = GUI::Transform::ToDomain::createMultiLayer(multiLayerItem);
for (auto* layerItem : multiLayerItem.layers()) {
const bool isFirstLayer = layerItem == multiLayerItem.layers().first();
const bool isLastLayer = layerItem == multiLayerItem.layers().last();
auto P_layer = buildLayer(*layerItem, isFirstLayer || isLastLayer);
if (P_layer) {
const auto roughness = layerItem->roughness().currentItem();
auto P_roughness = GUI::Transform::ToDomain::createLayerRoughness(roughness);
if (P_roughness && !isLastLayer)
P_multilayer->addLayerWithTopRoughness(*P_layer, *P_roughness);
else
P_multilayer->addLayer(*P_layer);
}
}
return P_multilayer;
}
std::unique_ptr<Layer> GUI::Model::DomainObjectBuilder::buildLayer(const LayerItem& item,
bool isFirstOrLastLayer)
{
auto P_layer = GUI::Transform::ToDomain::createLayer(item, isFirstOrLastLayer);
for (ParticleLayoutItem* layout : item.layouts()) {
auto P_layout = buildParticleLayout(*layout);
if (P_layout)
P_layer->addLayout(*P_layout);
}
return P_layer;
}
std::unique_ptr<ParticleLayout>
GUI::Model::DomainObjectBuilder::buildParticleLayout(const ParticleLayoutItem& item)
{
auto P_layout = GUI::Transform::ToDomain::createParticleLayout(item);
QVector<SessionItem*> children = item.getItems();
for (int i = 0; i < children.size(); ++i) {
auto P_particle = GUI::Transform::ToDomain::createIParticle(*children[i]);
if (P_particle) {
P_layout->addParticle(*P_particle);
continue;
}
throw Error("GUI::Model::DomainObjectBuilder::buildParticleLayout()"
" -> Error! Not implemented");
}
InterferenceItem* interference = item.interference().currentItem();
if (interference) {
auto P_interference = interference->createInterference();
if (P_interference)
P_layout->setInterference(*P_interference);
}
return P_layout;
}
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file GUI/Model/To/DomainObjectBuilder.h
//! @brief Defines namespace GUI::Model::DomainObjectBuilder
//!
//! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
// ************************************************************************************************
#ifndef BORNAGAIN_GUI_MODEL_TO_DOMAINOBJECTBUILDER_H
#define BORNAGAIN_GUI_MODEL_TO_DOMAINOBJECTBUILDER_H
#include <memory>
class MultiLayer;
class Layer;
class LayerItem;
class Instrument;
class MultiLayerItem;
class ParticleLayout;
class ParticleLayoutItem;
class IInterference;
class SessionItem;
class InstrumentItem;
class ICoordSystem;
namespace GUI::Model::DomainObjectBuilder {
std::unique_ptr<MultiLayer> buildMultiLayer(const MultiLayerItem& item);
std::unique_ptr<Layer> buildLayer(const LayerItem& item, bool isFirstOrLastLayer);
std::unique_ptr<ParticleLayout> buildParticleLayout(const ParticleLayoutItem& item);
} // namespace GUI::Model::DomainObjectBuilder
#endif // BORNAGAIN_GUI_MODEL_TO_DOMAINOBJECTBUILDER_H
......@@ -30,7 +30,7 @@
#include "GUI/Model/Instrument/InstrumentItems.h"
#include "GUI/Model/Sample/MultiLayerItem.h"
#include "GUI/Model/Session/SimulationOptionsItem.h"
#include "GUI/Model/To/DomainObjectBuilder.h"
#include "GUI/Model/To/ToDomain.h"
#include "GUI/Util/Error.h"
#include "Param/Distrib/RangedDistributions.h"
#include "Resample/Options/SimulationOptions.h"
......@@ -220,7 +220,7 @@ GUI::Model::DomainSimulationBuilder::createSimulation(const MultiLayerItem* samp
throw Error(message);
}
auto P_multilayer = GUI::Model::DomainObjectBuilder::buildMultiLayer(*sampleItem);
auto P_multilayer = GUI::Transform::ToDomain::buildMultiLayer(*sampleItem);
if (const auto* gisasInstrument = dynamic_cast<const GISASInstrumentItem*>(instrumentItem))
return createGISASSimulation(std::move(P_multilayer), gisasInstrument, optionsItem);
......
......@@ -14,6 +14,7 @@
#include "GUI/Model/To/ToDomain.h"
#include "GUI/Model/Material/MaterialItem.h"
#include "GUI/Model/Sample/InterferenceItems.h"
#include "GUI/Model/Sample/LayerItem.h"
#include "GUI/Model/Sample/LayerRoughnessItems.h"
#include "GUI/Model/Sample/MesoCrystalItem.h"
......@@ -24,11 +25,20 @@
#include "GUI/Model/Sample/ParticleLayoutItem.h"
#include "GUI/Model/Types/DoubleDescriptor.h"
#include "GUI/Model/Types/UIntDescriptor.h"
#include "GUI/Util/Error.h"
#include "Sample/Aggregate/IInterference.h"
#include "Sample/Aggregate/ParticleLayout.h"
#include "Sample/Interface/LayerRoughness.h"
#include "Sample/Multilayer/Layer.h"
#include "Sample/Multilayer/MultiLayer.h"
#include "Sample/Particle/IParticle.h"
#include "Sample/Particle/MesoCrystal.h"
#include "Sample/Particle/Particle.h"
#include "Sample/Particle/ParticleCoreShell.h"
std::unique_ptr<MultiLayer> GUI::Transform::ToDomain::createMultiLayer(const MultiLayerItem& item)
namespace {
std::unique_ptr<MultiLayer> createMultiLayer(const MultiLayerItem& item)
{
auto P_multilayer = std::make_unique<MultiLayer>();
double cross_corr_length = item.crossCorrLength();
......@@ -39,8 +49,7 @@ std::unique_ptr<MultiLayer> GUI::Transform::ToDomain::createMultiLayer(const Mul
return P_multilayer;
}
std::unique_ptr<Layer> GUI::Transform::ToDomain::createLayer(const LayerItem& item,
bool isFirstOrLastLayer)
std::unique_ptr<Layer> createLayer(const LayerItem& item, bool isFirstOrLastLayer)
{
auto P_layer = std::make_unique<Layer>(*item.materialItem()->createMaterial(),
isFirstOrLastLayer ? 0.0 : item.thickness());
......@@ -48,22 +57,7 @@ std::unique_ptr<Layer> GUI::Transform::ToDomain::createLayer(const LayerItem& it
return P_layer;
}
std::unique_ptr<LayerRoughness> GUI::Transform::ToDomain::createLayerRoughness(
const std::variant<LayerZeroRoughnessItem*, LayerBasicRoughnessItem*>& roughness)
{
if (std::holds_alternative<LayerZeroRoughnessItem*>(roughness))
return nullptr;
if (std::holds_alternative<LayerBasicRoughnessItem*>(roughness)) {
const auto& basicRoughnessItem = *std::get<LayerBasicRoughnessItem*>(roughness);
return std::make_unique<LayerRoughness>(basicRoughnessItem.sigma(),
basicRoughnessItem.hurst(),
basicRoughnessItem.lateralCorrelationLength());
}
ASSERT(0);
}
std::unique_ptr<ParticleLayout>
GUI::Transform::ToDomain::createParticleLayout(const ParticleLayoutItem& item)
std::unique_ptr<ParticleLayout> createParticleLayout(const ParticleLayoutItem& item)
{
auto P_layout = std::make_unique<ParticleLayout>();
double total_density = item.totalDensity();
......@@ -73,7 +67,7 @@ GUI::Transform::ToDomain::createParticleLayout(const ParticleLayoutItem& item)
return P_layout;
}
std::unique_ptr<IParticle> GUI::Transform::ToDomain::createIParticle(const SessionItem& item)
std::unique_ptr<IParticle> createIParticle(const SessionItem& item)
{
std::unique_ptr<IParticle> P_particle;
if (item.hasModelType<ParticleItem>()) {
......@@ -91,3 +85,73 @@ std::unique_ptr<IParticle> GUI::Transform::ToDomain::createIParticle(const Sessi
}
return P_particle;
}
std::unique_ptr<ParticleLayout> buildParticleLayout(const ParticleLayoutItem& item)
{
auto P_layout = createParticleLayout(item);
QVector<SessionItem*> children = item.getItems();
for (int i = 0; i < children.size(); ++i) {
auto P_particle = createIParticle(*children[i]);
if (P_particle) {
P_layout->addParticle(*P_particle);
continue;
}
throw Error("GUI::Model::DomainObjectBuilder::buildParticleLayout()"
" -> Error! Not implemented");
}
InterferenceItem* interference = item.interference().currentItem();
if (interference) {
auto P_interference = interference->createInterference();
if (P_interference)
P_layout->setInterference(*P_interference);
}
return P_layout;
}
std::unique_ptr<Layer> buildLayer(const LayerItem& item, bool isFirstOrLastLayer)
{
auto P_layer = createLayer(item, isFirstOrLastLayer);
for (ParticleLayoutItem* layout : item.layouts()) {
auto P_layout = buildParticleLayout(*layout);
if (P_layout)
P_layer->addLayout(*P_layout);
}
return P_layer;
}
} // namespace
std::unique_ptr<LayerRoughness> GUI::Transform::ToDomain::createLayerRoughness(
const std::variant<LayerZeroRoughnessItem*, LayerBasicRoughnessItem*>& roughness)
{
if (std::holds_alternative<LayerZeroRoughnessItem*>(roughness))
return nullptr;
if (std::holds_alternative<LayerBasicRoughnessItem*>(roughness)) {
const auto& basicRoughnessItem = *std::get<LayerBasicRoughnessItem*>(roughness);
return std::make_unique<LayerRoughness>(basicRoughnessItem.sigma(),
basicRoughnessItem.hurst(),
basicRoughnessItem.lateralCorrelationLength());
}
ASSERT(0);
}
std::unique_ptr<MultiLayer>
GUI::Transform::ToDomain::buildMultiLayer(const MultiLayerItem& multiLayerItem)
{
auto P_multilayer = createMultiLayer(multiLayerItem);
for (auto* layerItem : multiLayerItem.layers()) {
const bool isFirstLayer = layerItem == multiLayerItem.layers().first();
const bool isLastLayer = layerItem == multiLayerItem.layers().last();
auto P_layer = buildLayer(*layerItem, isFirstLayer || isLastLayer);
if (P_layer) {
const auto roughness = layerItem->roughness().currentItem();
auto P_roughness = createLayerRoughness(roughness);
if (P_roughness && !isLastLayer)
P_multilayer->addLayerWithTopRoughness(*P_layer, *P_roughness);
else
P_multilayer->addLayer(*P_layer);
}
}
return P_multilayer;
}
......@@ -15,33 +15,23 @@
#ifndef BORNAGAIN_GUI_MODEL_TO_TODOMAIN_H
#define BORNAGAIN_GUI_MODEL_TO_TODOMAIN_H
#include "Device/Instrument/Instrument.h"
#include "Param/Distrib/Distributions.h" // for IDistribution1D
#include "Param/Distrib/ParameterDistribution.h"
#include "Sample/Aggregate/IInterference.h"
#include "Sample/Aggregate/ParticleLayout.h"
#include "Sample/Interface/LayerRoughness.h"
#include "Sample/Multilayer/Layer.h"
#include "Sample/Multilayer/MultiLayer.h"
#include "Sample/Particle/IParticle.h"
#include <memory>
#include <variant>
class LayerItem;
class MultiLayerItem;
class ParticleLayoutItem;
class SessionItem;
class MultiLayer;
class LayerZeroRoughnessItem;
class LayerBasicRoughnessItem;
class LayerRoughness;
namespace GUI::Transform::ToDomain {
std::unique_ptr<IParticle> createIParticle(const SessionItem& item);
std::unique_ptr<Layer> createLayer(const LayerItem& item, bool isFirstOrLastLayer);
std::unique_ptr<LayerRoughness> createLayerRoughness(
const std::variant<LayerZeroRoughnessItem*, LayerBasicRoughnessItem*>& roughness);
std::unique_ptr<MultiLayer> createMultiLayer(const MultiLayerItem& item);
std::unique_ptr<ParticleLayout> createParticleLayout(const ParticleLayoutItem& item);
std::unique_ptr<MultiLayer> buildMultiLayer(const MultiLayerItem& item);
} // namespace GUI::Transform::ToDomain
......
......@@ -16,7 +16,7 @@
#include "Core/Export/ExportToPython.h"
#include "GUI/Model/Sample/MultiLayerItem.h"
#include "GUI/Model/Sample/SampleModel.h"
#include "GUI/Model/To/DomainObjectBuilder.h"
#include "GUI/Model/To/ToDomain.h"
#include "GUI/View/Info/CautionSign.h"
#include "GUI/View/Info/PythonSyntaxHighlighter.h"
#include "GUI/View/Tool/DesignerHelper.h"
......@@ -122,8 +122,7 @@ QString ScriptPanel::generateCodeSnippet()
QString result;
try {
auto multilayer =
GUI::Model::DomainObjectBuilder::buildMultiLayer(*m_currentMultiLayerItem);
auto multilayer = GUI::Transform::ToDomain::buildMultiLayer(*m_currentMultiLayerItem);
result.append(QString::fromStdString(Py::Export::sampleCode(*multilayer)));
} catch (const std::exception& ex) {
QString message =
......
......@@ -2,6 +2,7 @@
#include "GUI/Model/Sample/LayerRoughnessItems.h"
#include "GUI/Model/To/ToDomain.h"
#include "GUI/Model/Types/DoubleDescriptor.h"
#include "Sample/Interface/LayerRoughness.h"
#include "Tests/GTestWrapper/google_test.h"
class TestLayerRoughnessItems : public ::testing::Test {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment