code: def rotation(f, line = 'fast'):
      
  
      if f.unstructured:
          raise ValueError("Rotation requires a structured file")
  
      lines = { 'fast': f.fast,
                'slow': f.slow,
                'iline': f.iline,
                'xline': f.xline,
              }
  
      if line not in lines:
          error = "Unknown line {}".format(line)
          solution = "Must be any of: {}".format(' '.join(lines.keys()))
          raise ValueError('{} {}'.format(error, solution))
  
      l = lines[line]
      origin = f.header[0][segyio.su.cdpx, segyio.su.cdpy]
      cdpx, cdpy = origin[segyio.su.cdpx], origin[segyio.su.cdpy]
  
      rot = f.xfd.rotation( len(l),
                            l.stride,
                            len(f.offsets),
                            np.fromiter(l.keys(), dtype = np.intc) )
      return rot, cdpx, cdpy
docs: Find rotation of the survey
  
      Find the clock-wise rotation and origin of `line` as ``(rot, cdpx, cdpy)``
  
      The clock-wise rotation is defined as the angle in radians between line
      given by the first and last trace of the first line and the axis that gives
      increasing CDP-Y, in the direction that gives increasing CDP-X.
  
      By default, the first line is the 'fast' direction, which is inlines if the
      file is inline sorted, and crossline if it's crossline sorted.
  
  
      Parameters
      ----------
  
      f : SegyFile
      line : { 'fast', 'slow', 'iline', 'xline' }
  
      Returns
      -------
  
      rotation : float
      cdpx : int
      cdpy : int
  
  
      Notes
      -----
  
      .. versionadded:: 1.2