From 1639669325f7c91e63ad2ee08cb60402ef6f557f Mon Sep 17 00:00:00 2001
From: Matthias Puchner <github@mpuchner.de>
Date: Tue, 13 Apr 2021 12:19:46 +0200
Subject: [PATCH] remove ParticleDistribution and related classes from GUI

---
 GUI/coregui/Models/DomainObjectBuilder.cpp    |  33 +-
 GUI/coregui/Models/GUIDomainSampleVisitor.cpp |  12 +-
 GUI/coregui/Models/GUIExamplesFactory.cpp     | 142 ++++----
 GUI/coregui/Models/ItemCatalog.cpp            |   3 -
 .../Models/ParticleDistributionItem.cpp       | 223 -------------
 GUI/coregui/Models/ParticleDistributionItem.h |  50 ---
 GUI/coregui/Models/SampleValidator.cpp        |  12 -
 GUI/coregui/Models/SampleValidator.h          |   1 -
 GUI/coregui/Models/SessionItemUtils.cpp       |   1 -
 GUI/coregui/Models/TransformFromDomain.cpp    |  24 --
 GUI/coregui/Models/TransformFromDomain.h      |   2 -
 GUI/coregui/Models/TransformToDomain.cpp      |   9 -
 GUI/coregui/Models/TransformToDomain.h        |   1 -
 .../MaterialEditor/MaterialItemUtils.cpp      |   2 -
 .../RealSpaceWidgets/RealSpaceBuilder.cpp     |  11 -
 .../RealSpaceBuilderUtils.cpp                 |  50 ---
 .../RealSpaceMesoCrystalUtils.cpp             |   1 -
 .../Views/SampleDesigner/DesignerHelper.cpp   |   3 +-
 .../ParticleDistributionView.cpp              |  37 ---
 .../SampleDesigner/ParticleDistributionView.h |  32 --
 .../SampleDesigner/SampleViewFactory.cpp      |   4 -
 GUI/coregui/Views/widgetbox/widgetbox.xml     |   8 -
 Tests/UnitTests/GUI/TestMapperCases.cpp       |  10 -
 Tests/UnitTests/GUI/TestParticleCoreShell.cpp |  24 --
 .../GUI/TestParticleDistributionItem.cpp      | 306 ------------------
 Tests/UnitTests/GUI/TestParticleItem.cpp      |  20 --
 26 files changed, 76 insertions(+), 945 deletions(-)
 delete mode 100644 GUI/coregui/Models/ParticleDistributionItem.cpp
 delete mode 100644 GUI/coregui/Models/ParticleDistributionItem.h
 delete mode 100644 GUI/coregui/Views/SampleDesigner/ParticleDistributionView.cpp
 delete mode 100644 GUI/coregui/Views/SampleDesigner/ParticleDistributionView.h
 delete mode 100644 Tests/UnitTests/GUI/TestParticleDistributionItem.cpp

diff --git a/GUI/coregui/Models/DomainObjectBuilder.cpp b/GUI/coregui/Models/DomainObjectBuilder.cpp
index 059d7ac0179..c9ff0fd72de 100644
--- a/GUI/coregui/Models/DomainObjectBuilder.cpp
+++ b/GUI/coregui/Models/DomainObjectBuilder.cpp
@@ -22,7 +22,6 @@
 #include "GUI/coregui/Models/InstrumentItems.h"
 #include "GUI/coregui/Models/InterferenceFunctionItems.h"
 #include "GUI/coregui/Models/LayerItem.h"
-#include "GUI/coregui/Models/ParticleDistributionItem.h"
 #include "GUI/coregui/Models/ParticleLayoutItem.h"
 #include "GUI/coregui/Models/SpecularBeamInclinationItem.h"
 #include "GUI/coregui/Models/TransformToDomain.h"
@@ -73,35 +72,9 @@ std::unique_ptr<ParticleLayout> DomainObjectBuilder::buildParticleLayout(const S
             P_layout->addParticle(*P_particle);
             continue;
         }
-        if (children[i]->modelType() == "ParticleDistribution") {
-            auto prop = children[i]
-                            ->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
-                            .value<ComboProperty>();
-            QString par_name = prop.getValue();
-            if (par_name == ParticleDistributionItem::NO_SELECTION) {
-                auto grandchildren = children[i]->getItems();
-                if (grandchildren.empty()) {
-                    continue;
-                }
-                if (grandchildren.size() > 1) {
-                    throw GUIHelpers::Error("DomainObjectBuilder::buildParticleLayout()"
-                                            " -> Error! Too many particles defined"
-                                            " in ParticleDistribution");
-                }
-                auto P_particle = TransformToDomain::createIParticle(*grandchildren[0]);
-                if (P_particle) {
-                    P_layout->addParticle(*P_particle);
-                }
-            } else {
-                auto P_part_distr = TransformToDomain::createParticleDistribution(*children[i]);
-                if (P_part_distr) {
-                    P_layout->addParticle(*P_part_distr);
-                }
-            }
-        } else {
-            throw GUIHelpers::Error("DomainObjectBuilder::buildParticleLayout()"
-                                    " -> Error! Not implemented");
-        }
+
+        throw GUIHelpers::Error("DomainObjectBuilder::buildParticleLayout()"
+                                " -> Error! Not implemented");
     }
     QVector<SessionItem*> interferences = item.getItems(ParticleLayoutItem::T_INTERFERENCE);
     for (int i = 0; i < interferences.size(); i++) {
diff --git a/GUI/coregui/Models/GUIDomainSampleVisitor.cpp b/GUI/coregui/Models/GUIDomainSampleVisitor.cpp
index 7e5b309bc67..8ed1d92f13b 100644
--- a/GUI/coregui/Models/GUIDomainSampleVisitor.cpp
+++ b/GUI/coregui/Models/GUIDomainSampleVisitor.cpp
@@ -22,7 +22,6 @@
 #include "GUI/coregui/Models/MesoCrystalItem.h"
 #include "GUI/coregui/Models/MultiLayerItem.h"
 #include "GUI/coregui/Models/ParticleCoreShellItem.h"
-#include "GUI/coregui/Models/ParticleDistributionItem.h"
 #include "GUI/coregui/Models/ParticleItem.h"
 #include "GUI/coregui/Models/ParticleLayoutItem.h"
 #include "GUI/coregui/Models/RotationItems.h"
@@ -141,15 +140,8 @@ void GUIDomainSampleVisitor::visit(const Particle* sample)
 
 void GUIDomainSampleVisitor::visit(const ParticleDistribution* sample)
 {
-    SessionItem* layout_item = m_levelToParentItem[depth() - 1];
-    ASSERT(layout_item);
-    auto particle_distribution_item =
-        m_sampleModel->insertItem<ParticleDistributionItem>(layout_item);
-
-    TransformFromDomain::setParticleDistributionItem(particle_distribution_item, *sample);
-
-    m_levelToParentItem[depth()] = particle_distribution_item;
-    m_itemToSample[particle_distribution_item] = sample;
+    throw std::runtime_error("ParticleDistribution is not present in GUI any more. Visit/Transformation not possible.");
+    // #baRemoveParticleDistribution + This method has to be removed, when ParticleDistribution is removed also in domain/core
 }
 
 void GUIDomainSampleVisitor::visit(const ParticleCoreShell* sample)
diff --git a/GUI/coregui/Models/GUIExamplesFactory.cpp b/GUI/coregui/Models/GUIExamplesFactory.cpp
index fb2d727ac95..c328cefb80e 100644
--- a/GUI/coregui/Models/GUIExamplesFactory.cpp
+++ b/GUI/coregui/Models/GUIExamplesFactory.cpp
@@ -1,72 +1,70 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/coregui/Models/GUIExamplesFactory.cpp
-//! @brief     Implements class GUIExamplesFactory
-//!
-//! @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/coregui/Models/GUIExamplesFactory.h"
-#include "GUI/coregui/Models/GUIObjectBuilder.h"
-#include "Sample/Multilayer/MultiLayer.h"
-#include "Sample/StandardSamples/SampleBuilderFactory.h"
-#include <memory>
-
-//! Defines correspondence between example name and real name of simulation from SimulationFactory
-QMap<QString, QString> init_NameToRegistry()
-{
-    QMap<QString, QString> result;
-    result["example01"] = "CylindersAndPrismsBuilder";
-    result["example02"] = "RadialParaCrystalBuilder";
-    result["example03"] = "HexParaCrystalBuilder";
-    result["example04"] = "CoreShellParticleBuilder";
-    result["example05"] = "MultiLayerWithRoughnessBuilder";
-    result["example06"] = "SquareLattice2DBuilder";
-    result["example07"] = "RotatedPyramidsBuilder";
-    result["example08"] = "CylindersWithSizeDistributionBuilder";
-    result["example09"] = "ParticleCompositionBuilder";
-    result["example10"] = "MesoCrystalBuilder";
-
-    // temporary for testing
-    // result["example09"] = "MultipleLayoutBuilder";
-    // result["example09"] = "TwoTypesCylindersDistributionBuilder";
-    // result["example09"] = "RectParaCrystalBuilder";
-    // result["example09"] = "SizeDistributionLMAModelBuilder";
-    // result["example09"] = "CylindersInSSCABuilder";
-    // result["example09"] = "TransformBoxBuilder";
-    // result["example09"] = "BoxCompositionRotateZandYBuilder";
-    // result["example09"] = "CoreShellBoxRotateZandYBuilder";
-    // result["example09"] = "BoxStackCompositionBuilder";
-    // result["example09"] = "CylindersWithSizeDistributionBuilder";
-    // result["example09"] = "LargeCylindersInDWBABuilder";
-    // result["example09"] = "SlicedCompositionBuilder";
-    // result["example09"] = "RotatedPyramidsDistributionBuilder";
-    // result["example09"] = "SpheresWithLimitsDistributionBuilder";
-    // result["example09"] = "ConesWithLimitsDistributionBuilder";
-    return result;
-}
-
-QMap<QString, QString> GUIExamplesFactory::m_name_to_registry = init_NameToRegistry();
-
-bool GUIExamplesFactory::isValidExampleName(const QString& name)
-{
-    return m_name_to_registry.contains(name);
-}
-
-//! Populate sample model with
-SessionItem* GUIExamplesFactory::createSampleItems(const QString& name, SampleModel* sampleModel,
-                                                   MaterialModel* materialModel)
-{
-    QString exampleName = m_name_to_registry[name];
-
-    SampleBuilderFactory factory;
-    const std::unique_ptr<MultiLayer> sample(factory.createSampleByName(exampleName.toStdString()));
-
-    return GUIObjectBuilder::populateSampleModel(sampleModel, materialModel, *sample.get(), name);
-}
+//  ************************************************************************************************
+//
+//  BornAgain: simulate and fit reflection and scattering
+//
+//! @file      GUI/coregui/Models/GUIExamplesFactory.cpp
+//! @brief     Implements class GUIExamplesFactory
+//!
+//! @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/coregui/Models/GUIExamplesFactory.h"
+#include "GUI/coregui/Models/GUIObjectBuilder.h"
+#include "Sample/Multilayer/MultiLayer.h"
+#include "Sample/StandardSamples/SampleBuilderFactory.h"
+#include <memory>
+
+//! Defines correspondence between example name and real name of simulation from SimulationFactory
+QMap<QString, QString> init_NameToRegistry()
+{
+    QMap<QString, QString> result;
+    result["example01"] = "CylindersAndPrismsBuilder";
+    result["example02"] = "RadialParaCrystalBuilder";
+    result["example03"] = "HexParaCrystalBuilder";
+    result["example04"] = "CoreShellParticleBuilder";
+    result["example05"] = "MultiLayerWithRoughnessBuilder";
+    result["example06"] = "SquareLattice2DBuilder";
+    result["example07"] = "RotatedPyramidsBuilder";
+    result["example09"] = "ParticleCompositionBuilder";
+    result["example10"] = "MesoCrystalBuilder";
+
+    // temporary for testing
+    // result["example09"] = "MultipleLayoutBuilder";
+    // result["example09"] = "TwoTypesCylindersDistributionBuilder";
+    // result["example09"] = "RectParaCrystalBuilder";
+    // result["example09"] = "SizeDistributionLMAModelBuilder";
+    // result["example09"] = "CylindersInSSCABuilder";
+    // result["example09"] = "TransformBoxBuilder";
+    // result["example09"] = "BoxCompositionRotateZandYBuilder";
+    // result["example09"] = "CoreShellBoxRotateZandYBuilder";
+    // result["example09"] = "BoxStackCompositionBuilder";
+    // result["example09"] = "LargeCylindersInDWBABuilder";
+    // result["example09"] = "SlicedCompositionBuilder";
+    // result["example09"] = "RotatedPyramidsDistributionBuilder";
+    // result["example09"] = "SpheresWithLimitsDistributionBuilder";
+    // result["example09"] = "ConesWithLimitsDistributionBuilder";
+    return result;
+}
+
+QMap<QString, QString> GUIExamplesFactory::m_name_to_registry = init_NameToRegistry();
+
+bool GUIExamplesFactory::isValidExampleName(const QString& name)
+{
+    return m_name_to_registry.contains(name);
+}
+
+//! Populate sample model with
+SessionItem* GUIExamplesFactory::createSampleItems(const QString& name, SampleModel* sampleModel,
+                                                   MaterialModel* materialModel)
+{
+    QString exampleName = m_name_to_registry[name];
+
+    SampleBuilderFactory factory;
+    const std::unique_ptr<MultiLayer> sample(factory.createSampleByName(exampleName.toStdString()));
+
+    return GUIObjectBuilder::populateSampleModel(sampleModel, materialModel, *sample.get(), name);
+}
diff --git a/GUI/coregui/Models/ItemCatalog.cpp b/GUI/coregui/Models/ItemCatalog.cpp
index 96e0cbc2460..91829079be1 100644
--- a/GUI/coregui/Models/ItemCatalog.cpp
+++ b/GUI/coregui/Models/ItemCatalog.cpp
@@ -43,7 +43,6 @@
 #include "GUI/coregui/Models/ParameterTreeItems.h"
 #include "GUI/coregui/Models/ParticleCompositionItem.h"
 #include "GUI/coregui/Models/ParticleCoreShellItem.h"
-#include "GUI/coregui/Models/ParticleDistributionItem.h"
 #include "GUI/coregui/Models/ParticleItem.h"
 #include "GUI/coregui/Models/ParticleLayoutItem.h"
 #include "GUI/coregui/Models/PointwiseAxisItem.h"
@@ -71,7 +70,6 @@ ItemCatalog::ItemCatalog()
     add("Rotation", create_new<TransformationItem>);
     add("ParticleCoreShell", create_new<ParticleCoreShellItem>);
     add("ParticleComposition", create_new<ParticleCompositionItem>);
-    add("ParticleDistribution", create_new<ParticleDistributionItem>);
     add("MesoCrystal", create_new<MesoCrystalItem>);
     add("Interference1DLattice", create_new<InterferenceFunction1DLatticeItem>);
     add("Interference2DLattice", create_new<InterferenceFunction2DLatticeItem>);
@@ -258,7 +256,6 @@ QStringList ItemCatalog::validTopItemTypes()
             "ParticleCoreShell",
             "ParticleComposition",
             "MesoCrystal",
-            "ParticleDistribution",
             "Rotation",
             "Interference1DLattice",
             "Interference2DLattice",
diff --git a/GUI/coregui/Models/ParticleDistributionItem.cpp b/GUI/coregui/Models/ParticleDistributionItem.cpp
deleted file mode 100644
index 176c154a10a..00000000000
--- a/GUI/coregui/Models/ParticleDistributionItem.cpp
+++ /dev/null
@@ -1,223 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/coregui/Models/ParticleDistributionItem.cpp
-//! @brief     Implements class ParticleDistributionItem
-//!
-//! @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/coregui/Models/ParticleDistributionItem.h"
-#include "Base/Const/Units.h"
-#include "GUI/coregui/Models/ComboProperty.h"
-#include "GUI/coregui/Models/DistributionItems.h"
-#include "GUI/coregui/Models/ParameterTreeUtils.h"
-#include "GUI/coregui/Models/ParticleItem.h"
-#include "GUI/coregui/Models/RealLimitsItems.h"
-#include "GUI/coregui/Models/TransformFromDomain.h"
-#include "GUI/coregui/Models/TransformToDomain.h"
-#include "GUI/coregui/utils/GUIHelpers.h"
-#include "Param/Varia/ParameterUtils.h"
-
-namespace {
-const QString abundance_tooltip = "Proportion of this type of particles normalized to the \n"
-                                  "total number of particles in the layout";
-}
-
-const QString ParticleDistributionItem::P_DISTRIBUTED_PARAMETER = "Distributed parameter";
-const QString ParticleDistributionItem::P_LINKED_PARAMETER = "Linked parameter";
-const QString ParticleDistributionItem::P_DISTRIBUTION = "Distribution";
-const QString ParticleDistributionItem::NO_SELECTION = "None";
-const QString ParticleDistributionItem::T_PARTICLES = "Particle Tag";
-
-ParticleDistributionItem::ParticleDistributionItem() : SessionGraphicsItem("ParticleDistribution")
-{
-    setToolTip("Collection of particles obtained via parametric distribution "
-               "of particle prototype");
-
-    addProperty(ParticleItem::P_ABUNDANCE, 1.0)
-        ->setLimits(RealLimits::limited(0.0, 1.0))
-        .setDecimals(3)
-        .setToolTip(abundance_tooltip);
-
-    addGroupProperty(P_DISTRIBUTION, "Distribution group")
-        ->setToolTip("Distribution to apply to the specified parameter");
-
-    registerTag(T_PARTICLES, 0, 1,
-                QStringList() << "Particle"
-                              << "ParticleCoreShell"
-                              << "ParticleComposition"
-                              << "MesoCrystal");
-    setDefaultTag(T_PARTICLES);
-
-    ComboProperty par_prop;
-    addProperty(P_DISTRIBUTED_PARAMETER, par_prop.variant())->setToolTip("Parameter to distribute");
-
-    addProperty(P_LINKED_PARAMETER, par_prop.variant())
-        ->setToolTip("Linked parameter")
-        .setEditorType("MultiSelectionComboEditor");
-
-    updateMainParameterList();
-
-    mapper()->setOnAnyChildChange([this](SessionItem* item) {
-        // prevent infinit loop when item changes its own properties
-        if (item && item->modelType() == "Property" && item->parent() == this)
-            return;
-        updateMainParameterList();
-    });
-
-    mapper()->setOnPropertyChange([this](const QString& name) {
-        if (name == P_DISTRIBUTED_PARAMETER)
-            updateLinkedParameterList();
-    });
-}
-
-std::unique_ptr<ParticleDistribution> ParticleDistributionItem::createParticleDistribution() const
-{
-    if (children().empty())
-        return nullptr;
-    std::unique_ptr<IParticle> P_particle = TransformToDomain::createIParticle(*getItem());
-    if (!P_particle)
-        throw GUIHelpers::Error("DomainObjectBuilder::buildParticleDistribution()"
-                                " -> Error! No correct particle defined");
-    auto& distr_item = groupItem<DistributionItem>(ParticleDistributionItem::P_DISTRIBUTION);
-
-    std::string domain_par = domainMainParameter();
-
-    double scale = ParameterUtils::isAngleRelated(domain_par) ? Units::deg : 1.0;
-    auto P_distribution = distr_item.createDistribution(scale);
-
-    RealLimits limits = RealLimits::limitless();
-    if (distr_item.isTag(DistributionItem::P_LIMITS)) {
-        auto& limitsItem = distr_item.groupItem<RealLimitsItem>(DistributionItem::P_LIMITS);
-        limits = limitsItem.createRealLimits(scale);
-    }
-
-    int nbr_samples = distr_item.getItemValue(DistributionItem::P_NUMBER_OF_SAMPLES).toInt();
-    double sigma_factor = distr_item.isTag(DistributionItem::P_SIGMA_FACTOR)
-                              ? distr_item.getItemValue(DistributionItem::P_SIGMA_FACTOR).toDouble()
-                              : 0.0;
-    ParameterDistribution par_distr(domain_par, *P_distribution, static_cast<size_t>(nbr_samples),
-                                    sigma_factor, limits);
-
-    for (auto name : domainLinkedParameters())
-        par_distr.linkParameter(name);
-
-    auto result = std::make_unique<ParticleDistribution>(*P_particle, par_distr);
-    double abundance = getItemValue(ParticleItem::P_ABUNDANCE).toDouble();
-    result->setAbundance(abundance);
-    return result;
-}
-
-void ParticleDistributionItem::setDomainCacheNames(const QString& name, const QStringList& linked)
-{
-    m_domain_cache_name = name;
-    m_linked_names = linked;
-}
-
-void ParticleDistributionItem::updateMainParameterList()
-{
-    if (!isTag(P_DISTRIBUTED_PARAMETER))
-        return;
-
-    QString currentValue = getItemValue(P_DISTRIBUTED_PARAMETER).value<ComboProperty>().getValue();
-
-    if (!m_domain_cache_name.isEmpty() && childParticle()) {
-        QString guiName = translateParameterNameToGUI(m_domain_cache_name);
-        if (!guiName.isEmpty()) { // might be empty because item was not fully constructed yet
-            currentValue = guiName;
-            m_domain_cache_name.clear();
-        }
-    }
-
-    QStringList par_names = QStringList() << NO_SELECTION << childParameterNames();
-    ComboProperty newProp = ComboProperty::fromList(par_names, NO_SELECTION);
-
-    if (newProp.getValues().contains(currentValue))
-        newProp.setValue(currentValue);
-
-    setItemValue(P_DISTRIBUTED_PARAMETER, newProp.variant());
-}
-
-void ParticleDistributionItem::updateLinkedParameterList()
-{
-    if (!isTag(P_LINKED_PARAMETER) || !isTag(P_DISTRIBUTED_PARAMETER))
-        return;
-
-    QString mainValue = getItemValue(P_DISTRIBUTED_PARAMETER).value<ComboProperty>().getValue();
-
-    QStringList par_names = childParameterNames();
-    par_names.removeAll(mainValue);
-
-    ComboProperty linkedProp = getItemValue(P_LINKED_PARAMETER).value<ComboProperty>();
-    QStringList currentValues = linkedProp.selectedValues();
-
-    if (!m_linked_names.isEmpty() && childParticle()) {
-        QStringList domainValues;
-        for (auto par : m_linked_names) {
-            QString guiName = translateParameterNameToGUI(par);
-            if (!guiName.isEmpty())
-                domainValues.append(guiName);
-        }
-        if (!domainValues.isEmpty()) {
-            currentValues = domainValues;
-            m_linked_names.clear();
-        }
-    }
-
-    ComboProperty newProp = ComboProperty::fromList(par_names);
-    for (auto name : currentValues)
-        newProp.setSelected(name, true);
-
-    setItemValue(P_LINKED_PARAMETER, newProp.variant());
-}
-
-QStringList ParticleDistributionItem::childParameterNames() const
-{
-    if (auto child = childParticle()) {
-        auto result = ParameterTreeUtils::parameterTreeNames(child);
-        result.removeAll(ParticleItem::P_ABUNDANCE);
-        return result;
-    }
-
-    return {};
-}
-
-QString ParticleDistributionItem::translateParameterNameToGUI(const QString& domainName)
-{
-    if (auto child = childParticle())
-        return ParameterTreeUtils::domainNameToParameterName(domainName, child);
-    return {};
-}
-
-const SessionItem* ParticleDistributionItem::childParticle() const
-{
-    if (getItems(T_PARTICLES).empty())
-        return nullptr;
-
-    ASSERT(getItems(T_PARTICLES).size() == 1);
-    return getItems(T_PARTICLES).front();
-}
-
-std::string ParticleDistributionItem::domainMainParameter() const
-{
-    auto par_name = getItemValue(P_DISTRIBUTED_PARAMETER).value<ComboProperty>().getValue();
-    return ParameterTreeUtils::parameterNameToDomainName(par_name, childParticle()).toStdString();
-}
-
-std::vector<std::string> ParticleDistributionItem::domainLinkedParameters() const
-{
-    std::vector<std::string> result;
-    auto linked_names = getItemValue(P_LINKED_PARAMETER).value<ComboProperty>().selectedValues();
-    for (auto name : linked_names) {
-        auto translated = ParameterTreeUtils::parameterNameToDomainName(name, childParticle());
-        if (!translated.isEmpty())
-            result.push_back(translated.toStdString());
-    }
-    return result;
-}
diff --git a/GUI/coregui/Models/ParticleDistributionItem.h b/GUI/coregui/Models/ParticleDistributionItem.h
deleted file mode 100644
index d538da68a2f..00000000000
--- a/GUI/coregui/Models/ParticleDistributionItem.h
+++ /dev/null
@@ -1,50 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/coregui/Models/ParticleDistributionItem.h
-//! @brief     Defines class ParticleDistributionItem
-//!
-//! @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_COREGUI_MODELS_PARTICLEDISTRIBUTIONITEM_H
-#define BORNAGAIN_GUI_COREGUI_MODELS_PARTICLEDISTRIBUTIONITEM_H
-
-#include "GUI/coregui/Models/SessionGraphicsItem.h"
-#include "Sample/Particle/ParticleDistribution.h"
-#include <string>
-#include <vector>
-
-class BA_CORE_API_ ParticleDistributionItem : public SessionGraphicsItem {
-public:
-    static const QString P_DISTRIBUTED_PARAMETER;
-    static const QString P_LINKED_PARAMETER;
-    static const QString P_DISTRIBUTION;
-    static const QString NO_SELECTION;
-    static const QString T_PARTICLES;
-    ParticleDistributionItem();
-
-    std::unique_ptr<ParticleDistribution> createParticleDistribution() const;
-
-    void setDomainCacheNames(const QString& name, const QStringList& linked);
-
-private:
-    void updateMainParameterList();
-    void updateLinkedParameterList();
-    QStringList childParameterNames() const;
-    QString translateParameterNameToGUI(const QString& domainName);
-    const SessionItem* childParticle() const;
-
-    std::string domainMainParameter() const;
-    std::vector<std::string> domainLinkedParameters() const;
-
-    QString m_domain_cache_name;
-    QStringList m_linked_names;
-};
-
-#endif // BORNAGAIN_GUI_COREGUI_MODELS_PARTICLEDISTRIBUTIONITEM_H
diff --git a/GUI/coregui/Models/SampleValidator.cpp b/GUI/coregui/Models/SampleValidator.cpp
index e5c328d0c64..bfe3fa4b9d2 100644
--- a/GUI/coregui/Models/SampleValidator.cpp
+++ b/GUI/coregui/Models/SampleValidator.cpp
@@ -17,7 +17,6 @@
 #include "GUI/coregui/Models/MultiLayerItem.h"
 #include "GUI/coregui/Models/ParticleCompositionItem.h"
 #include "GUI/coregui/Models/ParticleCoreShellItem.h"
-#include "GUI/coregui/Models/ParticleDistributionItem.h"
 #include "GUI/coregui/Models/ParticleLayoutItem.h"
 
 SampleValidator::SampleValidator() : m_valid_sample(true) {}
@@ -51,8 +50,6 @@ void SampleValidator::validateItem(const SessionItem* item)
         diagnosis = validateParticleCoreShellItem(item);
     } else if (item->modelType() == "ParticleComposition") {
         diagnosis = validateParticleCompositionItem(item);
-    } else if (item->modelType() == "ParticleDistribution") {
-        diagnosis = validateParticleDistributionItem(item);
     }
     if (!diagnosis.isEmpty()) {
         m_valid_sample = false;
@@ -109,15 +106,6 @@ QString SampleValidator::validateParticleCompositionItem(const SessionItem* item
     return result;
 }
 
-QString SampleValidator::validateParticleDistributionItem(const SessionItem* item)
-{
-    QString result;
-    if (item->getItems(ParticleDistributionItem::T_PARTICLES).isEmpty())
-        result = "ParticleDistribution doesn't have any particle.";
-
-    return result;
-}
-
 bool SampleValidator::isValidMultiLayer(const MultiLayerItem* multilayer)
 {
     initValidator();
diff --git a/GUI/coregui/Models/SampleValidator.h b/GUI/coregui/Models/SampleValidator.h
index 5c9ebe8db81..589a1d75768 100644
--- a/GUI/coregui/Models/SampleValidator.h
+++ b/GUI/coregui/Models/SampleValidator.h
@@ -39,7 +39,6 @@ private:
     QString validateParticleLayoutItem(const SessionItem* item);
     QString validateParticleCoreShellItem(const SessionItem* item);
     QString validateParticleCompositionItem(const SessionItem* item);
-    QString validateParticleDistributionItem(const SessionItem* item);
 
     bool m_valid_sample;
     QString m_validation_message;
diff --git a/GUI/coregui/Models/SessionItemUtils.cpp b/GUI/coregui/Models/SessionItemUtils.cpp
index 44a4b3411f4..ddbe86bb757 100644
--- a/GUI/coregui/Models/SessionItemUtils.cpp
+++ b/GUI/coregui/Models/SessionItemUtils.cpp
@@ -34,7 +34,6 @@ QStringList parents_with_abundance()
 {
     return QStringList() << "ParticleCoreShell"
                          << "ParticleComposition"
-                         << "ParticleDistribution"
                          << "MesoCrystal";
 }
 
diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp
index fbd3dbb7775..8684ac9b963 100644
--- a/GUI/coregui/Models/TransformFromDomain.cpp
+++ b/GUI/coregui/Models/TransformFromDomain.cpp
@@ -44,7 +44,6 @@
 #include "GUI/coregui/Models/LayerItem.h"
 #include "GUI/coregui/Models/LayerRoughnessItems.h"
 #include "GUI/coregui/Models/MaskItems.h"
-#include "GUI/coregui/Models/ParticleDistributionItem.h"
 #include "GUI/coregui/Models/ParticleItem.h"
 #include "GUI/coregui/Models/RectangularDetectorItem.h"
 #include "GUI/coregui/Models/ResolutionFunctionItems.h"
@@ -199,29 +198,6 @@ void TransformFromDomain::setRoughnessItem(SessionItem* item, const LayerRoughne
                        sample.getLatteralCorrLength());
 }
 
-//! Initialization of ParticleDistributionItem
-void TransformFromDomain::setParticleDistributionItem(SessionItem* item,
-                                                      const ParticleDistribution& sample)
-{
-    ParticleDistributionItem* distItem = dynamic_cast<ParticleDistributionItem*>(item);
-    ASSERT(distItem);
-
-    distItem->setItemValue(ParticleItem::P_ABUNDANCE, sample.abundance());
-
-    ParameterDistribution par_distr = sample.parameterDistribution();
-    QString main_distr_par_name = QString::fromStdString(par_distr.getMainParameterName());
-    QStringList linked_pars = GUIHelpers::fromStdStrings(par_distr.getLinkedParameterNames());
-
-    distItem->setDomainCacheNames(main_distr_par_name, linked_pars);
-
-    double unit_factor(1.0);
-    if (sample.mainUnits() == "rad")
-        unit_factor = 1. / Units::deg;
-
-    QString group_name = ParticleDistributionItem::P_DISTRIBUTION;
-    setDistribution(distItem, par_distr, group_name, unit_factor);
-}
-
 //! Returns true if given roughness is non-zero roughness
 bool TransformFromDomain::isValidRoughness(const LayerRoughness* roughness)
 {
diff --git a/GUI/coregui/Models/TransformFromDomain.h b/GUI/coregui/Models/TransformFromDomain.h
index 0459e025366..1f2f8a10870 100644
--- a/GUI/coregui/Models/TransformFromDomain.h
+++ b/GUI/coregui/Models/TransformFromDomain.h
@@ -68,8 +68,6 @@ void setLayerItem(SessionItem* layer_item, const Layer* layer, const LayerInterf
 
 void setRoughnessItem(SessionItem* item, const LayerRoughness& sample);
 
-void setParticleDistributionItem(SessionItem* item, const ParticleDistribution& sample);
-
 bool isValidRoughness(const LayerRoughness* roughness);
 
 void setGISASBeamItem(BeamItem* beam_item, const GISASSimulation& simulation);
diff --git a/GUI/coregui/Models/TransformToDomain.cpp b/GUI/coregui/Models/TransformToDomain.cpp
index 727bcb8c302..1b8aa5f54ed 100644
--- a/GUI/coregui/Models/TransformToDomain.cpp
+++ b/GUI/coregui/Models/TransformToDomain.cpp
@@ -33,7 +33,6 @@
 #include "GUI/coregui/Models/MultiLayerItem.h"
 #include "GUI/coregui/Models/ParticleCompositionItem.h"
 #include "GUI/coregui/Models/ParticleCoreShellItem.h"
-#include "GUI/coregui/Models/ParticleDistributionItem.h"
 #include "GUI/coregui/Models/ParticleItem.h"
 #include "GUI/coregui/Models/ParticleLayoutItem.h"
 #include "GUI/coregui/Models/RectangularDetectorItem.h"
@@ -135,14 +134,6 @@ std::unique_ptr<IParticle> TransformToDomain::createIParticle(const SessionItem&
     return P_particle;
 }
 
-std::unique_ptr<ParticleDistribution>
-TransformToDomain::createParticleDistribution(const SessionItem& item)
-{
-    auto& particle_distribution = static_cast<const ParticleDistributionItem&>(item);
-    auto P_part_distr = particle_distribution.createParticleDistribution();
-    return P_part_distr;
-}
-
 //! adds DistributionParameters to the ISimulation
 void TransformToDomain::addDistributionParametersToSimulation(const SessionItem& beam_item,
                                                               GISASSimulation& simulation)
diff --git a/GUI/coregui/Models/TransformToDomain.h b/GUI/coregui/Models/TransformToDomain.h
index 4be2ec678b1..be3b3400198 100644
--- a/GUI/coregui/Models/TransformToDomain.h
+++ b/GUI/coregui/Models/TransformToDomain.h
@@ -40,7 +40,6 @@ std::unique_ptr<IParticle> createIParticle(const SessionItem& item);
 std::unique_ptr<Layer> createLayer(const SessionItem& item);
 std::unique_ptr<LayerRoughness> createLayerRoughness(const SessionItem& item);
 std::unique_ptr<MultiLayer> createMultiLayer(const SessionItem& item);
-std::unique_ptr<ParticleDistribution> createParticleDistribution(const SessionItem& item);
 std::unique_ptr<ParticleLayout> createParticleLayout(const SessionItem& item);
 
 void addDistributionParametersToSimulation(const SessionItem& beam_item,
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialItemUtils.cpp b/GUI/coregui/Views/MaterialEditor/MaterialItemUtils.cpp
index c2902c2331d..bfd2524af72 100644
--- a/GUI/coregui/Views/MaterialEditor/MaterialItemUtils.cpp
+++ b/GUI/coregui/Views/MaterialEditor/MaterialItemUtils.cpp
@@ -21,7 +21,6 @@
 #include "GUI/coregui/Models/MesoCrystalItem.h"
 #include "GUI/coregui/Models/ParticleCompositionItem.h"
 #include "GUI/coregui/Models/ParticleCoreShellItem.h"
-#include "GUI/coregui/Models/ParticleDistributionItem.h"
 #include "GUI/coregui/Models/ParticleItem.h"
 #include "GUI/coregui/Models/ParticleLayoutItem.h"
 #include "GUI/coregui/Views/MaterialEditor/MaterialEditorDialog.h"
@@ -38,7 +37,6 @@ std::map<QString, QString> get_tag_map()
 {
     std::map<QString, QString> result = {
         {"ParticleComposition", ParticleCompositionItem::T_PARTICLES},
-        {"ParticleDistribution", ParticleDistributionItem::T_PARTICLES},
         {"ParticleLayout", ParticleLayoutItem::T_PARTICLES},
         {"MesoCrystal", MesoCrystalItem::T_BASIS_PARTICLE}};
     return result;
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilder.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilder.cpp
index 07d2472f90f..c269d1a80a6 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilder.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilder.cpp
@@ -21,7 +21,6 @@
 #include "GUI/coregui/Models/MultiLayerItem.h"
 #include "GUI/coregui/Models/ParticleCompositionItem.h"
 #include "GUI/coregui/Models/ParticleCoreShellItem.h"
-#include "GUI/coregui/Models/ParticleDistributionItem.h"
 #include "GUI/coregui/Models/ParticleItem.h"
 #include "GUI/coregui/Models/ParticleLayoutItem.h"
 #include "GUI/coregui/Models/VectorItem.h"
@@ -71,9 +70,6 @@ void RealSpaceBuilder::populate(RealSpaceModel* model, const SessionItem& item,
     else if (item.modelType() == "ParticleCoreShell")
         populateParticleFromParticleItem(model, item);
 
-    else if (item.modelType() == "ParticleDistribution")
-        populateParticleFromParticleItem(model, item);
-
     else if (item.modelType() == "MesoCrystal")
         populateParticleFromParticleItem(model, item);
 }
@@ -158,13 +154,6 @@ void RealSpaceBuilder::populateParticleFromParticleItem(RealSpaceModel* model,
         auto particleComposition = particleCompositionItem->createParticleComposition();
         particle3DContainer =
             RealSpaceBuilderUtils::particleComposition3DContainer(*particleComposition);
-    } else if (particleItem.modelType() == "ParticleDistribution") {
-        auto particleDistributionItem =
-            dynamic_cast<const ParticleDistributionItem*>(&particleItem);
-        // If there is no particle to populate inside ParticleDistributionItem
-        if (!particleDistributionItem->getItem(ParticleDistributionItem::T_PARTICLES))
-            return;
-        // show nothing when ParticleDistributionItem is selected
     } else if (particleItem.modelType() == "MesoCrystal") {
         auto mesoCrystalItem = dynamic_cast<const MesoCrystalItem*>(&particleItem);
         // If there is no particle to populate inside MesoCrystalItem
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
index a85e8d4ad4e..638db6f3bab 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
@@ -23,7 +23,6 @@
 #include "GUI/coregui/Models/MultiLayerItem.h"
 #include "GUI/coregui/Models/ParticleCompositionItem.h"
 #include "GUI/coregui/Models/ParticleCoreShellItem.h"
-#include "GUI/coregui/Models/ParticleDistributionItem.h"
 #include "GUI/coregui/Models/ParticleItem.h"
 #include "GUI/coregui/Models/ParticleLayoutItem.h"
 #include "GUI/coregui/Models/RotationItems.h"
@@ -248,21 +247,6 @@ RealSpaceBuilderUtils::particle3DContainerVector(const SessionItem& layoutItem,
             auto particleComposition = particleCompositionItem->createParticleComposition();
             particle3DContainer =
                 particleComposition3DContainer(*particleComposition, total_abundance, origin);
-        } else if (particleItem->modelType() == "ParticleDistribution") {
-            auto particleDistributionItem =
-                dynamic_cast<const ParticleDistributionItem*>(particleItem);
-            // If there is no particle to populate inside ParticleDistributionItem
-            if (!particleDistributionItem->getItem(ParticleDistributionItem::T_PARTICLES))
-                continue;
-            auto particleDistribution = particleDistributionItem->createParticleDistribution();
-            std::vector<Particle3DContainer> pd_ContainerVector =
-                particleDistribution3DContainer(*particleDistribution, total_abundance, origin);
-            for (size_t i = 0; i < pd_ContainerVector.size(); ++i) {
-                cumulative_abundance += pd_ContainerVector[i].cumulativeAbundance();
-                pd_ContainerVector[i].setCumulativeAbundance(cumulative_abundance);
-                particle3DContainer_vector.emplace_back(std::move(pd_ContainerVector[i]));
-            }
-            continue;
         } else if (particleItem->modelType() == "MesoCrystal") {
             auto mesoCrystalItem = dynamic_cast<const MesoCrystalItem*>(particleItem);
             // If there is no particle to populate inside MesoCrystalItem
@@ -379,40 +363,6 @@ Particle3DContainer RealSpaceBuilderUtils::particleComposition3DContainer(
     return particleComposition3DContainer;
 }
 
-std::vector<Particle3DContainer> RealSpaceBuilderUtils::particleDistribution3DContainer(
-    const ParticleDistribution& particleDistribution, double total_abundance,
-    const QVector3D& origin)
-{
-    auto pd_vector = particleDistribution.generateParticles();
-
-    std::vector<Particle3DContainer> particleDistribution3DContainer_vector;
-
-    for (auto pd_particle : pd_vector) {
-        Particle3DContainer particle3DContainer;
-        if (dynamic_cast<const ParticleComposition*>(pd_particle)) {
-            auto particleComposition = dynamic_cast<const ParticleComposition*>(pd_particle);
-            particle3DContainer =
-                particleComposition3DContainer(*particleComposition, total_abundance, origin);
-        } else if (dynamic_cast<const ParticleCoreShell*>(pd_particle)) {
-            auto particleCoreShell = dynamic_cast<const ParticleCoreShell*>(pd_particle);
-            particle3DContainer =
-                particleCoreShell3DContainer(*particleCoreShell, total_abundance, origin);
-        } else if (dynamic_cast<const MesoCrystal*>(pd_particle)) {
-            // TODO: Implement method to populate MesoCrystal from CORE and NOT from MesoCrystalItem
-            // as it is done currently in RealSpaceBuilderUtils::mesoCrystal3DContainer
-            std::ostringstream ostr;
-            ostr << "Sorry, MesoCrystal inside ParticleDistribution not yet implemented";
-            ostr << "\n\nStay tuned!";
-            throw std::runtime_error(ostr.str());
-        } else {
-            auto particle = dynamic_cast<const Particle*>(pd_particle);
-            particle3DContainer = singleParticle3DContainer(*particle, total_abundance, origin);
-        }
-        particleDistribution3DContainer_vector.emplace_back(std::move(particle3DContainer));
-    }
-    return particleDistribution3DContainer_vector;
-}
-
 Particle3DContainer
 RealSpaceBuilderUtils::mesoCrystal3DContainer(const MesoCrystalItem& mesoCrystalItem,
                                               double total_abundance, const QVector3D& origin)
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceMesoCrystalUtils.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceMesoCrystalUtils.cpp
index ae719eae22d..7357b3db188 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceMesoCrystalUtils.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceMesoCrystalUtils.cpp
@@ -18,7 +18,6 @@
 #include "GUI/coregui/Models/MesoCrystalItem.h"
 #include "GUI/coregui/Models/ParticleCompositionItem.h"
 #include "GUI/coregui/Models/ParticleCoreShellItem.h"
-#include "GUI/coregui/Models/ParticleDistributionItem.h"
 #include "GUI/coregui/Views/RealSpaceWidgets/Particle3DContainer.h"
 #include "GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.h"
 #include "GUI/coregui/Views/RealSpaceWidgets/TransformTo3D.h"
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerHelper.cpp b/GUI/coregui/Views/SampleDesigner/DesignerHelper.cpp
index 7994a1d5b66..dd9bccdb8ec 100644
--- a/GUI/coregui/Views/SampleDesigner/DesignerHelper.cpp
+++ b/GUI/coregui/Views/SampleDesigner/DesignerHelper.cpp
@@ -164,8 +164,7 @@ QRectF DesignerHelper::getDefaultBoundingRect(const QString& name)
         return getParticleLayoutBoundingRect();
     } else if (name == "Rotation") {
         return getTransformationBoundingRect();
-    } else if (name.startsWith("FormFactor") || name == "Particle" || name == "ParticleCoreShell"
-               || name == "ParticleDistribution") {
+    } else if (name.startsWith("FormFactor") || name == "Particle" || name == "ParticleCoreShell") {
         return getParticleBoundingRect();
     } else if (name.startsWith("Interference")) {
         return getInterferenceFunctionBoundingRect();
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleDistributionView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleDistributionView.cpp
deleted file mode 100644
index ad0a88f38b2..00000000000
--- a/GUI/coregui/Views/SampleDesigner/ParticleDistributionView.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/coregui/Views/SampleDesigner/ParticleDistributionView.cpp
-//! @brief     Implements class ParticleDistributionView
-//!
-//! @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/coregui/Views/SampleDesigner/ParticleDistributionView.h"
-#include "GUI/coregui/Models/SessionItem.h"
-#include "GUI/coregui/Views/SampleDesigner/DesignerHelper.h"
-#include "GUI/coregui/utils/StyleUtils.h"
-
-ParticleDistributionView::ParticleDistributionView(QGraphicsItem* parent) : ConnectableView(parent)
-{
-    setName("ParticleDistribution");
-    setColor(DesignerHelper::getDefaultParticleColor());
-    setRectangle(DesignerHelper::getDefaultBoundingRect("ParticleDistribution"));
-    addPort("out", NodeEditorPort::OUTPUT, NodeEditorPort::FORM_FACTOR)
-        ->setToolTip("Connect to the ParticleLayout");
-    addPort("particle", NodeEditorPort::INPUT, NodeEditorPort::FORM_FACTOR)
-        ->setToolTip("Connect particle to this port. It will be a prototype \n"
-                     "for parametric distribution.");
-
-    m_label_vspace = StyleUtils::SizeOfLetterM().height() * 3.0;
-}
-
-void ParticleDistributionView::addView(IView* childView, int /* row */)
-{
-    connectInputPort(dynamic_cast<ConnectableView*>(childView), 0);
-}
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleDistributionView.h b/GUI/coregui/Views/SampleDesigner/ParticleDistributionView.h
deleted file mode 100644
index 65c1bf738a5..00000000000
--- a/GUI/coregui/Views/SampleDesigner/ParticleDistributionView.h
+++ /dev/null
@@ -1,32 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/coregui/Views/SampleDesigner/ParticleDistributionView.h
-//! @brief     Defines class ParticleDistributionView
-//!
-//! @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_COREGUI_VIEWS_SAMPLEDESIGNER_PARTICLEDISTRIBUTIONVIEW_H
-#define BORNAGAIN_GUI_COREGUI_VIEWS_SAMPLEDESIGNER_PARTICLEDISTRIBUTIONVIEW_H
-
-#include "GUI/coregui/Views/SampleDesigner/ConnectableView.h"
-
-//! Class representing view of distributed particle item
-class ParticleDistributionView : public ConnectableView {
-    Q_OBJECT
-
-public:
-    ParticleDistributionView(QGraphicsItem* parent = 0);
-
-    int type() const { return ViewTypes::PARTICLE; }
-
-    void addView(IView* childView, int row = 0);
-};
-
-#endif // BORNAGAIN_GUI_COREGUI_VIEWS_SAMPLEDESIGNER_PARTICLEDISTRIBUTIONVIEW_H
diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp
index 88bc84ae98a..cf5d3243ab3 100644
--- a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp
+++ b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp
@@ -19,7 +19,6 @@
 #include "GUI/coregui/Views/SampleDesigner/MultiLayerView.h"
 #include "GUI/coregui/Views/SampleDesigner/ParticleCompositionView.h"
 #include "GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.h"
-#include "GUI/coregui/Views/SampleDesigner/ParticleDistributionView.h"
 #include "GUI/coregui/Views/SampleDesigner/ParticleLayoutView.h"
 #include "GUI/coregui/Views/SampleDesigner/ParticleView.h"
 #include "GUI/coregui/Views/SampleDesigner/TransformationView.h"
@@ -33,7 +32,6 @@ QStringList SampleViewFactory::m_valid_item_names = QStringList()
                                                     << "ParticleCoreShell"
                                                     << "ParticleComposition"
                                                     << "MesoCrystal"
-                                                    << "ParticleDistribution"
                                                     << "Interference1DLattice"
                                                     << "Interference2DLattice"
                                                     << "Interference2DParaCrystal"
@@ -68,8 +66,6 @@ IView* SampleViewFactory::createSampleView(const QString& name)
         return new ParticleCompositionView();
     } else if (name == "MesoCrystal") {
         return new MesoCrystalView();
-    } else if (name == "ParticleDistribution") {
-        return new ParticleDistributionView();
     } else if (name == "Interference1DLattice") {
         return new InterferenceFunction1DLatticeView();
     } else if (name == "Interference2DLattice") {
diff --git a/GUI/coregui/Views/widgetbox/widgetbox.xml b/GUI/coregui/Views/widgetbox/widgetbox.xml
index 547a765f26d..75ee6a016a0 100644
--- a/GUI/coregui/Views/widgetbox/widgetbox.xml
+++ b/GUI/coregui/Views/widgetbox/widgetbox.xml
@@ -432,14 +432,6 @@
             </widget>
         </categoryentry>
 
-        <categoryentry name="Cylinders with size distribution" icon="images/sample_layers2.png">
-            <widget class="example08">
-                <property name="objectName">
-                    <string notr="true">somestring</string>
-                </property>
-            </widget>
-        </categoryentry>
-
         <categoryentry name="Hexagonal lattice with basis" icon="images/sample_layers2.png">
             <widget class="example09">
                 <property name="objectName">
diff --git a/Tests/UnitTests/GUI/TestMapperCases.cpp b/Tests/UnitTests/GUI/TestMapperCases.cpp
index 520e2b4e4f4..8b089283e4b 100644
--- a/Tests/UnitTests/GUI/TestMapperCases.cpp
+++ b/Tests/UnitTests/GUI/TestMapperCases.cpp
@@ -3,7 +3,6 @@
 #include "GUI/coregui/Models/LayerItem.h"
 #include "GUI/coregui/Models/MultiLayerItem.h"
 #include "GUI/coregui/Models/ParticleCompositionItem.h"
-#include "GUI/coregui/Models/ParticleDistributionItem.h"
 #include "GUI/coregui/Models/ParticleItem.h"
 #include "GUI/coregui/Models/ParticleLayoutItem.h"
 #include "GUI/coregui/Models/SampleModel.h"
@@ -27,15 +26,6 @@ TEST_F(TestMapperCases, test_ParticeleCompositionUpdate)
     // composition added to layout should have abundance enabled
     auto compositionFree = model.insertItem<ParticleCompositionItem>(layout);
     EXPECT_TRUE(compositionFree->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
-
-    // composition added to distribution should have abundance disabled
-    auto distribution = model.insertItem<ParticleDistributionItem>(layout);
-    auto composition = model.insertItem<ParticleCompositionItem>(distribution);
-    EXPECT_FALSE(composition->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
-
-    auto taken = distribution->takeRow(ParentRow(*composition));
-    EXPECT_TRUE(taken->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
-    delete taken;
 }
 
 TEST_F(TestMapperCases, test_SimulationOptionsComputationToggle)
diff --git a/Tests/UnitTests/GUI/TestParticleCoreShell.cpp b/Tests/UnitTests/GUI/TestParticleCoreShell.cpp
index 621fd20d33f..c9eb1e3cf01 100644
--- a/Tests/UnitTests/GUI/TestParticleCoreShell.cpp
+++ b/Tests/UnitTests/GUI/TestParticleCoreShell.cpp
@@ -94,30 +94,6 @@ TEST_F(TestParticleCoreShell, test_propertyAppearance)
     delete shell;
 }
 
-//! Checking that abundance gets disabled in particle distribution context.
-
-TEST_F(TestParticleCoreShell, test_distributionContext)
-{
-    SampleModel model;
-
-    // coreshell particle
-    auto coreshell = model.insertItem<ParticleCoreShellItem>();
-    coreshell->setItemValue(ParticleItem::P_ABUNDANCE, 0.2);
-    EXPECT_TRUE(coreshell->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
-    EXPECT_EQ(coreshell->getItemValue(ParticleItem::P_ABUNDANCE).toDouble(), 0.2);
-
-    // create distribution, adding coreshell to it
-    auto distribution = model.insertItem<ParticleDistributionItem>();
-    model.moveItem(coreshell, distribution, -1, ParticleDistributionItem::T_PARTICLES);
-    // checking abundance has switched to defaults
-    EXPECT_FALSE(coreshell->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
-    EXPECT_EQ(coreshell->getItemValue(ParticleItem::P_ABUNDANCE).toDouble(), 1.0);
-
-    // removing coreshell
-    distribution->takeRow(ParentRow(*coreshell));
-    EXPECT_TRUE(coreshell->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
-    delete coreshell;
-}
 
 //! Checking that abundance gets disabled in particle composition context.
 
diff --git a/Tests/UnitTests/GUI/TestParticleDistributionItem.cpp b/Tests/UnitTests/GUI/TestParticleDistributionItem.cpp
deleted file mode 100644
index 87d7f58c46f..00000000000
--- a/Tests/UnitTests/GUI/TestParticleDistributionItem.cpp
+++ /dev/null
@@ -1,306 +0,0 @@
-#include "GUI/coregui/Models/ComboProperty.h"
-#include "GUI/coregui/Models/DistributionItems.h"
-#include "GUI/coregui/Models/MaterialModel.h"
-#include "GUI/coregui/Models/ParticleDistributionItem.h"
-#include "GUI/coregui/Models/ParticleItem.h"
-#include "GUI/coregui/Models/RealLimitsItems.h"
-#include "GUI/coregui/Models/SampleModel.h"
-#include "GUI/coregui/Models/TransformFromDomain.h"
-#include "GUI/coregui/Views/MaterialEditor/MaterialEditor.h"
-#include "Param/Distrib/Distributions.h"
-#include "Sample/HardParticle/HardParticles.h"
-#include "Sample/Material/MaterialFactoryFuncs.h"
-#include "Sample/Particle/Particle.h"
-#include "Tests/GTestWrapper/google_test.h"
-#include <QXmlStreamWriter>
-
-namespace {
-const QStringList expectedCylinderParams = {"None",
-                                            "Particle/Cylinder/Radius",
-                                            "Particle/Cylinder/Height",
-                                            "Particle/Position Offset/X",
-                                            "Particle/Position Offset/Y",
-                                            "Particle/Position Offset/Z"};
-
-const QStringList expectedBoxParams = {"None",
-                                       "Particle/Box/Length",
-                                       "Particle/Box/Width",
-                                       "Particle/Box/Height",
-                                       "Particle/Position Offset/X",
-                                       "Particle/Position Offset/Y",
-                                       "Particle/Position Offset/Z"};
-} // namespace
-
-class TestParticleDistributionItem : public ::testing::Test {
-};
-
-TEST_F(TestParticleDistributionItem, test_InitialState)
-{
-    SampleModel model;
-    auto distItem = model.insertItem<ParticleDistributionItem>();
-
-    EXPECT_EQ(distItem->displayName(), "ParticleDistribution");
-    EXPECT_EQ(distItem->displayName(), distItem->itemName());
-
-    // xpos, ypos, P_ABUNDANCE, P_DISTRIBUTION, P_DISTRIBUTED_PARAMETER
-    EXPECT_EQ(distItem->children().size(), 6);
-
-    EXPECT_EQ(distItem->defaultTag(), ParticleDistributionItem::T_PARTICLES);
-
-    EXPECT_EQ(distItem->acceptableDefaultItemTypes(), QVector<QString>() << "Particle"
-                                                                         << "ParticleCoreShell"
-                                                                         << "ParticleComposition"
-                                                                         << "MesoCrystal");
-
-    // main parameter
-    ComboProperty prop = distItem->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
-                             .value<ComboProperty>();
-    EXPECT_EQ(prop.getValues(), QStringList() << ParticleDistributionItem::NO_SELECTION);
-    EXPECT_EQ(prop.getValue(), ParticleDistributionItem::NO_SELECTION);
-
-    // linked parameter
-    prop =
-        distItem->getItemValue(ParticleDistributionItem::P_LINKED_PARAMETER).value<ComboProperty>();
-    EXPECT_EQ(prop.getValues(), QStringList());
-    EXPECT_EQ(prop.getValue(), "");
-}
-
-TEST_F(TestParticleDistributionItem, test_AddParticle)
-{
-    SampleModel model;
-    auto dist = model.insertItem<ParticleDistributionItem>();
-
-    // adding default particle and checking list of available parameters
-    auto particle = model.insertItem<ParticleItem>(dist);
-
-    EXPECT_EQ(dist->getItems().size(), 1);
-
-    ComboProperty prop = dist->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
-                             .value<ComboProperty>();
-
-    EXPECT_EQ(prop.getValues(), expectedCylinderParams);
-    EXPECT_EQ(prop.getValue(), ParticleDistributionItem::NO_SELECTION);
-
-    // linked parameter
-    prop = dist->getItemValue(ParticleDistributionItem::P_LINKED_PARAMETER).value<ComboProperty>();
-
-    QStringList expectedLinked = expectedCylinderParams;
-    expectedLinked.removeAll(ParticleDistributionItem::NO_SELECTION);
-    EXPECT_EQ(prop.getValues(), expectedLinked);
-    EXPECT_EQ(prop.getValue(), "");
-
-    // changing form factor of the particle
-    particle->setGroupProperty(ParticleItem::P_FORM_FACTOR, "Box");
-
-    prop = dist->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
-               .value<ComboProperty>();
-
-    EXPECT_EQ(prop.getValues(), expectedBoxParams);
-    EXPECT_EQ(prop.getValue(), ParticleDistributionItem::NO_SELECTION);
-
-    // cheking linked
-    prop = dist->getItemValue(ParticleDistributionItem::P_LINKED_PARAMETER).value<ComboProperty>();
-
-    expectedLinked = expectedBoxParams;
-    expectedLinked.removeAll(ParticleDistributionItem::NO_SELECTION);
-    EXPECT_EQ(prop.getValues(), expectedLinked);
-    EXPECT_EQ(prop.getValue(), "");
-    EXPECT_EQ(prop.selectedValues(), QStringList());
-}
-
-//! Values available for linking should depend on main parameter.
-
-TEST_F(TestParticleDistributionItem, test_MainLinkedCorrelation)
-{
-    SampleModel model;
-    auto dist = model.insertItem<ParticleDistributionItem>();
-    model.insertItem<ParticleItem>(dist);
-
-    ComboProperty mainCombo = dist->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
-                                  .value<ComboProperty>();
-
-    EXPECT_EQ(mainCombo.getValues(), expectedCylinderParams);
-    EXPECT_EQ(mainCombo.getValue(), ParticleDistributionItem::NO_SELECTION);
-
-    // linked parameter
-    ComboProperty linkedCombo =
-        dist->getItemValue(ParticleDistributionItem::P_LINKED_PARAMETER).value<ComboProperty>();
-
-    QStringList expectedLinked = expectedCylinderParams;
-    expectedLinked.removeAll(ParticleDistributionItem::NO_SELECTION);
-    EXPECT_EQ(linkedCombo.getValues(), expectedLinked);
-    EXPECT_EQ(linkedCombo.getValue(), "");
-    EXPECT_EQ(linkedCombo.selectedValues(), QStringList());
-
-    // selecting main parameter
-    QString mainPar("Particle/Cylinder/Radius");
-    mainCombo.setValue(mainPar);
-    dist->setItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER, mainCombo.variant());
-
-    // linked parameter shouldn't have main parameter in the list
-    expectedLinked = expectedCylinderParams;
-    expectedLinked.removeAll(ParticleDistributionItem::NO_SELECTION);
-    expectedLinked.removeAll(mainPar);
-
-    linkedCombo =
-        dist->getItemValue(ParticleDistributionItem::P_LINKED_PARAMETER).value<ComboProperty>();
-    EXPECT_EQ(linkedCombo.getValues(), expectedLinked);
-    EXPECT_EQ(linkedCombo.getValue(), "");
-    EXPECT_EQ(linkedCombo.selectedValues(), QStringList());
-
-    // --- Scenario 2
-
-    // selecting linked parameter
-    linkedCombo.setSelected("Particle/Cylinder/Height");
-    dist->setItemValue(ParticleDistributionItem::P_LINKED_PARAMETER, linkedCombo.variant());
-
-    // selecting another main parameter
-    mainPar = "Particle/Position Offset/X";
-    mainCombo.setValue(mainPar);
-    dist->setItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER, mainCombo.variant());
-
-    // checking linked
-    linkedCombo =
-        dist->getItemValue(ParticleDistributionItem::P_LINKED_PARAMETER).value<ComboProperty>();
-    expectedLinked = expectedCylinderParams;
-    expectedLinked.removeAll(ParticleDistributionItem::NO_SELECTION);
-    expectedLinked.removeAll(mainPar);
-
-    EXPECT_EQ(linkedCombo.getValues(), expectedLinked);
-    EXPECT_EQ(linkedCombo.getValue(), "Particle/Cylinder/Height");
-    EXPECT_EQ(linkedCombo.selectedValues(), QStringList("Particle/Cylinder/Height"));
-}
-
-TEST_F(TestParticleDistributionItem, test_FromDomain)
-{
-    const std::string pattern("/Particle/Cylinder/Radius");
-
-    // creating domain distribution
-    FormFactorCylinder cylinder(1.0, 2.0);
-    Particle particle(HomogeneousMaterial("Particle", 6e-4, 2e-8), cylinder);
-    DistributionGaussian gauss(1.0, 0.1);
-    ParameterDistribution par_distr(pattern, gauss, 100, 3.0);
-
-    ParticleDistribution particle_collection(particle, par_distr);
-
-    // creating GUI distribution
-    SampleModel model;
-    auto distItem = model.insertItem<ParticleDistributionItem>();
-    auto particleItem = model.insertItem<ParticleItem>(distItem);
-
-    particleItem->setGroupProperty(ParticleItem::P_FORM_FACTOR, "AnisoPyramid");
-
-    // Sets it from domain
-    TransformFromDomain::setParticleDistributionItem(distItem, particle_collection);
-
-    ComboProperty prop = distItem->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
-                             .value<ComboProperty>();
-
-    EXPECT_EQ(prop.getValue(), ParticleDistributionItem::NO_SELECTION);
-
-    // changing particle type and check that distribution picked up domain name
-    particleItem->setGroupProperty(ParticleItem::P_FORM_FACTOR, "Cylinder");
-    prop = distItem->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
-               .value<ComboProperty>();
-
-    EXPECT_EQ(prop.getValue(), "Particle/Cylinder/Radius");
-}
-
-//! Constructing from domain distribution with linked parameter defined
-
-TEST_F(TestParticleDistributionItem, test_FromDomainLinked)
-{
-    const std::string pattern("/Particle/Cylinder/Radius");
-    const std::string linked("/Particle/Cylinder/Height");
-
-    // creating domain distribution
-    FormFactorCylinder cylinder(1.0, 2.0);
-    Particle particle(HomogeneousMaterial("Particle", 6e-4, 2e-8), cylinder);
-    DistributionGaussian gauss(1.0, 0.1);
-    ParameterDistribution par_distr(pattern, gauss, 100, 3.0);
-    par_distr.linkParameter(linked);
-
-    ParticleDistribution particle_collection(particle, par_distr);
-
-    // creating GUI distribution
-    SampleModel model;
-    auto distItem = model.insertItem<ParticleDistributionItem>();
-    auto particleItem = model.insertItem<ParticleItem>(distItem);
-
-    particleItem->setGroupProperty(ParticleItem::P_FORM_FACTOR, "AnisoPyramid");
-
-    // Sets it from domain
-    TransformFromDomain::setParticleDistributionItem(distItem, particle_collection);
-
-    ComboProperty prop = distItem->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
-                             .value<ComboProperty>();
-    EXPECT_EQ(prop.getValue(), ParticleDistributionItem::NO_SELECTION);
-
-    ComboProperty linkedProp =
-        distItem->getItemValue(ParticleDistributionItem::P_LINKED_PARAMETER).value<ComboProperty>();
-    EXPECT_EQ(linkedProp.getValue(), "");
-
-    // changing particle type and check that distribution picked up domain name
-    particleItem->setGroupProperty(ParticleItem::P_FORM_FACTOR, "Cylinder");
-
-    prop = distItem->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
-               .value<ComboProperty>();
-    EXPECT_EQ(prop.getValue(), "Particle/Cylinder/Radius");
-
-    linkedProp =
-        distItem->getItemValue(ParticleDistributionItem::P_LINKED_PARAMETER).value<ComboProperty>();
-    QStringList expectedLinked = QStringList() << "Particle/Cylinder/Height";
-    EXPECT_EQ(linkedProp.selectedValues(), expectedLinked);
-    EXPECT_EQ(linkedProp.getValue(), expectedLinked.at(0));
-}
-
-TEST_F(TestParticleDistributionItem, test_FromDomainWithLimits)
-{
-    const std::string pattern("/Particle/Cylinder/Radius");
-
-    // creating domain distribution
-    FormFactorCylinder cylinder(1.0, 2.0);
-    Particle particle(HomogeneousMaterial("Particle", 6e-4, 2e-8), cylinder);
-    DistributionGaussian gauss(1.0, 0.1);
-
-    RealLimits domainLimits = RealLimits::limited(1.0, 2.0);
-    ParameterDistribution par_distr(pattern, gauss, 100, 3.0, domainLimits);
-
-    ParticleDistribution particle_collection(particle, par_distr);
-
-    // creating GUI distribution
-    SampleModel model;
-    auto partDistItem = model.insertItem<ParticleDistributionItem>();
-    model.insertItem<ParticleItem>(partDistItem);
-
-    // Sets it from domain
-    TransformFromDomain::setParticleDistributionItem(partDistItem, particle_collection);
-
-    SessionItem* distItem = partDistItem->getGroupItem(ParticleDistributionItem::P_DISTRIBUTION);
-    ASSERT(distItem);
-    RealLimitsItem* limitsItem =
-        dynamic_cast<RealLimitsItem*>(distItem->getGroupItem(DistributionItem::P_LIMITS));
-    ASSERT(limitsItem);
-
-    EXPECT_EQ(limitsItem->createRealLimits(), domainLimits);
-}
-
-TEST_F(TestParticleDistributionItem, test_Clone)
-{
-    std::unique_ptr<MaterialModel> P_materialModel(new MaterialModel());
-
-    SampleModel model1;
-    auto dist = model1.insertItem<ParticleDistributionItem>();
-    model1.insertItem<ParticleItem>(dist);
-
-    QString buffer1;
-    QXmlStreamWriter writer1(&buffer1);
-    model1.writeTo(&writer1);
-
-    std::unique_ptr<SampleModel> model2(model1.createCopy());
-    QString buffer2;
-    QXmlStreamWriter writer2(&buffer2);
-    model2->writeTo(&writer2);
-
-    EXPECT_EQ(buffer1, buffer2);
-}
diff --git a/Tests/UnitTests/GUI/TestParticleItem.cpp b/Tests/UnitTests/GUI/TestParticleItem.cpp
index bc4a0302f27..b3a31e8dcb4 100644
--- a/Tests/UnitTests/GUI/TestParticleItem.cpp
+++ b/Tests/UnitTests/GUI/TestParticleItem.cpp
@@ -46,23 +46,3 @@ TEST_F(TestParticleItem, test_compositionContext)
     EXPECT_TRUE(particle->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
     delete particle;
 }
-
-TEST_F(TestParticleItem, test_distributionContext)
-{
-    SampleModel model;
-    auto particle = model.insertItem<ParticleItem>();
-    particle->setItemValue(ParticleItem::P_ABUNDANCE, 0.2);
-    EXPECT_TRUE(particle->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
-    EXPECT_EQ(particle->getItemValue(ParticleItem::P_ABUNDANCE).toDouble(), 0.2);
-
-    // adding particle to distribution, checking that abundance is default
-    auto distribution = model.insertItem<ParticleDistributionItem>();
-    model.moveItem(particle, distribution, -1, ParticleDistributionItem::T_PARTICLES);
-    EXPECT_FALSE(particle->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
-    EXPECT_EQ(particle->getItemValue(ParticleItem::P_ABUNDANCE).toDouble(), 1.0);
-
-    // removing particle, checking that abundance is enabled again
-    distribution->takeRow(ParentRow(*particle));
-    EXPECT_TRUE(particle->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
-    delete particle;
-}
-- 
GitLab