cg 83.14.0__py3-none-any.whl → 83.15.1__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 CHANGED
@@ -1,2 +1,2 @@
1
1
  __title__ = "cg"
2
- __version__ = "83.14.0"
2
+ __version__ = "83.15.1"
@@ -1,4 +1,5 @@
1
1
  import logging
2
+
2
3
  import rich_click as click
3
4
 
4
5
  from cg.models.cg_config import CGConfig
@@ -11,4 +12,6 @@ LOG = logging.getLogger(__name__)
11
12
  @click.pass_obj
12
13
  def sequencing_qc(context: CGConfig):
13
14
  service: SequencingQCService = context.sequencing_qc_service
14
- service.run_sequencing_qc()
15
+ succeeded: bool = service.run_sequencing_qc()
16
+ if not succeeded:
17
+ raise click.Abort
@@ -7,6 +7,7 @@ from cg.services.sequencing_qc_service.quality_checks.utils import (
7
7
  any_sample_in_case_has_reads,
8
8
  case_pass_sequencing_qc_on_hifi_yield,
9
9
  case_pass_sequencing_qc_on_reads,
10
+ raw_data_case_pass_qc,
10
11
  sample_pass_sequencing_qc_on_reads,
11
12
  )
12
13
  from cg.store.models import Case
@@ -24,6 +25,7 @@ class SequencingQCCheck(QualityCheck):
24
25
  SAMPLE_PASSES: Callable = sample_pass_sequencing_qc_on_reads
25
26
  ALL_SAMPLES_IN_CASE_HAVE_READS: Callable = all_samples_in_case_have_reads
26
27
  ANY_SAMPLE_IN_CASE_HAS_READS: Callable = any_sample_in_case_has_reads
28
+ RAW_DATA_CASE_QC: Callable = raw_data_case_pass_qc
27
29
 
28
30
 
29
31
  def get_sequencing_quality_check_for_case(case: Case) -> Callable:
@@ -41,7 +43,7 @@ def get_sequencing_quality_check_for_case(case: Case) -> Callable:
41
43
  Workflow.MUTANT: SequencingQCCheck.ANY_SAMPLE_IN_CASE_HAS_READS,
42
44
  Workflow.NALLO: SequencingQCCheck.CASE_PASSES_ON_YIELD,
43
45
  Workflow.RAREDISEASE: SequencingQCCheck.CASE_PASSES_ON_READS,
44
- Workflow.RAW_DATA: SequencingQCCheck.ANY_SAMPLE_IN_CASE_HAS_READS,
46
+ Workflow.RAW_DATA: SequencingQCCheck.RAW_DATA_CASE_QC,
45
47
  Workflow.RNAFUSION: SequencingQCCheck.CASE_PASSES_ON_READS,
46
48
  Workflow.TAXPROFILER: SequencingQCCheck.ALL_SAMPLES_IN_CASE_HAVE_READS,
47
49
  Workflow.TOMTE: SequencingQCCheck.CASE_PASSES_ON_READS,
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
 
3
+ from cg.constants.devices import DeviceType
3
4
  from cg.constants.priority import Priority
4
5
  from cg.constants.sequencing import SeqLibraryPrepCategory
5
6
  from cg.exc import ApplicationDoesNotHaveHiFiYieldError
@@ -132,6 +133,31 @@ def any_sample_in_case_has_reads(case: Case) -> bool:
132
133
  return passed_quality_check
133
134
 
134
135
 
136
+ def raw_data_case_pass_qc(case: Case) -> bool:
137
+ if is_case_ready_made_library(case):
138
+ return ready_made_library_case_pass_sequencing_qc(case)
139
+ if is_first_sample_yield_based_and_processed(case):
140
+ return all(sample_has_enough_hifi_yield(sample) for sample in case.samples)
141
+ elif is_first_sample_reads_based_and_processed(case):
142
+ return all(sample_has_enough_reads(sample) for sample in case.samples)
143
+ LOG.warning(f"Not all samples for case {case.internal_id} have been post-processed.")
144
+ return False
145
+
146
+
147
+ def is_first_sample_yield_based_and_processed(case: Case) -> bool:
148
+ sample: Sample = case.samples[0]
149
+ if metrics := sample.sample_run_metrics:
150
+ return metrics[0].type == DeviceType.PACBIO
151
+ return False
152
+
153
+
154
+ def is_first_sample_reads_based_and_processed(case: Case) -> bool:
155
+ sample: Sample = case.samples[0]
156
+ if metrics := sample.sample_run_metrics:
157
+ return metrics[0].type == DeviceType.ILLUMINA
158
+ return False
159
+
160
+
135
161
  def is_case_express_priority(case: Case) -> bool:
136
162
  """
137
163
  Check if a case is express priority.
@@ -18,9 +18,15 @@ class SequencingQCService:
18
18
  def __init__(self, store: Store):
19
19
  self.store = store
20
20
 
21
- def run_sequencing_qc(self) -> None:
22
- """Run QC for samples in pending or failed cases and store the aggregated score on each case."""
21
+ def run_sequencing_qc(self) -> bool:
22
+ """
23
+ Run QC for samples in pending or failed cases and store the aggregated score on each case.
24
+ Return True if all checks could run succesfully
25
+ Return False if at least one of the checks raised an exception
26
+ """
23
27
  cases: list[Case] = self.store.get_cases_for_sequencing_qc()
28
+ all_checks_ran_succesfully: bool = True
29
+
24
30
  for case in cases:
25
31
  LOG.debug(f"Performing sequencing QC for case: {case.internal_id}")
26
32
  try:
@@ -30,6 +36,9 @@ class SequencingQCService:
30
36
  LOG.info(f"Sequencing QC status for case {case.internal_id}: {qc_status}")
31
37
  except Exception as e:
32
38
  LOG.error(f"Error found during sequencing QC of case: {case.internal_id}: {e}")
39
+ all_checks_ran_succesfully = False
40
+
41
+ return all_checks_ran_succesfully
33
42
 
34
43
  @staticmethod
35
44
  def case_pass_sequencing_qc(case: Case) -> bool:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cg
3
- Version: 83.14.0
3
+ Version: 83.15.1
4
4
  Summary: Clinical Genomics command center
5
5
  Requires-Python: >=3.11,<3.13
6
6
  Classifier: Programming Language :: Python
@@ -1,4 +1,4 @@
1
- cg/__init__.py,sha256=RgHAoKbllDMi7ckyAB45aoTMtNGv5zZDVucQHnz9MkM,41
1
+ cg/__init__.py,sha256=8ACeYoaEs1BYFgYUmNeRwB0QUDpYryqJO79lU4ZH59A,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
@@ -104,7 +104,7 @@ cg/cli/get.py,sha256=sqKX2tDWnCE6zTwcMBCOb796Bc9rvu1AYLkONQ3Sq0w,8852
104
104
  cg/cli/post_process/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
105
  cg/cli/post_process/post_process.py,sha256=f6bCOsNLIHYHJdbKBVcjRO684MS258CptsmAVknoYI0,2367
106
106
  cg/cli/post_process/utils.py,sha256=XrzBhVDybFa4sBGDz5Dbwah0YrYD1IS_j3WzPjWjUfs,3193
107
- cg/cli/sequencing_qc/sequencing_qc.py,sha256=UxdfUBryKq5Pj82-8Ihjmqb9EClNzcuJtZKrB7YAB_A,427
107
+ cg/cli/sequencing_qc/sequencing_qc.py,sha256=anMscRw9Ulp3t2tQuLNuPE1HDtWTISgh_4yJourvAyA,494
108
108
  cg/cli/set/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
109
  cg/cli/set/base.py,sha256=gqdDpKS32rM29sQxPyK6fLf0Of6G1Un7htkAxZHkvKo,10453
110
110
  cg/cli/set/case.py,sha256=5QFZdnp7XdyaPFl6KDtM31TkX5XFjgOtRjQM2umb3Qk,4613
@@ -853,9 +853,9 @@ cg/services/sample_run_metrics_service/dtos.py,sha256=bJ0BL-QkqXIAAIg3F9edIdzAa_
853
853
  cg/services/sample_run_metrics_service/sample_run_metrics_service.py,sha256=aQvOuorTG97lUbw7OREO8nsPhO3ouQ38RwksstGwguQ,1795
854
854
  cg/services/sample_run_metrics_service/utils.py,sha256=BwICxptnhGg8oBghCLhzHaMNu0LuEV40cSYz1e8mB0A,829
855
855
  cg/services/sequencing_qc_service/__init__.py,sha256=OaL9dyyI6B8uRjopTIoD1zcX_H-SbGj46ZM-V-aoq6w,88
856
- cg/services/sequencing_qc_service/quality_checks/checks.py,sha256=Dew1xNjUBShAgv-kZtHNIL4HK6sMicu-cgACeeDjy20,2523
857
- cg/services/sequencing_qc_service/quality_checks/utils.py,sha256=JCP__el8dflPuSE0QUea4NdRz_9XWu5l254VizNAy-U,7945
858
- cg/services/sequencing_qc_service/sequencing_qc_service.py,sha256=2QIJ9IDZeMtO74ZHJ9bfzyK3-RhDK-m9xaoKsi9RHt8,1969
856
+ cg/services/sequencing_qc_service/quality_checks/checks.py,sha256=qdcHRwZD7uxrOmacyiAG4-EN6nG5z-r4rLxcReU5kSI,2593
857
+ cg/services/sequencing_qc_service/quality_checks/utils.py,sha256=2WN7S4kYsN_9iYPx7d4coAYcWHeueQWrPP2pJ8ztMMc,8969
858
+ cg/services/sequencing_qc_service/sequencing_qc_service.py,sha256=QQHShCiq-OAobzHnTKQ1buQVyDIqGbVEPyPM4WEV9B0,2257
859
859
  cg/services/sequencing_qc_service/utils.py,sha256=5WHJltBICfRODEzFVPFTdCbGNaMKCaVeOswHgIOGgFc,199
860
860
  cg/services/slurm_service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
861
861
  cg/services/slurm_service/slurm_cli_service.py,sha256=t-XZoAOPgL-eufwK0A6H8WJvGtfWnlIYxnvKZJIX5-Y,702
@@ -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.14.0.dist-info/METADATA,sha256=NfSMZZpwQzFwb2vRaPhpKv6sY5l3gfuNbeDIL81JQyk,4940
927
- cg-83.14.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
928
- cg-83.14.0.dist-info/entry_points.txt,sha256=q5f47YQQGltzK_xnIq1mDopRXXEItr85Xe1BCtG-Wts,39
929
- cg-83.14.0.dist-info/RECORD,,
926
+ cg-83.15.1.dist-info/METADATA,sha256=tIIqVq7JGccOTUpRusR2vHoN8WBQJWunoqbXS4IWrZQ,4940
927
+ cg-83.15.1.dist-info/WHEEL,sha256=3ny-bZhpXrU6vSQ1UPG34FoxZBp3lVcvK0LkgUz6VLk,88
928
+ cg-83.15.1.dist-info/entry_points.txt,sha256=q5f47YQQGltzK_xnIq1mDopRXXEItr85Xe1BCtG-Wts,39
929
+ cg-83.15.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.2.1
2
+ Generator: poetry-core 2.3.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any