diff --git a/Core/FormFactors/FormFactorAnisoPyramid.cpp b/Core/FormFactors/FormFactorAnisoPyramid.cpp
index 4a9d1eca0f0e732705313c13278b31393cede16c..c4b22255ca07387ee1501c868ad2723fcb7e361d 100644
--- a/Core/FormFactors/FormFactorAnisoPyramid.cpp
+++ b/Core/FormFactors/FormFactorAnisoPyramid.cpp
@@ -18,13 +18,14 @@
 #include "MathFunctions.h"
 
 const FormFactorPolyhedron::Topology FormFactorAnisoPyramid::topology = {
-    { { 3, 2, 1, 0 }, false },
-    { { 0, 1, 5, 4 }, false },
-    { { 1, 2, 6, 5 }, false },
-    { { 2, 3, 7, 6 }, false },
-    { { 3, 0, 4, 7 }, false },
-    { { 4, 5, 6, 7 }, false }
-};
+    {
+        { { 3, 2, 1, 0 }, true },
+        { { 0, 1, 5, 4 }, false },
+        { { 1, 2, 6, 5 }, false },
+        { { 2, 3, 7, 6 }, false },
+        { { 3, 0, 4, 7 }, false },
+        { { 4, 5, 6, 7 }, true }
+    }, false };
 
 //! @brief Pyramid constructor
 //! @param base_edge of one side of Pyramid's square base
@@ -72,7 +73,7 @@ void FormFactorAnisoPyramid::onChange()
 
     double zcom = m_height * ( .5 - (r+s)/3 + r*s/4 ) / ( 1 - (r+s)/2 + r*s/3 ); // center of mass
 
-    setPolyhedron( topology, -zcom, false, {
+    setPolyhedron( topology, -zcom, {
         // base:
         { -D, -W, -zcom },
         {  D, -W, -zcom },
diff --git a/Core/FormFactors/FormFactorCone6.cpp b/Core/FormFactors/FormFactorCone6.cpp
index d9f13c0326647ea52a8012c56a53c57cc8e6e65e..4e8915db93c5a2cad1806d60ccde257a4e41d66d 100644
--- a/Core/FormFactors/FormFactorCone6.cpp
+++ b/Core/FormFactors/FormFactorCone6.cpp
@@ -18,15 +18,16 @@
 #include "MathFunctions.h"
 
 const FormFactorPolyhedron::Topology FormFactorCone6::topology = {
-    { {  5,  4,  3,  2,  1,  0 }, true },
-    { {  0,  1,  7,  6 }, false },
-    { {  1,  2,  8,  7 }, false },
-    { {  2,  3,  9,  8 }, false },
-    { {  3,  4, 10,  9 }, false },
-    { {  4,  5, 11, 10 }, false },
-    { {  5,  0,  6, 11 }, false },
-    { {  6,  7,  8,  9, 10, 11 }, true }
-};
+    {
+        { {  5,  4,  3,  2,  1,  0 }, true },
+        { {  0,  1,  7,  6 }, false },
+        { {  1,  2,  8,  7 }, false },
+        { {  2,  3,  9,  8 }, false },
+        { {  3,  4, 10,  9 }, false },
+        { {  4,  5, 11, 10 }, false },
+        { {  5,  0,  6, 11 }, false },
+        { {  6,  7,  8,  9, 10, 11 }, true }
+    }, false };
 
 //! Cone6 constructor
 //! @param base_edge of hexagonal base (different from R in IsGisaxs)
@@ -70,7 +71,7 @@ void FormFactorCone6::onChange()
 
     double zcom = m_height * ( .5 - 2*r/3 + r*r/4 ) / ( 1 - r + r*r/3 ); // center of mass
 
-    setPolyhedron( topology, -zcom, false, {
+    setPolyhedron( topology, -zcom, {
         // base:
         {  a,   0., -zcom },
         {  as,  ac, -zcom },
diff --git a/Core/FormFactors/FormFactorCuboctahedron.cpp b/Core/FormFactors/FormFactorCuboctahedron.cpp
index 3d874a44340deb9209190616876fc4bc4cb2a370..c56449eaaa057064519a6d293d873a0d84d15fea 100644
--- a/Core/FormFactors/FormFactorCuboctahedron.cpp
+++ b/Core/FormFactors/FormFactorCuboctahedron.cpp
@@ -19,17 +19,18 @@
 #include "MathFunctions.h"
 
 const FormFactorPolyhedron::Topology FormFactorCuboctahedron::topology = {
-    { {  3,  2,  1,  0 }, true  },
-    { {  0,  1,  5,  4 }, false },
-    { {  1,  2,  6,  5 }, false },
-    { {  2,  3,  7,  6 }, false },
-    { {  3,  0,  4,  7 }, false },
-    { {  4,  5,  9,  8 }, false },
-    { {  5,  6, 10,  9 }, false },
-    { {  6,  7, 11, 10 }, false },
-    { {  7,  4,  8, 11 }, false },
-    { {  8,  9, 10, 11 }, true  }
-};
+    {
+        { {  3,  2,  1,  0 }, true  },
+        { {  0,  1,  5,  4 }, false },
+        { {  1,  2,  6,  5 }, false },
+        { {  2,  3,  7,  6 }, false },
+        { {  3,  0,  4,  7 }, false },
+        { {  4,  5,  9,  8 }, false },
+        { {  5,  6, 10,  9 }, false },
+        { {  6,  7, 11, 10 }, false },
+        { {  7,  4,  8, 11 }, false },
+        { {  8,  9, 10, 11 }, true  }
+    }, false };
 
 //! @brief Cuboctahedron constructor
 //! @param length of one side of Cuboctahedron's square base
@@ -81,7 +82,7 @@ void FormFactorCuboctahedron::onChange()
     double zb = -dzcom;
     double zc = -dzcom+x*m_height;
 
-    setPolyhedron( topology, za, false, {
+    setPolyhedron( topology, za, {
             // base:
             { -a, -a, za },
             {  a, -a, za },
diff --git a/Core/FormFactors/FormFactorDodecahedron.cpp b/Core/FormFactors/FormFactorDodecahedron.cpp
index 43a15ba8d50e038cf454740dbd7c27211b221055..b6d928feb98833f01938554370da197213180ea4 100644
--- a/Core/FormFactors/FormFactorDodecahedron.cpp
+++ b/Core/FormFactors/FormFactorDodecahedron.cpp
@@ -19,23 +19,24 @@
 #include "MathFunctions.h"
 
 const FormFactorPolyhedron::Topology FormFactorDodecahedron::topology = {
-    // bottom:
-    { {  0,  4,  3,  2,  1 }, false },
-    // lower ring:
-    { {  0,  5, 12,  9,  4 }, false },
-    { {  4,  9, 11,  8,  3 }, false },
-    { {  3,  8, 10,  7,  2 }, false },
-    { {  2,  7, 14,  6,  1 }, false },
-    { {  1,  6, 13,  5,  0 }, false },
-     // upper ring:
-    { {  8, 11, 16, 15, 10 }, false },
-    { {  9, 12, 17, 16, 11 }, false },
-    { {  5, 13, 18, 17, 12 }, false },
-    { {  6, 14, 19, 18, 13 }, false },
-    { {  7, 10, 15, 19, 14 }, false },
-    // top:
-    { { 15, 16, 17, 18, 19 }, false }
-};
+    {
+        // bottom:
+        { {  0,  4,  3,  2,  1 }, false },
+        // lower ring:
+        { {  0,  5, 12,  9,  4 }, false },
+        { {  4,  9, 11,  8,  3 }, false },
+        { {  3,  8, 10,  7,  2 }, false },
+        { {  2,  7, 14,  6,  1 }, false },
+        { {  1,  6, 13,  5,  0 }, false },
+        // upper ring:
+        { {  8, 11, 16, 15, 10 }, false },
+        { {  9, 12, 17, 16, 11 }, false },
+        { {  5, 13, 18, 17, 12 }, false },
+        { {  6, 14, 19, 18, 13 }, false },
+        { {  7, 10, 15, 19, 14 }, false },
+        // top:
+        { { 15, 16, 17, 18, 19 }, false }
+    }, true };
 
 
 FormFactorDodecahedron::FormFactorDodecahedron(double edge)
@@ -50,7 +51,7 @@ FormFactorDodecahedron::FormFactorDodecahedron(double edge)
 void FormFactorDodecahedron::onChange()
 {
     double a = m_edge;
-    setPolyhedron( topology, -1.113516364411607*a, true, {
+    setPolyhedron( topology, -1.113516364411607*a, {
         {  0.8506508083520399*a,                   0*a,  -1.113516364411607*a},
         {  0.2628655560595668*a,  0.8090169943749473*a,  -1.113516364411607*a},
         { -0.6881909602355868*a,                 0.5*a,  -1.113516364411607*a},
diff --git a/Core/FormFactors/FormFactorIcosahedron.cpp b/Core/FormFactors/FormFactorIcosahedron.cpp
index de9dfc645f3d3d0ba7153c069ca22ad158c7f6eb..93f21cfee8ff45f1db9e5e6b3879c9f81f0ff49b 100644
--- a/Core/FormFactors/FormFactorIcosahedron.cpp
+++ b/Core/FormFactors/FormFactorIcosahedron.cpp
@@ -19,33 +19,34 @@
 #include "MathFunctions.h"
 
 const FormFactorPolyhedron::Topology FormFactorIcosahedron::topology = {
-    // bottom:
-    { {  0,  2,  1 }, false },
-    // 1st row:
-    { {  0,  5,  2 }, false },
-    { {  2,  3,  1 }, false },
-    { {  1,  4,  0 }, false },
-    // 2nd row:
-    { {  0,  6,  5 }, false },
-    { {  2,  5,  8 }, false },
-    { {  2,  8,  3 }, false },
-    { {  1,  3,  7 }, false },
-    { {  1,  7,  4 }, false },
-    { {  0,  4,  6 }, false },
-    // 3rd row:
-    { {  3,  8,  9 }, false },
-    { {  5, 11,  8 }, false },
-    { {  5,  6, 11 }, false },
-    { {  4, 10,  6 }, false },
-    { {  4,  7, 10 }, false },
-    { {  3,  9,  7 }, false },
-    // 4th row:
-    { {  8, 11,  9 }, false },
-    { {  6, 10, 11 }, false },
-    { {  7,  9, 10 }, false },
-    // top:
-    { {  9, 11, 10 }, false }
-};
+    {
+        // bottom:
+        { {  0,  2,  1 }, false },
+        // 1st row:
+        { {  0,  5,  2 }, false },
+        { {  2,  3,  1 }, false },
+        { {  1,  4,  0 }, false },
+        // 2nd row:
+        { {  0,  6,  5 }, false },
+        { {  2,  5,  8 }, false },
+        { {  2,  8,  3 }, false },
+        { {  1,  3,  7 }, false },
+        { {  1,  7,  4 }, false },
+        { {  0,  4,  6 }, false },
+        // 3rd row:
+        { {  3,  8,  9 }, false },
+        { {  5, 11,  8 }, false },
+        { {  5,  6, 11 }, false },
+        { {  4, 10,  6 }, false },
+        { {  4,  7, 10 }, false },
+        { {  3,  9,  7 }, false },
+        // 4th row:
+        { {  8, 11,  9 }, false },
+        { {  6, 10, 11 }, false },
+        { {  7,  9, 10 }, false },
+        // top:
+        { {  9, 11, 10 }, false }
+    }, true };
 
 
 FormFactorIcosahedron::FormFactorIcosahedron(double edge)
@@ -60,7 +61,7 @@ FormFactorIcosahedron::FormFactorIcosahedron(double edge)
 void FormFactorIcosahedron::onChange()
 {
     double a = m_edge;
-    setPolyhedron( topology, -0.7557613140761708*a, true, {
+    setPolyhedron( topology, -0.7557613140761708*a, {
         {  0.5773502691896258*a,                   0*a, -0.7557613140761708*a},
         {  -0.288675134594813*a,                 0.5*a, -0.7557613140761708*a},
         {  -0.288675134594813*a,                -0.5*a, -0.7557613140761708*a},
diff --git a/Core/FormFactors/FormFactorPolyhedron.cpp b/Core/FormFactors/FormFactorPolyhedron.cpp
index 69765a88451d46dec308ca91225cfac3120a72cf..13518fb8edb6d9e3ca6baf48c1cf0239b30a869c 100644
--- a/Core/FormFactors/FormFactorPolyhedron.cpp
+++ b/Core/FormFactors/FormFactorPolyhedron.cpp
@@ -43,7 +43,7 @@ static double eps(2e-16);
 extern Diagnosis diagnosis;
 #endif
 
-double PolyhedralFace::qpa_limit_series = 1e-3;
+double PolyhedralFace::qpa_limit_series = 1e-2;
 int PolyhedralFace::n_limit_series = 20;
 
 double FormFactorPolyhedron::q_limit_series = 1e-5;
@@ -202,7 +202,7 @@ complex_t PolyhedralFace::ff_n_core( int m, const cvector_t q ) const
 {
     cvector_t prevec = 2.*m_normal.cross( q ); // complex conjugation will take place in .dot
     complex_t ret = 0;
-    for( const PolyhedralEdge& e: edges )
+    for( const PolyhedralEdge& e: edges ) // TODO improve accuracy as in qpa expansion
         ret += e.contrib(m, prevec, q);
     return ret;
 }
@@ -228,6 +228,71 @@ complex_t PolyhedralFace::ff_n( int n, const cvector_t q ) const
     }
 }
 
+//! Returns sum of n>=1 terms of qpa expansion of 2d form factor
+
+complex_t PolyhedralFace::expansion(
+    complex_t fac_even, complex_t fac_odd, cvector_t qpa, double abslevel ) const
+{
+#ifdef POLYHEDRAL_DIAGNOSTIC
+    diagnosis.nExpandedFaces += 1;
+#endif
+    complex_t sum = 0;
+    complex_t n_fac = I;
+    int count_return_condition = 0;
+    for( int n=1; n<n_limit_series; ++n ) {
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        diagnosis.maxOrder = std::max( diagnosis.maxOrder, n );
+#endif
+        complex_t term = n_fac * ( n&1 ? fac_odd : fac_even ) * ff_n_core(n, qpa) / qpa.mag2();
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if( diagnosis.debmsg>=2 )
+            std::cout<<std::setprecision(16)<<"    sum="<<sum<<" +term="<<term<<"\n";
+#endif
+        sum += term;
+        if( std::abs(term)<=eps*std::abs(sum) || std::abs(sum)<eps*abslevel )
+            ++count_return_condition;
+        else
+            count_return_condition = 0;
+        if( count_return_condition>2 )
+            return sum; // regular exit
+        n_fac *= I;
+    }
+#ifdef POLYHEDRAL_DIAGNOSTIC
+    if( !diagnosis.request_convergence )
+        return sum;
+#endif
+    throw std::runtime_error("Bug in formfactor computation: series f(q_pa) not converged");
+}
+
+//! Returns core contribution to analytic 2d form factor.
+
+complex_t PolyhedralFace::edge_sum_ff( cvector_t q, cvector_t qpa, bool sym_Ci ) const
+{
+    cvector_t prevec = m_normal.cross( qpa ); // complex conjugation will take place in .dot
+    complex_t sum = 0;
+    complex_t vfacsum = 0;
+    for( size_t i=0; i<edges.size(); ++i ) {
+        const PolyhedralEdge& e = edges[i];
+        complex_t qE = e.qE(qpa);
+        complex_t qR = e.qR(qpa);
+        complex_t Rfac = sym_S2 ? sin(qR) : ( sym_Ci ? cos(e.qR(q)) : exp(I*qR) );
+        complex_t vfac;
+        if( sym_S2 || i<edges.size()-1 ) {
+            vfac = prevec.dot(e.E());
+            vfacsum += vfac;
+        } else {
+            vfac = - vfacsum; // to improve numeric accuracy: qcE_J = - sum_{j=0}^{J-1} qcE_j
+        }
+        complex_t term = vfac * MathFunctions::sinc(qE) * Rfac;
+        sum += term;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if( diagnosis.debmsg>=2 )
+            std::cout<<std::scientific<<std::showpos<<std::setprecision(16)<<"    sum="<<sum<<" term="<<term<<" vf="<<vfac<<" qE="<<qE<<" qR="<<qR<<" sinc="<<MathFunctions::sinc(qE)<<" Rfac="<<Rfac<<"\n";
+#endif
+    }
+    return sum;
+}
+
 //! Returns the contribution ff(q) of this face to the polyhedral form factor.
 
 complex_t PolyhedralFace::ff( const cvector_t q, const bool sym_Ci ) const
@@ -237,13 +302,11 @@ complex_t PolyhedralFace::ff( const cvector_t q, const bool sym_Ci ) const
     decompose_q( q, qperp, qpa );
     double qpa_red = m_radius_2d * qpa.mag();
     complex_t qr_perp = qperp*m_rperp;
+    complex_t ff0 = (sym_Ci ? 2.*I*sin(qr_perp) : exp(I*qr_perp)) * m_area;
     if ( qpa_red==0 ) {
-        return (sym_Ci ? 2.*I*sin(qr_perp) : exp(I*qr_perp)) * m_area;
+        return ff0;
     } else if ( qpa_red < qpa_limit_series && !sym_S2 ) {
         // summation of power series
-#ifdef POLYHEDRAL_DIAGNOSTIC
-        diagnosis.nExpandedFaces += 1;
-#endif
         complex_t fac_even;
         complex_t fac_odd;
         if( sym_Ci ) {
@@ -253,38 +316,19 @@ complex_t PolyhedralFace::ff( const cvector_t q, const bool sym_Ci ) const
             fac_even = exp( I*qr_perp );
             fac_odd = fac_even;
         }
-        complex_t sum = fac_even * m_area;
-        complex_t n_fac = I;
-        for( int n=1; n<n_limit_series; ++n ) {
-#ifdef POLYHEDRAL_DIAGNOSTIC
-            diagnosis.maxOrder = std::max( diagnosis.maxOrder, n );
-#endif
-            complex_t term = n_fac * ( n&1 ? fac_odd : fac_even ) * ff_n_core(n, qpa) / qpa.mag2();
-            sum += term;
-            // std::cout<<std::setprecision(16)<<"  sum="<<sum<<" term="<<term<<"\n";
-            if( !(n&1) && std::abs(term)<=eps*std::abs(sum) )
-                return sum;
-            n_fac *= I;
-        }
-#ifdef POLYHEDRAL_DIAGNOSTIC
-        return sum;
-#else
-        throw std::runtime_error("Bug in formfactor computation: series f(q_pa) not converged");
-#endif
+        return ff0 + expansion( fac_even, fac_odd, qpa, std::abs(ff0) );
     } else {
         // direct evaluation of analytic formula
-        cvector_t prevec = m_normal.cross( qpa ); // complex conjugation will take place in .dot
-        complex_t prefac = 2.;
+        complex_t prefac;
         if( sym_S2 )
-            prefac *= sym_Ci ? -4.*sin(qr_perp) : 2.*I*exp(I*qr_perp);
-        complex_t sum = 0;
-        for( const PolyhedralEdge& e: edges ) {
-            complex_t qE = e.qE(q);
-            complex_t qR = e.qR(q);
-            complex_t Rfac = sym_S2 ? sin(e.qR(qpa)) : ( sym_Ci ? 2.*cos(qR) : exp(I*qR) );
-            sum += prevec.dot(e.E()) * MathFunctions::sinc(qE) * Rfac;
-        }
-        return prefac * sum / ( I*qpa.mag2() );
+            prefac = sym_Ci ? -8.*sin(qr_perp) : 4.*I*exp(I*qr_perp);
+        else
+            prefac = sym_Ci ? 4. : 2.*exp(I*qr_perp);
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if( diagnosis.debmsg>=2 )
+            std::cout<<"       qrperp="<<qr_perp<<" => prefac="<<prefac<<"\n";
+#endif
+        return prefac * edge_sum_ff( q, qpa, sym_Ci ) / ( I*qpa.mag2() );
     }
 }
 
@@ -299,37 +343,16 @@ complex_t PolyhedralFace::ff_2D( const cvector_t qpa ) const
         return m_area;
     } else if ( qpa_red < qpa_limit_series && !sym_S2 ) {
         // summation of power series
-#ifdef POLYHEDRAL_DIAGNOSTIC
-        diagnosis.nExpandedFaces += 1;
-#endif
-        complex_t sum = m_area;
-        complex_t n_fac = I;
-        for( int n=1; n<n_limit_series; ++n ) {
-#ifdef POLYHEDRAL_DIAGNOSTIC
-            diagnosis.maxOrder = std::max( diagnosis.maxOrder, n );
-#endif
-            complex_t term = n_fac * ff_n_core(n, qpa) / qpa.mag2();
-            sum += term;
-            if( !(n&1) && std::abs(term)<=eps*std::abs(sum) )
-                return sum;
-            n_fac *= I;
-        }
-#ifdef POLYHEDRAL_DIAGNOSTIC
-        return sum;
-#else
-        throw std::runtime_error("Bug in formfactor computation: series f(q_pa) not converged");
-#endif
+        return m_area + expansion( 1., 1., qpa, std::abs(m_area) );
     } else {
         // direct evaluation of analytic formula
-        cvector_t prevec = m_normal.cross( qpa );  // complex conjugation will take place in .dot
-        complex_t sum = 0;
-        for( const PolyhedralEdge& e: edges ) {
-            complex_t qE = e.qE(qpa);
-            complex_t qR = e.qR(qpa);
-            complex_t Rfac = sym_S2 ? sin(e.qR(qpa)) : exp(I*qR);
-            sum += prevec.dot(e.E()) * MathFunctions::sinc(qE) * Rfac;
-        }
-        return sum * (sym_S2 ? 4. : 2./I ) / qpa.mag2();
+        complex_t ff = edge_sum_ff( qpa, qpa, false );
+        complex_t ret = (sym_S2 ? 4. : 2./I ) * ff / qpa.mag2();
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if( diagnosis.debmsg>=2 )
+            std::cout<<std::setprecision(16)<<"    ret="<<ret<<" ff="<<ff<<"\n";
+#endif
+        return ret;
     }
 }
 
@@ -356,10 +379,10 @@ void FormFactorPolyhedron::setLimits( double _q, int _n ) { q_limit_series=_q; n
 //! Called by child classes to set faces and other internal variables.
 
 void FormFactorPolyhedron::setPolyhedron(
-    const Topology& topology, double z_origin, bool sym_Ci, const std::vector<kvector_t>& vertices )
+    const Topology& topology, double z_origin, const std::vector<kvector_t>& vertices )
 {
     m_z_origin = z_origin;
-    m_sym_Ci = sym_Ci;
+    m_sym_Ci = topology.symmetry_Ci;
 
     double diameter = 0;
     for ( size_t j=0; j<vertices.size(); ++j )
@@ -367,7 +390,7 @@ void FormFactorPolyhedron::setPolyhedron(
             diameter = std::max( diameter, (vertices[j]-vertices[jj]).mag() );
 
     m_faces.clear();
-    for( const TopologyFace& tf: topology ) {
+    for( const TopologyFace& tf: topology.faces ) {
         std::vector<kvector_t> corners; // of one face
         for( int i: tf.vertexIndices )
             corners.push_back( vertices[i] );
@@ -410,14 +433,16 @@ complex_t FormFactorPolyhedron::evaluate_centered( const cvector_t q ) const
 {
     double q_red = m_radius * q.mag();
 #ifdef POLYHEDRAL_DIAGNOSTIC
-    diagnosis = { 0, 0 };
+    diagnosis.maxOrder = 0;
+    diagnosis.nExpandedFaces = 0;
 #endif
     if( q_red==0 ) {
         return m_volume;
     } else if ( q_red < q_limit_series ) {
         // summation of power series
-        complex_t sum = m_volume;
+        complex_t sum = 0;
         complex_t n_fac = ( m_sym_Ci ? -2 : -1 ) / q.mag2();
+        int count_return_condition = 0;
         for( int n=2; n<n_limit_series; ++n ) {
             if( m_sym_Ci && n&1 )
                 continue;
@@ -428,17 +453,24 @@ complex_t FormFactorPolyhedron::evaluate_centered( const cvector_t q ) const
             for( const PolyhedralFace& Gk: m_faces )
                 term += Gk.ff_n( n+1, q );
             term *= n_fac;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+            if( diagnosis.debmsg>=1 )
+                std::cout<<std::setprecision(16)<<"  SUM="<<sum<<" +TERM="<<term<<"\n";
+#endif
             sum += term;
-            // std::cout<<std::setprecision(16)<<"  sum="<<sum<<" term="<<term<<"\n";
-            if( !(n&1) && std::abs(term)<eps*std::abs(sum) )
-                return sum;
+            if( std::abs(term)<=eps*std::abs(sum) || std::abs(sum)<eps*m_volume )
+                ++count_return_condition;
+            else
+                count_return_condition = 0;
+            if( count_return_condition>2 )
+                return m_volume + sum; // regular exit
             n_fac *= ( m_sym_Ci ? -1 : I );
         }
 #ifdef POLYHEDRAL_DIAGNOSTIC
-        return sum;
-#else
-        throw std::runtime_error("Bug in formfactor computation: series F(q) not converged");
+        if( !diagnosis.request_convergence )
+            return sum;
 #endif
+        throw std::runtime_error("Bug in formfactor computation: series F(q) not converged");
     } else {
         // direct evaluation of analytic formula (coefficients may involve series)
         complex_t sum = 0;
@@ -446,7 +478,12 @@ complex_t FormFactorPolyhedron::evaluate_centered( const cvector_t q ) const
             complex_t qn = Gk.normalProjectionConj( q ); // conj(q)*normal
             if ( std::abs(qn)<eps*q.mag() )
                 continue;
-            sum += qn * Gk.ff(q, m_sym_Ci );
+            complex_t ff = Gk.ff(q, m_sym_Ci );
+            sum += qn * ff;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+            if( diagnosis.debmsg>=1 )
+                std::cout<<std::scientific<<std::showpos<<std::setprecision(16)<<"  SUM="<<sum<<" TERM="<<qn*ff<<" qn="<<qn.real()<<" ff="<<ff<<"\n";
+#endif
         }
         return sum / (I * q.mag2());
     }
@@ -463,7 +500,7 @@ void FormFactorPolyhedron::assert_platonic() const
     pyramidal_volume /= m_faces.size();
     for( const auto& Gk: m_faces )
         if (std::abs(Gk.pyramidalVolume()-pyramidal_volume) > 160*eps*pyramidal_volume) {
-            std::cout<<std::setprecision(16)<<"BUG: pyr_volume(this face)="<<
+            std::cerr<<std::setprecision(16)<<"BUG: pyr_volume(this face)="<<
                 Gk.pyramidalVolume()<<" vs pyr_volume(avge)="<<pyramidal_volume<<"\n";
             throw std::runtime_error("Deviant pyramidal volume");
         }
@@ -488,7 +525,8 @@ double FormFactorPolygonalPrism::getVolume() const { return m_height * m_base->a
 complex_t FormFactorPolygonalPrism::evaluate_for_q( const cvector_t q ) const
 {
 #ifdef POLYHEDRAL_DIAGNOSTIC
-    diagnosis = { 0, 0 };
+    diagnosis.maxOrder = 0;
+    diagnosis.nExpandedFaces = 0;
 #endif
     const cvector_t qxy( q.x(), q.y(), 0. );
     return m_height * exp(I*(m_height/2)*q.z()) * MathFunctions::sinc(m_height/2*q.z()) *
@@ -503,7 +541,8 @@ complex_t FormFactorPolygonalPrism::evaluate_for_q( const cvector_t q ) const
 complex_t FormFactorPolygonalSurface::evaluate_for_q( const cvector_t q ) const
 {
 #ifdef POLYHEDRAL_DIAGNOSTIC
-    diagnosis = { 0, 0 };
+    diagnosis.maxOrder = 0;
+    diagnosis.nExpandedFaces = 0;
 #endif
     return m_base->ff( q, false );
 }
diff --git a/Core/FormFactors/FormFactorPolyhedron.h b/Core/FormFactors/FormFactorPolyhedron.h
index 9cae7cbf56cb22b1fdcacb2376a9a0bb671ae309..a848cffb9200dc462cf94457b9398d2c52dfe0df 100644
--- a/Core/FormFactors/FormFactorPolyhedron.h
+++ b/Core/FormFactors/FormFactorPolyhedron.h
@@ -61,7 +61,7 @@ public:
     double pyramidalVolume() const { return m_rperp*m_area/3; }
     double radius3d() const { return m_radius_3d; }
     //! Returns conj(q)*normal [BasicVector3D::dot is antilinear in 'this' argument]
-    complex_t normalProjectionConj( cvector_t q ) const { return q.dot(m_normal); } 
+    complex_t normalProjectionConj( cvector_t q ) const { return q.dot(m_normal); }
     complex_t ff_n( int m, const cvector_t q ) const;
     complex_t ff( const cvector_t q, const bool sym_Ci ) const;
     complex_t ff_2D( const cvector_t qpa ) const;
@@ -82,6 +82,9 @@ private:
 
     void decompose_q( const cvector_t q, complex_t& qperp, cvector_t& qpa ) const;
     complex_t ff_n_core( int m, const cvector_t qpa ) const;
+    complex_t edge_sum_ff( cvector_t q, cvector_t qpa, bool sym_Ci ) const;
+    complex_t expansion(
+        complex_t fac_even, complex_t fac_odd, cvector_t qpa, double abslevel ) const;
 };
 
 
@@ -98,10 +101,15 @@ public:
         std::vector<int> vertexIndices;
         bool symmetry_S2;
     };
-    typedef std::vector<TopologyFace> Topology;
+    class Topology {
+    public:
+        std::vector<TopologyFace> faces;
+        bool symmetry_Ci;
+    };
 
     FormFactorPolyhedron() {}
 
+    virtual void onChange() = 0;
     virtual complex_t evaluate_for_q(const cvector_t q ) const final;
     complex_t evaluate_centered( const cvector_t q ) const;
 
@@ -113,7 +121,7 @@ protected:
     double m_z_origin;
     bool m_sym_Ci; //!< if true, then faces obtainable by inversion are not provided
 
-    void setPolyhedron( const Topology& topology, double z_origin, bool sym_Ci,
+    void setPolyhedron( const Topology& topology, double z_origin,
                         const std::vector<kvector_t>& vertices );
 
 private:
diff --git a/Core/FormFactors/FormFactorPyramid.cpp b/Core/FormFactors/FormFactorPyramid.cpp
index 2d1fbb628363ffe624009941697a7efb8d23929b..845f6d369348f33741d80164a89af4089f092585 100644
--- a/Core/FormFactors/FormFactorPyramid.cpp
+++ b/Core/FormFactors/FormFactorPyramid.cpp
@@ -18,13 +18,14 @@
 #include "MathFunctions.h"
 
 const FormFactorPolyhedron::Topology FormFactorPyramid::topology = {
-    { { 3, 2, 1, 0 }, true  }, // TODO -> true
-    { { 0, 1, 5, 4 }, false },
-    { { 1, 2, 6, 5 }, false },
-    { { 2, 3, 7, 6 }, false },
-    { { 3, 0, 4, 7 }, false },
-    { { 4, 5, 6, 7 }, true  }  // TODO -> true
-};
+    {
+        { { 3, 2, 1, 0 }, true  }, // TODO -> true
+        { { 0, 1, 5, 4 }, false },
+        { { 1, 2, 6, 5 }, false },
+        { { 2, 3, 7, 6 }, false },
+        { { 3, 0, 4, 7 }, false },
+        { { 4, 5, 6, 7 }, true  }  // TODO -> true
+    }, false };
 
 //! @brief Pyramid constructor
 //! @param base_edge of one side of Pyramid's square base
@@ -65,7 +66,7 @@ void FormFactorPyramid::onChange()
 
     double zcom = m_height * ( .5 - 2*r/3 + r*r/4 ) / ( 1 - r + r*r/3 ); // center of mass
 
-    setPolyhedron( topology, -zcom, false, {
+    setPolyhedron( topology, -zcom, {
             // base:
             { -a, -a, -zcom },
             {  a, -a, -zcom },
diff --git a/Core/FormFactors/FormFactorTetrahedron.cpp b/Core/FormFactors/FormFactorTetrahedron.cpp
index 50d9526596adae04bd0e40adaa7ef3244da2d599..37d8be26fb3bb730240054b0c8a1045293ed80be 100644
--- a/Core/FormFactors/FormFactorTetrahedron.cpp
+++ b/Core/FormFactors/FormFactorTetrahedron.cpp
@@ -19,12 +19,13 @@
 #include "IntegratorComplex.h"
 
 const FormFactorPolyhedron::Topology FormFactorTetrahedron::topology = {
-    { { 2, 1, 0 }, false },
-    { { 0, 1, 4, 3 }, false },
-    { { 1, 2, 5, 4 }, false },
-    { { 2, 0, 3, 5 }, false },
-    { { 3, 4, 5 }, false }
-};
+    {
+        { { 2, 1, 0 }, false },
+        { { 0, 1, 4, 3 }, false },
+        { { 1, 2, 5, 4 }, false },
+        { { 2, 0, 3, 5 }, false },
+        { { 3, 4, 5 }, false }
+    }, false };
 
 
 //! @brief Tetrahedron constructor
@@ -72,7 +73,7 @@ void FormFactorTetrahedron::onChange()
 
     double zcom = m_height * ( .5 - 2*r/3 + r*r/4 ) / ( 1 - r + r*r/3 ); // center of mass
 
-    setPolyhedron( topology, -zcom, false, {
+    setPolyhedron( topology, -zcom, {
             // base:
             { -ac,  as, -zcom },
             { -ac, -as, -zcom },
diff --git a/Core/FormFactors/FormFactorTruncatedCube.cpp b/Core/FormFactors/FormFactorTruncatedCube.cpp
index 1cdc576870bd317b703263bf935d9e6739405463..ac5df0fbdc21eb3688013facc492c51bf77707a5 100644
--- a/Core/FormFactors/FormFactorTruncatedCube.cpp
+++ b/Core/FormFactors/FormFactorTruncatedCube.cpp
@@ -19,21 +19,22 @@
 #include "MathFunctions.h"
 
 const FormFactorPolyhedron::Topology FormFactorTruncatedCube::topology = {
-    { {  0, 1, 7, 6,  9,10, 4, 3 }, true },
-    { {  0, 2, 1 }, false },
-    { {  3, 4, 5 }, false },
-    { {  9,11,10 }, false },
-    { {  6, 7, 8 }, false },
-    { {  0, 3, 5,17, 15,12,14, 2 }, true },
-    { {  4,10,11,23, 22,16,17, 5 }, true },
-    { {  1, 2,14,13, 19,20, 8, 7 }, true },
-    { {  6, 8,20,18, 21,23,11, 9 }, true },
-    { { 15,17,16 }, false },
-    { { 12,13,14 }, false },
-    { { 18,20,19 }, false },
-    { { 21,22,23 }, false },
-    { { 12,15,16,22, 21,18,19,13 }, true }
-};
+    {
+        { {  0, 1, 7, 6,  9,10, 4, 3 }, true },
+        { {  0, 2, 1 }, false },
+        { {  3, 4, 5 }, false },
+        { {  9,11,10 }, false },
+        { {  6, 7, 8 }, false },
+        { {  0, 3, 5,17, 15,12,14, 2 }, true },
+        { {  4,10,11,23, 22,16,17, 5 }, true },
+        { {  1, 2,14,13, 19,20, 8, 7 }, true },
+        { {  6, 8,20,18, 21,23,11, 9 }, true },
+        { { 15,17,16 }, false },
+        { { 12,13,14 }, false },
+        { { 18,20,19 }, false },
+        { { 21,22,23 }, false },
+        { { 12,15,16,22, 21,18,19,13 }, true }
+    }, true };
 
 //! @param side length of the full cube
 //! @param side length of the trirectangular tetrahedron removed from each vertex of the cube
@@ -64,7 +65,7 @@ void FormFactorTruncatedCube::onChange()
     double a = m_length/2;
     double b = m_removed_length;
 
-    setPolyhedron( topology, -a, true, {
+    setPolyhedron( topology, -a, {
         { -a+b, -a  , -a   },
         { -a  , -a+b, -a   },
         { -a  , -a  , -a+b },
diff --git a/Core/FormFactors/IFormFactorBorn.h b/Core/FormFactors/IFormFactorBorn.h
index 8442ceda58072ab7982febe65d487ed8d144f281..5d97f5296d99018e6b94db1807e0d09daf2bc829 100644
--- a/Core/FormFactors/IFormFactorBorn.h
+++ b/Core/FormFactors/IFormFactorBorn.h
@@ -54,6 +54,8 @@ class Diagnosis {
 public:
     int maxOrder;
     int nExpandedFaces;
+    int debmsg;
+    bool request_convergence;
     bool operator!=( const Diagnosis& other ) const {
         return maxOrder!=other.maxOrder || nExpandedFaces!=other.nExpandedFaces; }
     friend std::ostream& operator<< (std::ostream& stream, const Diagnosis& diag) {
diff --git a/Core/PythonAPI/libBornAgainCore.py b/Core/PythonAPI/libBornAgainCore.py
index 91d0f5e6d7068a4ddc20c4305594075ca5bc6b2a..f366ddfb6fe865ea801807c26de9b680e8a37bf0 100644
--- a/Core/PythonAPI/libBornAgainCore.py
+++ b/Core/PythonAPI/libBornAgainCore.py
@@ -8257,6 +8257,11 @@ class PolyhedralFace(_object):
         return _libBornAgainCore.PolyhedralFace_radius3d(self)
 
 
+    def normalProjectionConj(self, q):
+        """normalProjectionConj(PolyhedralFace self, cvector_t q) -> complex_t"""
+        return _libBornAgainCore.PolyhedralFace_normalProjectionConj(self, q)
+
+
     def ff_n(self, m, q):
         """
         ff_n(PolyhedralFace self, int m, cvector_t q) -> complex_t
@@ -8464,6 +8469,67 @@ class FormFactorPolygonalPrism(IFormFactorBorn):
 FormFactorPolygonalPrism_swigregister = _libBornAgainCore.FormFactorPolygonalPrism_swigregister
 FormFactorPolygonalPrism_swigregister(FormFactorPolygonalPrism)
 
+class FormFactorPolygonalSurface(IFormFactorBorn):
+    """Proxy of C++ FormFactorPolygonalSurface class"""
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorPolygonalSurface, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorPolygonalSurface, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorPolygonalSurface self, cvector_t q) -> complex_t
+
+        virtual complex_t IFormFactorBorn::evaluate_for_q(const cvector_t q) const =0
+
+        evaluate scattering amplitude for complex wavevector
+
+        Parameters:
+        -----------
+
+        q: 
+        wavevector transfer q=k_i-k_f 
+
+        """
+        return _libBornAgainCore.FormFactorPolygonalSurface_evaluate_for_q(self, q)
+
+
+    def getVolume(self):
+        """
+        getVolume(FormFactorPolygonalSurface self) -> double
+
+        double IFormFactor::getVolume() const
+
+        Returns the total volume of the particle of this form factor's shape. 
+
+        """
+        return _libBornAgainCore.FormFactorPolygonalSurface_getVolume(self)
+
+
+    def getRadius(self):
+        """
+        getRadius(FormFactorPolygonalSurface self) -> double
+
+        virtual double IFormFactor::getRadius() const =0
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorPolygonalSurface_getRadius(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorPolygonalSurface
+    __del__ = lambda self: None
+FormFactorPolygonalSurface_swigregister = _libBornAgainCore.FormFactorPolygonalSurface_swigregister
+FormFactorPolygonalSurface_swigregister(FormFactorPolygonalSurface)
+
 class FormFactorAnisoPyramid(FormFactorPolyhedron):
     """
 
diff --git a/Core/PythonAPI/libBornAgainCore_wrap.cxx b/Core/PythonAPI/libBornAgainCore_wrap.cxx
index 313c57c9b8bf87db9d87cbcce57f7e7d5df9a6dc..9e54a41f47ed8c8ca75d6571415977c6de8854e3 100644
--- a/Core/PythonAPI/libBornAgainCore_wrap.cxx
+++ b/Core/PythonAPI/libBornAgainCore_wrap.cxx
@@ -3481,191 +3481,192 @@ namespace Swig {
 #define SWIGTYPE_p_FormFactorLongRipple2Lorentz swig_types[63]
 #define SWIGTYPE_p_FormFactorLorentz swig_types[64]
 #define SWIGTYPE_p_FormFactorPolygonalPrism swig_types[65]
-#define SWIGTYPE_p_FormFactorPolyhedron swig_types[66]
-#define SWIGTYPE_p_FormFactorPrism3 swig_types[67]
-#define SWIGTYPE_p_FormFactorPrism6 swig_types[68]
-#define SWIGTYPE_p_FormFactorPyramid swig_types[69]
-#define SWIGTYPE_p_FormFactorRipple1 swig_types[70]
-#define SWIGTYPE_p_FormFactorRipple2 swig_types[71]
-#define SWIGTYPE_p_FormFactorSphereGaussianRadius swig_types[72]
-#define SWIGTYPE_p_FormFactorSphereLogNormalRadius swig_types[73]
-#define SWIGTYPE_p_FormFactorSphereUniformRadius swig_types[74]
-#define SWIGTYPE_p_FormFactorTetrahedron swig_types[75]
-#define SWIGTYPE_p_FormFactorTrivial swig_types[76]
-#define SWIGTYPE_p_FormFactorTruncatedCube swig_types[77]
-#define SWIGTYPE_p_FormFactorTruncatedSphere swig_types[78]
-#define SWIGTYPE_p_FormFactorTruncatedSpheroid swig_types[79]
-#define SWIGTYPE_p_FormFactorWeighted swig_types[80]
-#define SWIGTYPE_p_GISASSimulation swig_types[81]
-#define SWIGTYPE_p_Geometry__BasicVector3DT_double_t swig_types[82]
-#define SWIGTYPE_p_Geometry__BasicVector3DT_int_t swig_types[83]
-#define SWIGTYPE_p_Geometry__BasicVector3DT_std__complexT_double_t_t swig_types[84]
-#define SWIGTYPE_p_Geometry__Ellipse swig_types[85]
-#define SWIGTYPE_p_Geometry__HorizontalLine swig_types[86]
-#define SWIGTYPE_p_Geometry__IShape2D swig_types[87]
-#define SWIGTYPE_p_Geometry__Line swig_types[88]
-#define SWIGTYPE_p_Geometry__Polygon swig_types[89]
-#define SWIGTYPE_p_Geometry__Rectangle swig_types[90]
-#define SWIGTYPE_p_Geometry__Transform3D swig_types[91]
-#define SWIGTYPE_p_Geometry__VerticalLine swig_types[92]
-#define SWIGTYPE_p_Histogram1D swig_types[93]
-#define SWIGTYPE_p_Histogram2D swig_types[94]
-#define SWIGTYPE_p_HomogeneousMagneticMaterial swig_types[95]
-#define SWIGTYPE_p_HomogeneousMaterial swig_types[96]
-#define SWIGTYPE_p_IAbstractParticle swig_types[97]
-#define SWIGTYPE_p_IAxis swig_types[98]
-#define SWIGTYPE_p_ICloneable swig_types[99]
-#define SWIGTYPE_p_IClusteredParticles swig_types[100]
-#define SWIGTYPE_p_IComponentService swig_types[101]
-#define SWIGTYPE_p_ICompositeSample swig_types[102]
-#define SWIGTYPE_p_IDetector2D swig_types[103]
-#define SWIGTYPE_p_IDetectorResolution swig_types[104]
-#define SWIGTYPE_p_IDistribution1D swig_types[105]
-#define SWIGTYPE_p_IFTDecayFunction1D swig_types[106]
-#define SWIGTYPE_p_IFTDecayFunction2D swig_types[107]
-#define SWIGTYPE_p_IFTDistribution1D swig_types[108]
-#define SWIGTYPE_p_IFTDistribution2D swig_types[109]
-#define SWIGTYPE_p_IFormFactor swig_types[110]
-#define SWIGTYPE_p_IFormFactorBorn swig_types[111]
-#define SWIGTYPE_p_IFormFactorDecorator swig_types[112]
-#define SWIGTYPE_p_IHistogram swig_types[113]
-#define SWIGTYPE_p_IIntensityFunction swig_types[114]
-#define SWIGTYPE_p_IInterferenceFunction swig_types[115]
-#define SWIGTYPE_p_ILayerRTCoefficients swig_types[116]
-#define SWIGTYPE_p_ILayout swig_types[117]
-#define SWIGTYPE_p_IMaterial swig_types[118]
-#define SWIGTYPE_p_INamed swig_types[119]
-#define SWIGTYPE_p_IObservable swig_types[120]
-#define SWIGTYPE_p_IObserver swig_types[121]
-#define SWIGTYPE_p_IParameterized swig_types[122]
-#define SWIGTYPE_p_IParticle swig_types[123]
-#define SWIGTYPE_p_IPixelMap swig_types[124]
-#define SWIGTYPE_p_IResolutionFunction2D swig_types[125]
-#define SWIGTYPE_p_IRotation swig_types[126]
-#define SWIGTYPE_p_IRoughness swig_types[127]
-#define SWIGTYPE_p_ISample swig_types[128]
-#define SWIGTYPE_p_ISampleBuilder swig_types[129]
-#define SWIGTYPE_p_ISampleVisitor swig_types[130]
-#define SWIGTYPE_p_ISelectionRule swig_types[131]
-#define SWIGTYPE_p_Instrument swig_types[132]
-#define SWIGTYPE_p_IntensityDataFunctions swig_types[133]
-#define SWIGTYPE_p_IntensityDataIOFactory swig_types[134]
-#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[135]
-#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[136]
-#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[137]
-#define SWIGTYPE_p_InterferenceFunctionNone swig_types[138]
-#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[139]
-#define SWIGTYPE_p_IsGISAXSDetector swig_types[140]
-#define SWIGTYPE_p_KVectorContainer swig_types[141]
-#define SWIGTYPE_p_Lattice swig_types[142]
-#define SWIGTYPE_p_Lattice1DParameters swig_types[143]
-#define SWIGTYPE_p_Lattice2DParameters swig_types[144]
-#define SWIGTYPE_p_Layer swig_types[145]
-#define SWIGTYPE_p_LayerDWBASimulation swig_types[146]
-#define SWIGTYPE_p_LayerInterface swig_types[147]
-#define SWIGTYPE_p_LayerRTCoefficients_t swig_types[148]
-#define SWIGTYPE_p_LayerRoughness swig_types[149]
-#define SWIGTYPE_p_MSG__Logger swig_types[150]
-#define SWIGTYPE_p_Mask swig_types[151]
-#define SWIGTYPE_p_MesoCrystal swig_types[152]
-#define SWIGTYPE_p_MultiLayer swig_types[153]
-#define SWIGTYPE_p_MultiLayerDWBASimulation swig_types[154]
-#define SWIGTYPE_p_MultiLayerRTCoefficients_t swig_types[155]
-#define SWIGTYPE_p_OffSpecSimulation swig_types[156]
-#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[157]
-#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[158]
-#define SWIGTYPE_p_OutputDataT_double_t swig_types[159]
-#define SWIGTYPE_p_OutputDataT_std__complexT_double_t_t swig_types[160]
-#define SWIGTYPE_p_ParameterDistribution swig_types[161]
-#define SWIGTYPE_p_ParameterPattern swig_types[162]
-#define SWIGTYPE_p_ParameterPool swig_types[163]
-#define SWIGTYPE_p_Particle swig_types[164]
-#define SWIGTYPE_p_ParticleComposition swig_types[165]
-#define SWIGTYPE_p_ParticleCoreShell swig_types[166]
-#define SWIGTYPE_p_ParticleDistribution swig_types[167]
-#define SWIGTYPE_p_ParticleLayout swig_types[168]
-#define SWIGTYPE_p_PolyhedralEdge swig_types[169]
-#define SWIGTYPE_p_PolyhedralFace swig_types[170]
-#define SWIGTYPE_p_RealParameterWrapper swig_types[171]
-#define SWIGTYPE_p_RectPixelMap swig_types[172]
-#define SWIGTYPE_p_RectangularDetector swig_types[173]
-#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[174]
-#define SWIGTYPE_p_RotationEuler swig_types[175]
-#define SWIGTYPE_p_RotationX swig_types[176]
-#define SWIGTYPE_p_RotationY swig_types[177]
-#define SWIGTYPE_p_RotationZ swig_types[178]
-#define SWIGTYPE_p_SafePointerVectorT_IParticle_const_t swig_types[179]
-#define SWIGTYPE_p_SampleBuilderFactory swig_types[180]
-#define SWIGTYPE_p_SimpleSelectionRule swig_types[181]
-#define SWIGTYPE_p_Simulation swig_types[182]
-#define SWIGTYPE_p_SimulationOptions swig_types[183]
-#define SWIGTYPE_p_SimulationRegistry swig_types[184]
-#define SWIGTYPE_p_SpecularSimulation swig_types[185]
-#define SWIGTYPE_p_SphericalDetector swig_types[186]
-#define SWIGTYPE_p_ThreadInfo swig_types[187]
-#define SWIGTYPE_p_Topology swig_types[188]
-#define SWIGTYPE_p_VariableBinAxis swig_types[189]
-#define SWIGTYPE_p_WavevectorInfo swig_types[190]
-#define SWIGTYPE_p__object swig_types[191]
-#define SWIGTYPE_p_allocator_type swig_types[192]
-#define SWIGTYPE_p_char swig_types[193]
-#define SWIGTYPE_p_const_iterator swig_types[194]
-#define SWIGTYPE_p_const_reference swig_types[195]
-#define SWIGTYPE_p_difference_type swig_types[196]
-#define SWIGTYPE_p_double swig_types[197]
-#define SWIGTYPE_p_int swig_types[198]
-#define SWIGTYPE_p_iterator swig_types[199]
-#define SWIGTYPE_p_long_long swig_types[200]
-#define SWIGTYPE_p_observer_t swig_types[201]
-#define SWIGTYPE_p_observerlist_t swig_types[202]
-#define SWIGTYPE_p_p__object swig_types[203]
-#define SWIGTYPE_p_reference swig_types[204]
-#define SWIGTYPE_p_short swig_types[205]
-#define SWIGTYPE_p_signed_char swig_types[206]
-#define SWIGTYPE_p_size_type swig_types[207]
-#define SWIGTYPE_p_std__allocatorT_Geometry__BasicVector3DT_double_t_t swig_types[208]
-#define SWIGTYPE_p_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t swig_types[209]
-#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[210]
-#define SWIGTYPE_p_std__allocatorT_ISample_const_p_t swig_types[211]
-#define SWIGTYPE_p_std__allocatorT_ISample_p_t swig_types[212]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[213]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[214]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[215]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[216]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[217]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[218]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[219]
-#define SWIGTYPE_p_std__invalid_argument swig_types[220]
-#define SWIGTYPE_p_std__ostream swig_types[221]
-#define SWIGTYPE_p_std__shared_ptrT_IFitObserver_t swig_types[222]
-#define SWIGTYPE_p_std__shared_ptrT_ILayerRTCoefficients_const_t swig_types[223]
-#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[224]
-#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[225]
-#define SWIGTYPE_p_std__vectorT_Geometry__BasicVector3DT_double_t_std__allocatorT_Geometry__BasicVector3DT_double_t_t_t swig_types[226]
-#define SWIGTYPE_p_std__vectorT_Geometry__BasicVector3DT_std__complexT_double_t_t_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t_t swig_types[227]
-#define SWIGTYPE_p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t swig_types[228]
-#define SWIGTYPE_p_std__vectorT_IFTDistribution2D_const_p_std__allocatorT_IFTDistribution2D_const_p_t_t swig_types[229]
-#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[230]
-#define SWIGTYPE_p_std__vectorT_IParticle_const_p_std__allocatorT_IParticle_const_p_t_t swig_types[231]
-#define SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t swig_types[232]
-#define SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t swig_types[233]
-#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[234]
-#define SWIGTYPE_p_std__vectorT_RealParameterWrapper_std__allocatorT_RealParameterWrapper_t_t swig_types[235]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[236]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[237]
-#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[238]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[239]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[240]
-#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[241]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[242]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[243]
-#define SWIGTYPE_p_unsigned_char swig_types[244]
-#define SWIGTYPE_p_unsigned_int swig_types[245]
-#define SWIGTYPE_p_unsigned_long_long swig_types[246]
-#define SWIGTYPE_p_unsigned_short swig_types[247]
-#define SWIGTYPE_p_value_type swig_types[248]
-static swig_type_info *swig_types[250];
-static swig_module_info swig_module = {swig_types, 249, 0, 0, 0, 0};
+#define SWIGTYPE_p_FormFactorPolygonalSurface swig_types[66]
+#define SWIGTYPE_p_FormFactorPolyhedron swig_types[67]
+#define SWIGTYPE_p_FormFactorPrism3 swig_types[68]
+#define SWIGTYPE_p_FormFactorPrism6 swig_types[69]
+#define SWIGTYPE_p_FormFactorPyramid swig_types[70]
+#define SWIGTYPE_p_FormFactorRipple1 swig_types[71]
+#define SWIGTYPE_p_FormFactorRipple2 swig_types[72]
+#define SWIGTYPE_p_FormFactorSphereGaussianRadius swig_types[73]
+#define SWIGTYPE_p_FormFactorSphereLogNormalRadius swig_types[74]
+#define SWIGTYPE_p_FormFactorSphereUniformRadius swig_types[75]
+#define SWIGTYPE_p_FormFactorTetrahedron swig_types[76]
+#define SWIGTYPE_p_FormFactorTrivial swig_types[77]
+#define SWIGTYPE_p_FormFactorTruncatedCube swig_types[78]
+#define SWIGTYPE_p_FormFactorTruncatedSphere swig_types[79]
+#define SWIGTYPE_p_FormFactorTruncatedSpheroid swig_types[80]
+#define SWIGTYPE_p_FormFactorWeighted swig_types[81]
+#define SWIGTYPE_p_GISASSimulation swig_types[82]
+#define SWIGTYPE_p_Geometry__BasicVector3DT_double_t swig_types[83]
+#define SWIGTYPE_p_Geometry__BasicVector3DT_int_t swig_types[84]
+#define SWIGTYPE_p_Geometry__BasicVector3DT_std__complexT_double_t_t swig_types[85]
+#define SWIGTYPE_p_Geometry__Ellipse swig_types[86]
+#define SWIGTYPE_p_Geometry__HorizontalLine swig_types[87]
+#define SWIGTYPE_p_Geometry__IShape2D swig_types[88]
+#define SWIGTYPE_p_Geometry__Line swig_types[89]
+#define SWIGTYPE_p_Geometry__Polygon swig_types[90]
+#define SWIGTYPE_p_Geometry__Rectangle swig_types[91]
+#define SWIGTYPE_p_Geometry__Transform3D swig_types[92]
+#define SWIGTYPE_p_Geometry__VerticalLine swig_types[93]
+#define SWIGTYPE_p_Histogram1D swig_types[94]
+#define SWIGTYPE_p_Histogram2D swig_types[95]
+#define SWIGTYPE_p_HomogeneousMagneticMaterial swig_types[96]
+#define SWIGTYPE_p_HomogeneousMaterial swig_types[97]
+#define SWIGTYPE_p_IAbstractParticle swig_types[98]
+#define SWIGTYPE_p_IAxis swig_types[99]
+#define SWIGTYPE_p_ICloneable swig_types[100]
+#define SWIGTYPE_p_IClusteredParticles swig_types[101]
+#define SWIGTYPE_p_IComponentService swig_types[102]
+#define SWIGTYPE_p_ICompositeSample swig_types[103]
+#define SWIGTYPE_p_IDetector2D swig_types[104]
+#define SWIGTYPE_p_IDetectorResolution swig_types[105]
+#define SWIGTYPE_p_IDistribution1D swig_types[106]
+#define SWIGTYPE_p_IFTDecayFunction1D swig_types[107]
+#define SWIGTYPE_p_IFTDecayFunction2D swig_types[108]
+#define SWIGTYPE_p_IFTDistribution1D swig_types[109]
+#define SWIGTYPE_p_IFTDistribution2D swig_types[110]
+#define SWIGTYPE_p_IFormFactor swig_types[111]
+#define SWIGTYPE_p_IFormFactorBorn swig_types[112]
+#define SWIGTYPE_p_IFormFactorDecorator swig_types[113]
+#define SWIGTYPE_p_IHistogram swig_types[114]
+#define SWIGTYPE_p_IIntensityFunction swig_types[115]
+#define SWIGTYPE_p_IInterferenceFunction swig_types[116]
+#define SWIGTYPE_p_ILayerRTCoefficients swig_types[117]
+#define SWIGTYPE_p_ILayout swig_types[118]
+#define SWIGTYPE_p_IMaterial swig_types[119]
+#define SWIGTYPE_p_INamed swig_types[120]
+#define SWIGTYPE_p_IObservable swig_types[121]
+#define SWIGTYPE_p_IObserver swig_types[122]
+#define SWIGTYPE_p_IParameterized swig_types[123]
+#define SWIGTYPE_p_IParticle swig_types[124]
+#define SWIGTYPE_p_IPixelMap swig_types[125]
+#define SWIGTYPE_p_IResolutionFunction2D swig_types[126]
+#define SWIGTYPE_p_IRotation swig_types[127]
+#define SWIGTYPE_p_IRoughness swig_types[128]
+#define SWIGTYPE_p_ISample swig_types[129]
+#define SWIGTYPE_p_ISampleBuilder swig_types[130]
+#define SWIGTYPE_p_ISampleVisitor swig_types[131]
+#define SWIGTYPE_p_ISelectionRule swig_types[132]
+#define SWIGTYPE_p_Instrument swig_types[133]
+#define SWIGTYPE_p_IntensityDataFunctions swig_types[134]
+#define SWIGTYPE_p_IntensityDataIOFactory swig_types[135]
+#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[136]
+#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[137]
+#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[138]
+#define SWIGTYPE_p_InterferenceFunctionNone swig_types[139]
+#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[140]
+#define SWIGTYPE_p_IsGISAXSDetector swig_types[141]
+#define SWIGTYPE_p_KVectorContainer swig_types[142]
+#define SWIGTYPE_p_Lattice swig_types[143]
+#define SWIGTYPE_p_Lattice1DParameters swig_types[144]
+#define SWIGTYPE_p_Lattice2DParameters swig_types[145]
+#define SWIGTYPE_p_Layer swig_types[146]
+#define SWIGTYPE_p_LayerDWBASimulation swig_types[147]
+#define SWIGTYPE_p_LayerInterface swig_types[148]
+#define SWIGTYPE_p_LayerRTCoefficients_t swig_types[149]
+#define SWIGTYPE_p_LayerRoughness swig_types[150]
+#define SWIGTYPE_p_MSG__Logger swig_types[151]
+#define SWIGTYPE_p_Mask swig_types[152]
+#define SWIGTYPE_p_MesoCrystal swig_types[153]
+#define SWIGTYPE_p_MultiLayer swig_types[154]
+#define SWIGTYPE_p_MultiLayerDWBASimulation swig_types[155]
+#define SWIGTYPE_p_MultiLayerRTCoefficients_t swig_types[156]
+#define SWIGTYPE_p_OffSpecSimulation swig_types[157]
+#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[158]
+#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[159]
+#define SWIGTYPE_p_OutputDataT_double_t swig_types[160]
+#define SWIGTYPE_p_OutputDataT_std__complexT_double_t_t swig_types[161]
+#define SWIGTYPE_p_ParameterDistribution swig_types[162]
+#define SWIGTYPE_p_ParameterPattern swig_types[163]
+#define SWIGTYPE_p_ParameterPool swig_types[164]
+#define SWIGTYPE_p_Particle swig_types[165]
+#define SWIGTYPE_p_ParticleComposition swig_types[166]
+#define SWIGTYPE_p_ParticleCoreShell swig_types[167]
+#define SWIGTYPE_p_ParticleDistribution swig_types[168]
+#define SWIGTYPE_p_ParticleLayout swig_types[169]
+#define SWIGTYPE_p_PolyhedralEdge swig_types[170]
+#define SWIGTYPE_p_PolyhedralFace swig_types[171]
+#define SWIGTYPE_p_RealParameterWrapper swig_types[172]
+#define SWIGTYPE_p_RectPixelMap swig_types[173]
+#define SWIGTYPE_p_RectangularDetector swig_types[174]
+#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[175]
+#define SWIGTYPE_p_RotationEuler swig_types[176]
+#define SWIGTYPE_p_RotationX swig_types[177]
+#define SWIGTYPE_p_RotationY swig_types[178]
+#define SWIGTYPE_p_RotationZ swig_types[179]
+#define SWIGTYPE_p_SafePointerVectorT_IParticle_const_t swig_types[180]
+#define SWIGTYPE_p_SampleBuilderFactory swig_types[181]
+#define SWIGTYPE_p_SimpleSelectionRule swig_types[182]
+#define SWIGTYPE_p_Simulation swig_types[183]
+#define SWIGTYPE_p_SimulationOptions swig_types[184]
+#define SWIGTYPE_p_SimulationRegistry swig_types[185]
+#define SWIGTYPE_p_SpecularSimulation swig_types[186]
+#define SWIGTYPE_p_SphericalDetector swig_types[187]
+#define SWIGTYPE_p_ThreadInfo swig_types[188]
+#define SWIGTYPE_p_Topology swig_types[189]
+#define SWIGTYPE_p_VariableBinAxis swig_types[190]
+#define SWIGTYPE_p_WavevectorInfo swig_types[191]
+#define SWIGTYPE_p__object swig_types[192]
+#define SWIGTYPE_p_allocator_type swig_types[193]
+#define SWIGTYPE_p_char swig_types[194]
+#define SWIGTYPE_p_const_iterator swig_types[195]
+#define SWIGTYPE_p_const_reference swig_types[196]
+#define SWIGTYPE_p_difference_type swig_types[197]
+#define SWIGTYPE_p_double swig_types[198]
+#define SWIGTYPE_p_int swig_types[199]
+#define SWIGTYPE_p_iterator swig_types[200]
+#define SWIGTYPE_p_long_long swig_types[201]
+#define SWIGTYPE_p_observer_t swig_types[202]
+#define SWIGTYPE_p_observerlist_t swig_types[203]
+#define SWIGTYPE_p_p__object swig_types[204]
+#define SWIGTYPE_p_reference swig_types[205]
+#define SWIGTYPE_p_short swig_types[206]
+#define SWIGTYPE_p_signed_char swig_types[207]
+#define SWIGTYPE_p_size_type swig_types[208]
+#define SWIGTYPE_p_std__allocatorT_Geometry__BasicVector3DT_double_t_t swig_types[209]
+#define SWIGTYPE_p_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t swig_types[210]
+#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[211]
+#define SWIGTYPE_p_std__allocatorT_ISample_const_p_t swig_types[212]
+#define SWIGTYPE_p_std__allocatorT_ISample_p_t swig_types[213]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[214]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[215]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[216]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[217]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[218]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[219]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[220]
+#define SWIGTYPE_p_std__invalid_argument swig_types[221]
+#define SWIGTYPE_p_std__ostream swig_types[222]
+#define SWIGTYPE_p_std__shared_ptrT_IFitObserver_t swig_types[223]
+#define SWIGTYPE_p_std__shared_ptrT_ILayerRTCoefficients_const_t swig_types[224]
+#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[225]
+#define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[226]
+#define SWIGTYPE_p_std__vectorT_Geometry__BasicVector3DT_double_t_std__allocatorT_Geometry__BasicVector3DT_double_t_t_t swig_types[227]
+#define SWIGTYPE_p_std__vectorT_Geometry__BasicVector3DT_std__complexT_double_t_t_std__allocatorT_Geometry__BasicVector3DT_std__complexT_double_t_t_t_t swig_types[228]
+#define SWIGTYPE_p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t swig_types[229]
+#define SWIGTYPE_p_std__vectorT_IFTDistribution2D_const_p_std__allocatorT_IFTDistribution2D_const_p_t_t swig_types[230]
+#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[231]
+#define SWIGTYPE_p_std__vectorT_IParticle_const_p_std__allocatorT_IParticle_const_p_t_t swig_types[232]
+#define SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t swig_types[233]
+#define SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t swig_types[234]
+#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[235]
+#define SWIGTYPE_p_std__vectorT_RealParameterWrapper_std__allocatorT_RealParameterWrapper_t_t swig_types[236]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[237]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[238]
+#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[239]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[240]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[241]
+#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[242]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[243]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[244]
+#define SWIGTYPE_p_unsigned_char swig_types[245]
+#define SWIGTYPE_p_unsigned_int swig_types[246]
+#define SWIGTYPE_p_unsigned_long_long swig_types[247]
+#define SWIGTYPE_p_unsigned_short swig_types[248]
+#define SWIGTYPE_p_value_type swig_types[249]
+static swig_type_info *swig_types[251];
+static swig_module_info swig_module = {swig_types, 250, 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)
 
@@ -50009,6 +50010,45 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_PolyhedralFace_normalProjectionConj(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:PolyhedralFace_normalProjectionConj",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_normalProjectionConj" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Geometry__BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralFace_normalProjectionConj" "', argument " "2"" of type '" "cvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_normalProjectionConj" "', argument " "2"" of type '" "cvector_t""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((PolyhedralFace const *)arg1)->normalProjectionConj(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_PolyhedralFace_ff_n(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
@@ -50509,6 +50549,117 @@ SWIGINTERN PyObject *FormFactorPolygonalPrism_swigregister(PyObject *SWIGUNUSEDP
   return SWIG_Py_Void();
 }
 
+SWIGINTERN PyObject *_wrap_FormFactorPolygonalSurface_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalSurface *arg1 = (FormFactorPolygonalSurface *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorPolygonalSurface_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalSurface, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalSurface_evaluate_for_q" "', argument " "1"" of type '" "FormFactorPolygonalSurface const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalSurface * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Geometry__BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolygonalSurface_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolygonalSurface_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorPolygonalSurface const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPolygonalSurface_getVolume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalSurface *arg1 = (FormFactorPolygonalSurface *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPolygonalSurface_getVolume",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalSurface, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalSurface_getVolume" "', argument " "1"" of type '" "FormFactorPolygonalSurface const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalSurface * >(argp1);
+  result = (double)((FormFactorPolygonalSurface const *)arg1)->getVolume();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPolygonalSurface_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalSurface *arg1 = (FormFactorPolygonalSurface *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPolygonalSurface_getRadius",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalSurface, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalSurface_getRadius" "', argument " "1"" of type '" "FormFactorPolygonalSurface const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalSurface * >(argp1);
+  result = (double)((FormFactorPolygonalSurface const *)arg1)->getRadius();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorPolygonalSurface(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalSurface *arg1 = (FormFactorPolygonalSurface *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorPolygonalSurface",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalSurface, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorPolygonalSurface" "', argument " "1"" of type '" "FormFactorPolygonalSurface *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalSurface * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorPolygonalSurface_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorPolygonalSurface, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
 SWIGINTERN PyObject *_wrap_new_FormFactorAnisoPyramid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
@@ -93410,6 +93561,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"PolyhedralFace_center", _wrap_PolyhedralFace_center, METH_VARARGS, (char *)"PolyhedralFace_center(PolyhedralFace self) -> kvector_t"},
 	 { (char *)"PolyhedralFace_pyramidalVolume", _wrap_PolyhedralFace_pyramidalVolume, METH_VARARGS, (char *)"PolyhedralFace_pyramidalVolume(PolyhedralFace self) -> double"},
 	 { (char *)"PolyhedralFace_radius3d", _wrap_PolyhedralFace_radius3d, METH_VARARGS, (char *)"PolyhedralFace_radius3d(PolyhedralFace self) -> double"},
+	 { (char *)"PolyhedralFace_normalProjectionConj", _wrap_PolyhedralFace_normalProjectionConj, METH_VARARGS, (char *)"PolyhedralFace_normalProjectionConj(PolyhedralFace self, cvector_t q) -> complex_t"},
 	 { (char *)"PolyhedralFace_ff_n", _wrap_PolyhedralFace_ff_n, METH_VARARGS, (char *)"\n"
 		"PolyhedralFace_ff_n(PolyhedralFace self, int m, cvector_t q) -> complex_t\n"
 		"\n"
@@ -93511,6 +93663,38 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { (char *)"delete_FormFactorPolygonalPrism", _wrap_delete_FormFactorPolygonalPrism, METH_VARARGS, (char *)"delete_FormFactorPolygonalPrism(FormFactorPolygonalPrism self)"},
 	 { (char *)"FormFactorPolygonalPrism_swigregister", FormFactorPolygonalPrism_swigregister, METH_VARARGS, NULL},
+	 { (char *)"FormFactorPolygonalSurface_evaluate_for_q", _wrap_FormFactorPolygonalSurface_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorPolygonalSurface_evaluate_for_q(FormFactorPolygonalSurface self, cvector_t q) -> complex_t\n"
+		"\n"
+		"virtual complex_t IFormFactorBorn::evaluate_for_q(const cvector_t q) const =0\n"
+		"\n"
+		"evaluate scattering amplitude for complex wavevector\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"q: \n"
+		"wavevector transfer q=k_i-k_f \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPolygonalSurface_getVolume", _wrap_FormFactorPolygonalSurface_getVolume, METH_VARARGS, (char *)"\n"
+		"FormFactorPolygonalSurface_getVolume(FormFactorPolygonalSurface self) -> double\n"
+		"\n"
+		"double IFormFactor::getVolume() const\n"
+		"\n"
+		"Returns the total volume of the particle of this form factor's shape. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPolygonalSurface_getRadius", _wrap_FormFactorPolygonalSurface_getRadius, METH_VARARGS, (char *)"\n"
+		"FormFactorPolygonalSurface_getRadius(FormFactorPolygonalSurface self) -> double\n"
+		"\n"
+		"virtual double IFormFactor::getRadius() const =0\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorPolygonalSurface", _wrap_delete_FormFactorPolygonalSurface, METH_VARARGS, (char *)"delete_FormFactorPolygonalSurface(FormFactorPolygonalSurface self)"},
+	 { (char *)"FormFactorPolygonalSurface_swigregister", FormFactorPolygonalSurface_swigregister, METH_VARARGS, NULL},
 	 { (char *)"new_FormFactorAnisoPyramid", _wrap_new_FormFactorAnisoPyramid, METH_VARARGS, (char *)"\n"
 		"new_FormFactorAnisoPyramid(double length, double width, double height, double alpha) -> FormFactorAnisoPyramid\n"
 		"\n"
@@ -101464,6 +101648,9 @@ static void *_p_FormFactorLongBoxGaussTo_p_IFormFactor(void *x, int *SWIGUNUSEDP
 static void *_p_FormFactorRipple1To_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorRipple1 *) x));
 }
+static void *_p_FormFactorPolygonalSurfaceTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
+}
 static void *_p_FormFactorCrystalTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorCrystal *) x));
 }
@@ -101482,12 +101669,12 @@ static void *_p_FormFactorTruncatedSphereTo_p_IFormFactor(void *x, int *SWIGUNUS
 static void *_p_FormFactorLongRipple1GaussTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorLongRipple1Gauss *) x));
 }
-static void *_p_FormFactorCylinderTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorCylinder *) x));
-}
 static void *_p_FormFactorEllipsoidalCylinderTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorEllipsoidalCylinder *) x));
 }
+static void *_p_FormFactorCylinderTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorCylinder *) x));
+}
 static void *_p_FormFactorBoxTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorBox *) x));
 }
@@ -101545,9 +101732,6 @@ static void *_p_FormFactorLongBoxLorentzTo_p_IFormFactor(void *x, int *SWIGUNUSE
 static void *_p_FormFactorWeightedTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *)  ((FormFactorWeighted *) x));
 }
-static void *_p_FormFactorSphereUniformRadiusTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorSphereUniformRadius *) x));
-}
 static void *_p_FormFactorPyramidTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorPyramid *) x));
 }
@@ -101557,6 +101741,9 @@ static void *_p_FormFactorAnisoPyramidTo_p_IFormFactor(void *x, int *SWIGUNUSEDP
 static void *_p_FormFactorPrism3To_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
 }
+static void *_p_FormFactorSphereUniformRadiusTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorSphereUniformRadius *) x));
+}
 static void *_p_FormFactorLongRipple2GaussTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorLongRipple2Gauss *) x));
 }
@@ -101701,6 +101888,9 @@ static void *_p_ICompositeSampleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM
 static void *_p_ISampleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *)  ((ISample *) x));
 }
+static void *_p_FormFactorPolygonalSurfaceTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
+}
 static void *_p_FormFactorLongBoxGaussTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
 }
@@ -101725,12 +101915,12 @@ static void *_p_FTDistribution1DVoigtTo_p_IParameterized(void *x, int *SWIGUNUSE
 static void *_p_IRotationTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *) ((IRotation *) x));
 }
-static void *_p_FormFactorTruncatedSpheroidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSpheroid *) x));
-}
 static void *_p_FormFactorFullSpheroidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSpheroid *) x));
 }
+static void *_p_FormFactorTruncatedSpheroidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSpheroid *) x));
+}
 static void *_p_RotationXTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (ISample *)(IRotation *) ((RotationX *) x));
 }
@@ -102061,6 +102251,9 @@ static void *_p_ICompositeSampleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(new
 static void *_p_ISampleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((ISample *) x));
 }
+static void *_p_FormFactorPolygonalSurfaceTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
+}
 static void *_p_FormFactorLongBoxGaussTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
 }
@@ -102307,12 +102500,12 @@ static void *_p_FTDistribution2DConeTo_p_INamed(void *x, int *SWIGUNUSEDPARM(new
 static void *_p_ParticleCoreShellTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
 }
-static void *_p_FormFactorTruncatedSphereTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSphere *) x));
-}
 static void *_p_FormFactorFullSphereTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSphere *) x));
 }
+static void *_p_FormFactorTruncatedSphereTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSphere *) x));
+}
 static void *_p_IFormFactorTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *) ((IFormFactor *) x));
 }
@@ -102322,6 +102515,9 @@ static void *_p_ICompositeSampleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemo
 static void *_p_ISampleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *) ((ISample *) x));
 }
+static void *_p_FormFactorPolygonalSurfaceTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
+}
 static void *_p_FormFactorLongBoxGaussTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
 }
@@ -102610,18 +102806,21 @@ static void *_p_FormFactorLongBoxGaussTo_p_IFormFactorBorn(void *x, int *SWIGUNU
 static void *_p_FormFactorRipple1To_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *)  ((FormFactorRipple1 *) x));
 }
+static void *_p_FormFactorPolygonalSurfaceTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorPolygonalSurface *) x));
+}
 static void *_p_FormFactorCrystalTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *)  ((FormFactorCrystal *) x));
 }
 static void *_p_FormFactorRipple2To_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *)  ((FormFactorRipple2 *) x));
 }
-static void *_p_FormFactorTruncatedCubeTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
-}
 static void *_p_FormFactorFullSphereTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *)  ((FormFactorFullSphere *) x));
 }
+static void *_p_FormFactorTruncatedCubeTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+}
 static void *_p_FormFactorTruncatedSphereTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFormFactorBorn *)  ((FormFactorTruncatedSphere *) x));
 }
@@ -102841,8 +103040,8 @@ static void *_p_ParticleCoreShellTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newme
 static void *_p_LayerTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (ICompositeSample *) ((Layer *) x));
 }
-static void *_p_FormFactorRipple1To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple1 *) x));
+static void *_p_FormFactorPolygonalSurfaceTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
 }
 static void *_p_CrystalTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (ICompositeSample *)(IClusteredParticles *) ((Crystal *) x));
@@ -102850,6 +103049,9 @@ static void *_p_CrystalTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
 static void *_p_FormFactorCrystalTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorCrystal *) x));
 }
+static void *_p_FormFactorRipple1To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple1 *) x));
+}
 static void *_p_InterferenceFunctionRadialParaCrystalTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IInterferenceFunction *) ((InterferenceFunctionRadialParaCrystal *) x));
 }
@@ -102910,12 +103112,12 @@ static void *_p_FormFactorIcosahedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(n
 static void *_p_FormFactorDodecahedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
 }
-static void *_p_FormFactorPolyhedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorPolyhedron *) x));
-}
 static void *_p_FormFactorCuboctahedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
 }
+static void *_p_FormFactorPolyhedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorPolyhedron *) x));
+}
 static void *_p_FormFactorTetrahedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
 }
@@ -103138,6 +103340,7 @@ static swig_type_info _swigt__p_FormFactorLongRipple2Gauss = {"_p_FormFactorLong
 static swig_type_info _swigt__p_FormFactorLongRipple2Lorentz = {"_p_FormFactorLongRipple2Lorentz", "FormFactorLongRipple2Lorentz *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FormFactorLorentz = {"_p_FormFactorLorentz", "FormFactorLorentz *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FormFactorPolygonalPrism = {"_p_FormFactorPolygonalPrism", "FormFactorPolygonalPrism *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorPolygonalSurface = {"_p_FormFactorPolygonalSurface", "FormFactorPolygonalSurface *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FormFactorPolyhedron = {"_p_FormFactorPolyhedron", "FormFactorPolyhedron *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FormFactorPrism3 = {"_p_FormFactorPrism3", "FormFactorPrism3 *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FormFactorPrism6 = {"_p_FormFactorPrism6", "FormFactorPrism6 *", 0, 0, (void*)0, 0};
@@ -103389,6 +103592,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_FormFactorLongRipple2Lorentz,
   &_swigt__p_FormFactorLorentz,
   &_swigt__p_FormFactorPolygonalPrism,
+  &_swigt__p_FormFactorPolygonalSurface,
   &_swigt__p_FormFactorPolyhedron,
   &_swigt__p_FormFactorPrism3,
   &_swigt__p_FormFactorPrism6,
@@ -103640,6 +103844,7 @@ static swig_cast_info _swigc__p_FormFactorLongRipple2Gauss[] = {  {&_swigt__p_Fo
 static swig_cast_info _swigc__p_FormFactorLongRipple2Lorentz[] = {  {&_swigt__p_FormFactorLongRipple2Lorentz, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorLorentz[] = {  {&_swigt__p_FormFactorLorentz, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorPolygonalPrism[] = {  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_FormFactorPolygonalPrism, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_FormFactorPolygonalPrism, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorPolygonalSurface[] = {  {&_swigt__p_FormFactorPolygonalSurface, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorPolyhedron[] = {  {&_swigt__p_FormFactorPolyhedron, 0, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_FormFactorPolyhedron, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorPrism3[] = {  {&_swigt__p_FormFactorPrism3, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorPrism6[] = {  {&_swigt__p_FormFactorPrism6, 0, 0, 0},{0, 0, 0, 0}};
@@ -103673,7 +103878,7 @@ static swig_cast_info _swigc__p_HomogeneousMagneticMaterial[] = {  {&_swigt__p_H
 static swig_cast_info _swigc__p_HomogeneousMaterial[] = {  {&_swigt__p_HomogeneousMaterial, 0, 0, 0},  {&_swigt__p_HomogeneousMagneticMaterial, _p_HomogeneousMagneticMaterialTo_p_HomogeneousMaterial, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IAbstractParticle[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_IAbstractParticle, 0, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IAbstractParticle, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IAxis[] = {  {&_swigt__p_IAxis, 0, 0, 0},  {&_swigt__p_VariableBinAxis, _p_VariableBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_ConstKBinAxis, _p_ConstKBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_CustomBinAxis, _p_CustomBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_FixedBinAxis, _p_FixedBinAxisTo_p_IAxis, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Polygon, _p_Geometry__PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Ellipse, _p_Geometry__EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__HorizontalLine, _p_Geometry__HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ICloneable, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_ICloneable, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__IShape2D, _p_Geometry__IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Rectangle, _p_Geometry__RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__VerticalLine, _p_Geometry__VerticalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ICloneable, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Line, _p_Geometry__LineTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ICloneable, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Polygon, _p_Geometry__PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Ellipse, _p_Geometry__EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__HorizontalLine, _p_Geometry__HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ICloneable, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_ICloneable, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__IShape2D, _p_Geometry__IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Rectangle, _p_Geometry__RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__VerticalLine, _p_Geometry__VerticalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ICloneable, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_Geometry__Line, _p_Geometry__LineTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ICloneable, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IClusteredParticles[] = {  {&_swigt__p_IClusteredParticles, 0, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IClusteredParticles, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IComponentService[] = {  {&_swigt__p_IComponentService, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ICompositeSample[] = {  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICompositeSample, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICompositeSample, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICompositeSample, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICompositeSample, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICompositeSample, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ICompositeSample, 0, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICompositeSample, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICompositeSample, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICompositeSample, 0, 0},{0, 0, 0, 0}};
@@ -103684,8 +103889,8 @@ static swig_cast_info _swigc__p_IFTDecayFunction1D[] = {  {&_swigt__p_FTDecayFun
 static swig_cast_info _swigc__p_IFTDecayFunction2D[] = {  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IFTDecayFunction2D, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IFTDecayFunction2D, 0, 0},  {&_swigt__p_IFTDecayFunction2D, 0, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IFTDecayFunction2D, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFTDistribution1D[] = {  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_IFTDistribution1D, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_IFTDistribution1D, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_IFTDistribution1D, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_IFTDistribution1D, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_IFTDistribution1D, 0, 0},  {&_swigt__p_IFTDistribution1D, 0, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IFTDistribution1D, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFTDistribution2D[] = {  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_IFTDistribution2D, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_IFTDistribution2D, 0, 0},  {&_swigt__p_IFTDistribution2D, 0, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_IFTDistribution2D, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IFTDistribution2D, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_IFTDistribution2D, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IFormFactor[] = {  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactor, 0, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_IFormFactor, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IFormFactorBorn[] = {  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_IFormFactorBorn, 0, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_IFormFactorBorn, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFormFactor[] = {  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactor, 0, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_IFormFactor, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFormFactorBorn[] = {  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_IFormFactorBorn, 0, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_IFormFactorBorn, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFormFactorDecorator[] = {  {&_swigt__p_IFormFactorDecorator, 0, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_IFormFactorDecorator, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IHistogram[] = {  {&_swigt__p_IHistogram, 0, 0, 0},  {&_swigt__p_Histogram2D, _p_Histogram2DTo_p_IHistogram, 0, 0},  {&_swigt__p_Histogram1D, _p_Histogram1DTo_p_IHistogram, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IIntensityFunction[] = {  {&_swigt__p_IIntensityFunction, 0, 0, 0},{0, 0, 0, 0}};
@@ -103693,16 +103898,16 @@ static swig_cast_info _swigc__p_IInterferenceFunction[] = {  {&_swigt__p_IInterf
 static swig_cast_info _swigc__p_ILayerRTCoefficients[] = {  {&_swigt__p_ILayerRTCoefficients, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ILayout[] = {  {&_swigt__p_ILayout, 0, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ILayout, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IMaterial[] = {  {&_swigt__p_IMaterial, 0, 0, 0},  {&_swigt__p_HomogeneousMaterial, _p_HomogeneousMaterialTo_p_IMaterial, 0, 0},  {&_swigt__p_HomogeneousMagneticMaterial, _p_HomogeneousMagneticMaterialTo_p_IMaterial, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_INamed[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INamed, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INamed, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_INamed, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_INamed, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_INamed, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INamed, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INamed, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_INamed, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_INamed, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INamed, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INamed, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_INamed, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_INamed, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_INamed, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INamed, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INamed, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_INamed, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INamed, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_INamed, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INamed, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INamed, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INamed, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_INamed, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_INamed, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_INamed, 0, 0},  {&_swigt__p_ISampleBuilder, _p_ISampleBuilderTo_p_INamed, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INamed, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INamed, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_INamed, 0, 0},  {&_swigt__p_INamed, 0, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_INamed, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INamed, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_INamed, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INamed, 0, 0},  {&_swigt__p_HomogeneousMagneticMaterial, _p_HomogeneousMagneticMaterialTo_p_INamed, 0, 0},  {&_swigt__p_HomogeneousMaterial, _p_HomogeneousMaterialTo_p_INamed, 0, 0},  {&_swigt__p_IMaterial, _p_IMaterialTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_INamed, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INamed, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_INamed, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_INamed, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INamed, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_INamed, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INamed, 0, 0},  {&_swigt__p_IParameterized, _p_IParameterizedTo_p_INamed, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_INamed, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INamed, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_INamed, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INamed, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INamed, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_INamed, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INamed, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INamed, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_INamed[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INamed, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INamed, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_INamed, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_INamed, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_INamed, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INamed, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INamed, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_INamed, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_INamed, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INamed, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INamed, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_INamed, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_INamed, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_INamed, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INamed, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INamed, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_INamed, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INamed, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_INamed, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INamed, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INamed, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INamed, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_INamed, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_INamed, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_INamed, 0, 0},  {&_swigt__p_ISampleBuilder, _p_ISampleBuilderTo_p_INamed, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INamed, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INamed, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_INamed, 0, 0},  {&_swigt__p_INamed, 0, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_INamed, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INamed, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_INamed, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INamed, 0, 0},  {&_swigt__p_HomogeneousMagneticMaterial, _p_HomogeneousMagneticMaterialTo_p_INamed, 0, 0},  {&_swigt__p_HomogeneousMaterial, _p_HomogeneousMaterialTo_p_INamed, 0, 0},  {&_swigt__p_IMaterial, _p_IMaterialTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_INamed, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INamed, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_INamed, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_INamed, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INamed, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INamed, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_INamed, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_INamed, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INamed, 0, 0},  {&_swigt__p_IParameterized, _p_IParameterizedTo_p_INamed, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_INamed, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INamed, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_INamed, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INamed, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INamed, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INamed, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_INamed, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_INamed, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_INamed, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INamed, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INamed, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INamed, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IObservable[] = {  {&_swigt__p_IObservable, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IObserver[] = {  {&_swigt__p_IObserver, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IParameterized, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IParameterized, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_IParameterized, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_IParameterized, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_IParameterized, 0, 0},  {&_swigt__p_ISampleBuilder, _p_ISampleBuilderTo_p_IParameterized, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_IParameterized, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_IParameterized, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IParameterized, 0, 0},  {&_swigt__p_IParameterized, 0, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IParameterized, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IParameterized, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IParameterized, 0, 0},  {&_swigt__p_Simulation, _p_SimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_IParameterized, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_IParameterized, 0, 0},  {&_swigt__p_Instrument, _p_InstrumentTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IParameterized, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_IParameterized, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_IParameterized, 0, 0},  {&_swigt__p_ISampleBuilder, _p_ISampleBuilderTo_p_IParameterized, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_IParameterized, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_IParameterized, 0, 0},  {&_swigt__p_Beam, _p_BeamTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IParameterized, 0, 0},  {&_swigt__p_IParameterized, 0, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IParameterized, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IParticle[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParticle, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParticle, 0, 0},  {&_swigt__p_IParticle, 0, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParticle, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParticle, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IPixelMap[] = {  {&_swigt__p_IPixelMap, 0, 0, 0},  {&_swigt__p_AngularPixelMap, _p_AngularPixelMapTo_p_IPixelMap, 0, 0},  {&_swigt__p_RectPixelMap, _p_RectPixelMapTo_p_IPixelMap, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IResolutionFunction2D[] = {  {&_swigt__p_IResolutionFunction2D, 0, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IResolutionFunction2D, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IRotation[] = {  {&_swigt__p_RotationY, _p_RotationYTo_p_IRotation, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IRotation, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IRotation, 0, 0},  {&_swigt__p_IRotation, 0, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IRotation, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IRoughness[] = {  {&_swigt__p_IRoughness, 0, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IRoughness, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ISample[] = {  {&_swigt__p_Layer, _p_LayerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ISample, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ISample, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ISample, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ISample, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ISample, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_ISample, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ISample, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_ISample, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_ISample, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ISample, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ISample, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ISample, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ISample, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ISample, 0, 0},  {&_swigt__p_ISample, 0, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ISample, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ISample, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_ISample, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ISample, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ISample, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ISample, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_ISample, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_ISample, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ISample[] = {  {&_swigt__p_Layer, _p_LayerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ISample, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ISample, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ISample, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ISample, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ISample, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ISample, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple1, _p_FormFactorRipple1To_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolygonalSurface, _p_FormFactorPolygonalSurfaceTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ISample, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ISample, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorRipple2, _p_FormFactorRipple2To_p_ISample, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple1Gauss, _p_FormFactorLongRipple1GaussTo_p_ISample, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ISample, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ISample, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ISample, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ISample, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolyhedron, _p_FormFactorPolyhedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ISample, 0, 0},  {&_swigt__p_ISample, 0, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ISample, 0, 0},  {&_swigt__p_ICompositeSample, _p_ICompositeSampleTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ISample, 0, 0},  {&_swigt__p_IClusteredParticles, _p_IClusteredParticlesTo_p_ISample, 0, 0},  {&_swigt__p_IRoughness, _p_IRoughnessTo_p_ISample, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorTrivial, _p_FormFactorTrivialTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple1Lorentz, _p_FormFactorLongRipple1LorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple2Lorentz, _p_FormFactorLongRipple2LorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLorentz, _p_FormFactorLorentzTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ISample, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ISample, 0, 0},  {&_swigt__p_ILayout, _p_ILayoutTo_p_ISample, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ISample, 0, 0},  {&_swigt__p_FormFactorSphereUniformRadius, _p_FormFactorSphereUniformRadiusTo_p_ISample, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorLongRipple2Gauss, _p_FormFactorLongRipple2GaussTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorGauss, _p_FormFactorGaussTo_p_ISample, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISampleBuilder[] = {  {&_swigt__p_ISampleBuilder, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISampleVisitor[] = {  {&_swigt__p_ISampleVisitor, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISelectionRule[] = {  {&_swigt__p_ISelectionRule, 0, 0, 0},  {&_swigt__p_SimpleSelectionRule, _p_SimpleSelectionRuleTo_p_ISelectionRule, 0, 0},{0, 0, 0, 0}};
@@ -103891,6 +104096,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_FormFactorLongRipple2Lorentz,
   _swigc__p_FormFactorLorentz,
   _swigc__p_FormFactorPolygonalPrism,
+  _swigc__p_FormFactorPolygonalSurface,
   _swigc__p_FormFactorPolyhedron,
   _swigc__p_FormFactorPrism3,
   _swigc__p_FormFactorPrism6,
diff --git a/Tests/UnitTests/Core/P/FormFactorSymmetryTest.h b/Tests/UnitTests/Core/P/FormFactorSymmetryTest.h
index 85d21ef45266ff9d48f285b6b209eeecd481abb0..01fd01e0687c063b7a0a92796e8f51cacbfd3d31 100644
--- a/Tests/UnitTests/Core/P/FormFactorSymmetryTest.h
+++ b/Tests/UnitTests/Core/P/FormFactorSymmetryTest.h
@@ -37,23 +37,23 @@ INSTANTIATE_TEST_CASE_P(
     FFSymmetryTest,
     qlist);
 
-//*********** satisfactory tests ***************
+//*********** polyhedra ***************
 
-TEST_P(FFSymmetryTest, HemiEllipsoid)
+TEST_P(FFSymmetryTest, Prism3)
 {
     if( skip_q( 1e-99, 2e2 ) )
         return;
-    FormFactorHemiEllipsoid p(.53, .78, 1.3);
-    test_qq_eq( &p, q, cvector_t(-q.x(), q.y(), q.z()) );
-    test_qq_eq( &p, q, cvector_t(q.x(), -q.y(), q.z()) );
+    FormFactorPrism3 p(.83, .45);
+    test_qq_eq( &p, q, q.rotatedZ(Units::PI2/3) );
 }
 
-TEST_P(FFSymmetryTest, Prism3)
+TEST_P(FFSymmetryTest, Prism6)
 {
-    if( skip_q( 1e-99, 2e2 ) )
+    if( skip_q( 1e-99, 2e3 ) )
         return;
-    FormFactorPrism3 p(.83, .45);
-    test_qq_eq( &p, q, q.rotatedZ(Units::PI2/3) );
+    FormFactorPrism6 p(1.33, .42);
+    test_qq_eq( &p, q, q.rotatedZ( Units::PI/3),  1e-11 );
+    test_qq_eq( &p, q, q.rotatedZ(-Units::PI2/3), 1e-11 );
 }
 
 TEST_P(FFSymmetryTest, Tetrahedron)
@@ -61,7 +61,7 @@ TEST_P(FFSymmetryTest, Tetrahedron)
     if( skip_q( 1e-99, 2e2 ) )
         return;
     FormFactorTetrahedron p(8.43, .25, .53);
-    test_qq_eq( &p, q, q.rotatedZ(Units::PI2/3), 1e-8 );
+    test_qq_eq( &p, q, q.rotatedZ(Units::PI2/3), 1.5e-10 );
 }
 
 TEST_P(FFSymmetryTest, Cone6)
@@ -69,23 +69,26 @@ TEST_P(FFSymmetryTest, Cone6)
     if( skip_q( 1e-99, 2e2) ) // TODO for larger q, imag(ff) is nan
         return;
     FormFactorCone6 p(7.43, .25, .57);
-    test_qq_eq( &p, q, q.rotatedZ(-Units::PI/3), 1e-8 );
+    test_qq_eq( &p, q, q.rotatedZ(-Units::PI/3), 3e-10 );
 }
 
-TEST_P(FFSymmetryTest, TruncatedSphere)
+//*********** spheroids ***************
+
+TEST_P(FFSymmetryTest, HemiEllipsoid)
 {
     if( skip_q( 1e-99, 2e2 ) )
         return;
-    FormFactorTruncatedSphere p(.79, .34);
-    test_qq_eq( &p, q, q.rotatedZ(Units::PI/3.13698), 1e-10 );
+    FormFactorHemiEllipsoid p(.53, .78, 1.3);
+    test_qq_eq( &p, q, cvector_t(-q.x(), q.y(), q.z()) );
+    test_qq_eq( &p, q, cvector_t(q.x(), -q.y(), q.z()) );
 }
 
-TEST_P(FFSymmetryTest, Prism6)
+TEST_P(FFSymmetryTest, TruncatedSphere)
 {
-    if( skip_q( 1e-99, 2e3 ) )
+    if( skip_q( 1e-99, 2e2 ) )
         return;
-    FormFactorPrism6 p(1.33, .42);
-    test_qq_eq( &p, q, q.rotatedZ(Units::PI/3), 1e-10 );
+    FormFactorTruncatedSphere p(.79, .34);
+    test_qq_eq( &p, q, q.rotatedZ(Units::PI/3.13698), 1e-10 );
 }
 
 // ****** TODO: tests that do not pass for the full q range *********
diff --git a/Tests/UnitTests/Core/Q/FormFactorSpecializationTest.h b/Tests/UnitTests/Core/Q/FormFactorSpecializationTest.h
index bea12d61f610dd14ba7e8b25a7031ced80d497db..5f21c482d5fb525478fecf0dc135af5c3b63f89b 100644
--- a/Tests/UnitTests/Core/Q/FormFactorSpecializationTest.h
+++ b/Tests/UnitTests/Core/Q/FormFactorSpecializationTest.h
@@ -37,25 +37,7 @@ INSTANTIATE_TEST_CASE_P(
     FFSpecializationTest,
     qlist);
 
-TEST_P(FFSpecializationTest, HemiEllipsoidAsTruncatedSphere)
-{
-    if( skip_q( 1e-99, 5e2 ) )
-        return;
-    double R=1.07;
-    FormFactorHemiEllipsoid p0(R, R, R);
-    FormFactorTruncatedSphere p1(R, R);
-    test_ff_eq( &p0, &p1, 1e-10 );
-}
-
-TEST_P(FFSpecializationTest, EllipsoidalCylinderAsCylinder)
-{
-    if( skip_q( 1e-99, 5e3 ) )
-        return;
-    double R=.8, H=1.2;
-    FormFactorEllipsoidalCylinder p0(R, R, H);
-    FormFactorCylinder p1(R, H);
-    test_ff_eq( &p0, &p1, 1e-11 );
-}
+//*********** polyhedra ***************
 
 TEST_P(FFSpecializationTest, TruncatedCubeAsBox)
 {
@@ -64,7 +46,7 @@ TEST_P(FFSpecializationTest, TruncatedCubeAsBox)
     double L=.5;
     FormFactorTruncatedCube p0(L, 0);
     FormFactorBox p1(L, L, L);
-    test_ff_eq( &p0, &p1, 1e-11 );
+    test_ff_eq( &p0, &p1, 5e-12 );
 }
 
 TEST_P(FFSpecializationTest, AnisoPyramidAsPyramid)
@@ -74,17 +56,7 @@ TEST_P(FFSpecializationTest, AnisoPyramidAsPyramid)
     double L=1.5, H=.24, alpha=.6;
     FormFactorAnisoPyramid p0(L, L, H, alpha);
     FormFactorPyramid p1(L, H, alpha);
-    test_ff_eq( &p0, &p1, 1e-9 );
-}
-
-TEST_P(FFSpecializationTest, TruncatedSphereAsSphere)
-{
-    if( skip_q( .02, 5e1 ) ) // WAITING #1416 improve/replace numeric integration
-        return;
-    double R=1.;
-    FormFactorTruncatedSphere p0(R, 2*R);
-    FormFactorFullSphere p1(R);
-    test_ff_eq( &p0, &p1 );
+    test_ff_eq( &p0, &p1, 2e-12 );
 }
 
 TEST_P(FFSpecializationTest, Pyramid3AsPrism)
@@ -94,7 +66,7 @@ TEST_P(FFSpecializationTest, Pyramid3AsPrism)
     double L=1.8, H=.3;
     FormFactorTetrahedron p0(L, H, Units::PI/2);
     FormFactorPrism3 p1(L, H);
-    test_ff_eq( &p0, &p1, 2e-9 );
+    test_ff_eq( &p0, &p1, 1.4e-10 );
 }
 
 TEST_P(FFSpecializationTest, PyramidAsBox)
@@ -104,7 +76,7 @@ TEST_P(FFSpecializationTest, PyramidAsBox)
     double L=1.8, H=.3;
     FormFactorPyramid p0(L, H, Units::PI/2);
     FormFactorBox p1(L, L, H);
-    test_ff_eq( &p0, &p1, 5e-10 );
+    test_ff_eq( &p0, &p1, 7e-11 );
 }
 
 TEST_P(FFSpecializationTest, Cone6AsPrism)
@@ -114,5 +86,37 @@ TEST_P(FFSpecializationTest, Cone6AsPrism)
     double L=.8, H=1.13;
     FormFactorCone6 p0(L, H, Units::PI/2);
     FormFactorPrism6 p1(L, H);
-    test_ff_eq( &p0, &p1, 2e-10 );
+    test_ff_eq( &p0, &p1, 2e-11 );
+}
+
+//*********** spheroids ***************
+
+TEST_P(FFSpecializationTest, HemiEllipsoidAsTruncatedSphere)
+{
+    if( skip_q( 1e-99, 5e2 ) )
+        return;
+    double R=1.07;
+    FormFactorHemiEllipsoid p0(R, R, R);
+    FormFactorTruncatedSphere p1(R, R);
+    test_ff_eq( &p0, &p1, 1e-10 );
+}
+
+TEST_P(FFSpecializationTest, EllipsoidalCylinderAsCylinder)
+{
+    if( skip_q( 1e-99, 5e3 ) )
+        return;
+    double R=.8, H=1.2;
+    FormFactorEllipsoidalCylinder p0(R, R, H);
+    FormFactorCylinder p1(R, H);
+    test_ff_eq( &p0, &p1, 1e-11 );
+}
+
+TEST_P(FFSpecializationTest, TruncatedSphereAsSphere)
+{
+    if( skip_q( .02, 5e1 ) ) // WAITING #1416 improve/replace numeric integration
+        return;
+    double R=1.;
+    FormFactorTruncatedSphere p0(R, 2*R);
+    FormFactorFullSphere p1(R);
+    test_ff_eq( &p0, &p1 );
 }
diff --git a/Tests/UnitTests/Core/S/FormFactorBasicTest.h b/Tests/UnitTests/Core/S/FormFactorBasicTest.h
index 0d90ec51bcdc407a3bc33581547f4c5f480088aa..859aa3d3cfe39acd186aefcd7cce6fe1da9a1226 100644
--- a/Tests/UnitTests/Core/S/FormFactorBasicTest.h
+++ b/Tests/UnitTests/Core/S/FormFactorBasicTest.h
@@ -27,11 +27,12 @@ protected:
         cvector_t q = eps*qdir;
         complex_t ff = p->evaluate_for_q( q );
         //std::cout<<"q="<<q<<" -> "<<std::setprecision(16)<<" ff0="<<V<<", ff ="<<ff<<"\n";
-        EXPECT_LE( real(ff), V*(1+1e-15) );
+        EXPECT_LE( real(ff), V*(1+3e-16) );
         if ( R*R*R<V/20 || R*R*R>20*V )
+            // very excentric shape, the following tests cannot be expected to pass
             return;
-        EXPECT_GT( real(ff), V*(1-2*eps*R) );
-        //EXPECT_LT( std::abs(imag(ff)), 10*eps*eps*V*R*R );
+        EXPECT_GT( real(ff), V*(1-std::max(3e-16,2*eps*R*eps*R)) );
+        EXPECT_LT( std::abs(imag(ff)), 2*eps*V*R );
     }
     void test_small_q( const IFormFactorBorn* p, complex_t x, complex_t y, complex_t z )
     {
@@ -46,7 +47,7 @@ protected:
         complex_t ff0 = p->evaluate_for_q( cvector_t(0.,0.,0.) );
         EXPECT_EQ( imag(ff0), 0. );
         V = real(ff0);
-        EXPECT_NEAR( p->getVolume(), V, 1e-15*V );
+        EXPECT_NEAR( p->getVolume(), V, 3e-16*V );
 
         R = p->getRadius();
         if ( R*R*R<V/20 || R*R*R>20*V ) {
@@ -367,13 +368,13 @@ TEST_F(FormFactorBasicTest, TruncatedSphere)
 
 TEST_F(FormFactorBasicTest, TruncatedSpheroid)
 {
-    double height = 5.;
     double radius = 3.;
+    double height = 5.;
     double flattening = 1.5;
     double volume = Units::PI*radius*height*height/flattening*
             (1.-height/(3.*flattening*radius));
 
-    FormFactorTruncatedSpheroid trspheroid(radius, height,flattening);
+    FormFactorTruncatedSpheroid trspheroid(radius, height, flattening);
 
     EXPECT_EQ(BornAgain::FFTruncatedSpheroidType, trspheroid.getName());
     EXPECT_EQ(5., trspheroid.getHeight());
@@ -385,8 +386,8 @@ TEST_F(FormFactorBasicTest, TruncatedSpheroid)
 
 TEST_F(FormFactorBasicTest, Tetrahedron)
 {
-    double height = 4.;
     double base_edge = 16.;
+    double height = 4.;
     double alpha = 0.8;
     double tga = std::tan(alpha);
     double sqrt3H2divLtga = std::sqrt(3.)*2.*height/base_edge/tga;
diff --git a/dev-tools/math/fftest/runff.cpp b/dev-tools/math/fftest/runff.cpp
index 8f84ea104f0dac71b0caf2ec71ca7d2893e96ce8..12eb29f2a1ec7156137e66aafc087a9e14ab7f93 100644
--- a/dev-tools/math/fftest/runff.cpp
+++ b/dev-tools/math/fftest/runff.cpp
@@ -26,7 +26,7 @@ static double eps(2e-16);
 
 Diagnosis diagnosis;
 
-int nshape = 12;
+int nshape = 13;
 
 extern int n_limit;
 extern double q_limit_series;
@@ -49,21 +49,23 @@ IFormFactorBorn* make_particle( int ishape )
     } else if( ishape==5 ) { // tetrahedral frustum, flat one
         double alpha = 80 * Units::degree;
         return new FormFactorTetrahedron(1., 0.1*tan(alpha)/2/sqrt(3), alpha);
-    } else if( ishape==6 ) {
+    } else if( ishape==6 ) { // tetrahedral frustum as in BasicTest
+        return new FormFactorTetrahedron(16., 4., .8);
+    } else if( ishape==7 ) {
         double alpha = 72 * Units::degree;
         return new FormFactorCone6(10., 10., alpha);
-    } else if( ishape==7 ) {
-        return new FormFactorPyramid(1.5, .24, 1.);
     } else if( ishape==8 ) {
-        return new FormFactorAnisoPyramid(1.5, 1.5, .24, 1.);
+        return new FormFactorPyramid(1.5, .24, 1.);
     } else if( ishape==9 ) {
-        return new FormFactorPrism3(1.2, 1.);
+        return new FormFactorAnisoPyramid(1.5, 1.5, .24, 1.);
     } else if( ishape==10) {
-        return new FormFactorPrism6(1., 1.);
+        return new FormFactorPrism3(1.2, 1.);
     } else if( ishape==11) {
+        return new FormFactorPrism6(1., 1.);
+    } else if( ishape==12) {
         return new FormFactorTruncatedCube(4., 1.);
-    } else if( ishape==12 ) {
-        double alpha = 72 * Units::degree;
+    } else if( ishape==13 ) {
+        double alpha = 73 * Units::degree;
         return new FormFactorCuboctahedron(1., 1., .8, alpha);
     } else if( ishape==90 ) {
         return new FormFactorTriangle(1.);
@@ -71,6 +73,21 @@ IFormFactorBorn* make_particle( int ishape )
         throw "Shape not implemented";
 }
 
+//! Print q in a form that can be easily pasted to the command line for further investigation
+
+std::string nice_q( cvector_t q )
+{
+    std::ostringstream ret;
+    double qmax = 0;
+    ret << std::setprecision(16);
+    for( int i=0; i<3; ++i )
+        qmax = std::max( qmax, q[i].real() );
+    for( int i=0; i<3; ++i )
+        ret << q[i].real()/qmax << " " << q[i].imag()/qmax << " ";
+    ret << qmax;
+    return ret.str();
+}
+
 //! Bisect between two q's to find possible discontinuities
 
 void bisect(
@@ -87,7 +104,7 @@ void bisect(
         double relstep = step/aval;
         maxrelstep = std::max( maxrelstep, relstep );
         if( relstep>2e-9 ){
-            cout<<"ishape="<<ishape<<": relstep "<<std::setprecision(8)<<relstep<<"="<<step<<"/"<<std::setprecision(16)<<aval<<" for "<<di<<"->"<<df<<" at q between "<< std::setprecision(16)<<qi<<" and "<<qf<<"\n";
+            cout<<"ishape="<<ishape<<": relstep "<<std::setprecision(8)<<relstep<<"="<<step<<"/"<<std::setprecision(16)<<aval<<" for "<<di<<"->"<<df<<" at q between "<<nice_q(qi)<<" and "<<nice_q(qf)<<"\n";
         }
         return;
     }
@@ -102,13 +119,13 @@ void bisect(
 
 //! Computes form factor, and prints result according to outfilter.
 
-void run(const IFormFactorBorn* polyh, const int ishape, const cvector_t q, int outfilter )
+void run( const IFormFactorBorn* polyh, int ishape, cvector_t q, int outfilter )
 {
     complex_t ret = polyh->evaluate_for_q(q);
     cout<<std::scientific<<std::setprecision(16)<<std::setfill('0');
     if     ( outfilter==0 )
-        cout<<q.mag()<<" "<<std::abs(ret)<<" "<<ret.real()<<" "<<ret.imag()<<
-            diagnosis.nExpandedFaces<<" "<<diagnosis.maxOrder;
+        cout<<q.mag()<<" "<<std::abs(ret)<<" "<<ret.real()<<" "<<ret.imag()<<" "<<
+            diagnosis.nExpandedFaces<<std::noshowpos<<" "<<diagnosis.maxOrder;
     else if( outfilter==1 )
         cout<<ret.real();
     else if( outfilter==2 )
@@ -116,44 +133,44 @@ void run(const IFormFactorBorn* polyh, const int ishape, const cvector_t q, int
     cout<<"\n";
 }
 
+//! Compute a form factor with modified control parameter settings
+
+complex_t ff_modified( cvector_t q, const IFormFactorBorn* polyh, bool expand_qpa, bool expand_q )
+{
+    PolyhedralFace::setLimits( expand_qpa ? 1e99 : 1e-99, 80 );
+    FormFactorPolyhedron::setLimits( expand_q ? 1e99 : 1e-99, 80 );
+    return polyh->evaluate_for_q( q );
+}
 
 void test_matching( int ishape, const vector<vector<cvector_t>>& scans )
 {
+    cout<<ishape<<"\n";
+    cerr<<"shape "<<ishape<<" ...\n";
     IFormFactorBorn* polyh( make_particle( ishape ) );
-    int n_mag = 11;
-    double mag_i = 1e-4;
-    double mag_f = 1e-2;
+    int n_mag = 25;
+    double mag_i = 1e-3;
+    double mag_f = 1e1;
     for( int i=1; i<n_mag; ++i ) {
         double mag = mag_i*pow(mag_f/mag_i,i/(n_mag-1.));
-        double res[3];
-        res[0] = res[1] = res[2] = 0;
+        double res = 0;
         for( const vector<cvector_t>& q_scan: scans ) {
-            complex_t ff[3];
             assert( q_scan.size()== 1 );
-            const cvector_t q = mag * q_scan[0];
-            FormFactorPolyhedron::setLimits( 1e99, 20 );
-            PolyhedralFace::setLimits( 1e99, 20 );
-            ff[0] = polyh->evaluate_for_q( q );
-            FormFactorPolyhedron::setLimits( 1e-99, 20 );
-            PolyhedralFace::setLimits( 1e99, 20 );
-            ff[1] = polyh->evaluate_for_q( q );
-            FormFactorPolyhedron::setLimits( 1e-99, 20 );
-            PolyhedralFace::setLimits( 1e-99, 20 );
-            ff[2] = polyh->evaluate_for_q( q );
-            double dev[3];
-            dev[2] = std::abs(ff[0]-ff[1])*2/(std::abs(ff[0])+std::abs(ff[1]));
-            dev[1] = std::abs(ff[0]-ff[2])*2/(std::abs(ff[0])+std::abs(ff[2]));
-            dev[0] = std::abs(ff[1]-ff[2])*2/(std::abs(ff[1])+std::abs(ff[2]));
-            for( int m=0; m<3; ++m ) {
-                res[m] = std::max(res[m], dev[m] );
-                if( dev[m]>1e-4 )
-                    cout<<ishape<<" "<<mag<<" "<<std::setprecision(8)<<
-                        dev[0]<<" "<<dev[1]<<" "<<dev[2]<<" "<<
-                        ff[0]<<" "<<ff[1]<<" "<<ff[2]<<" @ "<<q<<"\n";
-            }
+            cvector_t uq = q_scan[0];
+            const cvector_t q = mag * uq;
+            complex_t ff[2];
+
+            ff[0] = ff_modified( q, polyh, false, false );
+            ff[1] = ff_modified( q, polyh, true, false );
+
+            double dev = std::abs(ff[0]-ff[1])*2/(std::abs(ff[0])+std::abs(ff[1]));
+            res = std::max(res, dev );
+            if( 0 && dev>.1 )
+                cerr<<ishape<<" "<<mag<<" "<<std::setprecision(16)<<
+                    dev<<" "<<ff[0]<<" "<<ff[1]<<" @ "<<q<<"\n";
         }
-        cout<<ishape<<" "<<mag<<" "<<std::setprecision(8)<<res[0]<<" "<<res[1]<<" "<<res[2]<<"\n";
+        cout<<" "<<mag*polyh->getRadius()<<" "<<std::setprecision(8)<<res<<"\n";
     }
+    cout<<"\n";
 }
 
 double test_continuity( int ishape, const vector<vector<cvector_t>>& scans )
@@ -170,8 +187,10 @@ double test_continuity( int ishape, const vector<vector<cvector_t>>& scans )
             complex_t ret = polyh->evaluate_for_q(q_scan[i]);
             Diagnosis diag = diagnosis;
             if( diag!=last_diag )
-                bisect( polyh, ishape, q_scan[i].mag(), q_scan[i], ret, diag, q_scan[i-1],
-                        last_ret, last_diag, maxrelstep );
+                bisect( polyh, ishape, q_scan[i].mag(),
+                        q_scan[i-1], last_ret, last_diag,
+                        q_scan[i], ret, diag,
+                        maxrelstep );
         }
     }
     fprintf( stderr, "\n" );
@@ -286,6 +305,8 @@ void help_and_exit()
 int main (int argc, const char *argv[])
 {
     try {
+        diagnosis.debmsg = 0;
+        diagnosis.request_convergence = false;
         const char** arg = argv;
         NEXTARG;
         if ( !strncmp( *arg, "def", 3 ) ) {
@@ -320,13 +341,14 @@ int main (int argc, const char *argv[])
                 while( std::cin >> mag )
                     run( P, ishape, mag*uq, outfilter );
             } else if( inmode==1 ) {
+                diagnosis.debmsg = 2;
                 NEXTARG;
                 mag = atof( *arg );
                 run( P, ishape, mag*uq, outfilter );
             } else if( inmode==2 ) {
-                int n_mag = 6201;
-                double mag_i = 1e-24;
-                double mag_f = 1e2;
+                int n_mag = 2001;
+                double mag_i = 1e-20;
+                double mag_f = 1e4;
                 for( int i=1; i<n_mag; ++i ) {
                     //mag = 180.*i/(n_mag-1);
                     mag = mag_i*pow(mag_f/mag_i,i/(n_mag-1.));
@@ -340,6 +362,7 @@ int main (int argc, const char *argv[])
         int ishapepar = atoi( *arg );
 
         if( inmode==3 ) { // continuity test
+            diagnosis.request_convergence = true;
             vector<vector<cvector_t>> scans = create_scans( 1 );
             double totmaxrelstep = 0;
             if( ishapepar==0 ) {