code: def _EccZmaxRperiRap(self,*args,**kwargs):
          
          delta= kwargs.get('delta',self._delta)
          umin, umax, vmin= self._uminumaxvmin(*args,**kwargs)
          rperi= bovy_coords.uv_to_Rz(umin,nu.pi/2.,delta=delta)[0]
          rap_tmp, zmax= bovy_coords.uv_to_Rz(umax,vmin,delta=delta)
          rap= nu.sqrt(rap_tmp**2.+zmax**2.)
          e= (rap-rperi)/(rap+rperi)
          return (e,zmax,rperi,rap)
docs: NAME:
             EccZmaxRperiRap (_EccZmaxRperiRap)
          PURPOSE:
             evaluate the eccentricity, maximum height above the plane, peri- and apocenter in the Staeckel approximation
          INPUT:
             Either:
                a) R,vR,vT,z,vz[,phi]:
                   1) floats: phase-space value for single object (phi is optional) (each can be a Quantity)
                   2) numpy.ndarray: [N] phase-space values for N objects (each can be a Quantity)
                b) Orbit instance: initial condition used if that's it, orbit(t) if there is a time given as well as the second argument 
             delta= (object-wide default) can be used to override the object-wide focal length; can also be an array with length N to allow different delta for different phase-space points
             u0= (None) if object-wide option useu0 is set, u0 to use (if useu0 and useu0 is None, a good value will be computed)
             c= (object-wide default, bool) True/False to override the object-wide setting for whether or not to use the C implementation
          OUTPUT:
             (e,zmax,rperi,rap)
          HISTORY:
             2017-12-12 - Written - Bovy (UofT)