comparison vitessce_spatial.py @ 0:9f60ef2d586e draft

planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/vitessce commit 9b2dc921e692af8045773013d9f87d4d790e2ea1
author goeckslab
date Thu, 08 Sep 2022 17:23:33 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:9f60ef2d586e
1 import argparse
2 import json
3 import warnings
4 from pathlib import Path
5
6 import scanpy as sc
7 from anndata import read_h5ad
8 from vitessce import (
9 AnnDataWrapper,
10 Component as cm,
11 MultiImageWrapper,
12 OmeTiffWrapper,
13 VitessceConfig,
14 )
15
16
17 def main(inputs, output, image, anndata=None, masks=None):
18 """
19 Parameter
20 ---------
21 inputs : str
22 File path to galaxy tool parameter.
23 output : str
24 Output folder for saving web content.
25 image : str
26 File path to the OME Tiff image.
27 anndata : str
28 File path to anndata containing phenotyping info.
29 masks : str
30 File path to the image masks.
31 """
32 warnings.simplefilter('ignore')
33
34 with open(inputs, 'r') as param_handler:
35 params = json.load(param_handler)
36
37 vc = VitessceConfig(name=None, description=None)
38 dataset = vc.add_dataset()
39 image_wrappers = [OmeTiffWrapper(img_path=image, name='OMETIFF')]
40 if masks:
41 image_wrappers.append(
42 OmeTiffWrapper(img_path=masks, name='MASKS', is_bitmask=True)
43 )
44 dataset.add_object(MultiImageWrapper(image_wrappers))
45
46 status = vc.add_view(dataset, cm.STATUS)
47 spatial = vc.add_view(dataset, cm.SPATIAL)
48 lc = vc.add_view(dataset, cm.LAYER_CONTROLLER)
49
50 if not anndata:
51 vc.layout(status / lc | spatial)
52 config_dict = vc.export(to='files', base_url='http://localhost', out_dir=output)
53 with open(Path(output).joinpath('config.json'), 'w') as f:
54 json.dump(config_dict, f, indent=4)
55 return
56
57 adata = read_h5ad(anndata)
58
59 params = params['do_phenotyping']
60 embedding = params['scatterplot_embeddings']['embedding']
61 embedding_options = params['scatterplot_embeddings']['options']
62 if embedding == 'umap':
63 sc.pp.neighbors(adata, **embedding_options)
64 sc.tl.umap(adata)
65 mappings_obsm = 'X_umap'
66 mappings_obsm_name = "UMAP"
67 elif embedding == 'tsne':
68 sc.tl.tsne(adata, **embedding_options)
69 mappings_obsm = 'X_tsne'
70 mappings_obsm_name = "tSNE"
71 else: # pca
72 sc.tl.pca(adata, **embedding_options)
73 mappings_obsm = 'X_pca'
74 mappings_obsm_name = "PCA"
75
76 adata.obsm['XY_centroid'] = adata.obs[['X_centroid', 'Y_centroid']].values
77
78 cell_set_obs = params['phenotype_factory']['phenotypes']
79 if not isinstance(cell_set_obs, list):
80 cell_set_obs = [x.strip() for x in cell_set_obs.split(',')]
81 cell_set_obs_names = [obj[0].upper() + obj[1:] for obj in cell_set_obs]
82 dataset.add_object(
83 AnnDataWrapper(
84 adata,
85 mappings_obsm=[mappings_obsm],
86 mappings_obsm_names=[mappings_obsm_name],
87 spatial_centroid_obsm='XY_centroid',
88 cell_set_obs=cell_set_obs,
89 cell_set_obs_names=cell_set_obs_names,
90 expression_matrix="X"
91 )
92 )
93
94 cellsets = vc.add_view(dataset, cm.CELL_SETS)
95 scattorplot = vc.add_view(dataset, cm.SCATTERPLOT, mapping=mappings_obsm_name)
96 heatmap = vc.add_view(dataset, cm.HEATMAP)
97 genes = vc.add_view(dataset, cm.GENES)
98 cell_set_sizes = vc.add_view(dataset, cm.CELL_SET_SIZES)
99 cell_set_expression = vc.add_view(dataset, cm.CELL_SET_EXPRESSION)
100 vc.layout(
101 (status / genes / cell_set_expression)
102 | (cellsets / lc / scattorplot)
103 | (cell_set_sizes / heatmap / spatial)
104 )
105 config_dict = vc.export(to='files', base_url='http://localhost', out_dir=output)
106
107 with open(Path(output).joinpath('config.json'), 'w') as f:
108 json.dump(config_dict, f, indent=4)
109
110
111 if __name__ == '__main__':
112 aparser = argparse.ArgumentParser()
113 aparser.add_argument("-i", "--inputs", dest="inputs", required=True)
114 aparser.add_argument("-e", "--output", dest="output", required=True)
115 aparser.add_argument("-g", "--image", dest="image", required=True)
116 aparser.add_argument("-a", "--anndata", dest="anndata", required=False)
117 aparser.add_argument("-m", "--masks", dest="masks", required=False)
118
119 args = aparser.parse_args()
120
121 main(args.inputs, args.output, args.image, args.anndata, args.masks)