def surface_to_ribbon_command(args): ''' surface_to_rubbon_command(args) can be given a list of arguments, such as sys.argv[1:]; these arguments may include any options and must include exactly one subject id and one output filename. Additionally one or two surface input filenames must be given. The surface files are projected into the ribbon and written to the output filename. For more information see the string stored in surface_to_ribbon_help. ''' # Parse the arguments (args, opts) = _surface_to_ribbon_parser(args) # First, help? if opts['help']: print surface_to_ribbon_help return 1 # and if we are verbose, lets setup a note function verbose = opts['verbose'] def note(s): if verbose: print s return verbose # 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']) # figure out our arguments: (lhfl, rhfl) = (opts['lh_file'], opts['rh_file']) if len(args) == 0: raise ValueError('Not enough arguments provided!') elif len(args) == 1: # must be that the subject is in the env? sub = find_subject_path(os.getenv('SUBJECT')) outfl = args[0] elif len(args) == 2: sbpth = find_subject_path(args[0]) if sbpth is not None: sub = sbpth else: sub = find_subject_path(os.getenv('SUBJECT')) if lhfl is not None: rhfl = args[0] elif rhfl is not None: lhfl = args[0] else: raise ValueError('Given arg is not a subject: %s' % args[0]) outfl = args[1] elif len(args) == 3: sbpth0 = find_subject_path(args[0]) sbpth1 = find_subject_path(args[1]) if sbpth0 is not None: sub = sbpth0 if lhfl is not None: rhfl = args[1] elif rhfl is not None: lhfl = args[1] else: raise ValueError('Too many arguments given: %s' % args[1]) elif sbpth1 is not None: sub = sbpth1 if lhfl is not None: rhfl = args[0] elif rhfl is not None: lhfl = args[0] else: raise ValueError('Too many arguments given: %s' % args[0]) else: sub = find_subject_path(os.getenv('SUBJECT')) if lhfl is not None or rhfl is not None: raise ValueError('Too many arguments and no subject given') (lhfl, rhfl) = args outfl = args[2] elif len(args) == 4: if lhfl is not None or rhfl is not None: raise ValueError('Too many arguments and no subject given') subidx = next((i for (i,a) in enumerate(args) if find_subject_path(a) is not None), None) if subidx is None: raise ValueError('No subject given') sub = find_subject_path(args[subidx]) del args[subidx] (lhfl, rhfl, outfl) = args else: raise ValueError('Too many arguments provided!') if sub is None: raise ValueError('No subject specified or found in $SUBJECT') if lhfl is None and rhfl is None: raise ValueError('No surfaces provided') # check the method method = opts['method'].lower() if method != 'weighted' and method != 'max': raise ValueError('Unsupported method: %s' % method) # and the datatype if opts['dtype'] is None: dtyp = None elif opts['dtype'].lower() == 'float': dtyp = np.float32 elif opts['dtype'].lower() == 'int': dtyp = np.int32 else: raise ValueError('Type argument must be float or int') # Now, load the data: note('Reading surfaces...') (lhdat, rhdat) = (None, None) if lhfl is not None: note(' - Reading LH file: %s' % lhfl) lhdat = read_surf_file(lhfl) if rhfl is not None: note(' - Reading RH file: %s' % rhfl) rhdat = read_surf_file(rhfl) (dat, hemi) = (rhdat, 'rh') if lhdat is None else \ (lhdat, 'lh') if rhdat is None else \ ((lhdat, rhdat), None) note('Generating vertex-to-voxel mapping...') sub = freesurfer_subject(sub) s2r = cortex_to_ribbon_map(sub, hemi=hemi) # okay, make the volume... note('Generating volume...') vol = cortex_to_ribbon(sub, dat, map=s2r, hemi=hemi, method=method, fill=opts['fill'], dtype=dtyp) # and write out the file note('Exporting volume file: %s' % outfl) vol.to_filename(outfl) note('surface_to_ribbon complete!') return 0
def register_retinotopy_command(args): ''' register_retinotopy_command(args) can be given a list of arguments, such as sys.argv[1:]; these arguments may include any options and must include at least one subject id. All subjects whose ids are given are registered to a retinotopy model, and the resulting registration, as well as the predictions made by the model in the registration, are exported. ''' # Parse the arguments (args, opts) = _retinotopy_parser(args) # First, help? if opts['help']: print register_retinotopy_help return 1 # and if we are verbose, lets setup a note function verbose = opts['verbose'] def note(s): if verbose: print s return verbose # 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']) # Parse the simple numbers for o in ['weight_cutoff', 'edge_strength', 'angle_strength', 'func_strength', 'max_step_size', 'max_out_eccen']: opts[o] = float(opts[o]) opts['max_steps'] = int(opts['max_steps']) # These are for now not supported: #TODO if opts['angle_math'] or opts['angle_radians'] or opts['eccen_radians']: print 'Mathematical angles and angles not in degrees are not yet supported.' return 1 # The remainder of the args can wait for now; walk through the subjects: tag_key = {'eccen': 'eccentricity', 'angle': 'polar_angle', 'label': 'V123_label'} for subnm in args: sub = freesurfer_subject(subnm) note('Processing subject: %s' % sub.id) # we need to register this subject... res = {} ow = not opts['no_overwrite'] for h in ['LH','RH']: note(' Processing hemisphere: %s' % h) hemi = sub.__getattr__(h) # See if we are loading custom values... (ang,ecc,wgt) = (None,None,None) suffix = '_' + h.lower() + '_file' if opts['angle' + suffix] is not None: ang = _guess_surf_file(opts['angle' + suffix]) if opts['eccen' + suffix] is not None: ecc = _guess_surf_file(opts['eccen' + suffix]) if opts['weight' + suffix] is not None: wgt = _guess_surf_file(opts['weight' + suffix]) # Do the registration note(' - Running Registration...') res[h] = register_retinotopy(hemi, V123_model(), polar_angle=ang, eccentricity=ecc, weight=wgt, weight_cutoff=opts['weight_cutoff'], partial_voluming_correction=opts['part_vol_correct'], edge_scale=opts['edge_strength'], angle_scale=opts['angle_strength'], functional_scale=opts['func_strength'], prior=opts['prior'], max_predicted_eccen=opts['max_out_eccen'], max_steps=opts['max_steps'], max_step_size=opts['max_step_size']) # Perform the hemi-specific outputs now: if not opts['no_reg_export']: regnm = '.'.join([h.lower(), opts['registration_name'], 'sphere', 'reg']) flnm = (os.path.join(sub.directory, 'surf', regnm) if h == 'LH' else os.path.join(sub.directory, 'xhemi', 'surf', regnm)) if ow or not os.path.exist(flnm): note(' - Exporting registration file: %s' % flnm) fsio.write_geometry(flnm, res[h].coordinates.T, res[h].faces.T, 'Created by neuropythy (github.com/noahbenson/neuropythy)') else: note(' - Skipping registration file: %s (file exists)' % flnm) if not opts['no_surf_export']: for dim in ['angle', 'eccen', 'label']: flnm = os.path.join(sub.directory, 'surf', '.'.join([h.lower(), opts[dim + '_tag'], 'mgz'])) if ow or not os.path.exist(flnm): note(' - Exporting prediction file: %s' % flnm) img = fsmgh.MGHImage( np.asarray([[res[h].prop(tag_key[dim])]], dtype=(np.int32 if dim == 'label' else np.float32)), np.eye(4)) img.to_filename(flnm) else: note(' - Skipping prediction file: %s (file exists)' % flnm) # Do the volume exports here if not opts['no_vol_export']: note(' Processing volume data...') note(' - Calculating cortex-to-ribbon mapping...') surf2rib = cortex_to_ribbon_map(sub, hemi=None) for dim in ['angle', 'eccen', 'label']: flnm = os.path.join(sub.directory, 'mri', opts[dim + '_tag'] + '.mgz') if ow or not os.path.exist(flnm): note(' - Generating volume file: %s' % flnm) vol = cortex_to_ribbon(sub, (res['LH'].prop(tag_key[dim]), res['RH'].prop(tag_key[dim])), map=surf2rib, dtype=(np.int32 if dim == 'label' else np.float32)) note(' - Exporting volume file: %s' % flnm) vol.to_filename(flnm) else: note(' - Skipping volume file: %s (file exists)' % flnm) # That is it for this subject! note(' Subject %s finished!' % sub.id) # And if we made it here, all was successful. return 0
def benson14_retinotopy_command(*args): ''' benson14_retinotopy_command(args...) runs the benson14_retinotopy command; see benson14_retinotopy_help for mor information. ''' # Parse the arguments... (args, opts) = _benson14_parser(args) # help? if opts['help']: print benson14_retinotopy_help return 1 # verbose? verbose = opts['verbose'] def note(s): if verbose: print s return verbose # 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 = {'polar_angle': opts['angle_tag'], 'eccentricity': opts['eccen_tag'], 'visual_area': opts['label_tag']} # okay, now go through the subjects... for subnm in args: note('Processing subject %s:' % subnm) sub = freesurfer_subject(subnm) note(' - Interpolating template...') (lhdat, rhdat) = predict_retinotopy(sub, template=opts['template']) # Export surfaces if nse: note(' - Skipping surface export.') else: note(' - Exporting surfaces:') for (t,dat) in lhdat.iteritems(): flnm = os.path.join(sub.directory, 'surf', 'lh.' + tr[t] + '.mgz') if ow or not os.path.exist(flnm): note(' - Exporting LH prediction file: %s' % flnm) img = fsmgh.MGHImage( np.asarray([[dat]], dtype=(np.int32 if t == 'visual_area' else np.float32)), np.eye(4)) img.to_filename(flnm) else: note(' - Not overwriting existing file: %s' % flnm) for (t,dat) in rhdat.iteritems(): flnm = os.path.join(sub.directory, 'surf', 'rh.' + tr[t] + '.mgz') if ow or not os.path.exist(flnm): note(' - Exporting RH prediction file: %s' % flnm) img = fsmgh.MGHImage( np.asarray([[dat]], dtype=(np.int32 if t == 'visual_area' else np.float32)), np.eye(4)) img.to_filename(flnm) else: note(' - Not overwriting existing file: %s' % flnm) # Export volumes if nve: note(' - Skipping volume export.') else: surf2rib = cortex_to_ribbon_map(sub, hemi=None) note(' - Exporting Volumes:') for t in lhdat.keys(): flnm = os.path.join(sub.directory, 'mri', tr[t] + '.mgz') if ow or not os.path.exist(flnm): note(' - Preparing volume file: %s' % flnm) vol = cortex_to_ribbon(sub, (lhdat[t], rhdat[t]), map=surf2rib, method=('max' if t == 'visual_area' else 'weighted'), dtype=(np.int32 if t == 'visual_area' else np.float32)) note(' - Exporting volume file: %s' % flnm) vol.to_filename(flnm) else: note(' - Not overwriting existing file: %s' % flnm) note(' Subject %s finished!' % sub.id) return 0
def benson14_retinotopy_command(*args): ''' benson14_retinotopy_command(args...) runs the benson14_retinotopy command; see benson14_retinotopy_help for mor information. ''' # Parse the arguments... (args, opts) = _benson14_parser(args) # help? if opts['help']: print benson14_retinotopy_help return 1 # verbose? verbose = opts['verbose'] def note(s): if verbose: print s return verbose # 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 = {'polar_angle': opts['angle_tag'], 'eccentricity': opts['eccen_tag'], 'v123roi': opts['label_tag']} # okay, now go through the subjects... for subnm in args: note('Processing subject %s:' % subnm) sub = freesurfer_subject(subnm) note(' - Interpolating template...') (lhdat, rhdat) = benson14_retinotopy(sub) # Export surfaces if nse: note(' - Skipping surface export.') else: note(' - Exporting surfaces:') for (t,dat) in lhdat.iteritems(): flnm = os.path.join(sub.directory, 'surf', 'lh.' + tr[t] + '.mgz') if ow or not os.path.exist(flnm): note(' - Exporting LH prediction file: %s' % flnm) img = fsmgh.MGHImage( np.asarray([[dat]], dtype=(np.int32 if t == 'v123roi' else np.float32)), np.eye(4)) img.to_filename(flnm) else: note(' - Not overwriting existing file: %s' % flnm) # Export volumes if nve: note(' - Skipping volume export.') else: surf2rib = cortex_to_ribbon_map(sub, hemi=None) note(' - Exporting Volumes:') for t in lhdat.keys(): flnm = os.path.join(sub.directory, 'mri', tr[t] + '.mgz') if ow or not os.path.exist(flnm): note(' - Preparing volume file: %s' % flnm) vol = cortex_to_ribbon(sub, (lhdat[t], rhdat[t]), map=surf2rib, dtype=(np.int32 if t == 'v123roi' else np.float32)) note(' - Exporting volume file: %s' % flnm) vol.to_filename(flnm) else: note(' - Not overwriting existing file: %s' % flnm) note(' Subject %s finished!' % sub.id) return 0
def register_retinotopy_command(args): ''' register_retinotopy_command(args) can be given a list of arguments, such as sys.argv[1:]; these arguments may include any options and must include at least one subject id. All subjects whose ids are given are registered to a retinotopy model, and the resulting registration, as well as the predictions made by the model in the registration, are exported. ''' # Parse the arguments (args, opts) = _retinotopy_parser(args) # First, help? if opts['help']: print register_retinotopy_help return 1 # and if we are verbose, lets setup a note function verbose = opts['verbose'] def note(s): if verbose: print s return verbose # 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']) # Parse the simple numbers for o in [ 'weight_cutoff', 'edge_strength', 'angle_strength', 'func_strength', 'max_step_size', 'max_out_eccen' ]: opts[o] = float(opts[o]) opts['max_steps'] = int(opts['max_steps']) # These are for now not supported: #TODO if opts['angle_math'] or opts['angle_radians'] or opts['eccen_radians']: print 'Mathematical angles and angles not in degrees are not yet supported.' return 1 # The remainder of the args can wait for now; walk through the subjects: tag_key = { 'eccen': 'eccentricity', 'angle': 'polar_angle', 'label': 'visual_area' } for subnm in args: sub = freesurfer_subject(subnm) note('Processing subject: %s' % sub.id) # we need to register this subject... res = {} ow = not opts['no_overwrite'] for h in ['LH', 'RH']: note(' Processing hemisphere: %s' % h) hemi = sub.__getattr__(h) # See if we are loading custom values... (ang, ecc, wgt) = (None, None, None) suffix = '_' + h.lower() + '_file' if opts['angle' + suffix] is not None: ang = _guess_surf_file(opts['angle' + suffix]) if opts['eccen' + suffix] is not None: ecc = _guess_surf_file(opts['eccen' + suffix]) if opts['weight' + suffix] is not None: wgt = _guess_surf_file(opts['weight' + suffix]) # Do the registration note(' - Running Registration...') res[h] = register_retinotopy( hemi, retinotopy_model(), polar_angle=ang, eccentricity=ecc, weight=wgt, weight_cutoff=opts['weight_cutoff'], partial_voluming_correction=opts['part_vol_correct'], edge_scale=opts['edge_strength'], angle_scale=opts['angle_strength'], functional_scale=opts['func_strength'], prior=opts['prior'], max_predicted_eccen=opts['max_out_eccen'], max_steps=opts['max_steps'], max_step_size=opts['max_step_size']) # Perform the hemi-specific outputs now: if not opts['no_reg_export']: regnm = '.'.join( [h.lower(), opts['registration_name'], 'sphere', 'reg']) flnm = (os.path.join(sub.directory, 'surf', regnm) if h == 'LH' else os.path.join(sub.directory, 'xhemi', 'surf', regnm)) if ow or not os.path.exist(flnm): note(' - Exporting registration file: %s' % flnm) fsio.write_geometry( flnm, res[h].coordinates.T, res[h].faces.T, 'Created by neuropythy (github.com/noahbenson/neuropythy)' ) else: note(' - Skipping registration file: %s (file exists)' % flnm) if not opts['no_surf_export']: for dim in ['angle', 'eccen', 'label']: flnm = os.path.join( sub.directory, 'surf', '.'.join([h.lower(), opts[dim + '_tag'], 'mgz'])) if ow or not os.path.exist(flnm): note(' - Exporting prediction file: %s' % flnm) img = fsmgh.MGHImage( np.asarray([[res[h].prop(tag_key[dim])]], dtype=(np.int32 if dim == 'label' else np.float32)), np.eye(4)) img.to_filename(flnm) else: note(' - Skipping prediction file: %s (file exists)' % flnm) # Do the volume exports here if not opts['no_vol_export']: note(' Processing volume data...') note(' - Calculating cortex-to-ribbon mapping...') surf2rib = cortex_to_ribbon_map(sub, hemi=None) for dim in ['angle', 'eccen', 'label']: flnm = os.path.join(sub.directory, 'mri', opts[dim + '_tag'] + '.mgz') if ow or not os.path.exist(flnm): note(' - Generating volume file: %s' % flnm) vol = cortex_to_ribbon( sub, (res['LH'].prop(tag_key[dim]), res['RH'].prop( tag_key[dim])), map=surf2rib, method=('max' if dim == 'label' else 'weighted'), dtype=(np.int32 if dim == 'label' else np.float32)) note(' - Exporting volume file: %s' % flnm) vol.to_filename(flnm) else: note(' - Skipping volume file: %s (file exists)' % flnm) # That is it for this subject! note(' Subject %s finished!' % sub.id) # And if we made it here, all was successful. return 0