Skip to content

Commit 0975106

Browse files
committed
including usage of decoupler results from anndata directly
1 parent bf504dc commit 0975106

3 files changed

Lines changed: 76 additions & 21 deletions

File tree

src/intratalkerpy/tf/IntraTalker_analysis.py

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from statsmodels.stats.multitest import multipletests
99

1010
from .utils import validate_input_arguments, AverageExpression
11+
from .utils import load_tf_activities
1112
from .get_significant_TFs import get_significant_tfs
1213
from .generate_intracellular_network import generate_intracellular_network, generate_CrossTalkeR_input
1314
from .plot import plot_condition_tf_activities
@@ -60,27 +61,8 @@ def IntraTalker_analysis(anndataobject, tf_activities = None, arguments_list = N
6061
condition = anndataobject.obs[arguments_list["condition"]]
6162

6263
#load tf activities(csv input)
63-
if isinstance(tf_activities, str):
64-
if arguments_list["decoupler_matrix_format"] == None or arguments_list["decoupler_matrix_format"] == "Python":
65-
tf_activities = ad.io.read_csv(tf_activities)
66-
tf_activities.obs = anndataobject.obs.reindex(tf_activities.obs.index)
67-
tf_activities.obsm = anndataobject.obsm
68-
tf_activities.uns = anndataobject.uns
69-
70-
#if the R version of decoupler was used, the tf activity matrix needs to be transposed
71-
elif arguments_list["decoupler_matrix_format"] == "R":
72-
tf_activities = pd.read_csv(tf_activities, index_col=0)
73-
tf_activities = tf_activities.T
74-
tf_activities = ad.AnnData(tf_activities)
75-
tf_activities.obs = anndataobject.obs.reindex(tf_activities.obs.index)
76-
tf_activities.obsm = anndataobject.obsm
77-
tf_activities.uns = anndataobject.uns
78-
79-
80-
elif tf_activities is None:
81-
raise NameError("Please attach a csv file with the tf activity values. (For further clarification view the 'Decoupler' section of the vignette.)")
82-
83-
64+
tf_activities = load_tf_activities(anndataobject, tf_activities, arguments_list)
65+
8466
sc.pp.scale(tf_activities)
8567

8668
#sets the stage for decision if single condition or comparison analysis is done

src/intratalkerpy/tf/utils.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import anndata as ad
12
import pandas as pd
23
import numpy as np
34
import seaborn as sns
@@ -8,6 +9,52 @@
89
from .plot import plot_top_variable_tfs
910

1011

12+
def load_tf_activities(anndataobject, tf_activities, arguments_list):
13+
"""
14+
Load TF activity values from an explicit input or fall back to
15+
anndataobject.obsm['score_ulm'] when available.
16+
"""
17+
if isinstance(tf_activities, str):
18+
if arguments_list["decoupler_matrix_format"] == None or arguments_list["decoupler_matrix_format"] == "Python":
19+
tf_activities = ad.io.read_csv(tf_activities)
20+
tf_activities.obs = anndataobject.obs.reindex(tf_activities.obs.index)
21+
tf_activities.obsm = anndataobject.obsm
22+
tf_activities.uns = anndataobject.uns
23+
24+
#if the R version of decoupler was used, the tf activity matrix needs to be transposed
25+
elif arguments_list["decoupler_matrix_format"] == "R":
26+
tf_activities = pd.read_csv(tf_activities, index_col=0)
27+
tf_activities = tf_activities.T
28+
tf_activities = ad.AnnData(tf_activities)
29+
tf_activities.obs = anndataobject.obs.reindex(tf_activities.obs.index)
30+
tf_activities.obsm = anndataobject.obsm
31+
tf_activities.uns = anndataobject.uns
32+
33+
elif tf_activities is None:
34+
if "score_ulm" in anndataobject.obsm:
35+
score_ulm = anndataobject.obsm["score_ulm"]
36+
tf_activities = score_ulm
37+
if not isinstance(tf_activities, ad.AnnData):
38+
tf_activities = ad.AnnData(tf_activities)
39+
if hasattr(score_ulm, "index"):
40+
tf_activities.obs_names = score_ulm.index
41+
else:
42+
tf_activities.obs_names = anndataobject.obs_names
43+
44+
if hasattr(score_ulm, "columns"):
45+
tf_activities.var_names = score_ulm.columns
46+
47+
tf_activities.obs = anndataobject.obs.reindex(tf_activities.obs.index)
48+
tf_activities.obsm = anndataobject.obsm
49+
tf_activities.uns = anndataobject.uns
50+
else:
51+
raise NameError(
52+
"Please attach a csv file with the tf activity values. (For further clarification view the 'Decoupler' section of the vignette.)"
53+
)
54+
55+
return tf_activities
56+
57+
1158
def load_csv(filename):
1259
"""
1360
Description:

tests/test_package_smoke.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import csv
22
from importlib import resources
33

4+
import anndata as ad
5+
import pandas as pd
6+
47

58
def test_public_modules_import_and_expose_expected_api():
69
import intratalkerpy
@@ -22,6 +25,29 @@ def test_external_dependency_functions_are_callable():
2225
assert callable(colDeltaCorpartial)
2326

2427

28+
def test_score_ulm_is_used_when_tf_activities_is_missing():
29+
from intratalkerpy.tf.utils import load_tf_activities
30+
31+
anndataobject = ad.AnnData(
32+
X=pd.DataFrame([[1, 2], [3, 4]], index=["cell1", "cell2"], columns=["gene1", "gene2"])
33+
)
34+
anndataobject.obs["celltype"] = ["a", "b"]
35+
anndataobject.obs["condition"] = ["x", "y"]
36+
anndataobject.obsm["score_ulm"] = pd.DataFrame(
37+
[[0.1, 0.2], [0.3, 0.4]], index=anndataobject.obs_names, columns=["tf1", "tf2"]
38+
)
39+
40+
tf_activities = load_tf_activities(
41+
anndataobject,
42+
None,
43+
{"decoupler_matrix_format": None},
44+
)
45+
46+
assert isinstance(tf_activities, ad.AnnData)
47+
assert list(tf_activities.obs_names) == ["cell1", "cell2"]
48+
assert list(tf_activities.var_names) == ["tf1", "tf2"]
49+
50+
2551
def test_transcription_factor_reference_data_is_packaged():
2652
data_files = [
2753
"rtf_db_human.csv",

0 commit comments

Comments
 (0)