From 434ecdd9fc1a67302a9181fbc62d0244ea255568 Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 4 Sep 2024 12:27:22 +0200 Subject: [PATCH 01/11] initial commit --- cg/constants/nf_analysis.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cg/constants/nf_analysis.py b/cg/constants/nf_analysis.py index 031327f500..6ca5ddb7a9 100644 --- a/cg/constants/nf_analysis.py +++ b/cg/constants/nf_analysis.py @@ -22,6 +22,7 @@ class NfTowerStatus(StrEnum): "PCT_TARGET_BASES_10X": {"norm": "gt", "threshold": 0.95}, "PCT_EXC_ADAPTER": {"norm": "lt", "threshold": 0.0005}, "predicted_sex_sex_check": {"norm": "eq", "threshold": None}, + "parent_error_ped_check": {"norm": "eq", "threshold": False}, } RNAFUSION_METRIC_CONDITIONS: dict[str, dict[str, Any]] = { From cc7128eb876dfac8d76b900cc203a28702d5305b Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 4 Sep 2024 13:41:08 +0200 Subject: [PATCH 02/11] change cov to >25 and add pairwise search pattern --- cg/constants/nf_analysis.py | 2 +- cg/meta/workflow/nf_analysis.py | 6 +++++- .../raredisease_case_enough_reads_metrics_deliverables.yaml | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cg/constants/nf_analysis.py b/cg/constants/nf_analysis.py index 6ca5ddb7a9..c923a40f6f 100644 --- a/cg/constants/nf_analysis.py +++ b/cg/constants/nf_analysis.py @@ -18,7 +18,7 @@ class NfTowerStatus(StrEnum): RAREDISEASE_METRIC_CONDITIONS: dict[str, dict[str, Any]] = { "percent_duplicates": {"norm": "lt", "threshold": 20}, "PCT_PF_UQ_READS_ALIGNED": {"norm": "gt", "threshold": 0.95}, - "MEDIAN_TARGET_COVERAGE": {"norm": "gt", "threshold": 26}, + "MEDIAN_TARGET_COVERAGE": {"norm": "gt", "threshold": 25}, "PCT_TARGET_BASES_10X": {"norm": "gt", "threshold": 0.95}, "PCT_EXC_ADAPTER": {"norm": "lt", "threshold": 0.0005}, "predicted_sex_sex_check": {"norm": "eq", "threshold": None}, diff --git a/cg/meta/workflow/nf_analysis.py b/cg/meta/workflow/nf_analysis.py index a077333c75..aaa81c30fa 100644 --- a/cg/meta/workflow/nf_analysis.py +++ b/cg/meta/workflow/nf_analysis.py @@ -1,6 +1,7 @@ import logging from datetime import datetime from pathlib import Path +from itertools import combinations from typing import Any, Iterator from pydantic.v1 import ValidationError @@ -634,7 +635,10 @@ def get_multiqc_search_patterns(self, case_id: str) -> dict: Multiple search patterns can be added. Ideally patterns used should be sample ids, e.g. {sample_id_1: sample_id_1, sample_id_2: sample_id_2}.""" sample_ids: Iterator[str] = self.status_db.get_sample_ids_by_case_id(case_id=case_id) - search_patterns: dict[str, str] = {sample_id: sample_id for sample_id in sample_ids} + sample_patterns: dict[str, str] = {sample_id: sample_id for sample_id in sample_ids} + sample_ids_list = list(sample_ids) + pairwise_patterns: dict[str, str] = {f"{sample1}-{sample2}": f"{sample1}-{sample2}" for sample1, sample2 in combinations(sample_ids_list, 2)} + search_patterns = {**sample_patterns, **pairwise_patterns} return search_patterns @staticmethod diff --git a/tests/fixtures/analysis/raredisease/raredisease_case_enough_reads_metrics_deliverables.yaml b/tests/fixtures/analysis/raredisease/raredisease_case_enough_reads_metrics_deliverables.yaml index a10d494c06..20d9ca8d62 100644 --- a/tests/fixtures/analysis/raredisease/raredisease_case_enough_reads_metrics_deliverables.yaml +++ b/tests/fixtures/analysis/raredisease/raredisease_case_enough_reads_metrics_deliverables.yaml @@ -286,7 +286,7 @@ metrics: value: 24.546493 - condition: norm: gt - threshold: 26.0 + threshold: 25.0 header: null id: ADM1 input: multiqc_data.json From 5e36cacb61b2dae2b7421c1b483c41f6eb14e57e Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 4 Sep 2024 13:43:14 +0200 Subject: [PATCH 03/11] run black --- cg/meta/workflow/nf_analysis.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cg/meta/workflow/nf_analysis.py b/cg/meta/workflow/nf_analysis.py index aaa81c30fa..6111e2cf30 100644 --- a/cg/meta/workflow/nf_analysis.py +++ b/cg/meta/workflow/nf_analysis.py @@ -637,7 +637,10 @@ def get_multiqc_search_patterns(self, case_id: str) -> dict: sample_ids: Iterator[str] = self.status_db.get_sample_ids_by_case_id(case_id=case_id) sample_patterns: dict[str, str] = {sample_id: sample_id for sample_id in sample_ids} sample_ids_list = list(sample_ids) - pairwise_patterns: dict[str, str] = {f"{sample1}-{sample2}": f"{sample1}-{sample2}" for sample1, sample2 in combinations(sample_ids_list, 2)} + pairwise_patterns: dict[str, str] = { + f"{sample1}-{sample2}": f"{sample1}-{sample2}" + for sample1, sample2 in combinations(sample_ids_list, 2) + } search_patterns = {**sample_patterns, **pairwise_patterns} return search_patterns From bb4af84abb88d9109b79f039653434b95762db28 Mon Sep 17 00:00:00 2001 From: peterpru Date: Fri, 6 Sep 2024 08:39:02 +0200 Subject: [PATCH 04/11] add report section --- cg/meta/workflow/nf_analysis.py | 10 ++++++++++ cg/models/deliverables/metric_deliverables.py | 1 + 2 files changed, 11 insertions(+) diff --git a/cg/meta/workflow/nf_analysis.py b/cg/meta/workflow/nf_analysis.py index 6111e2cf30..40290ed0ae 100644 --- a/cg/meta/workflow/nf_analysis.py +++ b/cg/meta/workflow/nf_analysis.py @@ -696,6 +696,16 @@ def get_metrics_from_multiqc_json_with_pattern( metric_name=metric_name, metric_value=metric_value, metric_id=metric_id ) metrics.append(metric) + for section in multiqc_json.report_saved_raw_data: + for section_name, section_values in section.items(): + if exact_match: + iss_pattern_found: bool = search_pattern == section_name + if iss_pattern_found: + for metric_name, metric_value in section_values.items(): + metric: MetricsBase = self.get_multiqc_metric( + metric_name=metric_name, metric_value=metric_value, metric_id=metric_id + ) + metrics.append(metric) return metrics def get_multiqc_metric( diff --git a/cg/models/deliverables/metric_deliverables.py b/cg/models/deliverables/metric_deliverables.py index 722056ca06..0e24d83bdd 100644 --- a/cg/models/deliverables/metric_deliverables.py +++ b/cg/models/deliverables/metric_deliverables.py @@ -166,3 +166,4 @@ class MultiqcDataJson(BaseModel): report_general_stats_data: list[dict] | None report_data_sources: dict | None + report_saved_raw_data: list[dict] | None From c1703cc2a59bbe51a9e8f27c829fba2be6448b82 Mon Sep 17 00:00:00 2001 From: Sebastian Diaz Date: Fri, 6 Sep 2024 17:06:12 +0200 Subject: [PATCH 05/11] refactor parsing of rare disease metrics --- cg/constants/nf_analysis.py | 2 +- cg/meta/workflow/nf_analysis.py | 52 ++++++++----------- cg/meta/workflow/raredisease.py | 48 ++++++++++++++++- cg/models/deliverables/metric_deliverables.py | 2 +- 4 files changed, 70 insertions(+), 34 deletions(-) diff --git a/cg/constants/nf_analysis.py b/cg/constants/nf_analysis.py index c923a40f6f..07ad7a2161 100644 --- a/cg/constants/nf_analysis.py +++ b/cg/constants/nf_analysis.py @@ -22,7 +22,7 @@ class NfTowerStatus(StrEnum): "PCT_TARGET_BASES_10X": {"norm": "gt", "threshold": 0.95}, "PCT_EXC_ADAPTER": {"norm": "lt", "threshold": 0.0005}, "predicted_sex_sex_check": {"norm": "eq", "threshold": None}, - "parent_error_ped_check": {"norm": "eq", "threshold": False}, + "parent_error_ped_check": {"norm": "eq", "threshold": "False"}, } RNAFUSION_METRIC_CONDITIONS: dict[str, dict[str, Any]] = { diff --git a/cg/meta/workflow/nf_analysis.py b/cg/meta/workflow/nf_analysis.py index 40290ed0ae..8bc35f7ea2 100644 --- a/cg/meta/workflow/nf_analysis.py +++ b/cg/meta/workflow/nf_analysis.py @@ -1,7 +1,6 @@ import logging from datetime import datetime from pathlib import Path -from itertools import combinations from typing import Any, Iterator from pydantic.v1 import ValidationError @@ -632,17 +631,10 @@ def get_workflow_metrics(self, metric_id: str) -> dict: def get_multiqc_search_patterns(self, case_id: str) -> dict: """Return search patterns for MultiQC. Each key is a search pattern and each value corresponds to the metric ID to set in the metrics deliverables file. - Multiple search patterns can be added. Ideally patterns used should be sample ids, e.g. + Multiple search patterns can be added. Ideally, used patterns should be sample ids, e.g. {sample_id_1: sample_id_1, sample_id_2: sample_id_2}.""" - sample_ids: Iterator[str] = self.status_db.get_sample_ids_by_case_id(case_id=case_id) - sample_patterns: dict[str, str] = {sample_id: sample_id for sample_id in sample_ids} - sample_ids_list = list(sample_ids) - pairwise_patterns: dict[str, str] = { - f"{sample1}-{sample2}": f"{sample1}-{sample2}" - for sample1, sample2 in combinations(sample_ids_list, 2) - } - search_patterns = {**sample_patterns, **pairwise_patterns} - return search_patterns + sample_ids: Iterator[str] = self.status_db.get_sample_ids_by_case_id(case_id) + return {sample_id: sample_id for sample_id in sample_ids} @staticmethod def get_deduplicated_metrics(metrics: list[MetricsBase]) -> list[MetricsBase]: @@ -656,11 +648,13 @@ def get_deduplicated_metrics(metrics: list[MetricsBase]) -> list[MetricsBase]: deduplicated_metrics.append(metric) return deduplicated_metrics + def get_multiqc_data_json(self, case_id: str) -> MultiqcDataJson: + """Return a MultiqcDataJson object.""" + return MultiqcDataJson(**read_json(file_path=self.get_multiqc_json_path(case_id=case_id))) + def get_multiqc_json_metrics(self, case_id: str) -> list[MetricsBase]: """Return a list of the metrics specified in a MultiQC json file.""" - multiqc_json = MultiqcDataJson( - **read_json(file_path=self.get_multiqc_json_path(case_id=case_id)) - ) + multiqc_json: MultiqcDataJson = self.get_multiqc_data_json(case_id=case_id) metrics = [] for search_pattern, metric_id in self.get_multiqc_search_patterns(case_id=case_id).items(): metrics_for_pattern: list[MetricsBase] = ( @@ -675,6 +669,14 @@ def get_multiqc_json_metrics(self, case_id: str) -> list[MetricsBase]: metrics = self.get_deduplicated_metrics(metrics=metrics) return metrics + @staticmethod + def _is_pattern_found(pattern: str, text: str, exact_match: bool) -> bool: + if exact_match: + is_pattern_found: bool = pattern == text + else: + is_pattern_found: bool = pattern in text + return is_pattern_found + def get_metrics_from_multiqc_json_with_pattern( self, search_pattern: str, @@ -685,23 +687,11 @@ def get_metrics_from_multiqc_json_with_pattern( """Parse a MultiqcDataJson and returns a list of metrics.""" metrics: list[MetricsBase] = [] for section in multiqc_json.report_general_stats_data: - for section_name, section_values in section.items(): - if exact_match: - is_pattern_found: bool = search_pattern == section_name - else: - is_pattern_found: bool = search_pattern in section_name - if is_pattern_found: - for metric_name, metric_value in section_values.items(): - metric: MetricsBase = self.get_multiqc_metric( - metric_name=metric_name, metric_value=metric_value, metric_id=metric_id - ) - metrics.append(metric) - for section in multiqc_json.report_saved_raw_data: - for section_name, section_values in section.items(): - if exact_match: - iss_pattern_found: bool = search_pattern == section_name - if iss_pattern_found: - for metric_name, metric_value in section_values.items(): + for subsection, metrics_dict in section.items(): + if self._is_pattern_found( + pattern=search_pattern, text=subsection, exact_match=exact_match + ): + for metric_name, metric_value in metrics_dict.items(): metric: MetricsBase = self.get_multiqc_metric( metric_name=metric_name, metric_value=metric_value, metric_id=metric_id ) diff --git a/cg/meta/workflow/raredisease.py b/cg/meta/workflow/raredisease.py index b8f1e0dd56..6506b5b290 100644 --- a/cg/meta/workflow/raredisease.py +++ b/cg/meta/workflow/raredisease.py @@ -1,6 +1,7 @@ """Module for Raredisease Analysis API.""" import logging +from itertools import permutations from pathlib import Path from typing import Any @@ -25,6 +26,7 @@ from cg.constants.subject import PlinkPhenotypeStatus, PlinkSex from cg.meta.workflow.nf_analysis import NfAnalysisAPI from cg.models.cg_config import CGConfig +from cg.models.deliverables.metric_deliverables import MetricsBase, MultiqcDataJson from cg.models.raredisease.raredisease import ( RarediseaseParameters, RarediseaseSampleSheetEntry, @@ -149,11 +151,55 @@ def get_managed_variants(self) -> list[str]: return self._get_managed_variants(genome_build=GenePanelGenomeBuild.hg19) def get_workflow_metrics(self, sample_id: str) -> dict: + """Return Raredisease workflow metric conditions for a sample.""" sample: Sample = self.status_db.get_sample_by_internal_id(internal_id=sample_id) - metric_conditions: dict[str, dict[str, Any]] = dict(RAREDISEASE_METRIC_CONDITIONS) + metric_conditions: dict[str, dict[str, Any]] = RAREDISEASE_METRIC_CONDITIONS.copy() self.set_order_sex_for_sample(sample, metric_conditions) return metric_conditions + def _get_sample_pair_patterns(self, case_id: str) -> list[str]: + """Return search patterns for MultiQC.""" + sample_ids: list[str] = list(self.status_db.get_sample_ids_by_case_id(case_id=case_id)) + pairwise_patterns: list[str] = [ + f"{sample1}-{sample2}" for sample1, sample2 in permutations(sample_ids, 2) + ] + return pairwise_patterns + + def get_parent_error_ped_check_metric( + self, pair_sample_ids: str, multiqc_raw_data: dict[dict] + ) -> MetricsBase | None: + """Return the value for Peddy parent error given a concatenated pair of sample ids.""" + metric_name: str = "parent_error_ped_check" + peddy_metrics: dict[str, dict] = multiqc_raw_data["multiqc_peddy"] + if sample_pair_metrics := peddy_metrics.get(pair_sample_ids, None): + return self.get_multiqc_metric( + metric_name=metric_name, + metric_value=sample_pair_metrics[metric_name], + metric_id=pair_sample_ids, + ) + + def get_multiqc_json_metrics(self, case_id: str) -> list[MetricsBase]: + """Return a list of the metrics specified in a MultiQC json file.""" + multiqc_json: MultiqcDataJson = self.get_multiqc_data_json(case_id=case_id) + metrics = [] + for search_pattern, metric_id in self.get_multiqc_search_patterns(case_id=case_id).items(): + metrics_for_pattern: list[MetricsBase] = ( + self.get_metrics_from_multiqc_json_with_pattern( + search_pattern=search_pattern, + multiqc_json=multiqc_json, + metric_id=metric_id, + exact_match=self.is_multiqc_pattern_search_exact, + ) + ) + metrics.extend(metrics_for_pattern) + for sample_pair in self._get_sample_pair_patterns(case_id): + if parent_error_metric := self.get_parent_error_ped_check_metric( + pair_sample_ids=sample_pair, multiqc_raw_data=multiqc_json.report_saved_raw_data + ): + metrics.append(parent_error_metric) + metrics = self.get_deduplicated_metrics(metrics=metrics) + return metrics + @staticmethod def set_order_sex_for_sample(sample: Sample, metric_conditions: dict) -> None: metric_conditions["predicted_sex_sex_check"]["threshold"] = sample.sex diff --git a/cg/models/deliverables/metric_deliverables.py b/cg/models/deliverables/metric_deliverables.py index 0e24d83bdd..8f26dd4fa5 100644 --- a/cg/models/deliverables/metric_deliverables.py +++ b/cg/models/deliverables/metric_deliverables.py @@ -166,4 +166,4 @@ class MultiqcDataJson(BaseModel): report_general_stats_data: list[dict] | None report_data_sources: dict | None - report_saved_raw_data: list[dict] | None + report_saved_raw_data: dict[str, dict] | None From d582db17f2e5cf1e01408fceb6086175a807b1d9 Mon Sep 17 00:00:00 2001 From: Sebastian Diaz Date: Fri, 6 Sep 2024 17:19:01 +0200 Subject: [PATCH 06/11] minor fixes in docstrings --- cg/meta/workflow/raredisease.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cg/meta/workflow/raredisease.py b/cg/meta/workflow/raredisease.py index 6506b5b290..521bcbcef3 100644 --- a/cg/meta/workflow/raredisease.py +++ b/cg/meta/workflow/raredisease.py @@ -158,7 +158,7 @@ def get_workflow_metrics(self, sample_id: str) -> dict: return metric_conditions def _get_sample_pair_patterns(self, case_id: str) -> list[str]: - """Return search patterns for MultiQC.""" + """Return sample-pair patterns for searching in MultiQC.""" sample_ids: list[str] = list(self.status_db.get_sample_ids_by_case_id(case_id=case_id)) pairwise_patterns: list[str] = [ f"{sample1}-{sample2}" for sample1, sample2 in permutations(sample_ids, 2) @@ -168,7 +168,7 @@ def _get_sample_pair_patterns(self, case_id: str) -> list[str]: def get_parent_error_ped_check_metric( self, pair_sample_ids: str, multiqc_raw_data: dict[dict] ) -> MetricsBase | None: - """Return the value for Peddy parent error given a concatenated pair of sample ids.""" + """Return the parsed metrics for pedigree error given a concatenated pair of sample ids.""" metric_name: str = "parent_error_ped_check" peddy_metrics: dict[str, dict] = multiqc_raw_data["multiqc_peddy"] if sample_pair_metrics := peddy_metrics.get(pair_sample_ids, None): @@ -182,7 +182,7 @@ def get_multiqc_json_metrics(self, case_id: str) -> list[MetricsBase]: """Return a list of the metrics specified in a MultiQC json file.""" multiqc_json: MultiqcDataJson = self.get_multiqc_data_json(case_id=case_id) metrics = [] - for search_pattern, metric_id in self.get_multiqc_search_patterns(case_id=case_id).items(): + for search_pattern, metric_id in self.get_multiqc_search_patterns(case_id).items(): metrics_for_pattern: list[MetricsBase] = ( self.get_metrics_from_multiqc_json_with_pattern( search_pattern=search_pattern, From 9be8693f4ea0845de0e4b94b21c76742ad0187a7 Mon Sep 17 00:00:00 2001 From: Sebastian Diaz Date: Mon, 9 Sep 2024 12:06:43 +0200 Subject: [PATCH 07/11] fix failing sex check --- cg/constants/nf_analysis.py | 3 +++ cg/meta/workflow/raredisease.py | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cg/constants/nf_analysis.py b/cg/constants/nf_analysis.py index 07ad7a2161..5a0a4f1453 100644 --- a/cg/constants/nf_analysis.py +++ b/cg/constants/nf_analysis.py @@ -22,6 +22,9 @@ class NfTowerStatus(StrEnum): "PCT_TARGET_BASES_10X": {"norm": "gt", "threshold": 0.95}, "PCT_EXC_ADAPTER": {"norm": "lt", "threshold": 0.0005}, "predicted_sex_sex_check": {"norm": "eq", "threshold": None}, +} + +RAREDISEASE_PARENT_PEDDY_METRIC_CONDITION: dict[str, dict[str, Any]] = { "parent_error_ped_check": {"norm": "eq", "threshold": "False"}, } diff --git a/cg/meta/workflow/raredisease.py b/cg/meta/workflow/raredisease.py index 521bcbcef3..c290be82cc 100644 --- a/cg/meta/workflow/raredisease.py +++ b/cg/meta/workflow/raredisease.py @@ -21,6 +21,7 @@ RAREDISEASE_COVERAGE_INTERVAL_TYPE, RAREDISEASE_COVERAGE_THRESHOLD, RAREDISEASE_METRIC_CONDITIONS, + RAREDISEASE_PARENT_PEDDY_METRIC_CONDITION, ) from cg.constants.scout import RAREDISEASE_CASE_TAGS from cg.constants.subject import PlinkPhenotypeStatus, PlinkSex @@ -153,8 +154,11 @@ def get_managed_variants(self) -> list[str]: def get_workflow_metrics(self, sample_id: str) -> dict: """Return Raredisease workflow metric conditions for a sample.""" sample: Sample = self.status_db.get_sample_by_internal_id(internal_id=sample_id) - metric_conditions: dict[str, dict[str, Any]] = RAREDISEASE_METRIC_CONDITIONS.copy() - self.set_order_sex_for_sample(sample, metric_conditions) + if "-" not in sample_id: + metric_conditions: dict[str, dict[str, Any]] = RAREDISEASE_METRIC_CONDITIONS.copy() + self.set_order_sex_for_sample(sample, metric_conditions) + else: + metric_conditions = RAREDISEASE_PARENT_PEDDY_METRIC_CONDITION.copy() return metric_conditions def _get_sample_pair_patterns(self, case_id: str) -> list[str]: From aee5e6fcf331009d90866c567b59ff35d8d89e45 Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 11 Sep 2024 10:27:12 +0200 Subject: [PATCH 08/11] remove docstring --- cg/meta/workflow/nf_analysis.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cg/meta/workflow/nf_analysis.py b/cg/meta/workflow/nf_analysis.py index 8bc35f7ea2..a62891940d 100644 --- a/cg/meta/workflow/nf_analysis.py +++ b/cg/meta/workflow/nf_analysis.py @@ -649,7 +649,6 @@ def get_deduplicated_metrics(metrics: list[MetricsBase]) -> list[MetricsBase]: return deduplicated_metrics def get_multiqc_data_json(self, case_id: str) -> MultiqcDataJson: - """Return a MultiqcDataJson object.""" return MultiqcDataJson(**read_json(file_path=self.get_multiqc_json_path(case_id=case_id))) def get_multiqc_json_metrics(self, case_id: str) -> list[MetricsBase]: From 35bf8da485055bfc66dec6298ad4b496855e29cc Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 11 Sep 2024 10:42:03 +0200 Subject: [PATCH 09/11] prevent automatic merge --- cg/constants/nf_analysis.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cg/constants/nf_analysis.py b/cg/constants/nf_analysis.py index 5a0a4f1453..5078cf8a23 100644 --- a/cg/constants/nf_analysis.py +++ b/cg/constants/nf_analysis.py @@ -18,7 +18,7 @@ class NfTowerStatus(StrEnum): RAREDISEASE_METRIC_CONDITIONS: dict[str, dict[str, Any]] = { "percent_duplicates": {"norm": "lt", "threshold": 20}, "PCT_PF_UQ_READS_ALIGNED": {"norm": "gt", "threshold": 0.95}, - "MEDIAN_TARGET_COVERAGE": {"norm": "gt", "threshold": 25}, + "MEDIAN_TARGET_COVERAGE": #{"norm": "gt", "threshold": 25}, "PCT_TARGET_BASES_10X": {"norm": "gt", "threshold": 0.95}, "PCT_EXC_ADAPTER": {"norm": "lt", "threshold": 0.0005}, "predicted_sex_sex_check": {"norm": "eq", "threshold": None}, From ece8361633f1e14998382ae27c8e4d3713024fca Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 11 Sep 2024 11:46:24 +0200 Subject: [PATCH 10/11] add second sample in fixture context --- cg/constants/nf_analysis.py | 2 +- tests/conftest.py | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/cg/constants/nf_analysis.py b/cg/constants/nf_analysis.py index 5078cf8a23..5a0a4f1453 100644 --- a/cg/constants/nf_analysis.py +++ b/cg/constants/nf_analysis.py @@ -18,7 +18,7 @@ class NfTowerStatus(StrEnum): RAREDISEASE_METRIC_CONDITIONS: dict[str, dict[str, Any]] = { "percent_duplicates": {"norm": "lt", "threshold": 20}, "PCT_PF_UQ_READS_ALIGNED": {"norm": "gt", "threshold": 0.95}, - "MEDIAN_TARGET_COVERAGE": #{"norm": "gt", "threshold": 25}, + "MEDIAN_TARGET_COVERAGE": {"norm": "gt", "threshold": 25}, "PCT_TARGET_BASES_10X": {"norm": "gt", "threshold": 0.95}, "PCT_EXC_ADAPTER": {"norm": "lt", "threshold": 0.0005}, "predicted_sex_sex_check": {"norm": "eq", "threshold": None}, diff --git a/tests/conftest.py b/tests/conftest.py index 9dd7d0d066..4659f3883b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2552,6 +2552,9 @@ def raredisease_context( trailblazer_api: MockTB, raredisease_case_id: str, sample_id: str, + father_sample_id: str, + sample_name: str, + another_sample_name: str, no_sample_case_id: str, total_sequenced_reads_pass: int, wgs_application_tag: str, @@ -2582,6 +2585,16 @@ def raredisease_context( sample_enough_reads: Sample = helpers.add_sample( status_db, internal_id=sample_id, + name=sample_name, + last_sequenced_at=datetime.now(), + reads=total_sequenced_reads_pass, + application_tag=wgs_application_tag, + ) + + another_sample_enough_reads: Sample = helpers.add_sample( + status_db, + internal_id=father_sample_id, + name=another_sample_name, last_sequenced_at=datetime.now(), reads=total_sequenced_reads_pass, application_tag=wgs_application_tag, @@ -2593,6 +2606,12 @@ def raredisease_context( sample=sample_enough_reads, ) + helpers.add_relationship( + status_db, + case=case_enough_reads, + sample=another_sample_enough_reads, + ) + # Create case without enough reads case_not_enough_reads: Case = helpers.add_case( store=status_db, From e91338245b35f2d661a48169ae3d2168844d0891 Mon Sep 17 00:00:00 2001 From: peterpru Date: Wed, 11 Sep 2024 12:04:56 +0200 Subject: [PATCH 11/11] add second sample to multiqc-data fixture and deliverables.yaml --- .../analysis/raredisease/multiqc_data.json | 222 +++- ...ase_enough_reads_metrics_deliverables.yaml | 1101 ++++++++++++++++- 2 files changed, 1321 insertions(+), 2 deletions(-) diff --git a/tests/fixtures/analysis/raredisease/multiqc_data.json b/tests/fixtures/analysis/raredisease/multiqc_data.json index 526990d576..24f06258d8 100644 --- a/tests/fixtures/analysis/raredisease/multiqc_data.json +++ b/tests/fixtures/analysis/raredisease/multiqc_data.json @@ -202,7 +202,227 @@ "het_ratio_sex_check": 0.03753, "predicted_sex_sex_check": "female", "error_sex_check": "True" + }, + "ADM2_1": { + "percent_gc": 40.0, + "avg_sequence_length": 151.0, + "median_sequence_length": 151, + "total_sequences": 300008747.0, + "percent_duplicates": 8.309768884963006, + "percent_fails": 0.0 + }, + "ADM2_2": { + "percent_gc": 41.0, + "avg_sequence_length": 151.0, + "median_sequence_length": 151, + "total_sequences": 299990878.0, + "percent_duplicates": 9.121697870826623, + "percent_fails": 0.0 + } + }, + { + "ADM2": { + "BAIT_SET": "home_bait", + "BAIT_TERRITORY": 77043000.0, + "BAIT_DESIGN_EFFICIENCY": 0.471991, + "ON_BAIT_BASES": 2168131962.0, + "NEAR_BAIT_BASES": 3025317220.0, + "OFF_BAIT_BASES": 82119739945.0, + "PCT_SELECTED_BASES": 0.059481, + "PCT_OFF_BAIT": 0.940519, + "ON_BAIT_VS_SELECTED": 0.417474, + "MEAN_BAIT_COVERAGE": 28.141842, + "PCT_USABLE_BASES_ON_BAIT": 0.024739, + "PCT_USABLE_BASES_ON_TARGET": 0.010185, + "FOLD_ENRICHMENT": 1.01123, + "HS_LIBRARY_SIZE": 209575187.0, + "HS_PENALTY_10X": 116.595122, + "HS_PENALTY_20X": 119.154837, + "HS_PENALTY_30X": 121.636986, + "HS_PENALTY_40X": 124.506969, + "HS_PENALTY_50X": 127.345926, + "HS_PENALTY_100X": 145.589715, + "TARGET_TERRITORY": 36363631.0, + "GENOME_SIZE": 3137454505.0, + "TOTAL_READS": 582127482.0, + "PF_READS": 582127482.0, + "PF_BASES": 87639826450.0, + "PF_UNIQUE_READS": 554469972.0, + "PF_UQ_READS_ALIGNED": 554378136.0, + "PF_BASES_ALIGNED": 87313189127.0, + "PF_UQ_BASES_ALIGNED": 83169064702.0, + "ON_TARGET_BASES": 892599615.0, + "PCT_PF_READS": 1.0, + "PCT_PF_UQ_READS": 0.952489, + "PCT_PF_UQ_READS_ALIGNED": 0.999834, + "MEAN_TARGET_COVERAGE": 24.546493, + "MEDIAN_TARGET_COVERAGE": 27.0, + "MAX_TARGET_COVERAGE": 293.0, + "MIN_TARGET_COVERAGE": 0.0, + "ZERO_CVG_TARGETS_PCT": 0.011192, + "PCT_EXC_DUPE": 0.047463, + "PCT_EXC_ADAPTER": 0.0, + "PCT_EXC_MAPQ": 0.046112, + "PCT_EXC_BASEQ": 0.011212, + "PCT_EXC_OVERLAP": 0.046622, + "PCT_EXC_OFF_TARGET": 0.838374, + "PCT_TARGET_BASES_1X": 0.986489, + "PCT_TARGET_BASES_2X": 0.985327, + "PCT_TARGET_BASES_10X": 0.9692, + "PCT_TARGET_BASES_20X": 0.800972, + "PCT_TARGET_BASES_30X": 0.228001, + "PCT_TARGET_BASES_40X": 0.011174, + "PCT_TARGET_BASES_50X": 0.001188, + "PCT_TARGET_BASES_100X": 0.000148, + "PCT_TARGET_BASES_250X": 2e-06, + "PCT_TARGET_BASES_500X": 0.0, + "PCT_TARGET_BASES_1000X": 0.0, + "PCT_TARGET_BASES_2500X": 0.0, + "PCT_TARGET_BASES_5000X": 0.0, + "PCT_TARGET_BASES_10000X": 0.0, + "PCT_TARGET_BASES_25000X": 0.0, + "PCT_TARGET_BASES_50000X": 0.0, + "PCT_TARGET_BASES_100000X": 0.0, + "AT_DROPOUT": 0.061814, + "GC_DROPOUT": 3.395193, + "HET_SNP_SENSITIVITY": 0.984192, + "HET_SNP_Q": 18.0, + "SAMPLE": "", + "LIBRARY": "", + "READ_GROUP": "" + } + }, + { + "ADM2": { + "total_count": 272277544, + "meansum": 90261639990.04478, + "total_pairs": 272728731.0, + "summed_mean": 330.957577, + "summed_median": 327 + } + }, + { + "ADM2": { + "GENOME_TERRITORY": 2858674663.0, + "MEAN_COVERAGE": 25.002304, + "SD_COVERAGE": 7.564118, + "MEDIAN_COVERAGE": 27.0, + "MAD_COVERAGE": 4.0, + "PCT_EXC_ADAPTER": 3e-06, + "PCT_EXC_MAPQ": 0.028096, + "PCT_EXC_DUPE": 0.041988, + "PCT_EXC_UNPAIRED": 8.8e-05, + "PCT_EXC_BASEQ": 0.012141, + "PCT_EXC_OVERLAP": 0.046242, + "PCT_EXC_CAPPED": 0.004331, + "PCT_EXC_TOTAL": 0.13289, + "PCT_1X": 0.988269, + "PCT_5X": 0.984082, + "PCT_10X": 0.969498, + "PCT_15X": 0.926194, + "PCT_20X": 0.82183, + "PCT_25X": 0.5636, + "PCT_30X": 0.247956, + "PCT_40X": 0.012271, + "PCT_50X": 0.001739, + "PCT_60X": 0.001019, + "PCT_70X": 0.000676, + "PCT_80X": 0.000491, + "PCT_90X": 0.000369, + "PCT_100X": 0.000274, + "FOLD_80_BASE_PENALTY": 1.250115, + "FOLD_90_BASE_PENALTY": 1.562644, + "FOLD_95_BASE_PENALTY": 2.083525 + } + }, + { + "ADM2": { + "total_reads": 582127482, + "mapped_reads": 582035646, + "general_error_rate": 0.41000000000000003, + "mean_coverage": 27.8391, + "percentage_aligned": 99.98422407413501 + }, + "ADM2_qualimap": { + "median_coverage": 28, + "median_insert_size": 328, + "avg_gc": 41.33062822983583, + "1_x_pc": 92.29551680782062, + "5_x_pc": 92.09514089830603, + "10_x_pc": 91.13522460463534, + "30_x_pc": 40.58657229836071, + "50_x_pc": 0.8020039799748427 + } + }, + { + "ADM2_mosdepth": { + "1_x_pc": 92.0, + "5_x_pc": 92.0, + "10_x_pc": 91.0, + "30_x_pc": 25.0, + "50_x_pc": 1.0, + "median_coverage": 27 + } + }, + { + "ADM2": { + "family_id": "raredisease_case_enough_reads", + "paternal_id": 0.0, + "maternal_id": 0.0, + "sex": 2.0, + "phenotype": 1.0, + "het_call_rate": 1.0, + "het_ratio": 0.46773785425101216, + "het_mean_depth": 24.91599190283401, + "het_idr_baf": 0.265993265993266, + "ancestry-prediction": "EUR", + "PC1": -0.4272191936528722, + "PC2": -1.3373174157150056, + "PC3": -0.4438895963046335, + "sex_het_ratio": 0.03752899009065992, + "depth_outlier_het_check": "False", + "het_count_het_check": 3697.0, + "het_ratio_het_check": 0.4677, + "idr_baf_het_check": 0.266, + "mean_depth_het_check": 24.92, + "median_depth_het_check": 24.0, + "p10_het_check": 0.3636, + "p90_het_check": 0.6296, + "sampled_sites_het_check": 7864.0, + "call_rate_het_check": 1.0, + "ancestry-prediction_het_check": "EUR", + "ancestry-prob_het_check": 0.9956, + "PC1_het_check": -0.4272, + "PC2_het_check": -1.337, + "PC3_het_check": -0.4439, + "PC4_het_check": -0.8576, + "ped_sex_sex_check": "female", + "hom_ref_count_sex_check": 4313.0, + "het_count_sex_check": 178.0, + "hom_alt_count_sex_check": 4743.0, + "het_ratio_sex_check": 0.03753, + "predicted_sex_sex_check": "female", + "error_sex_check": "True" + } + } + ], + "report_saved_raw_data": { + "multiqc_peddy": { + "ADM1-ADM2": { + "rel_ped_check": 0.4917, + "hets_a_ped_check": 3624.0, + "hets_b_ped_check": 3704.0, + "shared_hets_ped_check": 1808.0, + "ibs0_ped_check": 13.0, + "ibs2_ped_check": 4164.0, + "n_ped_check": 7886.0, + "pedigree_parents_ped_check": "True", + "pedigree_relatedness_ped_check": 0.5, + "predicted_parents_ped_check": "True", + "parent_error_ped_check": "False", + "sample_duplication_error_ped_check": "False", + "rel_difference_ped_check": 0.008278 } } - ] + } } diff --git a/tests/fixtures/analysis/raredisease/raredisease_case_enough_reads_metrics_deliverables.yaml b/tests/fixtures/analysis/raredisease/raredisease_case_enough_reads_metrics_deliverables.yaml index 20d9ca8d62..954dc39c6c 100644 --- a/tests/fixtures/analysis/raredisease/raredisease_case_enough_reads_metrics_deliverables.yaml +++ b/tests/fixtures/analysis/raredisease/raredisease_case_enough_reads_metrics_deliverables.yaml @@ -1089,4 +1089,1103 @@ metrics: input: multiqc_data.json name: error_sex_check step: multiqc - value: 'True' \ No newline at end of file + value: 'True' +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: percent_gc + step: multiqc + value: 40.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: avg_sequence_length + step: multiqc + value: 151.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: median_sequence_length + step: multiqc + value: 151 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: total_sequences + step: multiqc + value: 300008747.0 +- condition: + norm: lt + threshold: 20.0 + header: null + id: ADM2 + input: multiqc_data.json + name: percent_duplicates + step: multiqc + value: 8.309768884963006 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: percent_fails + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: BAIT_SET + step: multiqc + value: home_bait +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: BAIT_TERRITORY + step: multiqc + value: 77043000.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: BAIT_DESIGN_EFFICIENCY + step: multiqc + value: 0.471991 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: ON_BAIT_BASES + step: multiqc + value: 2168131962.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: NEAR_BAIT_BASES + step: multiqc + value: 3025317220.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: OFF_BAIT_BASES + step: multiqc + value: 82119739945.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_SELECTED_BASES + step: multiqc + value: 0.059481 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_OFF_BAIT + step: multiqc + value: 0.940519 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: ON_BAIT_VS_SELECTED + step: multiqc + value: 0.417474 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: MEAN_BAIT_COVERAGE + step: multiqc + value: 28.141842 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_USABLE_BASES_ON_BAIT + step: multiqc + value: 0.024739 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_USABLE_BASES_ON_TARGET + step: multiqc + value: 0.010185 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: FOLD_ENRICHMENT + step: multiqc + value: 1.01123 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: HS_LIBRARY_SIZE + step: multiqc + value: 209575187.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: HS_PENALTY_10X + step: multiqc + value: 116.595122 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: HS_PENALTY_20X + step: multiqc + value: 119.154837 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: HS_PENALTY_30X + step: multiqc + value: 121.636986 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: HS_PENALTY_40X + step: multiqc + value: 124.506969 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: HS_PENALTY_50X + step: multiqc + value: 127.345926 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: HS_PENALTY_100X + step: multiqc + value: 145.589715 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: TARGET_TERRITORY + step: multiqc + value: 36363631.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: GENOME_SIZE + step: multiqc + value: 3137454505.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: TOTAL_READS + step: multiqc + value: 582127482.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PF_READS + step: multiqc + value: 582127482.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PF_BASES + step: multiqc + value: 87639826450.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PF_UNIQUE_READS + step: multiqc + value: 554469972.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PF_UQ_READS_ALIGNED + step: multiqc + value: 554378136.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PF_BASES_ALIGNED + step: multiqc + value: 87313189127.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PF_UQ_BASES_ALIGNED + step: multiqc + value: 83169064702.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: ON_TARGET_BASES + step: multiqc + value: 892599615.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_PF_READS + step: multiqc + value: 1.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_PF_UQ_READS + step: multiqc + value: 0.952489 +- condition: + norm: gt + threshold: 0.95 + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_PF_UQ_READS_ALIGNED + step: multiqc + value: 0.999834 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: MEAN_TARGET_COVERAGE + step: multiqc + value: 24.546493 +- condition: + norm: gt + threshold: 25.0 + header: null + id: ADM2 + input: multiqc_data.json + name: MEDIAN_TARGET_COVERAGE + step: multiqc + value: 27.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: MAX_TARGET_COVERAGE + step: multiqc + value: 293.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: MIN_TARGET_COVERAGE + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: ZERO_CVG_TARGETS_PCT + step: multiqc + value: 0.011192 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_EXC_DUPE + step: multiqc + value: 0.047463 +- condition: + norm: lt + threshold: 0.0005 + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_EXC_ADAPTER + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_EXC_MAPQ + step: multiqc + value: 0.046112 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_EXC_BASEQ + step: multiqc + value: 0.011212 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_EXC_OVERLAP + step: multiqc + value: 0.046622 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_EXC_OFF_TARGET + step: multiqc + value: 0.838374 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_1X + step: multiqc + value: 0.986489 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_2X + step: multiqc + value: 0.985327 +- condition: + norm: gt + threshold: 0.95 + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_10X + step: multiqc + value: 0.9692 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_20X + step: multiqc + value: 0.800972 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_30X + step: multiqc + value: 0.228001 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_40X + step: multiqc + value: 0.011174 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_50X + step: multiqc + value: 0.001188 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_100X + step: multiqc + value: 0.000148 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_250X + step: multiqc + value: 2.0e-06 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_500X + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_1000X + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_2500X + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_5000X + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_10000X + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_25000X + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_50000X + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_TARGET_BASES_100000X + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: AT_DROPOUT + step: multiqc + value: 0.061814 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: GC_DROPOUT + step: multiqc + value: 3.395193 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: HET_SNP_SENSITIVITY + step: multiqc + value: 0.984192 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: HET_SNP_Q + step: multiqc + value: 18.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: SAMPLE + step: multiqc + value: '' +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: LIBRARY + step: multiqc + value: '' +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: READ_GROUP + step: multiqc + value: '' +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: total_count + step: multiqc + value: 272277544 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: meansum + step: multiqc + value: 90261639990.04478 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: total_pairs + step: multiqc + value: 272728731.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: summed_mean + step: multiqc + value: 330.957577 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: summed_median + step: multiqc + value: 327 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: GENOME_TERRITORY + step: multiqc + value: 2858674663.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: MEAN_COVERAGE + step: multiqc + value: 25.002304 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: SD_COVERAGE + step: multiqc + value: 7.564118 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: MEDIAN_COVERAGE + step: multiqc + value: 27.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: MAD_COVERAGE + step: multiqc + value: 4.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_EXC_UNPAIRED + step: multiqc + value: 8.8e-05 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_EXC_CAPPED + step: multiqc + value: 0.004331 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_EXC_TOTAL + step: multiqc + value: 0.13289 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_1X + step: multiqc + value: 0.988269 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_5X + step: multiqc + value: 0.984082 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_10X + step: multiqc + value: 0.969498 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_15X + step: multiqc + value: 0.926194 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_20X + step: multiqc + value: 0.82183 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_25X + step: multiqc + value: 0.5636 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_30X + step: multiqc + value: 0.247956 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_40X + step: multiqc + value: 0.012271 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_50X + step: multiqc + value: 0.001739 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_60X + step: multiqc + value: 0.001019 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_70X + step: multiqc + value: 0.000676 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_80X + step: multiqc + value: 0.000491 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_90X + step: multiqc + value: 0.000369 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PCT_100X + step: multiqc + value: 0.000274 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: FOLD_80_BASE_PENALTY + step: multiqc + value: 1.250115 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: FOLD_90_BASE_PENALTY + step: multiqc + value: 1.562644 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: FOLD_95_BASE_PENALTY + step: multiqc + value: 2.083525 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: total_reads + step: multiqc + value: 582127482 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: mapped_reads + step: multiqc + value: 582035646 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: general_error_rate + step: multiqc + value: 0.41000000000000003 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: mean_coverage + step: multiqc + value: 27.8391 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: percentage_aligned + step: multiqc + value: 99.98422407413501 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: median_coverage + step: multiqc + value: 28 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: median_insert_size + step: multiqc + value: 328 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: avg_gc + step: multiqc + value: 41.33062822983583 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: 1_x_pc + step: multiqc + value: 92.29551680782062 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: 5_x_pc + step: multiqc + value: 92.09514089830603 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: 10_x_pc + step: multiqc + value: 91.13522460463534 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: 30_x_pc + step: multiqc + value: 40.58657229836071 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: 50_x_pc + step: multiqc + value: 0.8020039799748427 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: family_id + step: multiqc + value: raredisease_case_enough_reads +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: paternal_id + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: maternal_id + step: multiqc + value: 0.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: sex + step: multiqc + value: 2.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: phenotype + step: multiqc + value: 1.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: het_call_rate + step: multiqc + value: 1.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: het_ratio + step: multiqc + value: 0.46773785425101216 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: het_mean_depth + step: multiqc + value: 24.91599190283401 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: het_idr_baf + step: multiqc + value: 0.265993265993266 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: ancestry-prediction + step: multiqc + value: EUR +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PC1 + step: multiqc + value: -0.4272191936528722 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PC2 + step: multiqc + value: -1.3373174157150056 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PC3 + step: multiqc + value: -0.4438895963046335 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: sex_het_ratio + step: multiqc + value: 0.03752899009065992 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: depth_outlier_het_check + step: multiqc + value: 'False' +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: het_count_het_check + step: multiqc + value: 3697.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: het_ratio_het_check + step: multiqc + value: 0.4677 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: idr_baf_het_check + step: multiqc + value: 0.266 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: mean_depth_het_check + step: multiqc + value: 24.92 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: median_depth_het_check + step: multiqc + value: 24.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: p10_het_check + step: multiqc + value: 0.3636 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: p90_het_check + step: multiqc + value: 0.6296 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: sampled_sites_het_check + step: multiqc + value: 7864.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: call_rate_het_check + step: multiqc + value: 1.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: ancestry-prediction_het_check + step: multiqc + value: EUR +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: ancestry-prob_het_check + step: multiqc + value: 0.9956 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PC1_het_check + step: multiqc + value: -0.4272 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PC2_het_check + step: multiqc + value: -1.337 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PC3_het_check + step: multiqc + value: -0.4439 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: PC4_het_check + step: multiqc + value: -0.8576 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: ped_sex_sex_check + step: multiqc + value: female +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: hom_ref_count_sex_check + step: multiqc + value: 4313.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: het_count_sex_check + step: multiqc + value: 178.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: hom_alt_count_sex_check + step: multiqc + value: 4743.0 +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: het_ratio_sex_check + step: multiqc + value: 0.03753 +- condition: + norm: eq + threshold: female + header: null + id: ADM2 + input: multiqc_data.json + name: predicted_sex_sex_check + step: multiqc + value: female +- condition: null + header: null + id: ADM2 + input: multiqc_data.json + name: error_sex_check + step: multiqc + value: 'True' +- condition: + norm: eq + threshold: 'False' + header: null + id: ADM1-ADM2 + input: multiqc_data.json + name: parent_error_ped_check + step: multiqc + value: 'False' \ No newline at end of file