diff --git a/Core/Multilayer/LayoutStrategyBuilder.cpp b/Core/Multilayer/LayoutStrategyBuilder.cpp index 99f2d90b2f899495ddde93ec3e3d288794138339..a623ffa9e17f13882da5c30d82a843e62e31f6de 100644 --- a/Core/Multilayer/LayoutStrategyBuilder.cpp +++ b/Core/Multilayer/LayoutStrategyBuilder.cpp @@ -14,17 +14,18 @@ // ************************************************************************** // #include "LayoutStrategyBuilder.h" +#include "DecouplingApproximationStrategy.h" #include "Exceptions.h" #include "FormFactorCoherentSum.h" #include "FormFactorDWBA.h" #include "FormFactorDWBAPol.h" +#include "IFresnelMap.h" #include "ILayout.h" #include "IParticle.h" #include "InterferenceFunctionNone.h" #include "MultiLayer.h" #include "Layer.h" -#include "IFresnelMap.h" -#include "DecouplingApproximationStrategy.h" +#include "SlicedFormFactorList.h" #include "SSCApproximationStrategy.h" LayoutStrategyBuilder::LayoutStrategyBuilder( @@ -93,32 +94,29 @@ SafePointerVector<class FormFactorCoherentSum> LayoutStrategyBuilder::collectFor FormFactorCoherentSum* LayoutStrategyBuilder::createFormFactorCoherentSum( const IParticle* particle) const { - const std::unique_ptr<IFormFactor> P_ff_particle{ particle->createFormFactor() }; - std::unique_ptr<IFormFactor> P_ff_framework; - if (mp_multilayer->getNumberOfLayers()>1) { - if (m_polarized) - P_ff_framework.reset(new FormFactorDWBAPol(*P_ff_particle)); - else - P_ff_framework.reset(new FormFactorDWBA(*P_ff_particle)); - } else - P_ff_framework.reset(P_ff_particle->clone()); + std::unique_ptr<FormFactorCoherentSum> P_result( + new FormFactorCoherentSum(particle->getAbundance())); + auto sliced_ffs = particle->createSlicedFormFactors( + *mp_multilayer, mp_multilayer->getLayerTopZ(m_layer_index)); + for (size_t i=0; i < sliced_ffs.size(); ++i) { + auto ff_pair = sliced_ffs[i]; + std::unique_ptr<IFormFactor> P_ff_framework; + if (mp_multilayer->getNumberOfLayers()>1) { + if (m_polarized) + P_ff_framework.reset(new FormFactorDWBAPol(*ff_pair.first)); + else + P_ff_framework.reset(new FormFactorDWBA(*ff_pair.first)); + } else + P_ff_framework.reset(ff_pair.first->clone()); - size_t layer_index = findLayerIndex(*P_ff_framework); - const IMaterial* p_layer_material = mp_multilayer->getLayer(layer_index)->getMaterial(); - P_ff_framework->setAmbientMaterial(*p_layer_material); + size_t layer_index = ff_pair.second; + const IMaterial* p_layer_material = mp_multilayer->getLayer(layer_index)->getMaterial(); + P_ff_framework->setAmbientMaterial(*p_layer_material); - auto part = FormFactorCoherentPart(P_ff_framework.release()); - part.setSpecularInfo(mp_fresnel_map, layer_index); + auto part = FormFactorCoherentPart(P_ff_framework.release()); + part.setSpecularInfo(mp_fresnel_map, layer_index); - std::unique_ptr<FormFactorCoherentSum> P_result( - new FormFactorCoherentSum(particle->getAbundance())); - P_result->addCoherentPart(part); + P_result->addCoherentPart(part); + } return P_result.release(); } - -size_t LayoutStrategyBuilder::findLayerIndex(const IFormFactor& ff) const -{ - std::unique_ptr<IRotation> P_rot(IRotation::createIdentity()); - double zmin = ff.bottomZ(*P_rot) + mp_multilayer->getLayerTopZ(m_layer_index); - return mp_multilayer->bottomZToLayerIndex(zmin); -} diff --git a/Core/Multilayer/LayoutStrategyBuilder.h b/Core/Multilayer/LayoutStrategyBuilder.h index ac903413e1c07d60fa042f65a661d270f1d255b8..57bfa2969272fb3bf009896008689a89559f429b 100644 --- a/Core/Multilayer/LayoutStrategyBuilder.h +++ b/Core/Multilayer/LayoutStrategyBuilder.h @@ -47,7 +47,6 @@ public: private: SafePointerVector<class FormFactorCoherentSum> collectFormFactorList() const; FormFactorCoherentSum* createFormFactorCoherentSum(const IParticle* particle) const; - size_t findLayerIndex(const IFormFactor& ff) const; const MultiLayer* mp_multilayer; const ILayout* mp_layout; diff --git a/Core/Particle/IParticle.h b/Core/Particle/IParticle.h index 8b60b639bdbc0092abbbb69964eed8d5cc1d0769..45d5ec432f258e37511bd562455bb61b2e70e957 100644 --- a/Core/Particle/IParticle.h +++ b/Core/Particle/IParticle.h @@ -48,8 +48,8 @@ public: const IRotation* p_rotation, kvector_t translation) const =0; //! Create list of form factors and corresponding layer indices - SlicedFormFactorList createSlicedFormFactors(const MultiLayer& multilayer, - double position_offset=0.0) const; + virtual SlicedFormFactorList createSlicedFormFactors(const MultiLayer& multilayer, + double position_offset=0.0) const; //! Returns particle position. kvector_t getPosition() const { return m_position; } diff --git a/Core/Particle/ParticleComposition.cpp b/Core/Particle/ParticleComposition.cpp index 0789ecf15b95371ff71c475c871de2ba0250da93..75b9af04102719b2d9f4924eb283139f50733f5a 100644 --- a/Core/Particle/ParticleComposition.cpp +++ b/Core/Particle/ParticleComposition.cpp @@ -90,8 +90,8 @@ void ParticleComposition::addParticle(const IParticle& particle, kvector_t posit addParticlePointer(np); } -// Please note, that positions is not const reference here. This is intentionally to -// python lists to std::vector +// Please note, that positions is not const reference here. This is intentional, to +// enable python lists to std::vector conversion void ParticleComposition::addParticles(const IParticle& particle, std::vector<kvector_t > positions) {