docs: def _cartesian_to_keplerian(cls, coord, center):
          """Conversion from cartesian (position and velocity) to keplerian
  
          The keplerian form is
  
              * a : semi-major axis
              * e : eccentricity
              * i : inclination
              * Ω : right-ascension of ascending node
              * ω : Argument of perigee
              * ν : True anomaly
          """
  
          r, v = coord[:3], coord[3:]
          h = np.cross(r, v)                      # angular momentum vector
          h_norm = np.linalg.norm(h)
          r_norm = np.linalg.norm(r)
          v_norm = np.linalg.norm(v)
  
          K = v_norm ** 2 / 2 - center.µ / r_norm      # specific energy
          a = - center.µ / (2 * K)                     # semi-major axis
          e = sqrt(1 - h_norm ** 2 / (a * center.µ))   # eccentricity
          p = a * (1 - e ** 2)
          i = arccos(h[2] / h_norm)               # inclination
          Ω = arctan2(h[0], -h[1]) % (2 * np.pi)  # right ascension of the ascending node
  
          ω_ν = arctan2(r[2] / sin(i), r[0] * cos(Ω) + r[1] * sin(Ω))
          ν = arctan2(sqrt(p / center.µ) * np.dot(v, r), p - r_norm) % (2 * np.pi)
          ω = (ω_ν - ν) % (2 * np.pi)             # argument of the perigee
  
          return np.array([a, e, i, Ω, ω, ν], dtype=float)