Skip to content

Commit

Permalink
Validate 10x coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
seallard committed Dec 12, 2023
1 parent 72b3f99 commit 71634c0
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 23 deletions.
24 changes: 14 additions & 10 deletions cg/meta/workflow/microsalt/quality_checker.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@
from cg.constants.constants import MicrosaltAppTags, MicrosaltQC
from cg.meta.workflow.microsalt.models import QualityMetrics, QualityResult, SampleMetrics
from cg.meta.workflow.microsalt.utils import (
is_valid_10x_coverage,
is_valid_average_coverage,
is_valid_duplication_rate,
is_valid_mapped_rate,
is_valid_mapping_rate,
is_valid_median_insert_size,
is_valid_total_reads,
is_valid_total_reads_for_control,
Expand Down Expand Up @@ -39,10 +40,11 @@ def quality_control(self, run_dir_path: Path, lims_project: str):

def quality_control_sample(self, sample_id: str, metrics: SampleMetrics) -> QualityResult:
valid_reads: bool = self.is_valid_total_reads(sample_id)
valid_mapped_rate: bool = self.is_valid_mapped_rate(metrics)
valid_duplication_rate: bool = self.is_valid_duplication_rate(metrics)
valid_median_insert_size: bool = self.is_valid_median_insert_size(metrics)
valid_average_coverage: bool = self.is_valid_average_coverage(metrics)
valid_mapping: bool = self.is_valid_mapped_rate(metrics)
valid_duplication: bool = self.is_valid_duplication_rate(metrics)
valid_inserts: bool = self.is_valid_median_insert_size(metrics)
valid_coverage: bool = self.is_valid_average_coverage(metrics)
valid_10x_coverage: bool = self.is_valid_10x_coverage(metrics)

def quality_control_case(self, sample_results: list[QualityResult]) -> bool:
pass
Expand Down Expand Up @@ -158,14 +160,12 @@ def is_valid_total_reads(self, sample_id: str) -> bool:
sample_reads: int = sample.reads

if sample.control == ControlEnum.negative:
return is_valid_total_reads_for_control(
sample_reads=sample_reads, target_reads=target_reads
)
return is_valid_total_reads(sample_reads=sample_reads, target_reads=target_reads)
return is_valid_total_reads_for_control(reads=sample_reads, target_reads=target_reads)
return is_valid_total_reads(reads=sample_reads, target_reads=target_reads)

def is_valid_mapped_rate(self, metrics: SampleMetrics) -> bool:
mapped_rate: float = metrics.microsalt_samtools_stats.mapped_rate
return is_valid_mapped_rate(mapped_rate)
return is_valid_mapping_rate(mapped_rate)

def is_valid_duplication_rate(self, metrics: SampleMetrics) -> bool:
duplication_rate: float = metrics.picard_markduplicate.duplication_rate
Expand All @@ -178,3 +178,7 @@ def is_valid_median_insert_size(self, metrics: SampleMetrics) -> bool:
def is_valid_average_coverage(self, metrics: SampleMetrics) -> bool:
average_coverage: float = metrics.microsalt_samtools_stats.average_coverage
return is_valid_average_coverage(average_coverage)

def is_valid_10x_coverage(self, metrics: SampleMetrics) -> bool:
coverage_10x: float = metrics.microsalt_samtools_stats.coverage_10x
return is_valid_10x_coverage(coverage_10x)
24 changes: 14 additions & 10 deletions cg/meta/workflow/microsalt/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,30 +5,34 @@
from cg.meta.workflow.microsalt.models import QualityMetrics


def is_valid_total_reads(sample_reads: int, target_reads: int) -> bool:
return sample_reads > target_reads * MicrosaltQC.TARGET_READS_FAIL_THRESHOLD
def is_valid_total_reads(reads: int, target_reads: int) -> bool:
return reads > target_reads * MicrosaltQC.TARGET_READS_FAIL_THRESHOLD


def is_valid_total_reads_for_control(sample_reads: int, target_reads: int) -> bool:
return sample_reads < target_reads * MicrosaltQC.NEGATIVE_CONTROL_READS_THRESHOLD
def is_valid_total_reads_for_control(reads: int, target_reads: int) -> bool:
return reads < target_reads * MicrosaltQC.NEGATIVE_CONTROL_READS_THRESHOLD


def is_valid_mapped_rate(sample_mapped_rate: float) -> bool:
return sample_mapped_rate > MicrosaltQC.MAPPED_RATE_THRESHOLD
def is_valid_mapping_rate(mapping_rate: float) -> bool:
return mapping_rate > MicrosaltQC.MAPPED_RATE_THRESHOLD


def is_valid_duplication_rate(sample_duplication_rate: float) -> bool:
return sample_duplication_rate < MicrosaltQC.DUPLICATION_RATE_THRESHOLD
def is_valid_duplication_rate(duplication_rate: float) -> bool:
return duplication_rate < MicrosaltQC.DUPLICATION_RATE_THRESHOLD


def is_valid_median_insert_size(sample_insert_size: int) -> bool:
return sample_insert_size > MicrosaltQC.INSERT_SIZE_THRESHOLD
def is_valid_median_insert_size(insert_size: int) -> bool:
return insert_size > MicrosaltQC.INSERT_SIZE_THRESHOLD


def is_valid_average_coverage(average_coverage: float) -> bool:
return average_coverage > MicrosaltQC.AVERAGE_COVERAGE_THRESHOLD


def is_valid_10x_coverage(coverage_10x: float) -> bool:
return coverage_10x > MicrosaltQC.COVERAGE_10X_THRESHOLD


def parse_quality_metrics(file_path: Path) -> QualityMetrics:
data = read_json(file_path)
return QualityMetrics.model_validate_json(data)
6 changes: 3 additions & 3 deletions tests/meta/workflow/microsalt/test_quality_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def test_sample_total_reads_passing():

# WHEN checking if the sample has sufficient reads
passes_reads_threshold = is_valid_total_reads(
sample_reads=sample_reads, target_reads=target_reads
reads=sample_reads, target_reads=target_reads
)

# THEN it passes
Expand All @@ -22,7 +22,7 @@ def test_sample_total_reads_failing():

# WHEN checking if the sample has sufficient reads
passes_reads_threshold = is_valid_total_reads(
sample_reads=sample_reads, target_reads=target_reads
reads=sample_reads, target_reads=target_reads
)

# THEN it fails
Expand All @@ -36,7 +36,7 @@ def test_sample_total_reads_failing_without_reads():

# WHEN checking if the sample has sufficient reads
passes_reads_threshold = is_valid_total_reads(
sample_reads=sample_reads, target_reads=target_reads
reads=sample_reads, target_reads=target_reads
)

# THEN it fails
Expand Down

0 comments on commit 71634c0

Please sign in to comment.