diff --git a/Core/StandardSamples/StandardSimulations.cpp b/Core/StandardSamples/StandardSimulations.cpp index 0f86c8047042b350cfc4f911d3e2ebc8f3b684a1..fa9e2c75806cf189bea53dcdfd5c6e2c842dac08 100644 --- a/Core/StandardSamples/StandardSimulations.cpp +++ b/Core/StandardSamples/StandardSimulations.cpp @@ -18,6 +18,7 @@ #include "DepthProbeSimulation.h" #include "Distributions.h" #include "Ellipse.h" +#include "FixedBinAxis.h" #include "FootprintFactorGaussian.h" #include "FootprintFactorSquare.h" #include "GISASSimulation.h" @@ -30,6 +31,7 @@ #include "RectangularDetector.h" #include "ResolutionFunction2DGaussian.h" #include "SampleBuilderFactory.h" +#include "SpecularScan.h" #include "SpecularSimulation.h" #include "OffSpecSimulation.h" #include "Units.h" @@ -379,18 +381,16 @@ GISASSimulation* StandardSimulations::ConstantBackgroundGISAS() return result; } -#include "FixedBinAxis.h" SpecularSimulation* StandardSimulations::BasicSpecular() { const double wavelength = 1.54 * Units::angstrom; const int number_of_bins = 2000; const double min_angle = 0 * Units::deg; const double max_angle = 5 * Units::deg; - - FixedBinAxis angle_axis("axis", number_of_bins, min_angle, max_angle); + AngularSpecScan scan(wavelength, FixedBinAxis("axis", number_of_bins, min_angle, max_angle)); std::unique_ptr<SpecularSimulation> result(new SpecularSimulation()); - result->setBeamParameters(wavelength, angle_axis); + result->setScan(scan); result->getOptions().setUseAvgMaterials(true); return result.release(); } @@ -410,9 +410,10 @@ SpecularSimulation* StandardSimulations::BasicSpecularQ() for (size_t i = 0, size = qs.size(); i < size; ++i) qs[i] = 4.0 * M_PI * std::sin(angles[i]) / wavelength_0; } + QSpecScan q_scan(qs); std::unique_ptr<SpecularSimulation> result(new SpecularSimulation()); - result->setBeamParameters(qs); + result->setScan(q_scan); result->getOptions().setUseAvgMaterials(true); return result.release(); } @@ -423,11 +424,12 @@ SpecularSimulation* StandardSimulations::SpecularWithGaussianBeam() const int number_of_bins = 2000; const double min_angle = 0 * Units::deg; const double max_angle = 5 * Units::deg; - auto gaussian_ff = std::make_unique<FootprintFactorGaussian>(1.0); + AngularSpecScan scan(wavelength, FixedBinAxis("axis", number_of_bins, min_angle, max_angle)); + scan.setFootprintFactor(gaussian_ff.get()); std::unique_ptr<SpecularSimulation> result(new SpecularSimulation()); - result->setBeamParameters(wavelength, number_of_bins, min_angle, max_angle, gaussian_ff.get()); + result->setScan(scan); return result.release(); } @@ -437,11 +439,12 @@ SpecularSimulation* StandardSimulations::SpecularWithSquareBeam() const int number_of_bins = 2000; const double min_angle = 0 * Units::deg; const double max_angle = 5 * Units::deg; - auto square_ff = std::make_unique<FootprintFactorSquare>(1.0); + AngularSpecScan scan(wavelength, FixedBinAxis("axis", number_of_bins, min_angle, max_angle)); + scan.setFootprintFactor(square_ff.get()); std::unique_ptr<SpecularSimulation> result(new SpecularSimulation()); - result->setBeamParameters(wavelength, number_of_bins, min_angle, max_angle, square_ff.get()); + result->setScan(scan); return result.release(); } @@ -452,12 +455,13 @@ SpecularSimulation* StandardSimulations::SpecularDivergentBeam() const size_t n_integration_points = 10; const double min_angle = 0 * Units::deg; const double max_angle = 5 * Units::deg; + AngularSpecScan scan(wavelength, FixedBinAxis("axis", number_of_bins, min_angle, max_angle)); DistributionGaussian wavelength_distr(wavelength, 0.1*Units::angstrom); DistributionGaussian alpha_distr(0.0, 0.1*Units::degree); std::unique_ptr<SpecularSimulation> result(new SpecularSimulation()); - result->setBeamParameters(wavelength, number_of_bins, min_angle, max_angle); + result->setScan(scan); ParameterPattern pattern1; pattern1.beginsWith("*").add(BornAgain::BeamType).add(BornAgain::Wavelength); diff --git a/GUI/coregui/Models/DomainSimulationBuilder.cpp b/GUI/coregui/Models/DomainSimulationBuilder.cpp index 26263fc8ef29b47a10d0ca96349bfc925621765f..82286be4d3c3854b214e68102c855f0f0d66412b 100644 --- a/GUI/coregui/Models/DomainSimulationBuilder.cpp +++ b/GUI/coregui/Models/DomainSimulationBuilder.cpp @@ -16,6 +16,8 @@ #include "AxesItems.h" #include "BackgroundItems.h" #include "BeamItems.h" +#include "DepthProbeInstrumentItem.h" +#include "DepthProbeSimulation.h" #include "DetectorItems.h" #include "DomainObjectBuilder.h" #include "FootprintItems.h" @@ -28,11 +30,10 @@ #include "MultiLayerItem.h" #include "OffSpecSimulation.h" #include "SimulationOptionsItem.h" -#include "SpecularSimulation.h" #include "SpecularBeamInclinationItem.h" +#include "SpecularScan.h" +#include "SpecularSimulation.h" #include "TransformToDomain.h" -#include "DepthProbeSimulation.h" -#include "DepthProbeInstrumentItem.h" #include "Units.h" namespace { @@ -154,10 +155,11 @@ createSpecularSimulation(std::unique_ptr<MultiLayer> P_multilayer, const auto axis_item = beam_item->currentInclinationAxisItem(); const auto footprint = beam_item->currentFootprintItem(); + AngularSpecScan scan(beam_item->getWavelength(), *axis_item->createAxis(Units::degree)); + scan.setFootprintFactor(footprint->createFootprint().get()); + specular_simulation->setBeamIntensity(beam_item->getIntensity()); - specular_simulation->setBeamParameters(beam_item->getWavelength(), - *axis_item->createAxis(Units::degree), - footprint->createFootprint().get()); + specular_simulation->setScan(scan); TransformToDomain::addDistributionParametersToSimulation(*beam_item, *specular_simulation.get()); diff --git a/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp b/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp index bf7963bb11cecc2714232e28f9ee8254c82c50b6..0cbc22e91d2918df964e9413eceb4dca7ce7fd0d 100644 --- a/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp +++ b/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp @@ -10,6 +10,7 @@ #include "MultiLayer.h" #include "ParameterPattern.h" #include "RealParameter.h" +#include "SpecularScan.h" #include "SpecularSimulation.h" #include "Units.h" #include "VariableBinAxis.h" @@ -56,7 +57,8 @@ TEST_F(SpecularSimulationTest, InitialState) std::unique_ptr<SpecularSimulation> SpecularSimulationTest::defaultSimulation() { auto result = std::make_unique<SpecularSimulation>(); - result->setBeamParameters(1.0, 10, 0.0 * Units::degree, 2.0 * Units::degree); + AngularSpecScan scan(1.0, FixedBinAxis("axis", 10, 0.0 * Units::degree, 2.0 * Units::degree)); + result->setScan(scan); result->setSample(multilayer); return result; } @@ -83,12 +85,12 @@ TEST_F(SpecularSimulationTest, CloneOfEmpty) checkBeamState(*clone); } -TEST_F(SpecularSimulationTest, SetBeamParameters) +TEST_F(SpecularSimulationTest, SetAngularScan) { SpecularSimulation sim; - VariableBinAxis axis("axis", 2, std::vector<double>{1.0, 2.0, 3.0}); - sim.setBeamParameters(1.0, axis); + AngularSpecScan scan(1.0, std::vector<double>{1.0, 3.0}); + sim.setScan(scan); const auto& beam = sim.getInstrument().getBeam(); @@ -105,7 +107,8 @@ TEST_F(SpecularSimulationTest, SetBeamParameters) sim.setBeamIntensity(2.0); EXPECT_EQ(2.0, beam.getIntensity()); - sim.setBeamParameters(1.0, 10, 1.0 * Units::degree, 10.0 * Units::degree); + AngularSpecScan scan2(1.0, 10, 1.0 * Units::degree, 10.0 * Units::degree); + sim.setScan(scan2); EXPECT_EQ(10u, sim.coordinateAxis()->size()); EXPECT_EQ(1.0 * Units::degree, sim.coordinateAxis()->getMin()); EXPECT_EQ(10.0 * Units::degree, sim.coordinateAxis()->getMax()); @@ -113,17 +116,10 @@ TEST_F(SpecularSimulationTest, SetBeamParameters) EXPECT_EQ(1.0, beam.getWavelength()); EXPECT_EQ(0.0, beam.getAlpha()); EXPECT_EQ(0.0, beam.getPhi()); - checkBeamState(sim); - EXPECT_THROW(sim.setBeamParameters(1.0, 10, -2.0, 3.0), - std::runtime_error); - EXPECT_THROW(sim.setBeamParameters(1.0, 10, 2.0, 1.0), - std::runtime_error); - EXPECT_THROW(sim.setBeamParameters(1.0, 0, 1.0, 2.0), - std::runtime_error); - EXPECT_THROW(sim.setBeamParameters(-1.0, 1, 1.0, 2.0), - std::runtime_error); + AngularSpecScan scan3(1.0, 10, -1.0 * Units::degree, 2.0 * Units::degree); + EXPECT_THROW(sim.setScan(scan3), std::runtime_error); EXPECT_EQ(10u, sim.coordinateAxis()->size()); EXPECT_EQ(1.0 * Units::degree, sim.coordinateAxis()->getMin()); @@ -132,11 +128,43 @@ TEST_F(SpecularSimulationTest, SetBeamParameters) EXPECT_EQ(1.0, beam.getWavelength()); EXPECT_EQ(0.0, beam.getAlpha()); EXPECT_EQ(0.0, beam.getPhi()); - checkBeamState(sim); sim.setInstrument(Instrument()); + checkBeamState(sim); +} +TEST_F(SpecularSimulationTest, SetQScan) +{ + SpecularSimulation sim; + + QSpecScan scan(std::vector<double>{1.0, 3.0}); + sim.setScan(scan); + + const auto& beam = sim.getInstrument().getBeam(); + + EXPECT_EQ(2u, sim.coordinateAxis()->size()); + EXPECT_EQ(1.0, sim.coordinateAxis()->getMin()); + EXPECT_EQ(3.0, sim.coordinateAxis()->getMax()); + EXPECT_EQ(1.0, beam.getIntensity()); + EXPECT_EQ(1.0, beam.getWavelength()); + EXPECT_EQ(0.0, beam.getAlpha()); + EXPECT_EQ(0.0, beam.getPhi()); + + checkBeamState(sim); + + sim.setBeamIntensity(2.0); + EXPECT_EQ(2.0, beam.getIntensity()); + + QSpecScan scan2(10, 1.0, 10.0); + sim.setScan(scan2); + EXPECT_EQ(10u, sim.coordinateAxis()->size()); + EXPECT_EQ(1.0, sim.coordinateAxis()->getMin()); + EXPECT_EQ(10.0, sim.coordinateAxis()->getMax()); + EXPECT_EQ(2.0, beam.getIntensity()); + EXPECT_EQ(1.0, beam.getWavelength()); + EXPECT_EQ(0.0, beam.getAlpha()); + EXPECT_EQ(0.0, beam.getPhi()); checkBeamState(sim); }