# Source code for gala.coordinates.poincarepolar

```# Third-party
import numpy as np

__all__ = ["cartesian_to_poincare_polar"]

[docs]def cartesian_to_poincare_polar(w):
r"""
Convert an array of 6D Cartesian positions to PoincarĂ©
symplectic polar coordinates. These are similar to cylindrical
coordinates.

Parameters
----------
w : array_like
Input array of 6D Cartesian phase-space positions. Should have
shape ``(norbits, 6)``.

Returns
-------
new_w : :class:`~numpy.ndarray`
Points represented in 6D PoincarĂ© polar coordinates.

"""

R = np.sqrt(w[..., 0] ** 2 + w[..., 1] ** 2)
# phi = np.arctan2(w[..., 1], w[..., 0])
phi = np.arctan2(w[..., 0], w[..., 1])

vR = (w[..., 0] * w[..., 0 + 3] + w[..., 1] * w[..., 1 + 3]) / R
vPhi = w[..., 0] * w[..., 1 + 3] - w[..., 1] * w[..., 0 + 3]

# pg. 437, Papaphillipou & Laskar (1996)
sqrt_2THETA = np.sqrt(np.abs(2 * vPhi))
pp_phi = sqrt_2THETA * np.cos(phi)
pp_phidot = sqrt_2THETA * np.sin(phi)

z = w[..., 2]
zdot = w[..., 2 + 3]

new_w = np.vstack((R.T, pp_phi.T, z.T, vR.T, pp_phidot.T, zdot.T)).T
return new_w
```