diff --git a/Core/StandardSamples/IsGISAXS07Builder.cpp b/Core/StandardSamples/IsGISAXS07Builder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1e7d44c983bc85cce676ee36d4bfec31f0381f1d --- /dev/null +++ b/Core/StandardSamples/IsGISAXS07Builder.cpp @@ -0,0 +1,122 @@ +#include "IsGISAXS07Builder.h" +#include "MultiLayer.h" +#include "ParticleDecoration.h" +#include "MaterialManager.h" +#include "Rotate3D.h" +#include "FormFactorBox.h" +#include "Simulation.h" +#include "OutputDataIOFactory.h" +#include "PositionParticleInfo.h" +#include "Utils.h" +#include "Units.h" +#include "MathFunctions.h" +#include <iostream> +#include <cmath> + +IsGISAXS07Builder::IsGISAXS07Builder() +{ +} + + +ISample *IsGISAXS07Builder::buildSample() const +{ + + // building sample + MultiLayer* multi_layer = new MultiLayer(); + const IMaterial *p_air_material = MaterialManager::getHomogeneousMaterial("Air", 0.0, 0.0); + complex_t n_particle(1.0-6e-4, 2e-8); + const IMaterial *particle_material = + MaterialManager::getHomogeneousMaterial("Particle", n_particle); + + Layer air_layer; + air_layer.setMaterial(p_air_material); + + + ParticleDecoration particle_decoration; + + // add particle number 1: + FormFactorBox ff1(2.0*Units::nanometer, 2.0*Units::nanometer, + 1.0*Units::nanometer); + kvector_t pos1(0.0*Units::nanometer, 0.0*Units::nanometer, 0.0); + PositionParticleInfo particle_info1(new Particle(particle_material, ff1), + pos1, 0.5); + particle_decoration.addParticleInfo(particle_info1); + // add particle number 2: + FormFactorBox ff2(2.0*Units::nanometer, 4.0*Units::nanometer, + 1.0*Units::nanometer); + kvector_t pos2(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0); + Geometry::RotateZ_3D m2(10*Units::degree); + PositionParticleInfo particle_info2( + new Particle(particle_material, ff2, m2), pos2, 0.5); + particle_decoration.addParticleInfo(particle_info2); + // add particle number 3: + FormFactorBox ff3(2.0*Units::nanometer, 6.0*Units::nanometer, + 1.0*Units::nanometer); + kvector_t pos3(-5.0*Units::nanometer, -5.0*Units::nanometer, 0.0); + Geometry::RotateZ_3D m3(20*Units::degree); + PositionParticleInfo particle_info3( + new Particle(particle_material, ff3, m3), pos3, 0.5); + particle_decoration.addParticleInfo(particle_info3); + // add particle number 4: + FormFactorBox ff4(2.0*Units::nanometer, 8.0*Units::nanometer, + 1.0*Units::nanometer); + kvector_t pos4(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0); + Geometry::RotateZ_3D m4(30*Units::degree); + PositionParticleInfo particle_info4( + new Particle(particle_material, ff4, m4), pos4, 0.5); + particle_decoration.addParticleInfo(particle_info4); + // add particle number 5: + FormFactorBox ff5(2.0*Units::nanometer, 10.0*Units::nanometer, + 1.0*Units::nanometer); + kvector_t pos5(-5.0*Units::nanometer, 5.0*Units::nanometer, 0.0); + Geometry::RotateZ_3D m5(40*Units::degree); + PositionParticleInfo particle_info5( + new Particle(particle_material, ff5, m5), pos5, 0.5); + particle_decoration.addParticleInfo(particle_info5); + // add particle number 6: + FormFactorBox ff6(2.0*Units::nanometer, 2.0*Units::nanometer, + 1.0*Units::nanometer); + kvector_t pos6(0.0*Units::nanometer, 0.0*Units::nanometer, 0.0); + Geometry::RotateZ_3D m6(50*Units::degree); + PositionParticleInfo particle_info6( + new Particle(particle_material, ff6, m6), pos6, 0.5); + particle_decoration.addParticleInfo(particle_info6); + // add particle number 7: + FormFactorBox ff7(2.0*Units::nanometer, 4.0*Units::nanometer, + 1.0*Units::nanometer); + kvector_t pos7(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0); + Geometry::RotateZ_3D m7(60*Units::degree); + PositionParticleInfo particle_info7( + new Particle(particle_material, ff7, m7), pos7, 0.5); + particle_decoration.addParticleInfo(particle_info7); + // add particle number 8: + FormFactorBox ff8(2.0*Units::nanometer, 6.0*Units::nanometer, + 1.0*Units::nanometer); + kvector_t pos8(-5.0*Units::nanometer, -5.0*Units::nanometer, 0.0); + Geometry::RotateZ_3D m8(70*Units::degree); + PositionParticleInfo particle_info8( + new Particle(particle_material, ff8, m8), pos8, 0.5); + particle_decoration.addParticleInfo(particle_info8); + // add particle number 9: + FormFactorBox ff9(2.0*Units::nanometer, 8.0*Units::nanometer, + 1.0*Units::nanometer); + kvector_t pos9(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0); + Geometry::RotateZ_3D m9(80*Units::degree); + PositionParticleInfo particle_info9( + new Particle(particle_material, ff9, m9), pos9, 0.5); + particle_decoration.addParticleInfo(particle_info9); + // add particle number 10: + FormFactorBox ff10(2.0*Units::nanometer, 10.0*Units::nanometer, + 1.0*Units::nanometer); + kvector_t pos10(-5.0*Units::nanometer, 5.0*Units::nanometer, 0.0); + Geometry::RotateZ_3D m10(90*Units::degree); + PositionParticleInfo particle_info10( + new Particle(particle_material, ff10, m10), pos10, 0.5); + particle_decoration.addParticleInfo(particle_info10); + + air_layer.setDecoration(particle_decoration); + multi_layer->addLayer(air_layer); + + return multi_layer; +} + diff --git a/Core/StandardSamples/IsGISAXS07Builder.h b/Core/StandardSamples/IsGISAXS07Builder.h new file mode 100644 index 0000000000000000000000000000000000000000..724e30ee7b353ff4bd5c73fe64b93159d1bdbea5 --- /dev/null +++ b/Core/StandardSamples/IsGISAXS07Builder.h @@ -0,0 +1,15 @@ +#ifndef ISGISAXS07BUILDER_H +#define ISGISAXS07BUILDER_H + +#include "ISampleBuilder.h" + +//! The IsGISAXS07Builder class to build sample: Mixture of different particles +//! (IsGISAXS example #7) +class IsGISAXS07Builder : public ISampleBuilder +{ +public: + IsGISAXS07Builder(); + ISample *buildSample() const; +}; + +#endif // ISGISAXS07BUILDER_H diff --git a/Core/StandardSamples/SampleBuilderFactory.cpp b/Core/StandardSamples/SampleBuilderFactory.cpp index 91f80ff90c582873056b2d269180ffa3ff360178..0c5c03d775be1a15839764aed04047aa6f6cdd32 100644 --- a/Core/StandardSamples/SampleBuilderFactory.cpp +++ b/Core/StandardSamples/SampleBuilderFactory.cpp @@ -4,6 +4,7 @@ #include "IsGISAXS03Builder.h" #include "IsGISAXS04Builder.h" #include "IsGISAXS06Builder.h" +#include "IsGISAXS07Builder.h" #include "IsGISAXS09Builder.h" #include "MesoCrystal01Builder.h" #include "PolarizedDWBAZeroMagBuilder.h" @@ -61,6 +62,10 @@ SampleBuilderFactory::SampleBuilderFactory() IFactoryCreateFunction<IsGISAXS06Lattice4Builder, ISampleBuilder>, "2D lattice variants"); + registerItem( + "isgisaxs07", + IFactoryCreateFunction<IsGISAXS07Builder, ISampleBuilder>, + "Mixture of different particles"); registerItem( "isgisaxs09", diff --git a/Core/StandardSamples/SimulationRegistry.cpp b/Core/StandardSamples/SimulationRegistry.cpp index 2f2a9b841400e46c721719f5d96a45eed0d18b53..373714bd259274d7226a983712524c45c989225d 100644 --- a/Core/StandardSamples/SimulationRegistry.cpp +++ b/Core/StandardSamples/SimulationRegistry.cpp @@ -47,6 +47,10 @@ SimulationRegistry::SimulationRegistry() "isgisaxs06_lattice4", StandardSimulations::IsGISAXS06L4, "IsGISAXS06 example, 2D lattice variants"); + registerItem( + "isgisaxs07", StandardSimulations::IsGISAXS07, + "Mixture of different particles defined in morphology file"); + 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 d552a3d29af1e618329e660d8b1ee87ca3b9a2f8..ffcb9d4f532a546775b2c4b40f5cc09e3ed30be7 100644 --- a/Core/StandardSamples/StandardSimulations.cpp +++ b/Core/StandardSamples/StandardSimulations.cpp @@ -216,6 +216,26 @@ Simulation *StandardSimulations::IsGISAXS06L4() return result; } +Simulation *StandardSimulations::IsGISAXS07() +{ + SampleBuilderFactory factory; + ISampleBuilder *builder = factory.createBuilder("isgisaxs07"); + + Simulation *result = new Simulation(); + + result->setDetectorParameters(100, 0.0*Units::degree, 1.0*Units::degree, + 100, 0.0*Units::degree, 1.0*Units::degree, true); + result->setBeamParameters(1.0*Units::angstrom, 0.0*Units::degree, 0.0*Units::degree); + + SimulationParameters sim_params; + sim_params.me_if_approx = SimulationParameters::ISGISAXSMOR; + 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 18ba01dbb0975cd36894d325a81f4bce26f12b46..8f281f430a959008a0cbbd39ba7bccbe5236fa0c 100644 --- a/Core/StandardSamples/StandardSimulations.h +++ b/Core/StandardSamples/StandardSimulations.h @@ -19,7 +19,7 @@ Simulation *IsGISAXS06L1(); Simulation *IsGISAXS06L2(); Simulation *IsGISAXS06L3(); Simulation *IsGISAXS06L4(); -//Simulation *IsGISAXS07(); +Simulation *IsGISAXS07(); //Simulation *IsGISAXS08(); //Simulation *IsGISAXS09(); //Simulation *IsGISAXS10(); diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.cpp index 1f700bf93ae84dc0185b2a952eb8d4c29a407cb9..e540d38eeb5f22652a272569eab48fcf4b2159bc 100644 --- a/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.cpp +++ b/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.cpp @@ -10,6 +10,7 @@ #include "Utils.h" #include "Units.h" #include "MathFunctions.h" +#include "SimulationRegistry.h" #include <iostream> #include <cmath> @@ -17,143 +18,32 @@ FunctionalTests::IsGISAXS07::IsGISAXS07() : m_name("IsGISAXS07") , m_description("Mixture of different particles defined in morphology file") , m_result(0) + , m_reference(0) { } -void FunctionalTests::IsGISAXS07::run() +void FunctionalTests::IsGISAXS07::run(const std::string &path_to_data) { - // building sample - MultiLayer multi_layer; - const IMaterial *p_air_material = MaterialManager::getHomogeneousMaterial("Air", 0.0, 0.0); - complex_t n_particle(1.0-6e-4, 2e-8); - const IMaterial *particle_material = - MaterialManager::getHomogeneousMaterial("Particle", n_particle); + SimulationRegistry sim_registry; + Simulation *simulation = sim_registry.createSimulation("isgisaxs07"); - Layer air_layer; - air_layer.setMaterial(p_air_material); - - - ParticleDecoration particle_decoration; - - // add particle number 1: - FormFactorBox ff1(2.0*Units::nanometer, 2.0*Units::nanometer, - 1.0*Units::nanometer); - kvector_t pos1(0.0*Units::nanometer, 0.0*Units::nanometer, 0.0); - PositionParticleInfo particle_info1(new Particle(particle_material, ff1), - pos1, 0.5); - particle_decoration.addParticleInfo(particle_info1); - // add particle number 2: - FormFactorBox ff2(2.0*Units::nanometer, 4.0*Units::nanometer, - 1.0*Units::nanometer); - kvector_t pos2(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0); - Geometry::RotateZ_3D m2(10*Units::degree); - PositionParticleInfo particle_info2( - new Particle(particle_material, ff2, m2), pos2, 0.5); - particle_decoration.addParticleInfo(particle_info2); - // add particle number 3: - FormFactorBox ff3(2.0*Units::nanometer, 6.0*Units::nanometer, - 1.0*Units::nanometer); - kvector_t pos3(-5.0*Units::nanometer, -5.0*Units::nanometer, 0.0); - Geometry::RotateZ_3D m3(20*Units::degree); - PositionParticleInfo particle_info3( - new Particle(particle_material, ff3, m3), pos3, 0.5); - particle_decoration.addParticleInfo(particle_info3); - // add particle number 4: - FormFactorBox ff4(2.0*Units::nanometer, 8.0*Units::nanometer, - 1.0*Units::nanometer); - kvector_t pos4(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0); - Geometry::RotateZ_3D m4(30*Units::degree); - PositionParticleInfo particle_info4( - new Particle(particle_material, ff4, m4), pos4, 0.5); - particle_decoration.addParticleInfo(particle_info4); - // add particle number 5: - FormFactorBox ff5(2.0*Units::nanometer, 10.0*Units::nanometer, - 1.0*Units::nanometer); - kvector_t pos5(-5.0*Units::nanometer, 5.0*Units::nanometer, 0.0); - Geometry::RotateZ_3D m5(40*Units::degree); - PositionParticleInfo particle_info5( - new Particle(particle_material, ff5, m5), pos5, 0.5); - particle_decoration.addParticleInfo(particle_info5); - // add particle number 6: - FormFactorBox ff6(2.0*Units::nanometer, 2.0*Units::nanometer, - 1.0*Units::nanometer); - kvector_t pos6(0.0*Units::nanometer, 0.0*Units::nanometer, 0.0); - Geometry::RotateZ_3D m6(50*Units::degree); - PositionParticleInfo particle_info6( - new Particle(particle_material, ff6, m6), pos6, 0.5); - particle_decoration.addParticleInfo(particle_info6); - // add particle number 7: - FormFactorBox ff7(2.0*Units::nanometer, 4.0*Units::nanometer, - 1.0*Units::nanometer); - kvector_t pos7(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0); - Geometry::RotateZ_3D m7(60*Units::degree); - PositionParticleInfo particle_info7( - new Particle(particle_material, ff7, m7), pos7, 0.5); - particle_decoration.addParticleInfo(particle_info7); - // add particle number 8: - FormFactorBox ff8(2.0*Units::nanometer, 6.0*Units::nanometer, - 1.0*Units::nanometer); - kvector_t pos8(-5.0*Units::nanometer, -5.0*Units::nanometer, 0.0); - Geometry::RotateZ_3D m8(70*Units::degree); - PositionParticleInfo particle_info8( - new Particle(particle_material, ff8, m8), pos8, 0.5); - particle_decoration.addParticleInfo(particle_info8); - // add particle number 9: - FormFactorBox ff9(2.0*Units::nanometer, 8.0*Units::nanometer, - 1.0*Units::nanometer); - kvector_t pos9(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0); - Geometry::RotateZ_3D m9(80*Units::degree); - PositionParticleInfo particle_info9( - new Particle(particle_material, ff9, m9), pos9, 0.5); - particle_decoration.addParticleInfo(particle_info9); - // add particle number 10: - FormFactorBox ff10(2.0*Units::nanometer, 10.0*Units::nanometer, - 1.0*Units::nanometer); - kvector_t pos10(-5.0*Units::nanometer, 5.0*Units::nanometer, 0.0); - Geometry::RotateZ_3D m10(90*Units::degree); - PositionParticleInfo particle_info10( - new Particle(particle_material, ff10, m10), pos10, 0.5); - particle_decoration.addParticleInfo(particle_info10); - - air_layer.setDecoration(particle_decoration); - multi_layer.addLayer(air_layer); - - // --------------------- - // building simulation - // --------------------- - Simulation simulation; - simulation.setDetectorParameters(100, 0.0*Units::degree, 1.0*Units::degree, - 100, 0.0*Units::degree, 1.0*Units::degree, true); - simulation.setBeamParameters(1.0*Units::angstrom, 0.0*Units::degree, 0.0*Units::degree); - - SimulationParameters sim_params; - sim_params.me_if_approx = SimulationParameters::ISGISAXSMOR; - simulation.setSimulationParameters(sim_params); + // loading reference data + std::string filename = path_to_data + "isgisaxs07_reference.ima.gz"; + m_reference = OutputDataIOFactory::readIntensityData(filename); - // --------------------- - // running simulation - // --------------------- - simulation.setSample(multi_layer); - simulation.runSimulation(); + simulation->runSimulation(); - // --------------------- - // copying data - // --------------------- - m_result = simulation.getIntensityData(); + m_result = simulation->getIntensityData(); + delete simulation; } -int FunctionalTests::IsGISAXS07::analyseResults(const std::string &path_to_data) +int FunctionalTests::IsGISAXS07::analyseResults() { const double threshold(2e-10); - // retrieving reference data - std::string filename = path_to_data + "isgisaxs07_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(); it!=m_result->end(); ++it) { @@ -162,7 +52,7 @@ int FunctionalTests::IsGISAXS07::analyseResults(const std::string &path_to_data) diff /= m_result->getAllocatedSize(); bool status_ok(true); - if( diff > threshold || MathFunctions::isnan(diff)) status_ok=false; + if( diff > threshold || std::isnan(diff)) status_ok=false; std::cout << m_name << " " << m_description << " " << (status_ok ? "[OK]" : "[FAILED]") << std::endl; return (status_ok ? 0 : 1); @@ -178,8 +68,8 @@ std::string GetPathToData(int argc, char **argv) int main(int argc, char **argv) { FunctionalTests::IsGISAXS07 test; - test.run(); + test.run(GetPathToData(argc, argv)); - return test.analyseResults(GetPathToData(argc, argv)); + return test.analyseResults(); } #endif diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.h b/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.h index bc1a5e98e3b16994c02be626564d2f94e5fa9d8d..d08a988663a6d75a8cf49fe83fa49b19ca744fe1 100644 --- a/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.h +++ b/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.h @@ -1,7 +1,7 @@ #ifndef FUNCTIONALTESTS_ISGISAXS07_H #define FUNCTIONALTESTS_ISGISAXS07_H - +#include "ISampleBuilder.h" #include <string> #include "OutputData.h" @@ -13,14 +13,15 @@ class IsGISAXS07 { public: IsGISAXS07(); - ~IsGISAXS07() { delete m_result; } - void run(); - int analyseResults(const std::string &path_to_data = std::string()); + ~IsGISAXS07() { delete m_result; delete m_reference;} + void run(const std::string &path_to_data = std::string()); + int analyseResults(); const OutputData<double> *getOutputData() { return m_result;} private: std::string m_name; std::string m_description; OutputData<double> *m_result; + OutputData<double> *m_reference; }; }