def make_parcellation_surf_from_files(beta_files, mesh_file, parcellation_file, nbparcel, method, mu=10., verbose=0): if method not in ['ward', 'gkm', 'ward_and_gkm', 'kmeans']: raise ValueError('unknown method') # step 1: load the data ---------------------------- # 1.1 the domain logger.info('domain from mesh: %s', mesh_file) domain = domain_from_mesh(mesh_file) coord = domain.coord # 1.3 read the functional data beta = np.array([read_texture(b)[0] for b in beta_files]).T logger.info('beta: %s', str(beta.shape)) logger.info('mu * coord / np.std(coord): %s', (mu * coord / np.std(coord)).shape) feature = np.hstack((beta, mu * coord / np.std(coord))) if method is not 'kmeans': g = field_from_coo_matrix_and_data(domain.topology, feature) if method == 'kmeans': _, u, _ = kmeans(feature, nbparcel) if method == 'ward': u, _ = g.ward(nbparcel) if method == 'gkm': seeds = np.argsort(np.random.rand(g.V))[:nbparcel] _, u, _ = g.geodesic_kmeans(seeds) if method == 'ward_and_gkm': w, _ = g.ward(nbparcel) _, u, _ = g.geodesic_kmeans(label=w) lpa = SubDomains(domain, u, 'parcellation') if verbose: var_beta = np.array( [np.var(beta[lpa.label == k], 0).sum() for k in range(lpa.k)]) var_coord = np.array( [np.var(coord[lpa.label == k], 0).sum() for k in range(lpa.k)]) size = lpa.get_size() vf = np.dot(var_beta, size) / size.sum() va = np.dot(var_coord, size) / size.sum() print nbparcel, "functional variance", vf, "anatomical variance", va # step3: write the resulting label image if parcellation_file is not None: label_image = parcellation_file else: label_image = None if label_image is not None: write_texture(u.astype(np.int32), label_image) if verbose: print "Wrote the parcellation images as %s" % label_image return u, label_image
def make_parcellation_surf_from_files(beta_files, mesh_file, parcellation_file, nbparcel, method, mu=10., verbose=0): if method not in ['ward', 'gkm', 'ward_and_gkm', 'kmeans']: raise ValueError('unknown method') # step 1: load the data ---------------------------- # 1.1 the domain pyhrf.verbose(3, 'domain from mesh: %s' %mesh_file) domain = domain_from_mesh(mesh_file) coord = domain.coord # 1.3 read the functional data beta = np.array([read_texture(b)[0] for b in beta_files]).T pyhrf.verbose(3, 'beta: %s' %str(beta.shape)) pyhrf.verbose(3, 'mu * coord / np.std(coord): %s' \ %(mu * coord / np.std(coord)).shape) feature = np.hstack((beta, mu * coord / np.std(coord))) if method is not 'kmeans': # print 'domain.topology:', domain.topology.__class__ # print domain.topology #print dir(domain.topology) # print 'feature:', feature.shape # print feature g = field_from_coo_matrix_and_data(domain.topology, feature) # print 'g:', g.__class__ # print g if method == 'kmeans': _, u, _ = kmeans(feature, nbparcel) if method == 'ward': u, _ = g.ward(nbparcel) if method == 'gkm': seeds = np.argsort(np.random.rand(g.V))[:nbparcel] _, u, _ = g.geodesic_kmeans(seeds) if method == 'ward_and_gkm': w, _ = g.ward(nbparcel) _, u, _ = g.geodesic_kmeans(label=w) # print 'u:' # print u lpa = SubDomains(domain, u, 'parcellation') if verbose: var_beta = np.array( [np.var(beta[lpa.label == k], 0).sum() for k in range(lpa.k)]) var_coord = np.array( [np.var(coord[lpa.label == k], 0).sum() for k in range(lpa.k)]) size = lpa.get_size() vf = np.dot(var_beta, size) / size.sum() va = np.dot(var_coord, size) / size.sum() print nbparcel, "functional variance", vf, "anatomical variance", va # step3: write the resulting label image if parcellation_file is not None: label_image = parcellation_file # elif write_dir is not None: # label_image = os.path.join(write_dir, "parcel_%s.nii" % method) else: label_image = None if label_image is not None: #lpa.to_image(label_image, descrip='Intra-subject parcellation image') write_texture(u.astype(np.int32), label_image) if verbose: print "Wrote the parcellation images as %s" % label_image return u, label_image