Skip to content

Commit 71e1e39

Browse files
committed
use mip-rna rna upload for tomte
1 parent 7caf7fb commit 71e1e39

File tree

8 files changed

+210
-13
lines changed

8 files changed

+210
-13
lines changed

cg/apps/scout/scoutapi.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,54 @@ def upload_rna_coverage_bigwig(
278278
"Something went wrong when uploading rna coverage bigwig file"
279279
) from error
280280

281+
282+
def upload_rna_fraser(
283+
self, file_path: str, case_id: str, customer_sample_id: str
284+
) -> None:
285+
"""Load a rna fraser file into a case in the database."""
286+
287+
upload_command: list[str] = [
288+
"update",
289+
"individual",
290+
"--case-id",
291+
case_id,
292+
"--ind",
293+
customer_sample_id,
294+
"--fraser",
295+
file_path,
296+
]
297+
try:
298+
LOG.info(f"Uploading rna fraser file {file_path} to case {case_id}")
299+
self.process.run_command(upload_command)
300+
except CalledProcessError as error:
301+
raise ScoutUploadError(
302+
"Something went wrong when uploading rna fraser file"
303+
) from error
304+
305+
def upload_rna_outrider(
306+
self, file_path: str, case_id: str, customer_sample_id: str
307+
) -> None:
308+
"""Load a rna outrider file into a case in the database."""
309+
310+
upload_command: list[str] = [
311+
"update",
312+
"individual",
313+
"--case-id",
314+
case_id,
315+
"--ind",
316+
customer_sample_id,
317+
"--outrider",
318+
file_path,
319+
]
320+
try:
321+
LOG.info(f"Uploading rna outrider file {file_path} to case {case_id}")
322+
self.process.run_command(upload_command)
323+
except CalledProcessError as error:
324+
raise ScoutUploadError(
325+
"Something went wrong when uploading rna outrider file"
326+
) from error
327+
328+
281329
def upload_rna_alignment_file(
282330
self, case_id: str, customer_sample_id: str, file_path: str
283331
) -> None:

cg/cli/upload/base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
create_scout_load_config,
2424
upload_case_to_scout,
2525
upload_multiqc_to_scout,
26+
upload_omics_to_scout,
2627
upload_rna_alignment_file_to_scout,
2728
upload_rna_fusion_report_to_scout,
2829
upload_rna_junctions_to_scout,
@@ -144,6 +145,7 @@ def upload_all_completed_analyses(context: click.Context, workflow: Workflow = N
144145
upload.add_command(upload_coverage)
145146
upload.add_command(upload_delivery_report_to_scout)
146147
upload.add_command(upload_genotypes)
148+
upload.add_command(upload_omics_to_scout)
147149
upload.add_command(upload_multiqc_to_scout)
148150
upload.add_command(upload_observations_to_loqusdb)
149151
upload.add_command(upload_rna_alignment_file_to_scout)

cg/cli/upload/scout.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from cg.meta.workflow.mip_dna import MipDNAAnalysisAPI
2222
from cg.meta.workflow.mip_rna import MipRNAAnalysisAPI
2323
from cg.meta.workflow.rnafusion import RnafusionAnalysisAPI
24+
from cg.meta.workflow.tomte import TomteAnalysisAPI
2425
from cg.models.cg_config import CGConfig
2526
from cg.models.scout.scout_load_config import ScoutLoadConfig
2627
from cg.store.models import Case
@@ -173,16 +174,18 @@ def validate_case_samples_are_rna(context: CGConfig, case_id: str) -> None:
173174
@click.option("-r", "--research", is_flag=True, help="Upload research report instead of clinical")
174175
@click.argument("case_id")
175176
@click.pass_context
176-
def upload_rna_to_scout(context, case_id: str, dry_run: bool, research: bool) -> None:
177+
def upload_rna_to_scout(context, case_id: str, dry_run: bool, research: bool, analysis: str) -> None:
177178
"""Upload an RNA case's gene fusion report and junction splice files for all samples connect via subject ID."""
178179
LOG.info("----------------- UPLOAD RNA TO SCOUT -----------------------")
179180

180181
context.invoke(validate_case_samples_are_rna, case_id=case_id)
181182
context.invoke(upload_rna_alignment_file_to_scout, case_id=case_id, dry_run=dry_run)
182183
context.invoke(upload_multiqc_to_scout, case_id=case_id, dry_run=dry_run)
183-
context.invoke(
184-
upload_rna_fusion_report_to_scout, case_id=case_id, dry_run=dry_run, research=research
185-
)
184+
if analysis != Workflow.TOMTE:
185+
context.invoke(
186+
upload_rna_fusion_report_to_scout, case_id=case_id, dry_run=dry_run, research=research
187+
)
188+
context.invoke(upload_omics_to_scout, case_id=case_id, dry_run=dry_run)
186189
context.invoke(upload_rna_junctions_to_scout, case_id=case_id, dry_run=dry_run)
187190

188191

@@ -228,6 +231,20 @@ def upload_rna_junctions_to_scout(context: CGConfig, case_id: str, dry_run: bool
228231
scout_upload_api.upload_rna_junctions_to_scout(dry_run=dry_run, case_id=case_id)
229232

230233

234+
@click.command(name="rna-omics-to-scout")
235+
@DRY_RUN
236+
@click.argument("case_id")
237+
@click.pass_obj
238+
def upload_omics_to_scout(context: CGConfig, case_id: str, dry_run: bool) -> None:
239+
"""Upload RNA omics files to Scout."""
240+
LOG.info("----------------- UPLOAD RNA OMICS TO SCOUT -----------------------")
241+
242+
scout_upload_api: UploadScoutAPI = context.meta_apis["upload_api"].scout_upload_api
243+
244+
scout_upload_api.upload_omics_to_scout(dry_run=dry_run, case_id=case_id)
245+
246+
247+
231248
@click.command(name="multiqc-to-scout")
232249
@DRY_RUN
233250
@click.argument("case_id")
@@ -267,6 +284,7 @@ def get_upload_api(case: Case, cg_config: CGConfig) -> UploadAPI:
267284
Workflow.MIP_RNA: MipRNAAnalysisAPI,
268285
Workflow.MIP_DNA: MipDNAAnalysisAPI,
269286
Workflow.RNAFUSION: RnafusionAnalysisAPI,
287+
Workflow.TOMTE: TomteAnalysisAPI,
270288
}
271289

272290
return UploadAPI(

cg/constants/housekeeper_tags.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,21 @@ class AnalysisTag(StrEnum):
6464

6565
ARRIBA: str = "arriba"
6666
ARRIBA_VISUALIZATION: str = "arriba-visualisation"
67+
BED: str = "bed"
68+
BIGWIG: str = "bigwig"
69+
CLINICAL: str = "clinical"
70+
COVERAGE: str = "coverage"
71+
FRASER: str = "fraser"
6772
FUSION: str = "fusion"
6873
FUSIONCATCHER: str = "fusioncatcher"
6974
FUSIONCATCHER_SUMMARY: str = "fusioncatcher-summary"
7075
FUSIONINSPECTOR: str = "fusioninspector"
7176
FUSIONINSPECTOR_HTML: str = "fusioninspector-html"
7277
FUSIONREPORT: str = "fusionreport"
7378
GENE_COUNTS: str = "gene-counts"
79+
JUNCTION: str = "junction"
7480
MULTIQC_HTML: str = "multiqc-html"
81+
OUTRIDER: str = "outrider"
7582
RESEARCH: str = "research"
7683
RNA: str = "rna"
7784
STARFUSION: str = "star-fusion"

cg/meta/upload/mip/mip_rna.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from cg.cli.upload.clinical_delivery import upload_clinical_delivery
99
from cg.cli.upload.scout import upload_rna_to_scout
10-
from cg.constants import DataDelivery
10+
from cg.constants import DataDelivery, Workflow
1111
from cg.meta.upload.upload_api import UploadAPI
1212
from cg.meta.workflow.mip_rna import MipRNAAnalysisAPI
1313
from cg.models.cg_config import CGConfig
@@ -34,7 +34,7 @@ def upload(self, ctx: click.Context, case: Case, restart: bool) -> None:
3434
# Scout specific upload
3535
if DataDelivery.SCOUT in case.data_delivery:
3636
try:
37-
ctx.invoke(upload_rna_to_scout, case_id=case.internal_id)
37+
ctx.invoke(upload_rna_to_scout, case_id=case.internal_id, analysis=Workflow.MIP_RNA)
3838
except CalledProcessError as error:
3939
LOG.error(error)
4040
return

cg/meta/upload/nf_analysis.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from cg.cli.generate.report.base import generate_delivery_report
99
from cg.cli.upload.clinical_delivery import upload_clinical_delivery
10+
from cg.cli.upload.scout import upload_rna_to_scout
1011
from cg.cli.upload.scout import upload_to_scout
1112
from cg.constants import (
1213
REPORT_SUPPORTED_DATA_DELIVERY,
@@ -46,7 +47,10 @@ def upload(self, ctx: click.Context, case: Case, restart: bool) -> None:
4647

4748
# Scout specific upload
4849
if DataDelivery.SCOUT in case.data_delivery:
49-
ctx.invoke(upload_to_scout, case_id=case.internal_id, re_upload=restart)
50+
if case.data_analysis == Workflow.TOMTE:
51+
ctx.invoke(upload_rna_to_scout, case_id=case.internal_id, re_upload=restart, analysis=case.data_analysis)
52+
else:
53+
ctx.invoke(upload_to_scout, case_id=case.internal_id, re_upload=restart)
5054
LOG.info(
5155
f"Upload of case {case.internal_id} was successful. Setting uploaded at to {dt.datetime.now()}"
5256
)

cg/meta/upload/scout/uploadscoutapi.py

Lines changed: 124 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from cg.apps.scout.scoutapi import ScoutAPI
1313
from cg.constants import HK_MULTIQC_HTML_TAG, Workflow
1414
from cg.constants.constants import FileFormat, PrepCategory
15-
from cg.constants.housekeeper_tags import AlignmentFileTag
15+
from cg.constants.housekeeper_tags import AlignmentFileTag, AnalysisTag
1616
from cg.constants.scout import ScoutCustomCaseReportTags
1717
from cg.exc import CgDataError, HousekeeperBundleVersionMissingError
1818
from cg.io.controller import WriteFile
@@ -132,18 +132,18 @@ def get_multiqc_html_report(
132132
def get_fusion_report(self, case_id: str, research: bool) -> File | None:
133133
"""Return a fusion report for a case in housekeeper."""
134134

135-
tags = {"fusion"}
135+
tags = {AnalysisTag.FUSION}
136136
if research:
137-
tags.add("research")
137+
tags.add(AnalysisTag.RESEARCH)
138138
else:
139-
tags.add("clinical")
139+
tags.add(AnalysisTag.CLINICAL)
140140

141141
return self.housekeeper.get_file_from_latest_version(bundle_name=case_id, tags=tags)
142142

143143
def get_splice_junctions_bed(self, case_id: str, sample_id: str) -> File | None:
144144
"""Return a splice junctions bed file for a case in Housekeeper."""
145145

146-
tags: set[str] = {"junction", "bed", sample_id}
146+
tags: set[str] = {AnalysisTag.JUNCTION, AnalysisTag.BED, sample_id}
147147
splice_junctions_bed: File | None = None
148148
try:
149149
splice_junctions_bed = self.housekeeper.get_file_from_latest_version(
@@ -156,11 +156,22 @@ def get_splice_junctions_bed(self, case_id: str, sample_id: str) -> File | None:
156156

157157
def get_rna_coverage_bigwig(self, case_id: str, sample_id: str) -> File | None:
158158
"""Return an RNA coverage bigwig file for a case in Housekeeper."""
159+
tags: set[str] = {AnalysisTag.COVERAGE, AnalysisTag.BIGWIG, sample_id}
160+
return self.housekeeper.get_file_from_latest_version(bundle_name=case_id, tags=tags)
161+
162+
163+
def get_rna_omics_fraser(self, case_id: str, sample_id: str) -> File | None:
164+
"""Return an fraser file for a case in Housekeeper."""
165+
tags: set[str] = {AnalysisTag.COVERAGE, AnalysisTag.FRASER, sample_id}
166+
return self.housekeeper.get_file_from_latest_version(bundle_name=case_id, tags=tags)
159167

160-
tags: set[str] = {"coverage", "bigwig", sample_id}
161168

169+
def get_rna_omics_outrider(self, case_id: str, sample_id: str) -> File | None:
170+
"""Return an outrider file for a case in Housekeeper."""
171+
tags: set[str] = {AnalysisTag.COVERAGE, AnalysisTag.OUTRIDER, sample_id}
162172
return self.housekeeper.get_file_from_latest_version(bundle_name=case_id, tags=tags)
163173

174+
164175
def get_unique_dna_cases_related_to_rna_case(self, case_id: str) -> set[str]:
165176
"""Return a set of unique DNA cases related to an RNA case."""
166177
case: Case = self.status_db.get_case_by_internal_id(case_id)
@@ -326,6 +337,82 @@ def upload_rna_coverage_bigwig_to_scout(self, case_id: str, dry_run: bool) -> No
326337
LOG.info(upload_statement)
327338
LOG.info("Upload RNA coverage bigwig file finished!")
328339

340+
341+
def upload_rna_fraser_to_scout(self, dry_run: bool, case_id: str) -> None:
342+
"""Upload omics fraser file for a case to Scout."""
343+
status_db: Store = self.status_db
344+
rna_case = status_db.get_case_by_internal_id(case_id)
345+
rna_dna_collections: list[RNADNACollection] = self.create_rna_dna_collections(rna_case)
346+
for rna_dna_collection in rna_dna_collections:
347+
rna_sample_internal_id: str = rna_dna_collection.rna_sample_internal_id
348+
dna_sample_name: str = rna_dna_collection.dna_sample_name
349+
rna_fraser: File | None = self.get_rna_omics_fraser(
350+
case_id=case_id, sample_id=rna_sample_internal_id
351+
)
352+
353+
if not rna_fraser:
354+
raise FileNotFoundError(
355+
f"No RNA fraser file was found in housekeeper for {rna_sample_internal_id}."
356+
)
357+
358+
LOG.debug(f"RNA fraser file {rna_fraser.path} found.")
359+
for dna_case_id in rna_dna_collection.dna_case_ids:
360+
LOG.info(
361+
f"Uploading RNA fraser file for sample {dna_sample_name} "
362+
f"in case {dna_case_id} in Scout."
363+
)
364+
365+
if dry_run:
366+
continue
367+
368+
self.scout_api.upload_rna_fraser(
369+
file_path=rna_fraser.full_path,
370+
case_id=dna_case_id,
371+
customer_sample_id=dna_sample_name,
372+
)
373+
374+
for upload_statement in self.get_rna_fraser_upload_summary(rna_dna_collections):
375+
LOG.info(upload_statement)
376+
LOG.info("Upload RNA fraser file finished!")
377+
378+
379+
def upload_rna_outrider_to_scout(self, dry_run: bool, case_id: str) -> None:
380+
"""Upload omics outrider file for a case to Scout."""
381+
status_db: Store = self.status_db
382+
rna_case = status_db.get_case_by_internal_id(case_id)
383+
rna_dna_collections: list[RNADNACollection] = self.create_rna_dna_collections(rna_case)
384+
for rna_dna_collection in rna_dna_collections:
385+
rna_sample_internal_id: str = rna_dna_collection.rna_sample_internal_id
386+
dna_sample_name: str = rna_dna_collection.dna_sample_name
387+
rna_outrider: File | None = self.get_rna_omics_outrider(
388+
case_id=case_id, sample_id=rna_sample_internal_id
389+
)
390+
if not rna_outrider:
391+
raise FileNotFoundError(
392+
f"No RNA outrider file was found in housekeeper for {rna_sample_internal_id}."
393+
)
394+
395+
LOG.debug(f"RNA outrider file {rna_outrider.path} found.")
396+
for dna_case_id in rna_dna_collection.dna_case_ids:
397+
LOG.info(
398+
f"Uploading RNA outrider file for sample {dna_sample_name} "
399+
f"in case {dna_case_id} in Scout."
400+
)
401+
402+
if dry_run:
403+
continue
404+
405+
self.scout_api.upload_rna_outrider(
406+
file_path=rna_outrider.full_path,
407+
case_id=dna_case_id,
408+
customer_sample_id=dna_sample_name,
409+
)
410+
for upload_statement in self.get_rna_outrider_upload_summary(rna_dna_collections):
411+
LOG.info(upload_statement)
412+
LOG.info("Upload RNA outrider file finished!")
413+
414+
415+
329416
def upload_splice_junctions_bed_to_scout(self, dry_run: bool, case_id: str) -> None:
330417
"""Upload splice_junctions_bed file for a case to Scout."""
331418

@@ -400,11 +487,42 @@ def get_rna_bigwig_coverage_upload_summary(
400487
)
401488
return upload_summary
402489

490+
@staticmethod
491+
def get_rna_fraser_upload_summary(
492+
rna_dna_collections: list[RNADNACollection],
493+
) -> list[str]:
494+
upload_summary: list[str] = []
495+
for rna_dna_collection in rna_dna_collections:
496+
upload_summary.extend(
497+
f"Uploaded fraser coverage file for sample {rna_dna_collection.dna_sample_name} in case {dna_case}."
498+
for dna_case in rna_dna_collection.dna_case_ids
499+
)
500+
return upload_summary
501+
502+
@staticmethod
503+
def get_rna_outrider_upload_summary(
504+
rna_dna_collections: list[RNADNACollection],
505+
) -> list[str]:
506+
upload_summary: list[str] = []
507+
for rna_dna_collection in rna_dna_collections:
508+
upload_summary.extend(
509+
f"Uploaded outrider coverage file for sample {rna_dna_collection.dna_sample_name} in case {dna_case}."
510+
for dna_case in rna_dna_collection.dna_case_ids
511+
)
512+
return upload_summary
513+
403514
def upload_rna_junctions_to_scout(self, dry_run: bool, case_id: str) -> None:
404515
"""Upload RNA junctions splice files to Scout."""
405516
self.upload_splice_junctions_bed_to_scout(dry_run=dry_run, case_id=case_id)
406517
self.upload_rna_coverage_bigwig_to_scout(case_id=case_id, dry_run=dry_run)
407518

519+
520+
def upload_omics_to_scout(self, dry_run: bool, case_id: str) -> None:
521+
"""Upload RNA omics files to Scout."""
522+
self.upload_rna_fraser_to_scout(dry_run=dry_run, case_id=case_id)
523+
self.upload_rna_outrider_to_scout(case_id=case_id, dry_run=dry_run)
524+
525+
408526
def get_config_builder(self, analysis, hk_version) -> ScoutConfigBuilder:
409527
config_builders = {
410528
Workflow.BALSAMIC: BalsamicConfigBuilder(

cg/meta/upload/tomte/tomte.py

Whitespace-only changes.

0 commit comments

Comments
 (0)