docs: def radec2azel(ra_deg: float, dec_deg: float,
                 lat_deg: float, lon_deg: float,
                 time: datetime) -> Tuple[float, float]:
      """
      converts right ascension, declination to azimuth, elevation
  
      Parameters
      ----------
  
      ra_deg : float or numpy.ndarray of float
          right ascension to target [degrees]
  
      dec_deg : float or numpy.ndarray of float
          declination to target [degrees]
  
      lat_deg : float
          observer WGS84 latitude [degrees]
  
      lon_deg : float
          observer WGS84 longitude [degrees]
  
      time : datetime.datetime
          time of observation
  
      Results
      -------
  
      az_deg : float or numpy.ndarray of float
          azimuth clockwise from north to point [degrees]
  
      el_deg : float or numpy.ndarray of float
          elevation above horizon to point [degrees]
  
  
      from D. Vallado "Fundamentals of Astrodynamics and Applications "
         4th Edition Ch. 4.4 pg. 266-268
      """
      ra = atleast_1d(ra_deg)
      dec = atleast_1d(dec_deg)
      lat = atleast_1d(lat_deg)
      lon = atleast_1d(lon_deg)
  
      if ra.shape != dec.shape:
          raise ValueError('az and el must be same shape ndarray')
      if not(lat.size == 1 and lon.size == 1):
          raise ValueError('need one observer and one or more  (az,el).')
      if ((lat < -90) | (lat > 90)).any():
          raise ValueError('-90 <= lat <= 90')
  
      ra = radians(ra)
      dec = radians(dec)
      lat = radians(lat)
      lon = radians(lon)
  
      lst = datetime2sidereal(time, lon)  # RADIANS
  # %% Eq. 4-11 p. 267 LOCAL HOUR ANGLE
      lha = lst - ra
  # %% #Eq. 4-12 p. 267
      el = arcsin(sin(lat) * sin(dec) + cos(lat) * cos(dec) * cos(lha))
  # %% combine Eq. 4-13 and 4-14 p. 268
      az = arctan2(-sin(lha) * cos(dec) / cos(el),
                   (sin(dec) - sin(el) * sin(lat)) / (cos(el) * cos(lat)))
  
      return degrees(az) % 360.0, degrees(el)