Mercurial > repos > goeckslab > gate_finder
comparison gate_finder.py @ 4:5f4a4dd06bc9 draft
planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/vitessce commit bc4c0bb6784a55399241f99a29b176541a164a18
| author | goeckslab |
|---|---|
| date | Thu, 20 Feb 2025 19:47:28 +0000 |
| parents | 6df8d6e42152 |
| children | e860ca30cd0b |
comparison
equal
deleted
inserted
replaced
| 3:80102785f5ff | 4:5f4a4dd06bc9 |
|---|---|
| 1 import argparse | 1 import argparse |
| 2 import json | 2 import json |
| 3 import warnings | 3 import warnings |
| 4 from os.path import isdir, join | |
| 4 from pathlib import Path | 5 from pathlib import Path |
| 5 | 6 |
| 6 import numpy as np | 7 import numpy as np |
| 7 import pandas as pd | 8 import pandas as pd |
| 8 from anndata import read_h5ad | 9 from anndata import read_h5ad |
| 13 Component as cm, | 14 Component as cm, |
| 14 MultiImageWrapper, | 15 MultiImageWrapper, |
| 15 OmeTiffWrapper, | 16 OmeTiffWrapper, |
| 16 VitessceConfig, | 17 VitessceConfig, |
| 17 ) | 18 ) |
| 19 from vitessce.data_utils import ( | |
| 20 optimize_adata, | |
| 21 VAR_CHUNK_SIZE, | |
| 22 ) | |
| 18 | 23 |
| 19 | 24 |
| 20 # Generate binarized phenotype for a gate | 25 # Generate binarized phenotype for a gate |
| 21 def get_gate_phenotype(g, d): | 26 def get_gate_phenotype(g, d): |
| 22 dd = d.copy() | 27 dd = d.copy() |
| 23 dd = np.where(dd < g, 0, dd) | 28 dd = np.where(dd < g, 0, dd) |
| 24 np.warnings.filterwarnings('ignore') | 29 warnings.filterwarnings('ignore') |
| 25 dd = np.where(dd >= g, 1, dd) | 30 dd = np.where(dd >= g, 1, dd) |
| 26 return dd | 31 return dd |
| 27 | 32 |
| 28 | 33 |
| 29 def get_gmm_phenotype(data): | 34 def get_gmm_phenotype(data): |
| 46 gate = np.mean(gmm.means_) | 51 gate = np.mean(gmm.means_) |
| 47 | 52 |
| 48 return get_gate_phenotype(gate, np.ravel(data_norm)) | 53 return get_gate_phenotype(gate, np.ravel(data_norm)) |
| 49 | 54 |
| 50 | 55 |
| 51 def main(inputs, output, image, anndata, masks=None): | 56 def main(inputs, output, image, anndata, offsets=None, masks=None): |
| 52 """ | 57 """ |
| 53 Parameter | 58 Parameter |
| 54 --------- | 59 --------- |
| 55 inputs : str | 60 inputs : str |
| 56 File path to galaxy tool parameter. | 61 File path to galaxy tool parameter. |
| 102 gate_names.append(key) | 107 gate_names.append(key) |
| 103 | 108 |
| 104 adata.obs['GMM_auto'] = get_gmm_phenotype(marker_values) | 109 adata.obs['GMM_auto'] = get_gmm_phenotype(marker_values) |
| 105 gate_names.append('GMM_auto') | 110 gate_names.append('GMM_auto') |
| 106 | 111 |
| 107 adata.obsm['XY_coordinate'] = adata.obs[[x_coordinate, y_coordinate]].values | 112 adata.obsm['spatial'] = adata.obs[[x_coordinate, y_coordinate]].values |
| 108 | 113 |
| 109 vc = VitessceConfig(name=None, description=None) | 114 # initialize vitessce config and add OME-TIFF image |
| 115 vc = VitessceConfig(schema_version="1.0.17", name=None, description=None) | |
| 110 dataset = vc.add_dataset() | 116 dataset = vc.add_dataset() |
| 111 image_wrappers = [OmeTiffWrapper(img_path=image, name='OMETIFF')] | 117 image_wrappers = [OmeTiffWrapper(img_path=image, offsets_path=offsets, name='OMETIFF')] |
| 112 if masks: | 118 if masks: |
| 113 image_wrappers.append( | 119 image_wrappers.append( |
| 114 OmeTiffWrapper(img_path=masks, name='MASKS', is_bitmask=True) | 120 OmeTiffWrapper(img_path=masks, name='MASKS', is_bitmask=True) |
| 115 ) | 121 ) |
| 116 dataset.add_object(MultiImageWrapper(image_wrappers)) | 122 dataset.add_object(MultiImageWrapper(image_wrappers)) |
| 117 | 123 |
| 124 # write anndata out as zarr hierarchy | |
| 125 zarr_filepath = join("data", "adata.zarr") | |
| 126 if not isdir(zarr_filepath): | |
| 127 adata = optimize_adata( | |
| 128 adata, | |
| 129 obs_cols=gate_names, | |
| 130 obsm_keys=['spatial'], | |
| 131 optimize_X=True | |
| 132 ) | |
| 133 adata.write_zarr( | |
| 134 zarr_filepath, | |
| 135 chunks=[adata.shape[0], VAR_CHUNK_SIZE] | |
| 136 ) | |
| 137 | |
| 138 # add anndata zarr to vitessce config | |
| 118 dataset.add_object( | 139 dataset.add_object( |
| 119 AnnDataWrapper( | 140 AnnDataWrapper( |
| 120 adata, | 141 adata_path=zarr_filepath, |
| 121 spatial_centroid_obsm='XY_coordinate', | 142 obs_feature_matrix_path="X", # FIXME: provide rep options |
| 122 cell_set_obs=gate_names, | 143 obs_set_paths=['obs/' + x for x in gate_names], |
| 123 cell_set_obs_names=[obj[0].upper() + obj[1:] for obj in gate_names], | 144 obs_set_names=gate_names, |
| 124 expression_matrix="X" | 145 obs_locations_path='spatial' |
| 125 ) | 146 ) |
| 126 ) | 147 ) |
| 127 spatial = vc.add_view(dataset, cm.SPATIAL) | 148 |
| 128 cellsets = vc.add_view(dataset, cm.CELL_SETS) | 149 # add views |
| 129 status = vc.add_view(dataset, cm.STATUS) | 150 spatial = vc.add_view( |
| 130 lc = vc.add_view(dataset, cm.LAYER_CONTROLLER) | 151 view_type=cm.SPATIAL, |
| 131 genes = vc.add_view(dataset, cm.GENES) | 152 dataset=dataset, |
| 132 cell_set_sizes = vc.add_view(dataset, cm.CELL_SET_SIZES) | 153 w=6, |
| 133 cell_set_expression = vc.add_view(dataset, cm.CELL_SET_EXPRESSION) | 154 h=12) |
| 134 | 155 |
| 156 cellsets = vc.add_view( | |
| 157 view_type=cm.OBS_SETS, | |
| 158 dataset=dataset, | |
| 159 w=3, | |
| 160 h=6) | |
| 161 | |
| 162 lc = vc.add_view( | |
| 163 view_type=cm.LAYER_CONTROLLER, | |
| 164 dataset=dataset, | |
| 165 w=3, | |
| 166 h=9) | |
| 167 | |
| 168 genes = vc.add_view( | |
| 169 view_type=cm.FEATURE_LIST, | |
| 170 dataset=dataset, | |
| 171 w=3, | |
| 172 h=3) | |
| 173 | |
| 174 cell_set_sizes = vc.add_view( | |
| 175 view_type=cm.OBS_SET_SIZES, | |
| 176 dataset=dataset, | |
| 177 w=3, | |
| 178 h=3) | |
| 179 | |
| 180 cell_set_expression = vc.add_view( | |
| 181 view_type=cm.OBS_SET_FEATURE_VALUE_DISTRIBUTION, | |
| 182 dataset=dataset, | |
| 183 w=3, | |
| 184 h=3) | |
| 185 | |
| 186 # define the dashboard layout | |
| 135 vc.layout( | 187 vc.layout( |
| 136 (status / genes / cell_set_expression) | 188 (cellsets / genes / cell_set_expression) |
| 137 | (cellsets / cell_set_sizes / lc) | 189 | (cell_set_sizes / lc) |
| 138 | (spatial) | 190 | (spatial) |
| 139 ) | 191 ) |
| 192 | |
| 193 # export config file | |
| 140 config_dict = vc.export(to='files', base_url='http://localhost', out_dir=output) | 194 config_dict = vc.export(to='files', base_url='http://localhost', out_dir=output) |
| 141 | 195 |
| 142 with open(Path(output).joinpath('config.json'), 'w') as f: | 196 with open(Path(output).joinpath('config.json'), 'w') as f: |
| 143 json.dump(config_dict, f, indent=4) | 197 json.dump(config_dict, f, indent=4) |
| 144 | 198 |
| 147 aparser = argparse.ArgumentParser() | 201 aparser = argparse.ArgumentParser() |
| 148 aparser.add_argument("-i", "--inputs", dest="inputs", required=True) | 202 aparser.add_argument("-i", "--inputs", dest="inputs", required=True) |
| 149 aparser.add_argument("-e", "--output", dest="output", required=True) | 203 aparser.add_argument("-e", "--output", dest="output", required=True) |
| 150 aparser.add_argument("-g", "--image", dest="image", required=True) | 204 aparser.add_argument("-g", "--image", dest="image", required=True) |
| 151 aparser.add_argument("-a", "--anndata", dest="anndata", required=True) | 205 aparser.add_argument("-a", "--anndata", dest="anndata", required=True) |
| 206 aparser.add_argument("-f", "--offsets", dest="offsets", required=False) | |
| 152 aparser.add_argument("-m", "--masks", dest="masks", required=False) | 207 aparser.add_argument("-m", "--masks", dest="masks", required=False) |
| 153 | 208 |
| 154 args = aparser.parse_args() | 209 args = aparser.parse_args() |
| 155 | 210 |
| 156 main(args.inputs, args.output, args.image, args.anndata, args.masks) | 211 main(args.inputs, args.output, args.image, args.anndata, args.offsets, args.masks) |
