diff --git a/cg/constants/observations.py b/cg/constants/observations.py index 0c907768a6..a2e070e751 100644 --- a/cg/constants/observations.py +++ b/cg/constants/observations.py @@ -67,6 +67,7 @@ class MipDNAObservationsAnalysisTag(StrEnum): class ObservationsFileWildcards(StrEnum): """File patterns regarding dump Loqusdb files.""" + ARTEFACT_SNV: str = "artefact_somatic_snv" CLINICAL_SNV: str = "clinical_snv" CLINICAL_SV: str = "clinical_sv" CANCER_GERMLINE_SNV: str = "cancer_germline_snv" diff --git a/cg/meta/upload/balsamic/balsamic.py b/cg/meta/upload/balsamic/balsamic.py index a567a049ac..6af7da9d2f 100644 --- a/cg/meta/upload/balsamic/balsamic.py +++ b/cg/meta/upload/balsamic/balsamic.py @@ -40,10 +40,8 @@ def upload(self, ctx: click.Context, case: Case, restart: bool) -> None: self.upload_files_to_customer_inbox(case) - if GensAPI.is_suitable_for_upload(case): - ctx.invoke(upload_to_gens, case_id=case.internal_id) - else: - LOG.info(f"Balsamic case {case.internal_id} is not compatible for Gens upload") + # Upload CNV and BAF profile to GENS + ctx.invoke(upload_to_gens, case_id=case.internal_id) # Scout specific upload if DataDelivery.SCOUT in case.data_delivery: diff --git a/cg/meta/workflow/balsamic.py b/cg/meta/workflow/balsamic.py index 8c37f39d2b..cbb43c6487 100644 --- a/cg/meta/workflow/balsamic.py +++ b/cg/meta/workflow/balsamic.py @@ -36,8 +36,7 @@ class BalsamicAnalysisAPI(AnalysisAPI): - """Handles communication between BALSAMIC processes - and the rest of CG infrastructure""" + """Handles communication between BALSAMIC processes and the rest of CG infrastructure.""" __BALSAMIC_APPLICATIONS = {"wgs", "wes", "tgs"} __BALSAMIC_BED_APPLICATIONS = {"wes", "tgs"} @@ -49,21 +48,23 @@ def __init__( ): super().__init__(workflow=workflow, config=config) self.account: str = config.balsamic.slurm.account - self.binary_path: str = config.balsamic.binary_path self.balsamic_cache: str = config.balsamic.balsamic_cache - self.conda_binary: str = config.balsamic.conda_binary - self.conda_env: str = config.balsamic.conda_env self.bed_path: str = config.balsamic.bed_path + self.binary_path: str = config.balsamic.binary_path self.cadd_path: str = config.balsamic.cadd_path + self.conda_binary: str = config.balsamic.conda_binary + self.conda_env: str = config.balsamic.conda_env + self.email: EmailStr = config.balsamic.slurm.mail_user self.genome_interval_path: str = config.balsamic.genome_interval_path - self.gnomad_af5_path: str = config.balsamic.gnomad_af5_path self.gens_coverage_female_path: str = config.balsamic.gens_coverage_female_path self.gens_coverage_male_path: str = config.balsamic.gens_coverage_male_path - self.email: EmailStr = config.balsamic.slurm.mail_user + self.gnomad_af5_path: str = config.balsamic.gnomad_af5_path self.loqusdb_path: str = config.balsamic.loqusdb_path self.pon_path: str = config.balsamic.pon_path self.qos: SlurmQos = config.balsamic.slurm.qos self.root_dir: str = config.balsamic.root + self.sentieon_licence_path: str = config.balsamic.sentieon_licence_path + self.sentieon_licence_server: str = config.sentieon_licence_server self.swegen_path: str = config.balsamic.swegen_path @property @@ -398,8 +399,12 @@ def get_parsed_observation_file_paths(self, observations: list[str]) -> dict: return verified_observations - def get_verified_gens_file_paths(self, sex: Sex) -> dict[str, str] | None: + def get_verified_gens_file_paths(self, sex: Sex, panel_bed: str) -> dict[str, str]: """Return a list of file path arguments for Gens.""" + if panel_bed: + return { + "gnomad_min_af5": self.gnomad_af5_path, + } return { "genome_interval": self.genome_interval_path, "gnomad_min_af5": self.gnomad_af5_path, @@ -459,11 +464,10 @@ def get_verified_config_case_arguments( config_case.update(self.get_verified_samples(case_id=case_id)) config_case.update(self.get_parsed_observation_file_paths(observations)) - ( - config_case.update(self.get_verified_gens_file_paths(sex=verified_sex)) - if not verified_panel_bed and genome_version == GenomeVersion.HG19 - else None - ) + if genome_version == GenomeVersion.HG19: + config_case.update( + self.get_verified_gens_file_paths(sex=verified_sex, panel_bed=verified_panel_bed) + ) return config_case @@ -547,6 +551,7 @@ def config_case( "--balsamic-cache": self.balsamic_cache, "--cache-version": cache_version, "--cadd-annotations": self.cadd_path, + "--artefact-snv-observations": arguments.get("artefact_somatic_snv"), "--cancer-germline-snv-observations": arguments.get("cancer_germline_snv"), "--cancer-germline-sv-observations": arguments.get("cancer_germline_sv"), "--cancer-somatic-snv-observations": arguments.get("cancer_somatic_snv"), @@ -564,12 +569,13 @@ def config_case( "--gnomad-min-af5": arguments.get("gnomad_min_af5"), "--normal-sample-name": arguments.get("normal_sample_name"), "--panel-bed": arguments.get("panel_bed"), - "--exome": arguments.get("exome"), "--pon-cnn": arguments.get("pon_cnn"), + "--exome": arguments.get("exome"), + "--sentieon-install-dir": self.sentieon_licence_path, + "--sentieon-license": self.sentieon_licence_server, "--swegen-snv": arguments.get("swegen_snv"), "--swegen-sv": arguments.get("swegen_sv"), "--tumor-sample-name": arguments.get("tumor_sample_name"), - "--umi-trim-length": arguments.get("umi_trim_length"), }, exclude_true=True, ) diff --git a/cg/models/balsamic/config.py b/cg/models/balsamic/config.py index 416d7a9734..1041177f58 100644 --- a/cg/models/balsamic/config.py +++ b/cg/models/balsamic/config.py @@ -102,22 +102,12 @@ class BalsamicConfigQC(BaseModel): """Config QC attributes. Attributes: - picard_rmdup: if the duplicates has been removed or not adapter: adapter sequence that has been trimmed - quality_trim: whether quality trimming has been performed in the workflow - adapter_trim: whether adapter trimming has been performed in the workflow - umi_trim: whether UMI trimming has been performed in the workflow min_seq_length: minimum sequence length cutoff for reads - umi_trim_length: UMI trimming length """ - picard_rmdup: bool - adapter: str | None = None - quality_trim: bool - adapter_trim: bool - umi_trim: bool - min_seq_length: str | None = None - umi_trim_length: str | None = None + adapter: str | None + min_seq_length: str | None class BalsamicVarCaller(BaseModel): diff --git a/tests/fixtures/apps/balsamic/tga_case/config.json b/tests/fixtures/apps/balsamic/tga_case/config.json index b9efc3c88a..ffa480fdf0 100644 --- a/tests/fixtures/apps/balsamic/tga_case/config.json +++ b/tests/fixtures/apps/balsamic/tga_case/config.json @@ -1,12 +1,7 @@ { "QC": { - "picard_rmdup": false, "adapter": "AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT", - "quality_trim": true, - "adapter_trim": true, - "umi_trim": true, - "min_seq_length": "25", - "umi_trim_length": "5" + "min_seq_length": "25" }, "vcf": { "manta": {