Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/cap_upload_validator/upload_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
MusMusculus,
MultiSpecies,
Organism,
UnsupportedOrganism,
str_to_organism,
ontology_id_to_organism,
)
Expand Down Expand Up @@ -352,6 +353,12 @@ def _check_var_index(self, cap_adata: CapAnnData) -> Optional[pd.Series]:
logger.debug(f"Organism(s) in dataset = {dataset_organisms}, known organisms = {known_organisms}")

missing_genes_mask = None
if UnsupportedOrganism in dataset_organisms:
organism = (UnsupportedOrganism if len(dataset_organisms) == 1 else MultiSpecies)
self._organism = organism
logger.debug("Unknown organism found, skipping only known-gene validation.")
return missing_genes_mask

Comment thread
siberianisaev marked this conversation as resolved.
Outdated
# Check ENSEMBL ids for supported organism
if len(dataset_organisms) == 1:
organism = dataset_organisms[0]
Expand All @@ -361,7 +368,7 @@ def _check_var_index(self, cap_adata: CapAnnData) -> Optional[pd.Series]:
logger.debug("Single known organism found, validating gene IDs.")
missing_genes_mask = self._validate_gene_ids(clean_index, organism)
else:
logger.debug("Unknown organism found, skipping gene validation.")
logger.debug("Organism has no known-gene validation rules, skipping that check.")
elif len(dataset_organisms) > 1:
logger.debug("There are multiple organisms in dataset")
self._organism = MultiSpecies
Expand Down
35 changes: 35 additions & 0 deletions test/test_upload_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
CSCMatrixInX,
AnnDataMultipleOntologyIDs,
AnnDataInvalidDiseaseOntologyForHuman,
AnnDataGeneIndexIsNotUnique,
)

TMP_DIR = Path(tempfile.mkdtemp())
Expand Down Expand Up @@ -189,6 +190,40 @@ def check_var_index():
assert False, f"Unpredicted error: {e}"


@pytest.mark.parametrize(
("var_names", "should_fail"),
[
(["ENSG000001.1", "ENSG000001.2"], True), # duplicate after removing version suffix
(["TP53", "TP53"], True), # duplicate gene symbol
(["unknown_gene_1", "unknown_gene_2"], False), # unique genes
],
)
@pytest.mark.parametrize(
"organisms",
[
"unsupported organism",
[HomoSapiens.name, "unsupported organism"], # mixed with unsupported organism
],
)
def test_var_requires_unique_genes_for_any_unsupported_organism(
var_names,
should_fail,
organisms,
):
adata = ad.AnnData(X=np.eye(len(var_names)))
adata.var_names = var_names
adata.obs[ORGANISM_COLUMN] = organisms

validator = UploadValidator(None)
validator._multi_exception.raise_on_append = True

if should_fail:
with pytest.raises(AnnDataGeneIndexIsNotUnique):
validator._check_var_index(adata)
else:
assert validator._check_var_index(adata) is None


@pytest.mark.parametrize("set_organism", [False, True, "ont"])
def test_validator(set_organism):
x = np.eye(10) + 0.1 # not a counts
Expand Down
Loading