diff --git a/Core/Multilayer/IMultiLayerBuilder.h b/Core/Multilayer/IMultiLayerBuilder.h index 00bf90dd3e3e13b0cc3b73b33648db97d0350912..6d1cc7e58823bd1144931f3b573076144ce45c10 100644 --- a/Core/Multilayer/IMultiLayerBuilder.h +++ b/Core/Multilayer/IMultiLayerBuilder.h @@ -44,6 +44,9 @@ public: // Without duplication below PythonBindings doesn't work for shared_ptr<IMultiLayerBuilder> virtual void onChange() {} + + virtual MultiLayer* createSample(size_t index=0) { (void)index; return buildSample(); } + virtual size_t size() { return 1;} }; #endif // IMULTILAYERBUILDER_H diff --git a/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp b/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp index 558d9a856bc48e6f2e91eab51a509e883a806e6e..9c42ca71615a7da746ce63ad99666b92f73256bd 100644 --- a/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp +++ b/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp @@ -24,6 +24,7 @@ #include "ParticleLayout.h" #include "RealParameter.h" #include "Units.h" +#include "SubtestRegistry.h" MultiLayer* LayersWithAbsorptionBuilder::buildSample() const { @@ -60,3 +61,30 @@ MultiLayer* LayersWithAbsorptionBuilder::buildSample() const multi_layer->addLayer(substrate); return multi_layer; } + +MultiLayer* LayersWithAbsorptionBuilder::createSample(size_t index) +{ + if(index >= size()) + throw std::runtime_error("ParticleInTheAirBuilder::createSample() -> Error. " + "Sample index is out of range."); + + auto ff_names = ff_registry().keys(); + m_subtest_item = ff_registry().getItem(ff_names[index]); + + setName(ff_names[index]); + + return buildSample(); +} + +size_t LayersWithAbsorptionBuilder::size() +{ + static size_t result = ff_registry().keys().size(); + return result; +} + +SubtestRegistryFormFactor& LayersWithAbsorptionBuilder::ff_registry() +{ + static SubtestRegistryFormFactor result = SubtestRegistryFormFactor(); + return result; +} + diff --git a/Core/StandardSamples/LayersWithAbsorptionBuilder.h b/Core/StandardSamples/LayersWithAbsorptionBuilder.h index 226d381f9e1d94399eedbf5857aa3d87bd4fc8d5..cdf83a89a8445c1ffc330e68c1b1bfdfe1189171 100644 --- a/Core/StandardSamples/LayersWithAbsorptionBuilder.h +++ b/Core/StandardSamples/LayersWithAbsorptionBuilder.h @@ -17,6 +17,7 @@ #define LAYERSWITHABSORPTIONBUILDER_H #include "IMultiLayerBuilder.h" +class SubtestRegistryFormFactor; //! The LayersWithAbsorptionBuilder class generates a multilayer with 3 layers with //! absorption (refractive index has imaginary part). @@ -31,6 +32,12 @@ public: LayersWithAbsorptionBuilder() {} virtual ~LayersWithAbsorptionBuilder() {} virtual MultiLayer* buildSample() const; + + MultiLayer* createSample(size_t index=0); + size_t size(); + +private: + SubtestRegistryFormFactor& ff_registry(); }; #endif // LAYERSWITHABSORPTIONBUILDER_H diff --git a/Core/StandardSamples/ParaCrystalBuilder.cpp b/Core/StandardSamples/ParaCrystalBuilder.cpp index 044e3471e244c763a57e3f1d7eae6ab5f4a3efd6..a2f30b516377693159e0c2c74582bbbe617220df 100644 --- a/Core/StandardSamples/ParaCrystalBuilder.cpp +++ b/Core/StandardSamples/ParaCrystalBuilder.cpp @@ -24,6 +24,7 @@ #include "ParticleLayout.h" #include "RealParameter.h" #include "Units.h" +#include "SubtestRegistry.h" RadialParaCrystalBuilder::RadialParaCrystalBuilder() : m_corr_peak_distance(20.0*Units::nanometer) @@ -129,6 +130,32 @@ MultiLayer* Basic2DParaCrystalBuilder::buildSample() const return multi_layer; } +MultiLayer* Basic2DParaCrystalBuilder::createSample(size_t index) +{ + if(index >= size()) + throw std::runtime_error("Basic2DParaCrystalBuilder::createSample() -> Error. " + "Sample index is out of range."); + + auto names = pdf_registry().keys(); + m_subtest_item = pdf_registry().getItem(names[index]); + + setName(names[index]); + + return buildSample(); +} + +size_t Basic2DParaCrystalBuilder::size() +{ + static size_t result = pdf_registry().keys().size(); + return result; +} + +SubtestRegistryFTDistribution2D& Basic2DParaCrystalBuilder::pdf_registry() +{ + static SubtestRegistryFTDistribution2D result = SubtestRegistryFTDistribution2D(); + return result; +} + // ----------------------------------------------------------------------------- diff --git a/Core/StandardSamples/ParaCrystalBuilder.h b/Core/StandardSamples/ParaCrystalBuilder.h index 1c40c87c4e1416a333e319c9e54355fcad821db3..fa3a2e07bdd6f2565cab70c999cf3a0aa28a08db 100644 --- a/Core/StandardSamples/ParaCrystalBuilder.h +++ b/Core/StandardSamples/ParaCrystalBuilder.h @@ -21,6 +21,7 @@ class IFTDistribution2D; class ISample; +class SubtestRegistryFTDistribution2D; //! @ingroup standard_samples //! Builds sample: cylinders with 1DDL structure factor (IsGISAXS example #4). @@ -52,7 +53,12 @@ public: Basic2DParaCrystalBuilder(); virtual ~Basic2DParaCrystalBuilder(); virtual MultiLayer* buildSample() const; + + MultiLayer* createSample(size_t index=0); + size_t size(); + private: + SubtestRegistryFTDistribution2D& pdf_registry(); std::unique_ptr<IFTDistribution2D> m_pdf1; std::unique_ptr<IFTDistribution2D> m_pdf2; }; diff --git a/Core/StandardSamples/ParticleInTheAirBuilder.cpp b/Core/StandardSamples/ParticleInTheAirBuilder.cpp index e0f65197e459ca926461631efd7e98f772e33584..89adc8b79ac3a8322988b7ad0abb8335bfa55932 100644 --- a/Core/StandardSamples/ParticleInTheAirBuilder.cpp +++ b/Core/StandardSamples/ParticleInTheAirBuilder.cpp @@ -21,6 +21,7 @@ #include "Particle.h" #include "ParticleLayout.h" #include "RealParameter.h" +#include "SubtestRegistry.h" MultiLayer* ParticleInTheAirBuilder::buildSample() const { @@ -43,3 +44,29 @@ MultiLayer* ParticleInTheAirBuilder::buildSample() const return result; } + +MultiLayer* ParticleInTheAirBuilder::createSample(size_t index) +{ + if(index >= size()) + throw std::runtime_error("ParticleInTheAirBuilder::createSample() -> Error. " + "Sample index is out of range."); + + auto ff_names = ff_registry().keys(); + m_subtest_item = ff_registry().getItem(ff_names[index]); + + setName(ff_names[index]); + + return buildSample(); +} + +size_t ParticleInTheAirBuilder::size() +{ + static size_t result = ff_registry().keys().size(); + return result; +} + +SubtestRegistryFormFactor& ParticleInTheAirBuilder::ff_registry() +{ + static SubtestRegistryFormFactor result = SubtestRegistryFormFactor(); + return result; +} diff --git a/Core/StandardSamples/ParticleInTheAirBuilder.h b/Core/StandardSamples/ParticleInTheAirBuilder.h index 49d1b13273e3d857e0e61ad777a1621b4228b137..6b790a88e266a6dfb6a3ca5815dc3e5391363497 100644 --- a/Core/StandardSamples/ParticleInTheAirBuilder.h +++ b/Core/StandardSamples/ParticleInTheAirBuilder.h @@ -18,6 +18,8 @@ #include "IMultiLayerBuilder.h" +class SubtestRegistryFormFactor; + //! The ParticleInTheAirBuilder class generates a multilayer with single air layer //! populated with particles of certain types. //! Requires IComponentService which generates form factors, used for bulk form factors testing. @@ -29,6 +31,12 @@ public: ParticleInTheAirBuilder() {} virtual ~ParticleInTheAirBuilder() {} virtual MultiLayer* buildSample() const; + + MultiLayer* createSample(size_t index=0); + size_t size(); + +private: + SubtestRegistryFormFactor& ff_registry(); }; #endif // PARTICLEINTHEAIRBUILDER_H