Skip to content

Commit 8edfdd3

Browse files
authored
Merge pull request #126 from SpatialHackathon/preproc_neighbour_squidpy_qmao
Constructing spatial neighborhood with custom parameters
2 parents 45e0556 + dc59a5b commit 8edfdd3

11 files changed

Lines changed: 363 additions & 9 deletions

File tree

preprocessing/neighbors/delaunay_triangulation.yml renamed to preprocessing/neighbors/delaunay_traingulation/delaunay_traingulation.yml

File renamed without changes.

preprocessing/neighbors/delaunay_triangulation.py renamed to preprocessing/neighbors/delaunay_traingulation/delaunay_triangulation.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/usr/bin/env python
22

33
# Author_and_contribution: Niklas Mueller-Boetticher; created script
4+
# Author_and_contribution: Qirong Mao; modifying output file format
45

56
import argparse
67

@@ -21,7 +22,7 @@
2122
parser.add_argument(
2223
"-o", "--observations", help="Path to observations (as tsv).", required=True
2324
)
24-
parser.add_argument("-d", "--out_file", help="Output file.", required=True)
25+
parser.add_argument("-d", "--out_dir", help="Output directory.", required=True)
2526
parser.add_argument(
2627
"--config",
2728
help="Optional config file (json) used to pass additional parameters.",
@@ -33,18 +34,18 @@
3334
# Output files
3435
from pathlib import Path
3536

36-
neighbor_file = Path(args.out_file)
37-
# if additional output files are required write it also to out_dir
37+
out_dir = Path(args.out_dir)
38+
39+
spatial_connectivities_file = out_dir / "spatial_connectivities.mtx"
40+
##spatial_distances_file = out_dir / "spatial_distances.mtx"
41+
3842

3943
# Use these filepaths and inputs ...
4044
coord_file = args.coordinates
4145
matrix_file = args.matrix
4246
feature_file = args.features
4347
observation_file = args.observations
4448

45-
if args.config is not None:
46-
config_file = args.config
47-
4849

4950
# ... or AnnData if you want
5051
def get_anndata(args):
@@ -77,11 +78,14 @@ def get_anndata(args):
7778
import squidpy as sq
7879

7980
sq.gr.spatial_neighbors(adata, delaunay=True, coord_type="generic")
80-
neighbors = adata.obsp["spatial_connectivities"].astype(int)
8181

82+
neighbors = adata.obsp["spatial_connectivities"].astype(int)
83+
##distance = adata.obsp["spatial_distances"].astype(float)
8284

8385
## Write output
8486
import scipy as sp
8587

86-
neighbor_file.parent.mkdir(parents=True, exist_ok=True)
87-
sp.io.mmwrite(neighbor_file, neighbors)
88+
out_dir.mkdir(parents=True, exist_ok=True)
89+
90+
sp.io.mmwrite(spatial_connectivities_file, neighbors)
91+
##sp.io.mmwrite(spatial_distances_file, distance)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"n_neighs":6
3+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#!/usr/bin/env python
2+
3+
# Author_and_contribution: Niklas Mueller-Boetticher; created script,
4+
# Author_and_contribution: Qirong Mao; implemented method
5+
6+
import argparse
7+
8+
# TODO adjust description
9+
parser = argparse.ArgumentParser(
10+
description="Neighbor definition based on numbers of neibourhood (only for generic coordinates)"
11+
)
12+
13+
parser.add_argument(
14+
"-c", "--coordinates", help="Path to coordinates (as tsv).", required=True
15+
)
16+
17+
parser.add_argument(
18+
"-m", "--matrix", help="Path to (transformed) counts (as mtx).", required=True
19+
)
20+
21+
parser.add_argument(
22+
"-f", "--features", help="Path to features (as tsv).", required=True
23+
)
24+
25+
parser.add_argument(
26+
"-o", "--observations", help="Path to observations (as tsv).", required=True
27+
)
28+
29+
parser.add_argument("-d", "--out_dir", help="Output directory.", required=True)
30+
31+
parser.add_argument(
32+
"--config",
33+
help="Optional config file (json) used to pass additional parameters.",
34+
required=False,
35+
)
36+
37+
args = parser.parse_args()
38+
39+
# Output files
40+
from pathlib import Path
41+
42+
out_dir = Path(args.out_dir)
43+
44+
spatial_connectivities_file = out_dir / "spatial_connectivities.mtx"
45+
##spatial_distances_file = out_dir / "spatial_distances.mtx"
46+
47+
# Use these filepaths and inputs ...
48+
coord_file = args.coordinates
49+
matrix_file = args.matrix
50+
feature_file = args.features
51+
observation_file = args.observations
52+
53+
## Loading n_neighs parameter from config_file
54+
55+
if args.config is not None:
56+
config_file = args.config
57+
58+
import json
59+
60+
with open(config) as f:
61+
parameters = json.load(f)
62+
63+
n_neighs = data["n_neighs"]
64+
65+
# ... or AnnData if you want
66+
def get_anndata(args):
67+
# Untested template
68+
import anndata as ad
69+
import pandas as pd
70+
import scipy as sp
71+
72+
X = sp.io.mmread(args.matrix)
73+
if sp.sparse.issparse(X):
74+
X = X.tocsr()
75+
observations = pd.read_table(args.observations, index_col=0)
76+
features = pd.read_table(args.features, index_col=0)
77+
coordinates = (
78+
pd.read_table(args.coordinates, index_col=0)
79+
.loc[observations.index, :]
80+
.to_numpy()
81+
)
82+
83+
adata = ad.AnnData(
84+
X=X, obs=observations, var=features, obsm={"spatial": coordinates}
85+
)
86+
87+
return adata
88+
89+
90+
adata = get_anndata(args)
91+
92+
## Your code goes here
93+
import squidpy as sq
94+
95+
sq.gr.spatial_neighbors(adata, n_neighs=n_neighs, coord_type="generic")
96+
97+
neighbors = adata.obsp["spatial_connectivities"].astype(int)
98+
##distance = adata.obsp["spatial_distances"].astype(float)
99+
100+
## Write output
101+
import scipy as sp
102+
103+
out_dir.mkdir(parents=True, exist_ok=True)
104+
105+
sp.io.mmwrite(spatial_connectivities_file, neighbors)
106+
##sp.io.mmwrite(spatial_distances_file, distance)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
channels:
2+
- conda-forge
3+
dependencies:
4+
- python=3.9.18
5+
- pip
6+
- pip:
7+
- squidpy==1.3.1
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"n_rings":1
3+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
#!/usr/bin/env python
2+
3+
# Author_and_contribution: Niklas Mueller-Boetticher; created script,
4+
# Author_and_contribution: Qirong Mao; implemented method
5+
6+
7+
import argparse
8+
9+
# TODO adjust description
10+
parser = argparse.ArgumentParser(
11+
description="Neighbor definition based on number of rings of neighbors (only for grid coordinates)"
12+
)
13+
14+
parser.add_argument(
15+
"-c", "--coordinates", help="Path to coordinates (as tsv).", required=True
16+
)
17+
18+
parser.add_argument(
19+
"-m", "--matrix", help="Path to (transformed) counts (as mtx).", required=True
20+
)
21+
22+
parser.add_argument(
23+
"-f", "--features", help="Path to features (as tsv).", required=True
24+
)
25+
26+
parser.add_argument(
27+
"-o", "--observations", help="Path to observations (as tsv).", required=True
28+
)
29+
30+
parser.add_argument("-d", "--out_dir", help="Output directory.", required=True)
31+
32+
parser.add_argument(
33+
"--config",
34+
help="Optional config file (json) used to pass additional parameters.",
35+
required=False,
36+
)
37+
38+
args = parser.parse_args()
39+
40+
# Output files
41+
from pathlib import Path
42+
43+
out_dir = Path(args.out_dir)
44+
45+
spatial_connectivities_file = out_dir / "spatial_connectivities.mtx"
46+
##spatial_distances_file = out_dir / "spatial_distances.mtx"
47+
48+
# Use these filepaths and inputs ...
49+
coord_file = args.coordinates
50+
matrix_file = args.matrix
51+
feature_file = args.features
52+
observation_file = args.observations
53+
54+
55+
## Loading delaunay parameters from config_file
56+
if args.config is not None:
57+
config_file = args.config
58+
59+
import json
60+
61+
with open(config_file) as f:
62+
parameters = json.load(f)
63+
64+
n_rings = parameters["n_rings"]
65+
66+
67+
# ... or AnnData if you want
68+
def get_anndata(args):
69+
# Untested template
70+
import anndata as ad
71+
import pandas as pd
72+
import scipy as sp
73+
74+
X = sp.io.mmread(args.matrix)
75+
if sp.sparse.issparse(X):
76+
X = X.tocsr()
77+
observations = pd.read_table(args.observations, index_col=0)
78+
features = pd.read_table(args.features, index_col=0)
79+
coordinates = (
80+
pd.read_table(args.coordinates, index_col=0)
81+
.loc[observations.index, :]
82+
.to_numpy()
83+
)
84+
85+
adata = ad.AnnData(
86+
X=X, obs=observations, var=features, obsm={"spatial": coordinates}
87+
)
88+
89+
return adata
90+
91+
92+
adata = get_anndata(args)
93+
94+
## Your code goes here
95+
import squidpy as sq
96+
97+
sq.gr.spatial_neighbors(adata,n_rings=n_rings, coord_type="grid")
98+
99+
neighbors = adata.obsp["spatial_connectivities"].astype(int)
100+
##distance = adata.obsp["spatial_distances"].astype(float)
101+
102+
## Write output
103+
import scipy as sp
104+
105+
out_dir.mkdir(parents=True, exist_ok=True)
106+
107+
sp.io.mmwrite(spatial_connectivities_file, neighbors)
108+
##sp.io.mmwrite(spatial_distances_file, distance)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
channels:
2+
- conda-forge
3+
dependencies:
4+
- python=3.9.18
5+
- pip
6+
- pip:
7+
- squidpy==1.3.1
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"radius":1
3+
}

0 commit comments

Comments
 (0)