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
benson14_retinotopy.main(args...) runs the benson14_retinotopy command; see 
    benson14_retinotopy.info for more information.