Skip to content
Snippets Groups Projects
Commit 79eb128a authored by Van Herck, Walter's avatar Van Herck, Walter
Browse files

Moved polarization check to DWBASimulation and added a matrix-valued output...

Moved polarization check to DWBASimulation and added a matrix-valued output data structure there to hold polarized scattering data
parent d3392334
No related branches found
No related tags found
No related merge requests found
...@@ -22,14 +22,20 @@ ...@@ -22,14 +22,20 @@
#include "ThreadInfo.h" #include "ThreadInfo.h"
#include "Types.h" #include "Types.h"
#include <Eigen/Core>
//! Base class for different simulations, using DWBA. //! Base class for different simulations, using DWBA.
class DWBASimulation : public ISimulation class DWBASimulation : public ISimulation
{ {
public: 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 //! Initializes the simulation with the parameters from simulation
virtual void init(const Simulation& simulation); virtual void init(const Simulation& simulation);
...@@ -72,11 +78,17 @@ class DWBASimulation : public ISimulation ...@@ -72,11 +78,17 @@ class DWBASimulation : public ISimulation
//! The iterator takes the member ThreadInfo object into consideration. //! The iterator takes the member ThreadInfo object into consideration.
const const_iterator end() const { return m_dwba_intensity.end(m_thread_info); } 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<double> m_dwba_intensity;
OutputData<Eigen::Matrix2cd> *mp_polarization_output;
cvector_t m_ki; cvector_t m_ki;
double m_alpha_i; double m_alpha_i;
double getWaveLength() const;
ThreadInfo m_thread_info; ThreadInfo m_thread_info;
SimulationParameters m_sim_params; SimulationParameters m_sim_params;
Simulation *mp_simulation; Simulation *mp_simulation;
......
...@@ -47,9 +47,6 @@ public: ...@@ -47,9 +47,6 @@ public:
virtual void run(); virtual void run();
protected: protected:
//! Checks if the sample requires a polarized calculation
bool checkPolarizationPresent() const;
std::set<double> getAlphaList() const; std::set<double> getAlphaList() const;
std::map<size_t, LayerDWBASimulation*> m_layer_dwba_simulation_map; std::map<size_t, LayerDWBASimulation*> m_layer_dwba_simulation_map;
MultiLayer *mp_multi_layer; MultiLayer *mp_multi_layer;
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "DWBASimulation.h" #include "DWBASimulation.h"
#include "SampleMaterialVisitor.h"
void DWBASimulation::init(const Simulation& simulation) void DWBASimulation::init(const Simulation& simulation)
{ {
...@@ -22,6 +23,10 @@ void DWBASimulation::init(const Simulation& simulation) ...@@ -22,6 +23,10 @@ void DWBASimulation::init(const Simulation& simulation)
delete mp_simulation; delete mp_simulation;
mp_simulation = simulation.clone(); mp_simulation = simulation.clone();
} }
if (mp_polarization_output) {
delete mp_polarization_output;
mp_polarization_output = 0;
}
m_dwba_intensity.clear(); m_dwba_intensity.clear();
Detector detector = simulation.getInstrument().getDetector(); Detector detector = simulation.getInstrument().getDetector();
size_t detector_dimension = detector.getDimension(); size_t detector_dimension = detector.getDimension();
...@@ -36,6 +41,16 @@ void DWBASimulation::init(const Simulation& simulation) ...@@ -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()); 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_alpha_i = std::asin(ki_real.z()/ki_real.mag());
m_sim_params = simulation.getSimulationParameters(); 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 DWBASimulation *DWBASimulation::clone() const
...@@ -50,6 +65,29 @@ DWBASimulation *DWBASimulation::clone() const ...@@ -50,6 +65,29 @@ DWBASimulation *DWBASimulation::clone() const
return p_result; 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 double DWBASimulation::getWaveLength() const
{ {
kvector_t real_ki(m_ki.x().real(), m_ki.y().real(), m_ki.z().real()); kvector_t real_ki(m_ki.x().real(), m_ki.y().real(), m_ki.z().real());
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#include "MultiLayerRoughnessDWBASimulation.h" #include "MultiLayerRoughnessDWBASimulation.h"
#include "DoubleToComplexMap.h" #include "DoubleToComplexMap.h"
#include "MessageService.h" #include "MessageService.h"
#include "SampleMaterialVisitor.h"
MultiLayerDWBASimulation::MultiLayerDWBASimulation( MultiLayerDWBASimulation::MultiLayerDWBASimulation(
...@@ -163,28 +162,3 @@ std::set<double> MultiLayerDWBASimulation::getAlphaList() const ...@@ -163,28 +162,3 @@ std::set<double> MultiLayerDWBASimulation::getAlphaList() const
result.insert(-m_alpha_i); result.insert(-m_alpha_i);
return result; 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;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment