docs: def main(*args):
      '''
      benson14_retinotopy.main(args...) runs the benson14_retinotopy command; see 
      benson14_retinotopy.info for more information.
      '''
      # Parse the arguments...
      (args, opts) = _benson14_parser(*args)
      # help?
      if opts['help']:
          print(info, file=sys.stdout)
          return 1
      # verbose?
      if opts['verbose']:
          def note(s):
              print(s, file=sys.stdout)
              return True
      else:
          def note(s): return False
      # based on format, how do we export?
      sfmt = opts['surf_format'].lower()
      if sfmt in ['curv', 'auto', 'automatic', 'morph']:
          sfmt = 'freesurfer_morph'
          sext = ''
      elif sfmt == 'nifti':
          sext = '.nii.gz'
      elif sfmt in ['mgh', 'mgz', 'nii', 'nii.gz']:
          sext = '.' + sfmt
      else:
          raise ValueError('Unknown surface format: %s' % opts['surf_format'])
      vfmt = opts['vol_format'].lower()
      if vfmt == 'nifti':
          vext = '.nii.gz'
      elif vfmt in ['mgh', 'mgz', 'nii', 'nii.gz']:
          vext = '.' + vfmt
      else:
          raise ValueError('Unknown volume format: %s' % opts['vol_format'])
      # Add the subjects directory, if there is one
      if 'subjects_dir' in opts and opts['subjects_dir'] is not None:
          add_subject_path(opts['subjects_dir'])
      ow = not opts['no_overwrite']
      nse = opts['no_surf_export']
      nve = opts['no_vol_export']
      tr = {'angle': opts['angle_tag'],
            'eccen': opts['eccen_tag'],
            'varea': opts['label_tag'],
            'sigma': opts['sigma_tag']}
      # okay, now go through the subjects...
      for subnm in args:
          note('Processing subject %s:' % subnm)
          sub = subject(subnm)
          note('   - Interpolating template...')
          (lhdat, rhdat) = predict_retinotopy(sub,
                                              template=opts['template'],
                                              registration=opts['registration'])
          # Export surfaces
          if nse:
              note('   - Skipping surface export.')
          else:
              note('   - Exporting surfaces:')
              for (t,dat) in six.iteritems(lhdat):
                  flnm = os.path.join(sub.path, 'surf', 'lh.' + tr[t] + sext)
                  if ow or not os.path.exists(flnm):
                      note('    - Exporting LH prediction file: %s' % flnm)
                      nyio.save(flnm, dat, format=sfmt)
                  else:
                      note('    - Not overwriting existing file: %s' % flnm)
              for (t,dat) in six.iteritems(rhdat):
                  flnm = os.path.join(sub.path, 'surf', 'rh.' + tr[t] + sext)
                  if ow or not os.path.exists(flnm):
                      note('    - Exporting RH prediction file: %s' % flnm)
                      nyio.save(flnm, dat, format=sfmt)
                  else:
                      note('    - Not overwriting existing file: %s' % flnm)
          # Export volumes
          if nve:
              note('   - Skipping volume export.')
          else:
              note('   - Exporting Volumes:')
              for t in lhdat.keys():
                  flnm = os.path.join(sub.path, 'mri', tr[t] + vext)
                  if ow or not os.path.exists(flnm):
                      note('    - Preparing volume file: %s' % flnm)
                      dtyp = (np.int32 if t == 'varea' else np.float32)
                      vol = sub.cortex_to_image(
                          (lhdat[t], rhdat[t]),
                          method=('nearest' if t == 'varea' else 'linear'),
                          dtype=dtyp)
                      note('    - Exporting volume file: %s' % flnm)
                      nyio.save(flnm, vol, like=sub)
                  else:
                      note('    - Not overwriting existing file: %s' % flnm)
          note('   Subject %s finished!' % sub.name)
      return 0