21 #ifndef yap_ComplexBasis_h
22 #define yap_ComplexBasis_h
24 #include "fwd/ComplexBasis.h"
34 namespace complex_basis {
38 using covariance_matrix = SquareMatrix<T, 2>;
45 SquareMatrix<T, 2> polar_to_cartesian(
const polar<T>& pol)
47 std::complex<T> v(pol);
48 return SquareMatrix<T, 2>({cos(std::arg(v)), -
std::abs(v)*sin(std::arg(v)),
49 sin(std::arg(v)),
std::abs(v)*cos(std::arg(v)) });
54 SquareMatrix<T, 2> cartesian_to_polar(
const cartesian<T>& cart)
56 std::complex<T> v(cart);
70 Value_(val), Covariance_(cov)
75 virtual operator std::complex<T>()
const = 0;
83 {
return Covariance_; }
87 const covariance_matrix<T> Covariance_;
99 explicit cartesian(T re, T im,
const covariance_matrix<T>& cov = covariance_matrix<T>()) :
106 explicit cartesian(
const Vector<T, 2>& val,
const covariance_matrix<T>& cov = covariance_matrix<T>()) :
113 explicit cartesian(
const std::complex<T>& val,
const covariance_matrix<T>& cov = covariance_matrix<T>()) :
120 explicit cartesian(
const std::complex<T>& val, std::initializer_list<T> cov_elements) :
128 jacobian::polar_to_cartesian(pol) * pol.
covariance() *
transpose(jacobian::polar_to_cartesian(pol)))
132 virtual operator std::complex<T>()
const override
138 template <
typename T>
145 explicit polar(T r, T
phi,
const covariance_matrix<T>& cov = covariance_matrix<T>()) :
152 explicit polar(
const Vector<T, 2>& val,
const covariance_matrix<T>& cov = covariance_matrix<T>()) :
160 explicit polar(T r, T
phi, std::initializer_list<T> cov_elements) :
162 symmetricMatrix<T, 2>(std::forward<std::initializer_list<T>>(cov_elements)))
167 polar(
const cartesian<T>& cart) :
168 polar<T>(std::
abs(std::complex<T>(cart)), std::arg(std::complex<T>(cart)),
169 jacobian::cartesian_to_polar(cart) * cart.
covariance() *
transpose(jacobian::cartesian_to_polar(cart)))
173 virtual operator std::complex<T>()
const override
179 template <
typename T>
180 inline std::string
to_string(
const cartesian<T>& z)
183 s +=
"covariance = " +
to_string(z.covariance());
188 template <
typename T>
189 inline std::string
to_string(
const polar<T>& z)
191 std::string s =
to_string(z.value()[0]) +
" * exp(i * " +
to_string(z.value()[1]) +
")";
192 s +=
"covariance = " +
to_string(z.covariance());
RealIntegralElement real(const ComplexIntegralElement &Z)
Definition: IntegralElement.h:144
const Vector< T, 2 > & value() const
Definition: ComplexBasis.h:78
polar(T r, T phi, const covariance_matrix< T > &cov=covariance_matrix< T >())
Definition: ComplexBasis.h:145
Definition: ComplexBasis.h:139
const Matrix< T, C, R > transpose(const Matrix< T, R, C > &M)
transpose a matrix
Definition: Matrix.h:148
constexpr T abs(const Vector< T, N > &A)
Definition: Vector.h:371
basis(const Vector< T, 2 > &val, const covariance_matrix< T > &cov)
constructor
Definition: ComplexBasis.h:69
const SquareMatrix< T, N > symmetricMatrix(std::initializer_list< T > elements)
Definition: Matrix.h:125
cartesian(T re, T im, const covariance_matrix< T > &cov=covariance_matrix< T >())
Definition: ComplexBasis.h:99
Definition: ComplexBasis.h:66
const covariance_matrix< T > & covariance() const
Definition: ComplexBasis.h:82
std::string to_string(const CachedValue::Status &S)
streaming operator for CachedValue::Status
Definition: CachedValue.cxx:27
Definition: ComplexBasis.h:93
constexpr T phi(const ThreeVector< T > &V, const CoordinateSystem< T, 3 > &C)
Definition: CoordinateSystem.h:94
RealIntegralElement imag(const ComplexIntegralElement &Z)
Definition: IntegralElement.h:148