From 79eb128ab90ccd09c8e1f5a1f5327b2be7b4bf0c Mon Sep 17 00:00:00 2001 From: Walter Van Herck <w.van.herck@fz-juelich.de> Date: Mon, 5 Aug 2013 14:20:22 +0200 Subject: [PATCH] Moved polarization check to DWBASimulation and added a matrix-valued output data structure there to hold polarized scattering data --- Core/Algorithms/inc/DWBASimulation.h | 20 ++++++++-- .../Algorithms/inc/MultiLayerDWBASimulation.h | 3 -- Core/Algorithms/src/DWBASimulation.cpp | 38 +++++++++++++++++++ .../src/MultiLayerDWBASimulation.cpp | 26 ------------- 4 files changed, 54 insertions(+), 33 deletions(-) diff --git a/Core/Algorithms/inc/DWBASimulation.h b/Core/Algorithms/inc/DWBASimulation.h index 3e4f5601220..76329ccdd74 100644 --- a/Core/Algorithms/inc/DWBASimulation.h +++ b/Core/Algorithms/inc/DWBASimulation.h @@ -22,14 +22,20 @@ #include "ThreadInfo.h" #include "Types.h" +#include <Eigen/Core> + //! Base class for different simulations, using DWBA. class DWBASimulation : public ISimulation { public: - DWBASimulation() : m_alpha_i(0), m_thread_info(), mp_simulation(0) {} + DWBASimulation() : mp_polarization_output(0), m_alpha_i(0), m_thread_info(), + mp_simulation(0) {} - virtual ~DWBASimulation() { delete mp_simulation; } + virtual ~DWBASimulation() { + delete mp_polarization_output; + delete mp_simulation; + } //! Initializes the simulation with the parameters from simulation virtual void init(const Simulation& simulation); @@ -72,11 +78,17 @@ class DWBASimulation : public ISimulation //! The iterator takes the member ThreadInfo object into consideration. const const_iterator end() const { return m_dwba_intensity.end(m_thread_info); } - protected: +protected: + //! Checks if the sample requires a polarized calculation + bool checkPolarizationPresent() const; + + //! Returns the wavelength of the incoming beam + double getWaveLength() const; + OutputData<double> m_dwba_intensity; + OutputData<Eigen::Matrix2cd> *mp_polarization_output; cvector_t m_ki; double m_alpha_i; - double getWaveLength() const; ThreadInfo m_thread_info; SimulationParameters m_sim_params; Simulation *mp_simulation; diff --git a/Core/Algorithms/inc/MultiLayerDWBASimulation.h b/Core/Algorithms/inc/MultiLayerDWBASimulation.h index 0230bfbf4c8..54242889b9b 100644 --- a/Core/Algorithms/inc/MultiLayerDWBASimulation.h +++ b/Core/Algorithms/inc/MultiLayerDWBASimulation.h @@ -47,9 +47,6 @@ public: virtual void run(); protected: - //! Checks if the sample requires a polarized calculation - bool checkPolarizationPresent() const; - std::set<double> getAlphaList() const; std::map<size_t, LayerDWBASimulation*> m_layer_dwba_simulation_map; MultiLayer *mp_multi_layer; diff --git a/Core/Algorithms/src/DWBASimulation.cpp b/Core/Algorithms/src/DWBASimulation.cpp index 8377b8cb670..99cdc45a832 100644 --- a/Core/Algorithms/src/DWBASimulation.cpp +++ b/Core/Algorithms/src/DWBASimulation.cpp @@ -15,6 +15,7 @@ #include "DWBASimulation.h" +#include "SampleMaterialVisitor.h" void DWBASimulation::init(const Simulation& simulation) { @@ -22,6 +23,10 @@ void DWBASimulation::init(const Simulation& simulation) delete mp_simulation; mp_simulation = simulation.clone(); } + if (mp_polarization_output) { + delete mp_polarization_output; + mp_polarization_output = 0; + } m_dwba_intensity.clear(); Detector detector = simulation.getInstrument().getDetector(); size_t detector_dimension = detector.getDimension(); @@ -36,6 +41,16 @@ void DWBASimulation::init(const Simulation& simulation) kvector_t ki_real(m_ki.x().real(), m_ki.y().real(), m_ki.z().real()); m_alpha_i = std::asin(ki_real.z()/ki_real.mag()); m_sim_params = simulation.getSimulationParameters(); + // initialize polarization output if needed + if (checkPolarizationPresent()) { + mp_polarization_output = new OutputData<Eigen::Matrix2cd>(); + for (size_t dim=0; dim<detector_dimension; ++dim) { + mp_polarization_output->addAxis(detector.getAxis(dim)); + } + if (simulation.getOutputData()->getMask()) { + mp_polarization_output->setMask(*simulation.getOutputData()->getMask()); + } + } } DWBASimulation *DWBASimulation::clone() const @@ -50,6 +65,29 @@ DWBASimulation *DWBASimulation::clone() const return p_result; } +bool DWBASimulation::checkPolarizationPresent() const +{ + if (!mp_simulation) { + throw ClassInitializationException("DWBASimulation::" + "checkPolarizationPresent(): simulation not initialized"); + } + ISample *p_sample = mp_simulation->getSample(); + if (!p_sample) { + throw ClassInitializationException("DWBASimulation::" + "checkPolarizationPresent(): sample not initialized"); + } + SampleMaterialVisitor material_vis; + p_sample->accept(&material_vis); + std::vector<const IMaterial *> materials = material_vis.getMaterials(); + for (std::vector<const IMaterial *>::const_iterator it = materials.begin(); + it != materials.end(); ++it) { + if (!(*it)->isScalarMaterial()) { + return true; + } + } + return false; +} + double DWBASimulation::getWaveLength() const { kvector_t real_ki(m_ki.x().real(), m_ki.y().real(), m_ki.z().real()); diff --git a/Core/Algorithms/src/MultiLayerDWBASimulation.cpp b/Core/Algorithms/src/MultiLayerDWBASimulation.cpp index 852c8a045a7..5d8185b7f12 100644 --- a/Core/Algorithms/src/MultiLayerDWBASimulation.cpp +++ b/Core/Algorithms/src/MultiLayerDWBASimulation.cpp @@ -21,7 +21,6 @@ #include "MultiLayerRoughnessDWBASimulation.h" #include "DoubleToComplexMap.h" #include "MessageService.h" -#include "SampleMaterialVisitor.h" MultiLayerDWBASimulation::MultiLayerDWBASimulation( @@ -163,28 +162,3 @@ std::set<double> MultiLayerDWBASimulation::getAlphaList() const result.insert(-m_alpha_i); return result; } - -bool MultiLayerDWBASimulation::checkPolarizationPresent() const -{ - if (!mp_simulation) { - throw ClassInitializationException("MultiLayerDWBASimulation::" - "checkPolarizationPresent(): simulation not initialized"); - } - ISample *p_sample = mp_simulation->getSample(); - if (!p_sample) { - throw ClassInitializationException("MultiLayerDWBASimulation::" - "checkPolarizationPresent(): sample not initialized"); - } - SampleMaterialVisitor material_vis; - p_sample->accept(&material_vis); - std::vector<const IMaterial *> materials = material_vis.getMaterials(); - for (std::vector<const IMaterial *>::const_iterator it = materials.begin(); - it != materials.end(); ++it) { - if (!(*it)->isScalarMaterial()) { - return true; - } - } - return false; -} - - -- GitLab