cg 83.15.1__py3-none-any.whl → 83.15.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cg/__init__.py +1 -1
- cg/exc.py +11 -0
- cg/services/analysis_starter/analysis_starter.py +11 -1
- cg/services/analysis_starter/configurator/implementations/balsamic.py +16 -1
- cg/services/analysis_starter/factories/configurator_factory.py +1 -0
- {cg-83.15.1.dist-info → cg-83.15.3.dist-info}/METADATA +1 -1
- {cg-83.15.1.dist-info → cg-83.15.3.dist-info}/RECORD +9 -9
- {cg-83.15.1.dist-info → cg-83.15.3.dist-info}/WHEEL +0 -0
- {cg-83.15.1.dist-info → cg-83.15.3.dist-info}/entry_points.txt +0 -0
cg/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
__title__ = "cg"
|
|
2
|
-
__version__ = "83.15.
|
|
2
|
+
__version__ = "83.15.3"
|
cg/exc.py
CHANGED
|
@@ -348,6 +348,13 @@ class CaseNotConfiguredError(CgError):
|
|
|
348
348
|
"""Exception raised when a case is being run without a configuration."""
|
|
349
349
|
|
|
350
350
|
|
|
351
|
+
class CaseWorkflowMismatchError(CgError):
|
|
352
|
+
"""
|
|
353
|
+
Exception raised when a case is being run with a workflow different from the one specified
|
|
354
|
+
for it in the database.
|
|
355
|
+
"""
|
|
356
|
+
|
|
357
|
+
|
|
351
358
|
class MissingConfigFilesError(CgError):
|
|
352
359
|
"""Exception raised when a case is being run with missing configuration files."""
|
|
353
360
|
|
|
@@ -356,5 +363,9 @@ class SeqeraError(CgError):
|
|
|
356
363
|
"""Exception raised when receiving an unexpected response from Seqera platform"""
|
|
357
364
|
|
|
358
365
|
|
|
366
|
+
class MultipleCaptureKitsError(CgError):
|
|
367
|
+
"""Exception raised when multiple capture kits are found where only one is expected."""
|
|
368
|
+
|
|
369
|
+
|
|
359
370
|
class ApplicationDoesNotHaveHiFiYieldError(CgError):
|
|
360
371
|
"""Exception raised when application does not have HiFi yield set."""
|
|
@@ -4,7 +4,7 @@ from subprocess import CalledProcessError
|
|
|
4
4
|
from requests import HTTPError
|
|
5
5
|
|
|
6
6
|
from cg.constants import Workflow
|
|
7
|
-
from cg.exc import AnalysisNotReadyError, SeqeraError
|
|
7
|
+
from cg.exc import AnalysisNotReadyError, CaseWorkflowMismatchError, SeqeraError
|
|
8
8
|
from cg.services.analysis_starter.configurator.abstract_model import CaseConfig
|
|
9
9
|
from cg.services.analysis_starter.configurator.configurator import Configurator
|
|
10
10
|
from cg.services.analysis_starter.input_fetcher.input_fetcher import InputFetcher
|
|
@@ -51,6 +51,7 @@ class AnalysisStarter:
|
|
|
51
51
|
def start(self, case_id: str, **flags) -> None:
|
|
52
52
|
"""Fetches raw data, generates configuration files and runs the specified case."""
|
|
53
53
|
LOG.info(f"Starting case {case_id}")
|
|
54
|
+
self._ensure_case_matches_workflow(case_id)
|
|
54
55
|
self.tracker.ensure_analysis_not_ongoing(case_id)
|
|
55
56
|
self.input_fetcher.ensure_files_are_ready(case_id)
|
|
56
57
|
case_config: CaseConfig = self.configurator.configure(case_id=case_id, **flags)
|
|
@@ -58,6 +59,7 @@ class AnalysisStarter:
|
|
|
58
59
|
|
|
59
60
|
def run(self, case_id: str, **flags) -> None:
|
|
60
61
|
"""Run a case using an assumed existing configuration."""
|
|
62
|
+
self._ensure_case_matches_workflow(case_id)
|
|
61
63
|
self.tracker.ensure_analysis_not_ongoing(case_id)
|
|
62
64
|
case_config: CaseConfig = self.configurator.get_config(case_id=case_id, **flags)
|
|
63
65
|
self._run_and_track(case_id=case_id, case_config=case_config)
|
|
@@ -70,3 +72,11 @@ class AnalysisStarter:
|
|
|
70
72
|
except (CalledProcessError, HTTPError, SeqeraError) as exception:
|
|
71
73
|
self.tracker.set_case_as_not_running(case_id)
|
|
72
74
|
raise exception
|
|
75
|
+
|
|
76
|
+
def _ensure_case_matches_workflow(self, case_id: str) -> None:
|
|
77
|
+
case: Case = self.store.get_case_by_internal_id_strict(case_id)
|
|
78
|
+
if case.data_analysis != self.workflow:
|
|
79
|
+
raise CaseWorkflowMismatchError(
|
|
80
|
+
f"Case {case_id} is assigned to workflow {case.data_analysis}, "
|
|
81
|
+
f"not {self.workflow}."
|
|
82
|
+
)
|
|
@@ -2,8 +2,9 @@ import logging
|
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
from typing import cast
|
|
4
4
|
|
|
5
|
+
from cg.apps.lims.api import LimsAPI
|
|
5
6
|
from cg.constants.priority import SlurmQos
|
|
6
|
-
from cg.exc import CaseNotConfiguredError
|
|
7
|
+
from cg.exc import CaseNotConfiguredError, MultipleCaptureKitsError
|
|
7
8
|
from cg.meta.workflow.fastq import BalsamicFastqHandler
|
|
8
9
|
from cg.models.cg_config import BalsamicConfig
|
|
9
10
|
from cg.services.analysis_starter.configurator.configurator import Configurator
|
|
@@ -11,6 +12,7 @@ from cg.services.analysis_starter.configurator.file_creators.balsamic_config imp
|
|
|
11
12
|
BalsamicConfigFileCreator,
|
|
12
13
|
)
|
|
13
14
|
from cg.services.analysis_starter.configurator.models.balsamic import BalsamicCaseConfig
|
|
15
|
+
from cg.store.models import Case
|
|
14
16
|
from cg.store.store import Store
|
|
15
17
|
|
|
16
18
|
LOG = logging.getLogger(__name__)
|
|
@@ -22,6 +24,7 @@ class BalsamicConfigurator(Configurator):
|
|
|
22
24
|
config: BalsamicConfig,
|
|
23
25
|
config_file_creator: BalsamicConfigFileCreator,
|
|
24
26
|
fastq_handler: BalsamicFastqHandler,
|
|
27
|
+
lims_api: LimsAPI,
|
|
25
28
|
store: Store,
|
|
26
29
|
):
|
|
27
30
|
self.store: Store = store
|
|
@@ -35,9 +38,11 @@ class BalsamicConfigurator(Configurator):
|
|
|
35
38
|
|
|
36
39
|
self.fastq_handler: BalsamicFastqHandler = fastq_handler
|
|
37
40
|
self.config_file_creator: BalsamicConfigFileCreator = config_file_creator
|
|
41
|
+
self.lims_api = lims_api
|
|
38
42
|
|
|
39
43
|
def configure(self, case_id: str, **flags) -> BalsamicCaseConfig:
|
|
40
44
|
LOG.info(f"Configuring case {case_id}")
|
|
45
|
+
self._ensure_consistent_capture_kits(case_id)
|
|
41
46
|
self.fastq_handler.link_fastq_files(case_id)
|
|
42
47
|
fastq_path: Path = self.fastq_handler.get_fastq_dir(case_id)
|
|
43
48
|
self.config_file_creator.create(case_id=case_id, fastq_path=fastq_path, **flags)
|
|
@@ -61,6 +66,16 @@ class BalsamicConfigurator(Configurator):
|
|
|
61
66
|
def _get_sample_config_path(self, case_id: str) -> Path:
|
|
62
67
|
return Path(self.root_dir, case_id, f"{case_id}.json")
|
|
63
68
|
|
|
69
|
+
def _ensure_consistent_capture_kits(self, case_id):
|
|
70
|
+
case: Case = self.store.get_case_by_internal_id_strict(case_id)
|
|
71
|
+
capture_kits: set[str | None] = {
|
|
72
|
+
self.lims_api.capture_kit(sample.internal_id) for sample in case.samples
|
|
73
|
+
}
|
|
74
|
+
if len(capture_kits) > 1:
|
|
75
|
+
raise MultipleCaptureKitsError(
|
|
76
|
+
f"Multiple capture kits found for {case_id}: {capture_kits}"
|
|
77
|
+
)
|
|
78
|
+
|
|
64
79
|
def _ensure_required_config_files_exist(self, config: BalsamicCaseConfig) -> None:
|
|
65
80
|
if not config.sample_config.exists():
|
|
66
81
|
raise CaseNotConfiguredError(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
cg/__init__.py,sha256=
|
|
1
|
+
cg/__init__.py,sha256=wv-WioAcstp0tI-e4BA-fOP5yyUjNNdpVHMGeppa8R0,41
|
|
2
2
|
cg/apps/__init__.py,sha256=pYf0vxo4iYQqURzFRYzqpOCdV8Cm9MWx0GHvJOz0EMg,315
|
|
3
3
|
cg/apps/coverage/__init__.py,sha256=dJtsmNf8tODE2-VEomMIoYA7ugLYZAk_upsfOQCZeF8,27
|
|
4
4
|
cg/apps/coverage/api.py,sha256=e_ozC3QeNKoEfpjjMaL-XjeBLtz-JySWccrtw0E9mLM,2940
|
|
@@ -225,7 +225,7 @@ cg/constants/slurm.py,sha256=_Y_InISKpGKT-oVMnES7k7Csz2G1l52MNtJwBZm0prI,313
|
|
|
225
225
|
cg/constants/subject.py,sha256=EE26Emu6T3_HWvsWeuI5GRGGIvB0BwCjN53KHrsr18U,577
|
|
226
226
|
cg/constants/symbols.py,sha256=c06D1mYFWstZbVEgiby2lUNriswUPVRU5TnSSy889tY,71
|
|
227
227
|
cg/constants/tb.py,sha256=UJHdsu109oR_zxvQrko9SqFANiSUn_UJTw5BFebWcds,621
|
|
228
|
-
cg/exc.py,sha256=
|
|
228
|
+
cg/exc.py,sha256=Omvtdskjyby9ISEV5mM27Aku82XM77I_eIYbiQaKV1I,8736
|
|
229
229
|
cg/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
230
230
|
cg/io/api.py,sha256=WaiompYmK4bkl94fZkGzP2CTsQPmHaTSvy0oD0SKw4s,1037
|
|
231
231
|
cg/io/controller.py,sha256=4TTHm9fNY7Ti3S0r-uhxB3oycJ-Ni5Y44lFj5Yvl3_I,2978
|
|
@@ -515,7 +515,7 @@ cg/server/utils.py,sha256=fL5ZFlr2V-F3bbjPUi3LDxRuFK7UdN8jCp3txDvs0dE,227
|
|
|
515
515
|
cg/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
516
516
|
cg/services/analysis_service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
517
517
|
cg/services/analysis_service/analysis_service.py,sha256=vqT_f83Bf1hZ69HvfXwbR5FNqjh67nYTndWE0Rlr030,2041
|
|
518
|
-
cg/services/analysis_starter/analysis_starter.py,sha256=
|
|
518
|
+
cg/services/analysis_starter/analysis_starter.py,sha256=B6ZPOSVorkKDZwm1JZxTUKxwrFf7gns_T_eeMBLwGss,3509
|
|
519
519
|
cg/services/analysis_starter/configurator/abstract_model.py,sha256=S1g5VZJ_cnM8QdDe3AeHlUqq8iO9Fykp8Q80X2_6PvM,374
|
|
520
520
|
cg/services/analysis_starter/configurator/configurator.py,sha256=ZgELQu9dQPt_42EwcEbLNPsvaLP58xOrfAVSXFiTZSA,943
|
|
521
521
|
cg/services/analysis_starter/configurator/extensions/nallo.py,sha256=lsqFyzbdUmOgAuB_OKM-Zeyzq1cNiaekjwD5icY1_Nk,1111
|
|
@@ -544,7 +544,7 @@ cg/services/analysis_starter/configurator/file_creators/nextflow/sample_sheet/rn
|
|
|
544
544
|
cg/services/analysis_starter/configurator/file_creators/nextflow/sample_sheet/taxprofiler_sample_sheet_creator.py,sha256=dBbgE0TtZG3xNRrOkLbiGQdY2ZVfCKUsSL4jUOotNuo,1757
|
|
545
545
|
cg/services/analysis_starter/configurator/file_creators/nextflow/sample_sheet/tomte_sample_sheet_creator.py,sha256=8OsMI7ZbcEHsPZAwbG1YRklINBISxsiyli5iaRspKYY,1488
|
|
546
546
|
cg/services/analysis_starter/configurator/file_creators/nextflow/utils.py,sha256=Fr7s-_lo6UHwmmWt4peeW0eZBxB7KZcE_S2CykdIr1M,559
|
|
547
|
-
cg/services/analysis_starter/configurator/implementations/balsamic.py,sha256
|
|
547
|
+
cg/services/analysis_starter/configurator/implementations/balsamic.py,sha256=YUvWwLZlNonqzFUxDKnMwIbtHcGMX1bekiVBR0manCk,3539
|
|
548
548
|
cg/services/analysis_starter/configurator/implementations/microsalt.py,sha256=4bqeDS2LjV5Dl2cQkAb3FOTQ3uEoOXkSMyHP1lhkUKQ,3350
|
|
549
549
|
cg/services/analysis_starter/configurator/implementations/mip_dna.py,sha256=dhzXUGNvFDpgHL-o2Fh24WlDHpJpVrk0bKRrIbm4Ik8,5073
|
|
550
550
|
cg/services/analysis_starter/configurator/implementations/nextflow.py,sha256=hNbFybR1PdpZyasNMMWmVfSRQuLR1NT26dEo8lYldD4,6947
|
|
@@ -553,7 +553,7 @@ cg/services/analysis_starter/configurator/models/microsalt.py,sha256=PvwYS9sL1hh
|
|
|
553
553
|
cg/services/analysis_starter/configurator/models/mip_dna.py,sha256=-9wiSIPeqp7McCnS_MWYS7DqkAoB0BEXVVYGnov1QUg,1156
|
|
554
554
|
cg/services/analysis_starter/configurator/models/nextflow.py,sha256=Ug-Kj179TW5hnaCBPJFu9rigbBnmFYSfv02kkItmn2o,610
|
|
555
555
|
cg/services/analysis_starter/constants.py,sha256=69R7TyZWXQlDMowpV87faHcY7zpH5KTTjHLViYadeo8,268
|
|
556
|
-
cg/services/analysis_starter/factories/configurator_factory.py,sha256=
|
|
556
|
+
cg/services/analysis_starter/factories/configurator_factory.py,sha256=CB9iyjaH43cEMQb9_Q9JdHGbLvodEwhhXKZatZhkcEI,12295
|
|
557
557
|
cg/services/analysis_starter/factories/starter_factory.py,sha256=hhM-5pRgklJiQ-vZYEyD0bwZ_v1IcybMfVCeKC_ySR8,6138
|
|
558
558
|
cg/services/analysis_starter/input_fetcher/implementations/bam_fetcher.py,sha256=ttpexbRji6VjlxYi_ayevfjNAtgkV25OQbAV7fagKYA,2530
|
|
559
559
|
cg/services/analysis_starter/input_fetcher/implementations/fastq_fetcher.py,sha256=P2NVYgjLNwnmRsebuVVMUA4_ks-1wx2ALfHBxoucmUg,9676
|
|
@@ -923,7 +923,7 @@ cg/utils/flask/enum.py,sha256=xwNVtFPkSzoloJctLHu7obRyxcng1GJrhkeYkqwf9tw,1052
|
|
|
923
923
|
cg/utils/mapping.py,sha256=oZpZW2kgsbtAP2FZ7RtRPELiEE1zZk_nAGisHGtCOUo,491
|
|
924
924
|
cg/utils/time.py,sha256=_VOglhrFEZ5cwHK1U1g36SdwzB7UvV-Nvlt4ymuZUho,1501
|
|
925
925
|
cg/utils/utils.py,sha256=RciI_UhWcnG_pMZrmQZ1ZYb-O1N0DweTYMmhE0SIRgQ,1410
|
|
926
|
-
cg-83.15.
|
|
927
|
-
cg-83.15.
|
|
928
|
-
cg-83.15.
|
|
929
|
-
cg-83.15.
|
|
926
|
+
cg-83.15.3.dist-info/METADATA,sha256=K9yyPr_YAzs94GM0SsE9un_FRwjmtkggZjBGalpq_r4,4940
|
|
927
|
+
cg-83.15.3.dist-info/WHEEL,sha256=3ny-bZhpXrU6vSQ1UPG34FoxZBp3lVcvK0LkgUz6VLk,88
|
|
928
|
+
cg-83.15.3.dist-info/entry_points.txt,sha256=q5f47YQQGltzK_xnIq1mDopRXXEItr85Xe1BCtG-Wts,39
|
|
929
|
+
cg-83.15.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|