From c656f00ef6bd64a93ff27955f5467f6619bc2f05 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Thu, 13 Aug 2020 21:21:16 +0200
Subject: [PATCH] Most FormFactor classes now delegating parameter registration
 to INode.

<code>

import edtools, re, sys

nodeList = '''\
FormFactorAnisoPyramid ./Core/HardParticle/FormFactorAnisoPyramid
FormFactorBox ./Core/HardParticle/FormFactorBox
FormFactorCantellatedCube ./Core/HardParticle/FormFactorCantellatedCube
FormFactorCone6 ./Core/HardParticle/FormFactorCone6
FormFactorCone ./Core/HardParticle/FormFactorCone
FormFactorCuboctahedron ./Core/HardParticle/FormFactorCuboctahedron
FormFactorCylinder ./Core/HardParticle/FormFactorCylinder
FormFactorDodecahedron ./Core/HardParticle/FormFactorDodecahedron
FormFactorDot ./Core/HardParticle/FormFactorDot
FormFactorEllipsoidalCylinder ./Core/HardParticle/FormFactorEllipsoidalCylinder
FormFactorFullSphere ./Core/HardParticle/FormFactorFullSphere
FormFactorFullSpheroid ./Core/HardParticle/FormFactorFullSpheroid
FormFactorHollowSphere ./Core/HardParticle/FormFactorHollowSphere
FormFactorGaussSphere ./Core/SoftParticle/FormFactorGauss
FormFactorHemiEllipsoid ./Core/HardParticle/FormFactorHemiEllipsoid
FormFactorIcosahedron ./Core/HardParticle/FormFactorIcosahedron
FormFactorLongBoxGauss ./Core/HardParticle/FormFactorLongBoxGauss
FormFactorLongBoxLorentz ./Core/HardParticle/FormFactorLongBoxLorentz
FormFactorPrism3 ./Core/HardParticle/FormFactorPrism3
FormFactorPrism6 ./Core/HardParticle/FormFactorPrism6
FormFactorPyramid ./Core/HardParticle/FormFactorPyramid
FormFactorSphereGaussianRadius ./Core/SoftParticle/FormFactorSphereGaussianRadius
FormFactorSphereLogNormalRadius ./Core/SoftParticle/FormFactorSphereLogNormalRadius
FormFactorTetrahedron ./Core/HardParticle/FormFactorTetrahedron
FormFactorTriangle ./Core/HardParticle/FormFactorTriangle
FormFactorTruncatedCube ./Core/HardParticle/FormFactorTruncatedCube
FormFactorTruncatedSphere ./Core/HardParticle/FormFactorTruncatedSphere
FormFactorTruncatedSpheroid ./Core/HardParticle/FormFactorTruncatedSpheroid
'''

def get_and_check_ctor_args(t, vars):
    avars = []
    if t!="":
        args = re.split(',\s+', t)
        for a in args:
            mm = re.search(r'double (\w+)( = \S+?)?', a)
            if not mm:
                raise Exception("Unexpected argument '%s' in constructor" % a)
            avars.append(mm.group(1))
    ndiff = len(avars) - len(vars)
    if ndiff<0:
        raise Exception("Not enough constructor args")
    for i in range(len(vars)):
        if avars[ndiff+i] != vars[i]:
            raise Exception("Argument '%s' does not match variable '%s'" %
                            (avars[ndiff+i], vars[i]))
    return avars

def refactor_class(node, fnbase):
    fnc = fnbase+".cpp"
    fnh = fnbase+".h"

    with open(fnh, 'r') as f:
        th = f.read()

    with open(fnc, 'r') as f:
        tc = f.read()

    # class declaration -> find base class
    m = re.search(r'\nclass (BA_CORE_API_ )?%s\s+(final\s+)?:\s+public\s+(\w+)' % node, th)
    if not m:
        raise Exception(node+": base class not found")
    baseClass = m.group(3)

    print("\n"+fnbase+": "+node+" < "+baseClass)

    # find constructor implementation
    ctors = []
    for m in re.finditer(r'^%s::%s(.*?^){(.*?)^}' % (node, node), tc, re.M | re.DOTALL):
        inits = m.group(1)
        if re.search(node, inits):
            continue # it's a delegating c'tor, ignorable for our purpose
        ctors.append(m.group(2))
    if len(ctors)==0:
        raise Exception("Constructor for "+node+" not found in "+fnc)
    if len(ctors)>1:
        raise Exception("Several constructors for "+node+" found in "+fnc)
    blocks = re.split(r';', ctors[0])

    names = []
    vars = []
    units = []
    minis = []
    maxis = []
    cname = '"NamelessClass"'
    for cmd in blocks:
        m = re.search(r'setName\((".*?")\)', cmd)
        if m:
            cname = m.group(1)
            continue
    for cmd in blocks:
        m = re.search(r'registerParameter(.*)', cmd)
        if not m:
            continue
        txt = m.group(1)
        m = re.match(r'\((".*?"), &m_(\w+)\)(\.setUnit\((".*?")\))?(\.set\w+\(.*?\))?$', txt)
        if not m:
            print(node, "-->nonstandard args-->", txt)
            continue
        names.append(m.group(1))
        vars.append(m.group(2))
        units.append(m.group(4) or '""')
        if not m.group(5):
            minis.append("-INF")
            maxis.append("+INF")
        else:
            limits = m.group(5)
            if re.match(r'\.set(Nonnegative|Postive)', limits):
                minis.append("0")
                maxis.append("+INF")
            else:
                mm = re.match(r'.setLimited\((.*?),\s+(.*?)\)', limits)
                minis.append(mm.group(1))
                maxis.append(mm.group(2))
    print(node, "  ", cname, names, vars, units, minis, maxis)

    def ed_h(fn, t):
        ti = t
        # add P-based c'tor
        pattern = r'(\n    %s\(' % node
        pattern += r'((double\s+\w+)?'
        pattern += r'(,\s+double\s+\w+)*)'
        pattern += r'(,\s+bool position_at_center = false)?'
        pattern += r'(,\s+size_t n_samples)?'
        pattern += r'\);\n)'
        m = re.search(pattern, t, re.S)
        if not m:
            raise Exception("Constructor not matched")
        ctor = m.group(1)
        avars = get_and_check_ctor_args(m.group(2), vars)

        arg_pac = edtools.found_or_empty(r', bool position_at_center = false', ctor)
        arg_nsa = ""
        if re.search(r', size_t n_samples', ctor):
            arg_nsa = ', size_t n_samples = 0'
        outpat = r'\n    %s(const std::vector<double> P%s%s);\1' % (node, arg_pac, arg_nsa)
        t = re.sub(pattern, outpat, t, 0, re.S)

        # declare references;
        for var in vars:
            t = re.sub(r'(\n    )(double)( m_%s;)' % var, r'\1const \2&\3', t)
        return t

    edtools.ed_file(ed_h, fnh)

    def ed_c(fn, t):
        # add P-based c'tor
        pattern = r'\n%s::%s\(' % (node, node)
        pattern += r'((.*?)'
        pattern += r'((,\s+bool position_at_center)?'
        pattern += r'(,\s+size_t n_samples)?))'
        pattern += r'\)(.*?)\n({.*?\n})'
        m = re.search(pattern, t, re.S)
        if not m:
            print(pattern)
            raise Exception("c'tor not found in cpp file")
        allargs = m.group(1)
        avars = get_and_check_ctor_args(m.group(2), vars)
        optargs = m.group(3)
        have_pac = (m.group(4) is not None)
        have_nsa = m.group(5) is not None
        block = m.group(7)

        for i in range(len(vars)):
            block = re.sub(r'.*registerPar.*\n', '', block)
        block = re.sub(r'.*setName\(.*\n', '', block)

        # new c'tor with old implementation block
        outpat = r'\n%s::%s(const std::vector<double> P' % (node, node)
        if have_pac:
            outpat += r', bool position_at_center'
        if have_nsa:
            outpat += r', size_t n_samples'
        outpat += r')\n : %s({%s, %s, {' % (baseClass, cname, '"class_tooltip"')
        outpat += ', '.join([r'{%s, %s, %s, %s, %s, 0}' %
                             (names[i], units[i], '"para_tooltip"',
                              minis[i], maxis[i]) for i in range(len(names))])
        outpat += r'}}, P)\n'
        for i in range(len(vars)):
            outpat += r' , m_%s(m_P[%i])\n' % (vars[i], i)
        if have_pac:
            outpat += r' , m_position_at_center(position_at_center)\n'
        if have_nsa:
            outpat += r' , m_n_samples(n_samples)\n'
        outpat += edtools.text2re(block)
        # old c'tor refers to new c'tor
        outpat += r'\n\n%s::%s(' % (node, node)
        outpat += r'%s)\n : %s(std::vector<double>{%s}' % (allargs, node, ', '.join(avars))
        if have_pac:
            outpat += r', position_at_center'
        if have_nsa:
            outpat += r', n_samples'
        outpat += r')\n{}\n'

        t = re.sub(pattern, outpat, t, 0, re.S)

        if not re.search(r'registerPar', t):
            t = re.sub(r'#include "Core/Parametrization/ParameterPool.h"\n', '', t)
            t = re.sub(r'#include "Core/Parametrization/RealParameter.h"\n', '', t)

        return t

    edtools.ed_file(ed_c, fnc)

nsuccess = 0
nfailure = 0
nodeEntries = re.split(r'\n', nodeList.rstrip())
for entry in nodeEntries:
    node, fnbase = re.split(' ', entry)
    try:
        refactor_class(node, fnbase)
        print("SUCCESS "+node)
        nsuccess += 1
    except Exception as e:
        print("FAILURE "+node+": "+str(e))
        nfailure += 1
print("%i/%i class conversions failed" % (nfailure, nsuccess+nfailure))
</code>
---
 Core/HardParticle/FormFactorAnisoPyramid.cpp  |   22 +-
 Core/HardParticle/FormFactorAnisoPyramid.h    |    9 +-
 Core/HardParticle/FormFactorBox.cpp           |   20 +-
 Core/HardParticle/FormFactorBox.h             |    7 +-
 .../FormFactorCantellatedCube.cpp             |   18 +-
 Core/HardParticle/FormFactorCantellatedCube.h |    5 +-
 Core/HardParticle/FormFactorCone.cpp          |   20 +-
 Core/HardParticle/FormFactorCone.h            |    7 +-
 Core/HardParticle/FormFactorCone6.cpp         |   20 +-
 Core/HardParticle/FormFactorCone6.h           |    7 +-
 Core/HardParticle/FormFactorCuboctahedron.cpp |   23 +-
 Core/HardParticle/FormFactorCuboctahedron.h   |    9 +-
 Core/HardParticle/FormFactorCylinder.cpp      |   18 +-
 Core/HardParticle/FormFactorCylinder.h        |    5 +-
 Core/HardParticle/FormFactorDodecahedron.cpp  |   13 +-
 Core/HardParticle/FormFactorDodecahedron.h    |    3 +-
 Core/HardParticle/FormFactorDot.cpp           |    9 +-
 Core/HardParticle/FormFactorDot.h             |    3 +-
 .../FormFactorEllipsoidalCylinder.cpp         |   20 +-
 .../FormFactorEllipsoidalCylinder.h           |    7 +-
 Core/HardParticle/FormFactorFullSphere.cpp    |   14 +-
 Core/HardParticle/FormFactorFullSphere.h      |    3 +-
 Core/HardParticle/FormFactorFullSpheroid.cpp  |   18 +-
 Core/HardParticle/FormFactorFullSpheroid.h    |    5 +-
 Core/HardParticle/FormFactorHemiEllipsoid.cpp |   20 +-
 Core/HardParticle/FormFactorHemiEllipsoid.h   |    7 +-
 Core/HardParticle/FormFactorHollowSphere.cpp  |   18 +-
 Core/HardParticle/FormFactorHollowSphere.h    |    5 +-
 Core/HardParticle/FormFactorIcosahedron.cpp   |   13 +-
 Core/HardParticle/FormFactorIcosahedron.h     |    3 +-
 Core/HardParticle/FormFactorLongBoxGauss.cpp  |   20 +-
 Core/HardParticle/FormFactorLongBoxGauss.h    |    7 +-
 .../HardParticle/FormFactorLongBoxLorentz.cpp |   20 +-
 Core/HardParticle/FormFactorLongBoxLorentz.h  |    7 +-
 Core/HardParticle/FormFactorPrism3.cpp        |   18 +-
 Core/HardParticle/FormFactorPrism3.h          |    5 +-
 Core/HardParticle/FormFactorPrism6.cpp        |   18 +-
 Core/HardParticle/FormFactorPrism6.h          |    5 +-
 Core/HardParticle/FormFactorPyramid.cpp       |   20 +-
 Core/HardParticle/FormFactorPyramid.h         |    7 +-
 Core/HardParticle/FormFactorTetrahedron.cpp   |   20 +-
 Core/HardParticle/FormFactorTetrahedron.h     |    7 +-
 Core/HardParticle/FormFactorTriangle.cpp      |   13 +-
 Core/HardParticle/FormFactorTriangle.h        |    3 +-
 Core/HardParticle/FormFactorTruncatedCube.cpp |   18 +-
 Core/HardParticle/FormFactorTruncatedCube.h   |    5 +-
 .../FormFactorTruncatedSphere.cpp             |   20 +-
 Core/HardParticle/FormFactorTruncatedSphere.h |    7 +-
 .../FormFactorTruncatedSpheroid.cpp           |   24 +-
 .../FormFactorTruncatedSpheroid.h             |    9 +-
 Core/SoftParticle/FormFactorGauss.cpp         |   15 +-
 Core/SoftParticle/FormFactorGauss.h           |    3 +-
 .../FormFactorSphereGaussianRadius.cpp        |   18 +-
 .../FormFactorSphereGaussianRadius.h          |    5 +-
 .../FormFactorSphereLogNormalRadius.cpp       |   19 +-
 .../FormFactorSphereLogNormalRadius.h         |    5 +-
 auto/Wrap/libBornAgainCore.py                 |  141 +-
 auto/Wrap/libBornAgainCore_wrap.cpp           | 2105 ++++++++++++++++-
 58 files changed, 2511 insertions(+), 404 deletions(-)

diff --git a/Core/HardParticle/FormFactorAnisoPyramid.cpp b/Core/HardParticle/FormFactorAnisoPyramid.cpp
index 4f47062504a..4b034cf3385 100644
--- a/Core/HardParticle/FormFactorAnisoPyramid.cpp
+++ b/Core/HardParticle/FormFactorAnisoPyramid.cpp
@@ -15,7 +15,6 @@
 #include "Core/HardParticle/FormFactorAnisoPyramid.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Tools/MathFunctions.h"
 
 const PolyhedralTopology FormFactorAnisoPyramid::topology = {{{{3, 2, 1, 0}, true},
@@ -31,16 +30,23 @@ const PolyhedralTopology FormFactorAnisoPyramid::topology = {{{{3, 2, 1, 0}, tru
 //! @param width: width of the rectangular base in nm
 //! @param height: height of pyramid in nm
 //! @param alpha: dihedral angle in radians between base and facet
+FormFactorAnisoPyramid::FormFactorAnisoPyramid(const std::vector<double> P)
+    : FormFactorPolyhedron({"AnisoPyramid",
+                            "class_tooltip",
+                            {{"Length", "nm", "para_tooltip", 0, +INF, 0},
+                             {"Width", "nm", "para_tooltip", 0, +INF, 0},
+                             {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                             {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
+                           P),
+      m_length(m_P[0]), m_width(m_P[1]), m_height(m_P[2]), m_alpha(m_P[3])
+{
+    onChange();
+}
+
 FormFactorAnisoPyramid::FormFactorAnisoPyramid(double length, double width, double height,
                                                double alpha)
-    : FormFactorPolyhedron(), m_length(length), m_width(width), m_height(height), m_alpha(alpha)
+    : FormFactorAnisoPyramid(std::vector<double>{length, width, height, alpha})
 {
-    setName("AnisoPyramid");
-    registerParameter("Length", &m_length).setUnit("nm").setNonnegative();
-    registerParameter("Width", &m_width).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
-    registerParameter("Alpha", &m_alpha).setUnit("rad").setLimited(0., M_PI_2);
-    onChange();
 }
 
 IFormFactor* FormFactorAnisoPyramid::sliceFormFactor(ZLimits limits, const IRotation& rot,
diff --git a/Core/HardParticle/FormFactorAnisoPyramid.h b/Core/HardParticle/FormFactorAnisoPyramid.h
index 5684a97bad5..ae85f38501d 100644
--- a/Core/HardParticle/FormFactorAnisoPyramid.h
+++ b/Core/HardParticle/FormFactorAnisoPyramid.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorAnisoPyramid : public FormFactorPolyhedron
 {
 public:
+    FormFactorAnisoPyramid(const std::vector<double> P);
     FormFactorAnisoPyramid(double length, double width, double height, double alpha);
 
     FormFactorAnisoPyramid* clone() const override final
@@ -45,10 +46,10 @@ protected:
 private:
     static const PolyhedralTopology topology;
 
-    double m_length;
-    double m_width;
-    double m_height;
-    double m_alpha;
+    const double& m_length;
+    const double& m_width;
+    const double& m_height;
+    const double& m_alpha;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORANISOPYRAMID_H
diff --git a/Core/HardParticle/FormFactorBox.cpp b/Core/HardParticle/FormFactorBox.cpp
index 219b4953b0a..64bc064a844 100644
--- a/Core/HardParticle/FormFactorBox.cpp
+++ b/Core/HardParticle/FormFactorBox.cpp
@@ -13,23 +13,29 @@
 // ************************************************************************** //
 
 #include "Core/HardParticle/FormFactorBox.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Tools/MathFunctions.h"
 
 //! Constructor of a rectangular cuboid.
 //! @param length: length of the base in nanometers
 //! @param width: width of the base in nanometers
 //! @param height: height of the box in nanometers
-FormFactorBox::FormFactorBox(double length, double width, double height)
-    : m_length(length), m_width(width), m_height(height)
+FormFactorBox::FormFactorBox(const std::vector<double> P)
+    : FormFactorPolygonalPrism({"Box",
+                                "class_tooltip",
+                                {{"Length", "nm", "para_tooltip", 0, +INF, 0},
+                                 {"Width", "nm", "para_tooltip", 0, +INF, 0},
+                                 {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
+                               P),
+      m_length(m_P[0]), m_width(m_P[1]), m_height(m_P[2])
 {
-    setName("Box");
-    registerParameter("Length", &m_length).setUnit("nm").setNonnegative();
-    registerParameter("Width", &m_width).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorBox::FormFactorBox(double length, double width, double height)
+    : FormFactorBox(std::vector<double>{length, width, height})
+{
+}
+
 complex_t FormFactorBox::evaluate_for_q(cvector_t q) const
 {
     complex_t qzHdiv2 = m_height / 2 * q.z();
diff --git a/Core/HardParticle/FormFactorBox.h b/Core/HardParticle/FormFactorBox.h
index f3689c207f7..99af81279b9 100644
--- a/Core/HardParticle/FormFactorBox.h
+++ b/Core/HardParticle/FormFactorBox.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorBox : public FormFactorPolygonalPrism
 {
 public:
+    FormFactorBox(const std::vector<double> P);
     FormFactorBox(double length, double width, double height);
 
     FormFactorBox* clone() const override final
@@ -47,9 +48,9 @@ protected:
     double height() const final { return m_height; }
 
 private:
-    double m_length;
-    double m_width;
-    double m_height;
+    const double& m_length;
+    const double& m_width;
+    const double& m_height;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORBOX_H
diff --git a/Core/HardParticle/FormFactorCantellatedCube.cpp b/Core/HardParticle/FormFactorCantellatedCube.cpp
index 319e8f82d63..bf88c253ed5 100644
--- a/Core/HardParticle/FormFactorCantellatedCube.cpp
+++ b/Core/HardParticle/FormFactorCantellatedCube.cpp
@@ -14,7 +14,6 @@
 
 #include "Core/HardParticle/FormFactorCantellatedCube.h"
 #include "Core/Basics/Exceptions.h"
-#include "Core/Parametrization/RealParameter.h"
 
 const PolyhedralTopology FormFactorCantellatedCube::topology = {
     {
@@ -50,15 +49,22 @@ const PolyhedralTopology FormFactorCantellatedCube::topology = {
 //! Constructor of a truncated cube.
 //! @param length: length of the full cube's edge in nanometers
 //! @param removed_length: removed length from each edge of the cube in nanometers
-FormFactorCantellatedCube::FormFactorCantellatedCube(double length, double removed_length)
-    : FormFactorPolyhedron(), m_length(length), m_removed_length(removed_length)
+FormFactorCantellatedCube::FormFactorCantellatedCube(const std::vector<double> P)
+    : FormFactorPolyhedron({"CantellatedCube",
+                            "class_tooltip",
+                            {{"Length", "nm", "para_tooltip", 0, +INF, 0},
+                             {"RemovedLength", "nm", "para_tooltip", 0, +INF, 0}}},
+                           P),
+      m_length(m_P[0]), m_removed_length(m_P[1])
 {
-    setName("CantellatedCube");
-    registerParameter("Length", &m_length).setUnit("nm").setNonnegative();
-    registerParameter("RemovedLength", &m_removed_length).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorCantellatedCube::FormFactorCantellatedCube(double length, double removed_length)
+    : FormFactorCantellatedCube(std::vector<double>{length, removed_length})
+{
+}
+
 void FormFactorCantellatedCube::onChange()
 {
     if (m_removed_length > 0.5 * m_length) {
diff --git a/Core/HardParticle/FormFactorCantellatedCube.h b/Core/HardParticle/FormFactorCantellatedCube.h
index 17c6731a7bf..0737e7992d0 100644
--- a/Core/HardParticle/FormFactorCantellatedCube.h
+++ b/Core/HardParticle/FormFactorCantellatedCube.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorCantellatedCube : public FormFactorPolyhedron
 {
 public:
+    FormFactorCantellatedCube(const std::vector<double> P);
     FormFactorCantellatedCube(double length, double removed_length);
 
     FormFactorCantellatedCube* clone() const override final
@@ -39,8 +40,8 @@ protected:
 
 private:
     static const PolyhedralTopology topology;
-    double m_length;
-    double m_removed_length;
+    const double& m_length;
+    const double& m_removed_length;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORCANTELLATEDCUBE_H
diff --git a/Core/HardParticle/FormFactorCone.cpp b/Core/HardParticle/FormFactorCone.cpp
index 8616fa9fa09..3959d13a924 100644
--- a/Core/HardParticle/FormFactorCone.cpp
+++ b/Core/HardParticle/FormFactorCone.cpp
@@ -15,7 +15,6 @@
 #include "Core/HardParticle/FormFactorCone.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/DoubleEllipse.h"
 #include "Core/Tools/MathFunctions.h"
 #include <limits>
@@ -24,10 +23,15 @@
 //! @param radius: radius of the base in nanometers
 //! @param height: height of the cone in nanometers
 //! @param alpha: angle between the base and the side surface in radians
-FormFactorCone::FormFactorCone(double radius, double height, double alpha)
-    : m_radius(radius), m_height(height), m_alpha(alpha)
+FormFactorCone::FormFactorCone(const std::vector<double> P)
+    : IFormFactorBorn({"Cone",
+                       "class_tooltip",
+                       {{"Radius", "nm", "para_tooltip", 0, +INF, 0},
+                        {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                        {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
+                      P),
+      m_radius(m_P[0]), m_height(m_P[1]), m_alpha(m_P[2])
 {
-    setName("Cone");
     m_cot_alpha = MathFunctions::cot(m_alpha);
     if (!std::isfinite(m_cot_alpha) || m_cot_alpha < 0)
         throw Exceptions::OutOfBoundsException("pyramid angle alpha out of bounds");
@@ -40,12 +44,14 @@ FormFactorCone::FormFactorCone(double radius, double height, double alpha)
         ostr << "Check for 'height <= radius*tan(alpha)' failed.";
         throw Exceptions::ClassInitializationException(ostr.str());
     }
-    registerParameter("Radius", &m_radius).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
-    registerParameter("Alpha", &m_alpha).setUnit("rad").setLimited(0., M_PI_2);
     onChange();
 }
 
+FormFactorCone::FormFactorCone(double radius, double height, double alpha)
+    : FormFactorCone(std::vector<double>{radius, height, alpha})
+{
+}
+
 //! Integrand for complex form factor.
 complex_t FormFactorCone::Integrand(double Z) const
 {
diff --git a/Core/HardParticle/FormFactorCone.h b/Core/HardParticle/FormFactorCone.h
index b11065dd52e..73913a44030 100644
--- a/Core/HardParticle/FormFactorCone.h
+++ b/Core/HardParticle/FormFactorCone.h
@@ -24,6 +24,7 @@
 class BA_CORE_API_ FormFactorCone : public IFormFactorBorn
 {
 public:
+    FormFactorCone(const std::vector<double> P);
     FormFactorCone(double radius, double height, double alpha);
 
     FormFactorCone* clone() const override final
@@ -49,9 +50,9 @@ protected:
 private:
     complex_t Integrand(double Z) const;
 
-    double m_radius;
-    double m_height;
-    double m_alpha;
+    const double& m_radius;
+    const double& m_height;
+    const double& m_alpha;
     double m_cot_alpha;
     mutable cvector_t m_q;
     mutable ComplexIntegrator m_integrator;
diff --git a/Core/HardParticle/FormFactorCone6.cpp b/Core/HardParticle/FormFactorCone6.cpp
index 89f53229dc6..aeb1c022622 100644
--- a/Core/HardParticle/FormFactorCone6.cpp
+++ b/Core/HardParticle/FormFactorCone6.cpp
@@ -15,7 +15,6 @@
 #include "Core/HardParticle/FormFactorCone6.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Tools/MathFunctions.h"
 
 const PolyhedralTopology FormFactorCone6::topology = {{{{5, 4, 3, 2, 1, 0}, true},
@@ -32,16 +31,23 @@ const PolyhedralTopology FormFactorCone6::topology = {{{{5, 4, 3, 2, 1, 0}, true
 //! @param base_edge: Edge of the regular hexagonal base in nanometers
 //! @param height: height of a truncated pyramid in nanometers
 //! @param alpha: dihedral angle in radians between base and facet
-FormFactorCone6::FormFactorCone6(double base_edge, double height, double alpha)
-    : FormFactorPolyhedron(), m_base_edge(base_edge), m_height(height), m_alpha(alpha)
+FormFactorCone6::FormFactorCone6(const std::vector<double> P)
+    : FormFactorPolyhedron({"Cone6",
+                            "class_tooltip",
+                            {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
+                             {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                             {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
+                           P),
+      m_base_edge(m_P[0]), m_height(m_P[1]), m_alpha(m_P[2])
 {
-    setName("Cone6");
-    registerParameter("BaseEdge", &m_base_edge).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
-    registerParameter("Alpha", &m_alpha).setUnit("rad").setLimited(0., M_PI_2);
     onChange();
 }
 
+FormFactorCone6::FormFactorCone6(double base_edge, double height, double alpha)
+    : FormFactorCone6(std::vector<double>{base_edge, height, alpha})
+{
+}
+
 IFormFactor* FormFactorCone6::sliceFormFactor(ZLimits limits, const IRotation& rot,
                                               kvector_t translation) const
 {
diff --git a/Core/HardParticle/FormFactorCone6.h b/Core/HardParticle/FormFactorCone6.h
index 9e47288f5e9..ae9918c5e61 100644
--- a/Core/HardParticle/FormFactorCone6.h
+++ b/Core/HardParticle/FormFactorCone6.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorCone6 : public FormFactorPolyhedron
 {
 public:
+    FormFactorCone6(const std::vector<double> P);
     FormFactorCone6(double base_edge, double height, double alpha);
 
     FormFactorCone6* clone() const override final
@@ -43,9 +44,9 @@ protected:
 
 private:
     static const PolyhedralTopology topology;
-    double m_base_edge;
-    double m_height;
-    double m_alpha;
+    const double& m_base_edge;
+    const double& m_height;
+    const double& m_alpha;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORCONE6_H
diff --git a/Core/HardParticle/FormFactorCuboctahedron.cpp b/Core/HardParticle/FormFactorCuboctahedron.cpp
index 16d86b4e186..59e941aacd8 100644
--- a/Core/HardParticle/FormFactorCuboctahedron.cpp
+++ b/Core/HardParticle/FormFactorCuboctahedron.cpp
@@ -16,7 +16,6 @@
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/HardParticle/FormFactorPyramid.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Tools/MathFunctions.h"
 
 const PolyhedralTopology FormFactorCuboctahedron::topology = {{{{3, 2, 1, 0}, true},
@@ -37,17 +36,23 @@ const PolyhedralTopology FormFactorCuboctahedron::topology = {{{{3, 2, 1, 0}, tr
 //! @param height: height of the lower pyramid in nanometers
 //! @param height_ratio: ratio of heights of top to bottom pyramids
 //! @param alpha: dihedral angle in radians between base and facet
+FormFactorCuboctahedron::FormFactorCuboctahedron(const std::vector<double> P)
+    : FormFactorPolyhedron({"Cuboctahedron",
+                            "class_tooltip",
+                            {{"Length", "nm", "para_tooltip", 0, +INF, 0},
+                             {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                             {"HeightRatio", "nm", "para_tooltip", 0, +INF, 0},
+                             {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
+                           P),
+      m_length(m_P[0]), m_height(m_P[1]), m_height_ratio(m_P[2]), m_alpha(m_P[3])
+{
+    onChange();
+}
+
 FormFactorCuboctahedron::FormFactorCuboctahedron(double length, double height, double height_ratio,
                                                  double alpha)
-    : FormFactorPolyhedron(), m_length(length), m_height(height), m_height_ratio(height_ratio),
-      m_alpha(alpha)
+    : FormFactorCuboctahedron(std::vector<double>{length, height, height_ratio, alpha})
 {
-    setName("Cuboctahedron");
-    registerParameter("Length", &m_length).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
-    registerParameter("HeightRatio", &m_height_ratio).setUnit("nm").setNonnegative();
-    registerParameter("Alpha", &m_alpha).setUnit("rad").setLimited(0., M_PI_2);
-    onChange();
 }
 
 IFormFactor* FormFactorCuboctahedron::sliceFormFactor(ZLimits limits, const IRotation& rot,
diff --git a/Core/HardParticle/FormFactorCuboctahedron.h b/Core/HardParticle/FormFactorCuboctahedron.h
index cdc59c649cd..02da5d79440 100644
--- a/Core/HardParticle/FormFactorCuboctahedron.h
+++ b/Core/HardParticle/FormFactorCuboctahedron.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorCuboctahedron : public FormFactorPolyhedron
 {
 public:
+    FormFactorCuboctahedron(const std::vector<double> P);
     FormFactorCuboctahedron(double length, double height, double height_ratio, double alpha);
 
     FormFactorCuboctahedron* clone() const override final
@@ -45,10 +46,10 @@ protected:
 private:
     static const PolyhedralTopology topology;
 
-    double m_length;
-    double m_height;
-    double m_height_ratio;
-    double m_alpha;
+    const double& m_length;
+    const double& m_height;
+    const double& m_height_ratio;
+    const double& m_alpha;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORCUBOCTAHEDRON_H
diff --git a/Core/HardParticle/FormFactorCylinder.cpp b/Core/HardParticle/FormFactorCylinder.cpp
index a4a4117acd8..b9a55789176 100644
--- a/Core/HardParticle/FormFactorCylinder.cpp
+++ b/Core/HardParticle/FormFactorCylinder.cpp
@@ -14,22 +14,28 @@
 
 #include "Core/HardParticle/FormFactorCylinder.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/DoubleEllipse.h"
 #include "Core/Tools/MathFunctions.h"
 
 //! Constructor of a cylinder with a circular base.
 //! @param radius: radius of the circular base in nanometers
 //! @param height: height of the cylinder in nanometers
-FormFactorCylinder::FormFactorCylinder(double radius, double height)
-    : m_radius(radius), m_height(height)
+FormFactorCylinder::FormFactorCylinder(const std::vector<double> P)
+    : IFormFactorBorn({"Cylinder",
+                       "class_tooltip",
+                       {{"Radius", "nm", "para_tooltip", 0, +INF, 0},
+                        {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
+                      P),
+      m_radius(m_P[0]), m_height(m_P[1])
 {
-    setName("Cylinder");
-    registerParameter("Radius", &m_radius).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorCylinder::FormFactorCylinder(double radius, double height)
+    : FormFactorCylinder(std::vector<double>{radius, height})
+{
+}
+
 complex_t FormFactorCylinder::evaluate_for_q(cvector_t q) const
 {
     double R = m_radius;
diff --git a/Core/HardParticle/FormFactorCylinder.h b/Core/HardParticle/FormFactorCylinder.h
index 0715d29c6c2..d1d07f5b110 100644
--- a/Core/HardParticle/FormFactorCylinder.h
+++ b/Core/HardParticle/FormFactorCylinder.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorCylinder : public IFormFactorBorn
 {
 public:
+    FormFactorCylinder(const std::vector<double> P);
     FormFactorCylinder(double radius, double height);
 
     FormFactorCylinder* clone() const override final
@@ -45,8 +46,8 @@ protected:
     void onChange() override final;
 
 private:
-    double m_radius;
-    double m_height;
+    const double& m_radius;
+    const double& m_height;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORCYLINDER_H
diff --git a/Core/HardParticle/FormFactorDodecahedron.cpp b/Core/HardParticle/FormFactorDodecahedron.cpp
index f52f3d13eb4..cdd2e323e00 100644
--- a/Core/HardParticle/FormFactorDodecahedron.cpp
+++ b/Core/HardParticle/FormFactorDodecahedron.cpp
@@ -13,7 +13,6 @@
 // ************************************************************************** //
 
 #include "Core/HardParticle/FormFactorDodecahedron.h"
-#include "Core/Parametrization/RealParameter.h"
 
 const PolyhedralTopology FormFactorDodecahedron::topology = {{// bottom:
                                                               {{0, 4, 3, 2, 1}, false},
@@ -35,13 +34,19 @@ const PolyhedralTopology FormFactorDodecahedron::topology = {{// bottom:
 
 //! Constructor of a dodecahedron.
 //! @param edge: length of the edge in nanometers
-FormFactorDodecahedron::FormFactorDodecahedron(double edge) : FormFactorPolyhedron(), m_edge(edge)
+FormFactorDodecahedron::FormFactorDodecahedron(const std::vector<double> P)
+    : FormFactorPolyhedron(
+        {"Dodecahedron", "class_tooltip", {{"Edge", "nm", "para_tooltip", 0, +INF, 0}}}, P),
+      m_edge(m_P[0])
 {
-    setName("Dodecahedron");
-    registerParameter("Edge", &m_edge).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorDodecahedron::FormFactorDodecahedron(double edge)
+    : FormFactorDodecahedron(std::vector<double>{edge})
+{
+}
+
 void FormFactorDodecahedron::onChange()
 {
     double a = m_edge;
diff --git a/Core/HardParticle/FormFactorDodecahedron.h b/Core/HardParticle/FormFactorDodecahedron.h
index 4514bceb105..aca1951bbb4 100644
--- a/Core/HardParticle/FormFactorDodecahedron.h
+++ b/Core/HardParticle/FormFactorDodecahedron.h
@@ -25,6 +25,7 @@ class BA_CORE_API_ FormFactorDodecahedron : public FormFactorPolyhedron
 public:
     //! @brief Constructs a regular dodecahedron
     //! @param edge length
+    FormFactorDodecahedron(const std::vector<double> P);
     FormFactorDodecahedron(double edge);
 
     FormFactorDodecahedron* clone() const override final
@@ -40,7 +41,7 @@ protected:
 
 private:
     static const PolyhedralTopology topology;
-    double m_edge;
+    const double& m_edge;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORDODECAHEDRON_H
diff --git a/Core/HardParticle/FormFactorDot.cpp b/Core/HardParticle/FormFactorDot.cpp
index 6a262be85d7..eeb1a40a34b 100644
--- a/Core/HardParticle/FormFactorDot.cpp
+++ b/Core/HardParticle/FormFactorDot.cpp
@@ -13,17 +13,18 @@
 // ************************************************************************** //
 
 #include "Core/HardParticle/FormFactorDot.h"
-#include "Core/Parametrization/RealParameter.h"
 
 //! Constructor.
 //! @param rscat: radius of a sphere with same forward scattering power, in nanometers
-FormFactorDot::FormFactorDot(double radius) : m_radius(radius)
+FormFactorDot::FormFactorDot(const std::vector<double> P)
+    : IFormFactorBorn({"Dot", "class_tooltip", {{"Radius", "nm", "para_tooltip", 0, +INF, 0}}}, P),
+      m_radius(m_P[0])
 {
-    setName("Dot");
-    registerParameter("Radius", &m_radius).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorDot::FormFactorDot(double radius) : FormFactorDot(std::vector<double>{radius}) {}
+
 complex_t FormFactorDot::evaluate_for_q(cvector_t) const
 {
     return 4 * M_PI / 3 * pow(m_radius, 3);
diff --git a/Core/HardParticle/FormFactorDot.h b/Core/HardParticle/FormFactorDot.h
index 828c2532ed9..99f16ec1060 100644
--- a/Core/HardParticle/FormFactorDot.h
+++ b/Core/HardParticle/FormFactorDot.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorDot : public IFormFactorBorn
 {
 public:
+    FormFactorDot(const std::vector<double> P);
     FormFactorDot(double radius);
 
     FormFactorDot* clone() const override final { return new FormFactorDot(m_radius); }
@@ -41,7 +42,7 @@ protected:
     bool canSliceAnalytically(const IRotation&) const override final { return false; }
 
 private:
-    double m_radius;
+    const double& m_radius;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORDOT_H
diff --git a/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp b/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp
index b74cd93288e..93bcbd70e54 100644
--- a/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp
+++ b/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp
@@ -14,7 +14,6 @@
 
 #include "Core/HardParticle/FormFactorEllipsoidalCylinder.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/DoubleEllipse.h"
 #include "Core/Tools/MathFunctions.h"
 
@@ -22,15 +21,22 @@
 //! @param radius_x: radius of the ellipse base in the x-direction, in nanometers
 //! @param radius_y: radius of the ellipse base in the y-direction, in nanometers
 //! @param height: height of the ellipsoidal cylinder in nanometers
+FormFactorEllipsoidalCylinder::FormFactorEllipsoidalCylinder(const std::vector<double> P)
+    : IFormFactorBorn({"EllipsoidalCylinder",
+                       "class_tooltip",
+                       {{"RadiusX", "nm", "para_tooltip", 0, +INF, 0},
+                        {"RadiusY", "nm", "para_tooltip", 0, +INF, 0},
+                        {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
+                      P),
+      m_radius_x(m_P[0]), m_radius_y(m_P[1]), m_height(m_P[2])
+{
+    onChange();
+}
+
 FormFactorEllipsoidalCylinder::FormFactorEllipsoidalCylinder(double radius_x, double radius_y,
                                                              double height)
-    : m_radius_x(radius_x), m_radius_y(radius_y), m_height(height)
+    : FormFactorEllipsoidalCylinder(std::vector<double>{radius_x, radius_y, height})
 {
-    setName("EllipsoidalCylinder");
-    registerParameter("RadiusX", &m_radius_x).setUnit("nm").setNonnegative();
-    registerParameter("RadiusY", &m_radius_y).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
-    onChange();
 }
 
 double FormFactorEllipsoidalCylinder::radialExtension() const
diff --git a/Core/HardParticle/FormFactorEllipsoidalCylinder.h b/Core/HardParticle/FormFactorEllipsoidalCylinder.h
index ef2686fe7ac..910a2027077 100644
--- a/Core/HardParticle/FormFactorEllipsoidalCylinder.h
+++ b/Core/HardParticle/FormFactorEllipsoidalCylinder.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorEllipsoidalCylinder : public IFormFactorBorn
 {
 public:
+    FormFactorEllipsoidalCylinder(const std::vector<double> P);
     FormFactorEllipsoidalCylinder(double radius_x, double radius_y, double height);
 
     FormFactorEllipsoidalCylinder* clone() const override final
@@ -46,9 +47,9 @@ protected:
     void onChange() override final;
 
 private:
-    double m_radius_x;
-    double m_radius_y;
-    double m_height;
+    const double& m_radius_x;
+    const double& m_radius_y;
+    const double& m_height;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORELLIPSOIDALCYLINDER_H
diff --git a/Core/HardParticle/FormFactorFullSphere.cpp b/Core/HardParticle/FormFactorFullSphere.cpp
index 9d0a731646f..4f584f548f3 100644
--- a/Core/HardParticle/FormFactorFullSphere.cpp
+++ b/Core/HardParticle/FormFactorFullSphere.cpp
@@ -15,21 +15,25 @@
 #include "Core/HardParticle/FormFactorFullSphere.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/HardParticle/FormFactorTruncatedSphere.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Particle/FormFactorWeighted.h"
 #include "Core/Scattering/Rotations.h"
 #include "Core/Vector/SomeFormFactors.h"
 
 //! Constructor of a full sphere.
 //! @param radius: radius of the sphere in nanometers
-FormFactorFullSphere::FormFactorFullSphere(double radius, bool position_at_center)
-    : m_radius(radius), m_position_at_center(position_at_center)
+FormFactorFullSphere::FormFactorFullSphere(const std::vector<double> P, bool position_at_center)
+    : IFormFactorBorn(
+        {"FullSphere", "class_tooltip", {{"Radius", "nm", "para_tooltip", 0, +INF, 0}}}, P),
+      m_radius(m_P[0]), m_position_at_center(position_at_center)
 {
-    setName("FullSphere");
-    registerParameter("Radius", &m_radius).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorFullSphere::FormFactorFullSphere(double radius, bool position_at_center)
+    : FormFactorFullSphere(std::vector<double>{radius}, position_at_center)
+{
+}
+
 double FormFactorFullSphere::bottomZ(const IRotation& rotation) const
 {
     if (m_position_at_center)
diff --git a/Core/HardParticle/FormFactorFullSphere.h b/Core/HardParticle/FormFactorFullSphere.h
index b8fc57b2aa9..eced2bd2f9f 100644
--- a/Core/HardParticle/FormFactorFullSphere.h
+++ b/Core/HardParticle/FormFactorFullSphere.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorFullSphere : public IFormFactorBorn
 {
 public:
+    FormFactorFullSphere(const std::vector<double> P, bool position_at_center = false);
     FormFactorFullSphere(double radius, bool position_at_center = false);
 
     FormFactorFullSphere* clone() const override final
@@ -50,7 +51,7 @@ protected:
     void onChange() override final;
 
 private:
-    double m_radius;
+    const double& m_radius;
     bool m_position_at_center;
 };
 
diff --git a/Core/HardParticle/FormFactorFullSpheroid.cpp b/Core/HardParticle/FormFactorFullSpheroid.cpp
index 97e7b9f1f6d..6a189c842bd 100644
--- a/Core/HardParticle/FormFactorFullSpheroid.cpp
+++ b/Core/HardParticle/FormFactorFullSpheroid.cpp
@@ -15,7 +15,6 @@
 #include "Core/HardParticle/FormFactorFullSpheroid.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/HardParticle/FormFactorTruncatedSpheroid.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/TruncatedEllipsoid.h"
 #include "Core/Tools/MathFunctions.h"
 #include <limits>
@@ -23,15 +22,22 @@
 //! Constructor of full spheroid.
 //! @param radius: radius of the circular cross section in nanometers
 //! @param height: height of the full spheroid in nanometers
-FormFactorFullSpheroid::FormFactorFullSpheroid(double radius, double height)
-    : m_radius(radius), m_height(height)
+FormFactorFullSpheroid::FormFactorFullSpheroid(const std::vector<double> P)
+    : IFormFactorBorn({"FullSpheroid",
+                       "class_tooltip",
+                       {{"Radius", "nm", "para_tooltip", 0, +INF, 0},
+                        {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
+                      P),
+      m_radius(m_P[0]), m_height(m_P[1])
 {
-    setName("FullSpheroid");
-    registerParameter("Radius", &m_radius).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorFullSpheroid::FormFactorFullSpheroid(double radius, double height)
+    : FormFactorFullSpheroid(std::vector<double>{radius, height})
+{
+}
+
 complex_t FormFactorFullSpheroid::evaluate_for_q(cvector_t q) const
 {
     double h = m_height / 2;
diff --git a/Core/HardParticle/FormFactorFullSpheroid.h b/Core/HardParticle/FormFactorFullSpheroid.h
index 3aaa87f1c51..18afd0b5ffa 100644
--- a/Core/HardParticle/FormFactorFullSpheroid.h
+++ b/Core/HardParticle/FormFactorFullSpheroid.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorFullSpheroid : public IFormFactorBorn
 {
 public:
+    FormFactorFullSpheroid(const std::vector<double> P);
     FormFactorFullSpheroid(double radius, double height);
 
     FormFactorFullSpheroid* clone() const override final
@@ -45,8 +46,8 @@ protected:
     void onChange() override final;
 
 private:
-    double m_radius;
-    double m_height;
+    const double& m_radius;
+    const double& m_height;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORFULLSPHEROID_H
diff --git a/Core/HardParticle/FormFactorHemiEllipsoid.cpp b/Core/HardParticle/FormFactorHemiEllipsoid.cpp
index d486dc99de1..49875b55019 100644
--- a/Core/HardParticle/FormFactorHemiEllipsoid.cpp
+++ b/Core/HardParticle/FormFactorHemiEllipsoid.cpp
@@ -14,7 +14,6 @@
 
 #include "Core/HardParticle/FormFactorHemiEllipsoid.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/TruncatedEllipsoid.h"
 #include "Core/Tools/MathFunctions.h"
 #include <limits>
@@ -23,16 +22,23 @@
 //! @param radius_x: radius of the ellipse base in the x-direction, in nanometers
 //! @param radius_y: radius of the ellipse base in the y-direction, in nanometers
 //! @param height: height of the hemi ellipsoid in nanometers
-FormFactorHemiEllipsoid::FormFactorHemiEllipsoid(double radius_x, double radius_y, double height)
-    : m_radius_x(radius_x), m_radius_y(radius_y), m_height(height)
+FormFactorHemiEllipsoid::FormFactorHemiEllipsoid(const std::vector<double> P)
+    : IFormFactorBorn({"HemiEllipsoid",
+                       "class_tooltip",
+                       {{"RadiusX", "nm", "para_tooltip", 0, +INF, 0},
+                        {"RadiusY", "nm", "para_tooltip", 0, +INF, 0},
+                        {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
+                      P),
+      m_radius_x(m_P[0]), m_radius_y(m_P[1]), m_height(m_P[2])
 {
-    setName("HemiEllipsoid");
-    registerParameter("RadiusX", &m_radius_x).setUnit("nm").setNonnegative();
-    registerParameter("RadiusY", &m_radius_y).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorHemiEllipsoid::FormFactorHemiEllipsoid(double radius_x, double radius_y, double height)
+    : FormFactorHemiEllipsoid(std::vector<double>{radius_x, radius_y, height})
+{
+}
+
 double FormFactorHemiEllipsoid::radialExtension() const
 {
     return (m_radius_x + m_radius_y) / 2.0;
diff --git a/Core/HardParticle/FormFactorHemiEllipsoid.h b/Core/HardParticle/FormFactorHemiEllipsoid.h
index 4ba53c9f4d7..e3fdaef86a8 100644
--- a/Core/HardParticle/FormFactorHemiEllipsoid.h
+++ b/Core/HardParticle/FormFactorHemiEllipsoid.h
@@ -25,6 +25,7 @@
 class BA_CORE_API_ FormFactorHemiEllipsoid : public IFormFactorBorn
 {
 public:
+    FormFactorHemiEllipsoid(const std::vector<double> P);
     FormFactorHemiEllipsoid(double radius_x, double radius_y, double height);
     virtual ~FormFactorHemiEllipsoid() {}
 
@@ -48,9 +49,9 @@ protected:
 private:
     complex_t Integrand(double Z) const;
 
-    double m_radius_x;
-    double m_radius_y;
-    double m_height;
+    const double& m_radius_x;
+    const double& m_radius_y;
+    const double& m_height;
     mutable cvector_t m_q;
     mutable ComplexIntegrator m_integrator;
 };
diff --git a/Core/HardParticle/FormFactorHollowSphere.cpp b/Core/HardParticle/FormFactorHollowSphere.cpp
index 2ceb443c9ec..0ecb1c8c14b 100644
--- a/Core/HardParticle/FormFactorHollowSphere.cpp
+++ b/Core/HardParticle/FormFactorHollowSphere.cpp
@@ -15,23 +15,29 @@
 #include "Core/HardParticle/FormFactorHollowSphere.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/TruncatedEllipsoid.h"
 #include <limits>
 
-FormFactorHollowSphere::FormFactorHollowSphere(double mean, double full_width)
-    : m_mean(mean), m_full_width(full_width)
+FormFactorHollowSphere::FormFactorHollowSphere(const std::vector<double> P)
+    : IFormFactorBorn({"FormFactorHollowSphere",
+                       "class_tooltip",
+                       {{"MeanRadius", "nm", "para_tooltip", 0, +INF, 0},
+                        {"FullWidth", "nm", "para_tooltip", 0, +INF, 0}}},
+                      P),
+      m_mean(m_P[0]), m_full_width(m_P[1])
 {
     if (!checkParameters())
         throw Exceptions::ClassInitializationException(
             "FormFactorHollowSphere::FormFactorHollowSphere:"
             " mean radius must be bigger than the half width");
-    setName("FormFactorHollowSphere");
-    registerParameter("MeanRadius", &m_mean).setUnit("nm").setNonnegative();
-    registerParameter("FullWidth", &m_full_width).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorHollowSphere::FormFactorHollowSphere(double mean, double full_width)
+    : FormFactorHollowSphere(std::vector<double>{mean, full_width})
+{
+}
+
 complex_t FormFactorHollowSphere::evaluate_for_q(cvector_t q) const
 {
     double R = m_mean;
diff --git a/Core/HardParticle/FormFactorHollowSphere.h b/Core/HardParticle/FormFactorHollowSphere.h
index 74d042cdfbe..d08ceb7f05f 100644
--- a/Core/HardParticle/FormFactorHollowSphere.h
+++ b/Core/HardParticle/FormFactorHollowSphere.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorHollowSphere : public IFormFactorBorn
 {
 public:
+    FormFactorHollowSphere(const std::vector<double> P);
     FormFactorHollowSphere(double mean, double full_width);
 
     FormFactorHollowSphere* clone() const override final
@@ -40,8 +41,8 @@ protected:
 
 private:
     bool checkParameters() const;
-    double m_mean;       //!< This is the mean radius
-    double m_full_width; //!< This is the full width of the radius distribution
+    const double& m_mean;       //!< This is the mean radius
+    const double& m_full_width; //!< This is the full width of the radius distribution
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORHOLLOWSPHERE_H
diff --git a/Core/HardParticle/FormFactorIcosahedron.cpp b/Core/HardParticle/FormFactorIcosahedron.cpp
index 0924286442e..1055d6facb4 100644
--- a/Core/HardParticle/FormFactorIcosahedron.cpp
+++ b/Core/HardParticle/FormFactorIcosahedron.cpp
@@ -13,7 +13,6 @@
 // ************************************************************************** //
 
 #include "Core/HardParticle/FormFactorIcosahedron.h"
-#include "Core/Parametrization/RealParameter.h"
 
 const PolyhedralTopology FormFactorIcosahedron::topology = {{// bottom:
                                                              {{0, 2, 1}, false},
@@ -45,13 +44,19 @@ const PolyhedralTopology FormFactorIcosahedron::topology = {{// bottom:
 
 //! Constructor of a icosahedron.
 //! @param edge: length of the edge in nanometers
-FormFactorIcosahedron::FormFactorIcosahedron(double edge) : FormFactorPolyhedron(), m_edge(edge)
+FormFactorIcosahedron::FormFactorIcosahedron(const std::vector<double> P)
+    : FormFactorPolyhedron(
+        {"Icosahedron", "class_tooltip", {{"Edge", "nm", "para_tooltip", 0, +INF, 0}}}, P),
+      m_edge(m_P[0])
 {
-    setName("Icosahedron");
-    registerParameter("Edge", &m_edge).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorIcosahedron::FormFactorIcosahedron(double edge)
+    : FormFactorIcosahedron(std::vector<double>{edge})
+{
+}
+
 void FormFactorIcosahedron::onChange()
 {
     double a = m_edge;
diff --git a/Core/HardParticle/FormFactorIcosahedron.h b/Core/HardParticle/FormFactorIcosahedron.h
index 0b2a1eb1016..700ef15004c 100644
--- a/Core/HardParticle/FormFactorIcosahedron.h
+++ b/Core/HardParticle/FormFactorIcosahedron.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorIcosahedron : public FormFactorPolyhedron
 {
 public:
+    FormFactorIcosahedron(const std::vector<double> P);
     FormFactorIcosahedron(double edge);
 
     FormFactorIcosahedron* clone() const override final
@@ -38,7 +39,7 @@ protected:
 
 private:
     static const PolyhedralTopology topology;
-    double m_edge;
+    const double& m_edge;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORICOSAHEDRON_H
diff --git a/Core/HardParticle/FormFactorLongBoxGauss.cpp b/Core/HardParticle/FormFactorLongBoxGauss.cpp
index fdb9a45d9bd..ff9156a6ce5 100644
--- a/Core/HardParticle/FormFactorLongBoxGauss.cpp
+++ b/Core/HardParticle/FormFactorLongBoxGauss.cpp
@@ -13,20 +13,26 @@
 // ************************************************************************** //
 
 #include "Core/HardParticle/FormFactorLongBoxGauss.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/Box.h"
 #include "Core/Tools/MathFunctions.h"
 
-FormFactorLongBoxGauss::FormFactorLongBoxGauss(double length, double width, double height)
-    : m_length(length), m_width(width), m_height(height)
+FormFactorLongBoxGauss::FormFactorLongBoxGauss(const std::vector<double> P)
+    : IFormFactorBorn({"FormFactorLongBoxGauss",
+                       "class_tooltip",
+                       {{"Length", "nm", "para_tooltip", 0, +INF, 0},
+                        {"Width", "nm", "para_tooltip", 0, +INF, 0},
+                        {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
+                      P),
+      m_length(m_P[0]), m_width(m_P[1]), m_height(m_P[2])
 {
-    setName("FormFactorLongBoxGauss");
-    registerParameter("Length", &m_length).setUnit("nm").setNonnegative();
-    registerParameter("Width", &m_width).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorLongBoxGauss::FormFactorLongBoxGauss(double length, double width, double height)
+    : FormFactorLongBoxGauss(std::vector<double>{length, width, height})
+{
+}
+
 complex_t FormFactorLongBoxGauss::evaluate_for_q(cvector_t q) const
 {
     complex_t qxL2 = std::pow(m_length * q.x(), 2) / 2.0;
diff --git a/Core/HardParticle/FormFactorLongBoxGauss.h b/Core/HardParticle/FormFactorLongBoxGauss.h
index 4563904e737..a1e74f842a2 100644
--- a/Core/HardParticle/FormFactorLongBoxGauss.h
+++ b/Core/HardParticle/FormFactorLongBoxGauss.h
@@ -27,6 +27,7 @@ public:
     //! @param length of Box's base
     //! @param width of Box's base
     //! @param height of Box
+    FormFactorLongBoxGauss(const std::vector<double> P);
     FormFactorLongBoxGauss(double length, double width, double height);
 
     FormFactorLongBoxGauss* clone() const override final
@@ -49,9 +50,9 @@ protected:
     void onChange() override final;
 
 private:
-    double m_length;
-    double m_width;
-    double m_height;
+    const double& m_length;
+    const double& m_width;
+    const double& m_height;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORLONGBOXGAUSS_H
diff --git a/Core/HardParticle/FormFactorLongBoxLorentz.cpp b/Core/HardParticle/FormFactorLongBoxLorentz.cpp
index d241e7a2ef4..637fce0db51 100644
--- a/Core/HardParticle/FormFactorLongBoxLorentz.cpp
+++ b/Core/HardParticle/FormFactorLongBoxLorentz.cpp
@@ -13,20 +13,26 @@
 // ************************************************************************** //
 
 #include "Core/HardParticle/FormFactorLongBoxLorentz.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/Box.h"
 #include "Core/Tools/MathFunctions.h"
 
-FormFactorLongBoxLorentz::FormFactorLongBoxLorentz(double length, double width, double height)
-    : m_length(length), m_width(width), m_height(height)
+FormFactorLongBoxLorentz::FormFactorLongBoxLorentz(const std::vector<double> P)
+    : IFormFactorBorn({"FormFactorLongBoxLorentz",
+                       "class_tooltip",
+                       {{"Length", "nm", "para_tooltip", 0, +INF, 0},
+                        {"Width", "nm", "para_tooltip", 0, +INF, 0},
+                        {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
+                      P),
+      m_length(m_P[0]), m_width(m_P[1]), m_height(m_P[2])
 {
-    setName("FormFactorLongBoxLorentz");
-    registerParameter("Length", &m_length).setUnit("nm").setNonnegative();
-    registerParameter("Width", &m_width).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorLongBoxLorentz::FormFactorLongBoxLorentz(double length, double width, double height)
+    : FormFactorLongBoxLorentz(std::vector<double>{length, width, height})
+{
+}
+
 complex_t FormFactorLongBoxLorentz::evaluate_for_q(cvector_t q) const
 {
     complex_t qxL2 = 2.5 * std::pow(m_length * q.x(), 2);
diff --git a/Core/HardParticle/FormFactorLongBoxLorentz.h b/Core/HardParticle/FormFactorLongBoxLorentz.h
index 8dd811bec65..b36a799eed5 100644
--- a/Core/HardParticle/FormFactorLongBoxLorentz.h
+++ b/Core/HardParticle/FormFactorLongBoxLorentz.h
@@ -27,6 +27,7 @@ public:
     //! @param length of Box's base
     //! @param width of Box's base
     //! @param height of Box
+    FormFactorLongBoxLorentz(const std::vector<double> P);
     FormFactorLongBoxLorentz(double length, double width, double height);
 
     FormFactorLongBoxLorentz* clone() const override final
@@ -50,9 +51,9 @@ protected:
     void onChange() override final;
 
 private:
-    double m_length;
-    double m_width;
-    double m_height;
+    const double& m_length;
+    const double& m_width;
+    const double& m_height;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORLONGBOXLORENTZ_H
diff --git a/Core/HardParticle/FormFactorPrism3.cpp b/Core/HardParticle/FormFactorPrism3.cpp
index 706af8009d1..87460604614 100644
--- a/Core/HardParticle/FormFactorPrism3.cpp
+++ b/Core/HardParticle/FormFactorPrism3.cpp
@@ -13,21 +13,27 @@
 // ************************************************************************** //
 
 #include "Core/HardParticle/FormFactorPrism3.h"
-#include "Core/Parametrization/RealParameter.h"
 #include <iostream>
 
 //! Constructor of a prism with an equilaterial triangle base.
 //! @param base_edge: length of the base edge in nanometers
 //! @param height: height in nanometers
-FormFactorPrism3::FormFactorPrism3(double base_edge, double height)
-    : m_base_edge(base_edge), m_height(height)
+FormFactorPrism3::FormFactorPrism3(const std::vector<double> P)
+    : FormFactorPolygonalPrism({"Prism3",
+                                "class_tooltip",
+                                {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
+                                 {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
+                               P),
+      m_base_edge(m_P[0]), m_height(m_P[1])
 {
-    setName("Prism3");
-    registerParameter("BaseEdge", &m_base_edge).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorPrism3::FormFactorPrism3(double base_edge, double height)
+    : FormFactorPrism3(std::vector<double>{base_edge, height})
+{
+}
+
 IFormFactor* FormFactorPrism3::sliceFormFactor(ZLimits limits, const IRotation& rot,
                                                kvector_t translation) const
 {
diff --git a/Core/HardParticle/FormFactorPrism3.h b/Core/HardParticle/FormFactorPrism3.h
index e986f667b0d..15a8841f187 100644
--- a/Core/HardParticle/FormFactorPrism3.h
+++ b/Core/HardParticle/FormFactorPrism3.h
@@ -22,6 +22,7 @@
 class BA_CORE_API_ FormFactorPrism3 : public FormFactorPolygonalPrism
 {
 public:
+    FormFactorPrism3(const std::vector<double> P);
     FormFactorPrism3(double base_edge, double height);
 
     FormFactorPrism3* clone() const override final
@@ -40,8 +41,8 @@ protected:
     double height() const final { return m_height; }
 
 private:
-    double m_base_edge;
-    double m_height;
+    const double& m_base_edge;
+    const double& m_height;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORPRISM3_H
diff --git a/Core/HardParticle/FormFactorPrism6.cpp b/Core/HardParticle/FormFactorPrism6.cpp
index 4d090bd1801..ff5be1148ee 100644
--- a/Core/HardParticle/FormFactorPrism6.cpp
+++ b/Core/HardParticle/FormFactorPrism6.cpp
@@ -13,20 +13,26 @@
 // ************************************************************************** //
 
 #include "Core/HardParticle/FormFactorPrism6.h"
-#include "Core/Parametrization/RealParameter.h"
 
 //! Constructor of a prism with a regular hexagonal base.
 //! @param base_edge: length of the hexagonal base in nanometers
 //! @param height: height in nanometers
-FormFactorPrism6::FormFactorPrism6(double base_edge, double height)
-    : m_base_edge(base_edge), m_height(height)
+FormFactorPrism6::FormFactorPrism6(const std::vector<double> P)
+    : FormFactorPolygonalPrism({"Prism6",
+                                "class_tooltip",
+                                {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
+                                 {"Height", "nm", "para_tooltip", 0, +INF, 0}}},
+                               P),
+      m_base_edge(m_P[0]), m_height(m_P[1])
 {
-    setName("Prism6");
-    registerParameter("BaseEdge", &m_base_edge).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorPrism6::FormFactorPrism6(double base_edge, double height)
+    : FormFactorPrism6(std::vector<double>{base_edge, height})
+{
+}
+
 IFormFactor* FormFactorPrism6::sliceFormFactor(ZLimits limits, const IRotation& rot,
                                                kvector_t translation) const
 {
diff --git a/Core/HardParticle/FormFactorPrism6.h b/Core/HardParticle/FormFactorPrism6.h
index 111d07fae21..414669bf6d9 100644
--- a/Core/HardParticle/FormFactorPrism6.h
+++ b/Core/HardParticle/FormFactorPrism6.h
@@ -22,6 +22,7 @@
 class BA_CORE_API_ FormFactorPrism6 : public FormFactorPolygonalPrism
 {
 public:
+    FormFactorPrism6(const std::vector<double> P);
     FormFactorPrism6(double base_edge, double height);
 
     FormFactorPrism6* clone() const override final
@@ -40,8 +41,8 @@ protected:
     double height() const final { return m_height; }
 
 private:
-    double m_base_edge;
-    double m_height;
+    const double& m_base_edge;
+    const double& m_height;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORPRISM6_H
diff --git a/Core/HardParticle/FormFactorPyramid.cpp b/Core/HardParticle/FormFactorPyramid.cpp
index 629f6619dc4..b678a90dc2d 100644
--- a/Core/HardParticle/FormFactorPyramid.cpp
+++ b/Core/HardParticle/FormFactorPyramid.cpp
@@ -15,7 +15,6 @@
 #include "Core/HardParticle/FormFactorPyramid.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Tools/MathFunctions.h"
 
 const PolyhedralTopology FormFactorPyramid::topology = {{
@@ -32,16 +31,23 @@ const PolyhedralTopology FormFactorPyramid::topology = {{
 //! @param base_edge: length of the square base in nanometers
 //! @param height: height of the pyramid in nanometers
 //! @param alpha: dihedral angle between the base and a side face in radians
-FormFactorPyramid::FormFactorPyramid(double base_edge, double height, double alpha)
-    : FormFactorPolyhedron(), m_base_edge(base_edge), m_height(height), m_alpha(alpha)
+FormFactorPyramid::FormFactorPyramid(const std::vector<double> P)
+    : FormFactorPolyhedron({"Pyramid",
+                            "class_tooltip",
+                            {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
+                             {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                             {"Alpha", "rad", "para_tooltip", 0., M_PI, 0}}},
+                           P),
+      m_base_edge(m_P[0]), m_height(m_P[1]), m_alpha(m_P[2])
 {
-    setName("Pyramid");
-    registerParameter("BaseEdge", &m_base_edge).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
-    registerParameter("Alpha", &m_alpha).setUnit("rad").setLimited(0., M_PI);
     onChange();
 }
 
+FormFactorPyramid::FormFactorPyramid(double base_edge, double height, double alpha)
+    : FormFactorPyramid(std::vector<double>{base_edge, height, alpha})
+{
+}
+
 IFormFactor* FormFactorPyramid::sliceFormFactor(ZLimits limits, const IRotation& rot,
                                                 kvector_t translation) const
 {
diff --git a/Core/HardParticle/FormFactorPyramid.h b/Core/HardParticle/FormFactorPyramid.h
index 1581f5a2306..d0d86aed0ce 100644
--- a/Core/HardParticle/FormFactorPyramid.h
+++ b/Core/HardParticle/FormFactorPyramid.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorPyramid : public FormFactorPolyhedron
 {
 public:
+    FormFactorPyramid(const std::vector<double> P);
     FormFactorPyramid(double base_edge, double height, double alpha);
 
     FormFactorPyramid* clone() const override final
@@ -44,9 +45,9 @@ protected:
 private:
     static const PolyhedralTopology topology;
 
-    double m_base_edge;
-    double m_height;
-    double m_alpha;
+    const double& m_base_edge;
+    const double& m_height;
+    const double& m_alpha;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORPYRAMID_H
diff --git a/Core/HardParticle/FormFactorTetrahedron.cpp b/Core/HardParticle/FormFactorTetrahedron.cpp
index 598f6666b9d..7ab8ac407f7 100644
--- a/Core/HardParticle/FormFactorTetrahedron.cpp
+++ b/Core/HardParticle/FormFactorTetrahedron.cpp
@@ -15,7 +15,6 @@
 #include "Core/HardParticle/FormFactorTetrahedron.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Tools/MathFunctions.h"
 
 const PolyhedralTopology FormFactorTetrahedron::topology = {{{{2, 1, 0}, false},
@@ -29,16 +28,23 @@ const PolyhedralTopology FormFactorTetrahedron::topology = {{{{2, 1, 0}, false},
 //! @param base_edge: length of one edge of the equilateral triangular base in nanometers
 //! @param height: height of the tetrahedron in nanometers
 //! @param alpha: dihedral angle in radians between base and facet
-FormFactorTetrahedron::FormFactorTetrahedron(double base_edge, double height, double alpha)
-    : FormFactorPolyhedron(), m_base_edge(base_edge), m_height(height), m_alpha(alpha)
+FormFactorTetrahedron::FormFactorTetrahedron(const std::vector<double> P)
+    : FormFactorPolyhedron({"Tetrahedron",
+                            "class_tooltip",
+                            {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0},
+                             {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                             {"Alpha", "rad", "para_tooltip", 0., M_PI_2, 0}}},
+                           P),
+      m_base_edge(m_P[0]), m_height(m_P[1]), m_alpha(m_P[2])
 {
-    setName("Tetrahedron");
-    registerParameter("BaseEdge", &m_base_edge).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
-    registerParameter("Alpha", &m_alpha).setUnit("rad").setLimited(0., M_PI_2);
     onChange();
 }
 
+FormFactorTetrahedron::FormFactorTetrahedron(double base_edge, double height, double alpha)
+    : FormFactorTetrahedron(std::vector<double>{base_edge, height, alpha})
+{
+}
+
 IFormFactor* FormFactorTetrahedron::sliceFormFactor(ZLimits limits, const IRotation& rot,
                                                     kvector_t translation) const
 {
diff --git a/Core/HardParticle/FormFactorTetrahedron.h b/Core/HardParticle/FormFactorTetrahedron.h
index 3fca46b0aa5..22efd287629 100644
--- a/Core/HardParticle/FormFactorTetrahedron.h
+++ b/Core/HardParticle/FormFactorTetrahedron.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorTetrahedron : public FormFactorPolyhedron
 {
 public:
+    FormFactorTetrahedron(const std::vector<double> P);
     FormFactorTetrahedron(double base_edge, double height, double alpha);
 
     FormFactorTetrahedron* clone() const override final
@@ -43,9 +44,9 @@ protected:
 
 private:
     static const PolyhedralTopology topology;
-    double m_base_edge;
-    double m_height;
-    double m_alpha;
+    const double& m_base_edge;
+    const double& m_height;
+    const double& m_alpha;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORTETRAHEDRON_H
diff --git a/Core/HardParticle/FormFactorTriangle.cpp b/Core/HardParticle/FormFactorTriangle.cpp
index b500fa3dea6..4d7f40b2f8c 100644
--- a/Core/HardParticle/FormFactorTriangle.cpp
+++ b/Core/HardParticle/FormFactorTriangle.cpp
@@ -13,16 +13,21 @@
 // ************************************************************************** //
 
 #include "Core/HardParticle/FormFactorTriangle.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Fit/Tools/RealLimits.h"
 
-FormFactorTriangle::FormFactorTriangle(double base_edge) : m_base_edge(base_edge)
+FormFactorTriangle::FormFactorTriangle(const std::vector<double> P)
+    : FormFactorPolygonalSurface(
+        {"Triangle", "class_tooltip", {{"BaseEdge", "nm", "para_tooltip", 0, +INF, 0}}}, P),
+      m_base_edge(m_P[0])
 {
-    setName("Triangle");
-    registerParameter("BaseEdge", &m_base_edge).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorTriangle::FormFactorTriangle(double base_edge)
+    : FormFactorTriangle(std::vector<double>{base_edge})
+{
+}
+
 void FormFactorTriangle::onChange()
 {
     double a = m_base_edge;
diff --git a/Core/HardParticle/FormFactorTriangle.h b/Core/HardParticle/FormFactorTriangle.h
index 8166850ddd1..57aad06b3f7 100644
--- a/Core/HardParticle/FormFactorTriangle.h
+++ b/Core/HardParticle/FormFactorTriangle.h
@@ -21,6 +21,7 @@
 class BA_CORE_API_ FormFactorTriangle : public FormFactorPolygonalSurface
 {
 public:
+    FormFactorTriangle(const std::vector<double> P);
     FormFactorTriangle(double base_edge);
 
     FormFactorTriangle* clone() const override final { return new FormFactorTriangle(m_base_edge); }
@@ -32,7 +33,7 @@ protected:
     void onChange() override final;
 
 private:
-    double m_base_edge;
+    const double& m_base_edge;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORTRIANGLE_H
diff --git a/Core/HardParticle/FormFactorTruncatedCube.cpp b/Core/HardParticle/FormFactorTruncatedCube.cpp
index dc0ad976715..a5a9be8fdbf 100644
--- a/Core/HardParticle/FormFactorTruncatedCube.cpp
+++ b/Core/HardParticle/FormFactorTruncatedCube.cpp
@@ -14,7 +14,6 @@
 
 #include "Core/HardParticle/FormFactorTruncatedCube.h"
 #include "Core/Basics/Exceptions.h"
-#include "Core/Parametrization/RealParameter.h"
 
 const PolyhedralTopology FormFactorTruncatedCube::topology = {
     {{{0, 1, 7, 6, 9, 10, 4, 3}, true},
@@ -36,15 +35,22 @@ const PolyhedralTopology FormFactorTruncatedCube::topology = {
 //! Constructor of a truncated cube.
 //! @param length: length of the full cube's edge in nanometers
 //! @param removed_length: removed length from each edge of the cube in nanometers
-FormFactorTruncatedCube::FormFactorTruncatedCube(double length, double removed_length)
-    : FormFactorPolyhedron(), m_length(length), m_removed_length(removed_length)
+FormFactorTruncatedCube::FormFactorTruncatedCube(const std::vector<double> P)
+    : FormFactorPolyhedron({"TruncatedCube",
+                            "class_tooltip",
+                            {{"Length", "nm", "para_tooltip", 0, +INF, 0},
+                             {"RemovedLength", "nm", "para_tooltip", 0, +INF, 0}}},
+                           P),
+      m_length(m_P[0]), m_removed_length(m_P[1])
 {
-    setName("TruncatedCube");
-    registerParameter("Length", &m_length).setUnit("nm").setNonnegative();
-    registerParameter("RemovedLength", &m_removed_length).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorTruncatedCube::FormFactorTruncatedCube(double length, double removed_length)
+    : FormFactorTruncatedCube(std::vector<double>{length, removed_length})
+{
+}
+
 void FormFactorTruncatedCube::onChange()
 {
     if (m_removed_length > 0.5 * m_length) {
diff --git a/Core/HardParticle/FormFactorTruncatedCube.h b/Core/HardParticle/FormFactorTruncatedCube.h
index b643a6d2a71..8dc943c11b1 100644
--- a/Core/HardParticle/FormFactorTruncatedCube.h
+++ b/Core/HardParticle/FormFactorTruncatedCube.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorTruncatedCube : public FormFactorPolyhedron
 {
 public:
+    FormFactorTruncatedCube(const std::vector<double> P);
     FormFactorTruncatedCube(double length, double removed_length);
 
     FormFactorTruncatedCube* clone() const override final
@@ -39,8 +40,8 @@ protected:
 
 private:
     static const PolyhedralTopology topology;
-    double m_length;
-    double m_removed_length;
+    const double& m_length;
+    const double& m_removed_length;
 };
 
 #endif // BORNAGAIN_CORE_HARDPARTICLE_FORMFACTORTRUNCATEDCUBE_H
diff --git a/Core/HardParticle/FormFactorTruncatedSphere.cpp b/Core/HardParticle/FormFactorTruncatedSphere.cpp
index f88073f6267..a09bd3b4338 100644
--- a/Core/HardParticle/FormFactorTruncatedSphere.cpp
+++ b/Core/HardParticle/FormFactorTruncatedSphere.cpp
@@ -15,7 +15,6 @@
 #include "Core/HardParticle/FormFactorTruncatedSphere.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/TruncatedEllipsoid.h"
 #include "Core/Tools/MathFunctions.h"
 #include "Fit/Tools/RealLimits.h"
@@ -25,17 +24,24 @@
 //! @param radius: radius of the truncated sphere in nanometers
 //! @param height: height of the truncated sphere in nanometers
 //! @param dh: length of cup truncated from the top
-FormFactorTruncatedSphere::FormFactorTruncatedSphere(double radius, double height, double dh)
-    : m_radius(radius), m_height(height), m_dh(dh)
+FormFactorTruncatedSphere::FormFactorTruncatedSphere(const std::vector<double> P)
+    : IFormFactorBorn({"TruncatedSphere",
+                       "class_tooltip",
+                       {{"Radius", "nm", "para_tooltip", 0, +INF, 0},
+                        {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                        {"DeltaHeight", "nm", "para_tooltip", 0, +INF, 0}}},
+                      P),
+      m_radius(m_P[0]), m_height(m_P[1]), m_dh(m_P[2])
 {
-    setName("TruncatedSphere");
     check_initialization();
-    registerParameter("Radius", &m_radius).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
-    registerParameter("DeltaHeight", &m_dh).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorTruncatedSphere::FormFactorTruncatedSphere(double radius, double height, double dh)
+    : FormFactorTruncatedSphere(std::vector<double>{radius, height, dh})
+{
+}
+
 bool FormFactorTruncatedSphere::check_initialization() const
 {
     bool result(true);
diff --git a/Core/HardParticle/FormFactorTruncatedSphere.h b/Core/HardParticle/FormFactorTruncatedSphere.h
index 6cde82ddc69..a646b509347 100644
--- a/Core/HardParticle/FormFactorTruncatedSphere.h
+++ b/Core/HardParticle/FormFactorTruncatedSphere.h
@@ -24,6 +24,7 @@
 class BA_CORE_API_ FormFactorTruncatedSphere : public IFormFactorBorn
 {
 public:
+    FormFactorTruncatedSphere(const std::vector<double> P);
     FormFactorTruncatedSphere(double radius, double height, double dh);
 
     FormFactorTruncatedSphere* clone() const override final
@@ -50,9 +51,9 @@ private:
     bool check_initialization() const;
     complex_t Integrand(double Z) const;
 
-    double m_radius;
-    double m_height;
-    double m_dh;
+    const double& m_radius;
+    const double& m_height;
+    const double& m_dh;
     mutable cvector_t m_q;
     mutable ComplexIntegrator m_integrator;
 };
diff --git a/Core/HardParticle/FormFactorTruncatedSpheroid.cpp b/Core/HardParticle/FormFactorTruncatedSpheroid.cpp
index 56669674655..561b14d73cb 100644
--- a/Core/HardParticle/FormFactorTruncatedSpheroid.cpp
+++ b/Core/HardParticle/FormFactorTruncatedSpheroid.cpp
@@ -15,7 +15,6 @@
 #include "Core/HardParticle/FormFactorTruncatedSpheroid.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/TruncatedEllipsoid.h"
 #include "Core/Tools/MathFunctions.h"
 #include <limits>
@@ -25,19 +24,26 @@
 //! @param height: height of the truncated spheroid in nanometers
 //! @param height_flattening: ratio of the height of the corresponding full spheroid to its diameter
 //! @param dh: length of cup truncated from the top
-FormFactorTruncatedSpheroid::FormFactorTruncatedSpheroid(double radius, double height,
-                                                         double height_flattening, double dh)
-    : m_radius(radius), m_height(height), m_height_flattening(height_flattening), m_dh(dh)
+FormFactorTruncatedSpheroid::FormFactorTruncatedSpheroid(const std::vector<double> P)
+    : IFormFactorBorn({"TruncatedSpheroid",
+                       "class_tooltip",
+                       {{"Radius", "nm", "para_tooltip", 0, +INF, 0},
+                        {"Height", "nm", "para_tooltip", 0, +INF, 0},
+                        {"HeightFlattening", "", "para_tooltip", 0, +INF, 0},
+                        {"DeltaHeight", "nm", "para_tooltip", 0, +INF, 0}}},
+                      P),
+      m_radius(m_P[0]), m_height(m_P[1]), m_height_flattening(m_P[2]), m_dh(m_P[3])
 {
-    setName("TruncatedSpheroid");
     check_initialization();
-    registerParameter("Radius", &m_radius).setUnit("nm").setNonnegative();
-    registerParameter("Height", &m_height).setUnit("nm").setNonnegative();
-    registerParameter("HeightFlattening", &m_height_flattening).setNonnegative();
-    registerParameter("DeltaHeight", &m_dh).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorTruncatedSpheroid::FormFactorTruncatedSpheroid(double radius, double height,
+                                                         double height_flattening, double dh)
+    : FormFactorTruncatedSpheroid(std::vector<double>{radius, height, height_flattening, dh})
+{
+}
+
 bool FormFactorTruncatedSpheroid::check_initialization() const
 {
     bool result(true);
diff --git a/Core/HardParticle/FormFactorTruncatedSpheroid.h b/Core/HardParticle/FormFactorTruncatedSpheroid.h
index 60593bd86e6..7b3e449efe0 100644
--- a/Core/HardParticle/FormFactorTruncatedSpheroid.h
+++ b/Core/HardParticle/FormFactorTruncatedSpheroid.h
@@ -25,6 +25,7 @@
 class BA_CORE_API_ FormFactorTruncatedSpheroid : public IFormFactorBorn
 {
 public:
+    FormFactorTruncatedSpheroid(const std::vector<double> P);
     FormFactorTruncatedSpheroid(double radius, double height, double height_flattening, double dh);
 
     FormFactorTruncatedSpheroid* clone() const override final
@@ -52,10 +53,10 @@ private:
     bool check_initialization() const;
     complex_t Integrand(double Z) const;
 
-    double m_radius;
-    double m_height;
-    double m_height_flattening;
-    double m_dh;
+    const double& m_radius;
+    const double& m_height;
+    const double& m_height_flattening;
+    const double& m_dh;
     mutable cvector_t m_q;
     mutable ComplexIntegrator m_integrator;
 };
diff --git a/Core/SoftParticle/FormFactorGauss.cpp b/Core/SoftParticle/FormFactorGauss.cpp
index 8fd75c965c1..4405ef52be9 100644
--- a/Core/SoftParticle/FormFactorGauss.cpp
+++ b/Core/SoftParticle/FormFactorGauss.cpp
@@ -14,17 +14,24 @@
 
 #include "Core/SoftParticle/FormFactorGauss.h"
 #include "Core/Basics/MathConstants.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/Box.h"
 #include <limits>
 
-FormFactorGaussSphere::FormFactorGaussSphere(double mean_radius) : m_mean_radius(mean_radius)
+FormFactorGaussSphere::FormFactorGaussSphere(const std::vector<double> P)
+    : IFormFactorBorn({"FormFactorGaussSphere",
+                       "class_tooltip",
+                       {{"MeanRadius", "nm", "para_tooltip", 0, +INF, 0}}},
+                      P),
+      m_mean_radius(m_P[0])
 {
-    setName("FormFactorGaussSphere");
-    registerParameter("MeanRadius", &m_mean_radius).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorGaussSphere::FormFactorGaussSphere(double mean_radius)
+    : FormFactorGaussSphere(std::vector<double>{mean_radius})
+{
+}
+
 complex_t FormFactorGaussSphere::evaluate_for_q(cvector_t q) const
 {
     const double max_ql = std::sqrt(-4 * M_PI * std::log(std::numeric_limits<double>::min()) / 3);
diff --git a/Core/SoftParticle/FormFactorGauss.h b/Core/SoftParticle/FormFactorGauss.h
index 0c593529089..4986e74217f 100644
--- a/Core/SoftParticle/FormFactorGauss.h
+++ b/Core/SoftParticle/FormFactorGauss.h
@@ -23,6 +23,7 @@
 class BA_CORE_API_ FormFactorGaussSphere : public IFormFactorBorn
 {
 public:
+    FormFactorGaussSphere(const std::vector<double> P);
     FormFactorGaussSphere(double mean_radius);
 
     FormFactorGaussSphere* clone() const override final
@@ -41,7 +42,7 @@ protected:
     void onChange() override final{};
 
 private:
-    double m_mean_radius;
+    const double& m_mean_radius;
     void initialize();
 };
 
diff --git a/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp b/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp
index 1c4bfba80c5..cb128553f73 100644
--- a/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp
+++ b/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp
@@ -13,21 +13,27 @@
 // ************************************************************************** //
 
 #include "Core/SoftParticle/FormFactorSphereGaussianRadius.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/TruncatedEllipsoid.h"
 #include "Core/Vector/SomeFormFactors.h"
 #include "Fit/Tools/RealLimits.h"
 
-FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(double mean, double sigma)
-    : m_mean(mean), m_sigma(sigma), m_mean_r3(0.0)
+FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(const std::vector<double> P)
+    : IFormFactorBorn({"FormFactorSphereGaussianRadius",
+                       "class_tooltip",
+                       {{"MeanRadius", "nm", "para_tooltip", 0, +INF, 0},
+                        {"SigmaRadius", "nm", "para_tooltip", 0, +INF, 0}}},
+                      P),
+      m_mean(m_P[0]), m_sigma(m_P[1])
 {
-    setName("FormFactorSphereGaussianRadius");
     m_mean_r3 = calculateMeanR3();
-    registerParameter("MeanRadius", &m_mean).setUnit("nm").setNonnegative();
-    registerParameter("SigmaRadius", &m_sigma).setUnit("nm").setNonnegative();
     onChange();
 }
 
+FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(double mean, double sigma)
+    : FormFactorSphereGaussianRadius(std::vector<double>{mean, sigma})
+{
+}
+
 complex_t FormFactorSphereGaussianRadius::evaluate_for_q(cvector_t q) const
 {
     double q2 = std::norm(q.x()) + std::norm(q.y()) + std::norm(q.z());
diff --git a/Core/SoftParticle/FormFactorSphereGaussianRadius.h b/Core/SoftParticle/FormFactorSphereGaussianRadius.h
index bf84d66c293..da353e5124a 100644
--- a/Core/SoftParticle/FormFactorSphereGaussianRadius.h
+++ b/Core/SoftParticle/FormFactorSphereGaussianRadius.h
@@ -24,6 +24,7 @@
 class BA_CORE_API_ FormFactorSphereGaussianRadius : public IFormFactorBorn
 {
 public:
+    FormFactorSphereGaussianRadius(const std::vector<double> P);
     FormFactorSphereGaussianRadius(double mean, double sigma);
 
     FormFactorSphereGaussianRadius* clone() const override final
@@ -43,8 +44,8 @@ protected:
 private:
     double calculateMeanR3() const;
 
-    double m_mean; //!< This is the mean radius
-    double m_sigma;
+    const double& m_mean; //!< This is the mean radius
+    const double& m_sigma;
     double m_mean_r3; //!< This is the radius that gives the mean volume
 };
 
diff --git a/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp b/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp
index 5414a2f7202..dc1c459a57a 100644
--- a/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp
+++ b/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp
@@ -15,17 +15,18 @@
 #include "Core/SoftParticle/FormFactorSphereLogNormalRadius.h"
 #include "Core/Parametrization/Distributions.h"
 #include "Core/Parametrization/ParameterSample.h"
-#include "Core/Parametrization/RealParameter.h"
 #include "Core/Shapes/TruncatedEllipsoid.h"
 #include "Core/Vector/SomeFormFactors.h"
 
-FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(double mean, double scale_param,
+FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(const std::vector<double> P,
                                                                  size_t n_samples)
-    : m_mean(mean), m_scale_param(scale_param), m_n_samples(n_samples)
+    : IFormFactorBorn({"FormFactorSphereLogNormalRadius",
+                       "class_tooltip",
+                       {{"MeanRadius", "nm", "para_tooltip", 0, +INF, 0},
+                        {"ScaleParameter", "", "para_tooltip", -INF, +INF, 0}}},
+                      P),
+      m_mean(m_P[0]), m_scale_param(m_P[1]), m_n_samples(n_samples)
 {
-    setName("FormFactorSphereLogNormalRadius");
-    registerParameter("MeanRadius", &m_mean).setUnit("nm").setNonnegative();
-    registerParameter("ScaleParameter", &m_scale_param);
 
     DistributionLogNormal distri(m_mean, m_scale_param);
     m_radii.clear();
@@ -38,6 +39,12 @@ FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(double mean, do
     onChange();
 }
 
+FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(double mean, double scale_param,
+                                                                 size_t n_samples)
+    : FormFactorSphereLogNormalRadius(std::vector<double>{mean, scale_param}, n_samples)
+{
+}
+
 FormFactorSphereLogNormalRadius* FormFactorSphereLogNormalRadius::clone() const
 {
     return new FormFactorSphereLogNormalRadius(m_mean, m_scale_param, m_n_samples);
diff --git a/Core/SoftParticle/FormFactorSphereLogNormalRadius.h b/Core/SoftParticle/FormFactorSphereLogNormalRadius.h
index 8ed805408f9..7180b1ba347 100644
--- a/Core/SoftParticle/FormFactorSphereLogNormalRadius.h
+++ b/Core/SoftParticle/FormFactorSphereLogNormalRadius.h
@@ -25,6 +25,7 @@
 class BA_CORE_API_ FormFactorSphereLogNormalRadius : public IFormFactorBorn
 {
 public:
+    FormFactorSphereLogNormalRadius(const std::vector<double> P, size_t n_samples = 0);
     FormFactorSphereLogNormalRadius(double mean, double scale_param, size_t n_samples);
 
     FormFactorSphereLogNormalRadius* clone() const override final;
@@ -39,8 +40,8 @@ protected:
     void onChange() override final;
 
 private:
-    double m_mean;
-    double m_scale_param;
+    const double& m_mean;
+    const double& m_scale_param;
     size_t m_n_samples;
 
     std::vector<double> m_radii;
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index d1577477999..0802af03241 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -7178,8 +7178,8 @@ class DistributionTrapezoid(IDistribution1D):
 
     def __init__(self, *args):
         r"""
-        __init__(DistributionTrapezoid self, double center, double left, double middle, double right) -> DistributionTrapezoid
         __init__(DistributionTrapezoid self) -> DistributionTrapezoid
+        __init__(DistributionTrapezoid self, double center, double left, double middle, double right) -> DistributionTrapezoid
         DistributionTrapezoid::DistributionTrapezoid(double center, double left_width, double middle_width, double right_width)
 
         """
@@ -15289,8 +15289,9 @@ class FormFactorAnisoPyramid(FormFactorPolyhedron):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, length, width, height, alpha):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorAnisoPyramid self, vdouble1d_t P) -> FormFactorAnisoPyramid
         __init__(FormFactorAnisoPyramid self, double length, double width, double height, double alpha) -> FormFactorAnisoPyramid
         FormFactorAnisoPyramid::FormFactorAnisoPyramid(double length, double width, double height, double alpha)
 
@@ -15312,7 +15313,7 @@ class FormFactorAnisoPyramid(FormFactorPolyhedron):
         dihedral angle in radians between base and facet 
 
         """
-        _libBornAgainCore.FormFactorAnisoPyramid_swiginit(self, _libBornAgainCore.new_FormFactorAnisoPyramid(length, width, height, alpha))
+        _libBornAgainCore.FormFactorAnisoPyramid_swiginit(self, _libBornAgainCore.new_FormFactorAnisoPyramid(*args))
 
     def clone(self):
         r"""
@@ -15383,8 +15384,9 @@ class FormFactorBox(FormFactorPolygonalPrism):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, length, width, height):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorBox self, vdouble1d_t P) -> FormFactorBox
         __init__(FormFactorBox self, double length, double width, double height) -> FormFactorBox
         FormFactorBox::FormFactorBox(double length, double width, double height)
 
@@ -15403,7 +15405,7 @@ class FormFactorBox(FormFactorPolygonalPrism):
         height of the box in nanometers 
 
         """
-        _libBornAgainCore.FormFactorBox_swiginit(self, _libBornAgainCore.new_FormFactorBox(length, width, height))
+        _libBornAgainCore.FormFactorBox_swiginit(self, _libBornAgainCore.new_FormFactorBox(*args))
 
     def clone(self):
         r"""
@@ -15488,8 +15490,9 @@ class FormFactorCantellatedCube(FormFactorPolyhedron):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, length, removed_length):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorCantellatedCube self, vdouble1d_t P) -> FormFactorCantellatedCube
         __init__(FormFactorCantellatedCube self, double length, double removed_length) -> FormFactorCantellatedCube
         FormFactorCantellatedCube::FormFactorCantellatedCube(double length, double removed_length)
 
@@ -15505,7 +15508,7 @@ class FormFactorCantellatedCube(FormFactorPolyhedron):
         removed length from each edge of the cube in nanometers 
 
         """
-        _libBornAgainCore.FormFactorCantellatedCube_swiginit(self, _libBornAgainCore.new_FormFactorCantellatedCube(length, removed_length))
+        _libBornAgainCore.FormFactorCantellatedCube_swiginit(self, _libBornAgainCore.new_FormFactorCantellatedCube(*args))
 
     def clone(self):
         r"""
@@ -15560,8 +15563,9 @@ class FormFactorCone(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, radius, height, alpha):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorCone self, vdouble1d_t P) -> FormFactorCone
         __init__(FormFactorCone self, double radius, double height, double alpha) -> FormFactorCone
         FormFactorCone::FormFactorCone(double radius, double height, double alpha)
 
@@ -15580,7 +15584,7 @@ class FormFactorCone(IFormFactorBorn):
         angle between the base and the side surface in radians 
 
         """
-        _libBornAgainCore.FormFactorCone_swiginit(self, _libBornAgainCore.new_FormFactorCone(radius, height, alpha))
+        _libBornAgainCore.FormFactorCone_swiginit(self, _libBornAgainCore.new_FormFactorCone(*args))
 
     def clone(self):
         r"""
@@ -15663,8 +15667,9 @@ class FormFactorCone6(FormFactorPolyhedron):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, base_edge, height, alpha):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorCone6 self, vdouble1d_t P) -> FormFactorCone6
         __init__(FormFactorCone6 self, double base_edge, double height, double alpha) -> FormFactorCone6
         FormFactorCone6::FormFactorCone6(double base_edge, double height, double alpha)
 
@@ -15683,7 +15688,7 @@ class FormFactorCone6(FormFactorPolyhedron):
         dihedral angle in radians between base and facet 
 
         """
-        _libBornAgainCore.FormFactorCone6_swiginit(self, _libBornAgainCore.new_FormFactorCone6(base_edge, height, alpha))
+        _libBornAgainCore.FormFactorCone6_swiginit(self, _libBornAgainCore.new_FormFactorCone6(*args))
 
     def clone(self):
         r"""
@@ -15746,8 +15751,9 @@ class FormFactorCuboctahedron(FormFactorPolyhedron):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, length, height, height_ratio, alpha):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorCuboctahedron self, vdouble1d_t P) -> FormFactorCuboctahedron
         __init__(FormFactorCuboctahedron self, double length, double height, double height_ratio, double alpha) -> FormFactorCuboctahedron
         FormFactorCuboctahedron::FormFactorCuboctahedron(double length, double height, double height_ratio, double alpha)
 
@@ -15769,7 +15775,7 @@ class FormFactorCuboctahedron(FormFactorPolyhedron):
         dihedral angle in radians between base and facet 
 
         """
-        _libBornAgainCore.FormFactorCuboctahedron_swiginit(self, _libBornAgainCore.new_FormFactorCuboctahedron(length, height, height_ratio, alpha))
+        _libBornAgainCore.FormFactorCuboctahedron_swiginit(self, _libBornAgainCore.new_FormFactorCuboctahedron(*args))
 
     def clone(self):
         r"""
@@ -15840,8 +15846,9 @@ class FormFactorCylinder(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, radius, height):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorCylinder self, vdouble1d_t P) -> FormFactorCylinder
         __init__(FormFactorCylinder self, double radius, double height) -> FormFactorCylinder
         FormFactorCylinder::FormFactorCylinder(double radius, double height)
 
@@ -15857,7 +15864,7 @@ class FormFactorCylinder(IFormFactorBorn):
         height of the cylinder in nanometers 
 
         """
-        _libBornAgainCore.FormFactorCylinder_swiginit(self, _libBornAgainCore.new_FormFactorCylinder(radius, height))
+        _libBornAgainCore.FormFactorCylinder_swiginit(self, _libBornAgainCore.new_FormFactorCylinder(*args))
 
     def clone(self):
         r"""
@@ -15932,8 +15939,9 @@ class FormFactorDodecahedron(FormFactorPolyhedron):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, edge):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorDodecahedron self, vdouble1d_t P) -> FormFactorDodecahedron
         __init__(FormFactorDodecahedron self, double edge) -> FormFactorDodecahedron
         FormFactorDodecahedron::FormFactorDodecahedron(double edge)
 
@@ -15954,7 +15962,7 @@ class FormFactorDodecahedron(FormFactorPolyhedron):
         length of the edge in nanometers 
 
         """
-        _libBornAgainCore.FormFactorDodecahedron_swiginit(self, _libBornAgainCore.new_FormFactorDodecahedron(edge))
+        _libBornAgainCore.FormFactorDodecahedron_swiginit(self, _libBornAgainCore.new_FormFactorDodecahedron(*args))
 
     def clone(self):
         r"""
@@ -16001,8 +16009,9 @@ class FormFactorDot(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, radius):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorDot self, vdouble1d_t P) -> FormFactorDot
         __init__(FormFactorDot self, double radius) -> FormFactorDot
         FormFactorDot::FormFactorDot(double radius)
 
@@ -16015,7 +16024,7 @@ class FormFactorDot(IFormFactorBorn):
         radius of a sphere with same forward scattering power, in nanometers 
 
         """
-        _libBornAgainCore.FormFactorDot_swiginit(self, _libBornAgainCore.new_FormFactorDot(radius))
+        _libBornAgainCore.FormFactorDot_swiginit(self, _libBornAgainCore.new_FormFactorDot(*args))
 
     def clone(self):
         r"""
@@ -16102,8 +16111,9 @@ class FormFactorEllipsoidalCylinder(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, radius_x, radius_y, height):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorEllipsoidalCylinder self, vdouble1d_t P) -> FormFactorEllipsoidalCylinder
         __init__(FormFactorEllipsoidalCylinder self, double radius_x, double radius_y, double height) -> FormFactorEllipsoidalCylinder
         FormFactorEllipsoidalCylinder::FormFactorEllipsoidalCylinder(double radius_x, double radius_y, double height)
 
@@ -16122,7 +16132,7 @@ class FormFactorEllipsoidalCylinder(IFormFactorBorn):
         height of the ellipsoidal cylinder in nanometers 
 
         """
-        _libBornAgainCore.FormFactorEllipsoidalCylinder_swiginit(self, _libBornAgainCore.new_FormFactorEllipsoidalCylinder(radius_x, radius_y, height))
+        _libBornAgainCore.FormFactorEllipsoidalCylinder_swiginit(self, _libBornAgainCore.new_FormFactorEllipsoidalCylinder(*args))
 
     def clone(self):
         r"""
@@ -16205,8 +16215,9 @@ class FormFactorFullSphere(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, radius, position_at_center=False):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorFullSphere self, vdouble1d_t P, bool position_at_center=False) -> FormFactorFullSphere
         __init__(FormFactorFullSphere self, double radius, bool position_at_center=False) -> FormFactorFullSphere
         FormFactorFullSphere::FormFactorFullSphere(double radius, bool position_at_center=false)
 
@@ -16219,7 +16230,7 @@ class FormFactorFullSphere(IFormFactorBorn):
         radius of the sphere in nanometers 
 
         """
-        _libBornAgainCore.FormFactorFullSphere_swiginit(self, _libBornAgainCore.new_FormFactorFullSphere(radius, position_at_center))
+        _libBornAgainCore.FormFactorFullSphere_swiginit(self, _libBornAgainCore.new_FormFactorFullSphere(*args))
 
     def clone(self):
         r"""
@@ -16306,8 +16317,9 @@ class FormFactorFullSpheroid(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, radius, height):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorFullSpheroid self, vdouble1d_t P) -> FormFactorFullSpheroid
         __init__(FormFactorFullSpheroid self, double radius, double height) -> FormFactorFullSpheroid
         FormFactorFullSpheroid::FormFactorFullSpheroid(double radius, double height)
 
@@ -16323,7 +16335,7 @@ class FormFactorFullSpheroid(IFormFactorBorn):
         height of the full spheroid in nanometers 
 
         """
-        _libBornAgainCore.FormFactorFullSpheroid_swiginit(self, _libBornAgainCore.new_FormFactorFullSpheroid(radius, height))
+        _libBornAgainCore.FormFactorFullSpheroid_swiginit(self, _libBornAgainCore.new_FormFactorFullSpheroid(*args))
 
     def clone(self):
         r"""
@@ -16398,8 +16410,9 @@ class FormFactorHemiEllipsoid(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, radius_x, radius_y, height):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorHemiEllipsoid self, vdouble1d_t P) -> FormFactorHemiEllipsoid
         __init__(FormFactorHemiEllipsoid self, double radius_x, double radius_y, double height) -> FormFactorHemiEllipsoid
         FormFactorHemiEllipsoid::FormFactorHemiEllipsoid(double radius_x, double radius_y, double height)
 
@@ -16418,7 +16431,7 @@ class FormFactorHemiEllipsoid(IFormFactorBorn):
         height of the hemi ellipsoid in nanometers 
 
         """
-        _libBornAgainCore.FormFactorHemiEllipsoid_swiginit(self, _libBornAgainCore.new_FormFactorHemiEllipsoid(radius_x, radius_y, height))
+        _libBornAgainCore.FormFactorHemiEllipsoid_swiginit(self, _libBornAgainCore.new_FormFactorHemiEllipsoid(*args))
     __swig_destroy__ = _libBornAgainCore.delete_FormFactorHemiEllipsoid
 
     def clone(self):
@@ -16501,13 +16514,14 @@ class FormFactorHollowSphere(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, mean, full_width):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorHollowSphere self, vdouble1d_t P) -> FormFactorHollowSphere
         __init__(FormFactorHollowSphere self, double mean, double full_width) -> FormFactorHollowSphere
         FormFactorHollowSphere::FormFactorHollowSphere(double mean, double full_width)
 
         """
-        _libBornAgainCore.FormFactorHollowSphere_swiginit(self, _libBornAgainCore.new_FormFactorHollowSphere(mean, full_width))
+        _libBornAgainCore.FormFactorHollowSphere_swiginit(self, _libBornAgainCore.new_FormFactorHollowSphere(*args))
 
     def clone(self):
         r"""
@@ -16566,8 +16580,9 @@ class FormFactorIcosahedron(FormFactorPolyhedron):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, edge):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorIcosahedron self, vdouble1d_t P) -> FormFactorIcosahedron
         __init__(FormFactorIcosahedron self, double edge) -> FormFactorIcosahedron
         FormFactorIcosahedron::FormFactorIcosahedron(double edge)
 
@@ -16580,7 +16595,7 @@ class FormFactorIcosahedron(FormFactorPolyhedron):
         length of the edge in nanometers 
 
         """
-        _libBornAgainCore.FormFactorIcosahedron_swiginit(self, _libBornAgainCore.new_FormFactorIcosahedron(edge))
+        _libBornAgainCore.FormFactorIcosahedron_swiginit(self, _libBornAgainCore.new_FormFactorIcosahedron(*args))
 
     def clone(self):
         r"""
@@ -16627,8 +16642,9 @@ class FormFactorLongBoxGauss(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, length, width, height):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorLongBoxGauss self, vdouble1d_t P) -> FormFactorLongBoxGauss
         __init__(FormFactorLongBoxGauss self, double length, double width, double height) -> FormFactorLongBoxGauss
         FormFactorLongBoxGauss::FormFactorLongBoxGauss(double length, double width, double height)
 
@@ -16647,7 +16663,7 @@ class FormFactorLongBoxGauss(IFormFactorBorn):
         of  Box
 
         """
-        _libBornAgainCore.FormFactorLongBoxGauss_swiginit(self, _libBornAgainCore.new_FormFactorLongBoxGauss(length, width, height))
+        _libBornAgainCore.FormFactorLongBoxGauss_swiginit(self, _libBornAgainCore.new_FormFactorLongBoxGauss(*args))
 
     def clone(self):
         r"""
@@ -16730,8 +16746,9 @@ class FormFactorLongBoxLorentz(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, length, width, height):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorLongBoxLorentz self, vdouble1d_t P) -> FormFactorLongBoxLorentz
         __init__(FormFactorLongBoxLorentz self, double length, double width, double height) -> FormFactorLongBoxLorentz
         FormFactorLongBoxLorentz::FormFactorLongBoxLorentz(double length, double width, double height)
 
@@ -16750,7 +16767,7 @@ class FormFactorLongBoxLorentz(IFormFactorBorn):
         of  Box
 
         """
-        _libBornAgainCore.FormFactorLongBoxLorentz_swiginit(self, _libBornAgainCore.new_FormFactorLongBoxLorentz(length, width, height))
+        _libBornAgainCore.FormFactorLongBoxLorentz_swiginit(self, _libBornAgainCore.new_FormFactorLongBoxLorentz(*args))
 
     def clone(self):
         r"""
@@ -16833,8 +16850,9 @@ class FormFactorPrism3(FormFactorPolygonalPrism):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, base_edge, height):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorPrism3 self, vdouble1d_t P) -> FormFactorPrism3
         __init__(FormFactorPrism3 self, double base_edge, double height) -> FormFactorPrism3
         FormFactorPrism3::FormFactorPrism3(double base_edge, double height)
 
@@ -16850,7 +16868,7 @@ class FormFactorPrism3(FormFactorPolygonalPrism):
         height in nanometers 
 
         """
-        _libBornAgainCore.FormFactorPrism3_swiginit(self, _libBornAgainCore.new_FormFactorPrism3(base_edge, height))
+        _libBornAgainCore.FormFactorPrism3_swiginit(self, _libBornAgainCore.new_FormFactorPrism3(*args))
 
     def clone(self):
         r"""
@@ -16897,8 +16915,9 @@ class FormFactorPrism6(FormFactorPolygonalPrism):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, base_edge, height):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorPrism6 self, vdouble1d_t P) -> FormFactorPrism6
         __init__(FormFactorPrism6 self, double base_edge, double height) -> FormFactorPrism6
         FormFactorPrism6::FormFactorPrism6(double base_edge, double height)
 
@@ -16914,7 +16933,7 @@ class FormFactorPrism6(FormFactorPolygonalPrism):
         height in nanometers 
 
         """
-        _libBornAgainCore.FormFactorPrism6_swiginit(self, _libBornAgainCore.new_FormFactorPrism6(base_edge, height))
+        _libBornAgainCore.FormFactorPrism6_swiginit(self, _libBornAgainCore.new_FormFactorPrism6(*args))
 
     def clone(self):
         r"""
@@ -16961,8 +16980,9 @@ class FormFactorPyramid(FormFactorPolyhedron):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, base_edge, height, alpha):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorPyramid self, vdouble1d_t P) -> FormFactorPyramid
         __init__(FormFactorPyramid self, double base_edge, double height, double alpha) -> FormFactorPyramid
         FormFactorPyramid::FormFactorPyramid(double base_edge, double height, double alpha)
 
@@ -16981,7 +17001,7 @@ class FormFactorPyramid(FormFactorPolyhedron):
         dihedral angle between the base and a side face in radians 
 
         """
-        _libBornAgainCore.FormFactorPyramid_swiginit(self, _libBornAgainCore.new_FormFactorPyramid(base_edge, height, alpha))
+        _libBornAgainCore.FormFactorPyramid_swiginit(self, _libBornAgainCore.new_FormFactorPyramid(*args))
 
     def clone(self):
         r"""
@@ -17314,8 +17334,9 @@ class FormFactorTetrahedron(FormFactorPolyhedron):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, base_edge, height, alpha):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorTetrahedron self, vdouble1d_t P) -> FormFactorTetrahedron
         __init__(FormFactorTetrahedron self, double base_edge, double height, double alpha) -> FormFactorTetrahedron
         FormFactorTetrahedron::FormFactorTetrahedron(double base_edge, double height, double alpha)
 
@@ -17334,7 +17355,7 @@ class FormFactorTetrahedron(FormFactorPolyhedron):
         dihedral angle in radians between base and facet 
 
         """
-        _libBornAgainCore.FormFactorTetrahedron_swiginit(self, _libBornAgainCore.new_FormFactorTetrahedron(base_edge, height, alpha))
+        _libBornAgainCore.FormFactorTetrahedron_swiginit(self, _libBornAgainCore.new_FormFactorTetrahedron(*args))
 
     def clone(self):
         r"""
@@ -17397,8 +17418,9 @@ class FormFactorTruncatedCube(FormFactorPolyhedron):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, length, removed_length):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorTruncatedCube self, vdouble1d_t P) -> FormFactorTruncatedCube
         __init__(FormFactorTruncatedCube self, double length, double removed_length) -> FormFactorTruncatedCube
         FormFactorTruncatedCube::FormFactorTruncatedCube(double length, double removed_length)
 
@@ -17414,7 +17436,7 @@ class FormFactorTruncatedCube(FormFactorPolyhedron):
         removed length from each edge of the cube in nanometers 
 
         """
-        _libBornAgainCore.FormFactorTruncatedCube_swiginit(self, _libBornAgainCore.new_FormFactorTruncatedCube(length, removed_length))
+        _libBornAgainCore.FormFactorTruncatedCube_swiginit(self, _libBornAgainCore.new_FormFactorTruncatedCube(*args))
 
     def clone(self):
         r"""
@@ -17469,8 +17491,9 @@ class FormFactorTruncatedSphere(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, radius, height, dh):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorTruncatedSphere self, vdouble1d_t P) -> FormFactorTruncatedSphere
         __init__(FormFactorTruncatedSphere self, double radius, double height, double dh) -> FormFactorTruncatedSphere
         FormFactorTruncatedSphere::FormFactorTruncatedSphere(double radius, double height, double dh=0.0)
 
@@ -17489,7 +17512,7 @@ class FormFactorTruncatedSphere(IFormFactorBorn):
         length of cup truncated from the top 
 
         """
-        _libBornAgainCore.FormFactorTruncatedSphere_swiginit(self, _libBornAgainCore.new_FormFactorTruncatedSphere(radius, height, dh))
+        _libBornAgainCore.FormFactorTruncatedSphere_swiginit(self, _libBornAgainCore.new_FormFactorTruncatedSphere(*args))
 
     def clone(self):
         r"""
@@ -17572,8 +17595,9 @@ class FormFactorTruncatedSpheroid(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, radius, height, height_flattening, dh):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorTruncatedSpheroid self, vdouble1d_t P) -> FormFactorTruncatedSpheroid
         __init__(FormFactorTruncatedSpheroid self, double radius, double height, double height_flattening, double dh) -> FormFactorTruncatedSpheroid
         FormFactorTruncatedSpheroid::FormFactorTruncatedSpheroid(double radius, double height, double height_flattening, double dh=0.0)
 
@@ -17595,7 +17619,7 @@ class FormFactorTruncatedSpheroid(IFormFactorBorn):
         length of cup truncated from the top 
 
         """
-        _libBornAgainCore.FormFactorTruncatedSpheroid_swiginit(self, _libBornAgainCore.new_FormFactorTruncatedSpheroid(radius, height, height_flattening, dh))
+        _libBornAgainCore.FormFactorTruncatedSpheroid_swiginit(self, _libBornAgainCore.new_FormFactorTruncatedSpheroid(*args))
 
     def clone(self):
         r"""
@@ -17703,9 +17727,12 @@ class FormFactorGaussSphere(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, mean_radius):
-        r"""__init__(FormFactorGaussSphere self, double mean_radius) -> FormFactorGaussSphere"""
-        _libBornAgainCore.FormFactorGaussSphere_swiginit(self, _libBornAgainCore.new_FormFactorGaussSphere(mean_radius))
+    def __init__(self, *args):
+        r"""
+        __init__(FormFactorGaussSphere self, vdouble1d_t P) -> FormFactorGaussSphere
+        __init__(FormFactorGaussSphere self, double mean_radius) -> FormFactorGaussSphere
+        """
+        _libBornAgainCore.FormFactorGaussSphere_swiginit(self, _libBornAgainCore.new_FormFactorGaussSphere(*args))
 
     def clone(self):
         r"""
@@ -17768,13 +17795,14 @@ class FormFactorSphereGaussianRadius(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, mean, sigma):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorSphereGaussianRadius self, vdouble1d_t P) -> FormFactorSphereGaussianRadius
         __init__(FormFactorSphereGaussianRadius self, double mean, double sigma) -> FormFactorSphereGaussianRadius
         FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(double mean, double sigma)
 
         """
-        _libBornAgainCore.FormFactorSphereGaussianRadius_swiginit(self, _libBornAgainCore.new_FormFactorSphereGaussianRadius(mean, sigma))
+        _libBornAgainCore.FormFactorSphereGaussianRadius_swiginit(self, _libBornAgainCore.new_FormFactorSphereGaussianRadius(*args))
 
     def clone(self):
         r"""
@@ -17833,13 +17861,14 @@ class FormFactorSphereLogNormalRadius(IFormFactorBorn):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, mean, scale_param, n_samples):
+    def __init__(self, *args):
         r"""
+        __init__(FormFactorSphereLogNormalRadius self, vdouble1d_t P, size_t n_samples=0) -> FormFactorSphereLogNormalRadius
         __init__(FormFactorSphereLogNormalRadius self, double mean, double scale_param, size_t n_samples) -> FormFactorSphereLogNormalRadius
         FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(double mean, double scale_param, size_t n_samples)
 
         """
-        _libBornAgainCore.FormFactorSphereLogNormalRadius_swiginit(self, _libBornAgainCore.new_FormFactorSphereLogNormalRadius(mean, scale_param, n_samples))
+        _libBornAgainCore.FormFactorSphereLogNormalRadius_swiginit(self, _libBornAgainCore.new_FormFactorSphereLogNormalRadius(*args))
 
     def clone(self):
         r"""
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index 882186ae392..39aa1604012 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -63872,7 +63872,20 @@ SWIGINTERN PyObject *DistributionCosine_swiginit(PyObject *SWIGUNUSEDPARM(self),
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  DistributionTrapezoid *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (DistributionTrapezoid *)new DistributionTrapezoid();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionTrapezoid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -63917,19 +63930,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
-  PyObject *resultobj = 0;
-  DistributionTrapezoid *result = 0 ;
-  
-  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
-  result = (DistributionTrapezoid *)new DistributionTrapezoid();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionTrapezoid, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[5] = {
@@ -63939,7 +63939,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid(PyObject *self, PyObject *a
   if (!(argc = SWIG_Python_UnpackTuple(args, "new_DistributionTrapezoid", 0, 4, argv))) SWIG_fail;
   --argc;
   if (argc == 0) {
-    return _wrap_new_DistributionTrapezoid__SWIG_1(self, argc, argv);
+    return _wrap_new_DistributionTrapezoid__SWIG_0(self, argc, argv);
   }
   if (argc == 4) {
     int _v;
@@ -63963,7 +63963,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid(PyObject *self, PyObject *a
             _v = SWIG_CheckState(res);
           }
           if (_v) {
-            return _wrap_new_DistributionTrapezoid__SWIG_0(self, argc, argv);
+            return _wrap_new_DistributionTrapezoid__SWIG_1(self, argc, argv);
           }
         }
       }
@@ -63973,8 +63973,8 @@ SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid(PyObject *self, PyObject *a
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DistributionTrapezoid'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    DistributionTrapezoid::DistributionTrapezoid(double,double,double,double)\n"
-    "    DistributionTrapezoid::DistributionTrapezoid()\n");
+    "    DistributionTrapezoid::DistributionTrapezoid()\n"
+    "    DistributionTrapezoid::DistributionTrapezoid(double,double,double,double)\n");
   return 0;
 }
 
@@ -91194,7 +91194,30 @@ SWIGINTERN PyObject *ProfileRipple2_swigregister(PyObject *SWIGUNUSEDPARM(self),
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorAnisoPyramid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorAnisoPyramid__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorAnisoPyramid *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorAnisoPyramid" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorAnisoPyramid *)new FormFactorAnisoPyramid(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorAnisoPyramid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorAnisoPyramid__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -91208,10 +91231,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorAnisoPyramid(PyObject *SWIGUNUSEDPARM(s
   int ecode3 = 0 ;
   double val4 ;
   int ecode4 = 0 ;
-  PyObject *swig_obj[4] ;
   FormFactorAnisoPyramid *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorAnisoPyramid", 4, 4, swig_obj)) SWIG_fail;
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorAnisoPyramid" "', argument " "1"" of type '" "double""'");
@@ -91240,6 +91262,60 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorAnisoPyramid(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorAnisoPyramid", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorAnisoPyramid__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FormFactorAnisoPyramid__SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorAnisoPyramid'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorAnisoPyramid::FormFactorAnisoPyramid(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorAnisoPyramid::FormFactorAnisoPyramid(double,double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorAnisoPyramid_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorAnisoPyramid *arg1 = (FormFactorAnisoPyramid *) 0 ;
@@ -91417,7 +91493,30 @@ SWIGINTERN PyObject *FormFactorAnisoPyramid_swiginit(PyObject *SWIGUNUSEDPARM(se
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorBox(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorBox__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorBox *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorBox" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorBox *)new FormFactorBox(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorBox, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorBox__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -91428,10 +91527,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorBox(PyObject *SWIGUNUSEDPARM(self), PyO
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FormFactorBox *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorBox", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorBox" "', argument " "1"" of type '" "double""'");
@@ -91455,6 +91553,54 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorBox(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorBox", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorBox__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FormFactorBox__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorBox'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorBox::FormFactorBox(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorBox::FormFactorBox(double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorBox_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorBox *arg1 = (FormFactorBox *) 0 ;
@@ -91670,7 +91816,30 @@ SWIGINTERN PyObject *FormFactorBox_swiginit(PyObject *SWIGUNUSEDPARM(self), PyOb
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorCantellatedCube(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorCantellatedCube__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorCantellatedCube *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorCantellatedCube" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorCantellatedCube *)new FormFactorCantellatedCube(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCantellatedCube, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorCantellatedCube__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -91678,10 +91847,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorCantellatedCube(PyObject *SWIGUNUSEDPAR
   int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
   FormFactorCantellatedCube *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorCantellatedCube", 2, 2, swig_obj)) SWIG_fail;
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorCantellatedCube" "', argument " "1"" of type '" "double""'");
@@ -91700,6 +91868,48 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorCantellatedCube(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorCantellatedCube", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorCantellatedCube__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorCantellatedCube__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorCantellatedCube'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorCantellatedCube::FormFactorCantellatedCube(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorCantellatedCube::FormFactorCantellatedCube(double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorCantellatedCube_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorCantellatedCube *arg1 = (FormFactorCantellatedCube *) 0 ;
@@ -91831,7 +92041,30 @@ SWIGINTERN PyObject *FormFactorCantellatedCube_swiginit(PyObject *SWIGUNUSEDPARM
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorCone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorCone__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorCone *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorCone" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorCone *)new FormFactorCone(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCone, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorCone__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -91842,10 +92075,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorCone(PyObject *SWIGUNUSEDPARM(self), Py
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FormFactorCone *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorCone", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorCone" "', argument " "1"" of type '" "double""'");
@@ -91869,6 +92101,54 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorCone(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorCone", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorCone__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FormFactorCone__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorCone'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorCone::FormFactorCone(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorCone::FormFactorCone(double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorCone_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorCone *arg1 = (FormFactorCone *) 0 ;
@@ -92084,7 +92364,30 @@ SWIGINTERN PyObject *FormFactorCone_swiginit(PyObject *SWIGUNUSEDPARM(self), PyO
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorCone6(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorCone6__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorCone6 *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorCone6" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorCone6 *)new FormFactorCone6(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCone6, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorCone6__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -92095,10 +92398,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorCone6(PyObject *SWIGUNUSEDPARM(self), P
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FormFactorCone6 *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorCone6", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorCone6" "', argument " "1"" of type '" "double""'");
@@ -92122,6 +92424,54 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorCone6(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorCone6", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorCone6__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FormFactorCone6__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorCone6'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorCone6::FormFactorCone6(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorCone6::FormFactorCone6(double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorCone6_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorCone6 *arg1 = (FormFactorCone6 *) 0 ;
@@ -92276,7 +92626,30 @@ SWIGINTERN PyObject *FormFactorCone6_swiginit(PyObject *SWIGUNUSEDPARM(self), Py
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorCuboctahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorCuboctahedron__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorCuboctahedron *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorCuboctahedron" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorCuboctahedron *)new FormFactorCuboctahedron(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCuboctahedron, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorCuboctahedron__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -92290,10 +92663,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorCuboctahedron(PyObject *SWIGUNUSEDPARM(
   int ecode3 = 0 ;
   double val4 ;
   int ecode4 = 0 ;
-  PyObject *swig_obj[4] ;
   FormFactorCuboctahedron *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorCuboctahedron", 4, 4, swig_obj)) SWIG_fail;
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorCuboctahedron" "', argument " "1"" of type '" "double""'");
@@ -92322,6 +92694,60 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorCuboctahedron(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorCuboctahedron", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorCuboctahedron__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FormFactorCuboctahedron__SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorCuboctahedron'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorCuboctahedron::FormFactorCuboctahedron(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorCuboctahedron::FormFactorCuboctahedron(double,double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
@@ -92499,7 +92925,30 @@ SWIGINTERN PyObject *FormFactorCuboctahedron_swiginit(PyObject *SWIGUNUSEDPARM(s
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorCylinder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorCylinder__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorCylinder *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorCylinder" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorCylinder *)new FormFactorCylinder(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCylinder, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorCylinder__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -92507,10 +92956,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorCylinder(PyObject *SWIGUNUSEDPARM(self)
   int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
   FormFactorCylinder *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorCylinder", 2, 2, swig_obj)) SWIG_fail;
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorCylinder" "', argument " "1"" of type '" "double""'");
@@ -92529,6 +92977,48 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorCylinder(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorCylinder", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorCylinder__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorCylinder__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorCylinder'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorCylinder::FormFactorCylinder(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorCylinder::FormFactorCylinder(double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorCylinder_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorCylinder *arg1 = (FormFactorCylinder *) 0 ;
@@ -92721,16 +93211,37 @@ SWIGINTERN PyObject *FormFactorCylinder_swiginit(PyObject *SWIGUNUSEDPARM(self),
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorDodecahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorDodecahedron__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorDodecahedron *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorDodecahedron" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorDodecahedron *)new FormFactorDodecahedron(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorDodecahedron, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorDodecahedron__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
   int ecode1 = 0 ;
-  PyObject *swig_obj[1] ;
   FormFactorDodecahedron *result = 0 ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorDodecahedron" "', argument " "1"" of type '" "double""'");
@@ -92744,6 +93255,42 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorDodecahedron(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorDodecahedron", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_FormFactorDodecahedron__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorDodecahedron__SWIG_0(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorDodecahedron'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorDodecahedron::FormFactorDodecahedron(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorDodecahedron::FormFactorDodecahedron(double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorDodecahedron_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorDodecahedron *arg1 = (FormFactorDodecahedron *) 0 ;
@@ -92852,16 +93399,37 @@ SWIGINTERN PyObject *FormFactorDodecahedron_swiginit(PyObject *SWIGUNUSEDPARM(se
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorDot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorDot__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorDot *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorDot" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorDot *)new FormFactorDot(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorDot, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorDot__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
   int ecode1 = 0 ;
-  PyObject *swig_obj[1] ;
   FormFactorDot *result = 0 ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorDot" "', argument " "1"" of type '" "double""'");
@@ -92875,6 +93443,42 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorDot(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorDot", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_FormFactorDot__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorDot__SWIG_0(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorDot'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorDot::FormFactorDot(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorDot::FormFactorDot(double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorDot_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorDot *arg1 = (FormFactorDot *) 0 ;
@@ -93110,7 +93714,30 @@ SWIGINTERN PyObject *FormFactorDot_swiginit(PyObject *SWIGUNUSEDPARM(self), PyOb
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorEllipsoidalCylinder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorEllipsoidalCylinder__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorEllipsoidalCylinder *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorEllipsoidalCylinder" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorEllipsoidalCylinder *)new FormFactorEllipsoidalCylinder(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorEllipsoidalCylinder, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorEllipsoidalCylinder__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -93121,10 +93748,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorEllipsoidalCylinder(PyObject *SWIGUNUSE
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FormFactorEllipsoidalCylinder *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorEllipsoidalCylinder", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorEllipsoidalCylinder" "', argument " "1"" of type '" "double""'");
@@ -93148,6 +93774,54 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorEllipsoidalCylinder(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorEllipsoidalCylinder", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorEllipsoidalCylinder__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FormFactorEllipsoidalCylinder__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorEllipsoidalCylinder'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorEllipsoidalCylinder::FormFactorEllipsoidalCylinder(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorEllipsoidalCylinder::FormFactorEllipsoidalCylinder(double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorEllipsoidalCylinder_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorEllipsoidalCylinder *arg1 = (FormFactorEllipsoidalCylinder *) 0 ;
@@ -93364,6 +94038,60 @@ SWIGINTERN PyObject *FormFactorEllipsoidalCylinder_swiginit(PyObject *SWIGUNUSED
 }
 
 SWIGINTERN PyObject *_wrap_new_FormFactorFullSphere__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  bool arg2 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  FormFactorFullSphere *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorFullSphere" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorFullSphere" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  result = (FormFactorFullSphere *)new FormFactorFullSphere(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorFullSphere, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorFullSphere__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorFullSphere *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorFullSphere" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorFullSphere *)new FormFactorFullSphere(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorFullSphere, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorFullSphere__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   bool arg2 ;
@@ -93392,7 +94120,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_FormFactorFullSphere__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_FormFactorFullSphere__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
@@ -93427,6 +94155,14 @@ SWIGINTERN PyObject *_wrap_new_FormFactorFullSphere(PyObject *self, PyObject *ar
       int res = SWIG_AsVal_double(argv[0], NULL);
       _v = SWIG_CheckState(res);
     }
+    if (_v) {
+      return _wrap_new_FormFactorFullSphere__SWIG_3(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
     if (_v) {
       return _wrap_new_FormFactorFullSphere__SWIG_1(self, argc, argv);
     }
@@ -93437,6 +94173,20 @@ SWIGINTERN PyObject *_wrap_new_FormFactorFullSphere(PyObject *self, PyObject *ar
       int res = SWIG_AsVal_double(argv[0], NULL);
       _v = SWIG_CheckState(res);
     }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_bool(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorFullSphere__SWIG_2(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
     if (_v) {
       {
         int res = SWIG_AsVal_bool(argv[1], NULL);
@@ -93451,6 +94201,8 @@ SWIGINTERN PyObject *_wrap_new_FormFactorFullSphere(PyObject *self, PyObject *ar
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorFullSphere'.\n"
     "  Possible C/C++ prototypes are:\n"
+    "    FormFactorFullSphere::FormFactorFullSphere(std::vector< double,std::allocator< double > > const,bool)\n"
+    "    FormFactorFullSphere::FormFactorFullSphere(std::vector< double,std::allocator< double > > const)\n"
     "    FormFactorFullSphere::FormFactorFullSphere(double,bool)\n"
     "    FormFactorFullSphere::FormFactorFullSphere(double)\n");
   return 0;
@@ -93692,7 +94444,30 @@ SWIGINTERN PyObject *FormFactorFullSphere_swiginit(PyObject *SWIGUNUSEDPARM(self
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorFullSpheroid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorFullSpheroid__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorFullSpheroid *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorFullSpheroid" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorFullSpheroid *)new FormFactorFullSpheroid(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorFullSpheroid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorFullSpheroid__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -93700,10 +94475,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorFullSpheroid(PyObject *SWIGUNUSEDPARM(s
   int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
   FormFactorFullSpheroid *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorFullSpheroid", 2, 2, swig_obj)) SWIG_fail;
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorFullSpheroid" "', argument " "1"" of type '" "double""'");
@@ -93722,6 +94496,48 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorFullSpheroid(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorFullSpheroid", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorFullSpheroid__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorFullSpheroid__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorFullSpheroid'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorFullSpheroid::FormFactorFullSpheroid(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorFullSpheroid::FormFactorFullSpheroid(double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorFullSpheroid_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorFullSpheroid *arg1 = (FormFactorFullSpheroid *) 0 ;
@@ -93914,7 +94730,30 @@ SWIGINTERN PyObject *FormFactorFullSpheroid_swiginit(PyObject *SWIGUNUSEDPARM(se
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorHemiEllipsoid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorHemiEllipsoid__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorHemiEllipsoid *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorHemiEllipsoid" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorHemiEllipsoid *)new FormFactorHemiEllipsoid(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorHemiEllipsoid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorHemiEllipsoid__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -93925,10 +94764,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorHemiEllipsoid(PyObject *SWIGUNUSEDPARM(
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FormFactorHemiEllipsoid *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorHemiEllipsoid", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorHemiEllipsoid" "', argument " "1"" of type '" "double""'");
@@ -93952,6 +94790,54 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorHemiEllipsoid(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorHemiEllipsoid", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorHemiEllipsoid__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FormFactorHemiEllipsoid__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorHemiEllipsoid'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorHemiEllipsoid::FormFactorHemiEllipsoid(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorHemiEllipsoid::FormFactorHemiEllipsoid(double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_delete_FormFactorHemiEllipsoid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorHemiEllipsoid *arg1 = (FormFactorHemiEllipsoid *) 0 ;
@@ -94167,7 +95053,30 @@ SWIGINTERN PyObject *FormFactorHemiEllipsoid_swiginit(PyObject *SWIGUNUSEDPARM(s
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorHollowSphere(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorHollowSphere__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorHollowSphere *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorHollowSphere" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorHollowSphere *)new FormFactorHollowSphere(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorHollowSphere, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorHollowSphere__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -94175,10 +95084,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorHollowSphere(PyObject *SWIGUNUSEDPARM(s
   int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
   FormFactorHollowSphere *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorHollowSphere", 2, 2, swig_obj)) SWIG_fail;
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorHollowSphere" "', argument " "1"" of type '" "double""'");
@@ -94197,6 +95105,48 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorHollowSphere(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorHollowSphere", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorHollowSphere__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorHollowSphere__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorHollowSphere'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorHollowSphere::FormFactorHollowSphere(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorHollowSphere::FormFactorHollowSphere(double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorHollowSphere_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorHollowSphere *arg1 = (FormFactorHollowSphere *) 0 ;
@@ -94343,16 +95293,37 @@ SWIGINTERN PyObject *FormFactorHollowSphere_swiginit(PyObject *SWIGUNUSEDPARM(se
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorIcosahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorIcosahedron__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorIcosahedron *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorIcosahedron" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorIcosahedron *)new FormFactorIcosahedron(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorIcosahedron, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorIcosahedron__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
   int ecode1 = 0 ;
-  PyObject *swig_obj[1] ;
   FormFactorIcosahedron *result = 0 ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorIcosahedron" "', argument " "1"" of type '" "double""'");
@@ -94366,6 +95337,42 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorIcosahedron(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorIcosahedron", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_FormFactorIcosahedron__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorIcosahedron__SWIG_0(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorIcosahedron'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorIcosahedron::FormFactorIcosahedron(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorIcosahedron::FormFactorIcosahedron(double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorIcosahedron_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorIcosahedron *arg1 = (FormFactorIcosahedron *) 0 ;
@@ -94474,7 +95481,30 @@ SWIGINTERN PyObject *FormFactorIcosahedron_swiginit(PyObject *SWIGUNUSEDPARM(sel
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorLongBoxGauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorLongBoxGauss__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorLongBoxGauss *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorLongBoxGauss" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorLongBoxGauss *)new FormFactorLongBoxGauss(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongBoxGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorLongBoxGauss__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -94485,10 +95515,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorLongBoxGauss(PyObject *SWIGUNUSEDPARM(s
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FormFactorLongBoxGauss *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorLongBoxGauss", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorLongBoxGauss" "', argument " "1"" of type '" "double""'");
@@ -94512,6 +95541,54 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorLongBoxGauss(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorLongBoxGauss", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorLongBoxGauss__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FormFactorLongBoxGauss__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorLongBoxGauss'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorLongBoxGauss::FormFactorLongBoxGauss(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorLongBoxGauss::FormFactorLongBoxGauss(double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorLongBoxGauss_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorLongBoxGauss *arg1 = (FormFactorLongBoxGauss *) 0 ;
@@ -94727,7 +95804,30 @@ SWIGINTERN PyObject *FormFactorLongBoxGauss_swiginit(PyObject *SWIGUNUSEDPARM(se
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorLongBoxLorentz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorLongBoxLorentz__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorLongBoxLorentz *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorLongBoxLorentz" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorLongBoxLorentz *)new FormFactorLongBoxLorentz(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongBoxLorentz, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorLongBoxLorentz__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -94738,10 +95838,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorLongBoxLorentz(PyObject *SWIGUNUSEDPARM
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FormFactorLongBoxLorentz *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorLongBoxLorentz", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorLongBoxLorentz" "', argument " "1"" of type '" "double""'");
@@ -94765,6 +95864,54 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorLongBoxLorentz(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorLongBoxLorentz", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorLongBoxLorentz__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FormFactorLongBoxLorentz__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorLongBoxLorentz'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorLongBoxLorentz::FormFactorLongBoxLorentz(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorLongBoxLorentz::FormFactorLongBoxLorentz(double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorLongBoxLorentz_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorLongBoxLorentz *arg1 = (FormFactorLongBoxLorentz *) 0 ;
@@ -94980,7 +96127,30 @@ SWIGINTERN PyObject *FormFactorLongBoxLorentz_swiginit(PyObject *SWIGUNUSEDPARM(
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorPrism3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorPrism3__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorPrism3 *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorPrism3" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorPrism3 *)new FormFactorPrism3(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorPrism3, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorPrism3__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -94988,10 +96158,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorPrism3(PyObject *SWIGUNUSEDPARM(self),
   int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
   FormFactorPrism3 *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorPrism3", 2, 2, swig_obj)) SWIG_fail;
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorPrism3" "', argument " "1"" of type '" "double""'");
@@ -95010,6 +96179,48 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorPrism3(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorPrism3", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorPrism3__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorPrism3__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorPrism3'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorPrism3::FormFactorPrism3(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorPrism3::FormFactorPrism3(double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorPrism3_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorPrism3 *arg1 = (FormFactorPrism3 *) 0 ;
@@ -95118,7 +96329,30 @@ SWIGINTERN PyObject *FormFactorPrism3_swiginit(PyObject *SWIGUNUSEDPARM(self), P
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorPrism6(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorPrism6__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorPrism6 *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorPrism6" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorPrism6 *)new FormFactorPrism6(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorPrism6, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorPrism6__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -95126,10 +96360,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorPrism6(PyObject *SWIGUNUSEDPARM(self),
   int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
   FormFactorPrism6 *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorPrism6", 2, 2, swig_obj)) SWIG_fail;
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorPrism6" "', argument " "1"" of type '" "double""'");
@@ -95148,6 +96381,48 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorPrism6(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorPrism6", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorPrism6__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorPrism6__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorPrism6'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorPrism6::FormFactorPrism6(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorPrism6::FormFactorPrism6(double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorPrism6_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorPrism6 *arg1 = (FormFactorPrism6 *) 0 ;
@@ -95256,7 +96531,30 @@ SWIGINTERN PyObject *FormFactorPrism6_swiginit(PyObject *SWIGUNUSEDPARM(self), P
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorPyramid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorPyramid__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorPyramid *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorPyramid" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorPyramid *)new FormFactorPyramid(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorPyramid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorPyramid__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -95267,10 +96565,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorPyramid(PyObject *SWIGUNUSEDPARM(self),
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FormFactorPyramid *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorPyramid", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorPyramid" "', argument " "1"" of type '" "double""'");
@@ -95294,6 +96591,54 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorPyramid(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorPyramid", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorPyramid__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FormFactorPyramid__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorPyramid'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorPyramid::FormFactorPyramid(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorPyramid::FormFactorPyramid(double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorPyramid_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorPyramid *arg1 = (FormFactorPyramid *) 0 ;
@@ -96210,7 +97555,30 @@ SWIGINTERN PyObject *FormFactorRipple2Lorentz_swiginit(PyObject *SWIGUNUSEDPARM(
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorTetrahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorTetrahedron__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorTetrahedron *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorTetrahedron" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorTetrahedron *)new FormFactorTetrahedron(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTetrahedron, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorTetrahedron__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -96221,10 +97589,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorTetrahedron(PyObject *SWIGUNUSEDPARM(se
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FormFactorTetrahedron *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorTetrahedron", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorTetrahedron" "', argument " "1"" of type '" "double""'");
@@ -96248,6 +97615,54 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorTetrahedron(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorTetrahedron", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorTetrahedron__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FormFactorTetrahedron__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorTetrahedron'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorTetrahedron::FormFactorTetrahedron(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorTetrahedron::FormFactorTetrahedron(double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorTetrahedron *arg1 = (FormFactorTetrahedron *) 0 ;
@@ -96402,7 +97817,30 @@ SWIGINTERN PyObject *FormFactorTetrahedron_swiginit(PyObject *SWIGUNUSEDPARM(sel
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedCube(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedCube__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorTruncatedCube *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorTruncatedCube" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorTruncatedCube *)new FormFactorTruncatedCube(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTruncatedCube, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedCube__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -96410,10 +97848,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedCube(PyObject *SWIGUNUSEDPARM(
   int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
   FormFactorTruncatedCube *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorTruncatedCube", 2, 2, swig_obj)) SWIG_fail;
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorTruncatedCube" "', argument " "1"" of type '" "double""'");
@@ -96432,6 +97869,48 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedCube(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorTruncatedCube", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorTruncatedCube__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorTruncatedCube__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorTruncatedCube'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorTruncatedCube::FormFactorTruncatedCube(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorTruncatedCube::FormFactorTruncatedCube(double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorTruncatedCube_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorTruncatedCube *arg1 = (FormFactorTruncatedCube *) 0 ;
@@ -96563,7 +98042,30 @@ SWIGINTERN PyObject *FormFactorTruncatedCube_swiginit(PyObject *SWIGUNUSEDPARM(s
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedSphere(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedSphere__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorTruncatedSphere *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorTruncatedSphere" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorTruncatedSphere *)new FormFactorTruncatedSphere(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTruncatedSphere, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedSphere__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -96574,10 +98076,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedSphere(PyObject *SWIGUNUSEDPAR
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FormFactorTruncatedSphere *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorTruncatedSphere", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorTruncatedSphere" "', argument " "1"" of type '" "double""'");
@@ -96601,6 +98102,54 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedSphere(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorTruncatedSphere", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorTruncatedSphere__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FormFactorTruncatedSphere__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorTruncatedSphere'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorTruncatedSphere::FormFactorTruncatedSphere(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorTruncatedSphere::FormFactorTruncatedSphere(double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorTruncatedSphere_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorTruncatedSphere *arg1 = (FormFactorTruncatedSphere *) 0 ;
@@ -96816,7 +98365,30 @@ SWIGINTERN PyObject *FormFactorTruncatedSphere_swiginit(PyObject *SWIGUNUSEDPARM
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedSpheroid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedSpheroid__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorTruncatedSpheroid *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorTruncatedSpheroid" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorTruncatedSpheroid *)new FormFactorTruncatedSpheroid(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTruncatedSpheroid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedSpheroid__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -96830,10 +98402,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedSpheroid(PyObject *SWIGUNUSEDP
   int ecode3 = 0 ;
   double val4 ;
   int ecode4 = 0 ;
-  PyObject *swig_obj[4] ;
   FormFactorTruncatedSpheroid *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorTruncatedSpheroid", 4, 4, swig_obj)) SWIG_fail;
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorTruncatedSpheroid" "', argument " "1"" of type '" "double""'");
@@ -96862,6 +98433,60 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedSpheroid(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorTruncatedSpheroid", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorTruncatedSpheroid__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FormFactorTruncatedSpheroid__SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorTruncatedSpheroid'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorTruncatedSpheroid::FormFactorTruncatedSpheroid(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorTruncatedSpheroid::FormFactorTruncatedSpheroid(double,double,double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorTruncatedSpheroid_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorTruncatedSpheroid *arg1 = (FormFactorTruncatedSpheroid *) 0 ;
@@ -97190,16 +98815,37 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_FormFactorGaussSphere(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorGaussSphere__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorGaussSphere *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorGaussSphere" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorGaussSphere *)new FormFactorGaussSphere(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorGaussSphere, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorGaussSphere__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
   int ecode1 = 0 ;
-  PyObject *swig_obj[1] ;
   FormFactorGaussSphere *result = 0 ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorGaussSphere" "', argument " "1"" of type '" "double""'");
@@ -97213,6 +98859,42 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorGaussSphere(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorGaussSphere", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_FormFactorGaussSphere__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorGaussSphere__SWIG_0(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorGaussSphere'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorGaussSphere::FormFactorGaussSphere(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorGaussSphere::FormFactorGaussSphere(double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorGaussSphere_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorGaussSphere *arg1 = (FormFactorGaussSphere *) 0 ;
@@ -97382,7 +99064,30 @@ SWIGINTERN PyObject *FormFactorGaussSphere_swiginit(PyObject *SWIGUNUSEDPARM(sel
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorSphereGaussianRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorSphereGaussianRadius__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorSphereGaussianRadius *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorSphereGaussianRadius" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorSphereGaussianRadius *)new FormFactorSphereGaussianRadius(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorSphereGaussianRadius, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorSphereGaussianRadius__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -97390,10 +99095,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorSphereGaussianRadius(PyObject *SWIGUNUS
   int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
   FormFactorSphereGaussianRadius *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorSphereGaussianRadius", 2, 2, swig_obj)) SWIG_fail;
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorSphereGaussianRadius" "', argument " "1"" of type '" "double""'");
@@ -97412,6 +99116,48 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorSphereGaussianRadius(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorSphereGaussianRadius", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorSphereGaussianRadius__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorSphereGaussianRadius__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorSphereGaussianRadius'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(double,double)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorSphereGaussianRadius_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorSphereGaussianRadius *arg1 = (FormFactorSphereGaussianRadius *) 0 ;
@@ -97558,7 +99304,61 @@ SWIGINTERN PyObject *FormFactorSphereGaussianRadius_swiginit(PyObject *SWIGUNUSE
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_FormFactorSphereLogNormalRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_FormFactorSphereLogNormalRadius__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  size_t arg2 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  FormFactorSphereLogNormalRadius *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorSphereLogNormalRadius" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorSphereLogNormalRadius" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (FormFactorSphereLogNormalRadius *)new FormFactorSphereLogNormalRadius(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorSphereLogNormalRadius, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorSphereLogNormalRadius__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > arg1 ;
+  FormFactorSphereLogNormalRadius *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    int res = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_FormFactorSphereLogNormalRadius" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+    }
+    arg1 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FormFactorSphereLogNormalRadius *)new FormFactorSphereLogNormalRadius(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorSphereLogNormalRadius, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorSphereLogNormalRadius__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -97569,10 +99369,9 @@ SWIGINTERN PyObject *_wrap_new_FormFactorSphereLogNormalRadius(PyObject *SWIGUNU
   int ecode2 = 0 ;
   size_t val3 ;
   int ecode3 = 0 ;
-  PyObject *swig_obj[3] ;
   FormFactorSphereLogNormalRadius *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_FormFactorSphereLogNormalRadius", 3, 3, swig_obj)) SWIG_fail;
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorSphereLogNormalRadius" "', argument " "1"" of type '" "double""'");
@@ -97596,6 +99395,69 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_FormFactorSphereLogNormalRadius(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_FormFactorSphereLogNormalRadius", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_FormFactorSphereLogNormalRadius__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorSphereLogNormalRadius__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FormFactorSphereLogNormalRadius__SWIG_2(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_FormFactorSphereLogNormalRadius'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(std::vector< double,std::allocator< double > > const,size_t)\n"
+    "    FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(std::vector< double,std::allocator< double > > const)\n"
+    "    FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(double,double,size_t)\n");
+  return 0;
+}
+
+
 SWIGINTERN PyObject *_wrap_FormFactorSphereLogNormalRadius_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   FormFactorSphereLogNormalRadius *arg1 = (FormFactorSphereLogNormalRadius *) 0 ;
@@ -122381,8 +124243,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "DistributionCosine_swigregister", DistributionCosine_swigregister, METH_O, NULL},
 	 { "DistributionCosine_swiginit", DistributionCosine_swiginit, METH_VARARGS, NULL},
 	 { "new_DistributionTrapezoid", _wrap_new_DistributionTrapezoid, METH_VARARGS, "\n"
-		"DistributionTrapezoid(double center, double left, double middle, double right)\n"
-		"new_DistributionTrapezoid() -> DistributionTrapezoid\n"
+		"DistributionTrapezoid()\n"
+		"new_DistributionTrapezoid(double center, double left, double middle, double right) -> DistributionTrapezoid\n"
 		"DistributionTrapezoid::DistributionTrapezoid(double center, double left_width, double middle_width, double right_width)\n"
 		"\n"
 		""},
@@ -127152,6 +129014,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_ProfileRipple2", _wrap_delete_ProfileRipple2, METH_O, "delete_ProfileRipple2(ProfileRipple2 self)"},
 	 { "ProfileRipple2_swigregister", ProfileRipple2_swigregister, METH_O, NULL},
 	 { "new_FormFactorAnisoPyramid", _wrap_new_FormFactorAnisoPyramid, METH_VARARGS, "\n"
+		"FormFactorAnisoPyramid(vdouble1d_t P)\n"
 		"new_FormFactorAnisoPyramid(double length, double width, double height, double alpha) -> FormFactorAnisoPyramid\n"
 		"FormFactorAnisoPyramid::FormFactorAnisoPyramid(double length, double width, double height, double alpha)\n"
 		"\n"
@@ -127211,6 +129074,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorAnisoPyramid_swigregister", FormFactorAnisoPyramid_swigregister, METH_O, NULL},
 	 { "FormFactorAnisoPyramid_swiginit", FormFactorAnisoPyramid_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorBox", _wrap_new_FormFactorBox, METH_VARARGS, "\n"
+		"FormFactorBox(vdouble1d_t P)\n"
 		"new_FormFactorBox(double length, double width, double height) -> FormFactorBox\n"
 		"FormFactorBox::FormFactorBox(double length, double width, double height)\n"
 		"\n"
@@ -127278,6 +129142,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorBox_swigregister", FormFactorBox_swigregister, METH_O, NULL},
 	 { "FormFactorBox_swiginit", FormFactorBox_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorCantellatedCube", _wrap_new_FormFactorCantellatedCube, METH_VARARGS, "\n"
+		"FormFactorCantellatedCube(vdouble1d_t P)\n"
 		"new_FormFactorCantellatedCube(double length, double removed_length) -> FormFactorCantellatedCube\n"
 		"FormFactorCantellatedCube::FormFactorCantellatedCube(double length, double removed_length)\n"
 		"\n"
@@ -127321,6 +129186,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorCantellatedCube_swigregister", FormFactorCantellatedCube_swigregister, METH_O, NULL},
 	 { "FormFactorCantellatedCube_swiginit", FormFactorCantellatedCube_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorCone", _wrap_new_FormFactorCone, METH_VARARGS, "\n"
+		"FormFactorCone(vdouble1d_t P)\n"
 		"new_FormFactorCone(double radius, double height, double alpha) -> FormFactorCone\n"
 		"FormFactorCone::FormFactorCone(double radius, double height, double alpha)\n"
 		"\n"
@@ -127386,6 +129252,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorCone_swigregister", FormFactorCone_swigregister, METH_O, NULL},
 	 { "FormFactorCone_swiginit", FormFactorCone_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorCone6", _wrap_new_FormFactorCone6, METH_VARARGS, "\n"
+		"FormFactorCone6(vdouble1d_t P)\n"
 		"new_FormFactorCone6(double base_edge, double height, double alpha) -> FormFactorCone6\n"
 		"FormFactorCone6::FormFactorCone6(double base_edge, double height, double alpha)\n"
 		"\n"
@@ -127437,6 +129304,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorCone6_swigregister", FormFactorCone6_swigregister, METH_O, NULL},
 	 { "FormFactorCone6_swiginit", FormFactorCone6_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorCuboctahedron", _wrap_new_FormFactorCuboctahedron, METH_VARARGS, "\n"
+		"FormFactorCuboctahedron(vdouble1d_t P)\n"
 		"new_FormFactorCuboctahedron(double length, double height, double height_ratio, double alpha) -> FormFactorCuboctahedron\n"
 		"FormFactorCuboctahedron::FormFactorCuboctahedron(double length, double height, double height_ratio, double alpha)\n"
 		"\n"
@@ -127496,6 +129364,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorCuboctahedron_swigregister", FormFactorCuboctahedron_swigregister, METH_O, NULL},
 	 { "FormFactorCuboctahedron_swiginit", FormFactorCuboctahedron_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorCylinder", _wrap_new_FormFactorCylinder, METH_VARARGS, "\n"
+		"FormFactorCylinder(vdouble1d_t P)\n"
 		"new_FormFactorCylinder(double radius, double height) -> FormFactorCylinder\n"
 		"FormFactorCylinder::FormFactorCylinder(double radius, double height)\n"
 		"\n"
@@ -127552,7 +129421,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_FormFactorCylinder", _wrap_delete_FormFactorCylinder, METH_O, "delete_FormFactorCylinder(FormFactorCylinder self)"},
 	 { "FormFactorCylinder_swigregister", FormFactorCylinder_swigregister, METH_O, NULL},
 	 { "FormFactorCylinder_swiginit", FormFactorCylinder_swiginit, METH_VARARGS, NULL},
-	 { "new_FormFactorDodecahedron", _wrap_new_FormFactorDodecahedron, METH_O, "\n"
+	 { "new_FormFactorDodecahedron", _wrap_new_FormFactorDodecahedron, METH_VARARGS, "\n"
+		"FormFactorDodecahedron(vdouble1d_t P)\n"
 		"new_FormFactorDodecahedron(double edge) -> FormFactorDodecahedron\n"
 		"FormFactorDodecahedron::FormFactorDodecahedron(double edge)\n"
 		"\n"
@@ -127595,7 +129465,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_FormFactorDodecahedron", _wrap_delete_FormFactorDodecahedron, METH_O, "delete_FormFactorDodecahedron(FormFactorDodecahedron self)"},
 	 { "FormFactorDodecahedron_swigregister", FormFactorDodecahedron_swigregister, METH_O, NULL},
 	 { "FormFactorDodecahedron_swiginit", FormFactorDodecahedron_swiginit, METH_VARARGS, NULL},
-	 { "new_FormFactorDot", _wrap_new_FormFactorDot, METH_O, "\n"
+	 { "new_FormFactorDot", _wrap_new_FormFactorDot, METH_VARARGS, "\n"
+		"FormFactorDot(vdouble1d_t P)\n"
 		"new_FormFactorDot(double radius) -> FormFactorDot\n"
 		"FormFactorDot::FormFactorDot(double radius)\n"
 		"\n"
@@ -127659,6 +129530,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorDot_swigregister", FormFactorDot_swigregister, METH_O, NULL},
 	 { "FormFactorDot_swiginit", FormFactorDot_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorEllipsoidalCylinder", _wrap_new_FormFactorEllipsoidalCylinder, METH_VARARGS, "\n"
+		"FormFactorEllipsoidalCylinder(vdouble1d_t P)\n"
 		"new_FormFactorEllipsoidalCylinder(double radius_x, double radius_y, double height) -> FormFactorEllipsoidalCylinder\n"
 		"FormFactorEllipsoidalCylinder::FormFactorEllipsoidalCylinder(double radius_x, double radius_y, double height)\n"
 		"\n"
@@ -127724,6 +129596,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorEllipsoidalCylinder_swigregister", FormFactorEllipsoidalCylinder_swigregister, METH_O, NULL},
 	 { "FormFactorEllipsoidalCylinder_swiginit", FormFactorEllipsoidalCylinder_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorFullSphere", _wrap_new_FormFactorFullSphere, METH_VARARGS, "\n"
+		"FormFactorFullSphere(vdouble1d_t P, bool position_at_center=False)\n"
 		"FormFactorFullSphere(double radius, bool position_at_center=False)\n"
 		"FormFactorFullSphere::FormFactorFullSphere(double radius, bool position_at_center=false)\n"
 		"\n"
@@ -127787,6 +129660,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorFullSphere_swigregister", FormFactorFullSphere_swigregister, METH_O, NULL},
 	 { "FormFactorFullSphere_swiginit", FormFactorFullSphere_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorFullSpheroid", _wrap_new_FormFactorFullSpheroid, METH_VARARGS, "\n"
+		"FormFactorFullSpheroid(vdouble1d_t P)\n"
 		"new_FormFactorFullSpheroid(double radius, double height) -> FormFactorFullSpheroid\n"
 		"FormFactorFullSpheroid::FormFactorFullSpheroid(double radius, double height)\n"
 		"\n"
@@ -127844,6 +129718,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorFullSpheroid_swigregister", FormFactorFullSpheroid_swigregister, METH_O, NULL},
 	 { "FormFactorFullSpheroid_swiginit", FormFactorFullSpheroid_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorHemiEllipsoid", _wrap_new_FormFactorHemiEllipsoid, METH_VARARGS, "\n"
+		"FormFactorHemiEllipsoid(vdouble1d_t P)\n"
 		"new_FormFactorHemiEllipsoid(double radius_x, double radius_y, double height) -> FormFactorHemiEllipsoid\n"
 		"FormFactorHemiEllipsoid::FormFactorHemiEllipsoid(double radius_x, double radius_y, double height)\n"
 		"\n"
@@ -127913,6 +129788,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorHemiEllipsoid_swigregister", FormFactorHemiEllipsoid_swigregister, METH_O, NULL},
 	 { "FormFactorHemiEllipsoid_swiginit", FormFactorHemiEllipsoid_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorHollowSphere", _wrap_new_FormFactorHollowSphere, METH_VARARGS, "\n"
+		"FormFactorHollowSphere(vdouble1d_t P)\n"
 		"new_FormFactorHollowSphere(double mean, double full_width) -> FormFactorHollowSphere\n"
 		"FormFactorHollowSphere::FormFactorHollowSphere(double mean, double full_width)\n"
 		"\n"
@@ -127948,7 +129824,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_FormFactorHollowSphere", _wrap_delete_FormFactorHollowSphere, METH_O, "delete_FormFactorHollowSphere(FormFactorHollowSphere self)"},
 	 { "FormFactorHollowSphere_swigregister", FormFactorHollowSphere_swigregister, METH_O, NULL},
 	 { "FormFactorHollowSphere_swiginit", FormFactorHollowSphere_swiginit, METH_VARARGS, NULL},
-	 { "new_FormFactorIcosahedron", _wrap_new_FormFactorIcosahedron, METH_O, "\n"
+	 { "new_FormFactorIcosahedron", _wrap_new_FormFactorIcosahedron, METH_VARARGS, "\n"
+		"FormFactorIcosahedron(vdouble1d_t P)\n"
 		"new_FormFactorIcosahedron(double edge) -> FormFactorIcosahedron\n"
 		"FormFactorIcosahedron::FormFactorIcosahedron(double edge)\n"
 		"\n"
@@ -127984,6 +129861,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorIcosahedron_swigregister", FormFactorIcosahedron_swigregister, METH_O, NULL},
 	 { "FormFactorIcosahedron_swiginit", FormFactorIcosahedron_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorLongBoxGauss", _wrap_new_FormFactorLongBoxGauss, METH_VARARGS, "\n"
+		"FormFactorLongBoxGauss(vdouble1d_t P)\n"
 		"new_FormFactorLongBoxGauss(double length, double width, double height) -> FormFactorLongBoxGauss\n"
 		"FormFactorLongBoxGauss::FormFactorLongBoxGauss(double length, double width, double height)\n"
 		"\n"
@@ -128049,6 +129927,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorLongBoxGauss_swigregister", FormFactorLongBoxGauss_swigregister, METH_O, NULL},
 	 { "FormFactorLongBoxGauss_swiginit", FormFactorLongBoxGauss_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorLongBoxLorentz", _wrap_new_FormFactorLongBoxLorentz, METH_VARARGS, "\n"
+		"FormFactorLongBoxLorentz(vdouble1d_t P)\n"
 		"new_FormFactorLongBoxLorentz(double length, double width, double height) -> FormFactorLongBoxLorentz\n"
 		"FormFactorLongBoxLorentz::FormFactorLongBoxLorentz(double length, double width, double height)\n"
 		"\n"
@@ -128114,6 +129993,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorLongBoxLorentz_swigregister", FormFactorLongBoxLorentz_swigregister, METH_O, NULL},
 	 { "FormFactorLongBoxLorentz_swiginit", FormFactorLongBoxLorentz_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorPrism3", _wrap_new_FormFactorPrism3, METH_VARARGS, "\n"
+		"FormFactorPrism3(vdouble1d_t P)\n"
 		"new_FormFactorPrism3(double base_edge, double height) -> FormFactorPrism3\n"
 		"FormFactorPrism3::FormFactorPrism3(double base_edge, double height)\n"
 		"\n"
@@ -128152,6 +130032,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorPrism3_swigregister", FormFactorPrism3_swigregister, METH_O, NULL},
 	 { "FormFactorPrism3_swiginit", FormFactorPrism3_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorPrism6", _wrap_new_FormFactorPrism6, METH_VARARGS, "\n"
+		"FormFactorPrism6(vdouble1d_t P)\n"
 		"new_FormFactorPrism6(double base_edge, double height) -> FormFactorPrism6\n"
 		"FormFactorPrism6::FormFactorPrism6(double base_edge, double height)\n"
 		"\n"
@@ -128190,6 +130071,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorPrism6_swigregister", FormFactorPrism6_swigregister, METH_O, NULL},
 	 { "FormFactorPrism6_swiginit", FormFactorPrism6_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorPyramid", _wrap_new_FormFactorPyramid, METH_VARARGS, "\n"
+		"FormFactorPyramid(vdouble1d_t P)\n"
 		"new_FormFactorPyramid(double base_edge, double height, double alpha) -> FormFactorPyramid\n"
 		"FormFactorPyramid::FormFactorPyramid(double base_edge, double height, double alpha)\n"
 		"\n"
@@ -128373,6 +130255,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorRipple2Lorentz_swigregister", FormFactorRipple2Lorentz_swigregister, METH_O, NULL},
 	 { "FormFactorRipple2Lorentz_swiginit", FormFactorRipple2Lorentz_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorTetrahedron", _wrap_new_FormFactorTetrahedron, METH_VARARGS, "\n"
+		"FormFactorTetrahedron(vdouble1d_t P)\n"
 		"new_FormFactorTetrahedron(double base_edge, double height, double alpha) -> FormFactorTetrahedron\n"
 		"FormFactorTetrahedron::FormFactorTetrahedron(double base_edge, double height, double alpha)\n"
 		"\n"
@@ -128424,6 +130307,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorTetrahedron_swigregister", FormFactorTetrahedron_swigregister, METH_O, NULL},
 	 { "FormFactorTetrahedron_swiginit", FormFactorTetrahedron_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorTruncatedCube", _wrap_new_FormFactorTruncatedCube, METH_VARARGS, "\n"
+		"FormFactorTruncatedCube(vdouble1d_t P)\n"
 		"new_FormFactorTruncatedCube(double length, double removed_length) -> FormFactorTruncatedCube\n"
 		"FormFactorTruncatedCube::FormFactorTruncatedCube(double length, double removed_length)\n"
 		"\n"
@@ -128467,6 +130351,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorTruncatedCube_swigregister", FormFactorTruncatedCube_swigregister, METH_O, NULL},
 	 { "FormFactorTruncatedCube_swiginit", FormFactorTruncatedCube_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorTruncatedSphere", _wrap_new_FormFactorTruncatedSphere, METH_VARARGS, "\n"
+		"FormFactorTruncatedSphere(vdouble1d_t P)\n"
 		"new_FormFactorTruncatedSphere(double radius, double height, double dh) -> FormFactorTruncatedSphere\n"
 		"FormFactorTruncatedSphere::FormFactorTruncatedSphere(double radius, double height, double dh=0.0)\n"
 		"\n"
@@ -128532,6 +130417,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorTruncatedSphere_swigregister", FormFactorTruncatedSphere_swigregister, METH_O, NULL},
 	 { "FormFactorTruncatedSphere_swiginit", FormFactorTruncatedSphere_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorTruncatedSpheroid", _wrap_new_FormFactorTruncatedSpheroid, METH_VARARGS, "\n"
+		"FormFactorTruncatedSpheroid(vdouble1d_t P)\n"
 		"new_FormFactorTruncatedSpheroid(double radius, double height, double height_flattening, double dh) -> FormFactorTruncatedSpheroid\n"
 		"FormFactorTruncatedSpheroid::FormFactorTruncatedSpheroid(double radius, double height, double height_flattening, double dh=0.0)\n"
 		"\n"
@@ -128619,7 +130505,10 @@ static PyMethodDef SwigMethods[] = {
 		"complex_t ripples::factor_x_Lorentz(complex_t q, double l)\n"
 		"\n"
 		""},
-	 { "new_FormFactorGaussSphere", _wrap_new_FormFactorGaussSphere, METH_O, "new_FormFactorGaussSphere(double mean_radius) -> FormFactorGaussSphere"},
+	 { "new_FormFactorGaussSphere", _wrap_new_FormFactorGaussSphere, METH_VARARGS, "\n"
+		"FormFactorGaussSphere(vdouble1d_t P)\n"
+		"new_FormFactorGaussSphere(double mean_radius) -> FormFactorGaussSphere\n"
+		""},
 	 { "FormFactorGaussSphere_clone", _wrap_FormFactorGaussSphere_clone, METH_O, "\n"
 		"FormFactorGaussSphere_clone(FormFactorGaussSphere self) -> FormFactorGaussSphere\n"
 		"IFormFactorBorn* IFormFactorBorn::clone() const override=0\n"
@@ -128653,6 +130542,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorGaussSphere_swigregister", FormFactorGaussSphere_swigregister, METH_O, NULL},
 	 { "FormFactorGaussSphere_swiginit", FormFactorGaussSphere_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorSphereGaussianRadius", _wrap_new_FormFactorSphereGaussianRadius, METH_VARARGS, "\n"
+		"FormFactorSphereGaussianRadius(vdouble1d_t P)\n"
 		"new_FormFactorSphereGaussianRadius(double mean, double sigma) -> FormFactorSphereGaussianRadius\n"
 		"FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(double mean, double sigma)\n"
 		"\n"
@@ -128689,6 +130579,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "FormFactorSphereGaussianRadius_swigregister", FormFactorSphereGaussianRadius_swigregister, METH_O, NULL},
 	 { "FormFactorSphereGaussianRadius_swiginit", FormFactorSphereGaussianRadius_swiginit, METH_VARARGS, NULL},
 	 { "new_FormFactorSphereLogNormalRadius", _wrap_new_FormFactorSphereLogNormalRadius, METH_VARARGS, "\n"
+		"FormFactorSphereLogNormalRadius(vdouble1d_t P, size_t n_samples=0)\n"
 		"new_FormFactorSphereLogNormalRadius(double mean, double scale_param, size_t n_samples) -> FormFactorSphereLogNormalRadius\n"
 		"FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(double mean, double scale_param, size_t n_samples)\n"
 		"\n"
-- 
GitLab