diff --git a/Core/StandardSamples/IsGISAXS15Builder.cpp b/Core/StandardSamples/IsGISAXS15Builder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1773b4acb14b5d3dd0b919dd3842b82bd1fce361 --- /dev/null +++ b/Core/StandardSamples/IsGISAXS15Builder.cpp @@ -0,0 +1,54 @@ +#include "IsGISAXS15Builder.h" +#include "MultiLayer.h" +#include "ParticleDecoration.h" +#include "MaterialManager.h" +#include "Units.h" +#include "InterferenceFunction1DParaCrystal.h" +#include "FormFactorCylinder.h" +#include "StochasticGaussian.h" +#include "StochasticSampledParameter.h" +#include "ParticleBuilder.h" + + +IsGISAXS15Builder::IsGISAXS15Builder() +{ +} + +ISample *IsGISAXS15Builder::buildSample() const +{ + MultiLayer *multi_layer = new MultiLayer(); + + complex_t n_particle(1.0-6e-4, 2e-8); + const IMaterial *p_air_material = + MaterialManager::getHomogeneousMaterial("Air", 0.0, 0.0); + const IMaterial *particle_material = + MaterialManager::getHomogeneousMaterial("Particle", n_particle); + + Layer air_layer; + air_layer.setMaterial(p_air_material); + InterferenceFunction1DParaCrystal *p_interference_function = + new InterferenceFunction1DParaCrystal(15.0*Units::nanometer, + 5*Units::nanometer, 1e3*Units::nanometer); + p_interference_function->setKappa(4.02698); + ParticleDecoration particle_decoration; + Particle particle_prototype(particle_material, new FormFactorCylinder( + 5.0*Units::nanometer, 5.0*Units::nanometer)); + StochasticDoubleGaussian sg(5.0*Units::nanometer, 1.25*Units::nanometer); + StochasticSampledParameter stochastic_radius(sg,30, 2); + ParticleBuilder particle_builder; + particle_builder.setPrototype(particle_prototype, + "/Particle/FormFactorCylinder/radius", stochastic_radius); + particle_builder.plantParticles(particle_decoration); + + // Set height of each particle to its radius (H/R fixed) + ParameterPool *p_parameters = particle_decoration.createParameterTree(); + p_parameters->fixRatioBetweenParameters("height", "radius", 1.0); + + particle_decoration.addInterferenceFunction(p_interference_function); + + air_layer.setDecoration(particle_decoration); + + multi_layer->addLayer(air_layer); + return multi_layer; +} + diff --git a/Core/StandardSamples/IsGISAXS15Builder.h b/Core/StandardSamples/IsGISAXS15Builder.h new file mode 100644 index 0000000000000000000000000000000000000000..624632229ab7d28cb01158a7e6a834232f842444 --- /dev/null +++ b/Core/StandardSamples/IsGISAXS15Builder.h @@ -0,0 +1,15 @@ +#ifndef ISGISAXS15BUILDER_H +#define ISGISAXS15BUILDER_H + +#include "ISampleBuilder.h" + +//! The IsGISAXS15Builder class to build sample: size spacing correlation approximation +//! (IsGISAXS example #15) +class IsGISAXS15Builder : public ISampleBuilder +{ +public: + IsGISAXS15Builder(); + ISample *buildSample() const; +}; + +#endif // ISGISAXS15BUILDER_H diff --git a/Core/StandardSamples/SampleBuilderFactory.cpp b/Core/StandardSamples/SampleBuilderFactory.cpp index 755a34e81d276a97f54d250551c960a84e00d1c5..f8c6136d1073d0eb8e00402a15c310137e5c1713 100644 --- a/Core/StandardSamples/SampleBuilderFactory.cpp +++ b/Core/StandardSamples/SampleBuilderFactory.cpp @@ -9,6 +9,7 @@ #include "IsGISAXS09Builder.h" #include "IsGISAXS10Builder.h" #include "IsGISAXS11Builder.h" +#include "IsGISAXS15Builder.h" #include "MesoCrystal01Builder.h" #include "PolarizedDWBAZeroMagBuilder.h" @@ -99,6 +100,11 @@ SampleBuilderFactory::SampleBuilderFactory() IFactoryCreateFunction<IsGISAXS11Builder, ISampleBuilder>, "Core shell nanoparticles"); + registerItem( + "isgisaxs15", + IFactoryCreateFunction<IsGISAXS15Builder, ISampleBuilder>, + "Size spacing correlation approximation"); + registerItem( "mesocrystal01", IFactoryCreateFunction<MesoCrystal01Builder, ISampleBuilder>, diff --git a/Core/StandardSamples/SimulationRegistry.cpp b/Core/StandardSamples/SimulationRegistry.cpp index e37e5ea51f0bdbe23df678086512a91ed24b8db4..1a65d835831491898949e3344288ef9010e72a94 100644 --- a/Core/StandardSamples/SimulationRegistry.cpp +++ b/Core/StandardSamples/SimulationRegistry.cpp @@ -76,6 +76,11 @@ SimulationRegistry::SimulationRegistry() "isgisaxs11", StandardSimulations::IsGISAXS11, "IsGISAXS11 example, Core shell nanoparticles"); + registerItem( + "isgisaxs15", StandardSimulations::IsGISAXS15, + "IsGISAXS15 example, Size spacing correlation approximation"); + + registerItem( "mesocrystal01", StandardSimulations::MesoCrystal01, "mesocrystals of cylindrical shape composed by spherical nanoparticles"); diff --git a/Core/StandardSamples/StandardSimulations.cpp b/Core/StandardSamples/StandardSimulations.cpp index ffd5a24a17a48581b93b679ffd349c9717fba120..6a43d54f6dd5e806aab8b194c4db8aa219298332 100644 --- a/Core/StandardSamples/StandardSimulations.cpp +++ b/Core/StandardSamples/StandardSimulations.cpp @@ -340,6 +340,26 @@ Simulation *StandardSimulations::IsGISAXS11() return result; } +Simulation *StandardSimulations::IsGISAXS15() +{ + SampleBuilderFactory factory; + ISampleBuilder *builder = factory.createBuilder("isgisaxs15"); + + Simulation *result = new Simulation(); + + result->setDetectorParameters(150, 0.05*Units::degree, 1.5*Units::degree, + 150, 0.05*Units::degree, 1.5*Units::degree, true); + result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, + 0.0*Units::degree); + SimulationParameters sim_params; + sim_params.me_if_approx = SimulationParameters::SSCA; + result->setSimulationParameters(sim_params); + + result->setSampleBuilder( builder ); + + return result; +} + Simulation *StandardSimulations::MesoCrystal01() { SampleBuilderFactory factory; diff --git a/Core/StandardSamples/StandardSimulations.h b/Core/StandardSamples/StandardSimulations.h index 7bb7a6df5256f898f5de2d5d11342ad13bf60dcc..74dcbc02ca780047cf37ae8716a0f0ce122c6c2b 100644 --- a/Core/StandardSamples/StandardSimulations.h +++ b/Core/StandardSamples/StandardSimulations.h @@ -26,7 +26,7 @@ Simulation *IsGISAXS09(); Simulation *IsGISAXS09R(); Simulation *IsGISAXS10(); Simulation *IsGISAXS11(); -//Simulation *IsGISAXS15(); +Simulation *IsGISAXS15(); Simulation *MesoCrystal01(); Simulation *PolarizedDWBAZeroMag(); diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.cpp index c8fb28c6ebe5edba34b435a12ff1b44dcb188944..84fbc01a416cc01de953eb21c5203a159d29c628 100644 --- a/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.cpp +++ b/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.cpp @@ -12,7 +12,7 @@ #include "OutputDataIOFactory.h" #include "Utils.h" #include "MathFunctions.h" - +#include "SimulationRegistry.h" #include <iostream> #include <cmath> @@ -21,74 +21,33 @@ FunctionalTests::IsGISAXS15::IsGISAXS15() : m_name("IsGISAXS15") , m_description("Size spacing correlation approximation") , m_result(0) + , m_reference(0) { } -void FunctionalTests::IsGISAXS15::run() +void FunctionalTests::IsGISAXS15::run(const std::string &path_to_data) { - // building sample - MultiLayer multi_layer; - complex_t n_particle(1.0-6e-4, 2e-8); - const IMaterial *p_air_material = - MaterialManager::getHomogeneousMaterial("Air", 0.0, 0.0); - const IMaterial *particle_material = - MaterialManager::getHomogeneousMaterial("Particle", n_particle); - - Layer air_layer; - air_layer.setMaterial(p_air_material); - InterferenceFunction1DParaCrystal *p_interference_function = - new InterferenceFunction1DParaCrystal(15.0*Units::nanometer, - 5*Units::nanometer, 1e3*Units::nanometer); - p_interference_function->setKappa(4.02698); - ParticleDecoration particle_decoration; - Particle particle_prototype(particle_material, new FormFactorCylinder( - 5.0*Units::nanometer, 5.0*Units::nanometer)); - StochasticDoubleGaussian sg(5.0*Units::nanometer, 1.25*Units::nanometer); - StochasticSampledParameter stochastic_radius(sg,30, 2); - ParticleBuilder particle_builder; - particle_builder.setPrototype(particle_prototype, - "/Particle/FormFactorCylinder/radius", stochastic_radius); - particle_builder.plantParticles(particle_decoration); - - // Set height of each particle to its radius (H/R fixed) - ParameterPool *p_parameters = particle_decoration.createParameterTree(); - p_parameters->fixRatioBetweenParameters("height", "radius", 1.0); - - particle_decoration.addInterferenceFunction(p_interference_function); - - air_layer.setDecoration(particle_decoration); - - multi_layer.addLayer(air_layer); - - // building simulation - Simulation simulation; - simulation.setDetectorParameters(150, 0.05*Units::degree, 1.5*Units::degree, - 150, 0.05*Units::degree, 1.5*Units::degree, true); - simulation.setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, - 0.0*Units::degree); - SimulationParameters sim_params; - sim_params.me_if_approx = SimulationParameters::SSCA; - simulation.setSimulationParameters(sim_params); - simulation.setSample(multi_layer); - - // running simulation and copying the data - simulation.runSimulation(); - m_result = simulation.getIntensityData(); + SimulationRegistry sim_registry; + Simulation *simulation = sim_registry.createSimulation("isgisaxs15"); + + // loading reference data + std::string filename = path_to_data + "isgisaxs15_reference.ima.gz"; + m_reference = OutputDataIOFactory::readIntensityData(filename); + + simulation->runSimulation(); + + m_result = simulation->getIntensityData(); + delete simulation; } -int FunctionalTests::IsGISAXS15::analyseResults(const std::string &path_to_data) +int FunctionalTests::IsGISAXS15::analyseResults() { const double threshold(2e-10); - // retrieving reference data - std::string filename = path_to_data + "isgisaxs15_reference.ima.gz"; - OutputData<double > *reference = OutputDataIOFactory::readIntensityData(filename); - // calculating average relative difference - *m_result -= *reference; - *m_result /= *reference; - delete reference; + *m_result -= *m_reference; + *m_result /= *m_reference; double diff(0); for(OutputData<double>::const_iterator it=m_result->begin(); @@ -116,8 +75,8 @@ std::string GetPathToData(int argc, char **argv) int main(int argc, char **argv) { FunctionalTests::IsGISAXS15 test; - test.run(); - return test.analyseResults(GetPathToData(argc, argv)); + test.run(GetPathToData(argc, argv)); + return test.analyseResults(); } #endif diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.h b/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.h index 5863eacc86cac48405783db7133021e6dc957638..a91e1104ce01b339da04bf59ee350fa5935c9990 100644 --- a/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.h +++ b/Tests/FunctionalTests/TestCore/IsGISAXS15/IsGISAXS15.h @@ -1,7 +1,7 @@ #ifndef FUNCTIONALTESTS_ISGISAXS15_H #define FUNCTIONALTESTS_ISGISAXS15_H - +#include "ISampleBuilder.h" #include <string> #include "OutputData.h" @@ -12,10 +12,10 @@ class IsGISAXS15 { public : IsGISAXS15(); - ~IsGISAXS15() { delete m_result; } + ~IsGISAXS15() { delete m_result; delete m_reference; } - void run(); - int analyseResults(const std::string &path_to_data = std::string()); + void run(const std::string &path_to_data = std::string()); + int analyseResults(); const OutputData<double> *getOutputData() { return m_result; } @@ -23,6 +23,7 @@ public : std::string m_name; std::string m_description; OutputData<double> *m_result; + OutputData<double> *m_reference; }; }