Skip to content

Commit 9f7bcfa

Browse files
committed
Merge branch 'master' into dependency
2 parents 785f91d + a5a1998 commit 9f7bcfa

23 files changed

+1412
-649
lines changed

.github/workflows/python-plain-run-test.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,10 @@ jobs:
4646
- name: Upload coverage to Codecov
4747
uses: Wandalen/wretry.action@v1
4848
with:
49-
action: codecov/codecov-action@v3
49+
action: codecov/codecov-action@v4
5050
with: |
5151
fail_ci_if_error: true
52+
token: ${{ secrets.CODECOV_TOKEN }}
5253
verbose: true
5354
attempt_limit: 5
5455
attempt_delay: 10000

dynamo/vectorfield/utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ def compute_curl(f_jac, X):
916916

917917
# ---------------------------------------------------------------------------------------------------
918918
# ranking related utilies
919-
def get_metric_gene_in_rank(mat: np.mat, genes: list, neg: bool = False) -> Tuple[np.ndarray, np.ndarray]:
919+
def get_metric_gene_in_rank(mat: np.asmatrix, genes: list, neg: bool = False) -> Tuple[np.ndarray, np.ndarray]:
920920
"""Calculate ranking of genes based on mean value of matrix.
921921
922922
Args:
@@ -936,7 +936,7 @@ def get_metric_gene_in_rank(mat: np.mat, genes: list, neg: bool = False) -> Tupl
936936

937937

938938
def get_metric_gene_in_rank_by_group(
939-
mat: np.mat, genes: list, groups: np.array, selected_group, neg: bool = False
939+
mat: np.asmatrix, genes: list, groups: np.array, selected_group, neg: bool = False
940940
) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
941941
"""Calculate ranking of genes based on mean value of matrix, grouped by selected group.
942942
@@ -993,7 +993,7 @@ def get_sorted_metric_genes_df(df: pd.DataFrame, genes: list, neg: bool = False)
993993
return sorted_metric, sorted_genes
994994

995995

996-
def rank_vector_calculus_metrics(mat: np.mat, genes: list, group, groups: list, uniq_group: list) -> Tuple:
996+
def rank_vector_calculus_metrics(mat: np.asmatrix, genes: list, group, groups: list, uniq_group: list) -> Tuple:
997997
"""Calculate ranking of genes based on vector calculus metric.
998998
999999
Args:

pytest.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
[pytest]
2-
python_files = *.py
32
testpaths = tests
43
xfail_strict = true

requirements.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
numpy>=1.20.0
1+
numpy>=1.20.0,<2.0.0
22
pandas>=1.3.5
33
scipy>=1.4.1
4-
scikit-learn>=0.19.1
4+
scikit-learn>=0.19.1,<1.5.0
55
anndata>=0.8.0
66
loompy>=3.0.5
7-
matplotlib>=3.5.3
7+
matplotlib>=3.5.3,<3.9.0
88
setuptools
99
numdifftools>=0.9.39
1010
umap-learn>=0.5.1

tests/conftest.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,24 @@ def mkdirs_wrapper(path: Union[str, Path], abort=True):
4242

4343
def gen_zebrafish_test_data():
4444
raw_adata = dyn.sample_data.zebrafish()
45-
adata = raw_adata[:, :5000].copy()
45+
adata = raw_adata[:300, :1000].copy()
4646
del raw_adata
4747

4848
preprocessor = dyn.pp.Preprocessor(cell_cycle_score_enable=True)
49-
preprocessor.config_monocle_recipe(adata, n_top_genes=100)
49+
preprocessor.config_monocle_recipe(adata, n_top_genes=40)
5050
preprocessor.filter_genes_by_outliers_kwargs["inplace"] = True
5151
preprocessor.select_genes_kwargs["keep_filtered"] = False
52+
preprocessor.pca_kwargs["n_pca_components"] = 5
5253
preprocessor.preprocess_adata_monocle(adata)
5354

55+
dyn.tl.dynamics(adata, model="stochastic")
56+
dyn.tl.reduceDimension(adata)
57+
dyn.tl.cell_velocities(adata)
58+
dyn.vf.VectorField(adata, basis="umap")
59+
60+
dyn.tl.cell_velocities(adata, basis="pca")
61+
dyn.vf.VectorField(adata, basis="pca")
62+
5463
TestUtils.mkdirs_wrapper(test_data_dir, abort=False)
5564
adata.write_h5ad(test_zebrafish_data_path)
5665

tests/test_clustering.py

Lines changed: 0 additions & 66 deletions
This file was deleted.

tests/test_config.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,3 @@ def test_config_change():
3636
import dynamo.configuration as imported_config
3737

3838
assert imported_config.DynamoAdataConfig.data_store_mode == "succinct"
39-
40-
41-
if __name__ == "__main__":
42-
test_config_change()

tests/test_data_io.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,3 @@ def alpha_minus_gamma_s(new, gamma, t, M_s):
111111

112112
dyn.vf.rank_jacobian_genes(adata, groups="leiden")
113113
adata.write_h5ad("debug11.h5ad")
114-
115-
116-
if __name__ == "__main__":
117-
# test_scEU_seq()
118-
# adata = utils.gen_or_read_zebrafish_data()
119-
# test_save_rank_info(adata)
120-
# test_save_adata()
121-
pass

tests/test_estimation.py

Lines changed: 0 additions & 27 deletions
This file was deleted.

tests/test_logger.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -111,17 +111,3 @@ def test_cell_cycle_score_logger_pancreatic_endocrinogenesis():
111111
# genes_to_exclude=["Sbspon", "Adgrb3", "Eif2s3y"],
112112
)
113113
dyn.pp.cell_cycle_scores(adata)
114-
115-
116-
if __name__ == "__main__":
117-
test_tqdm_style_loops()
118-
119-
test_logger_simple_output_1(LoggerManager.get_main_logger())
120-
test_logger_simple_progress_naive(LoggerManager.get_main_logger())
121-
test_logger_simple_progress_logger(LoggerManager.get_main_logger())
122-
test_logger_simple_progress_logger(LoggerManager.get_temp_timer_logger())
123-
124-
test_vectorField_logger()
125-
test_zebrafish_topography_tutorial_logger()
126-
test_cell_cycle_score_logger_pancreatic_endocrinogenesis()
127-
test_sparseVFC_logger()

tests/test_neighbors.py

Lines changed: 0 additions & 66 deletions
This file was deleted.

tests/test_pipeline.py

Lines changed: 96 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,99 @@
11
import dynamo as dyn
2-
2+
import pytest
33

44
def test_dynamcis(adata):
5-
adata.uns["pp"]["tkey"] = None
6-
dyn.tl.dynamics(adata, model="stochastic")
7-
dyn.tl.reduceDimension(adata)
8-
dyn.tl.cell_velocities(adata)
9-
dyn.vf.VectorField(adata, basis="umap", M=100)
5+
raw_adata = dyn.sample_data.zebrafish()
6+
adata = raw_adata[:300, :1000].copy()
7+
del raw_adata
8+
9+
preprocessor = dyn.pp.Preprocessor(cell_cycle_score_enable=True)
10+
preprocessor.config_monocle_recipe(adata, n_top_genes=100)
11+
preprocessor.filter_genes_by_outliers_kwargs["inplace"] = True
12+
preprocessor.select_genes_kwargs["keep_filtered"] = False
13+
preprocessor.preprocess_adata_monocle(adata)
14+
15+
dyn.tl.dynamics(adata, model="deterministic")
16+
17+
18+
@pytest.mark.skip(reason="extra dependency requests-cache not installed")
19+
def test_run_rpe1_tutorial():
20+
import numpy as np
21+
22+
raw_adata = dyn.sample_data.scEU_seq_rpe1()
23+
rpe1 = raw_adata[5000:, :500].copy()
24+
del raw_adata
25+
26+
# create rpe1 kinectics
27+
rpe1_kinetics = rpe1[rpe1.obs.exp_type == "Pulse", :]
28+
rpe1_kinetics.obs["time"] = rpe1_kinetics.obs["time"].astype(str)
29+
rpe1_kinetics.obs.loc[rpe1_kinetics.obs["time"] == "dmso", "time"] = -1
30+
rpe1_kinetics.obs["time"] = rpe1_kinetics.obs["time"].astype(float)
31+
rpe1_kinetics = rpe1_kinetics[rpe1_kinetics.obs.time != -1, :]
32+
33+
rpe1_kinetics.layers["new"], rpe1_kinetics.layers["total"] = (
34+
rpe1_kinetics.layers["ul"] + rpe1_kinetics.layers["sl"],
35+
rpe1_kinetics.layers["su"]
36+
+ rpe1_kinetics.layers["sl"]
37+
+ rpe1_kinetics.layers["uu"]
38+
+ rpe1_kinetics.layers["ul"],
39+
)
40+
41+
del rpe1_kinetics.layers["uu"], rpe1_kinetics.layers["ul"], rpe1_kinetics.layers["su"], rpe1_kinetics.layers["sl"]
42+
dyn.pl.basic_stats(rpe1_kinetics, save_show_or_return="return")
43+
rpe1_genes = ["UNG", "PCNA", "PLK1", "HPRT1"]
44+
45+
assert np.sum(rpe1_kinetics.var_names.isnull()) == 0
46+
47+
rpe1_kinetics.obs.time = rpe1_kinetics.obs.time.astype("float")
48+
rpe1_kinetics.obs.time = rpe1_kinetics.obs.time / 60
49+
rpe1_kinetics.obs.time.value_counts()
50+
# rpe1_kinetics = dyn.pp.recipe_monocle(rpe1_kinetics, n_top_genes=1000, total_layers=False, copy=True)
51+
dyn.pp.recipe_monocle(rpe1_kinetics, n_top_genes=100, total_layers=False)
52+
53+
dyn.tl.dynamics(rpe1_kinetics, model="deterministic", tkey="time", est_method="twostep", cores=16)
54+
dyn.tl.reduceDimension(rpe1_kinetics, reduction_method="umap")
55+
dyn.tl.cell_velocities(rpe1_kinetics, enforce=True, vkey="velocity_T", ekey="M_t")
56+
57+
rpe1_kinetics.obsm["X_RFP_GFP"] = rpe1_kinetics.obs.loc[
58+
:, ["RFP_log10_corrected", "GFP_log10_corrected"]
59+
].values.astype("float")
60+
rpe1_kinetics.layers["velocity_S"] = rpe1_kinetics.layers["velocity_T"].copy()
61+
dyn.tl.cell_velocities(rpe1_kinetics, enforce=True, vkey="velocity_S", ekey="M_t", basis="RFP_GFP")
62+
63+
rpe1_kinetics.obs.Cell_cycle_relativePos = rpe1_kinetics.obs.Cell_cycle_relativePos.astype(float)
64+
rpe1_kinetics.obs.Cell_cycle_possition = rpe1_kinetics.obs.Cell_cycle_possition.astype(float)
65+
66+
dyn.pl.streamline_plot(
67+
rpe1_kinetics,
68+
color=["Cell_cycle_possition", "Cell_cycle_relativePos"],
69+
basis="RFP_GFP",
70+
save_show_or_return="return",
71+
)
72+
dyn.pl.streamline_plot(rpe1_kinetics, color=["cell_cycle_phase"], basis="RFP_GFP", save_show_or_return="return")
73+
dyn.vf.VectorField(rpe1_kinetics, basis="RFP_GFP")
74+
progenitor = rpe1_kinetics.obs_names[rpe1_kinetics.obs.Cell_cycle_relativePos < 0.1]
75+
76+
np.random.seed(19491001)
77+
78+
from matplotlib import animation
79+
80+
info_genes = rpe1_kinetics.var_names[rpe1_kinetics.var.use_for_transition]
81+
dyn.pd.fate(
82+
rpe1_kinetics,
83+
basis="RFP_GFP",
84+
init_cells=progenitor,
85+
interpolation_num=100,
86+
direction="forward",
87+
inverse_transform=False,
88+
average=False,
89+
)
90+
91+
import matplotlib.pyplot as plt
92+
93+
fig, ax = plt.subplots()
94+
ax = dyn.pl.topography(
95+
rpe1_kinetics, basis="RFP_GFP", color="Cell_cycle_relativePos", ax=ax, save_show_or_return="return"
96+
)
97+
ax.set_aspect(0.8)
98+
99+
instance = dyn.mv.StreamFuncAnim(adata=rpe1_kinetics, basis="RFP_GFP", color="Cell_cycle_relativePos", ax=ax)

0 commit comments

Comments
 (0)