From d739ba3d488c08f5b7d006fb705eee9bfda6baf1 Mon Sep 17 00:00:00 2001 From: Benjamin Blankenmeister Date: Wed, 2 Apr 2025 16:03:17 -0400 Subject: [PATCH 1/2] feat: improve parent/child s&r --- .../lib/misc/family_loading_failures.py | 9 +-------- v03_pipeline/lib/misc/pedigree.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/v03_pipeline/lib/misc/family_loading_failures.py b/v03_pipeline/lib/misc/family_loading_failures.py index f047e3f50..8eeb85b29 100644 --- a/v03_pipeline/lib/misc/family_loading_failures.py +++ b/v03_pipeline/lib/misc/family_loading_failures.py @@ -1,14 +1,11 @@ from collections import defaultdict import hail as hl -import numpy as np from v03_pipeline.lib.logger import get_logger from v03_pipeline.lib.misc.pedigree import Family, Relation, Sample from v03_pipeline.lib.model import Sex -RELATEDNESS_TOLERANCE = 0.2 - logger = get_logger(__name__) @@ -26,11 +23,7 @@ def passes_relatedness_check( (min(sample_id, other_id), max(sample_id, other_id)), ) if not coefficients or not any( - np.allclose( - coefficients, - relation.coefficients, - atol=RELATEDNESS_TOLERANCE, - ) + relation.coefficients_equal(coefficients) for relation in ( [expected_relation, additional_allowed_relation] if additional_allowed_relation diff --git a/v03_pipeline/lib/misc/pedigree.py b/v03_pipeline/lib/misc/pedigree.py index c65cd0917..4e9d1a606 100644 --- a/v03_pipeline/lib/misc/pedigree.py +++ b/v03_pipeline/lib/misc/pedigree.py @@ -3,9 +3,13 @@ from enum import Enum import hail as hl +import numpy as np from v03_pipeline.lib.model import Sex +DEFAULT_RELATEDNESS_TOLERANCE = 0.2 +PARENT_CHILD_RELATEDNESS_TOLERANCE = 0.4 + class Relation(Enum): PARENT_CHILD = 'parent_child' @@ -24,6 +28,19 @@ def coefficients(self): Relation.AUNT_NEPHEW: [0.5, 0.5, 0, 0.25], }[self] + def coefficients_equal(self, coefficients: list[float]) -> bool: + if self == Relation.PARENT_CHILD: + return coefficients[0] and np.allclose( + coefficients[1:], + self.coefficients[1:], + atol=DEFAULT_RELATEDNESS_TOLERANCE, + ) + return np.allclose( + coefficients, + self.coefficients, + atol=DEFAULT_RELATEDNESS_TOLERANCE, + ) + @dataclass class Sample: From f774f48d6f134514417a18cc195ba50c2bbae960 Mon Sep 17 00:00:00 2001 From: Benjamin Blankenmeister Date: Wed, 2 Apr 2025 16:07:11 -0400 Subject: [PATCH 2/2] Update pedigree.py --- v03_pipeline/lib/misc/pedigree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v03_pipeline/lib/misc/pedigree.py b/v03_pipeline/lib/misc/pedigree.py index 4e9d1a606..10ef0d233 100644 --- a/v03_pipeline/lib/misc/pedigree.py +++ b/v03_pipeline/lib/misc/pedigree.py @@ -30,7 +30,7 @@ def coefficients(self): def coefficients_equal(self, coefficients: list[float]) -> bool: if self == Relation.PARENT_CHILD: - return coefficients[0] and np.allclose( + return (coefficients[0] == self.coefficients[0]) and np.allclose( coefficients[1:], self.coefficients[1:], atol=DEFAULT_RELATEDNESS_TOLERANCE,