# HG changeset patch
# User goeckslab
# Date 1720736573 0
# Node ID 6fe0d4f464f40f3f72002567dc53551b461febf9
planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/squidpy commit 721eaced787aa3b04d96ad91f6b4540f26b23949
diff -r 000000000000 -r 6fe0d4f464f4 main_macros.xml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main_macros.xml	Thu Jul 11 22:22:53 2024 +0000
@@ -0,0 +1,64 @@
+
+    1.5.0
+    20.01
+    1 
+
+    
+        
+            
+        
+    
+
+    
+        
+            squidpy
+        
+    
+
+    
+        
+            10.1038/s41592-021-01358-2
+        
+    
+
+    
+        
+    
+
+    
+        
+    
+
+    
+        
+    
+
+    
+        
+            
+            
+            
+                
+                
+                
+                
+                
+                
+                
+                
+            
+            
+            
+            
+            
+        
+    
+
diff -r 000000000000 -r 6fe0d4f464f4 squidpy_scatter.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/squidpy_scatter.py	Thu Jul 11 22:22:53 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)
diff -r 000000000000 -r 6fe0d4f464f4 squidpy_scatter.xml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/squidpy_scatter.xml	Thu Jul 11 22:22:53 2024 +0000
@@ -0,0 +1,72 @@
+
+    with Squidpy
+    
+        main_macros.xml
+    
+    
+        operation_3443
+    
+    
+    
+    echo "@TOOL_VERSION@"
+    
+        
+    
+    
+        
+    
+    
+        
+        
+        
+        
+        
+        
+        
+    
+    
+        
+    
+    
+        
+            
+            
+            
+        
+    
+    
+        
+    
+    
+
diff -r 000000000000 -r 6fe0d4f464f4 squidpy_spatial.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/squidpy_spatial.py	Thu Jul 11 22:22:53 2024 +0000
@@ -0,0 +1,105 @@
+import argparse
+import ast
+import json
+import warnings
+
+import pandas as pd
+import squidpy as sq
+from anndata import read_h5ad
+
+
+def main(inputs, anndata, output, output_plot):
+    """
+    Parameter
+    ---------
+    inputs : str
+        File path to galaxy tool parameter.
+    anndata : str
+        File path to anndata containing phenotyping info.
+    output : str
+        File path to output.
+    output_plot: str or None
+        File path to save the plotting image.
+    """
+    warnings.simplefilter('ignore')
+
+    with open(inputs, 'r') as param_handler:
+        params = json.load(param_handler)
+
+    adata = read_h5ad(anndata)
+
+    if 'spatial' not in adata.obsm:
+        try:
+            adata.obsm['spatial'] = adata.obs[['X_centroid', 'Y_centroid']].values
+        except Exception as e:
+            print(e)
+
+    tool = params['analyses']['selected_tool']
+    tool_func = getattr(sq.gr, tool)
+
+    options = params['analyses']['options']
+
+    for k, v in options.items():
+        if not isinstance(v, str):
+            continue
+
+        if v in ('', 'none'):
+            options[k] = None
+            continue
+
+        if k == 'genes':    # for spatial_autocorr and sepal
+            options[k] = [e.strip() for e in v.split(',')]
+        elif k == 'radius':    # for spatial_neighbors
+            options[k] = ast.literal_eval(v)
+        elif k == 'interactions':    # for ligrec
+            options[k] = pd.read_csv(v, sep="\t")
+        elif k == 'max_neighs':
+            options[k] = int(v)      # for sepal
+
+    cluster_key = params['analyses'].get('cluster_key')
+    if cluster_key:
+        tool_func(adata, cluster_key, **options)
+    else:
+        tool_func(adata, **options)
+
+    if output_plot:
+        plotting_options = params['analyses']['plotting_options']
+        for k, v in plotting_options.items():
+            if not isinstance(v, str):
+                continue
+
+            if v in ('', 'none'):
+                plotting_options[k] = None
+                continue
+
+            if k == 'figsize':
+                options[k] = ast.literal_eval(v)
+            elif k in ('palette', 'score', 'source_groups', 'target_groups'):
+                options[k] = [e.strip() for e in v.split(',')]
+            elif k == 'means_range':        # ligrec
+                v = v.strip()
+                if v[0] == '(':
+                    v = v[1:]
+                if v[-1] == ')':
+                    v = v[:-1]
+                options[k] = tuple([float(e.strip()) for e in v.split(',', 1)])
+
+        plotting_func = getattr(sq.pl, tool)
+        if cluster_key:
+            plotting_func(adata, cluster_key, save=output_plot, **plotting_options)
+        else:       # TODO Remove this, since all plottings need cluster key
+            plotting_func(adata, save=output_plot, **plotting_options)
+
+    adata.write(output)
+
+
+if __name__ == '__main__':
+    aparser = argparse.ArgumentParser()
+    aparser.add_argument("-i", "--inputs", dest="inputs", required=True)
+    aparser.add_argument("-e", "--output", dest="output", required=True)
+    aparser.add_argument("-a", "--anndata", dest="anndata", required=True)
+    aparser.add_argument("-p", "--output_plot", dest="output_plot", required=False)
+
+    args = aparser.parse_args()
+
+    main(args.inputs, args.anndata, args.output, args.output_plot)
diff -r 000000000000 -r 6fe0d4f464f4 test-data/imc.h5ad
Binary file test-data/imc.h5ad has changed
diff -r 000000000000 -r 6fe0d4f464f4 test-data/imc_centrality_scores.png
Binary file test-data/imc_centrality_scores.png has changed
diff -r 000000000000 -r 6fe0d4f464f4 test-data/imc_co_occurrence.png
Binary file test-data/imc_co_occurrence.png has changed
diff -r 000000000000 -r 6fe0d4f464f4 test-data/imc_interaction_matrix.png
Binary file test-data/imc_interaction_matrix.png has changed
diff -r 000000000000 -r 6fe0d4f464f4 test-data/imc_kmeans.h5ad
Binary file test-data/imc_kmeans.h5ad has changed
diff -r 000000000000 -r 6fe0d4f464f4 test-data/imc_nhood_enrichment.png
Binary file test-data/imc_nhood_enrichment.png has changed
diff -r 000000000000 -r 6fe0d4f464f4 test-data/imc_ripley.png
Binary file test-data/imc_ripley.png has changed
diff -r 000000000000 -r 6fe0d4f464f4 test-data/imc_sn.h5ad
Binary file test-data/imc_sn.h5ad has changed
diff -r 000000000000 -r 6fe0d4f464f4 test-data/scatter_image.png
Binary file test-data/scatter_image.png has changed