diff --git a/preprocessing/neighbors/delaunay_triangulation.yml b/preprocessing/neighbors/delaunay_traingulation/delaunay_traingulation.yml similarity index 100% rename from preprocessing/neighbors/delaunay_triangulation.yml rename to preprocessing/neighbors/delaunay_traingulation/delaunay_traingulation.yml diff --git a/preprocessing/neighbors/delaunay_triangulation.py b/preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py old mode 100755 new mode 100644 similarity index 78% rename from preprocessing/neighbors/delaunay_triangulation.py rename to preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py index 3d3b79fd..f7e2e59a --- a/preprocessing/neighbors/delaunay_triangulation.py +++ b/preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py @@ -1,6 +1,7 @@ #!/usr/bin/env python # Author_and_contribution: Niklas Mueller-Boetticher; created script +# Author_and_contribution: Qirong Mao; modifying output file format import argparse @@ -21,7 +22,7 @@ parser.add_argument( "-o", "--observations", help="Path to observations (as tsv).", required=True ) -parser.add_argument("-d", "--out_file", help="Output file.", required=True) +parser.add_argument("-d", "--out_dir", help="Output directory.", required=True) parser.add_argument( "--config", help="Optional config file (json) used to pass additional parameters.", @@ -33,8 +34,11 @@ # Output files from pathlib import Path -neighbor_file = Path(args.out_file) -# if additional output files are required write it also to out_dir +out_dir = Path(args.out_dir) + +spatial_connectivities_file = out_dir / "spatial_connectivities.mtx" +##spatial_distances_file = out_dir / "spatial_distances.mtx" + # Use these filepaths and inputs ... coord_file = args.coordinates @@ -42,9 +46,6 @@ feature_file = args.features observation_file = args.observations -if args.config is not None: - config_file = args.config - # ... or AnnData if you want def get_anndata(args): @@ -77,11 +78,14 @@ def get_anndata(args): import squidpy as sq sq.gr.spatial_neighbors(adata, delaunay=True, coord_type="generic") -neighbors = adata.obsp["spatial_connectivities"].astype(int) +neighbors = adata.obsp["spatial_connectivities"].astype(int) +##distance = adata.obsp["spatial_distances"].astype(float) ## Write output import scipy as sp -neighbor_file.parent.mkdir(parents=True, exist_ok=True) -sp.io.mmwrite(neighbor_file, neighbors) +out_dir.mkdir(parents=True, exist_ok=True) + +sp.io.mmwrite(spatial_connectivities_file, neighbors) +##sp.io.mmwrite(spatial_distances_file, distance) diff --git a/preprocessing/neighbors/n_neighbourhood/config/config_1.json b/preprocessing/neighbors/n_neighbourhood/config/config_1.json new file mode 100644 index 00000000..0cf6fb21 --- /dev/null +++ b/preprocessing/neighbors/n_neighbourhood/config/config_1.json @@ -0,0 +1,3 @@ +{ + "n_neighs":6 +} \ No newline at end of file diff --git a/preprocessing/neighbors/n_neighbourhood/n_neighbourhood.py b/preprocessing/neighbors/n_neighbourhood/n_neighbourhood.py new file mode 100644 index 00000000..68d1b286 --- /dev/null +++ b/preprocessing/neighbors/n_neighbourhood/n_neighbourhood.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python + +# Author_and_contribution: Niklas Mueller-Boetticher; created script, +# Author_and_contribution: Qirong Mao; implemented method + +import argparse + +# TODO adjust description +parser = argparse.ArgumentParser( + description="Neighbor definition based on numbers of neibourhood (only for generic coordinates)" +) + +parser.add_argument( + "-c", "--coordinates", help="Path to coordinates (as tsv).", required=True +) + +parser.add_argument( + "-m", "--matrix", help="Path to (transformed) counts (as mtx).", required=True +) + +parser.add_argument( + "-f", "--features", help="Path to features (as tsv).", required=True +) + +parser.add_argument( + "-o", "--observations", help="Path to observations (as tsv).", required=True +) + +parser.add_argument("-d", "--out_dir", help="Output directory.", required=True) + +parser.add_argument( + "--config", + help="Optional config file (json) used to pass additional parameters.", + required=False, +) + +args = parser.parse_args() + +# Output files +from pathlib import Path + +out_dir = Path(args.out_dir) + +spatial_connectivities_file = out_dir / "spatial_connectivities.mtx" +##spatial_distances_file = out_dir / "spatial_distances.mtx" + +# Use these filepaths and inputs ... +coord_file = args.coordinates +matrix_file = args.matrix +feature_file = args.features +observation_file = args.observations + +## Loading n_neighs parameter from config_file + +if args.config is not None: + config_file = args.config + +import json + +with open(config) as f: + parameters = json.load(f) + +n_neighs = data["n_neighs"] + +# ... or AnnData if you want +def get_anndata(args): + # Untested template + import anndata as ad + import pandas as pd + import scipy as sp + + X = sp.io.mmread(args.matrix) + if sp.sparse.issparse(X): + X = X.tocsr() + observations = pd.read_table(args.observations, index_col=0) + features = pd.read_table(args.features, index_col=0) + coordinates = ( + pd.read_table(args.coordinates, index_col=0) + .loc[observations.index, :] + .to_numpy() + ) + + adata = ad.AnnData( + X=X, obs=observations, var=features, obsm={"spatial": coordinates} + ) + + return adata + + +adata = get_anndata(args) + +## Your code goes here +import squidpy as sq + +sq.gr.spatial_neighbors(adata, n_neighs=n_neighs, coord_type="generic") + +neighbors = adata.obsp["spatial_connectivities"].astype(int) +##distance = adata.obsp["spatial_distances"].astype(float) + +## Write output +import scipy as sp + +out_dir.mkdir(parents=True, exist_ok=True) + +sp.io.mmwrite(spatial_connectivities_file, neighbors) +##sp.io.mmwrite(spatial_distances_file, distance) diff --git a/preprocessing/neighbors/n_neighbourhood/n_neighbourhood.yml b/preprocessing/neighbors/n_neighbourhood/n_neighbourhood.yml new file mode 100644 index 00000000..94ae843e --- /dev/null +++ b/preprocessing/neighbors/n_neighbourhood/n_neighbourhood.yml @@ -0,0 +1,7 @@ +channels: + - conda-forge +dependencies: + - python=3.9.18 + - pip + - pip: + - squidpy==1.3.1 \ No newline at end of file diff --git a/preprocessing/neighbors/n_rings/config/config_1.json b/preprocessing/neighbors/n_rings/config/config_1.json new file mode 100644 index 00000000..b8c03c16 --- /dev/null +++ b/preprocessing/neighbors/n_rings/config/config_1.json @@ -0,0 +1,3 @@ +{ + "n_rings":1 +} \ No newline at end of file diff --git a/preprocessing/neighbors/n_rings/n_rings.py b/preprocessing/neighbors/n_rings/n_rings.py new file mode 100644 index 00000000..273f4102 --- /dev/null +++ b/preprocessing/neighbors/n_rings/n_rings.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python + +# Author_and_contribution: Niklas Mueller-Boetticher; created script, +# Author_and_contribution: Qirong Mao; implemented method + + +import argparse + +# TODO adjust description +parser = argparse.ArgumentParser( + description="Neighbor definition based on number of rings of neighbors (only for grid coordinates)" +) + +parser.add_argument( + "-c", "--coordinates", help="Path to coordinates (as tsv).", required=True +) + +parser.add_argument( + "-m", "--matrix", help="Path to (transformed) counts (as mtx).", required=True +) + +parser.add_argument( + "-f", "--features", help="Path to features (as tsv).", required=True +) + +parser.add_argument( + "-o", "--observations", help="Path to observations (as tsv).", required=True +) + +parser.add_argument("-d", "--out_dir", help="Output directory.", required=True) + +parser.add_argument( + "--config", + help="Optional config file (json) used to pass additional parameters.", + required=False, +) + +args = parser.parse_args() + +# Output files +from pathlib import Path + +out_dir = Path(args.out_dir) + +spatial_connectivities_file = out_dir / "spatial_connectivities.mtx" +##spatial_distances_file = out_dir / "spatial_distances.mtx" + +# Use these filepaths and inputs ... +coord_file = args.coordinates +matrix_file = args.matrix +feature_file = args.features +observation_file = args.observations + + +## Loading delaunay parameters from config_file +if args.config is not None: + config_file = args.config + +import json + +with open(config_file) as f: + parameters = json.load(f) + +n_rings = parameters["n_rings"] + + +# ... or AnnData if you want +def get_anndata(args): + # Untested template + import anndata as ad + import pandas as pd + import scipy as sp + + X = sp.io.mmread(args.matrix) + if sp.sparse.issparse(X): + X = X.tocsr() + observations = pd.read_table(args.observations, index_col=0) + features = pd.read_table(args.features, index_col=0) + coordinates = ( + pd.read_table(args.coordinates, index_col=0) + .loc[observations.index, :] + .to_numpy() + ) + + adata = ad.AnnData( + X=X, obs=observations, var=features, obsm={"spatial": coordinates} + ) + + return adata + + +adata = get_anndata(args) + +## Your code goes here +import squidpy as sq + +sq.gr.spatial_neighbors(adata,n_rings=n_rings, coord_type="grid") + +neighbors = adata.obsp["spatial_connectivities"].astype(int) +##distance = adata.obsp["spatial_distances"].astype(float) + +## Write output +import scipy as sp + +out_dir.mkdir(parents=True, exist_ok=True) + +sp.io.mmwrite(spatial_connectivities_file, neighbors) +##sp.io.mmwrite(spatial_distances_file, distance) diff --git a/preprocessing/neighbors/n_rings/n_rings.yml b/preprocessing/neighbors/n_rings/n_rings.yml new file mode 100644 index 00000000..94ae843e --- /dev/null +++ b/preprocessing/neighbors/n_rings/n_rings.yml @@ -0,0 +1,7 @@ +channels: + - conda-forge +dependencies: + - python=3.9.18 + - pip + - pip: + - squidpy==1.3.1 \ No newline at end of file diff --git a/preprocessing/neighbors/radius/config/config_1.json b/preprocessing/neighbors/radius/config/config_1.json new file mode 100644 index 00000000..f3de1daf --- /dev/null +++ b/preprocessing/neighbors/radius/config/config_1.json @@ -0,0 +1,3 @@ +{ + "radius":1 +} \ No newline at end of file diff --git a/preprocessing/neighbors/radius/radius.py b/preprocessing/neighbors/radius/radius.py new file mode 100644 index 00000000..524f5b6b --- /dev/null +++ b/preprocessing/neighbors/radius/radius.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python + +# Author_and_contribution: Niklas Mueller-Boetticher; created script, +# Author_and_contribution: Qirong Mao; implemented method + +import argparse + +# TODO adjust description +parser = argparse.ArgumentParser( + description="Neighbor definition based on the radius (only for generic coordinates)" +) + +parser.add_argument( + "-c", "--coordinates", help="Path to coordinates (as tsv).", required=True +) + +parser.add_argument( + "-m", "--matrix", help="Path to (transformed) counts (as mtx).", required=True +) + +parser.add_argument( + "-f", "--features", help="Path to features (as tsv).", required=True +) + +parser.add_argument( + "-o", "--observations", help="Path to observations (as tsv).", required=True +) + +parser.add_argument("-d", "--out_dir", help="Output directory.", required=True) + +parser.add_argument( + "--config", + help="Optional config file (json) used to pass additional parameters.", + required=False, +) + +args = parser.parse_args() + +# Output files +from pathlib import Path + +out_dir = Path(args.out_dir) + +spatial_connectivities_file = out_dir / "spatial_connectivities.mtx" +##spatial_distances_file = out_dir / "spatial_distances.mtx" + +# Use these filepaths and inputs ... +coord_file = args.coordinates +matrix_file = args.matrix +feature_file = args.features +observation_file = args.observations + +## Loading radius parameters from config_file +if args.config is not None: + config_file = args.config + +import json + +with open(config_file) as f: + parameters = json.load(f) + +radius = parameters["radius"] + + +# ... or AnnData if you want +def get_anndata(args): + # Untested template + import anndata as ad + import pandas as pd + import scipy as sp + + X = sp.io.mmread(args.matrix) + if sp.sparse.issparse(X): + X = X.tocsr() + observations = pd.read_table(args.observations, index_col=0) + features = pd.read_table(args.features, index_col=0) + coordinates = ( + pd.read_table(args.coordinates, index_col=0) + .loc[observations.index, :] + .to_numpy() + ) + + adata = ad.AnnData( + X=X, obs=observations, var=features, obsm={"spatial": coordinates} + ) + + return adata + + +adata = get_anndata(args) + +## Your code goes here +import squidpy as sq + +sq.gr.spatial_neighbors(adata, radius=radius, coord_type='generic') + +neighbors = adata.obsp["spatial_connectivities"].astype(int) +##distance = adata.obsp["spatial_distances"].astype(float) + +## Write output +import scipy as sp + +out_dir.mkdir(parents=True, exist_ok=True) + +sp.io.mmwrite(spatial_connectivities_file, neighbors) +##sp.io.mmwrite(spatial_distances_file, distance) diff --git a/preprocessing/neighbors/radius/radius.yml b/preprocessing/neighbors/radius/radius.yml new file mode 100644 index 00000000..94ae843e --- /dev/null +++ b/preprocessing/neighbors/radius/radius.yml @@ -0,0 +1,7 @@ +channels: + - conda-forge +dependencies: + - python=3.9.18 + - pip + - pip: + - squidpy==1.3.1 \ No newline at end of file