Skip to content

Commit

Permalink
Merge branch 'master' into metrics-deliver
Browse files Browse the repository at this point in the history
  • Loading branch information
sofstam authored Dec 11, 2023
2 parents 6566d67 + f2aca7f commit 72f1dd3
Show file tree
Hide file tree
Showing 34 changed files with 320 additions and 61 deletions.
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 54.1.2
current_version = 54.2.0
commit = True
tag = True
tag_name = v{new_version}
Expand Down
2 changes: 1 addition & 1 deletion cg/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
__title__ = "cg"
__version__ = "54.1.2"
__version__ = "54.2.0"
16 changes: 15 additions & 1 deletion cg/apps/scout/scoutapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from cg.apps.scout.scout_export import ScoutExportCase, Variant
from cg.constants.constants import FileFormat
from cg.constants.gene_panel import GENOME_BUILD_37
from cg.constants.scout_upload import ScoutCustomCaseReportTags
from cg.constants.scout import ScoutCustomCaseReportTags
from cg.exc import ScoutUploadError
from cg.io.controller import ReadFile, ReadStream
from cg.models.scout.scout_load_config import ScoutLoadConfig
Expand Down Expand Up @@ -69,6 +69,20 @@ def export_panels(self, panels: list[str], build: str = GENOME_BUILD_37) -> list

return list(self.process.stdout_lines())

def export_managed_variants(self, genome_build: str = GENOME_BUILD_37) -> list[str]:
"""Export a list of managed variants."""
export_command = ["export", "managed"]
if genome_build:
export_command.extend(["--build", genome_build])
try:
self.process.run_command(export_command)
if not self.process.stdout:
return []
except CalledProcessError:
LOG.info("Could not export managed variants")
return []
return list(self.process.stdout_lines())

def get_genes(self, panel_id: str, build: str = None) -> list[dict]:
"""Return panel genes."""
export_panel_command = ["export", "panel", panel_id]
Expand Down
2 changes: 1 addition & 1 deletion cg/cli/upload/scout.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from cg.cli.upload.utils import suggest_cases_to_upload
from cg.constants import Pipeline
from cg.constants.constants import FileFormat
from cg.constants.scout_upload import ScoutCustomCaseReportTags
from cg.constants.scout import ScoutCustomCaseReportTags
from cg.io.controller import WriteStream
from cg.meta.upload.scout.uploadscoutapi import UploadScoutAPI
from cg.meta.upload.upload_api import UploadAPI
Expand Down
6 changes: 6 additions & 0 deletions cg/cli/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import click


def echo_lines(lines: list[str]) -> None:
for line in lines:
click.echo(line)
21 changes: 19 additions & 2 deletions cg/cli/workflow/mip/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import click

from cg.apps.environ import environ_email
from cg.cli.utils import echo_lines
from cg.cli.workflow.commands import link
from cg.cli.workflow.mip.options import (
ARGUMENT_CASE_ID,
Expand Down Expand Up @@ -59,12 +60,27 @@ def panel(context: CGConfig, case_id: str, dry_run: bool) -> None:

bed_lines: list[str] = analysis_api.get_gene_panel(case_id=case_id)
if dry_run:
for bed_line in bed_lines:
click.echo(bed_line)
echo_lines(lines=bed_lines)
return
analysis_api.write_panel(case_id, bed_lines)


@click.command()
@OPTION_DRY
@ARGUMENT_CASE_ID
@click.pass_obj
def managed_variants(context: CGConfig, case_id: str, dry_run: bool) -> None:
"""Write managed variants file exported from Scout."""

analysis_api: MipAnalysisAPI = context.meta_apis["analysis_api"]
analysis_api.status_db.verify_case_exists(case_internal_id=case_id)
vcf_lines: list[str] = analysis_api.get_managed_variants()
if dry_run:
echo_lines(lines=vcf_lines)
return
analysis_api.write_managed_variants(case_id=case_id, content=vcf_lines)


@click.command()
@QOS_OPTION
@EMAIL_OPTION
Expand Down Expand Up @@ -164,6 +180,7 @@ def start(
analysis_api.prepare_fastq_files(case_id=case_id, dry_run=dry_run)
context.invoke(link, case_id=case_id, dry_run=dry_run)
context.invoke(panel, case_id=case_id, dry_run=dry_run)
context.invoke(managed_variants, case_id=case_id, dry_run=dry_run)
context.invoke(config_case, case_id=case_id, panel_bed=panel_bed, dry_run=dry_run)
context.invoke(
run,
Expand Down
10 changes: 9 additions & 1 deletion cg/cli/workflow/mip_dna/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,14 @@
store,
store_available,
)
from cg.cli.workflow.mip.base import config_case, panel, run, start, start_available
from cg.cli.workflow.mip.base import (
config_case,
managed_variants,
panel,
run,
start,
start_available,
)
from cg.meta.workflow.analysis import AnalysisAPI
from cg.meta.workflow.mip_dna import MipDNAAnalysisAPI

Expand All @@ -33,6 +40,7 @@ def mip_dna(
config_case,
ensure_flow_cells_on_disk,
link,
managed_variants,
panel,
resolve_compression,
run,
Expand Down
21 changes: 19 additions & 2 deletions cg/cli/workflow/raredisease/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import click

from cg.cli.utils import echo_lines
from cg.cli.workflow.commands import ARGUMENT_CASE_ID, OPTION_DRY
from cg.constants.constants import MetaApis
from cg.meta.workflow.analysis import AnalysisAPI
Expand Down Expand Up @@ -35,7 +36,23 @@ def panel(context: CGConfig, case_id: str, dry_run: bool) -> None:

bed_lines: list[str] = analysis_api.get_gene_panel(case_id=case_id)
if dry_run:
for bed_line in bed_lines:
click.echo(bed_line)
echo_lines(lines=bed_lines)
return
analysis_api.write_panel(case_id=case_id, content=bed_lines)


@raredisease.command("managed-variants")
@OPTION_DRY
@ARGUMENT_CASE_ID
@click.pass_obj
def managed_variants(context: CGConfig, case_id: str, dry_run: bool) -> None:
"""Write managed variants file exported from Scout."""

analysis_api: RarediseaseAnalysisAPI = context.meta_apis["analysis_api"]
analysis_api.status_db.verify_case_exists(case_internal_id=case_id)

vcf_lines: list[str] = analysis_api.get_managed_variants()
if dry_run:
echo_lines(lines=vcf_lines)
return
analysis_api.write_managed_variants(case_id=case_id, content=vcf_lines)
4 changes: 2 additions & 2 deletions cg/constants/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class CaseActions(StrEnum):

@classmethod
def actions(cls) -> list[str]:
return list(cls)
return list(map(lambda action: action.value, cls))


CONTAINER_OPTIONS = ("Tube", "96 well plate", "No container")
Expand Down Expand Up @@ -71,7 +71,7 @@ class FlowCellStatus(StrEnum):

@classmethod
def statuses(cls) -> list[str]:
return list(cls)
return list(map(lambda status: status.value, cls))


class AnalysisType(StrEnum):
Expand Down
2 changes: 1 addition & 1 deletion cg/constants/gene_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class GenePanelMasterList(StrEnum):
@classmethod
def get_panel_names(cls, panels=None) -> list[str]:
"""Return requested panel names from the Master list, or all panels if none are specified."""
return list(panels) if panels else list(cls)
return list(panels) if panels else list(map(lambda panel: panel.value, cls))

@staticmethod
def collaborators() -> set[str]:
Expand Down
2 changes: 1 addition & 1 deletion cg/constants/housekeeper_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class AlignmentFileTag(StrEnum):

@classmethod
def file_tags(cls) -> list[str]:
return list(cls)
return list(map(lambda tag: tag.value, cls))


class ArchiveTag(StrEnum):
Expand Down
6 changes: 6 additions & 0 deletions cg/constants/scout_upload.py → cg/constants/scout.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from enum import StrEnum

from cg.constants import FileExtensions
from cg.constants.housekeeper_tags import AlignmentFileTag


Expand All @@ -8,6 +9,11 @@ class GenomeBuild(StrEnum):
hg38: str = "38"


class ScoutExportFileName(StrEnum):
MANAGED_VARIANTS: str = f"managed_variants{FileExtensions.VCF}"
PANELS: str = f"gene_panels{FileExtensions.BED}"


class ScoutCustomCaseReportTags(StrEnum):
DELIVERY: str = "delivery_report"
CNV: str = "cnv_report"
Expand Down
4 changes: 1 addition & 3 deletions cg/meta/report/balsamic.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import logging

from housekeeper.store.models import File, Version

from cg.constants import (
BALSAMIC_ANALYSIS_TYPE,
BALSAMIC_REPORT_ACCREDITED_PANELS,
Expand All @@ -19,7 +17,7 @@
REQUIRED_SAMPLE_TIMESTAMP_FIELDS,
Pipeline,
)
from cg.constants.scout_upload import BALSAMIC_CASE_TAGS
from cg.constants.scout import BALSAMIC_CASE_TAGS
from cg.meta.report.field_validators import get_million_read_pairs
from cg.meta.report.report_api import ReportAPI
from cg.meta.workflow.balsamic import BalsamicAnalysisAPI
Expand Down
2 changes: 1 addition & 1 deletion cg/meta/report/balsamic_umi.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import logging

from cg.constants.scout_upload import BALSAMIC_UMI_CASE_TAGS
from cg.constants.scout import BALSAMIC_UMI_CASE_TAGS
from cg.meta.report.balsamic import BalsamicReportAPI
from cg.meta.workflow.balsamic_umi import BalsamicUmiAnalysisAPI
from cg.models.cg_config import CGConfig
Expand Down
2 changes: 1 addition & 1 deletion cg/meta/report/mip_dna.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
REQUIRED_SAMPLE_TIMESTAMP_FIELDS,
Pipeline,
)
from cg.constants.scout_upload import MIP_CASE_TAGS
from cg.constants.scout import MIP_CASE_TAGS
from cg.meta.report.field_validators import get_million_read_pairs
from cg.meta.report.report_api import ReportAPI
from cg.meta.workflow.mip_dna import MipDNAAnalysisAPI
Expand Down
7 changes: 5 additions & 2 deletions cg/meta/report/rnafusion.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,11 @@
Pipeline,
)
from cg.constants.constants import GenomeVersion
from cg.constants.scout_upload import RNAFUSION_CASE_TAGS
from cg.meta.report.field_validators import get_mapped_reads_fraction, get_million_read_pairs
from cg.constants.scout import RNAFUSION_CASE_TAGS
from cg.meta.report.field_validators import (
get_mapped_reads_fraction,
get_million_read_pairs,
)
from cg.meta.report.report_api import ReportAPI
from cg.meta.workflow.rnafusion import RnafusionAnalysisAPI
from cg.models.analysis import AnalysisModel
Expand Down
2 changes: 1 addition & 1 deletion cg/meta/upload/scout/balsamic_config_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from cg.apps.lims import LimsAPI
from cg.constants.constants import SampleType
from cg.constants.scout_upload import BALSAMIC_CASE_TAGS, BALSAMIC_SAMPLE_TAGS
from cg.constants.scout import BALSAMIC_CASE_TAGS, BALSAMIC_SAMPLE_TAGS
from cg.constants.subject import PhenotypeStatus
from cg.meta.upload.scout.hk_tags import CaseTags, SampleTags
from cg.meta.upload.scout.scout_config_builder import ScoutConfigBuilder
Expand Down
2 changes: 1 addition & 1 deletion cg/meta/upload/scout/balsamic_umi_config_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from housekeeper.store.models import Version

from cg.apps.lims import LimsAPI
from cg.constants.scout_upload import BALSAMIC_UMI_CASE_TAGS, BALSAMIC_UMI_SAMPLE_TAGS
from cg.constants.scout import BALSAMIC_UMI_CASE_TAGS, BALSAMIC_UMI_SAMPLE_TAGS
from cg.meta.upload.scout.balsamic_config_builder import BalsamicConfigBuilder
from cg.meta.upload.scout.hk_tags import CaseTags, SampleTags
from cg.models.scout.scout_load_config import (
Expand Down
2 changes: 1 addition & 1 deletion cg/meta/upload/scout/mip_config_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from cg.apps.lims import LimsAPI
from cg.apps.madeline.api import MadelineAPI
from cg.constants.scout_upload import MIP_CASE_TAGS, MIP_SAMPLE_TAGS
from cg.constants.scout import MIP_CASE_TAGS, MIP_SAMPLE_TAGS
from cg.constants.subject import RelationshipStatus
from cg.meta.upload.scout.hk_tags import CaseTags, SampleTags
from cg.meta.upload.scout.scout_config_builder import ScoutConfigBuilder
Expand Down
2 changes: 1 addition & 1 deletion cg/meta/upload/scout/rnafusion_config_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from cg.apps.lims import LimsAPI
from cg.constants.constants import PrepCategory
from cg.constants.scout_upload import RNAFUSION_CASE_TAGS, RNAFUSION_SAMPLE_TAGS, GenomeBuild
from cg.constants.scout import RNAFUSION_CASE_TAGS, RNAFUSION_SAMPLE_TAGS, GenomeBuild
from cg.meta.upload.scout.hk_tags import CaseTags, SampleTags
from cg.meta.upload.scout.scout_config_builder import ScoutConfigBuilder
from cg.models.scout.scout_load_config import (
Expand Down
2 changes: 1 addition & 1 deletion cg/meta/upload/scout/uploadscoutapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from cg.apps.scout.scoutapi import ScoutAPI
from cg.constants import HK_MULTIQC_HTML_TAG, Pipeline
from cg.constants.constants import FileFormat, PrepCategory
from cg.constants.scout_upload import ScoutCustomCaseReportTags
from cg.constants.scout import ScoutCustomCaseReportTags
from cg.exc import CgDataError, HousekeeperBundleVersionMissingError
from cg.io.controller import WriteFile
from cg.meta.upload.scout.balsamic_config_builder import BalsamicConfigBuilder
Expand Down
33 changes: 32 additions & 1 deletion cg/meta/workflow/analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,16 @@

from cg.apps.environ import environ_email
from cg.constants import EXIT_FAIL, EXIT_SUCCESS, Pipeline, Priority
from cg.constants.constants import AnalysisType, CaseActions, WorkflowManager
from cg.constants.constants import (
AnalysisType,
CaseActions,
FileFormat,
WorkflowManager,
)
from cg.constants.gene_panel import GenePanelCombo
from cg.constants.scout import ScoutExportFileName
from cg.exc import AnalysisNotReadyError, BundleAlreadyAddedError, CgDataError, CgError
from cg.io.controller import WriteFile
from cg.meta.meta import MetaAPI
from cg.meta.workflow.fastq import FastqHandler
from cg.models.analysis import AnalysisModel
Expand Down Expand Up @@ -509,10 +516,34 @@ def prepare_fastq_files(self, case_id: str, dry_run: bool) -> None:
if not self.is_case_ready_for_analysis(case_id):
raise AnalysisNotReadyError("FASTQ file are not present for the analysis to start")

@staticmethod
def _write_managed_variants(out_dir: Path, content: list[str]) -> None:
"""Write the managed variants to case dir."""
out_dir.mkdir(parents=True, exist_ok=True)
WriteFile.write_file_from_content(
content="\n".join(content),
file_format=FileFormat.TXT,
file_path=Path(out_dir, ScoutExportFileName.MANAGED_VARIANTS),
)

@staticmethod
def _write_panel(out_dir: Path, content: list[str]) -> None:
"""Write the managed variants to case dir."""
out_dir.mkdir(parents=True, exist_ok=True)
WriteFile.write_file_from_content(
content="\n".join(content),
file_format=FileFormat.TXT,
file_path=Path(out_dir, ScoutExportFileName.PANELS),
)

def _get_gene_panel(self, case_id: str, genome_build: str) -> list[str]:
"""Create and return the aggregated gene panel file."""
case: Case = self.status_db.get_case_by_internal_id(internal_id=case_id)
all_panels: list[str] = self.get_aggregated_panels(
customer_id=case.customer.internal_id, default_panels=set(case.panels)
)
return self.scout_api.export_panels(build=genome_build, panels=all_panels)

def _get_managed_variants(self, genome_build: str) -> list[str]:
"""Create and return the managed variants."""
return self.scout_api.export_managed_variants(genome_build=genome_build)
2 changes: 1 addition & 1 deletion cg/meta/workflow/fluffy.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class FluffySampleSheetHeaders(StrEnum):

@classmethod
def headers(cls) -> list[str]:
return list(cls)
return list(map(lambda header: header.value, cls))


class FluffySample(BaseModel):
Expand Down
8 changes: 1 addition & 7 deletions cg/meta/workflow/mip.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,13 +152,7 @@ def link_fastq_files(self, case_id: str, dry_run: bool = False) -> None:

def write_panel(self, case_id: str, content: list[str]) -> None:
"""Write the gene panel to case dir."""
out_dir = Path(self.root, case_id)
out_dir.mkdir(parents=True, exist_ok=True)
WriteFile.write_file_from_content(
content="\n".join(content),
file_format=FileFormat.TXT,
file_path=Path(out_dir, f"gene_panels{FileExtensions.BED}"),
)
self._write_panel(out_dir=Path(self.root, case_id), content=content)

@staticmethod
def get_aggregated_panels(customer_id: str, default_panels: set[str]) -> list[str]:
Expand Down
Loading

0 comments on commit 72f1dd3

Please sign in to comment.