code: def get_off_ang(src, rec, nsrc, nrec, verb):
      r
      global _min_off
  
      # Pre-allocate off and angle
      off = np.empty((nrec*nsrc,))
      angle = np.empty((nrec*nsrc,))
  
      # Coordinates
      # Loop over sources, append them one after another.
      for i in range(nsrc):
          xco = rec[0] - src[0][i]  # X-coordinates  [m]
          yco = rec[1] - src[1][i]  # Y-coordinates  [m]
          off[i*nrec:(i+1)*nrec] = np.sqrt(xco*xco + yco*yco)  # Offset   [m]
          angle[i*nrec:(i+1)*nrec] = np.arctan2(yco, xco)      # Angle  [rad]
  
      # Note: One could achieve a potential speed-up using np.unique to sort out
      # src-rec configurations that have the same offset and angle. Very unlikely
      # for real data.
  
      # Minimum offset to avoid singularities at off = 0 m.
      # => min_off can be set with utils.set_min
      angle[np.where(off < _min_off)] = np.nan
      off = _check_min(off, _min_off, 'Offsets', 'm', verb)
  
      return off, angle
docs: r"""Get depths, offsets, angles, hence spatial input parameters.
  
      This check-function is called from one of the modelling routines in
      :mod:`model`.  Consult these modelling routines for a detailed description
      of the input parameters.
  
      Parameters
      ----------
      src, rec : list of floats or arrays
          Source/receiver dipole coordinates x, y, and z (m).
  
      nsrc, nrec : int
          Number of sources/receivers (-).
  
      verb : {0, 1, 2, 3, 4}
          Level of verbosity.
  
  
      Returns
      -------
      off : array of floats
          Offsets
  
      angle : array of floats
          Angles