diff squidpy_scatter.py @ 0:5b17a47d1ade draft

planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/squidpy commit 721eaced787aa3b04d96ad91f6b4540f26b23949
author goeckslab
date Thu, 11 Jul 2024 22:22:41 +0000
parents
children 2a5036c29889
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/squidpy_scatter.py	Thu Jul 11 22:22:41 2024 +0000
@@ -0,0 +1,87 @@
+import argparse
+import ast
+import json
+import warnings
+
+import squidpy as sq
+from anndata import read_h5ad
+
+
+def main(inputs, output_plot):
+
+    """
+    inputs : str
+        File path to galaxy tool JSON inputs config file
+    output_plot: str
+        File path to save the plotting image
+    """
+    warnings.simplefilter('ignore')
+
+    # read inputs JSON
+    with open(inputs, 'r') as param_handler:
+        params = json.load(param_handler)
+
+    # collapse param dict hierarchy, parse inputs
+    plot_opts = params.pop('plot_opts')
+    legend_opts = params.pop('legend_opts')
+    aes_opts = params.pop('aesthetic_opts')
+    options = {**params, **plot_opts, **legend_opts, **aes_opts}
+
+    # read input anndata file
+    adata_fh = options.pop('anndata')
+    adata = read_h5ad(adata_fh)
+
+    # ensure spatial coords in anndata.obsm['spatial']
+    # if not, populate with user provided X/Y coord column names
+    x, y = options.pop('x_coord'), options.pop('y_coord')
+    if 'spatial' not in adata.obsm:
+        try:
+            adata.obsm['spatial'] = adata.obs[[x, y]].values
+        except Exception as e:
+            print(e)
+
+    # scan thru tool params,
+    # replace None values, and reformat specific parameters
+    for k, v in options.items():
+        if not isinstance(v, str):
+            continue
+
+        if v in ('', 'none'):
+            options[k] = None
+            continue
+
+        if k == 'groups':
+            options[k] = [e.strip() for e in v.split(',')]
+
+        elif k == 'crop_coord':
+            # split str on commas into tuple of coords
+            # then nest in list (expected by squidpy function)
+            options[k] = [tuple([int(e.strip()) for e in v.split(',')])]
+
+        elif k == 'figsize':
+            options[k] = ast.literal_eval(v)
+
+    # not exposing this parameter for now. Only useful to change for ST data
+    # and can otherwise just be problematic.
+    # Explicitly setting to None is necessary to avoid an error
+    options['shape'] = None
+
+    # call squidpy spatial scatter function, unpack tool params
+    sq.pl.spatial_scatter(
+        adata=adata,
+        save='image.png',
+        **options
+    )
+
+
+if __name__ == '__main__':
+
+    aparser = argparse.ArgumentParser()
+    aparser.add_argument(
+        "-i", "--inputs", dest="inputs", required=True)
+    aparser.add_argument(
+        "-p", "--output_plot", dest="output_plot", required=False)
+
+    args = aparser.parse_args()
+
+    main(args.inputs, args.output_plot)