From d002263eeb80b884ad1a09e5c0b52e10944f8fd5 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 16 Jul 2021 07:29:48 +0200
Subject: [PATCH] invert interdependence DiffuseElement <-> WavevectorInfo

---
 Core/Computation/DWBAComputation.cpp          |   2 +-
 Core/Contrib/GISASSpecularContribution.cpp    |   2 +-
 Core/Contrib/ParticleLayoutContribution.cpp   |   2 +-
 Core/Contrib/RoughMultiLayerContribution.cpp  |   2 +-
 Core/Simulation/GISASSimulation.h             |   2 +-
 Core/Simulation/ISimulation2D.cpp             |   2 +-
 Core/Simulation/OffSpecularSimulation.h       |   2 +-
 Device/Detector/IDetector.cpp                 |   2 +-
 Device/Detector/IDetector2D.cpp               |   2 +-
 Device/Detector/RectangularDetector.cpp       |   2 +-
 Device/Detector/SphericalDetector.cpp         |   2 +-
 Resample/FFCompute/IComputePol.cpp            |   4 +-
 Resample/FFCompute/IComputeScalar.cpp         |   4 +-
 .../DecouplingApproximationStrategy.cpp       |   2 +-
 .../Interparticle/IInterparticleStrategy.cpp  |   2 +-
 Resample/Interparticle/SSCAStrategy.cpp       |   2 +-
 .../Element}/DiffuseElement.cpp               |  10 +-
 .../Pixel => Sample/Element}/DiffuseElement.h |  11 +-
 Sample/Material/WavevectorInfo.cpp            |   6 -
 Sample/Material/WavevectorInfo.h              |   2 -
 .../Core/Core/SimulationElementTest.cpp       |   2 +-
 auto/Wrap/doxygenBase.i                       |   3 +
 auto/Wrap/doxygenSample.i                     | 137 +++++-
 auto/Wrap/libBornAgainSample.py               |   3 +-
 auto/Wrap/libBornAgainSample_wrap.cpp         | 431 ++++++++----------
 25 files changed, 353 insertions(+), 288 deletions(-)
 rename {Base/Pixel => Sample/Element}/DiffuseElement.cpp (93%)
 rename {Base/Pixel => Sample/Element}/DiffuseElement.h (92%)

diff --git a/Core/Computation/DWBAComputation.cpp b/Core/Computation/DWBAComputation.cpp
index ab9ba1fe162..afc567ab01e 100644
--- a/Core/Computation/DWBAComputation.cpp
+++ b/Core/Computation/DWBAComputation.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Core/Computation/DWBAComputation.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Base/Progress/DelayedProgressCounter.h"
 #include "Base/Progress/ProgressHandler.h"
 #include "Core/Contrib/GISASSpecularContribution.h"
diff --git a/Core/Contrib/GISASSpecularContribution.cpp b/Core/Contrib/GISASSpecularContribution.cpp
index a9fe61906c4..6b1013033b2 100644
--- a/Core/Contrib/GISASSpecularContribution.cpp
+++ b/Core/Contrib/GISASSpecularContribution.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Core/Contrib/GISASSpecularContribution.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Base/Utils/Assert.h"
 #include "Resample/Flux/IFlux.h"
 
diff --git a/Core/Contrib/ParticleLayoutContribution.cpp b/Core/Contrib/ParticleLayoutContribution.cpp
index aa7dee75dab..2bc4098bbd7 100644
--- a/Core/Contrib/ParticleLayoutContribution.cpp
+++ b/Core/Contrib/ParticleLayoutContribution.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Core/Contrib/ParticleLayoutContribution.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Resample/Interparticle/DecouplingApproximationStrategy.h"
 #include "Resample/Interparticle/SSCAStrategy.h"
 #include "Resample/Processed/ProcessedLayout.h"
diff --git a/Core/Contrib/RoughMultiLayerContribution.cpp b/Core/Contrib/RoughMultiLayerContribution.cpp
index 1015d5f3f4d..4197b6af0cc 100644
--- a/Core/Contrib/RoughMultiLayerContribution.cpp
+++ b/Core/Contrib/RoughMultiLayerContribution.cpp
@@ -14,7 +14,7 @@
 
 #include "Core/Contrib/RoughMultiLayerContribution.h"
 #include "Base/Math/Constants.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Resample/Flux/IFlux.h"
 #include "Resample/Processed/ProcessedSample.h"
 #include "Resample/Slice/Slice.h"
diff --git a/Core/Simulation/GISASSimulation.h b/Core/Simulation/GISASSimulation.h
index 3f90a37ab9f..8d5e29d474e 100644
--- a/Core/Simulation/GISASSimulation.h
+++ b/Core/Simulation/GISASSimulation.h
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_CORE_SIMULATION_GISASSIMULATION_H
 #define BORNAGAIN_CORE_SIMULATION_GISASSIMULATION_H
 
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Core/Simulation/ISimulation2D.h"
 
 class MultiLayer;
diff --git a/Core/Simulation/ISimulation2D.cpp b/Core/Simulation/ISimulation2D.cpp
index 6ea02e6f03d..b1e1a786947 100644
--- a/Core/Simulation/ISimulation2D.cpp
+++ b/Core/Simulation/ISimulation2D.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Core/Simulation/ISimulation2D.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Base/Utils/Assert.h"
 #include "Core/Background/IBackground.h"
 #include "Core/Computation/DWBAComputation.h"
diff --git a/Core/Simulation/OffSpecularSimulation.h b/Core/Simulation/OffSpecularSimulation.h
index 96663c94dfe..437546d6c14 100644
--- a/Core/Simulation/OffSpecularSimulation.h
+++ b/Core/Simulation/OffSpecularSimulation.h
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_CORE_SIMULATION_OFFSPECULARSIMULATION_H
 #define BORNAGAIN_CORE_SIMULATION_OFFSPECULARSIMULATION_H
 
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Core/Simulation/ISimulation2D.h"
 
 class Histogram2D;
diff --git a/Device/Detector/IDetector.cpp b/Device/Detector/IDetector.cpp
index d0c59fb0685..38907fb407b 100644
--- a/Device/Detector/IDetector.cpp
+++ b/Device/Detector/IDetector.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Device/Detector/IDetector.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Device/ProDetector/DetectorMask.h"
 #include "Device/Resolution/ConvolutionDetectorResolution.h"
 
diff --git a/Device/Detector/IDetector2D.cpp b/Device/Detector/IDetector2D.cpp
index 5e3ba181bc4..a73652a6fd5 100644
--- a/Device/Detector/IDetector2D.cpp
+++ b/Device/Detector/IDetector2D.cpp
@@ -14,7 +14,7 @@
 
 #include "Device/Detector/IDetector2D.h"
 #include "Base/Const/Units.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Detector/DetectorContext.h"
 #include "Device/Mask/InfinitePlane.h"
diff --git a/Device/Detector/RectangularDetector.cpp b/Device/Detector/RectangularDetector.cpp
index ae99f666cde..e345dcf8d91 100644
--- a/Device/Detector/RectangularDetector.cpp
+++ b/Device/Detector/RectangularDetector.cpp
@@ -15,7 +15,7 @@
 #include "Device/Detector/RectangularDetector.h"
 #include "Base/Const/Units.h"
 #include "Base/Math/Constants.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Base/Pixel/RectangularPixel.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Resolution/IDetectorResolution.h"
diff --git a/Device/Detector/SphericalDetector.cpp b/Device/Detector/SphericalDetector.cpp
index 7a5932f9dbb..2173fb0922f 100644
--- a/Device/Detector/SphericalDetector.cpp
+++ b/Device/Detector/SphericalDetector.cpp
@@ -15,7 +15,7 @@
 #include "Device/Detector/SphericalDetector.h"
 #include "Base/Const/Units.h"
 #include "Base/Math/Constants.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Base/Pixel/SphericalPixel.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Resolution/IDetectorResolution.h"
diff --git a/Resample/FFCompute/IComputePol.cpp b/Resample/FFCompute/IComputePol.cpp
index 41af81eb30c..d54fda26818 100644
--- a/Resample/FFCompute/IComputePol.cpp
+++ b/Resample/FFCompute/IComputePol.cpp
@@ -13,11 +13,11 @@
 //  ************************************************************************************************
 
 #include "Resample/FFCompute/IComputePol.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Resample/Flux/IFlux.h"
 #include "Sample/Material/WavevectorInfo.h"
 
 Eigen::Matrix2cd IComputePol::coherentPolFF(const DiffuseElement& ele) const
 {
-    return computePolFF({ele}, ele.fluxesIn()[m_i_layer], ele.fluxesOut()[m_i_layer]);
+    return computePolFF(ele.wavevectorInfo(), ele.fluxesIn()[m_i_layer], ele.fluxesOut()[m_i_layer]);
 }
diff --git a/Resample/FFCompute/IComputeScalar.cpp b/Resample/FFCompute/IComputeScalar.cpp
index 9b6caf732e7..7be93b591c6 100644
--- a/Resample/FFCompute/IComputeScalar.cpp
+++ b/Resample/FFCompute/IComputeScalar.cpp
@@ -13,11 +13,11 @@
 //  ************************************************************************************************
 
 #include "Resample/FFCompute/IComputeScalar.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Resample/Flux/IFlux.h"
 #include "Sample/Material/WavevectorInfo.h"
 
 complex_t IComputeScalar::coherentFF(const DiffuseElement& ele) const
 {
-    return computeFF({ele}, ele.fluxesIn()[m_i_layer], ele.fluxesOut()[m_i_layer]);
+    return computeFF(ele.wavevectorInfo(), ele.fluxesIn()[m_i_layer], ele.fluxesOut()[m_i_layer]);
 }
diff --git a/Resample/Interparticle/DecouplingApproximationStrategy.cpp b/Resample/Interparticle/DecouplingApproximationStrategy.cpp
index 42853d8de98..b6f45ed22a8 100644
--- a/Resample/Interparticle/DecouplingApproximationStrategy.cpp
+++ b/Resample/Interparticle/DecouplingApproximationStrategy.cpp
@@ -14,7 +14,7 @@
 
 #include "Resample/Interparticle/DecouplingApproximationStrategy.h"
 #include "Base/Math/Functions.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Resample/Coherence/FFSum.h"
 #include "Sample/Aggregate/InterferenceFunctionNone.h"
 
diff --git a/Resample/Interparticle/IInterparticleStrategy.cpp b/Resample/Interparticle/IInterparticleStrategy.cpp
index c5b68a24787..1eafa156e0a 100644
--- a/Resample/Interparticle/IInterparticleStrategy.cpp
+++ b/Resample/Interparticle/IInterparticleStrategy.cpp
@@ -14,7 +14,7 @@
 
 #include "Resample/Interparticle/IInterparticleStrategy.h"
 #include "Base/Math/IntegratorMCMiser.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Base/Utils/Assert.h"
 #include "Resample/Coherence/FFSum.h"
 
diff --git a/Resample/Interparticle/SSCAStrategy.cpp b/Resample/Interparticle/SSCAStrategy.cpp
index 6e6bbbca8f6..c37cf275265 100644
--- a/Resample/Interparticle/SSCAStrategy.cpp
+++ b/Resample/Interparticle/SSCAStrategy.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Resample/Interparticle/SSCAStrategy.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Resample/Coherence/FFSum.h"
 #include "Sample/Aggregate/InterferenceFunctionRadialParaCrystal.h"
 
diff --git a/Base/Pixel/DiffuseElement.cpp b/Sample/Element/DiffuseElement.cpp
similarity index 93%
rename from Base/Pixel/DiffuseElement.cpp
rename to Sample/Element/DiffuseElement.cpp
index 5e130f80bb4..c1a77f3b729 100644
--- a/Base/Pixel/DiffuseElement.cpp
+++ b/Sample/Element/DiffuseElement.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Base/Pixel/DiffuseElement.cpp
+//! @file      Sample/Element/DiffuseElement.cpp
 //! @brief     Implements class DiffuseElement.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,9 +12,10 @@
 //
 //  ************************************************************************************************
 
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Base/Pixel/IPixel.h"
 #include "Base/Vector/Direction.h"
+#include "Sample/Material/WavevectorInfo.h"
 
 DiffuseElement::DiffuseElement(double wavelength, double alpha_i, double phi_i,
                                std::unique_ptr<IPixel> pixel,
@@ -111,6 +112,11 @@ double DiffuseElement::getPhi(double x, double y) const
     return getKf(x, y).phi();
 }
 
+WavevectorInfo DiffuseElement::wavevectorInfo() const
+{
+    return WavevectorInfo(getKi(), getMeanKf(), wavelength());
+}
+
 double DiffuseElement::integrationFactor(double x, double y) const
 {
     return m_pixel->integrationFactor(x, y);
diff --git a/Base/Pixel/DiffuseElement.h b/Sample/Element/DiffuseElement.h
similarity index 92%
rename from Base/Pixel/DiffuseElement.h
rename to Sample/Element/DiffuseElement.h
index 790f4a66b0d..5fc3f6f8533 100644
--- a/Base/Pixel/DiffuseElement.h
+++ b/Sample/Element/DiffuseElement.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Base/Pixel/DiffuseElement.h
+//! @file      Sample/Element/DiffuseElement.h
 //! @brief     Defines class DiffuseElement.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -17,8 +17,8 @@
 #endif
 
 #ifndef USER_API
-#ifndef BORNAGAIN_BASE_PIXEL_DIFFUSEELEMENT_H
-#define BORNAGAIN_BASE_PIXEL_DIFFUSEELEMENT_H
+#ifndef BORNAGAIN_SAMPLE_ELEMENT_DIFFUSEELEMENT_H
+#define BORNAGAIN_SAMPLE_ELEMENT_DIFFUSEELEMENT_H
 
 #include "Base/Pixel/PolarizationHandler.h"
 #include "Base/Vector/Vectors3D.h"
@@ -26,6 +26,7 @@
 
 class Fluxes;
 class IPixel;
+class WavevectorInfo;
 
 //! Data stucture containing both input and output of a single detector cell.
 //! @ingroup simulation
@@ -70,6 +71,8 @@ public:
     double getAlpha(double x, double y) const;
     double getPhi(double x, double y) const;
 
+    WavevectorInfo wavevectorInfo() const;
+
     //! Tells if simulation element corresponds to a specular peak
     bool isSpecular() const { return m_is_specular; }
 
@@ -89,5 +92,5 @@ private:
     double m_intensity; //!< simulated intensity for detector cell
 };
 
-#endif // BORNAGAIN_BASE_PIXEL_DIFFUSEELEMENT_H
+#endif // BORNAGAIN_SAMPLE_ELEMENT_DIFFUSEELEMENT_H
 #endif // USER_API
diff --git a/Sample/Material/WavevectorInfo.cpp b/Sample/Material/WavevectorInfo.cpp
index c872dae6799..6bede6a5bff 100644
--- a/Sample/Material/WavevectorInfo.cpp
+++ b/Sample/Material/WavevectorInfo.cpp
@@ -13,7 +13,6 @@
 //  ************************************************************************************************
 
 #include "Sample/Material/WavevectorInfo.h"
-#include "Base/Pixel/DiffuseElement.h"
 #include "Base/Vector/Transform3D.h"
 
 WavevectorInfo::WavevectorInfo(cvector_t ki, cvector_t kf, double wavelength)
@@ -26,11 +25,6 @@ WavevectorInfo::WavevectorInfo(kvector_t ki, kvector_t kf, double wavelength)
 {
 }
 
-WavevectorInfo::WavevectorInfo(const DiffuseElement& ele)
-    : WavevectorInfo(ele.getKi(), ele.getMeanKf(), ele.wavelength())
-{
-}
-
 // TODO: can be removed when IFormFactor::volume() is refactored
 // (static function is provided to easily track usage of default constructor)
 WavevectorInfo WavevectorInfo::GetZeroQ()
diff --git a/Sample/Material/WavevectorInfo.h b/Sample/Material/WavevectorInfo.h
index c670e88b168..c0e6873b3b5 100644
--- a/Sample/Material/WavevectorInfo.h
+++ b/Sample/Material/WavevectorInfo.h
@@ -18,7 +18,6 @@
 
 #include "Base/Vector/Vectors3D.h"
 
-class DiffuseElement;
 class Transform3D;
 
 //! Holds all wavevector information relevant for calculating form factors.
@@ -28,7 +27,6 @@ public:
     static WavevectorInfo GetZeroQ();
     WavevectorInfo(cvector_t ki, cvector_t kf, double wavelength);
     WavevectorInfo(kvector_t ki, kvector_t kf, double wavelength);
-    WavevectorInfo(const DiffuseElement&);
 
     WavevectorInfo transformed(const Transform3D& transform) const;
     cvector_t getKi() const { return m_ki; }
diff --git a/Tests/UnitTests/Core/Core/SimulationElementTest.cpp b/Tests/UnitTests/Core/Core/SimulationElementTest.cpp
index 60457696909..5633d6ba7bc 100644
--- a/Tests/UnitTests/Core/Core/SimulationElementTest.cpp
+++ b/Tests/UnitTests/Core/Core/SimulationElementTest.cpp
@@ -1,6 +1,6 @@
 #include "Base/Axis/Bin.h"
 #include "Base/Const/Units.h"
-#include "Base/Pixel/DiffuseElement.h"
+#include "Sample/Element/DiffuseElement.h"
 #include "Base/Pixel/SphericalPixel.h"
 #include "Base/Vector/Direction.h"
 #include "Tests/GTestWrapper/google_test.h"
diff --git a/auto/Wrap/doxygenBase.i b/auto/Wrap/doxygenBase.i
index 60131dffb8b..cbd303984cb 100644
--- a/auto/Wrap/doxygenBase.i
+++ b/auto/Wrap/doxygenBase.i
@@ -472,6 +472,9 @@ Returns scattering vector Q, with Kf determined from in-pixel coordinates x,y. I
 %feature("docstring")  DiffuseElement::getPhi "double DiffuseElement::getPhi(double x, double y) const
 ";
 
+%feature("docstring")  DiffuseElement::wavevectorInfo "WavevectorInfo DiffuseElement::wavevectorInfo() const
+";
+
 %feature("docstring")  DiffuseElement::isSpecular "bool DiffuseElement::isSpecular() const
 
 Tells if simulation element corresponds to a specular peak. 
diff --git a/auto/Wrap/doxygenSample.i b/auto/Wrap/doxygenSample.i
index b1d4d6a229b..a4bd45b0c1e 100644
--- a/auto/Wrap/doxygenSample.i
+++ b/auto/Wrap/doxygenSample.i
@@ -450,6 +450,101 @@ C++ includes: ParticleDistributionsBuilder.h
 ";
 
 
+// File: classDiffuseElement.xml
+%feature("docstring") DiffuseElement "
+
+Data stucture containing both input and output of a single detector cell.
+
+C++ includes: DiffuseElement.h
+";
+
+%feature("docstring")  DiffuseElement::DiffuseElement "DiffuseElement::DiffuseElement(double wavelength, double alpha_i, double phi_i, std::unique_ptr< IPixel > pixel, const Eigen::Matrix2cd &beam_polarization, const Eigen::Matrix2cd &analyzer, bool isSpecular_, const Fluxes *const fluxes_in=nullptr, const Fluxes *const fluxes_out=nullptr)
+";
+
+%feature("docstring")  DiffuseElement::DiffuseElement "DiffuseElement::DiffuseElement(const DiffuseElement &other)
+";
+
+%feature("docstring")  DiffuseElement::~DiffuseElement "DiffuseElement::~DiffuseElement()
+";
+
+%feature("docstring")  DiffuseElement::setFluxes "void DiffuseElement::setFluxes(const Fluxes *fluxes_in, const Fluxes *fluxes_out)
+";
+
+%feature("docstring")  DiffuseElement::fluxesIn "const Fluxes& DiffuseElement::fluxesIn() const
+";
+
+%feature("docstring")  DiffuseElement::fluxesOut "const Fluxes& DiffuseElement::fluxesOut() const
+";
+
+%feature("docstring")  DiffuseElement::pointElement "DiffuseElement DiffuseElement::pointElement(double x, double y) const
+
+Returns copy of this  DiffuseElement with k_f given by in-pixel coordinate x,y. 
+";
+
+%feature("docstring")  DiffuseElement::polarizationHandler "const PolarizationHandler& DiffuseElement::polarizationHandler() const
+
+Returns assigned PolarizationHandler. 
+";
+
+%feature("docstring")  DiffuseElement::wavelength "double DiffuseElement::wavelength() const
+";
+
+%feature("docstring")  DiffuseElement::getAlphaI "double DiffuseElement::getAlphaI() const
+";
+
+%feature("docstring")  DiffuseElement::getPhiI "double DiffuseElement::getPhiI() const
+";
+
+%feature("docstring")  DiffuseElement::getAlphaMean "double DiffuseElement::getAlphaMean() const
+";
+
+%feature("docstring")  DiffuseElement::getPhiMean "double DiffuseElement::getPhiMean() const
+";
+
+%feature("docstring")  DiffuseElement::setIntensity "void DiffuseElement::setIntensity(double intensity)
+";
+
+%feature("docstring")  DiffuseElement::addIntensity "void DiffuseElement::addIntensity(double intensity)
+";
+
+%feature("docstring")  DiffuseElement::intensity "double DiffuseElement::intensity() const
+";
+
+%feature("docstring")  DiffuseElement::getKi "kvector_t DiffuseElement::getKi() const
+";
+
+%feature("docstring")  DiffuseElement::getMeanKf "kvector_t DiffuseElement::getMeanKf() const
+";
+
+%feature("docstring")  DiffuseElement::meanQ "kvector_t DiffuseElement::meanQ() const
+";
+
+%feature("docstring")  DiffuseElement::getQ "kvector_t DiffuseElement::getQ(double x, double y) const
+
+Returns scattering vector Q, with Kf determined from in-pixel coordinates x,y. In-pixel coordinates take values from 0 to 1. 
+";
+
+%feature("docstring")  DiffuseElement::integrationFactor "double DiffuseElement::integrationFactor(double x, double y) const
+";
+
+%feature("docstring")  DiffuseElement::solidAngle "double DiffuseElement::solidAngle() const
+";
+
+%feature("docstring")  DiffuseElement::getAlpha "double DiffuseElement::getAlpha(double x, double y) const
+";
+
+%feature("docstring")  DiffuseElement::getPhi "double DiffuseElement::getPhi(double x, double y) const
+";
+
+%feature("docstring")  DiffuseElement::wavevectorInfo "WavevectorInfo DiffuseElement::wavevectorInfo() const
+";
+
+%feature("docstring")  DiffuseElement::isSpecular "bool DiffuseElement::isSpecular() const
+
+Tells if simulation element corresponds to a specular peak. 
+";
+
+
 // File: classDistribution1DCauchySampler.xml
 %feature("docstring") Distribution1DCauchySampler "";
 
@@ -6361,9 +6456,6 @@ C++ includes: WavevectorInfo.h
 %feature("docstring")  WavevectorInfo::WavevectorInfo "WavevectorInfo::WavevectorInfo(kvector_t ki, kvector_t kf, double wavelength)
 ";
 
-%feature("docstring")  WavevectorInfo::WavevectorInfo "WavevectorInfo::WavevectorInfo(const DiffuseElement &)
-";
-
 %feature("docstring")  WavevectorInfo::transformed "WavevectorInfo WavevectorInfo::transformed(const Transform3D &transform) const
 ";
 
@@ -6413,55 +6505,55 @@ C++ includes: ZLimits.h
 ";
 
 
-// File: namespace_0d100.xml
+// File: namespace_0d102.xml
 
 
-// File: namespace_0d103.xml
+// File: namespace_0d105.xml
 
 
-// File: namespace_0d124.xml
+// File: namespace_0d126.xml
 
 
-// File: namespace_0d128.xml
+// File: namespace_0d130.xml
 
 
-// File: namespace_0d132.xml
+// File: namespace_0d134.xml
 
 
-// File: namespace_0d144.xml
+// File: namespace_0d146.xml
 
 
-// File: namespace_0d146.xml
+// File: namespace_0d148.xml
 
 
 // File: namespace_0d16.xml
 
 
-// File: namespace_0d178.xml
+// File: namespace_0d180.xml
 
 
-// File: namespace_0d190.xml
+// File: namespace_0d192.xml
 
 
 // File: namespace_0d2.xml
 
 
-// File: namespace_0d218.xml
+// File: namespace_0d220.xml
 
 
-// File: namespace_0d230.xml
+// File: namespace_0d232.xml
 
 
-// File: namespace_0d236.xml
+// File: namespace_0d238.xml
 
 
-// File: namespace_0d240.xml
+// File: namespace_0d242.xml
 
 
-// File: namespace_0d258.xml
+// File: namespace_0d260.xml
 
 
-// File: namespace_0d277.xml
+// File: namespace_0d279.xml
 
 
 // File: namespace_0d31.xml
@@ -6751,6 +6843,12 @@ Used by the hard sphere and by several soft sphere classes.
 // File: IPeakShape_8h.xml
 
 
+// File: DiffuseElement_8cpp.xml
+
+
+// File: DiffuseElement_8h.xml
+
+
 // File: FormFactorAnisoPyramid_8cpp.xml
 
 
@@ -7595,6 +7693,9 @@ Generate vertices of centered ellipse with given semi-axes at height z.
 // File: dir_7b210e8d28f50f0c519681ee1b473363.xml
 
 
+// File: dir_d559e246396f07ab6f35774b89a9e838.xml
+
+
 // File: dir_844f24c588eea1b259def164cc466f1a.xml
 
 
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index c6c0ac16347..fe99c9fb662 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -2948,8 +2948,7 @@ class WavevectorInfo(object):
         r"""
         __init__(WavevectorInfo self, cvector_t ki, cvector_t kf, double wavelength) -> WavevectorInfo
         __init__(WavevectorInfo self, kvector_t ki, kvector_t kf, double wavelength) -> WavevectorInfo
-        __init__(WavevectorInfo self, DiffuseElement const & arg2) -> WavevectorInfo
-        WavevectorInfo::WavevectorInfo(const DiffuseElement &)
+        WavevectorInfo::WavevectorInfo(kvector_t ki, kvector_t kf, double wavelength)
 
         """
         _libBornAgainSample.WavevectorInfo_swiginit(self, _libBornAgainSample.new_WavevectorInfo(*args))
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index 1891a97987f..7daae9731dd 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -3105,194 +3105,193 @@ namespace Swig {
 #define SWIGTYPE_p_CallbackMap_t swig_types[5]
 #define SWIGTYPE_p_CreateItemCallback swig_types[6]
 #define SWIGTYPE_p_Crystal swig_types[7]
-#define SWIGTYPE_p_DiffuseElement swig_types[8]
-#define SWIGTYPE_p_FTDecayFunction1DCauchy swig_types[9]
-#define SWIGTYPE_p_FTDecayFunction1DGauss swig_types[10]
-#define SWIGTYPE_p_FTDecayFunction1DTriangle swig_types[11]
-#define SWIGTYPE_p_FTDecayFunction1DVoigt swig_types[12]
-#define SWIGTYPE_p_FTDecayFunction2DCauchy swig_types[13]
-#define SWIGTYPE_p_FTDecayFunction2DGauss swig_types[14]
-#define SWIGTYPE_p_FTDecayFunction2DVoigt swig_types[15]
-#define SWIGTYPE_p_FTDistribution1DCauchy swig_types[16]
-#define SWIGTYPE_p_FTDistribution1DCosine swig_types[17]
-#define SWIGTYPE_p_FTDistribution1DGate swig_types[18]
-#define SWIGTYPE_p_FTDistribution1DGauss swig_types[19]
-#define SWIGTYPE_p_FTDistribution1DTriangle swig_types[20]
-#define SWIGTYPE_p_FTDistribution1DVoigt swig_types[21]
-#define SWIGTYPE_p_FTDistribution2DCauchy swig_types[22]
-#define SWIGTYPE_p_FTDistribution2DCone swig_types[23]
-#define SWIGTYPE_p_FTDistribution2DGate swig_types[24]
-#define SWIGTYPE_p_FTDistribution2DGauss swig_types[25]
-#define SWIGTYPE_p_FTDistribution2DVoigt swig_types[26]
-#define SWIGTYPE_p_FormFactorAnisoPyramid swig_types[27]
-#define SWIGTYPE_p_FormFactorBox swig_types[28]
-#define SWIGTYPE_p_FormFactorCantellatedCube swig_types[29]
-#define SWIGTYPE_p_FormFactorCone swig_types[30]
-#define SWIGTYPE_p_FormFactorCone6 swig_types[31]
-#define SWIGTYPE_p_FormFactorCosineRippleBox swig_types[32]
-#define SWIGTYPE_p_FormFactorCosineRippleGauss swig_types[33]
-#define SWIGTYPE_p_FormFactorCosineRippleLorentz swig_types[34]
-#define SWIGTYPE_p_FormFactorCrystal swig_types[35]
-#define SWIGTYPE_p_FormFactorCuboctahedron swig_types[36]
-#define SWIGTYPE_p_FormFactorCylinder swig_types[37]
-#define SWIGTYPE_p_FormFactorDodecahedron swig_types[38]
-#define SWIGTYPE_p_FormFactorEllipsoidalCylinder swig_types[39]
-#define SWIGTYPE_p_FormFactorFullSphere swig_types[40]
-#define SWIGTYPE_p_FormFactorFullSpheroid swig_types[41]
-#define SWIGTYPE_p_FormFactorGaussSphere swig_types[42]
-#define SWIGTYPE_p_FormFactorHemiEllipsoid swig_types[43]
-#define SWIGTYPE_p_FormFactorHollowSphere swig_types[44]
-#define SWIGTYPE_p_FormFactorIcosahedron swig_types[45]
-#define SWIGTYPE_p_FormFactorLongBoxGauss swig_types[46]
-#define SWIGTYPE_p_FormFactorLongBoxLorentz swig_types[47]
-#define SWIGTYPE_p_FormFactorPrism3 swig_types[48]
-#define SWIGTYPE_p_FormFactorPrism6 swig_types[49]
-#define SWIGTYPE_p_FormFactorPyramid swig_types[50]
-#define SWIGTYPE_p_FormFactorSawtoothRippleBox swig_types[51]
-#define SWIGTYPE_p_FormFactorSawtoothRippleGauss swig_types[52]
-#define SWIGTYPE_p_FormFactorSawtoothRippleLorentz swig_types[53]
-#define SWIGTYPE_p_FormFactorSphereGaussianRadius swig_types[54]
-#define SWIGTYPE_p_FormFactorSphereLogNormalRadius swig_types[55]
-#define SWIGTYPE_p_FormFactorTetrahedron swig_types[56]
-#define SWIGTYPE_p_FormFactorTruncatedCube swig_types[57]
-#define SWIGTYPE_p_FormFactorTruncatedSphere swig_types[58]
-#define SWIGTYPE_p_FormFactorTruncatedSpheroid swig_types[59]
-#define SWIGTYPE_p_FormFactorWeighted swig_types[60]
-#define SWIGTYPE_p_GaussFisherPeakShape swig_types[61]
-#define SWIGTYPE_p_HexagonalLattice2D swig_types[62]
-#define SWIGTYPE_p_IAbstractParticle swig_types[63]
-#define SWIGTYPE_p_IBornFF swig_types[64]
-#define SWIGTYPE_p_ICloneable swig_types[65]
-#define SWIGTYPE_p_IComponent swig_types[66]
-#define SWIGTYPE_p_ICosineRipple swig_types[67]
-#define SWIGTYPE_p_IFTDecayFunction1D swig_types[68]
-#define SWIGTYPE_p_IFTDecayFunction2D swig_types[69]
-#define SWIGTYPE_p_IFTDistribution1D swig_types[70]
-#define SWIGTYPE_p_IFTDistribution2D swig_types[71]
-#define SWIGTYPE_p_IFactoryT_std__string_ISampleBuilder_t swig_types[72]
-#define SWIGTYPE_p_IFormFactor swig_types[73]
-#define SWIGTYPE_p_IFormFactorDecorator swig_types[74]
-#define SWIGTYPE_p_IFormFactorPolyhedron swig_types[75]
-#define SWIGTYPE_p_IFormFactorPrism swig_types[76]
-#define SWIGTYPE_p_IInterferenceFunction swig_types[77]
-#define SWIGTYPE_p_INode swig_types[78]
-#define SWIGTYPE_p_INodeVisitor swig_types[79]
-#define SWIGTYPE_p_IParametricComponent swig_types[80]
-#define SWIGTYPE_p_IParticle swig_types[81]
-#define SWIGTYPE_p_IPeakShape swig_types[82]
-#define SWIGTYPE_p_IProfileRectangularRipple swig_types[83]
-#define SWIGTYPE_p_IProfileRipple swig_types[84]
-#define SWIGTYPE_p_IRotation swig_types[85]
-#define SWIGTYPE_p_ISampleBuilder swig_types[86]
-#define SWIGTYPE_p_ISampleNode swig_types[87]
-#define SWIGTYPE_p_ISawtoothRipple swig_types[88]
-#define SWIGTYPE_p_ISelectionRule swig_types[89]
-#define SWIGTYPE_p_IdentityRotation swig_types[90]
-#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[91]
-#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[92]
-#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[93]
-#define SWIGTYPE_p_InterferenceFunction2DSuperLattice swig_types[94]
-#define SWIGTYPE_p_InterferenceFunction3DLattice swig_types[95]
-#define SWIGTYPE_p_InterferenceFunctionFinite2DLattice swig_types[96]
-#define SWIGTYPE_p_InterferenceFunctionFinite3DLattice swig_types[97]
-#define SWIGTYPE_p_InterferenceFunctionHardDisk swig_types[98]
-#define SWIGTYPE_p_InterferenceFunctionNone swig_types[99]
-#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[100]
-#define SWIGTYPE_p_InterferenceFunctionTwin swig_types[101]
-#define SWIGTYPE_p_IsotropicGaussPeakShape swig_types[102]
-#define SWIGTYPE_p_IsotropicLorentzPeakShape swig_types[103]
-#define SWIGTYPE_p_Lattice2D swig_types[104]
-#define SWIGTYPE_p_Lattice2D__ReciprocalBases swig_types[105]
-#define SWIGTYPE_p_Lattice3D swig_types[106]
-#define SWIGTYPE_p_Layer swig_types[107]
-#define SWIGTYPE_p_LayerInterface swig_types[108]
-#define SWIGTYPE_p_LayerRoughness swig_types[109]
-#define SWIGTYPE_p_LorentzFisherPeakShape swig_types[110]
-#define SWIGTYPE_p_Material swig_types[111]
-#define SWIGTYPE_p_MesoCrystal swig_types[112]
-#define SWIGTYPE_p_MisesFisherGaussPeakShape swig_types[113]
-#define SWIGTYPE_p_MisesGaussPeakShape swig_types[114]
-#define SWIGTYPE_p_MultiLayer swig_types[115]
-#define SWIGTYPE_p_NodeMeta swig_types[116]
-#define SWIGTYPE_p_ParameterDistribution swig_types[117]
-#define SWIGTYPE_p_Particle swig_types[118]
-#define SWIGTYPE_p_ParticleComposition swig_types[119]
-#define SWIGTYPE_p_ParticleCoreShell swig_types[120]
-#define SWIGTYPE_p_ParticleLayout swig_types[121]
-#define SWIGTYPE_p_RotationEuler swig_types[122]
-#define SWIGTYPE_p_RotationX swig_types[123]
-#define SWIGTYPE_p_RotationY swig_types[124]
-#define SWIGTYPE_p_RotationZ swig_types[125]
-#define SWIGTYPE_p_RoughnessModelWrap swig_types[126]
-#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[127]
-#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[128]
-#define SWIGTYPE_p_SampleBuilderFactory swig_types[129]
-#define SWIGTYPE_p_SimpleSelectionRule swig_types[130]
-#define SWIGTYPE_p_SlicedParticle swig_types[131]
-#define SWIGTYPE_p_SlicingEffects swig_types[132]
-#define SWIGTYPE_p_SquareLattice2D swig_types[133]
-#define SWIGTYPE_p_Transform3D swig_types[134]
-#define SWIGTYPE_p_WavevectorInfo swig_types[135]
-#define SWIGTYPE_p_ZLimits swig_types[136]
-#define SWIGTYPE_p_allocator_type swig_types[137]
-#define SWIGTYPE_p_char swig_types[138]
-#define SWIGTYPE_p_difference_type swig_types[139]
-#define SWIGTYPE_p_double swig_types[140]
-#define SWIGTYPE_p_first_type swig_types[141]
-#define SWIGTYPE_p_int swig_types[142]
-#define SWIGTYPE_p_key_type swig_types[143]
-#define SWIGTYPE_p_long_long swig_types[144]
-#define SWIGTYPE_p_mapped_type swig_types[145]
-#define SWIGTYPE_p_p_PyObject swig_types[146]
-#define SWIGTYPE_p_second_type swig_types[147]
-#define SWIGTYPE_p_short swig_types[148]
-#define SWIGTYPE_p_signed_char swig_types[149]
-#define SWIGTYPE_p_size_type swig_types[150]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[151]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[152]
-#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[153]
-#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[154]
-#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[155]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[156]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[157]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[158]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[159]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[160]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[161]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[162]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[163]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[164]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[165]
-#define SWIGTYPE_p_std__functionT_ISampleBuilder_pfF_t swig_types[166]
-#define SWIGTYPE_p_std__invalid_argument swig_types[167]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[168]
-#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[169]
-#define SWIGTYPE_p_std__ostream swig_types[170]
-#define SWIGTYPE_p_std__pairT_double_double_t swig_types[171]
-#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[172]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[173]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[174]
-#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[175]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[176]
-#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[177]
-#define SWIGTYPE_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t swig_types[178]
-#define SWIGTYPE_p_std__vectorT_ParticleLayout_const_p_std__allocatorT_ParticleLayout_const_p_t_t swig_types[179]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[180]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[181]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[182]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[183]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[184]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[185]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[186]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[187]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[188]
-#define SWIGTYPE_p_unsigned_char swig_types[189]
-#define SWIGTYPE_p_unsigned_int swig_types[190]
-#define SWIGTYPE_p_unsigned_long_long swig_types[191]
-#define SWIGTYPE_p_unsigned_short swig_types[192]
-#define SWIGTYPE_p_value_type swig_types[193]
-static swig_type_info *swig_types[195];
-static swig_module_info swig_module = {swig_types, 194, 0, 0, 0, 0};
+#define SWIGTYPE_p_FTDecayFunction1DCauchy swig_types[8]
+#define SWIGTYPE_p_FTDecayFunction1DGauss swig_types[9]
+#define SWIGTYPE_p_FTDecayFunction1DTriangle swig_types[10]
+#define SWIGTYPE_p_FTDecayFunction1DVoigt swig_types[11]
+#define SWIGTYPE_p_FTDecayFunction2DCauchy swig_types[12]
+#define SWIGTYPE_p_FTDecayFunction2DGauss swig_types[13]
+#define SWIGTYPE_p_FTDecayFunction2DVoigt swig_types[14]
+#define SWIGTYPE_p_FTDistribution1DCauchy swig_types[15]
+#define SWIGTYPE_p_FTDistribution1DCosine swig_types[16]
+#define SWIGTYPE_p_FTDistribution1DGate swig_types[17]
+#define SWIGTYPE_p_FTDistribution1DGauss swig_types[18]
+#define SWIGTYPE_p_FTDistribution1DTriangle swig_types[19]
+#define SWIGTYPE_p_FTDistribution1DVoigt swig_types[20]
+#define SWIGTYPE_p_FTDistribution2DCauchy swig_types[21]
+#define SWIGTYPE_p_FTDistribution2DCone swig_types[22]
+#define SWIGTYPE_p_FTDistribution2DGate swig_types[23]
+#define SWIGTYPE_p_FTDistribution2DGauss swig_types[24]
+#define SWIGTYPE_p_FTDistribution2DVoigt swig_types[25]
+#define SWIGTYPE_p_FormFactorAnisoPyramid swig_types[26]
+#define SWIGTYPE_p_FormFactorBox swig_types[27]
+#define SWIGTYPE_p_FormFactorCantellatedCube swig_types[28]
+#define SWIGTYPE_p_FormFactorCone swig_types[29]
+#define SWIGTYPE_p_FormFactorCone6 swig_types[30]
+#define SWIGTYPE_p_FormFactorCosineRippleBox swig_types[31]
+#define SWIGTYPE_p_FormFactorCosineRippleGauss swig_types[32]
+#define SWIGTYPE_p_FormFactorCosineRippleLorentz swig_types[33]
+#define SWIGTYPE_p_FormFactorCrystal swig_types[34]
+#define SWIGTYPE_p_FormFactorCuboctahedron swig_types[35]
+#define SWIGTYPE_p_FormFactorCylinder swig_types[36]
+#define SWIGTYPE_p_FormFactorDodecahedron swig_types[37]
+#define SWIGTYPE_p_FormFactorEllipsoidalCylinder swig_types[38]
+#define SWIGTYPE_p_FormFactorFullSphere swig_types[39]
+#define SWIGTYPE_p_FormFactorFullSpheroid swig_types[40]
+#define SWIGTYPE_p_FormFactorGaussSphere swig_types[41]
+#define SWIGTYPE_p_FormFactorHemiEllipsoid swig_types[42]
+#define SWIGTYPE_p_FormFactorHollowSphere swig_types[43]
+#define SWIGTYPE_p_FormFactorIcosahedron swig_types[44]
+#define SWIGTYPE_p_FormFactorLongBoxGauss swig_types[45]
+#define SWIGTYPE_p_FormFactorLongBoxLorentz swig_types[46]
+#define SWIGTYPE_p_FormFactorPrism3 swig_types[47]
+#define SWIGTYPE_p_FormFactorPrism6 swig_types[48]
+#define SWIGTYPE_p_FormFactorPyramid swig_types[49]
+#define SWIGTYPE_p_FormFactorSawtoothRippleBox swig_types[50]
+#define SWIGTYPE_p_FormFactorSawtoothRippleGauss swig_types[51]
+#define SWIGTYPE_p_FormFactorSawtoothRippleLorentz swig_types[52]
+#define SWIGTYPE_p_FormFactorSphereGaussianRadius swig_types[53]
+#define SWIGTYPE_p_FormFactorSphereLogNormalRadius swig_types[54]
+#define SWIGTYPE_p_FormFactorTetrahedron swig_types[55]
+#define SWIGTYPE_p_FormFactorTruncatedCube swig_types[56]
+#define SWIGTYPE_p_FormFactorTruncatedSphere swig_types[57]
+#define SWIGTYPE_p_FormFactorTruncatedSpheroid swig_types[58]
+#define SWIGTYPE_p_FormFactorWeighted swig_types[59]
+#define SWIGTYPE_p_GaussFisherPeakShape swig_types[60]
+#define SWIGTYPE_p_HexagonalLattice2D swig_types[61]
+#define SWIGTYPE_p_IAbstractParticle swig_types[62]
+#define SWIGTYPE_p_IBornFF swig_types[63]
+#define SWIGTYPE_p_ICloneable swig_types[64]
+#define SWIGTYPE_p_IComponent swig_types[65]
+#define SWIGTYPE_p_ICosineRipple swig_types[66]
+#define SWIGTYPE_p_IFTDecayFunction1D swig_types[67]
+#define SWIGTYPE_p_IFTDecayFunction2D swig_types[68]
+#define SWIGTYPE_p_IFTDistribution1D swig_types[69]
+#define SWIGTYPE_p_IFTDistribution2D swig_types[70]
+#define SWIGTYPE_p_IFactoryT_std__string_ISampleBuilder_t swig_types[71]
+#define SWIGTYPE_p_IFormFactor swig_types[72]
+#define SWIGTYPE_p_IFormFactorDecorator swig_types[73]
+#define SWIGTYPE_p_IFormFactorPolyhedron swig_types[74]
+#define SWIGTYPE_p_IFormFactorPrism swig_types[75]
+#define SWIGTYPE_p_IInterferenceFunction swig_types[76]
+#define SWIGTYPE_p_INode swig_types[77]
+#define SWIGTYPE_p_INodeVisitor swig_types[78]
+#define SWIGTYPE_p_IParametricComponent swig_types[79]
+#define SWIGTYPE_p_IParticle swig_types[80]
+#define SWIGTYPE_p_IPeakShape swig_types[81]
+#define SWIGTYPE_p_IProfileRectangularRipple swig_types[82]
+#define SWIGTYPE_p_IProfileRipple swig_types[83]
+#define SWIGTYPE_p_IRotation swig_types[84]
+#define SWIGTYPE_p_ISampleBuilder swig_types[85]
+#define SWIGTYPE_p_ISampleNode swig_types[86]
+#define SWIGTYPE_p_ISawtoothRipple swig_types[87]
+#define SWIGTYPE_p_ISelectionRule swig_types[88]
+#define SWIGTYPE_p_IdentityRotation swig_types[89]
+#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[90]
+#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[91]
+#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[92]
+#define SWIGTYPE_p_InterferenceFunction2DSuperLattice swig_types[93]
+#define SWIGTYPE_p_InterferenceFunction3DLattice swig_types[94]
+#define SWIGTYPE_p_InterferenceFunctionFinite2DLattice swig_types[95]
+#define SWIGTYPE_p_InterferenceFunctionFinite3DLattice swig_types[96]
+#define SWIGTYPE_p_InterferenceFunctionHardDisk swig_types[97]
+#define SWIGTYPE_p_InterferenceFunctionNone swig_types[98]
+#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[99]
+#define SWIGTYPE_p_InterferenceFunctionTwin swig_types[100]
+#define SWIGTYPE_p_IsotropicGaussPeakShape swig_types[101]
+#define SWIGTYPE_p_IsotropicLorentzPeakShape swig_types[102]
+#define SWIGTYPE_p_Lattice2D swig_types[103]
+#define SWIGTYPE_p_Lattice2D__ReciprocalBases swig_types[104]
+#define SWIGTYPE_p_Lattice3D swig_types[105]
+#define SWIGTYPE_p_Layer swig_types[106]
+#define SWIGTYPE_p_LayerInterface swig_types[107]
+#define SWIGTYPE_p_LayerRoughness swig_types[108]
+#define SWIGTYPE_p_LorentzFisherPeakShape swig_types[109]
+#define SWIGTYPE_p_Material swig_types[110]
+#define SWIGTYPE_p_MesoCrystal swig_types[111]
+#define SWIGTYPE_p_MisesFisherGaussPeakShape swig_types[112]
+#define SWIGTYPE_p_MisesGaussPeakShape swig_types[113]
+#define SWIGTYPE_p_MultiLayer swig_types[114]
+#define SWIGTYPE_p_NodeMeta swig_types[115]
+#define SWIGTYPE_p_ParameterDistribution swig_types[116]
+#define SWIGTYPE_p_Particle swig_types[117]
+#define SWIGTYPE_p_ParticleComposition swig_types[118]
+#define SWIGTYPE_p_ParticleCoreShell swig_types[119]
+#define SWIGTYPE_p_ParticleLayout swig_types[120]
+#define SWIGTYPE_p_RotationEuler swig_types[121]
+#define SWIGTYPE_p_RotationX swig_types[122]
+#define SWIGTYPE_p_RotationY swig_types[123]
+#define SWIGTYPE_p_RotationZ swig_types[124]
+#define SWIGTYPE_p_RoughnessModelWrap swig_types[125]
+#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[126]
+#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[127]
+#define SWIGTYPE_p_SampleBuilderFactory swig_types[128]
+#define SWIGTYPE_p_SimpleSelectionRule swig_types[129]
+#define SWIGTYPE_p_SlicedParticle swig_types[130]
+#define SWIGTYPE_p_SlicingEffects swig_types[131]
+#define SWIGTYPE_p_SquareLattice2D swig_types[132]
+#define SWIGTYPE_p_Transform3D swig_types[133]
+#define SWIGTYPE_p_WavevectorInfo swig_types[134]
+#define SWIGTYPE_p_ZLimits swig_types[135]
+#define SWIGTYPE_p_allocator_type swig_types[136]
+#define SWIGTYPE_p_char swig_types[137]
+#define SWIGTYPE_p_difference_type swig_types[138]
+#define SWIGTYPE_p_double swig_types[139]
+#define SWIGTYPE_p_first_type swig_types[140]
+#define SWIGTYPE_p_int swig_types[141]
+#define SWIGTYPE_p_key_type swig_types[142]
+#define SWIGTYPE_p_long_long swig_types[143]
+#define SWIGTYPE_p_mapped_type swig_types[144]
+#define SWIGTYPE_p_p_PyObject swig_types[145]
+#define SWIGTYPE_p_second_type swig_types[146]
+#define SWIGTYPE_p_short swig_types[147]
+#define SWIGTYPE_p_signed_char swig_types[148]
+#define SWIGTYPE_p_size_type swig_types[149]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[150]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[151]
+#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[152]
+#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[153]
+#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[154]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[155]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[156]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[157]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[158]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[159]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[160]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[161]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[162]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[163]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[164]
+#define SWIGTYPE_p_std__functionT_ISampleBuilder_pfF_t swig_types[165]
+#define SWIGTYPE_p_std__invalid_argument swig_types[166]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[167]
+#define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[168]
+#define SWIGTYPE_p_std__ostream swig_types[169]
+#define SWIGTYPE_p_std__pairT_double_double_t swig_types[170]
+#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[171]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[172]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[173]
+#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[174]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[175]
+#define SWIGTYPE_p_std__vectorT_INode_p_std__allocatorT_INode_p_t_t swig_types[176]
+#define SWIGTYPE_p_std__vectorT_Material_const_p_std__allocatorT_Material_const_p_t_t swig_types[177]
+#define SWIGTYPE_p_std__vectorT_ParticleLayout_const_p_std__allocatorT_ParticleLayout_const_p_t_t swig_types[178]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[179]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[180]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[181]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[182]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[183]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[184]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[185]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[186]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[187]
+#define SWIGTYPE_p_unsigned_char swig_types[188]
+#define SWIGTYPE_p_unsigned_int swig_types[189]
+#define SWIGTYPE_p_unsigned_long_long swig_types[190]
+#define SWIGTYPE_p_unsigned_short swig_types[191]
+#define SWIGTYPE_p_value_type swig_types[192]
+static swig_type_info *swig_types[194];
+static swig_module_info swig_module = {swig_types, 193, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -37358,30 +37357,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_WavevectorInfo__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  DiffuseElement *arg1 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  WavevectorInfo *result = 0 ;
-  
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_DiffuseElement,  0  | 0);
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_WavevectorInfo" "', argument " "1"" of type '" "DiffuseElement const &""'"); 
-  }
-  if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_WavevectorInfo" "', argument " "1"" of type '" "DiffuseElement const &""'"); 
-  }
-  arg1 = reinterpret_cast< DiffuseElement * >(argp1);
-  result = (WavevectorInfo *)new WavevectorInfo((DiffuseElement const &)*arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_WavevectorInfo, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_new_WavevectorInfo(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[4] = {
@@ -37390,20 +37365,12 @@ SWIGINTERN PyObject *_wrap_new_WavevectorInfo(PyObject *self, PyObject *args) {
   
   if (!(argc = SWIG_Python_UnpackTuple(args, "new_WavevectorInfo", 0, 3, argv))) SWIG_fail;
   --argc;
-  if (argc == 1) {
-    int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_DiffuseElement, SWIG_POINTER_NO_NULL | 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_new_WavevectorInfo__SWIG_2(self, argc, argv);
-    }
-  }
   if (argc == 3) {
     int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_NO_NULL | 0);
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
         {
@@ -37411,17 +37378,17 @@ SWIGINTERN PyObject *_wrap_new_WavevectorInfo(PyObject *self, PyObject *args) {
           _v = SWIG_CheckState(res);
         }
         if (_v) {
-          return _wrap_new_WavevectorInfo__SWIG_1(self, argc, argv);
+          return _wrap_new_WavevectorInfo__SWIG_0(self, argc, argv);
         }
       }
     }
   }
   if (argc == 3) {
     int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_NO_NULL | 0);
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
         {
@@ -37429,7 +37396,7 @@ SWIGINTERN PyObject *_wrap_new_WavevectorInfo(PyObject *self, PyObject *args) {
           _v = SWIG_CheckState(res);
         }
         if (_v) {
-          return _wrap_new_WavevectorInfo__SWIG_0(self, argc, argv);
+          return _wrap_new_WavevectorInfo__SWIG_1(self, argc, argv);
         }
       }
     }
@@ -37439,8 +37406,7 @@ fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_WavevectorInfo'.\n"
     "  Possible C/C++ prototypes are:\n"
     "    WavevectorInfo::WavevectorInfo(cvector_t,cvector_t,double)\n"
-    "    WavevectorInfo::WavevectorInfo(kvector_t,kvector_t,double)\n"
-    "    WavevectorInfo::WavevectorInfo(DiffuseElement const &)\n");
+    "    WavevectorInfo::WavevectorInfo(kvector_t,kvector_t,double)\n");
   return 0;
 }
 
@@ -68864,9 +68830,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "WavevectorInfo_GetZeroQ", _wrap_WavevectorInfo_GetZeroQ, METH_NOARGS, "WavevectorInfo_GetZeroQ() -> WavevectorInfo"},
 	 { "new_WavevectorInfo", _wrap_new_WavevectorInfo, METH_VARARGS, "\n"
 		"WavevectorInfo(cvector_t ki, cvector_t kf, double wavelength)\n"
-		"WavevectorInfo(kvector_t ki, kvector_t kf, double wavelength)\n"
-		"new_WavevectorInfo(DiffuseElement const & arg1) -> WavevectorInfo\n"
-		"WavevectorInfo::WavevectorInfo(const DiffuseElement &)\n"
+		"new_WavevectorInfo(kvector_t ki, kvector_t kf, double wavelength) -> WavevectorInfo\n"
+		"WavevectorInfo::WavevectorInfo(kvector_t ki, kvector_t kf, double wavelength)\n"
 		"\n"
 		""},
 	 { "WavevectorInfo_transformed", _wrap_WavevectorInfo_transformed, METH_VARARGS, "\n"
@@ -75695,7 +75660,6 @@ static swig_type_info _swigt__p_BasicVector3DT_std__complexT_double_t_t = {"_p_B
 static swig_type_info _swigt__p_CallbackMap_t = {"_p_CallbackMap_t", "CallbackMap_t *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_CreateItemCallback = {"_p_CreateItemCallback", "CreateItemCallback *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Crystal = {"_p_Crystal", "Crystal *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_DiffuseElement = {"_p_DiffuseElement", "DiffuseElement *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FTDecayFunction1DCauchy = {"_p_FTDecayFunction1DCauchy", "FTDecayFunction1DCauchy *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FTDecayFunction1DGauss = {"_p_FTDecayFunction1DGauss", "FTDecayFunction1DGauss *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FTDecayFunction1DTriangle = {"_p_FTDecayFunction1DTriangle", "FTDecayFunction1DTriangle *", 0, 0, (void*)0, 0};
@@ -75891,7 +75855,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_CallbackMap_t,
   &_swigt__p_CreateItemCallback,
   &_swigt__p_Crystal,
-  &_swigt__p_DiffuseElement,
   &_swigt__p_FTDecayFunction1DCauchy,
   &_swigt__p_FTDecayFunction1DGauss,
   &_swigt__p_FTDecayFunction1DTriangle,
@@ -76087,7 +76050,6 @@ static swig_cast_info _swigc__p_BasicVector3DT_std__complexT_double_t_t[] = {  {
 static swig_cast_info _swigc__p_CallbackMap_t[] = {  {&_swigt__p_CallbackMap_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_CreateItemCallback[] = {  {&_swigt__p_CreateItemCallback, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Crystal[] = {  {&_swigt__p_Crystal, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_DiffuseElement[] = {  {&_swigt__p_DiffuseElement, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FTDecayFunction1DCauchy[] = {  {&_swigt__p_FTDecayFunction1DCauchy, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FTDecayFunction1DGauss[] = {  {&_swigt__p_FTDecayFunction1DGauss, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FTDecayFunction1DTriangle[] = {  {&_swigt__p_FTDecayFunction1DTriangle, 0, 0, 0},{0, 0, 0, 0}};
@@ -76283,7 +76245,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_CallbackMap_t,
   _swigc__p_CreateItemCallback,
   _swigc__p_Crystal,
-  _swigc__p_DiffuseElement,
   _swigc__p_FTDecayFunction1DCauchy,
   _swigc__p_FTDecayFunction1DGauss,
   _swigc__p_FTDecayFunction1DTriangle,
-- 
GitLab