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)