def test_surf_fs_asc(self, temp_fn): s = surf.generate_sphere(5) * 100 surf_fs_asc.write(temp_fn, s, overwrite=True) t = surf_fs_asc.read(temp_fn) assert_array_almost_equal(s.vertices, t.vertices) assert_array_almost_equal(s.vertices, t.vertices) theta = np.asarray([0, 0., 180.]) r = s.rotate(theta, unit='deg') l2r = surf.get_sphere_left_right_mapping(s, r) l2r_expected = [0, 1, 2, 6, 5, 4, 3, 11, 10, 9, 8, 7, 15, 14, 13, 12, 16, 19, 18, 17, 21, 20, 23, 22, 26, 25, 24] assert_array_equal(l2r, np.asarray(l2r_expected)) sides_facing = 'apism' for side_facing in sides_facing: l, r = surf.reposition_hemisphere_pairs(s + 10., t + (-10.), side_facing) m = surf.merge(l, r) # not sure at the moment why medial rotation # messes up - but leave for now eps = 666 if side_facing == 'm' else .001 assert_true((abs(m.center_of_mass) < eps).all())
def test_surf_fs_asc(self, temp_fn): s = surf.generate_sphere(5) * 100 surf_fs_asc.write(temp_fn, s, overwrite=True) t = surf_fs_asc.read(temp_fn) assert_array_almost_equal(s.vertices, t.vertices) assert_array_almost_equal(s.vertices, t.vertices) theta = np.asarray([0, 0., 180.]) r = s.rotate(theta, unit='deg') l2r = surf.get_sphere_left_right_mapping(s, r) l2r_expected = [ 0, 1, 2, 6, 5, 4, 3, 11, 10, 9, 8, 7, 15, 14, 13, 12, 16, 19, 18, 17, 21, 20, 23, 22, 26, 25, 24 ] assert_array_equal(l2r, np.asarray(l2r_expected)) sides_facing = 'apism' for side_facing in sides_facing: l, r = surf.reposition_hemisphere_pairs(s + 10., t + (-10.), side_facing) m = surf.merge(l, r) # not sure at the moment why medial rotation # messes up - but leave for now eps = 666 if side_facing == 'm' else .001 assert_true((abs(m.center_of_mass) < eps).all())
def run_makespec_bothhemis(config, env): refdir = config['refdir'] overwrite = config['overwrite'] icolds, hemis = _get_hemis_icolds(config) if hemis != ['l', 'r']: raise ValueError("Cannot run without left and right hemisphere") for icold in icolds: specs = [] for hemi in hemis: #surfprefix = '%s%sh' % (config['mi_icopat'] % icold, hemi) specfn = afni_suma_spec.canonical_filename(icold, hemi, config['alsuffix']) specpathfn = os.path.join(refdir, specfn) specs.append(afni_suma_spec.read(specpathfn)) specs = afni_suma_spec.hemi_pairs_add_views(specs, 'inflated', refdir, overwrite=overwrite) specs = afni_suma_spec.hemi_pairs_add_views(specs, 'sphere.reg', refdir, overwrite=overwrite) spec_both = afni_suma_spec.combine_left_right(specs) # generate spec files for both hemispheres hemiboth = 'b' specfn = afni_suma_spec.canonical_filename(icold, hemiboth, config['alsuffix']) specpathfn = os.path.join(refdir, specfn) spec_both.write(specpathfn, overwrite=overwrite) # merge left and right into one surface # and generate the spec files as well hemimerged = 'm' specfn = afni_suma_spec.canonical_filename(icold, hemimerged, config['alsuffix']) specpathfn = os.path.join(refdir, specfn) if config['overwrite'] or not os.path.exists(specpathfn): spec_merged, surfs_to_join = afni_suma_spec.merge_left_right( spec_both) spec_merged.write(specpathfn, overwrite=overwrite) full_path = lambda x: os.path.join(refdir, x) for fn_out, fns_in in surfs_to_join.iteritems(): surfs_in = [surf_fs_asc.read(full_path(fn)) for fn in fns_in] surf_merged = surf.merge(*surfs_in) if config['overwrite'] or not os.path.exists( full_path(fn_out)): surf_fs_asc.write(surf_merged, full_path(fn_out), overwrite=overwrite) print "Merged surfaces written to %s" % fn_out
def write(fn, s, overwrite=True): '''General write function for surfaces For now only supports ascii (as used in AFNI's SUMA) ''' if fn.endswith('.asc'): from mvpa2.support.nibabel import surf_fs_asc surf_fs_asc.write(fn, s, overwrite=overwrite) else: raise ValueError("Not implemented (based on extension): %r" % fn)
def run_makespec_bothhemis(config, env): refdir = config['refdir'] overwrite = config['overwrite'] icolds, hemis = _get_hemis_icolds(config) if hemis != ['l', 'r']: raise ValueError("Cannot run without left and right hemisphere") for icold in icolds: specs = [] for hemi in hemis: #surfprefix = '%s%sh' % (config['mi_icopat'] % icold, hemi) specfn = afni_suma_spec.canonical_filename(icold, hemi, config['alsuffix']) specpathfn = os.path.join(refdir, specfn) specs.append(afni_suma_spec.read(specpathfn)) specs = afni_suma_spec.hemi_pairs_add_views(specs, 'inflated', refdir, overwrite=overwrite) specs = afni_suma_spec.hemi_pairs_add_views(specs, 'sphere.reg', refdir, overwrite=overwrite) spec_both = afni_suma_spec.combine_left_right(specs) # generate spec files for both hemispheres hemiboth = 'b' specfn = afni_suma_spec.canonical_filename(icold, hemiboth, config['alsuffix']) specpathfn = os.path.join(refdir, specfn) spec_both.write(specpathfn, overwrite=overwrite) # merge left and right into one surface # and generate the spec files as well hemimerged = 'm' specfn = afni_suma_spec.canonical_filename(icold, hemimerged, config['alsuffix']) specpathfn = os.path.join(refdir, specfn) if config['overwrite'] or not os.path.exists(specpathfn): spec_merged, surfs_to_join = afni_suma_spec.merge_left_right(spec_both) spec_merged.write(specpathfn, overwrite=overwrite) full_path = lambda x:os.path.join(refdir, x) for fn_out, fns_in in surfs_to_join.iteritems(): surfs_in = [surf_fs_asc.read(full_path(fn)) for fn in fns_in] surf_merged = surf.merge(*surfs_in) if config['overwrite'] or not os.path.exists(full_path(fn_out)): surf_fs_asc.write(surf_merged, full_path(fn_out), overwrite=overwrite) print "Merged surfaces written to %s" % fn_out
def hemi_pairs_add_views(spec_both, state, directory=None, overwrite=False): '''adds views for medial, superior, inferior, anterior, posterior viewing of two surfaces together. Also generates these surfaces''' spec_left, spec_right = spec_both[0], spec_both[1] ext = '.asc' if directory is None: directory = os.path.curdir if not spec_left.same_states(spec_right): raise ValueError('Incompatible states for left and right') #views = collections.OrderedDict(m='medial', s='superior', i='inferior', a='anterior', p='posterior') # for compatibility use a normal dict if state == 'inflated': views = dict(m='medial', s='superior', i='inferior', a='anterior', p='posterior') viewkeys = ['m', 's', 'i', 'a', 'p'] else: views = dict(m='medial') viewkeys = 'm' spec_both = [spec_left, spec_right] spec_both_new = map(copy.deepcopy, spec_both) for view in viewkeys: longname = views[view] oldfns = [] newfns = [] for i, spec in enumerate(spec_both): idxdef = spec.find_surface_from_state(state) if len(idxdef) != 1: raise ValueError('Not unique surface with state %s' % state) surfidx, surfdef = idxdef[0] # take whichever is there (in order of preference) # shame that python has no builtin foldr surfnamelabels = ['SurfaceName', 'FreeSurferSurface'] for surfnamelabel in surfnamelabels: surfname = surfdef.get(surfnamelabel) if not surfname is None: break #surfname = utils.foldr(surfdef.get, None, surfnamelabels) fn = os.path.join(directory, surfname) if not os.path.exists(fn): raise ValueError("File not found: %s" % fn) if not surfname.endswith(ext): error('Expected extension %s for %s' % (ext, fn)) oldfns.append(fn) # store old name shortfn = surfname[:-(len(ext))] newsurfname = '%s%s%s%s' % (shortfn, _COMPREFIX, longname, ext) newfn = os.path.join(directory, newsurfname) newsurfdef = copy.deepcopy(surfdef) # ensure no naming cnoflicts for surfnamelabel in surfnamelabels: if surfnamelabel in newsurfdef: newsurfdef.pop(surfnamelabel) newsurfdef['SurfaceName'] = newsurfname newsurfdef['SurfaceState'] = '%s%s%s' % (_COMPREFIX, view, state) spec_both_new[i].add_surface(newsurfdef) newfns.append(newfn) if all(map(os.path.exists, newfns)) and not overwrite: print "Output already exist for %s" % longname else: surf_left, surf_right = map(surf_fs_asc.read, oldfns) surf_both_moved = surf_fs_asc.hemi_pairs_reposition( surf_left, surf_right, view) for fn, surf in zip(newfns, surf_both_moved): surf_fs_asc.write(surf, fn, overwrite) print "Written %s" % fn return tuple(spec_both_new)
def hemi_pairs_add_views(spec_both, state, directory=None, overwrite=False): '''adds views for medial, superior, inferior, anterior, posterior viewing of two surfaces together. Also generates these surfaces''' spec_left, spec_right = spec_both[0], spec_both[1] ext = '.asc' if directory is None: directory = os.path.curdir if not spec_left.same_states(spec_right): raise ValueError('Incompatible states for left and right') #views = collections.OrderedDict(m='medial', s='superior', i='inferior', a='anterior', p='posterior') # for compatibility use a normal dict if state == 'inflated': views = dict(m='medial', s='superior', i='inferior', a='anterior', p='posterior') viewkeys = ['m', 's', 'i', 'a', 'p'] else: views = dict(m='medial') viewkeys = 'm' spec_both = [spec_left, spec_right] spec_both_new = map(copy.deepcopy, spec_both) for view in viewkeys: longname = views[view] oldfns = [] newfns = [] for i, spec in enumerate(spec_both): idxdef = spec.find_surface_from_state(state) if len(idxdef) != 1: raise ValueError('Not unique surface with state %s' % state) surfidx, surfdef = idxdef[0] # take whichever is there (in order of preference) # shame that python has no builtin foldr surfnamelabels = ['SurfaceName', 'FreeSurferSurface'] for surfnamelabel in surfnamelabels: surfname = surfdef.get(surfnamelabel) if not surfname is None: break #surfname = utils.foldr(surfdef.get, None, surfnamelabels) fn = os.path.join(directory, surfname) if not os.path.exists(fn): raise ValueError("File not found: %s" % fn) if not surfname.endswith(ext): error('Expected extension %s for %s' % (ext, fn)) oldfns.append(fn) # store old name shortfn = surfname[:-(len(ext))] newsurfname = '%s%s%s%s' % (shortfn, _COMPREFIX, longname, ext) newfn = os.path.join(directory, newsurfname) newsurfdef = copy.deepcopy(surfdef) # ensure no naming cnoflicts for surfnamelabel in surfnamelabels: if surfnamelabel in newsurfdef: newsurfdef.pop(surfnamelabel) newsurfdef['SurfaceName'] = newsurfname newsurfdef['SurfaceState'] = '%s%s%s' % (_COMPREFIX, view, state) spec_both_new[i].add_surface(newsurfdef) newfns.append(newfn) if all(map(os.path.exists, newfns)) and not overwrite: print "Output already exist for %s" % longname else: surf_left, surf_right = map(surf_fs_asc.read, oldfns) surf_both_moved = surf_fs_asc.hemi_pairs_reposition(surf_left, surf_right, view) for fn, surf in zip(newfns, surf_both_moved): surf_fs_asc.write(surf, fn, overwrite) print "Written %s" % fn return tuple(spec_both_new)
def average_fs_asc_surfs(fn1, fn2, fnout): '''averages two surfaces''' surf1 = surf_fs_asc.read(fn1) surf2 = surf_fs_asc.read(fn2) surfavg = surf1 * .5 + surf2 * .5 surf_fs_asc.write(surfavg, fnout, overwrite=True)