diff --git a/Core/Computation/ComputationStatus.h b/Core/Computation/ComputationStatus.h index b92a5eb533cc20317c16e5b9655956fd292d9d00..fa2e34232812972fe76ecc206f7a4ca03b468be8 100644 --- a/Core/Computation/ComputationStatus.h +++ b/Core/Computation/ComputationStatus.h @@ -30,7 +30,11 @@ public: void setRunning() { m_status = RUNNING; } void setCompleted() { m_status = COMPLETED; } - void setFailed(const std::string& message) { m_error_message = message; m_status = FAILED; } + void setFailed(const std::string& message) + { + m_error_message = message; + m_status = FAILED; + } private: enum ESimulationStatus { IDLE, RUNNING, COMPLETED, FAILED }; diff --git a/Core/Computation/DWBAComputation.cpp b/Core/Computation/DWBAComputation.cpp index a7e4c1e40ce26e1f4d57bc4b323495d2bd5b4b73..ae638a405beade7cc392a86b142431b0c60d3119 100644 --- a/Core/Computation/DWBAComputation.cpp +++ b/Core/Computation/DWBAComputation.cpp @@ -38,7 +38,7 @@ DWBAComputation::DWBAComputation(const MultiLayer& multilayer, const SimulationO bool polarized = m_processed_sample->containsMagneticMaterial(); for (const ProcessedLayout& layout : m_processed_sample->layouts()) { m_single_computation.addLayoutComputation( - new ParticleLayoutComputation(&layout, m_sim_options, polarized)); + new ParticleLayoutComputation(layout, m_sim_options, polarized)); } // scattering from rough surfaces in DWBA if (m_processed_sample->hasRoughness()) diff --git a/Core/Computation/ParticleLayoutComputation.cpp b/Core/Computation/ParticleLayoutComputation.cpp index b47d612fbcb4182328e34e3f70be20edb95078e0..91d52810cfd7ec819545c49797b0d54af358846f 100644 --- a/Core/Computation/ParticleLayoutComputation.cpp +++ b/Core/Computation/ParticleLayoutComputation.cpp @@ -21,40 +21,44 @@ #include "Sample/Interference/IInterferenceFunctionStrategy.h" #include "Sample/Interference/SSCApproximationStrategy.h" -namespace { +namespace +{ -std::unique_ptr<IInterferenceFunctionStrategy> processedInterferenceFunction( - const ProcessedLayout* layout, const SimulationOptions& sim_params, bool polarized) +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()) + 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); + const std::vector<FormFactorCoherentSum>& weighted_formfactors = layout.formFactorList(); + 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); + result = std::make_unique<SSCApproximationStrategy>(weighted_formfactors, p_iff, sim_params, + polarized, kappa); } else { - result = std::make_unique<DecouplingApproximationStrategy>(sim_params, polarized); + result = std::make_unique<DecouplingApproximationStrategy>(weighted_formfactors, p_iff, + 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, +ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout& layout, const SimulationOptions& options, bool polarized) - : m_layout(layout) - , m_region_map(layout->regionMap()) - , m_interference_function_strategy(processedInterferenceFunction(layout, options, polarized)) + : m_layout(layout), m_region_map(layout.regionMap()), + m_interference_function_strategy(processedInterferenceFunction(layout, options, polarized)) { } @@ -63,12 +67,12 @@ ParticleLayoutComputation::~ParticleLayoutComputation() = default; void ParticleLayoutComputation::compute(SimulationElement& elem) const { const double alpha_f = elem.getAlphaMean(); - const size_t n_layers = m_layout->numberOfSlices(); + 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_interference_function_strategy->evaluate(elem) * - m_layout->surfaceDensity()); + elem.addIntensity(m_interference_function_strategy->evaluate(elem) + * m_layout.surfaceDensity()); } void ParticleLayoutComputation::mergeRegionMap( diff --git a/Core/Computation/ParticleLayoutComputation.h b/Core/Computation/ParticleLayoutComputation.h index c7114bde059dbf61ad5fe035b7874cf7eec496f7..5c98591d4293d8cb2b53acd0780bc8faebe48860 100644 --- a/Core/Computation/ParticleLayoutComputation.h +++ b/Core/Computation/ParticleLayoutComputation.h @@ -32,7 +32,7 @@ class SimulationOptions; class ParticleLayoutComputation final { public: - ParticleLayoutComputation(const ProcessedLayout* p_layout, const SimulationOptions& options, + ParticleLayoutComputation(const ProcessedLayout& layout, const SimulationOptions& options, bool polarized); ~ParticleLayoutComputation(); @@ -42,7 +42,7 @@ public: void mergeRegionMap(std::map<size_t, std::vector<HomogeneousRegion>>& region_map) const; private: - const ProcessedLayout* m_layout; + const ProcessedLayout& m_layout; const std::map<size_t, std::vector<HomogeneousRegion>> m_region_map; std::unique_ptr<const IInterferenceFunctionStrategy> m_interference_function_strategy; }; diff --git a/Device/Unit/IUnitConverter.h b/Device/Unit/IUnitConverter.h index e16f1fe5c05d1714e67c881ccaaca686b2f4b1e7..29ddc1f61ab2630536c6613cea6389494f1b0664 100644 --- a/Device/Unit/IUnitConverter.h +++ b/Device/Unit/IUnitConverter.h @@ -36,8 +36,8 @@ public: const std::map<Axes::Units, const char*> axisUnitLabel = { {Axes::Units::DEFAULT, "undefined"}, {Axes::Units::NBINS, "bin"}, {Axes::Units::RADIANS, "rad"}, - {Axes::Units::DEGREES, "deg"}, {Axes::Units::MM, "mm"}, {Axes::Units::QSPACE, "1/nm"}, - {Axes::Units::QXQY, "1/nm"}, {Axes::Units::RQ4, "nm^-4?"}}; + {Axes::Units::DEGREES, "deg"}, {Axes::Units::MM, "mm"}, {Axes::Units::QSPACE, "1/nm"}, + {Axes::Units::QXQY, "1/nm"}, {Axes::Units::RQ4, "nm^-4?"}}; //! Interface to provide axis translations to different units for simulation output //! @ingroup simulation_internal diff --git a/Sample/Interference/DecouplingApproximationStrategy.cpp b/Sample/Interference/DecouplingApproximationStrategy.cpp index 8b9b7ea07d6a598de9e866276c528bcdb1f944cf..9af74b45a1ad88b73758f66c8e6c8839ff3537dd 100644 --- a/Sample/Interference/DecouplingApproximationStrategy.cpp +++ b/Sample/Interference/DecouplingApproximationStrategy.cpp @@ -24,9 +24,10 @@ using InterferenceFunctionUtils::PrecomputePolarizedFormFactors; using InterferenceFunctionUtils::PrecomputeScalarFormFactors; -DecouplingApproximationStrategy::DecouplingApproximationStrategy(SimulationOptions sim_params, - bool polarized) - : IInterferenceFunctionStrategy(sim_params, polarized) +DecouplingApproximationStrategy::DecouplingApproximationStrategy( + const std::vector<FormFactorCoherentSum>& weighted_formfactors, + const IInterferenceFunction* p_iff, SimulationOptions sim_params, bool polarized) + : IInterferenceFunctionStrategy(weighted_formfactors, p_iff, sim_params, polarized) { } diff --git a/Sample/Interference/DecouplingApproximationStrategy.h b/Sample/Interference/DecouplingApproximationStrategy.h index fc7312756554434b809405aa079b81a62aebe8e6..4bb91db9aee4ed1bce6fb9fab3e8fb840c2292b4 100644 --- a/Sample/Interference/DecouplingApproximationStrategy.h +++ b/Sample/Interference/DecouplingApproximationStrategy.h @@ -26,7 +26,9 @@ class SimulationElement; class DecouplingApproximationStrategy final : public IInterferenceFunctionStrategy { public: - DecouplingApproximationStrategy(SimulationOptions sim_params, bool polarized); + DecouplingApproximationStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors, + const IInterferenceFunction* p_iff, + SimulationOptions sim_params, bool polarized); private: double scalarCalculation(const SimulationElement& sim_element) const override; diff --git a/Sample/Interference/IInterferenceFunctionStrategy.cpp b/Sample/Interference/IInterferenceFunctionStrategy.cpp index cb4a6a9ddfac766aa7cb221e118873c0e00f9fb9..89cc44c9af0a52caa79ede41fdd599ae7af04752 100644 --- a/Sample/Interference/IInterferenceFunctionStrategy.cpp +++ b/Sample/Interference/IInterferenceFunctionStrategy.cpp @@ -19,19 +19,12 @@ #include "Sample/Aggregate/InterferenceFunctionNone.h" #include "Sample/Fresnel/FormFactorCoherentSum.h" -IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const SimulationOptions& sim_params, - bool polarized) +IInterferenceFunctionStrategy::IInterferenceFunctionStrategy( + const std::vector<FormFactorCoherentSum>& weighted_formfactors, + const IInterferenceFunction* p_iff, const SimulationOptions& sim_params, bool polarized) : m_iff(nullptr), m_options(sim_params), m_polarized(polarized), m_integrator( make_integrator_miser(this, &IInterferenceFunctionStrategy::evaluate_for_fixed_angles, 2)) -{ -} - -IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy() = default; - -void IInterferenceFunctionStrategy::init( - const std::vector<FormFactorCoherentSum>& weighted_formfactors, - const IInterferenceFunction* p_iff) { if (weighted_formfactors.empty()) throw Exceptions::ClassInitializationException( @@ -41,10 +34,10 @@ void IInterferenceFunctionStrategy::init( m_iff.reset(p_iff->clone()); else m_iff.reset(new InterferenceFunctionNone()); - - strategy_specific_post_init(); } +IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy() = default; + double IInterferenceFunctionStrategy::evaluate(const SimulationElement& sim_element) const { if (m_options.isIntegrate() && (sim_element.getSolidAngle() > 0.0)) @@ -82,5 +75,3 @@ double IInterferenceFunctionStrategy::evaluate_for_fixed_angles(double* fraction SimulationElement sim_element = pars->pointElement(par0, par1); return pars->getIntegrationFactor(par0, par1) * evaluateSinglePoint(sim_element); } - -void IInterferenceFunctionStrategy::strategy_specific_post_init() {} diff --git a/Sample/Interference/IInterferenceFunctionStrategy.h b/Sample/Interference/IInterferenceFunctionStrategy.h index ba0a541a81c57adc184bc3ea60ef6193d651a249..842d41a80145f6c7f800157d570254e2656aafff 100644 --- a/Sample/Interference/IInterferenceFunctionStrategy.h +++ b/Sample/Interference/IInterferenceFunctionStrategy.h @@ -41,26 +41,23 @@ class SimulationElement; class IInterferenceFunctionStrategy { public: - IInterferenceFunctionStrategy(const SimulationOptions& sim_params, bool polarized); + IInterferenceFunctionStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors, + const IInterferenceFunction* p_iff, + const SimulationOptions& sim_params, bool polarized); virtual ~IInterferenceFunctionStrategy(); - //! Initializes the object with form factors and an interference function - void init(const std::vector<FormFactorCoherentSum>& weighted_formfactors, - const IInterferenceFunction* p_iff); - //! Calculates the intensity for scalar particles/interactions double evaluate(const SimulationElement& sim_element) const; protected: std::vector<FormFactorCoherentSum> m_formfactor_wrappers; std::unique_ptr<IInterferenceFunction> m_iff; - SimulationOptions m_options; + const SimulationOptions m_options; private: double evaluateSinglePoint(const SimulationElement& sim_element) const; double MCIntegratedEvaluate(const SimulationElement& sim_element) const; double evaluate_for_fixed_angles(double* fractions, size_t dim, void* params) const; - virtual void strategy_specific_post_init(); //! Evaluates the intensity in the scalar case virtual double scalarCalculation(const SimulationElement& sim_element) const = 0; //! Evaluates the intensity in the polarized case diff --git a/Sample/Interference/SSCApproximationStrategy.cpp b/Sample/Interference/SSCApproximationStrategy.cpp index 6040bbfff232ecf0e4fb6a9a1d7e56f2c00c2409..c30565cf5b7eceb1ce619900cabc4ad1408c4d24 100644 --- a/Sample/Interference/SSCApproximationStrategy.cpp +++ b/Sample/Interference/SSCApproximationStrategy.cpp @@ -20,13 +20,11 @@ using InterferenceFunctionUtils::PrecomputePolarizedFormFactors; using InterferenceFunctionUtils::PrecomputeScalarFormFactors; -SSCApproximationStrategy::SSCApproximationStrategy(SimulationOptions sim_params, double kappa, - bool polarized) - : IInterferenceFunctionStrategy(sim_params, polarized), m_helper(kappa) -{ -} - -void SSCApproximationStrategy::strategy_specific_post_init() +SSCApproximationStrategy::SSCApproximationStrategy( + const std::vector<FormFactorCoherentSum>& weighted_formfactors, + const IInterferenceFunction* p_iff, SimulationOptions sim_params, bool polarized, double kappa) + : IInterferenceFunctionStrategy(weighted_formfactors, p_iff, sim_params, polarized), + m_helper(kappa) { m_helper.init(m_formfactor_wrappers); } diff --git a/Sample/Interference/SSCApproximationStrategy.h b/Sample/Interference/SSCApproximationStrategy.h index a40fca106e1731d78d93864fb22518cf278d28fa..0d4df12d676e9435c62a4f30b0f91f0169d519d6 100644 --- a/Sample/Interference/SSCApproximationStrategy.h +++ b/Sample/Interference/SSCApproximationStrategy.h @@ -26,10 +26,11 @@ class SimulationElement; class SSCApproximationStrategy final : public IInterferenceFunctionStrategy { public: - SSCApproximationStrategy(SimulationOptions sim_params, double kappa, bool polarized); + SSCApproximationStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors, + const IInterferenceFunction* p_iff, SimulationOptions sim_params, + bool polarized, double kappa); private: - void strategy_specific_post_init() override; double scalarCalculation(const SimulationElement& sim_element) const override; double polarizedCalculation(const SimulationElement& sim_element) const override; SSCAHelper m_helper; diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i index a4115d39bc1ac587a61c88b1c3f9357ac110cbfa..5cbdf2f416319422e172f50ac1dff396929e020d 100644 --- a/auto/Wrap/doxygenCore.i +++ b/auto/Wrap/doxygenCore.i @@ -1241,7 +1241,7 @@ Computes the scattering contribution from one particle layout. Used by DWBAComp C++ includes: ParticleLayoutComputation.h "; -%feature("docstring") ParticleLayoutComputation::ParticleLayoutComputation "ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout *p_layout, const SimulationOptions &options, bool polarized) +%feature("docstring") ParticleLayoutComputation::ParticleLayoutComputation "ParticleLayoutComputation::ParticleLayoutComputation(const ProcessedLayout &layout, const SimulationOptions &options, bool polarized) "; %feature("docstring") ParticleLayoutComputation::~ParticleLayoutComputation "ParticleLayoutComputation::~ParticleLayoutComputation() @@ -2483,7 +2483,10 @@ Returns default units to convert to. "; -// File: namespace_0d100.xml +// File: namespace_0d23.xml + + +// File: namespace_0d27.xml // File: namespace_0d29.xml @@ -2492,43 +2495,43 @@ Returns default units to convert to. // File: namespace_0d31.xml -// File: namespace_0d33.xml +// File: namespace_0d35.xml -// File: namespace_0d37.xml +// File: namespace_0d39.xml -// File: namespace_0d41.xml +// File: namespace_0d43.xml -// File: namespace_0d45.xml +// File: namespace_0d51.xml -// File: namespace_0d53.xml +// File: namespace_0d56.xml -// File: namespace_0d58.xml +// File: namespace_0d65.xml // File: namespace_0d67.xml -// File: namespace_0d69.xml +// File: namespace_0d71.xml // File: namespace_0d73.xml -// File: namespace_0d75.xml +// File: namespace_0d80.xml // File: namespace_0d82.xml -// File: namespace_0d84.xml +// File: namespace_0d90.xml -// File: namespace_0d92.xml +// File: namespace_0d96.xml // File: namespace_0d98.xml @@ -2867,18 +2870,6 @@ Helper factory function to use in GISASSimulation. Depending on the type of det // File: IComputation_8h.xml -// 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 %feature("docstring") MaterialProfile "std::vector<complex_t> MaterialProfile(const MultiLayer &multilayer, int n_points, double z_min, double z_max) diff --git a/auto/Wrap/doxygenSample.i b/auto/Wrap/doxygenSample.i index c58b712e4cb849c0db8441f942f71d6509952676..d05ebb308f186c2833b1074229853893e5b9cad3 100644 --- a/auto/Wrap/doxygenSample.i +++ b/auto/Wrap/doxygenSample.i @@ -437,7 +437,7 @@ Strategy class to compute the total scattering from a particle layout in the dec C++ includes: DecouplingApproximationStrategy.h "; -%feature("docstring") DecouplingApproximationStrategy::DecouplingApproximationStrategy "DecouplingApproximationStrategy::DecouplingApproximationStrategy(SimulationOptions sim_params, bool polarized) +%feature("docstring") DecouplingApproximationStrategy::DecouplingApproximationStrategy "DecouplingApproximationStrategy::DecouplingApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, SimulationOptions sim_params, bool polarized) "; @@ -3627,17 +3627,12 @@ Instantiation of child classes takes place in LayoutStrategyBuilder::createStrat C++ includes: IInterferenceFunctionStrategy.h "; -%feature("docstring") IInterferenceFunctionStrategy::IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const SimulationOptions &sim_params, bool polarized) +%feature("docstring") IInterferenceFunctionStrategy::IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, const SimulationOptions &sim_params, bool polarized) "; %feature("docstring") IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy() "; -%feature("docstring") IInterferenceFunctionStrategy::init "void IInterferenceFunctionStrategy::init(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff) - -Initializes the object with form factors and an interference function. -"; - %feature("docstring") IInterferenceFunctionStrategy::evaluate "double IInterferenceFunctionStrategy::evaluate(const SimulationElement &sim_element) const Calculates the intensity for scalar particles/interactions. @@ -7574,7 +7569,7 @@ Strategy class to compute the total scattering from a particle layout in the siz C++ includes: SSCApproximationStrategy.h "; -%feature("docstring") SSCApproximationStrategy::SSCApproximationStrategy "SSCApproximationStrategy::SSCApproximationStrategy(SimulationOptions sim_params, double kappa, bool polarized) +%feature("docstring") SSCApproximationStrategy::SSCApproximationStrategy "SSCApproximationStrategy::SSCApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, SimulationOptions sim_params, bool polarized, double kappa) ";