diff --git a/Device/Coord/CoordSystem2D.cpp b/Device/Coord/CoordSystem2D.cpp
index edbc5923a5a8fe2bebaf2a42682e1d1032b7bc65..917d62b1493c62626bbe9af17a91c051f3907793 100644
--- a/Device/Coord/CoordSystem2D.cpp
+++ b/Device/Coord/CoordSystem2D.cpp
@@ -32,9 +32,9 @@ double getQ(double wavelength, double angle)
 double axisAngle(size_t i_axis, R3 k_f)
 {
     if (i_axis == 0)
-        return k_f.phi();
+        return R3Util::phi(k_f);
     if (i_axis == 1)
-        return M_PI_2 - k_f.theta();
+        return M_PI_2 - R3Util::theta(k_f);
     ASSERT(0);
 }
 
@@ -292,8 +292,8 @@ OffSpecularCoordinates* OffSpecularCoordinates::createForRectangularDetector(
 {
     const auto k00 = detectorPixel.getPosition(0.0, 0.0);
     const auto k01 = detectorPixel.getPosition(0.0, 1.0);
-    const double alpha_f_min = M_PI_2 - k00.theta();
-    const double alpha_f_max = M_PI_2 - k01.theta();
+    const double alpha_f_min = M_PI_2 - R3Util::theta(k00);
+    const double alpha_f_max = M_PI_2 - R3Util::theta(k01);
 
     return new OffSpecularCoordinates(direction, alphaAxis, alpha_f_min, alpha_f_max, yAxis.size());
 }
diff --git a/Resample/Element/DiffuseElement.cpp b/Resample/Element/DiffuseElement.cpp
index 169c48044337dd3e32ebbce51cd2e2a43b9d56d5..8af13ab06b8eaff40bf209b1b9666219ca73670e 100644
--- a/Resample/Element/DiffuseElement.cpp
+++ b/Resample/Element/DiffuseElement.cpp
@@ -113,12 +113,12 @@ R3 DiffuseElement::getQ(double x, double y) const
 
 double DiffuseElement::alpha(double x, double y) const
 {
-    return M_PI_2 - getKf(x, y).theta();
+    return M_PI_2 - R3Util::theta(getKf(x, y));
 }
 
 double DiffuseElement::getPhi(double x, double y) const
 {
-    return getKf(x, y).phi();
+    return R3Util::phi(getKf(x, y));
 }
 
 WavevectorInfo DiffuseElement::wavevectorInfo() const
diff --git a/Sample/Material/MaterialUtils.cpp b/Sample/Material/MaterialUtils.cpp
index 4612fc4be1afa808eee4f02b6a96e1dedcb35c03..d8498d5a031f0dbdb411704eb1e987565b84c25a 100644
--- a/Sample/Material/MaterialUtils.cpp
+++ b/Sample/Material/MaterialUtils.cpp
@@ -56,7 +56,7 @@ template Eigen::Matrix2cd MaterialUtils::MagnetizationCorrection(complex_t unit_
 
 complex_t MaterialUtils::ScalarReducedPotential(complex_t n, R3 k, double n_ref)
 {
-    return n * n - n_ref * n_ref * k.sin2Theta();
+    return n * n - n_ref * n_ref * R3Util::sin2Theta(k);
 }
 
 Eigen::Matrix2cd MaterialUtils::PolarizedReducedPotential(complex_t n, R3 b_field, R3 k,
diff --git a/Tests/Unit/Sim/RectangularDetectorTest.cpp b/Tests/Unit/Sim/RectangularDetectorTest.cpp
index e0bff30e87f9945d28dd6d7a059f85b38f854278..8a460d1efa34f878b2430e6ccf96c3c315da2cc8 100644
--- a/Tests/Unit/Sim/RectangularDetectorTest.cpp
+++ b/Tests/Unit/Sim/RectangularDetectorTest.cpp
@@ -9,8 +9,8 @@
 
 class RectangularDetectorTest : public ::testing::Test {
 protected:
-    double phi(R3 k) { return k.phi() / Units::deg; }
-    double alpha(R3 k) { return 90.0 - k.theta() / Units::deg; }
+    double phi(R3 k) { return R3Util::phi(k) / Units::deg; }
+    double alpha(R3 k) { return 90.0 - R3Util::theta(k) / Units::deg; }
 
     bool isEqual(const R3 lhs, const R3 rhs)
     {
diff --git a/auto/Wrap/libBornAgainBase.py b/auto/Wrap/libBornAgainBase.py
index 49f14a2dfe9efcec6303cc2ca9d7968d5aadb23f..45e9562b5187c12e064cbbfc245c30d57b9a4eb8 100644
--- a/auto/Wrap/libBornAgainBase.py
+++ b/auto/Wrap/libBornAgainBase.py
@@ -1953,6 +1953,26 @@ cvar = _libBornAgainBase.cvar
 I = cvar.I
 
 
+def theta(a):
+    r"""theta(R3 a) -> double"""
+    return _libBornAgainBase.theta(a)
+
+def phi(a):
+    r"""phi(R3 a) -> double"""
+    return _libBornAgainBase.phi(a)
+
+def cosTheta(a):
+    r"""cosTheta(R3 a) -> double"""
+    return _libBornAgainBase.cosTheta(a)
+
+def sin2Theta(a):
+    r"""sin2Theta(R3 a) -> double"""
+    return _libBornAgainBase.sin2Theta(a)
+
+def angle(a, b):
+    r"""angle(R3 a, R3 b) -> double"""
+    return _libBornAgainBase.angle(a, b)
+
 def vecOfLambdaAlphaPhi(_lambda, _alpha, _phi):
     r"""
     vecOfLambdaAlphaPhi(double _lambda, double _alpha, double _phi) -> R3
@@ -3019,22 +3039,6 @@ class R3(object):
         r"""magxy(R3 self) -> double"""
         return _libBornAgainBase.R3_magxy(self)
 
-    def phi(self):
-        r"""phi(R3 self) -> double"""
-        return _libBornAgainBase.R3_phi(self)
-
-    def theta(self):
-        r"""theta(R3 self) -> double"""
-        return _libBornAgainBase.R3_theta(self)
-
-    def cosTheta(self):
-        r"""cosTheta(R3 self) -> double"""
-        return _libBornAgainBase.R3_cosTheta(self)
-
-    def sin2Theta(self):
-        r"""sin2Theta(R3 self) -> double"""
-        return _libBornAgainBase.R3_sin2Theta(self)
-
     def unit(self):
         r"""unit(R3 self) -> R3"""
         return _libBornAgainBase.R3_unit(self)
@@ -3055,10 +3059,6 @@ class R3(object):
         r"""__ne__(R3 self, R3 other) -> bool"""
         return _libBornAgainBase.R3___ne__(self, other)
 
-    def angle(self, v):
-        r"""angle(R3 self, R3 v) -> double"""
-        return _libBornAgainBase.R3_angle(self, v)
-
     def project(self, v):
         r"""project(R3 self, R3 v) -> R3"""
         return _libBornAgainBase.R3_project(self, v)
diff --git a/auto/Wrap/libBornAgainBase_wrap.cpp b/auto/Wrap/libBornAgainBase_wrap.cpp
index d81145939dc4dca063e95d395a16b722e7e46b85..16fdb766edeb976767f0dcbcd7af79c0d69d99e2 100644
--- a/auto/Wrap/libBornAgainBase_wrap.cpp
+++ b/auto/Wrap/libBornAgainBase_wrap.cpp
@@ -5253,7 +5253,7 @@ SWIG_AsVal_std_complex_Sl_double_Sg_  (PyObject *o, std::complex<double>* val)
 
 
 SWIGINTERNINLINE PyObject*
-SWIG_From_std_complex_Sl_double_Sg_  (/*@SWIG:/usr/local/share/swig/4.0.2/typemaps/swigmacros.swg,104,%ifcplusplus@*/
+SWIG_From_std_complex_Sl_double_Sg_  (/*@SWIG:/usr/share/swig4.0/typemaps/swigmacros.swg,104,%ifcplusplus@*/
 
 const std::complex<double>&
 
@@ -26653,6 +26653,146 @@ SWIGINTERN PyObject *Swig_var_gauss_get(void) {
 }
 
 
+SWIGINTERN PyObject *_wrap_theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  R3 *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "theta" "', argument " "1"" of type '" "R3 const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "theta" "', argument " "1"" of type '" "R3 const &""'"); 
+  }
+  arg1 = reinterpret_cast< R3 * >(argp1);
+  result = (double)R3Util::theta((Vec3< double > const &)*arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_phi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  R3 *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "phi" "', argument " "1"" of type '" "R3 const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "phi" "', argument " "1"" of type '" "R3 const &""'"); 
+  }
+  arg1 = reinterpret_cast< R3 * >(argp1);
+  result = (double)R3Util::phi((Vec3< double > const &)*arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cosTheta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  R3 *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cosTheta" "', argument " "1"" of type '" "R3 const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "cosTheta" "', argument " "1"" of type '" "R3 const &""'"); 
+  }
+  arg1 = reinterpret_cast< R3 * >(argp1);
+  result = (double)R3Util::cosTheta((Vec3< double > const &)*arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_sin2Theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  R3 *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sin2Theta" "', argument " "1"" of type '" "R3 const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "sin2Theta" "', argument " "1"" of type '" "R3 const &""'"); 
+  }
+  arg1 = reinterpret_cast< R3 * >(argp1);
+  result = (double)R3Util::sin2Theta((Vec3< double > const &)*arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_angle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  R3 *arg1 = 0 ;
+  R3 *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  double result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "angle", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "angle" "', argument " "1"" of type '" "R3 const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "angle" "', argument " "1"" of type '" "R3 const &""'"); 
+  }
+  arg1 = reinterpret_cast< R3 * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "angle" "', argument " "2"" of type '" "R3 const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "angle" "', argument " "2"" of type '" "R3 const &""'"); 
+  }
+  arg2 = reinterpret_cast< R3 * >(argp2);
+  result = (double)R3Util::angle((Vec3< double > const &)*arg1,(Vec3< double > const &)*arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_vecOfLambdaAlphaPhi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
@@ -30523,98 +30663,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_R3_phi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_phi" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->phi();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_theta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->theta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_cosTheta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_cosTheta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->cosTheta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_sin2Theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_sin2Theta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->sin2Theta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_R3_unit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -30754,39 +30802,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_R3_angle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  Vec3< double > *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "R3_angle", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_angle" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "R3_angle" "', argument " "2"" of type '" "Vec3< double > const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "R3_angle" "', argument " "2"" of type '" "Vec3< double > const &""'"); 
-  }
-  arg2 = reinterpret_cast< Vec3< double > * >(argp2);
-  result = (double)((Vec3< double > const *)arg1)->angle((Vec3< double > const &)*arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_R3_project(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -35790,6 +35805,11 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "ICloneable_swigregister", ICloneable_swigregister, METH_O, NULL},
+	 { "theta", _wrap_theta, METH_O, "theta(R3 a) -> double"},
+	 { "phi", _wrap_phi, METH_O, "phi(R3 a) -> double"},
+	 { "cosTheta", _wrap_cosTheta, METH_O, "cosTheta(R3 a) -> double"},
+	 { "sin2Theta", _wrap_sin2Theta, METH_O, "sin2Theta(R3 a) -> double"},
+	 { "angle", _wrap_angle, METH_VARARGS, "angle(R3 a, R3 b) -> double"},
 	 { "vecOfLambdaAlphaPhi", _wrap_vecOfLambdaAlphaPhi, METH_VARARGS, "\n"
 		"vecOfLambdaAlphaPhi(double _lambda, double _alpha, double _phi) -> R3\n"
 		"R3 vecOfLambdaAlphaPhi(double _lambda, double _alpha, double _phi)\n"
@@ -36411,16 +36431,11 @@ static PyMethodDef SwigMethods[] = {
 	 { "R3_mag", _wrap_R3_mag, METH_O, "R3_mag(R3 self) -> double"},
 	 { "R3_magxy2", _wrap_R3_magxy2, METH_O, "R3_magxy2(R3 self) -> double"},
 	 { "R3_magxy", _wrap_R3_magxy, METH_O, "R3_magxy(R3 self) -> double"},
-	 { "R3_phi", _wrap_R3_phi, METH_O, "R3_phi(R3 self) -> double"},
-	 { "R3_theta", _wrap_R3_theta, METH_O, "R3_theta(R3 self) -> double"},
-	 { "R3_cosTheta", _wrap_R3_cosTheta, METH_O, "R3_cosTheta(R3 self) -> double"},
-	 { "R3_sin2Theta", _wrap_R3_sin2Theta, METH_O, "R3_sin2Theta(R3 self) -> double"},
 	 { "R3_unit", _wrap_R3_unit, METH_O, "R3_unit(R3 self) -> R3"},
 	 { "R3_complex", _wrap_R3_complex, METH_O, "R3_complex(R3 self) -> C3"},
 	 { "R3_real", _wrap_R3_real, METH_O, "R3_real(R3 self) -> R3"},
 	 { "R3___eq__", _wrap_R3___eq__, METH_VARARGS, "R3___eq__(R3 self, R3 other) -> bool"},
 	 { "R3___ne__", _wrap_R3___ne__, METH_VARARGS, "R3___ne__(R3 self, R3 other) -> bool"},
-	 { "R3_angle", _wrap_R3_angle, METH_VARARGS, "R3_angle(R3 self, R3 v) -> double"},
 	 { "R3_project", _wrap_R3_project, METH_VARARGS, "R3_project(R3 self, R3 v) -> R3"},
 	 { "delete_R3", _wrap_delete_R3, METH_O, "delete_R3(R3 self)"},
 	 { "R3_swigregister", R3_swigregister, METH_O, NULL},
diff --git a/auto/Wrap/libBornAgainDevice.py b/auto/Wrap/libBornAgainDevice.py
index cf4ba3c76695d4651e26c3ba62a1ebd78caf01d4..1e781d2f3fcf21d046ba939f4a222ffb111b9512 100644
--- a/auto/Wrap/libBornAgainDevice.py
+++ b/auto/Wrap/libBornAgainDevice.py
@@ -1969,22 +1969,6 @@ class R3(object):
         r"""magxy(R3 self) -> double"""
         return _libBornAgainDevice.R3_magxy(self)
 
-    def phi(self):
-        r"""phi(R3 self) -> double"""
-        return _libBornAgainDevice.R3_phi(self)
-
-    def theta(self):
-        r"""theta(R3 self) -> double"""
-        return _libBornAgainDevice.R3_theta(self)
-
-    def cosTheta(self):
-        r"""cosTheta(R3 self) -> double"""
-        return _libBornAgainDevice.R3_cosTheta(self)
-
-    def sin2Theta(self):
-        r"""sin2Theta(R3 self) -> double"""
-        return _libBornAgainDevice.R3_sin2Theta(self)
-
     def unit(self):
         r"""unit(R3 self) -> R3"""
         return _libBornAgainDevice.R3_unit(self)
@@ -2005,10 +1989,6 @@ class R3(object):
         r"""__ne__(R3 self, R3 other) -> bool"""
         return _libBornAgainDevice.R3___ne__(self, other)
 
-    def angle(self, v):
-        r"""angle(R3 self, R3 v) -> double"""
-        return _libBornAgainDevice.R3_angle(self, v)
-
     def project(self, v):
         r"""project(R3 self, R3 v) -> R3"""
         return _libBornAgainDevice.R3_project(self, v)
diff --git a/auto/Wrap/libBornAgainDevice_wrap.cpp b/auto/Wrap/libBornAgainDevice_wrap.cpp
index bf5e752812a07bda62c0e324947f7a74f03af705..069d328590fa50ab8e97b988680a99d075446665 100644
--- a/auto/Wrap/libBornAgainDevice_wrap.cpp
+++ b/auto/Wrap/libBornAgainDevice_wrap.cpp
@@ -5300,7 +5300,7 @@ SWIG_AsVal_std_complex_Sl_double_Sg_  (PyObject *o, std::complex<double>* val)
 
 
 SWIGINTERNINLINE PyObject*
-SWIG_From_std_complex_Sl_double_Sg_  (/*@SWIG:/usr/local/share/swig/4.0.2/typemaps/swigmacros.swg,104,%ifcplusplus@*/
+SWIG_From_std_complex_Sl_double_Sg_  (/*@SWIG:/usr/share/swig4.0/typemaps/swigmacros.swg,104,%ifcplusplus@*/
 
 const std::complex<double>&
 
@@ -26895,98 +26895,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_R3_phi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_phi" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->phi();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_theta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->theta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_cosTheta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_cosTheta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->cosTheta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_sin2Theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_sin2Theta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->sin2Theta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_R3_unit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -27126,39 +27034,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_R3_angle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  Vec3< double > *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "R3_angle", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_angle" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "R3_angle" "', argument " "2"" of type '" "Vec3< double > const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "R3_angle" "', argument " "2"" of type '" "Vec3< double > const &""'"); 
-  }
-  arg2 = reinterpret_cast< Vec3< double > * >(argp2);
-  result = (double)((Vec3< double > const *)arg1)->angle((Vec3< double > const &)*arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_R3_project(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -47185,16 +47060,11 @@ static PyMethodDef SwigMethods[] = {
 	 { "R3_mag", _wrap_R3_mag, METH_O, "R3_mag(R3 self) -> double"},
 	 { "R3_magxy2", _wrap_R3_magxy2, METH_O, "R3_magxy2(R3 self) -> double"},
 	 { "R3_magxy", _wrap_R3_magxy, METH_O, "R3_magxy(R3 self) -> double"},
-	 { "R3_phi", _wrap_R3_phi, METH_O, "R3_phi(R3 self) -> double"},
-	 { "R3_theta", _wrap_R3_theta, METH_O, "R3_theta(R3 self) -> double"},
-	 { "R3_cosTheta", _wrap_R3_cosTheta, METH_O, "R3_cosTheta(R3 self) -> double"},
-	 { "R3_sin2Theta", _wrap_R3_sin2Theta, METH_O, "R3_sin2Theta(R3 self) -> double"},
 	 { "R3_unit", _wrap_R3_unit, METH_O, "R3_unit(R3 self) -> R3"},
 	 { "R3_complex", _wrap_R3_complex, METH_O, "R3_complex(R3 self) -> C3"},
 	 { "R3_real", _wrap_R3_real, METH_O, "R3_real(R3 self) -> R3"},
 	 { "R3___eq__", _wrap_R3___eq__, METH_VARARGS, "R3___eq__(R3 self, R3 other) -> bool"},
 	 { "R3___ne__", _wrap_R3___ne__, METH_VARARGS, "R3___ne__(R3 self, R3 other) -> bool"},
-	 { "R3_angle", _wrap_R3_angle, METH_VARARGS, "R3_angle(R3 self, R3 v) -> double"},
 	 { "R3_project", _wrap_R3_project, METH_VARARGS, "R3_project(R3 self, R3 v) -> R3"},
 	 { "delete_R3", _wrap_delete_R3, METH_O, "delete_R3(R3 self)"},
 	 { "R3_swigregister", R3_swigregister, METH_O, NULL},
diff --git a/auto/Wrap/libBornAgainResample.py b/auto/Wrap/libBornAgainResample.py
index 8585eb8bb0f8da47fb7399cbe4a6fd9ce1130c16..b388c4fe5023c07ec3563207f4e5b85f9adc22e3 100644
--- a/auto/Wrap/libBornAgainResample.py
+++ b/auto/Wrap/libBornAgainResample.py
@@ -2124,22 +2124,6 @@ class R3(object):
         r"""magxy(R3 self) -> double"""
         return _libBornAgainResample.R3_magxy(self)
 
-    def phi(self):
-        r"""phi(R3 self) -> double"""
-        return _libBornAgainResample.R3_phi(self)
-
-    def theta(self):
-        r"""theta(R3 self) -> double"""
-        return _libBornAgainResample.R3_theta(self)
-
-    def cosTheta(self):
-        r"""cosTheta(R3 self) -> double"""
-        return _libBornAgainResample.R3_cosTheta(self)
-
-    def sin2Theta(self):
-        r"""sin2Theta(R3 self) -> double"""
-        return _libBornAgainResample.R3_sin2Theta(self)
-
     def unit(self):
         r"""unit(R3 self) -> R3"""
         return _libBornAgainResample.R3_unit(self)
@@ -2160,10 +2144,6 @@ class R3(object):
         r"""__ne__(R3 self, R3 other) -> bool"""
         return _libBornAgainResample.R3___ne__(self, other)
 
-    def angle(self, v):
-        r"""angle(R3 self, R3 v) -> double"""
-        return _libBornAgainResample.R3_angle(self, v)
-
     def project(self, v):
         r"""project(R3 self, R3 v) -> R3"""
         return _libBornAgainResample.R3_project(self, v)
diff --git a/auto/Wrap/libBornAgainResample_wrap.cpp b/auto/Wrap/libBornAgainResample_wrap.cpp
index 1dd3d81da1bf343b4db7dea141a40e5731cfabaf..b194d1503a3fe7573738d74fa371a8174a4460bc 100644
--- a/auto/Wrap/libBornAgainResample_wrap.cpp
+++ b/auto/Wrap/libBornAgainResample_wrap.cpp
@@ -5243,7 +5243,7 @@ SWIG_AsVal_std_complex_Sl_double_Sg_  (PyObject *o, std::complex<double>* val)
 
 
 SWIGINTERNINLINE PyObject*
-SWIG_From_std_complex_Sl_double_Sg_  (/*@SWIG:/usr/local/share/swig/4.0.2/typemaps/swigmacros.swg,104,%ifcplusplus@*/
+SWIG_From_std_complex_Sl_double_Sg_  (/*@SWIG:/usr/share/swig4.0/typemaps/swigmacros.swg,104,%ifcplusplus@*/
 
 const std::complex<double>&
 
@@ -27338,98 +27338,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_R3_phi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_phi" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->phi();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_theta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->theta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_cosTheta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_cosTheta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->cosTheta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_sin2Theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_sin2Theta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->sin2Theta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_R3_unit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -27569,39 +27477,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_R3_angle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  Vec3< double > *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "R3_angle", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_angle" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "R3_angle" "', argument " "2"" of type '" "Vec3< double > const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "R3_angle" "', argument " "2"" of type '" "Vec3< double > const &""'"); 
-  }
-  arg2 = reinterpret_cast< Vec3< double > * >(argp2);
-  result = (double)((Vec3< double > const *)arg1)->angle((Vec3< double > const &)*arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_R3_project(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -33041,16 +32916,11 @@ static PyMethodDef SwigMethods[] = {
 	 { "R3_mag", _wrap_R3_mag, METH_O, "R3_mag(R3 self) -> double"},
 	 { "R3_magxy2", _wrap_R3_magxy2, METH_O, "R3_magxy2(R3 self) -> double"},
 	 { "R3_magxy", _wrap_R3_magxy, METH_O, "R3_magxy(R3 self) -> double"},
-	 { "R3_phi", _wrap_R3_phi, METH_O, "R3_phi(R3 self) -> double"},
-	 { "R3_theta", _wrap_R3_theta, METH_O, "R3_theta(R3 self) -> double"},
-	 { "R3_cosTheta", _wrap_R3_cosTheta, METH_O, "R3_cosTheta(R3 self) -> double"},
-	 { "R3_sin2Theta", _wrap_R3_sin2Theta, METH_O, "R3_sin2Theta(R3 self) -> double"},
 	 { "R3_unit", _wrap_R3_unit, METH_O, "R3_unit(R3 self) -> R3"},
 	 { "R3_complex", _wrap_R3_complex, METH_O, "R3_complex(R3 self) -> C3"},
 	 { "R3_real", _wrap_R3_real, METH_O, "R3_real(R3 self) -> R3"},
 	 { "R3___eq__", _wrap_R3___eq__, METH_VARARGS, "R3___eq__(R3 self, R3 other) -> bool"},
 	 { "R3___ne__", _wrap_R3___ne__, METH_VARARGS, "R3___ne__(R3 self, R3 other) -> bool"},
-	 { "R3_angle", _wrap_R3_angle, METH_VARARGS, "R3_angle(R3 self, R3 v) -> double"},
 	 { "R3_project", _wrap_R3_project, METH_VARARGS, "R3_project(R3 self, R3 v) -> R3"},
 	 { "R3___add__", _wrap_R3___add__, METH_VARARGS, "R3___add__(R3 self, R3 rhs) -> R3"},
 	 { "R3___mul__", _wrap_R3___mul__, METH_VARARGS, "R3___mul__(R3 self, double c) -> R3"},
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index 57e5cb39f2f1c65541546ead803a81aba71f693a..a3032b3a8eb3d2181c65b8a6bd6af0bcc10823b8 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -1968,22 +1968,6 @@ class R3(object):
         r"""magxy(R3 self) -> double"""
         return _libBornAgainSample.R3_magxy(self)
 
-    def phi(self):
-        r"""phi(R3 self) -> double"""
-        return _libBornAgainSample.R3_phi(self)
-
-    def theta(self):
-        r"""theta(R3 self) -> double"""
-        return _libBornAgainSample.R3_theta(self)
-
-    def cosTheta(self):
-        r"""cosTheta(R3 self) -> double"""
-        return _libBornAgainSample.R3_cosTheta(self)
-
-    def sin2Theta(self):
-        r"""sin2Theta(R3 self) -> double"""
-        return _libBornAgainSample.R3_sin2Theta(self)
-
     def unit(self):
         r"""unit(R3 self) -> R3"""
         return _libBornAgainSample.R3_unit(self)
@@ -2004,10 +1988,6 @@ class R3(object):
         r"""__ne__(R3 self, R3 other) -> bool"""
         return _libBornAgainSample.R3___ne__(self, other)
 
-    def angle(self, v):
-        r"""angle(R3 self, R3 v) -> double"""
-        return _libBornAgainSample.R3_angle(self, v)
-
     def project(self, v):
         r"""project(R3 self, R3 v) -> R3"""
         return _libBornAgainSample.R3_project(self, v)
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index ee3bf8b289dac1b418d7aa06f06e16ab71b48a9e..b1092fbad736124be47c244bf3bf61e1485e15b8 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -27852,98 +27852,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_R3_phi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_phi" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->phi();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_theta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->theta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_cosTheta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_cosTheta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->cosTheta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_sin2Theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_sin2Theta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->sin2Theta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_R3_unit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -28083,39 +27991,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_R3_angle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  Vec3< double > *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "R3_angle", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_angle" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "R3_angle" "', argument " "2"" of type '" "Vec3< double > const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "R3_angle" "', argument " "2"" of type '" "Vec3< double > const &""'"); 
-  }
-  arg2 = reinterpret_cast< Vec3< double > * >(argp2);
-  result = (double)((Vec3< double > const *)arg1)->angle((Vec3< double > const &)*arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_R3_project(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -65178,16 +65053,11 @@ static PyMethodDef SwigMethods[] = {
 	 { "R3_mag", _wrap_R3_mag, METH_O, "R3_mag(R3 self) -> double"},
 	 { "R3_magxy2", _wrap_R3_magxy2, METH_O, "R3_magxy2(R3 self) -> double"},
 	 { "R3_magxy", _wrap_R3_magxy, METH_O, "R3_magxy(R3 self) -> double"},
-	 { "R3_phi", _wrap_R3_phi, METH_O, "R3_phi(R3 self) -> double"},
-	 { "R3_theta", _wrap_R3_theta, METH_O, "R3_theta(R3 self) -> double"},
-	 { "R3_cosTheta", _wrap_R3_cosTheta, METH_O, "R3_cosTheta(R3 self) -> double"},
-	 { "R3_sin2Theta", _wrap_R3_sin2Theta, METH_O, "R3_sin2Theta(R3 self) -> double"},
 	 { "R3_unit", _wrap_R3_unit, METH_O, "R3_unit(R3 self) -> R3"},
 	 { "R3_complex", _wrap_R3_complex, METH_O, "R3_complex(R3 self) -> C3"},
 	 { "R3_real", _wrap_R3_real, METH_O, "R3_real(R3 self) -> R3"},
 	 { "R3___eq__", _wrap_R3___eq__, METH_VARARGS, "R3___eq__(R3 self, R3 other) -> bool"},
 	 { "R3___ne__", _wrap_R3___ne__, METH_VARARGS, "R3___ne__(R3 self, R3 other) -> bool"},
-	 { "R3_angle", _wrap_R3_angle, METH_VARARGS, "R3_angle(R3 self, R3 v) -> double"},
 	 { "R3_project", _wrap_R3_project, METH_VARARGS, "R3_project(R3 self, R3 v) -> R3"},
 	 { "R3___add__", _wrap_R3___add__, METH_VARARGS, "R3___add__(R3 self, R3 rhs) -> R3"},
 	 { "R3___mul__", _wrap_R3___mul__, METH_VARARGS, "R3___mul__(R3 self, double c) -> R3"},
diff --git a/auto/Wrap/libBornAgainSim.py b/auto/Wrap/libBornAgainSim.py
index 196888f3c803e5f3dfca8bf30ef93ca2dc89cedc..5283cb6d53b0462ba6e3fe9a1df3e347146c57e8 100644
--- a/auto/Wrap/libBornAgainSim.py
+++ b/auto/Wrap/libBornAgainSim.py
@@ -1969,22 +1969,6 @@ class R3(object):
         r"""magxy(R3 self) -> double"""
         return _libBornAgainSim.R3_magxy(self)
 
-    def phi(self):
-        r"""phi(R3 self) -> double"""
-        return _libBornAgainSim.R3_phi(self)
-
-    def theta(self):
-        r"""theta(R3 self) -> double"""
-        return _libBornAgainSim.R3_theta(self)
-
-    def cosTheta(self):
-        r"""cosTheta(R3 self) -> double"""
-        return _libBornAgainSim.R3_cosTheta(self)
-
-    def sin2Theta(self):
-        r"""sin2Theta(R3 self) -> double"""
-        return _libBornAgainSim.R3_sin2Theta(self)
-
     def unit(self):
         r"""unit(R3 self) -> R3"""
         return _libBornAgainSim.R3_unit(self)
@@ -2005,10 +1989,6 @@ class R3(object):
         r"""__ne__(R3 self, R3 other) -> bool"""
         return _libBornAgainSim.R3___ne__(self, other)
 
-    def angle(self, v):
-        r"""angle(R3 self, R3 v) -> double"""
-        return _libBornAgainSim.R3_angle(self, v)
-
     def project(self, v):
         r"""project(R3 self, R3 v) -> R3"""
         return _libBornAgainSim.R3_project(self, v)
diff --git a/auto/Wrap/libBornAgainSim_wrap.cpp b/auto/Wrap/libBornAgainSim_wrap.cpp
index 0632dedf53d40c114639909125c22e28e1d8e202..7e6c92967f8a28d7b198cd2e6b88afe2991da9af 100644
--- a/auto/Wrap/libBornAgainSim_wrap.cpp
+++ b/auto/Wrap/libBornAgainSim_wrap.cpp
@@ -27375,98 +27375,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_R3_phi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_phi" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->phi();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_theta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->theta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_cosTheta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_cosTheta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->cosTheta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_R3_sin2Theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  double result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_sin2Theta" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  result = (double)((Vec3< double > const *)arg1)->sin2Theta();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_R3_unit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -27606,39 +27514,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_R3_angle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  Vec3< double > *arg1 = (Vec3< double > *) 0 ;
-  Vec3< double > *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "R3_angle", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Vec3T_double_t, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "R3_angle" "', argument " "1"" of type '" "Vec3< double > const *""'"); 
-  }
-  arg1 = reinterpret_cast< Vec3< double > * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "R3_angle" "', argument " "2"" of type '" "Vec3< double > const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "R3_angle" "', argument " "2"" of type '" "Vec3< double > const &""'"); 
-  }
-  arg2 = reinterpret_cast< Vec3< double > * >(argp2);
-  result = (double)((Vec3< double > const *)arg1)->angle((Vec3< double > const &)*arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_R3_project(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Vec3< double > *arg1 = (Vec3< double > *) 0 ;
@@ -45980,16 +45855,11 @@ static PyMethodDef SwigMethods[] = {
 	 { "R3_mag", _wrap_R3_mag, METH_O, "R3_mag(R3 self) -> double"},
 	 { "R3_magxy2", _wrap_R3_magxy2, METH_O, "R3_magxy2(R3 self) -> double"},
 	 { "R3_magxy", _wrap_R3_magxy, METH_O, "R3_magxy(R3 self) -> double"},
-	 { "R3_phi", _wrap_R3_phi, METH_O, "R3_phi(R3 self) -> double"},
-	 { "R3_theta", _wrap_R3_theta, METH_O, "R3_theta(R3 self) -> double"},
-	 { "R3_cosTheta", _wrap_R3_cosTheta, METH_O, "R3_cosTheta(R3 self) -> double"},
-	 { "R3_sin2Theta", _wrap_R3_sin2Theta, METH_O, "R3_sin2Theta(R3 self) -> double"},
 	 { "R3_unit", _wrap_R3_unit, METH_O, "R3_unit(R3 self) -> R3"},
 	 { "R3_complex", _wrap_R3_complex, METH_O, "R3_complex(R3 self) -> C3"},
 	 { "R3_real", _wrap_R3_real, METH_O, "R3_real(R3 self) -> R3"},
 	 { "R3___eq__", _wrap_R3___eq__, METH_VARARGS, "R3___eq__(R3 self, R3 other) -> bool"},
 	 { "R3___ne__", _wrap_R3___ne__, METH_VARARGS, "R3___ne__(R3 self, R3 other) -> bool"},
-	 { "R3_angle", _wrap_R3_angle, METH_VARARGS, "R3_angle(R3 self, R3 v) -> double"},
 	 { "R3_project", _wrap_R3_project, METH_VARARGS, "R3_project(R3 self, R3 v) -> R3"},
 	 { "R3___add__", _wrap_R3___add__, METH_VARARGS, "R3___add__(R3 self, R3 rhs) -> R3"},
 	 { "R3___mul__", _wrap_R3___mul__, METH_VARARGS, "R3___mul__(R3 self, double c) -> R3"},