Skip to content
Snippets Groups Projects
Commit 7e86beaf authored by Wuttke, Joachim's avatar Wuttke, Joachim
Browse files

rm class LayoutStrategyBuilder, which wrapped just one function

parent 6d614dd3
No related branches found
No related tags found
No related merge requests found
// ************************************************************************** //
//
// BornAgain: simulate and fit scattering at grazing incidence
//
//! @file Core/Computation/LayoutStrategyBuilder.cpp
//! @brief Implements class LayoutStrategyBuilder.
//!
//! @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 "Core/Computation/LayoutStrategyBuilder.h"
#include "Base/Types/Exceptions.h"
#include "Core/Computation/ProcessedLayout.h"
#include "Sample/Aggregate/InterferenceFunctionRadialParaCrystal.h"
#include "Sample/Interference/DecouplingApproximationStrategy.h"
#include "Sample/Interference/SSCApproximationStrategy.h"
LayoutStrategyBuilder::LayoutStrategyBuilder(const ProcessedLayout* p_layout,
const SimulationOptions& sim_params, bool polarized)
: m_layout(p_layout), m_sim_params(sim_params), m_polarized(polarized)
{
createStrategy();
}
// needs class definitions => don't move to .h
LayoutStrategyBuilder::~LayoutStrategyBuilder() = default;
IInterferenceFunctionStrategy* LayoutStrategyBuilder::releaseStrategy()
{
return m_strategy.release();
}
//! Returns a new strategy object that is able to calculate the scattering for fixed k_f.
void LayoutStrategyBuilder::createStrategy()
{
const IInterferenceFunction* p_iff = m_layout->interferenceFunction();
if (p_iff && m_layout->numberOfSlices() > 1 && !p_iff->supportsMultilayer())
throw std::runtime_error("LayoutStrategyBuilder::checkInterferenceFunction: "
"interference function does not support multiple layers");
auto p_radial_para = dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(p_iff);
if (p_radial_para && p_radial_para->kappa() > 0.0) {
double kappa = p_radial_para->kappa();
m_strategy = std::make_unique<SSCApproximationStrategy>(m_sim_params, kappa, m_polarized);
} else {
m_strategy = std::make_unique<DecouplingApproximationStrategy>(m_sim_params, m_polarized);
}
if (!m_strategy)
throw Exceptions::ClassInitializationException("Could not create appropriate strategy");
m_strategy->init(m_layout->formFactorList(), p_iff);
}
// ************************************************************************** //
//
// BornAgain: simulate and fit scattering at grazing incidence
//
//! @file Core/Computation/LayoutStrategyBuilder.h
//! @brief Defines class LayoutStrategyBuilder.
//!
//! @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_CORE_COMPUTATION_LAYOUTSTRATEGYBUILDER_H
#define BORNAGAIN_CORE_COMPUTATION_LAYOUTSTRATEGYBUILDER_H
#include "Sample/RT/SimulationOptions.h"
#include <memory>
class IInterferenceFunction;
class IInterferenceFunctionStrategy;
class ProcessedLayout;
//! Methods to generate a simulation strategy for a ParticleLayoutComputation.
//! @ingroup algorithms_internal
class LayoutStrategyBuilder
{
public:
LayoutStrategyBuilder(const ProcessedLayout* p_layout, const SimulationOptions& sim_params,
bool polarized);
~LayoutStrategyBuilder();
IInterferenceFunctionStrategy* releaseStrategy();
private:
void createStrategy();
const ProcessedLayout* m_layout;
SimulationOptions m_sim_params;
bool m_polarized; //!< polarized computation required?
std::unique_ptr<IInterferenceFunctionStrategy> m_strategy;
};
#endif // BORNAGAIN_CORE_COMPUTATION_LAYOUTSTRATEGYBUILDER_H
......@@ -14,18 +14,48 @@
#include "Core/Computation/ParticleLayoutComputation.h"
#include "Base/Pixel/SimulationElement.h"
#include "Core/Computation/LayoutStrategyBuilder.h"
#include "Base/Types/Exceptions.h"
#include "Core/Computation/ProcessedLayout.h"
#include "Sample/Aggregate/InterferenceFunctionRadialParaCrystal.h"
#include "Sample/Interference/DecouplingApproximationStrategy.h"
#include "Sample/Interference/IInterferenceFunctionStrategy.h"
#include "Sample/Interference/SSCApproximationStrategy.h"
ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout* p_layout,
namespace {
std::unique_ptr<IInterferenceFunctionStrategy> processedInterferenceFunction(
const ProcessedLayout* layout, const SimulationOptions& sim_params, bool polarized)
{
const IInterferenceFunction* p_iff = layout->interferenceFunction();
if (p_iff && layout->numberOfSlices() > 1 && !p_iff->supportsMultilayer())
throw std::runtime_error("LayoutStrategyBuilder::checkInterferenceFunction: "
"interference function does not support multiple layers");
auto p_radial_para = dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(p_iff);
std::unique_ptr<IInterferenceFunctionStrategy> result;
if (p_radial_para && p_radial_para->kappa() > 0.0) {
double kappa = p_radial_para->kappa();
result = std::make_unique<SSCApproximationStrategy>(sim_params, kappa, polarized);
} else {
result = std::make_unique<DecouplingApproximationStrategy>(sim_params, polarized);
}
if (!result)
throw Exceptions::ClassInitializationException("Could not create appropriate result");
result->init(layout->formFactorList(), p_iff);
return result;
}
} // namespace
ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout* layout,
const SimulationOptions& options,
bool polarized)
: m_layout(p_layout)
, m_region_map(p_layout->regionMap())
: m_layout(layout)
, m_region_map(layout->regionMap())
, m_interference_function_strategy(processedInterferenceFunction(layout, options, polarized))
{
LayoutStrategyBuilder builder(p_layout, options, polarized);
m_strategy.reset(builder.releaseStrategy());
}
ParticleLayoutComputation::~ParticleLayoutComputation() = default;
......@@ -36,7 +66,9 @@ void ParticleLayoutComputation::compute(SimulationElement& elem) const
const size_t n_layers = m_layout->numberOfSlices();
if (n_layers > 1 && alpha_f < 0)
return; // zero for transmission with multilayers (n>1) # TODO: support transmission GISAS
elem.addIntensity(m_strategy->evaluate(elem) * m_layout->surfaceDensity());
elem.addIntensity(m_interference_function_strategy->evaluate(elem) *
m_layout->surfaceDensity());
}
void ParticleLayoutComputation::mergeRegionMap(
......
......@@ -43,8 +43,8 @@ public:
private:
const ProcessedLayout* m_layout;
std::unique_ptr<const IInterferenceFunctionStrategy> m_strategy;
const std::map<size_t, std::vector<HomogeneousRegion>> m_region_map;
std::unique_ptr<const IInterferenceFunctionStrategy> m_interference_function_strategy;
};
#endif // BORNAGAIN_CORE_COMPUTATION_PARTICLELAYOUTCOMPUTATION_H
......@@ -983,24 +983,6 @@ Returns map of fit parameter names and its current values.
%feature("docstring") LabelMap "";
// File: classLayoutStrategyBuilder.xml
%feature("docstring") LayoutStrategyBuilder "
Methods to generate a simulation strategy for a ParticleLayoutComputation.
C++ includes: LayoutStrategyBuilder.h
";
%feature("docstring") LayoutStrategyBuilder::LayoutStrategyBuilder "LayoutStrategyBuilder::LayoutStrategyBuilder(const ProcessedLayout *p_layout, const SimulationOptions &sim_params, bool polarized)
";
%feature("docstring") LayoutStrategyBuilder::~LayoutStrategyBuilder "LayoutStrategyBuilder::~LayoutStrategyBuilder()
";
%feature("docstring") LayoutStrategyBuilder::releaseStrategy "IInterferenceFunctionStrategy * LayoutStrategyBuilder::releaseStrategy()
";
// File: classLogMetric.xml
%feature("docstring") LogMetric "
......@@ -2886,9 +2868,15 @@ Helper factory function to use in GISASSimulation. Depending on the type of det
// File: LayoutStrategyBuilder_8cpp.xml
%feature("docstring") processedIInterferenceFunctionStrategy "IInterferenceFunctionStrategy* processedIInterferenceFunctionStrategy(const ProcessedLayout *layout, const SimulationOptions &sim_params, bool polarized)
";
// File: LayoutStrategyBuilder_8h.xml
%feature("docstring") processedInterferenceFunction "IInterferenceFunctionStrategy* processedInterferenceFunction(const ProcessedLayout *layout, const SimulationOptions &sim_params, bool polarized)
Provides a IInterferenceFunctionStrategy for a ParticleLayoutComputation.
";
// File: MultiLayerFuncs_8cpp.xml
......
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