1
- from typing import Any
1
+ from typing import Annotated , Any
2
2
3
- from pydantic . v1 import validator
3
+ from pydantic import Field , ValidationInfo , field_validator
4
4
5
5
from cg .constants .subject import Sex
6
6
from cg .models .deliverables .metric_deliverables import (
@@ -27,14 +27,15 @@ class DuplicateReads(SampleMetric):
27
27
28
28
value : float
29
29
30
- @validator ("value" , always = True )
30
+ @field_validator ("value" )
31
+ @classmethod
31
32
def convert_duplicate_read (cls , value ) -> float :
32
- """Convert raw value from fraction to percent"""
33
+ """Convert raw value from fraction to percent. """
33
34
return value * 100
34
35
35
36
36
37
class SexCheck (SampleMetric ):
37
- """Definition of sex check metric"""
38
+ """Definition of sex check metric. """
38
39
39
40
value : str
40
41
@@ -44,7 +45,8 @@ class MIPMappedReads(SampleMetric):
44
45
45
46
value : float
46
47
47
- @validator ("value" , always = True )
48
+ @field_validator ("value" )
49
+ @classmethod
48
50
def convert_mapped_read (cls , value ) -> float :
49
51
"""Convert raw value from fraction to percent"""
50
52
return value * 100
@@ -70,34 +72,38 @@ class MIPMetricsDeliverables(MetricsDeliverables):
70
72
"MEDIAN_TARGET_COVERAGE" : MedianTargetCoverage ,
71
73
"gender" : SexCheck ,
72
74
}
73
- duplicate_reads : list [DuplicateReads ] | None
74
- mapped_reads : list [MIPMappedReads ] | None
75
- mean_insert_size : list [MeanInsertSize ] | None
76
- median_target_coverage : list [MedianTargetCoverage ] | None
77
- predicted_sex : list [SexCheck ] | None
75
+ duplicate_reads : Annotated [list [DuplicateReads ] | None , Field (validate_default = True )] = None
76
+ mapped_reads : Annotated [list [MIPMappedReads ] | None , Field (validate_default = True )] = None
77
+ mean_insert_size : Annotated [list [MeanInsertSize ] | None , Field (validate_default = True )] = None
78
+ median_target_coverage : Annotated [
79
+ list [MedianTargetCoverage ] | None , Field (validate_default = True )
80
+ ] = None
81
+ predicted_sex : Annotated [list [SexCheck ] | None , Field (validate_default = True )] = None
78
82
sample_metric_to_parse : list [str ] = SAMPLE_METRICS_TO_PARSE
79
- sample_id_metrics : list [MIPParsedMetrics ] | None
83
+ sample_id_metrics : Annotated [ list [MIPParsedMetrics ] | None , Field ( validate_default = True )] = None
80
84
81
- @validator ("duplicate_reads" , always = True )
82
- def set_duplicate_reads (cls , _ , values : dict ) -> list [DuplicateReads ]:
85
+ @field_validator ("duplicate_reads" )
86
+ @classmethod
87
+ def set_duplicate_reads (cls , _ , info : ValidationInfo ) -> list [DuplicateReads ]:
83
88
"""Set duplicate_reads"""
84
- return add_metric (name = "fraction_duplicates" , values = values )
89
+ return add_metric (name = "fraction_duplicates" , info = info )
85
90
86
- @validator ("mapped_reads" , always = True )
87
- def set_mapped_reads (cls , _ , values : dict ) -> list [MIPMappedReads ]:
91
+ @field_validator ("mapped_reads" )
92
+ @classmethod
93
+ def set_mapped_reads (cls , _ , info : ValidationInfo ) -> list [MIPMappedReads ]:
88
94
"""Set mapped reads"""
89
- sample_ids : set = values .get ("sample_ids" )
95
+ sample_ids : set = info . data .get ("sample_ids" )
90
96
mapped_reads : list = []
91
97
total_sequences : dict = {}
92
98
reads_mapped : dict = {}
93
- raw_metrics : list = values .get ("metrics_" )
99
+ raw_metrics : list = info . data .get ("metrics_" )
94
100
metric_step : str = ""
95
101
for metric in raw_metrics :
96
102
if metric .name == "raw_total_sequences" :
97
103
raw_total_sequences = total_sequences .get (metric .id , 0 )
98
104
total_sequences [metric .id ] = int (metric .value ) + raw_total_sequences
99
105
metric_step : str = metric .step
100
- if metric .name == "reads_mapped" :
106
+ elif metric .name == "reads_mapped" :
101
107
raw_reads_mapped = reads_mapped .get (metric .id , 0 )
102
108
reads_mapped [metric .id ] = int (metric .value ) + raw_reads_mapped
103
109
for sample_id in sample_ids :
@@ -107,31 +113,35 @@ def set_mapped_reads(cls, _, values: dict) -> list[MIPMappedReads]:
107
113
)
108
114
return mapped_reads
109
115
110
- @validator ("mean_insert_size" , always = True )
111
- def set_mean_insert_size (cls , _ , values : dict ) -> list [MeanInsertSize ]:
116
+ @field_validator ("mean_insert_size" )
117
+ @classmethod
118
+ def set_mean_insert_size (cls , _ , info : ValidationInfo ) -> list [MeanInsertSize ]:
112
119
"""Set mean insert size"""
113
- return add_metric (name = "MEAN_INSERT_SIZE" , values = values )
120
+ return add_metric (name = "MEAN_INSERT_SIZE" , info = info )
114
121
115
- @validator ("median_target_coverage" , always = True )
116
- def set_median_target_coverage (cls , _ , values : dict ) -> list [MedianTargetCoverage ]:
122
+ @field_validator ("median_target_coverage" )
123
+ @classmethod
124
+ def set_median_target_coverage (cls , _ , info : ValidationInfo ) -> list [MedianTargetCoverage ]:
117
125
"""Set median target coverage"""
118
- return add_metric (name = "MEDIAN_TARGET_COVERAGE" , values = values )
126
+ return add_metric (name = "MEDIAN_TARGET_COVERAGE" , info = info )
119
127
120
- @validator ("predicted_sex" , always = True )
121
- def set_predicted_sex (cls , _ , values : dict ) -> list [SexCheck ]:
128
+ @field_validator ("predicted_sex" )
129
+ @classmethod
130
+ def set_predicted_sex (cls , _ , info : ValidationInfo ) -> list [SexCheck ]:
122
131
"""Set predicted sex"""
123
- return add_metric (name = "gender" , values = values )
132
+ return add_metric (name = "gender" , info = info )
124
133
125
- @validator ("sample_id_metrics" , always = True )
126
- def set_sample_id_metrics (cls , _ , values : dict ) -> list [MIPParsedMetrics ]:
134
+ @field_validator ("sample_id_metrics" )
135
+ @classmethod
136
+ def set_sample_id_metrics (cls , _ , info : ValidationInfo ) -> list [MIPParsedMetrics ]:
127
137
"""Set parsed sample_id metrics gathered from all metrics"""
128
- return add_sample_id_metrics (parsed_metric = MIPParsedMetrics , values = values )
138
+ return add_sample_id_metrics (parsed_metric = MIPParsedMetrics , info = info )
129
139
130
140
131
141
def get_sample_id_metric (
132
142
sample_id_metrics : list [MIPParsedMetrics ], sample_id : str
133
143
) -> MIPParsedMetrics :
134
- """Get parsed metrics for an sample_id """
144
+ """Get parsed metrics for a sample id """
135
145
for sample_id_metric in sample_id_metrics :
136
146
if sample_id == sample_id_metric .sample_id :
137
147
return sample_id_metric
0 commit comments