From 7d98cd28640d0397756e18dc5f43eea3fa5f94da Mon Sep 17 00:00:00 2001 From: Qirong Mao Date: Wed, 13 Dec 2023 22:06:32 +0000 Subject: [PATCH 01/21] Constructing spatial neighborhood with custom parameters --- ...lation.py => neighborhood_construction.py} | 58 ++++++++++++++++--- ...tion.yml => neighborhood_construction.yml} | 0 2 files changed, 49 insertions(+), 9 deletions(-) rename preprocessing/neighbors/{delaunay_triangulation.py => neighborhood_construction.py} (52%) rename preprocessing/neighbors/{delaunay_triangulation.yml => neighborhood_construction.yml} (100%) diff --git a/preprocessing/neighbors/delaunay_triangulation.py b/preprocessing/neighbors/neighborhood_construction.py similarity index 52% rename from preprocessing/neighbors/delaunay_triangulation.py rename to preprocessing/neighbors/neighborhood_construction.py index 3d3b79fd..56937022 100755 --- a/preprocessing/neighbors/delaunay_triangulation.py +++ b/preprocessing/neighbors/neighborhood_construction.py @@ -1,27 +1,53 @@ #!/usr/bin/env python -# Author_and_contribution: Niklas Mueller-Boetticher; created script +# 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 using Delaunay triangulation" + description="Constructing spatial neighborhood with custom parameters" ) 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_file", help="Output file.", required=True) + +parser.add_argument( + "--coord_type", default=None, choices=['grid', 'generic', None],help="Type of coordinate system.", required=False +) + +parser.add_argument( + "--n_neighs", type=int, default=6,help="Number of neighboring tiles (grid data) or neighborhoods (non-grid data)", required=False +) + +parser.add_argument( + "-r", "--radius", default=None,help="Compute the graph based on neighborhood radius", required=False +) + +parser.add_argument( + "--delaunay", type=bool,default=False,help="Whether to compute the graph from Delaunay triangulation.", required=False +) + +parser.add_argument( + "--n_rings", type=int,default=1,help="Number of rings of neighbors for grid data. Only used when coord_type = 'grid'", required=False +) + +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 +59,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) + +# Output files +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,6 +71,13 @@ feature_file = args.features observation_file = args.observations +## Custom parameters +coord_type = args.coord_type +n_neighs= args.n_neighs +radius = args.radius +delaunay = args.delaunay +n_rings = args.n_rings + if args.config is not None: config_file = args.config @@ -76,12 +112,16 @@ def get_anndata(args): ## Your code goes here import squidpy as sq -sq.gr.spatial_neighbors(adata, delaunay=True, coord_type="generic") -neighbors = adata.obsp["spatial_connectivities"].astype(int) +sq.gr.spatial_neighbors(adata, coord_type=coord_type, n_neighs=n_neighs, radius=radius, delaunay=delaunay, n_rings=n_rings) +neighbors = adata.obsp["spatial_connectivities"].astype(int) +distance = adata.obsp["spatial_distances"].astype(int) ## 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/delaunay_triangulation.yml b/preprocessing/neighbors/neighborhood_construction.yml similarity index 100% rename from preprocessing/neighbors/delaunay_triangulation.yml rename to preprocessing/neighbors/neighborhood_construction.yml From bdac0af666f747ca9bf2bc50c2ca2ba0eb024c77 Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 10:53:45 +0100 Subject: [PATCH 02/21] Separate each function into individual file --- preprocessing/neighbors/coord_type.py | 108 +++++++++++++++++ preprocessing/neighbors/coord_type.yml | 7 ++ .../neighbors/delaunay_traingulation.yml | 7 ++ .../neighbors/delaunay_triangulation.py | 87 ++++++++++++++ preprocessing/neighbors/n_neighs.py | 112 ++++++++++++++++++ preprocessing/neighbors/n_neighs.yml | 7 ++ preprocessing/neighbors/n_rings.py | 111 +++++++++++++++++ preprocessing/neighbors/n_rings.yml | 7 ++ preprocessing/neighbors/radius.py | 110 +++++++++++++++++ preprocessing/neighbors/radius.yml | 7 ++ 10 files changed, 563 insertions(+) create mode 100644 preprocessing/neighbors/coord_type.py create mode 100644 preprocessing/neighbors/coord_type.yml create mode 100644 preprocessing/neighbors/delaunay_traingulation.yml create mode 100644 preprocessing/neighbors/delaunay_triangulation.py create mode 100644 preprocessing/neighbors/n_neighs.py create mode 100644 preprocessing/neighbors/n_neighs.yml create mode 100644 preprocessing/neighbors/n_rings.py create mode 100644 preprocessing/neighbors/n_rings.yml create mode 100644 preprocessing/neighbors/radius.py create mode 100644 preprocessing/neighbors/radius.yml diff --git a/preprocessing/neighbors/coord_type.py b/preprocessing/neighbors/coord_type.py new file mode 100644 index 00000000..fab191f7 --- /dev/null +++ b/preprocessing/neighbors/coord_type.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="Constructing spatial neighborhood with custom parameters" +) + +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( + "--coord_type", default=None, choices=['grid', 'generic', None],help="Type of coordinate system.", required=False +) + +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) + +# Output files +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 + +## Custom parameters +coord_type = args.coord_type + + +if args.config is not None: + config_file = args.config + + +# ... 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, coord_type=coord_type) + +neighbors = adata.obsp["spatial_connectivities"].astype(int) +distance = adata.obsp["spatial_distances"].astype(int) + +## 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/coord_type.yml b/preprocessing/neighbors/coord_type.yml new file mode 100644 index 00000000..94ae843e --- /dev/null +++ b/preprocessing/neighbors/coord_type.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/delaunay_traingulation.yml b/preprocessing/neighbors/delaunay_traingulation.yml new file mode 100644 index 00000000..94ae843e --- /dev/null +++ b/preprocessing/neighbors/delaunay_traingulation.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/delaunay_triangulation.py b/preprocessing/neighbors/delaunay_triangulation.py new file mode 100644 index 00000000..3d3b79fd --- /dev/null +++ b/preprocessing/neighbors/delaunay_triangulation.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python + +# Author_and_contribution: Niklas Mueller-Boetticher; created script + +import argparse + +# TODO adjust description +parser = argparse.ArgumentParser( + description="Neighbor definition using Delaunay triangulation" +) + +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_file", help="Output file.", 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 + +neighbor_file = Path(args.out_file) +# if additional output files are required write it also to out_dir + +# Use these filepaths and inputs ... +coord_file = args.coordinates +matrix_file = args.matrix +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): + # 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, delaunay=True, coord_type="generic") +neighbors = adata.obsp["spatial_connectivities"].astype(int) + + +## Write output +import scipy as sp + +neighbor_file.parent.mkdir(parents=True, exist_ok=True) +sp.io.mmwrite(neighbor_file, neighbors) diff --git a/preprocessing/neighbors/n_neighs.py b/preprocessing/neighbors/n_neighs.py new file mode 100644 index 00000000..9f5414e3 --- /dev/null +++ b/preprocessing/neighbors/n_neighs.py @@ -0,0 +1,112 @@ +#!/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="Constructing spatial neighborhood with custom parameters" +) + +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( + "--coord_type", default=None, choices=['grid', 'generic', None],help="Type of coordinate system.", required=False +) + +parser.add_argument( + "--n_neighs", type=int, default=6,help="Number of neighboring tiles (grid data) or neighborhoods (non-grid data)", required=False +) + +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) + +# Output files +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 + +## Custom parameters +coord_type = args.coord_type +n_neighs= args.n_neighs + +if args.config is not None: + config_file = args.config + + +# ... 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, coord_type=coord_type, n_neighs=n_neighs) + +neighbors = adata.obsp["spatial_connectivities"].astype(int) +distance = adata.obsp["spatial_distances"].astype(int) + +## 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_neighs.yml b/preprocessing/neighbors/n_neighs.yml new file mode 100644 index 00000000..94ae843e --- /dev/null +++ b/preprocessing/neighbors/n_neighs.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.py b/preprocessing/neighbors/n_rings.py new file mode 100644 index 00000000..e30fc41d --- /dev/null +++ b/preprocessing/neighbors/n_rings.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python + +# Author_and_contribution: Niklas Mueller-Boetticher; created script, +# Author_and_contribution: Qirong Mao; implemented method + +### Only used when coord_type = 'grid' + + +import argparse + +# TODO adjust description +parser = argparse.ArgumentParser( + description="Constructing spatial neighborhood with custom parameters" +) + +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( + "--n_rings", type=int,default=1,help="Number of rings of neighbors for grid data. Only used when coord_type = 'grid'", required=False +) + +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) + +# Output files +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 + +## Custom parameters +n_rings = args.n_rings + +if args.config is not None: + config_file = args.config + + +# ... 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, coord_type="grid",n_rings=n_rings) + +neighbors = adata.obsp["spatial_connectivities"].astype(int) +distance = adata.obsp["spatial_distances"].astype(int) + +## 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.yml b/preprocessing/neighbors/n_rings.yml new file mode 100644 index 00000000..94ae843e --- /dev/null +++ b/preprocessing/neighbors/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.py b/preprocessing/neighbors/radius.py new file mode 100644 index 00000000..8ca6e921 --- /dev/null +++ b/preprocessing/neighbors/radius.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python + +# Author_and_contribution: Niklas Mueller-Boetticher; created script, +# Author_and_contribution: Qirong Mao; implemented method + +### Only used when coord_type = 'generic' + +import argparse + +# TODO adjust description +parser = argparse.ArgumentParser( + description="Constructing spatial neighborhood with custom parameters" +) + +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( + "-r", "--radius", default=None,help="Compute the graph based on neighborhood radius", required=False +) + +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) + +# Output files +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 + +## Custom parameters +radius = args.radius + + +if args.config is not None: + config_file = args.config + + +# ... 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, coord_type='generic',radius=radius) + +neighbors = adata.obsp["spatial_connectivities"].astype(int) +distance = adata.obsp["spatial_distances"].astype(int) + +## 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.yml b/preprocessing/neighbors/radius.yml new file mode 100644 index 00000000..94ae843e --- /dev/null +++ b/preprocessing/neighbors/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 From 3f68c3281c2da8ee48aa87b9a002dd00955f33d7 Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 10:54:15 +0100 Subject: [PATCH 03/21] Delete preprocessing/neighbors/neighborhood_construction.py --- .../neighbors/neighborhood_construction.py | 127 ------------------ 1 file changed, 127 deletions(-) delete mode 100755 preprocessing/neighbors/neighborhood_construction.py diff --git a/preprocessing/neighbors/neighborhood_construction.py b/preprocessing/neighbors/neighborhood_construction.py deleted file mode 100755 index 56937022..00000000 --- a/preprocessing/neighbors/neighborhood_construction.py +++ /dev/null @@ -1,127 +0,0 @@ -#!/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="Constructing spatial neighborhood with custom parameters" -) - -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( - "--coord_type", default=None, choices=['grid', 'generic', None],help="Type of coordinate system.", required=False -) - -parser.add_argument( - "--n_neighs", type=int, default=6,help="Number of neighboring tiles (grid data) or neighborhoods (non-grid data)", required=False -) - -parser.add_argument( - "-r", "--radius", default=None,help="Compute the graph based on neighborhood radius", required=False -) - -parser.add_argument( - "--delaunay", type=bool,default=False,help="Whether to compute the graph from Delaunay triangulation.", required=False -) - -parser.add_argument( - "--n_rings", type=int,default=1,help="Number of rings of neighbors for grid data. Only used when coord_type = 'grid'", required=False -) - -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) - -# Output files -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 - -## Custom parameters -coord_type = args.coord_type -n_neighs= args.n_neighs -radius = args.radius -delaunay = args.delaunay -n_rings = args.n_rings - -if args.config is not None: - config_file = args.config - - -# ... 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, coord_type=coord_type, n_neighs=n_neighs, radius=radius, delaunay=delaunay, n_rings=n_rings) - -neighbors = adata.obsp["spatial_connectivities"].astype(int) -distance = adata.obsp["spatial_distances"].astype(int) - -## 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) - From 3890170fe545a91e39654466df70a7dda9e1c62c Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 10:54:25 +0100 Subject: [PATCH 04/21] Delete preprocessing/neighbors/neighborhood_construction.yml --- preprocessing/neighbors/neighborhood_construction.yml | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 preprocessing/neighbors/neighborhood_construction.yml diff --git a/preprocessing/neighbors/neighborhood_construction.yml b/preprocessing/neighbors/neighborhood_construction.yml deleted file mode 100644 index 94ae843e..00000000 --- a/preprocessing/neighbors/neighborhood_construction.yml +++ /dev/null @@ -1,7 +0,0 @@ -channels: - - conda-forge -dependencies: - - python=3.9.18 - - pip - - pip: - - squidpy==1.3.1 \ No newline at end of file From 4130adfcb809be4915c653221aa0742832a61872 Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 10:57:24 +0100 Subject: [PATCH 05/21] Update delaunay_triangulation.py --- .../neighbors/delaunay_triangulation.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/preprocessing/neighbors/delaunay_triangulation.py b/preprocessing/neighbors/delaunay_triangulation.py index 3d3b79fd..db461928 100644 --- a/preprocessing/neighbors/delaunay_triangulation.py +++ b/preprocessing/neighbors/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,10 @@ # 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 @@ -77,11 +80,15 @@ 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(int) ## 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) + From 36367e92f3d8e6f3b0f5066e744fdcbc5f90006e Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 10:57:47 +0100 Subject: [PATCH 06/21] Update coord_type.py --- preprocessing/neighbors/coord_type.py | 1 - 1 file changed, 1 deletion(-) diff --git a/preprocessing/neighbors/coord_type.py b/preprocessing/neighbors/coord_type.py index fab191f7..4414bb48 100644 --- a/preprocessing/neighbors/coord_type.py +++ b/preprocessing/neighbors/coord_type.py @@ -45,7 +45,6 @@ out_dir = Path(args.out_dir) -# Output files spatial_connectivities_file = out_dir / "spatial_connectivities.mtx" spatial_distances_file = out_dir / "spatial_distances.mtx" From 6e77564c090c011f7a05519cb5559080359b1fe6 Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 10:58:03 +0100 Subject: [PATCH 07/21] Update n_neighs.py --- preprocessing/neighbors/n_neighs.py | 1 - 1 file changed, 1 deletion(-) diff --git a/preprocessing/neighbors/n_neighs.py b/preprocessing/neighbors/n_neighs.py index 9f5414e3..22df15f6 100644 --- a/preprocessing/neighbors/n_neighs.py +++ b/preprocessing/neighbors/n_neighs.py @@ -49,7 +49,6 @@ out_dir = Path(args.out_dir) -# Output files spatial_connectivities_file = out_dir / "spatial_connectivities.mtx" spatial_distances_file = out_dir / "spatial_distances.mtx" From d30d4ac0a87268d01596a808c621f95bd7be8e3d Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 10:58:20 +0100 Subject: [PATCH 08/21] Update n_rings.py --- preprocessing/neighbors/n_rings.py | 1 - 1 file changed, 1 deletion(-) diff --git a/preprocessing/neighbors/n_rings.py b/preprocessing/neighbors/n_rings.py index e30fc41d..41cd2761 100644 --- a/preprocessing/neighbors/n_rings.py +++ b/preprocessing/neighbors/n_rings.py @@ -49,7 +49,6 @@ out_dir = Path(args.out_dir) -# Output files spatial_connectivities_file = out_dir / "spatial_connectivities.mtx" spatial_distances_file = out_dir / "spatial_distances.mtx" From ee5533fbce4962baede1dc581e85bd8302742a21 Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 10:58:33 +0100 Subject: [PATCH 09/21] Update radius.py --- preprocessing/neighbors/radius.py | 1 - 1 file changed, 1 deletion(-) diff --git a/preprocessing/neighbors/radius.py b/preprocessing/neighbors/radius.py index 8ca6e921..88dcf5f8 100644 --- a/preprocessing/neighbors/radius.py +++ b/preprocessing/neighbors/radius.py @@ -47,7 +47,6 @@ out_dir = Path(args.out_dir) -# Output files spatial_connectivities_file = out_dir / "spatial_connectivities.mtx" spatial_distances_file = out_dir / "spatial_distances.mtx" From 235a298a022c16c0281ff135a21b6ac4a648986f Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 15:43:40 +0100 Subject: [PATCH 10/21] Update and rename n_neighs.py to n_neighbourhood.py --- .../{n_neighs.py => n_neighbourhood.py} | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) rename preprocessing/neighbors/{n_neighs.py => n_neighbourhood.py} (78%) diff --git a/preprocessing/neighbors/n_neighs.py b/preprocessing/neighbors/n_neighbourhood.py similarity index 78% rename from preprocessing/neighbors/n_neighs.py rename to preprocessing/neighbors/n_neighbourhood.py index 22df15f6..2f472f3d 100644 --- a/preprocessing/neighbors/n_neighs.py +++ b/preprocessing/neighbors/n_neighbourhood.py @@ -26,14 +26,6 @@ "-o", "--observations", help="Path to observations (as tsv).", required=True ) -parser.add_argument( - "--coord_type", default=None, choices=['grid', 'generic', None],help="Type of coordinate system.", required=False -) - -parser.add_argument( - "--n_neighs", type=int, default=6,help="Number of neighboring tiles (grid data) or neighborhoods (non-grid data)", required=False -) - parser.add_argument("-d", "--out_dir", help="Output directory.", required=True) parser.add_argument( @@ -50,7 +42,6 @@ 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 @@ -58,13 +49,18 @@ feature_file = args.features observation_file = args.observations -## Custom parameters -coord_type = args.coord_type -n_neighs= args.n_neighs +## Loading parameters 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"] +f.close() # ... or AnnData if you want def get_anndata(args): @@ -96,10 +92,9 @@ def get_anndata(args): ## Your code goes here import squidpy as sq -sq.gr.spatial_neighbors(adata, coord_type=coord_type, n_neighs=n_neighs) +sq.gr.spatial_neighbors(adata, coord_type="generic", n_neighs=n_neighs) neighbors = adata.obsp["spatial_connectivities"].astype(int) -distance = adata.obsp["spatial_distances"].astype(int) ## Write output import scipy as sp @@ -107,5 +102,4 @@ def get_anndata(args): out_dir.mkdir(parents=True, exist_ok=True) sp.io.mmwrite(spatial_connectivities_file, neighbors) -sp.io.mmwrite(spatial_distances_file, distance) From ea486da918d70953e259ee35d13c87d3cf78671c Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 15:57:16 +0100 Subject: [PATCH 11/21] Update delaunay_triangulation.py --- preprocessing/neighbors/delaunay_triangulation.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/preprocessing/neighbors/delaunay_triangulation.py b/preprocessing/neighbors/delaunay_triangulation.py index db461928..b7df0d56 100644 --- a/preprocessing/neighbors/delaunay_triangulation.py +++ b/preprocessing/neighbors/delaunay_triangulation.py @@ -37,7 +37,6 @@ 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 @@ -45,9 +44,17 @@ feature_file = args.features observation_file = args.observations +## Loading 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) + +delaunay = parameters["delaunay"] +f.close() # ... or AnnData if you want def get_anndata(args): @@ -79,10 +86,9 @@ def get_anndata(args): ## Your code goes here import squidpy as sq -sq.gr.spatial_neighbors(adata, delaunay=True, coord_type="generic") +sq.gr.spatial_neighbors(adata, delaunay=delaunay, coord_type="generic") neighbors = adata.obsp["spatial_connectivities"].astype(int) -distance = adata.obsp["spatial_distances"].astype(int) ## Write output import scipy as sp @@ -90,5 +96,4 @@ def get_anndata(args): out_dir.mkdir(parents=True, exist_ok=True) sp.io.mmwrite(spatial_connectivities_file, neighbors) -sp.io.mmwrite(spatial_distances_file, distance) From 0625fdbc44b240eb12a99d53f720650cbf7af33a Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 15:58:20 +0100 Subject: [PATCH 12/21] Delete preprocessing/neighbors/coord_type.py --- preprocessing/neighbors/coord_type.py | 107 -------------------------- 1 file changed, 107 deletions(-) delete mode 100644 preprocessing/neighbors/coord_type.py diff --git a/preprocessing/neighbors/coord_type.py b/preprocessing/neighbors/coord_type.py deleted file mode 100644 index 4414bb48..00000000 --- a/preprocessing/neighbors/coord_type.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/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="Constructing spatial neighborhood with custom parameters" -) - -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( - "--coord_type", default=None, choices=['grid', 'generic', None],help="Type of coordinate system.", required=False -) - -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 - -## Custom parameters -coord_type = args.coord_type - - -if args.config is not None: - config_file = args.config - - -# ... 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, coord_type=coord_type) - -neighbors = adata.obsp["spatial_connectivities"].astype(int) -distance = adata.obsp["spatial_distances"].astype(int) - -## 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) - From d87dcf76d7ac8c296a7d1a0103c550f118b1b93b Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 15:58:36 +0100 Subject: [PATCH 13/21] Delete preprocessing/neighbors/coord_type.yml --- preprocessing/neighbors/coord_type.yml | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 preprocessing/neighbors/coord_type.yml diff --git a/preprocessing/neighbors/coord_type.yml b/preprocessing/neighbors/coord_type.yml deleted file mode 100644 index 94ae843e..00000000 --- a/preprocessing/neighbors/coord_type.yml +++ /dev/null @@ -1,7 +0,0 @@ -channels: - - conda-forge -dependencies: - - python=3.9.18 - - pip - - pip: - - squidpy==1.3.1 \ No newline at end of file From e76411acdafcca1c2b9ee3f8929bc63f73b11434 Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 16:02:25 +0100 Subject: [PATCH 14/21] Update n_neighbourhood.py --- preprocessing/neighbors/n_neighbourhood.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/preprocessing/neighbors/n_neighbourhood.py b/preprocessing/neighbors/n_neighbourhood.py index 2f472f3d..40a663d9 100644 --- a/preprocessing/neighbors/n_neighbourhood.py +++ b/preprocessing/neighbors/n_neighbourhood.py @@ -7,7 +7,7 @@ # TODO adjust description parser = argparse.ArgumentParser( - description="Constructing spatial neighborhood with custom parameters" + description="Neighbor definition based on numbers of neibourhood (only for generic coordinates)" ) parser.add_argument( @@ -49,7 +49,7 @@ feature_file = args.features observation_file = args.observations -## Loading parameters from config file +## Loading n_neighs parameter from config_file if args.config is not None: config_file = args.config @@ -92,7 +92,7 @@ def get_anndata(args): ## Your code goes here import squidpy as sq -sq.gr.spatial_neighbors(adata, coord_type="generic", n_neighs=n_neighs) +sq.gr.spatial_neighbors(adata, n_neighs=n_neighs, coord_type="generic") neighbors = adata.obsp["spatial_connectivities"].astype(int) From f8e317bb8baad3b557288c7a9656c3eb0262e190 Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 16:02:29 +0100 Subject: [PATCH 15/21] Update delaunay_triangulation.py --- preprocessing/neighbors/delaunay_triangulation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preprocessing/neighbors/delaunay_triangulation.py b/preprocessing/neighbors/delaunay_triangulation.py index b7df0d56..c549774b 100644 --- a/preprocessing/neighbors/delaunay_triangulation.py +++ b/preprocessing/neighbors/delaunay_triangulation.py @@ -44,7 +44,7 @@ feature_file = args.features observation_file = args.observations -## Loading parameters from config_file +## Loading delaunay parameters from config_file if args.config is not None: config_file = args.config From db8597d702ed04c933c7cfebe08e5356173f2388 Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 16:06:49 +0100 Subject: [PATCH 16/21] Update n_rings.py --- preprocessing/neighbors/n_rings.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/preprocessing/neighbors/n_rings.py b/preprocessing/neighbors/n_rings.py index 41cd2761..03938a13 100644 --- a/preprocessing/neighbors/n_rings.py +++ b/preprocessing/neighbors/n_rings.py @@ -3,14 +3,12 @@ # Author_and_contribution: Niklas Mueller-Boetticher; created script, # Author_and_contribution: Qirong Mao; implemented method -### Only used when coord_type = 'grid' - import argparse # TODO adjust description parser = argparse.ArgumentParser( - description="Constructing spatial neighborhood with custom parameters" + description="Neighbor definition based on number of rings of neighbors (only for grid coordinates)" ) parser.add_argument( @@ -29,11 +27,6 @@ "-o", "--observations", help="Path to observations (as tsv).", required=True ) - -parser.add_argument( - "--n_rings", type=int,default=1,help="Number of rings of neighbors for grid data. Only used when coord_type = 'grid'", required=False -) - parser.add_argument("-d", "--out_dir", help="Output directory.", required=True) parser.add_argument( @@ -50,7 +43,6 @@ 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 @@ -58,12 +50,19 @@ feature_file = args.features observation_file = args.observations -## Custom parameters -n_rings = args.n_rings +## 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"] +f.close() + # ... or AnnData if you want def get_anndata(args): @@ -95,10 +94,9 @@ def get_anndata(args): ## Your code goes here import squidpy as sq -sq.gr.spatial_neighbors(adata, coord_type="grid",n_rings=n_rings) +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(int) ## Write output import scipy as sp @@ -106,5 +104,4 @@ def get_anndata(args): out_dir.mkdir(parents=True, exist_ok=True) sp.io.mmwrite(spatial_connectivities_file, neighbors) -sp.io.mmwrite(spatial_distances_file, distance) From fb659d75db12dcf2979361912fe9a98e745caf69 Mon Sep 17 00:00:00 2001 From: Qirong Mao <57286623+Qirongmao97@users.noreply.github.com> Date: Thu, 14 Dec 2023 16:09:17 +0100 Subject: [PATCH 17/21] Update radius.py --- preprocessing/neighbors/radius.py | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/preprocessing/neighbors/radius.py b/preprocessing/neighbors/radius.py index 88dcf5f8..ff983ca3 100644 --- a/preprocessing/neighbors/radius.py +++ b/preprocessing/neighbors/radius.py @@ -3,13 +3,11 @@ # Author_and_contribution: Niklas Mueller-Boetticher; created script, # Author_and_contribution: Qirong Mao; implemented method -### Only used when coord_type = 'generic' - import argparse # TODO adjust description parser = argparse.ArgumentParser( - description="Constructing spatial neighborhood with custom parameters" + description="Neighbor definition based on the radius (only for generic coordinates)" ) parser.add_argument( @@ -28,10 +26,6 @@ "-o", "--observations", help="Path to observations (as tsv).", required=True ) -parser.add_argument( - "-r", "--radius", default=None,help="Compute the graph based on neighborhood radius", required=False -) - parser.add_argument("-d", "--out_dir", help="Output directory.", required=True) parser.add_argument( @@ -48,7 +42,6 @@ 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 @@ -56,13 +49,18 @@ feature_file = args.features observation_file = args.observations -## Custom parameters -radius = args.radius - - +## 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"] +f.close() + # ... or AnnData if you want def get_anndata(args): @@ -94,10 +92,9 @@ def get_anndata(args): ## Your code goes here import squidpy as sq -sq.gr.spatial_neighbors(adata, coord_type='generic',radius=radius) +sq.gr.spatial_neighbors(adata, radius=radius, coord_type='generic') neighbors = adata.obsp["spatial_connectivities"].astype(int) -distance = adata.obsp["spatial_distances"].astype(int) ## Write output import scipy as sp @@ -105,5 +102,4 @@ def get_anndata(args): out_dir.mkdir(parents=True, exist_ok=True) sp.io.mmwrite(spatial_connectivities_file, neighbors) -sp.io.mmwrite(spatial_distances_file, distance) From 6c551de5ded0d44ea74785b1d4cb4c89ef07dc75 Mon Sep 17 00:00:00 2001 From: Qirong Mao Date: Thu, 14 Dec 2023 15:45:00 +0000 Subject: [PATCH 18/21] Committing changes based on the comments --- preprocessing/neighbors/config.json | 6 ++++++ preprocessing/neighbors/delaunay_triangulation.py | 2 +- preprocessing/neighbors/n_neighbourhood.py | 1 - .../neighbors/{n_neighs.yml => n_neighbourhood.yml} | 0 preprocessing/neighbors/n_rings.py | 1 - preprocessing/neighbors/radius.py | 1 - 6 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 preprocessing/neighbors/config.json rename preprocessing/neighbors/{n_neighs.yml => n_neighbourhood.yml} (100%) diff --git a/preprocessing/neighbors/config.json b/preprocessing/neighbors/config.json new file mode 100644 index 00000000..bc2baa38 --- /dev/null +++ b/preprocessing/neighbors/config.json @@ -0,0 +1,6 @@ +{ + "n_neighs":6, + "radius":1, + "delaunay":false, + "n_rings":1 +} \ No newline at end of file diff --git a/preprocessing/neighbors/delaunay_triangulation.py b/preprocessing/neighbors/delaunay_triangulation.py index c549774b..1fea4c2b 100644 --- a/preprocessing/neighbors/delaunay_triangulation.py +++ b/preprocessing/neighbors/delaunay_triangulation.py @@ -54,7 +54,7 @@ parameters = json.load(f) delaunay = parameters["delaunay"] -f.close() + # ... or AnnData if you want def get_anndata(args): diff --git a/preprocessing/neighbors/n_neighbourhood.py b/preprocessing/neighbors/n_neighbourhood.py index 40a663d9..8cf4fe53 100644 --- a/preprocessing/neighbors/n_neighbourhood.py +++ b/preprocessing/neighbors/n_neighbourhood.py @@ -60,7 +60,6 @@ parameters = json.load(f) n_neighs = data["n_neighs"] -f.close() # ... or AnnData if you want def get_anndata(args): diff --git a/preprocessing/neighbors/n_neighs.yml b/preprocessing/neighbors/n_neighbourhood.yml similarity index 100% rename from preprocessing/neighbors/n_neighs.yml rename to preprocessing/neighbors/n_neighbourhood.yml diff --git a/preprocessing/neighbors/n_rings.py b/preprocessing/neighbors/n_rings.py index 03938a13..5d401242 100644 --- a/preprocessing/neighbors/n_rings.py +++ b/preprocessing/neighbors/n_rings.py @@ -61,7 +61,6 @@ parameters = json.load(f) n_rings = parameters["n_rings"] -f.close() # ... or AnnData if you want diff --git a/preprocessing/neighbors/radius.py b/preprocessing/neighbors/radius.py index ff983ca3..d638cd16 100644 --- a/preprocessing/neighbors/radius.py +++ b/preprocessing/neighbors/radius.py @@ -59,7 +59,6 @@ parameters = json.load(f) radius = parameters["radius"] -f.close() # ... or AnnData if you want From 94528f35f5af1303e009325de85927c5a426b9a3 Mon Sep 17 00:00:00 2001 From: Qirong Mao Date: Fri, 15 Dec 2023 09:13:25 +0000 Subject: [PATCH 19/21] Putting each function to subdirectory --- preprocessing/neighbors/config.json | 6 ------ .../neighbors/delaunay_traingulation/config/config_1.json | 3 +++ .../{ => delaunay_traingulation}/delaunay_traingulation.yml | 0 .../{ => delaunay_traingulation}/delaunay_triangulation.py | 5 ++++- .../neighbors/n_neighbourhood/config/config_1.json | 3 +++ .../neighbors/{ => n_neighbourhood}/n_neighbourhood.py | 4 +++- .../neighbors/{ => n_neighbourhood}/n_neighbourhood.yml | 0 preprocessing/neighbors/n_rings/config/config_1.json | 3 +++ preprocessing/neighbors/{ => n_rings}/n_rings.py | 4 +++- preprocessing/neighbors/{ => n_rings}/n_rings.yml | 0 preprocessing/neighbors/radius/config/config_1.json | 3 +++ preprocessing/neighbors/{ => radius}/radius.py | 4 +++- preprocessing/neighbors/{ => radius}/radius.yml | 0 13 files changed, 25 insertions(+), 10 deletions(-) delete mode 100644 preprocessing/neighbors/config.json create mode 100644 preprocessing/neighbors/delaunay_traingulation/config/config_1.json rename preprocessing/neighbors/{ => delaunay_traingulation}/delaunay_traingulation.yml (100%) rename preprocessing/neighbors/{ => delaunay_traingulation}/delaunay_triangulation.py (93%) create mode 100644 preprocessing/neighbors/n_neighbourhood/config/config_1.json rename preprocessing/neighbors/{ => n_neighbourhood}/n_neighbourhood.py (93%) rename preprocessing/neighbors/{ => n_neighbourhood}/n_neighbourhood.yml (100%) create mode 100644 preprocessing/neighbors/n_rings/config/config_1.json rename preprocessing/neighbors/{ => n_rings}/n_rings.py (93%) rename preprocessing/neighbors/{ => n_rings}/n_rings.yml (100%) create mode 100644 preprocessing/neighbors/radius/config/config_1.json rename preprocessing/neighbors/{ => radius}/radius.py (93%) rename preprocessing/neighbors/{ => radius}/radius.yml (100%) diff --git a/preprocessing/neighbors/config.json b/preprocessing/neighbors/config.json deleted file mode 100644 index bc2baa38..00000000 --- a/preprocessing/neighbors/config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "n_neighs":6, - "radius":1, - "delaunay":false, - "n_rings":1 -} \ No newline at end of file diff --git a/preprocessing/neighbors/delaunay_traingulation/config/config_1.json b/preprocessing/neighbors/delaunay_traingulation/config/config_1.json new file mode 100644 index 00000000..7a517420 --- /dev/null +++ b/preprocessing/neighbors/delaunay_traingulation/config/config_1.json @@ -0,0 +1,3 @@ +{ + "delaunay":false +} \ No newline at end of file diff --git a/preprocessing/neighbors/delaunay_traingulation.yml b/preprocessing/neighbors/delaunay_traingulation/delaunay_traingulation.yml similarity index 100% rename from preprocessing/neighbors/delaunay_traingulation.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 similarity index 93% rename from preprocessing/neighbors/delaunay_triangulation.py rename to preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py index 1fea4c2b..f2814c0b 100644 --- a/preprocessing/neighbors/delaunay_triangulation.py +++ b/preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py @@ -37,6 +37,8 @@ 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 @@ -89,6 +91,7 @@ def get_anndata(args): sq.gr.spatial_neighbors(adata, delaunay=delaunay, coord_type="generic") neighbors = adata.obsp["spatial_connectivities"].astype(int) +##distance = adata.obsp["spatial_distances"].astype(float) ## Write output import scipy as sp @@ -96,4 +99,4 @@ def get_anndata(args): 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.py b/preprocessing/neighbors/n_neighbourhood/n_neighbourhood.py similarity index 93% rename from preprocessing/neighbors/n_neighbourhood.py rename to preprocessing/neighbors/n_neighbourhood/n_neighbourhood.py index 8cf4fe53..68d1b286 100644 --- a/preprocessing/neighbors/n_neighbourhood.py +++ b/preprocessing/neighbors/n_neighbourhood/n_neighbourhood.py @@ -42,6 +42,7 @@ 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 @@ -94,6 +95,7 @@ def get_anndata(args): 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 @@ -101,4 +103,4 @@ def get_anndata(args): 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.yml b/preprocessing/neighbors/n_neighbourhood/n_neighbourhood.yml similarity index 100% rename from preprocessing/neighbors/n_neighbourhood.yml rename to preprocessing/neighbors/n_neighbourhood/n_neighbourhood.yml 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.py b/preprocessing/neighbors/n_rings/n_rings.py similarity index 93% rename from preprocessing/neighbors/n_rings.py rename to preprocessing/neighbors/n_rings/n_rings.py index 5d401242..273f4102 100644 --- a/preprocessing/neighbors/n_rings.py +++ b/preprocessing/neighbors/n_rings/n_rings.py @@ -43,6 +43,7 @@ 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 @@ -96,6 +97,7 @@ def get_anndata(args): 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 @@ -103,4 +105,4 @@ def get_anndata(args): 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.yml b/preprocessing/neighbors/n_rings/n_rings.yml similarity index 100% rename from preprocessing/neighbors/n_rings.yml rename to preprocessing/neighbors/n_rings/n_rings.yml 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.py b/preprocessing/neighbors/radius/radius.py similarity index 93% rename from preprocessing/neighbors/radius.py rename to preprocessing/neighbors/radius/radius.py index d638cd16..524f5b6b 100644 --- a/preprocessing/neighbors/radius.py +++ b/preprocessing/neighbors/radius/radius.py @@ -42,6 +42,7 @@ 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 @@ -94,6 +95,7 @@ def get_anndata(args): 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 @@ -101,4 +103,4 @@ def get_anndata(args): 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.yml b/preprocessing/neighbors/radius/radius.yml similarity index 100% rename from preprocessing/neighbors/radius.yml rename to preprocessing/neighbors/radius/radius.yml From 97c6bd201c4f138d6a8dde080fde660d29112254 Mon Sep 17 00:00:00 2001 From: Qirong Mao Date: Fri, 15 Dec 2023 09:21:49 +0000 Subject: [PATCH 20/21] Removing config file of Delaunay Traingulation --- .../neighbors/delaunay_traingulation/config/config_1.json | 3 --- .../neighbors/delaunay_traingulation/delaunay_triangulation.py | 3 +-- 2 files changed, 1 insertion(+), 5 deletions(-) delete mode 100644 preprocessing/neighbors/delaunay_traingulation/config/config_1.json diff --git a/preprocessing/neighbors/delaunay_traingulation/config/config_1.json b/preprocessing/neighbors/delaunay_traingulation/config/config_1.json deleted file mode 100644 index 7a517420..00000000 --- a/preprocessing/neighbors/delaunay_traingulation/config/config_1.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "delaunay":false -} \ No newline at end of file diff --git a/preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py b/preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py index f2814c0b..7997261f 100644 --- a/preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py +++ b/preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py @@ -55,7 +55,6 @@ with open(config_file) as f: parameters = json.load(f) -delaunay = parameters["delaunay"] # ... or AnnData if you want @@ -88,7 +87,7 @@ def get_anndata(args): ## Your code goes here import squidpy as sq -sq.gr.spatial_neighbors(adata, delaunay=delaunay, coord_type="generic") +sq.gr.spatial_neighbors(adata, delaunay=True, coord_type="generic") neighbors = adata.obsp["spatial_connectivities"].astype(int) ##distance = adata.obsp["spatial_distances"].astype(float) From dc59a5bb54db2bee077ba9d875893bfc69814dcf Mon Sep 17 00:00:00 2001 From: niklasmueboe <42138117+niklasmueboe@users.noreply.github.com> Date: Fri, 15 Dec 2023 10:23:27 +0100 Subject: [PATCH 21/21] remove config reading --- .../delaunay_traingulation/delaunay_triangulation.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py b/preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py index 7997261f..f7e2e59a 100644 --- a/preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py +++ b/preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py @@ -46,16 +46,6 @@ 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) - - # ... or AnnData if you want def get_anndata(args):