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