Mercurial > repos > goeckslab > gate_finder
comparison gate_finder.py @ 4:5f4a4dd06bc9 draft default tip
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 |
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) |