def apply_extract_features_cp(well_tile,filepattern): wildcards = {'well':well_tile[0],'tile':well_tile[1]} filepattern.update(wildcards) stacked = read_hdf_image(name(filepattern)) nuclei = read(name(filepattern,subdir='process_ph',tag='nuclei',ext='tif')) cells = read(name(filepattern,subdir='process_ph',tag='cells',ext='tif')) df_result = Snake._extract_phenotype_cp(data_phenotype=stacked, nuclei=nuclei, cells=cells, wildcards=wildcards, nucleus_channels=[0,1,2,3], cell_channels=[0,1,2,3], channel_names=['dapi','tubulin','gh2ax','phalloidin'] ) df_result.to_csv(name(filepattern,subdir='process_ph',tag='cp_phenotype',ext='csv'))
def export_nd2(f, iter_axes='v', project_axes=False, slicer=slice(None), f_description=None, split=False, backend='ND2SDK', **kwargs): if f_description is None: f_description = parse_nd2_filename(f) if backend == 'ND2SDK': reader = ND2_Reader axes = list('mtzcyx') elif backend == 'python': reader = ND2Reader axes = list('vtzcyx') else: raise ValueError('Only "ND2SDK" and "python" backends are available.') with reader(f) as nd2: nd2.iter_axes = iter_axes nd2.bundle_axes = [ ax for ax in axes if (ax in nd2.axes) & (ax != iter_axes) ] if project_axes: g = lambda x: x.max(axis=nd2.bundle_axes.index(project_axes)) axes.remove(project_axes) else: g = lambda x: x if split: axes.remove(nd2.iter_axes[0]) axes = [ax in nd2.bundle_axes for ax in axes] axes = axes[axes.index(True):] for site, data in enumerate(nd2[slicer]): data = g(data) save(name(f_description, site=site, ext='tif'), data[tuple([slice(None) if ax else None for ax in axes])], **kwargs) else: axes = [ax in nd2.axes for ax in axes] axes = axes[axes.index(True):] data = np.array([g(data) for data in nd2[slicer]]) save(name(f_description, ext='tif'), data[tuple([slice(None) if ax else None for ax in axes])], **kwargs)
def build_file_table(f_nd2, f_template, wells): """ Example: wells = 'A1', 'A2', 'A3', 'B1', 'B2', 'B3' f_template = 'input/10X_Hoechst-mNeon/10X_Hoechst-mNeon_A1.live.tif' build_file_table(f_nd2, f_template, wells) """ rename = lambda x: name(parse(f_template), **x) get_well = lambda x: wells[int(re.findall('Well(\d)', x)[0]) - 1] df_files = (common.extract_nd2_metadata_sdk( f_nd2, progress=tqdn).assign(well=lambda x: x['file'].apply(get_well)).assign( site=lambda x: x['m']).assign( file_=lambda x: x.apply(rename, axis=1))) return df_files
def extract_nd2_metadata_py( f, variables=['frames', 'x_data', 'y_data', 'z_data', 't_data'], f_description=None): if f_description is None: f_description = parse_nd2_filename(f) with ND2Reader(f) as nd2: df = pd.DataFrame({ key: val for key, val in nd2.metadata.items() if key in variables }) if 'z_data' in variables: df = pd.concat([ df, pd.DataFrame(np.array(df['z_data'].tolist()), columns=[ 'z_' + str(level) for level in nd2.metadata['z_levels'] ]) ], axis=1) df = df.drop(columns='z_data') if 't_data' in variables: t_data = np.array(nd2.timesteps).reshape( -1, len(nd2.metadata['z_levels'])) df = pd.concat([ df, pd.DataFrame(t_data, columns=[ 't_' + str(step) for step in range(t_data.shape[1]) ]) ], axis=1) if 'v' in nd2.axes: df['site'] = nd2.metadata['fields_of_view'] else: df = df.assign(site=f_description['site']) (df.assign(well=f_description['well']).to_pickle( name(f_description, ext='pkl')))
def export_nd2(f, iter_axes='v', project_axes=False, slicer=slice(None), f_description=None, split=False, backend='ND2SDK', **kwargs): if f_description is None: f_description = parse_nd2_filename(f) if backend == 'ND2SDK': reader = ND2Reader_SDK axes = list('mtzcyx') iter_axes = 'm' if iter_axes == 'v' else iter_axes elif backend == 'python': reader = ND2Reader axes = list('vtzcyx') iter_axes = 'v' if iter_axes == 'm' else iter_axes else: raise ValueError('Only "ND2SDK" and "python" backends are available.') if not iter_axes in axes: raise ValueError( f'Supplied iter_axes \'{iter_axes}\' not in axes options for backend \'{backend}\' ({axes})' ) with reader(f) as nd2: if split: nd2.iter_axes = iter_axes nd2.bundle_axes = [ ax for ax in axes if (ax in nd2.axes) & (ax != iter_axes) ] if project_axes: g = lambda x: x.max(axis=nd2.bundle_axes.index(project_axes)) axes.remove(project_axes) else: g = lambda x: x print(axes) axes.remove(nd2.iter_axes[0]) # preserve inner singleton dimensions axes = [ax in nd2.bundle_axes for ax in axes] axes = axes[axes.index(True):] for site, data in enumerate(nd2[slicer]): data = g(data) save(name(f_description, site=site, ext='tif'), data[tuple([slice(None) if ax else None for ax in axes])], **kwargs) else: axes_exist = [ax for ax in axes if ax in nd2.axes] nd2.iter_axes = axes_exist[0] nd2.bundle_axes = axes_exist[1:] if project_axes: data = np.max(nd2, axis=axes_exist.index(project_axes)) axes_exist.remove(project_axes) # preserve inner singleton dimensions axes = [ax in axes_exist for ax in axes] axes = axes[axes.index(True):] save(name(f_description, ext='tif'), data[tuple([slice(None) if ax else None for ax in axes])], **kwargs)