def plot_3D_surfaces(inputfolder, outputfolder, points=True, gridsize=100): """ Plot 3D views of surfaces located in a given directory. Parameters ---------- inputfolder : str Input directory with surfaces. outputfolder : str Output directory to save the plots. points : bool, optional If True, surface points will be displayed. Default is True. gridsize : int, optional Dimension of the square grid to interpolate the surface points. Default is 100. """ files = filelib.list_subfolders(inputfolder, extensions=['csv']) for fn in files: s = Surface(filename=inputfolder + fn) s.centrate() s.to_spherical() s.Rgrid = s.interpolate(grid_size=gridsize) mesh = s.plot_surface(points=points) mesh.magnification = 3 filelib.make_folders([os.path.dirname(outputfolder + fn[:-4])]) mesh.save(outputfolder + fn[:-4] + '.png', size=(200, 200))
def compute_frequency_spectra(**kwargs): """ Compute frequency spectra for a given surface. Keyword arguments ----------------- *inputfolder* : str Directory with the input surface. *item* : str File name of the input surface. *outputfolder* : str Directory to save the computed spectra. *grid_size* : int Dimension of the square grid to interpolate the surface points. *normalize* : bool If True, the values of the spectrum will be normalized according to the `normalization_method`. *normalization_method* : str, optional If 'mean-radius', the grid values will be divided by the mean grid value prior to the SPHARM transform. If 'zero-component', all spectral components will be divided by the value of the first component (m=0, n=0). Default is 'zero-component'. """ inputfolder = kwargs.get('inputfolder') outputfolder = kwargs.get('outputfolder', inputfolder + '../spharm/') filename = kwargs.get('item') if not os.path.exists(outputfolder + filename): surface = Surface(filename=inputfolder + filename) surface.centrate() surface.to_spherical() surface.compute_spharm( grid_size=kwargs.get('grid_size'), normalize=kwargs.get('normalize'), normalization_method=kwargs.get('normalization_method')) surface.spharm.save_to_csv(outputfolder + filename)
def test07_spharm_inverse_less(self): path = site.getsitepackages()[0] + '/SPHARM/tests/' fn = path + 'data/synthetic_cell.txt' surf = Surface(filename=fn) surf.centrate() surf.to_spherical() surf.compute_spharm(grid_size=100) surf.inverse_spharm() os.makedirs('data/test_data') with warnings.catch_warnings(): warnings.simplefilter("ignore") surf.plot_surface(points=True).save( 'data/test_data/surface_inverse_all.png', size=(200, 200)) surf.inverse_spharm(lmax=30) surf.plot_surface(points=True).save( 'data/test_data/surface_inverse_30.png', size=(200, 200)) surf.inverse_spharm(lmax=10) surf.plot_surface(points=True).save( 'data/test_data/surface_inverse_10.png', size=(200, 200)) self.assertEqual( os.path.exists('data/test_data/surface_inverse_all.png'), True) self.assertEqual( os.path.exists('data/test_data/surface_inverse_30.png'), True) self.assertEqual( os.path.exists('data/test_data/surface_inverse_10.png'), True) shutil.rmtree('data/test_data/')
def test05_plot(self): path = site.getsitepackages()[0] + '/SPHARM/tests/' fn = path + 'data/synthetic_cell.txt' surf = Surface(filename=fn) with warnings.catch_warnings(): warnings.simplefilter("ignore") mesh = surf.plot_points() os.makedirs('data/test_data') mesh.save('data/test_data/points_3D.png', size=(200, 200)) surf.centrate() surf.to_spherical() surf.Rgrid = surf.interpolate(grid_size=100) with warnings.catch_warnings(): warnings.simplefilter("ignore") mesh = surf.plot_surface(points=False) mesh.save('data/test_data/surface_3D.png', size=(200, 200)) with warnings.catch_warnings(): warnings.simplefilter("ignore") mesh = surf.plot_surface(points=True) mesh.save('data/test_data/surface_with_points_3D.png', size=(200, 200)) self.assertEqual(os.path.exists('data/test_data/surface_3D.png'), True) self.assertEqual(os.path.exists('data/test_data/points_3D.png'), True) self.assertEqual( os.path.exists('data/test_data/surface_with_points_3D.png'), True) shutil.rmtree('data/test_data/')
def test_interpolate(self, grid_size): img = ImageStack(filename='', load=False) img.data = np.zeros([10, 100, 100]) img.data[2:7, 10:-10, 10:-10] = 1 voxel_size = [4, 0.3824, 0.3824] img.extract_surfaces('data/test_data/surfaces/', voxel_size=voxel_size, reconstruct=False) surf = Surface(filename='data/test_data/surfaces/_Cell00001.csv') surf.centrate() surf.to_spherical() grid = surf.interpolate(grid_size=grid_size) self.assertEqual(len(grid), grid_size) shutil.rmtree('data/test_data/')
def test_spharm_transform(self): img = ImageStack(filename='', load=False) img.data = np.zeros([100, 100, 100]) img.data[48:52, 48:52, 48:52] = 1. voxel_size = 0.3 img.extract_surfaces('data/test_data/surfaces/', voxel_size=voxel_size, reconstruct=True) surf = Surface(filename='data/test_data/surfaces/_Cell00001.csv') surf.centrate() surf.to_spherical() grid = surf.interpolate(grid_size=10) surf.compute_spharm(grid_size=10) ngrid = surf.inverse_spharm() self.assertAlmostEqual(np.mean(np.abs(ngrid - grid)), 0, 1) shutil.rmtree('data/test_data/')
def compute_spharm(**kwargs): """ Compute spherical harmonics spectra for a given surface. Keyword arguments ----------------- *inputfolder* : str Directory with the input surface. *item* : str File name of the input surface. *outputfolder* : str Directory to save the computed spectra. *grid_size* : int Dimension of the square grid to interpolate the surface points. *normalize* : bool If True, the values of the spectrum will be normalized according to the `normalization_method`. *normalization_method* : str, optional If 'mean-radius', the grid values will be divided by the mean grid value prior to the SPHARM transform. If 'zero-component', all spectral components will be divided by the value of the first component (m=0, n=0). Default is 'zero-component'. """ inputfolder = kwargs.get('inputfolder') outputfolder = kwargs.get('outputfolder', inputfolder + '../spharm/') filename = kwargs.get('item') combined_tracks = kwargs.get('combined_tracks', False) rotate = kwargs.get('rotate', False) filelib.make_folders([os.path.dirname(outputfolder[:-1] + '_kwargs.csv')]) pd.Series(kwargs).to_csv(outputfolder[:-1] + '_kwargs.csv', sep='\t', header=False) if not (os.path.exists(outputfolder + filename) or os.path.exists(outputfolder + filename[:-4] + '_Time_%03d.csv' % 1)): if combined_tracks: stat = pd.read_csv(inputfolder + filename, sep='\t', index_col=0) stat.at[:, 'Time'] = np.array(stat['Time']).astype(float).astype(int) stat = stat.sort_values('Time').reset_index() t_surface = MovingSurface() if not filename.endswith('.csv'): filename += '.csv' times = stat['Time'].unique() if len(times) > 2: for t in times: curstat = stat[stat['Time'] == t] if len(curstat) > 4: surface = Surface(data=curstat) surface.metadata[ 'Name'] = filename[:-4] + '_Time_%03d.csv' % t if 'TrackID' in curstat.columns: surface.metadata['TrackID'] = curstat.iloc[0][ 'TrackID'] surface.centrate() if len(t_surface.surfaces) > 0: x, y, z = surface.center - t_surface.surfaces[ -1].center # direction of the previous interval surface.migration_angles = tr.cart_to_spherical( x, y, z)[1:] t_surface.add_surface(surface) else: print(filename, times, t, len(curstat)) t_surface.surfaces[0].migration_angles = t_surface.surfaces[ 1].migration_angles for surface in t_surface.surfaces: if rotate: surface.rotate(surface.migration_angles[0], surface.migration_angles[1]) surface.to_spherical() surface.compute_spharm(grid_size=kwargs.get('grid_size'), normalize=kwargs.get('normalize'), normalization_method=kwargs.get( 'normalization_method', 'zero-component')) surface.spharm.save_to_csv(outputfolder + surface.metadata['Name']) else: surface = Surface(filename=inputfolder + filename) surface.centrate() surface.to_spherical() surface.compute_spharm(grid_size=kwargs.get('grid_size'), normalize=kwargs.get('normalize'), normalization_method=kwargs.get( 'normalization_method', 'zero-component')) if not filename.endswith('.csv'): filename += '.csv' surface.spharm.save_to_csv(outputfolder + filename)
groups = os.listdir(path + 'surfaces/') for gr in groups: print(gr) files = os.listdir(path + 'surfaces/' + gr + '/') for fn in files: stat = pd.read_csv(path + 'surfaces/' + gr + '/' + fn, sep='\t', index_col=0) t1 = stat['Time'].unique()[0] stat = stat[stat['Time'] == t1] print(fn, len(stat)) surface = Surface(data=stat) mesh = surface.plot_points(scale_factor=0.2) filelib.make_folders([os.path.dirname(path + 'surface_plots/' + gr + '_' + fn[:-4])]) mesh.save(path + 'surface_plots/' + gr + '_' + fn[:-4] + '_init.png', size=(100, 100)) mlab.clf() surface.centrate() surface.to_spherical() surface.compute_spharm(grid_size=120, normalize=True) mesh = surface.plot_surface(points=False) filelib.make_folders([os.path.dirname(path + 'surface_plots/' + gr + '_' + fn[:-4])]) mesh.save(path + 'surface_plots/' + gr + '_' + fn[:-4] + '_grid.png', size=(100, 100)) mlab.clf() surface.inverse_spharm(lmax=10) mesh = surface.plot_surface(points=False) filelib.make_folders([os.path.dirname(path + 'surface_plots/' + gr + '_' + fn[:-4])]) mesh.save(path + 'surface_plots/' + gr + '_' + fn[:-4] + '_inverse_lmax=10.png', size=(100, 100)) mlab.clf() surface.inverse_spharm(lmax=None) mesh = surface.plot_surface(points=False)