def run_makespec_bothhemis(config, env): refdir = config['refdir'] overwrite = config['overwrite'] icolds, hemis = _get_hemis_icolds(config) ext = format2extension(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) s = afni_suma_spec.read(specpathfn) specs.append(afni_suma_spec.read(specpathfn)) add_states = ['inflated', 'full.patch.flat', 'sphere.reg'] add_states_required = [True, False, True] # flat surface is optional for add_state, is_req in zip(add_states, add_states_required): has_state = all([len(spec.find_surface_from_state(add_state)) == 1 for spec in specs]) if not has_state: if is_req: error('cannot find state %s' % add_state) else: # skip this state print "Optional state %s not found - skipping" % add_state continue specs = afni_suma_spec.hemi_pairs_add_views(specs, add_state, ext, 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.read(full_path(fn)) for fn in fns_in] if all(['full.patch.flat' in fn for fn in fns_in]): # left hemi of flat; rotate 180 degrees, reposition again surfs_in[0] = surfs_in[0] * [-1, -1, 1] surfs_in = surf.reposition_hemisphere_pairs(surfs_in[0], surfs_in[1], 'm') surf_merged = surf.merge(*surfs_in) if config['overwrite'] or not os.path.exists(full_path(fn_out)): surf.write(full_path(fn_out), surf_merged) print "Merged surfaces written to %s" % fn_out
def hemi_pairs_add_views(spec_both, state, ext, 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] 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): raise ValueError('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.read, oldfns) surf_both_moved = surf.reposition_hemisphere_pairs(surf_left, surf_right, view) for fn, surf_ in zip(newfns, surf_both_moved): surf.write(fn, surf_, overwrite) return tuple(spec_both_new)
def hemi_pairs_add_views(spec_both, state, ext, 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] 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): raise ValueError('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.read, oldfns) surf_both_moved = surf.reposition_hemisphere_pairs( surf_left, surf_right, view) for fn, surf_ in zip(newfns, surf_both_moved): surf.write(fn, surf_, overwrite) return tuple(spec_both_new)