diff --git a/cg/cli/upload/utils.py b/cg/cli/upload/utils.py index d97b71b6993..09397b9a50a 100644 --- a/cg/cli/upload/utils.py +++ b/cg/cli/upload/utils.py @@ -26,7 +26,11 @@ def suggest_cases_to_upload(status_db: Store, workflow: Workflow | None = None) def get_scout_api_by_case(cg_config: CGConfig, case_id: str) -> ScoutAPI: workflow = cg_config.status_db.get_case_by_internal_id(case_id).data_analysis - return cg_config.scout_api_38 if workflow == Workflow.NALLO else cg_config.scout_api_37 + return ( + cg_config.scout_api_38 + if workflow in [Workflow.NALLO, Workflow.RAREDISEASE] + else cg_config.scout_api_37 + ) def get_scout_api_by_genome_build(cg_config: CGConfig, genome_build: str) -> ScoutAPI: diff --git a/cg/meta/delivery_report/templates/macros/uploaded_files/uploaded_files.html b/cg/meta/delivery_report/templates/macros/uploaded_files/uploaded_files.html index e68323e1cfc..c9a9f3ffeb0 100644 --- a/cg/meta/delivery_report/templates/macros/uploaded_files/uploaded_files.html +++ b/cg/meta/delivery_report/templates/macros/uploaded_files/uploaded_files.html @@ -6,115 +6,115 @@ {% macro uploaded_files(case, customer) %} {% set data_delivery = case.data_analysis.data_delivery %} - {% if "fastq" in data_delivery or "analysis" in data_delivery or "scout" in data_delivery %} -
-

Uppladdade filer

- - - {{ scout_files(case=case, customer_id=customer.id, scout_access=customer.scout_access) }} - - {{ caesar_files(case=case, customer_id=customer.id) }} -
- {% endif %} +{% if "fastq" in data_delivery or "analysis" in data_delivery or "scout" in data_delivery %} +
+

Uppladdade filer

+ + + {{ scout_files(case=case, customer_id=customer.id, scout_access=customer.scout_access) }} + + {{ caesar_files(case=case, customer_id=customer.id) }} +
+{% endif %} {% endmacro %} {% macro scout_files(case, customer_id, scout_access) %} {% set workflow = case.data_analysis.workflow %} - {% if scout_access and "scout" in case.data_analysis.data_delivery %} -

Scout

- - {% if "balsamic" in workflow %} - - {{ balsamic_scout_files(scout_files=case.data_analysis.scout_files, case_id=case.id, case_name=case.name) }} - {% elif workflow == "mip-dna" %} - - {{ mip_dna_scout_files(scout_files=case.data_analysis.scout_files, case_id=case.id, case_name=case.name) }} - {% elif workflow == "nallo" %} - - {{ nallo_scout_files(scout_files=case.data_analysis.scout_files, case_id=case.id, case_name=case.name) }} - {% elif workflow == "raredisease" %} - - {{ raredisease_scout_files(scout_files=case.data_analysis.scout_files, case_id=case.id, case_name=case.name) }} - {% elif workflow == "rnafusion" %} - - {{ rnafusion_scout_files(scout_files=case.data_analysis.scout_files, case_id=case.id, case_name=case.name) }} - {% endif %} +{% if scout_access and "scout" in case.data_analysis.data_delivery %} +

Scout

+ +{% if "balsamic" in workflow %} + +{{ balsamic_scout_files(scout_files=case.data_analysis.scout_files, case_id=case.id, case_name=case.name) }} +{% elif workflow == "mip-dna" %} + +{{ mip_dna_scout_files(scout_files=case.data_analysis.scout_files, case_id=case.id, case_name=case.name) }} +{% elif workflow == "nallo" %} + +{{ nallo_scout_files(scout_files=case.data_analysis.scout_files, case_id=case.id, case_name=case.name) }} +{% elif workflow == "raredisease" %} + +{{ raredisease_scout_files(scout_files=case.data_analysis.scout_files, case_id=case.id, case_name=case.name) }} +{% elif workflow == "rnafusion" %} + +{{ rnafusion_scout_files(scout_files=case.data_analysis.scout_files, case_id=case.id, case_name=case.name) }} +{% endif %} +{% endif %} {% endmacro %} {% macro caesar_files(case, customer_id) %} {% set data_delivery = case.data_analysis.data_delivery %} - {% if "fastq" in data_delivery or "analysis" in data_delivery %} -

Leveransinkorg (Caesar)

- - - {{ analysis_files(case=case) }} - - {{ fastq_files(case=case) }} - {% endif %} +{% if "fastq" in data_delivery or "analysis" in data_delivery %} +

Leveransinkorg (Caesar)

+ + +{{ analysis_files(case=case) }} + +{{ fastq_files(case=case) }} +{% endif %} {% endmacro %} {% macro analysis_files(case) %} - {% if "analysis" in case.data_analysis.data_delivery %} - - - - - - - - {{ delivered_files(row_title=case.name, files=case.data_analysis.delivered_files) }} - {% for sample in case.samples %} - {{ delivered_files(row_title=sample.name, files=sample.delivered_files) }} - {% endfor %} - -
Analysfiler
- {% endif %} +{% if "analysis" in case.data_analysis.data_delivery %} + + + + + + + + {{ delivered_files(row_title=case.name, files=case.data_analysis.delivered_files) }} + {% for sample in case.samples %} + {{ delivered_files(row_title=sample.name, files=sample.delivered_files) }} + {% endfor %} + +
Analysfiler
+{% endif %} {% endmacro %} {% macro fastq_files(case) %} - {% if "fastq" in case.data_analysis.data_delivery %} - - - - - - - - {% for sample in case.samples %} - - {{ delivered_files(row_title=sample.name, files=sample.delivered_fastq_files) }} - {% endfor %} - -
Fastq-filer
- {% endif %} -{% endmacro %} - -{% macro delivered_files(row_title, files) %} - {% if files != "N/A" %} +{% if "fastq" in case.data_analysis.data_delivery %} + + - + - {% for file in files %} - - - + + + {% for sample in case.samples %} + + {{ delivered_files(row_title=sample.name, files=sample.delivered_fastq_files) }} {% endfor %} - {% endif %} + +
{{ row_title }}Fastq-filer
{{ file }}
+{% endif %} {% endmacro %} + +{% macro delivered_files(row_title, files) %} +{% if files != "N/A" %} + + {{ row_title }} + +{% for file in files %} + + {{ file }} + +{% endfor %} +{% endif %} +{% endmacro %} \ No newline at end of file diff --git a/cg/meta/upload/scout/raredisease_config_builder.py b/cg/meta/upload/scout/raredisease_config_builder.py index b0e538ad278..da209822ada 100644 --- a/cg/meta/upload/scout/raredisease_config_builder.py +++ b/cg/meta/upload/scout/raredisease_config_builder.py @@ -69,7 +69,7 @@ def build_load_config(self, hk_version: Version, analysis: Analysis) -> Raredise self.load_custom_image_sample( load_config=load_config, analysis=analysis, hk_version=hk_version ) - load_config.human_genome_build = GenomeBuild.hg19 + load_config.human_genome_build = GenomeBuild.hg38 load_config.rank_score_threshold = RANK_MODEL_THRESHOLD load_config.rank_model_version = self.get_rank_model_version( variant_type=Variants.SNV, hk_version=hk_version diff --git a/cg/meta/workflow/analysis.py b/cg/meta/workflow/analysis.py index 64984680eaf..c1a2aea0eca 100644 --- a/cg/meta/workflow/analysis.py +++ b/cg/meta/workflow/analysis.py @@ -67,7 +67,7 @@ class AnalysisAPI(MetaAPI): def __init__(self, workflow: Workflow, config: CGConfig): super().__init__(config=config) self.workflow = workflow - if self.workflow == Workflow.NALLO: + if self.workflow in [Workflow.NALLO, Workflow.RAREDISEASE]: self.scout_api: ScoutAPI = self.scout_api_38 else: self.scout_api: ScoutAPI = self.scout_api_37 diff --git a/cg/meta/workflow/raredisease.py b/cg/meta/workflow/raredisease.py index 42d87b2a2a6..48c72b958b8 100644 --- a/cg/meta/workflow/raredisease.py +++ b/cg/meta/workflow/raredisease.py @@ -164,8 +164,8 @@ def get_scout_upload_case_tags(self) -> dict: return RAREDISEASE_CASE_TAGS def get_genome_build(self, case_id: str) -> GenomeVersion: - """Return reference genome for a raredisease case. Currently fixed for hg19.""" - return GenomeVersion.HG19 + """Return reference genome for a raredisease case.""" + return GenomeVersion.HG38 def parse_analysis(self, qc_metrics_raw: list[MetricsBase], **kwargs) -> NextflowAnalysis: """Parse Nextflow output analysis files and return an analysis model.""" diff --git a/cg/services/delivery_message/messages/utils.py b/cg/services/delivery_message/messages/utils.py index 0adea64b56c..e0a1e886d3a 100644 --- a/cg/services/delivery_message/messages/utils.py +++ b/cg/services/delivery_message/messages/utils.py @@ -15,7 +15,7 @@ def get_scout_link(case: Case) -> str: case_name: str = case.name url: str = ( "https://scout38.sys.scilifelab.se/" - if case.data_analysis == Workflow.NALLO + if case.data_analysis in [Workflow.NALLO, Workflow.RAREDISEASE] else "https://scout.scilifelab.se/" ) return f"{url}{customer_id}/{case_name}" diff --git a/tests/cli/upload/test_cli_scout.py b/tests/cli/upload/test_cli_scout.py index 6d8fe95a4ff..88b0db03e42 100644 --- a/tests/cli/upload/test_cli_scout.py +++ b/tests/cli/upload/test_cli_scout.py @@ -14,6 +14,7 @@ from cg.meta.workflow.mip_dna import MipDNAAnalysisAPI from cg.meta.workflow.mip_rna import MipRNAAnalysisAPI from cg.meta.workflow.nallo import NalloAnalysisAPI +from cg.meta.workflow.raredisease import RarediseaseAnalysisAPI from cg.meta.workflow.rnafusion import RnafusionAnalysisAPI from cg.meta.workflow.tomte import TomteAnalysisAPI from cg.models.cg_config import CGConfig @@ -31,22 +32,24 @@ ] ANALYSIS_API: list = [ - (Workflow.BALSAMIC, BalsamicAnalysisAPI), - (Workflow.MIP_DNA, MipDNAAnalysisAPI), - (Workflow.MIP_RNA, MipRNAAnalysisAPI), - (Workflow.NALLO, NalloAnalysisAPI), - (Workflow.RNAFUSION, RnafusionAnalysisAPI), - (Workflow.TOMTE, TomteAnalysisAPI), + (Workflow.BALSAMIC, BalsamicAnalysisAPI, "scout_api_37"), + (Workflow.MIP_DNA, MipDNAAnalysisAPI, "scout_api_37"), + (Workflow.MIP_RNA, MipRNAAnalysisAPI, "scout_api_37"), + (Workflow.NALLO, NalloAnalysisAPI, "scout_api_38"), + (Workflow.RAREDISEASE, RarediseaseAnalysisAPI, "scout_api_38"), + (Workflow.RNAFUSION, RnafusionAnalysisAPI, "scout_api_37"), + (Workflow.TOMTE, TomteAnalysisAPI, "scout_api_37"), ] @pytest.mark.parametrize( - "workflow,analysis_api", + "workflow,analysis_api, scout_instance", ANALYSIS_API, ) def test_get_upload_api( cg_context: CGConfig, case_id: str, + scout_instance: str, helpers: StoreHelpers, workflow: Workflow, analysis_api: AnalysisAPI, @@ -63,6 +66,7 @@ def test_get_upload_api( # THEN assert that the type of upload API is correct assert isinstance(upload_api.analysis_api, analysis_api) + assert upload_api.analysis_api.scout_api is getattr(upload_api.analysis_api, scout_instance) @pytest.mark.parametrize( diff --git a/tests/cli/upload/test_utils.py b/tests/cli/upload/test_utils.py index ab5f57a6ce7..67793afce2d 100644 --- a/tests/cli/upload/test_utils.py +++ b/tests/cli/upload/test_utils.py @@ -1,3 +1,5 @@ +import pytest + from cg.cli.upload.utils import get_scout_api_by_case, get_scout_api_by_genome_build from cg.constants import Workflow from cg.models.cg_config import CGConfig @@ -5,32 +7,30 @@ from tests.store_helpers import StoreHelpers -def test_get_scout_api_by_case_38(upload_context: CGConfig, helpers: StoreHelpers): - - # GIVEN a Nallo case - nallo_case: Case = helpers.ensure_case( - store=upload_context.status_db, data_analysis=Workflow.NALLO - ) - - # WHEN getting the corresponding ScoutAPI - scout_api = get_scout_api_by_case(cg_config=upload_context, case_id=nallo_case.internal_id) - - # THEN the ScoutAPI should be towards the hg38 instance - assert scout_api == upload_context.scout_api_38 - - -def test_get_scout_api_by_case_37(upload_context: CGConfig, helpers: StoreHelpers): - - # GIVEN a MIP-DNA case - nallo_case: Case = helpers.ensure_case( - store=upload_context.status_db, data_analysis=Workflow.MIP_DNA - ) +@pytest.mark.parametrize( + "workflow,scout_instance", + [ + (Workflow.BALSAMIC, "scout_api_37"), + (Workflow.BALSAMIC_UMI, "scout_api_37"), + (Workflow.MIP_DNA, "scout_api_37"), + (Workflow.MIP_RNA, "scout_api_37"), + (Workflow.NALLO, "scout_api_38"), + (Workflow.RAREDISEASE, "scout_api_38"), + (Workflow.TOMTE, "scout_api_37"), + ], +) +def test_get_scout_api_by_case( + workflow: Workflow, scout_instance: str, upload_context: CGConfig, helpers: StoreHelpers +): + + # GIVEN a case + case: Case = helpers.ensure_case(store=upload_context.status_db, data_analysis=workflow) # WHEN getting the corresponding ScoutAPI - scout_api = get_scout_api_by_case(cg_config=upload_context, case_id=nallo_case.internal_id) + scout_api = get_scout_api_by_case(cg_config=upload_context, case_id=case.internal_id) - # THEN the ScoutAPI should be towards the hg37 instance - assert scout_api == upload_context.scout_api_37 + # THEN the ScoutAPI should be towards the correct scout instance + assert scout_api == getattr(upload_context, scout_instance) def test_get_scout_api_by_reference_genome_hg19(upload_context: CGConfig): diff --git a/tests/conftest.py b/tests/conftest.py index af11dead8da..e859e58350c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2904,7 +2904,6 @@ def raredisease_context( last_sequenced_at=datetime.now(), reads=total_sequenced_reads_pass, application_tag=wgs_application_tag, - reference_genome=GenomeVersion.HG19, ) another_sample_enough_reads: Sample = helpers.add_sample( @@ -2914,7 +2913,6 @@ def raredisease_context( last_sequenced_at=datetime.now(), reads=total_sequenced_reads_pass, application_tag=wgs_application_tag, - reference_genome=GenomeVersion.HG19, ) helpers.add_relationship( diff --git a/tests/integration/config/cg-test.yaml b/tests/integration/config/cg-test.yaml index 25350801674..93d37bd6e9e 100644 --- a/tests/integration/config/cg-test.yaml +++ b/tests/integration/config/cg-test.yaml @@ -94,6 +94,25 @@ crunchy: number_tasks: 12 conda_env: crunchy_conda_env +raredisease: + compute_env: raredisease_compute_env + conda_env: raredisease_conda_env + config: {test_root_dir}/raredisease_config.config + launch_directory: {test_root_dir}/raredisease_launch_directory + params: {test_root_dir}/raredisease_params.yaml + platform: {test_root_dir}/platform.config + profile: raredisease_profile + resources: {test_root_dir}/raredisease_resources.config + repository: raredisease_repository + revision: raredisease_revision + root: {test_root_dir}/raredisease_root_path + slurm: + account: "raredisease_slurm_account" + mail_user: "raredisease_mail_user@scilifelab.se" + qos: "low" + tower_workflow: raredisease_tower_workflow + workflow_bin_path: {test_root_dir}/raredisease_workflow_bin_path + data-delivery: destination_path: {test_root_dir}/data-delivery_destination_path covid_destination_path: {test_root_dir}/data-delivery_covid_destination_path diff --git a/tests/meta/delivery_report/test_data_validators.py b/tests/meta/delivery_report/test_data_validators.py index 727e4ebd7f7..4d035732bb3 100644 --- a/tests/meta/delivery_report/test_data_validators.py +++ b/tests/meta/delivery_report/test_data_validators.py @@ -314,7 +314,7 @@ def test_get_delivery_report_html_raredisease(raredisease_analysis: NextflowAnal case: Case = create_autospec( Case, data_analysis=Workflow.RAREDISEASE, - data_delivery=DataDelivery.ANALYSIS_FILES, + data_delivery=DataDelivery.ANALYSIS_SCOUT, internal_id="case_id", sample=[sample], panels=["some_panel"], @@ -370,6 +370,7 @@ def test_get_delivery_report_html_raredisease(raredisease_analysis: NextflowAnal force=False, ) assert EXPECTED_RAREDISEASE_QC in delivery_report + assert "https://scout38.sys.scilifelab.se/" in delivery_report def test_get_missing_report_data( diff --git a/tests/meta/upload/scout/test_scout_config_builder.py b/tests/meta/upload/scout/test_scout_config_builder.py index 65487d8df6d..800588c7383 100644 --- a/tests/meta/upload/scout/test_scout_config_builder.py +++ b/tests/meta/upload/scout/test_scout_config_builder.py @@ -681,7 +681,7 @@ def mock_get_file_from_version(version: Version, tags: set[str]) -> File | None: gene_panels=[], default_gene_panels=[], cohorts=[], - human_genome_build="37", + human_genome_build="38", rank_model_version="1.38", rank_score_threshold=5, sv_rank_model_version="1.12", diff --git a/tests/meta/workflow/test_raredisease.py b/tests/meta/workflow/test_raredisease.py index 6a2fb04e6f2..945206d3097 100644 --- a/tests/meta/workflow/test_raredisease.py +++ b/tests/meta/workflow/test_raredisease.py @@ -1,13 +1,21 @@ -from unittest.mock import create_autospec +from pathlib import Path +from unittest.mock import Mock, create_autospec from pytest_mock import MockerFixture from cg.apps.coverage import ChanjoAPI from cg.apps.scout.scoutapi import ScoutAPI -from cg.constants import SexOptions +from cg.constants import SexOptions, Workflow +from cg.constants.constants import GenomeVersion from cg.meta.workflow.raredisease import RarediseaseAnalysisAPI from cg.models.analysis import NextflowAnalysis -from cg.models.cg_config import CGConfig +from cg.models.cg_config import ( + CGConfig, + IlluminaConfig, + RarediseaseConfig, + RunInstruments, + SlurmConfig, +) from cg.models.deliverables.metric_deliverables import MetricsBase from cg.store.models import Case, Sample from tests.typed_mock import TypedMock, create_typed_mock @@ -67,3 +75,37 @@ def test_get_sample_coverage(raredisease_context: CGConfig, mocker: MockerFixtur chanjo_api.as_mock.sample_coverage.assert_called_once_with( sample_id="internal_id", panel_genes=[] ) + + +def test_get_genome_build(): + # GIVEN the RarediseaseAnalysisAPI + cg_config: CGConfig = create_autospec( + CGConfig, + raredisease=create_autospec( + RarediseaseConfig, + conda_binary="conda/bin", + conda_env="conda/env", + config="here/is/my/config", + params="here/is/my/params/file", + platform="platform", + profile="profile", + resources="resources", + revision="1.0.0", + root="/I/am/Root", + slurm=create_autospec(SlurmConfig, account="account", mail_user="user"), + tower_workflow=Workflow.RAREDISEASE, + workflow_bin_path=Path("I", "am", "workflow", "bin", "path"), + ), + data_flow=Mock(), + run_instruments=create_autospec( + RunInstruments, + illumina=create_autospec(IlluminaConfig, demultiplexed_runs_dir="some_dir"), + ), + tower_binary_path="tower/path", + ) + + analysis_api = RarediseaseAnalysisAPI(config=cg_config) + + # WHEN getting the genome build + # THEN it is hg38 + assert analysis_api.get_genome_build(case_id="ChevyCase") == GenomeVersion.HG38 diff --git a/tests/services/analysis_starter/test_configurator_factory.py b/tests/services/analysis_starter/test_configurator_factory.py index ab795d6e017..00324cdc466 100644 --- a/tests/services/analysis_starter/test_configurator_factory.py +++ b/tests/services/analysis_starter/test_configurator_factory.py @@ -200,29 +200,24 @@ def test_configurator_factory_failure(cg_context: CGConfig): configurator_factory.get_configurator(workflow) -def test_get_scout_api_38(cg_context: CGConfig): - # GIVEN a configurator factory - configurator_factory = ConfiguratorFactory(cg_config=cg_context) - - # GIVEN Nallo - workflow = Workflow.NALLO - - # WHEN getting the scout api instance - scout_api: ScoutAPI = configurator_factory._get_scout_api(workflow=workflow) - - # THEN we should receive the HG38 instance - assert scout_api == cg_context.scout_api_38 - - -def test_get_scout_api_37(cg_context: CGConfig): +@pytest.mark.parametrize( + "workflow, scout_instance", + [ + (Workflow.BALSAMIC, "scout_api_37"), + (Workflow.BALSAMIC_UMI, "scout_api_37"), + (Workflow.MIP_DNA, "scout_api_37"), + (Workflow.MIP_RNA, "scout_api_37"), + (Workflow.NALLO, "scout_api_38"), + (Workflow.RAREDISEASE, "scout_api_38"), + (Workflow.TOMTE, "scout_api_37"), + ], +) +def test_get_scout_api(workflow: Workflow, scout_instance: str, cg_context: CGConfig): # GIVEN a configurator factory configurator_factory = ConfiguratorFactory(cg_config=cg_context) - # GIVEN not Nallo - workflow = Workflow.MIP_DNA - - # WHEN getting the scout api instance + # WHEN getting the scout api instance for a given workflow scout_api: ScoutAPI = configurator_factory._get_scout_api(workflow=workflow) - # THEN we should receive the HG37 instance - assert scout_api == cg_context.scout_api_37 + # THEN we should receive the correct scout instance + assert scout_api == getattr(cg_context, scout_instance)