Skip to content

Commit f6e111a

Browse files
committed
add check for annotation group values
1 parent 9c9df5c commit f6e111a

File tree

2 files changed

+90
-30
lines changed

2 files changed

+90
-30
lines changed

ingest/de.py

Lines changed: 54 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,36 @@ def assess_annotation(annotation, metadata, extra_params):
7777
DifferentialExpression.dev_logger, DifferentialExpression.de_logger, msg
7878
)
7979
raise KeyError(msg)
80-
#FIXME check pairwise groups exist
81-
de_type = extra_params.get("de_type")
8280
elif annotation_info == "group":
83-
# DE annotations should be of TYPE group
84-
return None
81+
de_type = extra_params.get("de_type")
82+
group1 = extra_params.get("group1")
83+
group2 = extra_params.get("group2")
84+
if de_type == "pairwise":
85+
metadata.preprocess(False)
86+
values = metadata.file[annotation]['group'].unique()
87+
if group1 and group2:
88+
if group1 not in values or group2 not in values:
89+
msg = (
90+
f'Provided annotation value(s) group1, \"{group1}\", '
91+
f'or group2, \"{group2}\", not found in metadata file'
92+
)
93+
log_exception(
94+
DifferentialExpression.dev_logger, DifferentialExpression.de_logger, msg
95+
)
96+
raise ValueError(msg)
97+
else:
98+
msg = (
99+
f'Provided annotation value(s) group1, \"{group1}\", or '
100+
f'group2, \"{group2}\", were false-y'
101+
)
102+
log_exception(
103+
DifferentialExpression.dev_logger, DifferentialExpression.de_logger, msg
104+
)
105+
raise KeyError(msg)
106+
# de_type is "rest" by default, DE annotation TYPE expected to be group
107+
else:
108+
# assessment does not raise error
109+
return None
85110
else:
86111
msg = f"Error: \"{annotation}\" has unexpected type \"{annotation_info}\"."
87112
print(msg)
@@ -181,35 +206,34 @@ def subset_adata(adata, de_cells):
181206

182207
def execute_de(self):
183208
DifferentialExpression.de_logger.info(f'dev_info: Starting DE for {self.accession}')
184-
#FIXME
185-
# try:
209+
try:
186210
# only used in output filename, replacing non-alphanumeric with underscores
187211
# except '+' replaced with 'pos'
188-
self.cluster_name = DifferentialExpression.sanitize_string(
189-
self.kwargs["name"]
190-
)
191-
if self.matrix_file_type in ["dense", "mtx", "h5ad"]:
192-
DifferentialExpression.de_logger.info(f"preparing DE on {self.matrix_file_type} matrix")
193-
self.run_scanpy_de(
194-
self.cluster,
195-
self.metadata,
196-
self.matrix_file_path,
197-
self.matrix_file_type,
198-
self.annotation,
199-
self.cluster_name,
200-
self.kwargs,
201-
)
202-
else:
203-
msg = f"Submitted matrix_file_type should be \"dense\", \"mtx\" or \"h5ad\" not \"{self.matrix_file_type}\""
204-
print(msg)
205-
log_exception(
206-
DifferentialExpression.dev_logger,
207-
DifferentialExpression.de_logger,
208-
msg,
212+
self.cluster_name = DifferentialExpression.sanitize_string(
213+
self.kwargs["name"]
209214
)
210-
raise ValueError(msg)
211-
# except Exception as e:
212-
# print(str(e))
215+
if self.matrix_file_type in ["dense", "mtx", "h5ad"]:
216+
DifferentialExpression.de_logger.info(f"preparing DE on {self.matrix_file_type} matrix")
217+
self.run_scanpy_de(
218+
self.cluster,
219+
self.metadata,
220+
self.matrix_file_path,
221+
self.matrix_file_type,
222+
self.annotation,
223+
self.cluster_name,
224+
self.kwargs,
225+
)
226+
else:
227+
msg = f"Submitted matrix_file_type should be \"dense\", \"mtx\" or \"h5ad\" not \"{self.matrix_file_type}\""
228+
print(msg)
229+
log_exception(
230+
DifferentialExpression.dev_logger,
231+
DifferentialExpression.de_logger,
232+
msg,
233+
)
234+
raise ValueError(msg)
235+
except (TypeError, KeyError, ValueError) as e:
236+
raise ValueError(e)
213237
return
214238

215239

tests/test_de.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,42 @@ def test_de_process_pairwise(self):
519519
"expected one call to delocalize output files",
520520
)
521521

522+
test_config = {
523+
"de_type": "pairwise",
524+
"group1": ['NO SUCH GROUP VALUE'],
525+
"group2": "plasma cell",
526+
"test_annotation": test_annotation,
527+
"test_scope": "study",
528+
"test_method": "wilcoxon",
529+
"annot_path": "../tests/data/anndata/compliant_liver_h5ad_frag.metadata.tsv.gz",
530+
"study_accession": "SCPh5adde",
531+
"cluster_path": "../tests/data/anndata/compliant_liver_h5ad_frag.cluster.X_umap.tsv.gz",
532+
"cluster_name": "umap",
533+
"matrix_file": "../tests/data/anndata/compliant_liver.h5ad",
534+
"matrix_type": "h5ad",
535+
}
536+
537+
self.assertRaises(
538+
ValueError, run_de, **test_config)
539+
540+
test_config = {
541+
"de_type": "pairwise",
542+
"group1": [],
543+
"group2": "plasma cell",
544+
"test_annotation": test_annotation,
545+
"test_scope": "study",
546+
"test_method": "wilcoxon",
547+
"annot_path": "../tests/data/anndata/compliant_liver_h5ad_frag.metadata.tsv.gz",
548+
"study_accession": "SCPh5adde",
549+
"cluster_path": "../tests/data/anndata/compliant_liver_h5ad_frag.cluster.X_umap.tsv.gz",
550+
"cluster_name": "umap",
551+
"matrix_file": "../tests/data/anndata/compliant_liver.h5ad",
552+
"matrix_type": "h5ad",
553+
}
554+
# Original error is KeyError but all errors passed through assess_annotation become ValueErrors
555+
self.assertRaises(
556+
ValueError, run_de, **test_config)
557+
522558
# clean up DE outputs
523559
files = glob.glob(expected_output_match)
524560

0 commit comments

Comments
 (0)