|
28 | 28 | from collections import Counter |
29 | 29 | from typing import Iterable, List, Union |
30 | 30 |
|
31 | | -from . import broad_splits, smart_sort |
| 31 | +import pyard.serology |
32 | 32 | from . import data_repository as dr |
33 | 33 | from . import db |
| 34 | +from . import smart_sort |
| 35 | +from .serology import SerologyMapping |
34 | 36 | from .constants import ( |
35 | 37 | HLA_regex, |
36 | 38 | VALID_REDUCTION_TYPES, |
@@ -112,17 +114,17 @@ def __init__( |
112 | 114 | self.db_connection, self.code_mappings.who_group |
113 | 115 | ) |
114 | 116 |
|
115 | | - # Load Serology mappings |
| 117 | + # Load Serology mappings (Broad/Splits, Associated, Recognized) |
116 | 118 | broad_splits_mapping, associated_mapping = dr.generate_broad_splits_mapping( |
117 | 119 | self.db_connection, imgt_version |
118 | 120 | ) |
119 | | - self.serology_mapping = broad_splits.SerologyMapping( |
| 121 | + self.serology_mapping = SerologyMapping( |
120 | 122 | broad_splits_mapping, associated_mapping |
121 | 123 | ) |
122 | | - |
123 | 124 | dr.generate_serology_mapping( |
124 | 125 | self.db_connection, imgt_version, self.serology_mapping, self._redux_allele |
125 | 126 | ) |
| 127 | + self.valid_serology_set = dr.build_valid_serology_set(self.db_connection) |
126 | 128 |
|
127 | 129 | # Load V2 to V3 mappings |
128 | 130 | dr.generate_v2_to_v3_mapping(self.db_connection, imgt_version) |
@@ -411,7 +413,11 @@ def redux(self, glstring: str, redux_type: VALID_REDUCTION_TYPES) -> str: |
411 | 413 | # Handle Serology |
412 | 414 | if self._config["reduce_serology"] and self.is_serology(glstring): |
413 | 415 | alleles = self._get_alleles_from_serology(glstring) |
414 | | - return self.redux("/".join(alleles), redux_type) |
| 416 | + # If there's corresponding alleles, return / delimited alleles |
| 417 | + if alleles: |
| 418 | + return self.redux("/".join(alleles), redux_type) |
| 419 | + # If there's no DNA Mapping for a serology, e.g. DPw6, return empty |
| 420 | + return "" |
415 | 421 |
|
416 | 422 | if ":" in glstring: |
417 | 423 | loc_allele = glstring.split(":") |
@@ -498,7 +504,7 @@ def is_serology(self, allele: str) -> bool: |
498 | 504 | if "*" in allele or ":" in allele: |
499 | 505 | return False |
500 | 506 |
|
501 | | - return db.is_valid_serology(self.db_connection, allele) |
| 507 | + return allele in self.valid_serology_set |
502 | 508 |
|
503 | 509 | @functools.lru_cache(maxsize=DEFAULT_CACHE_SIZE) |
504 | 510 | def is_mac(self, allele: str) -> bool: |
@@ -651,7 +657,7 @@ def _get_alleles(self, code, locus_antigen) -> Iterable[str]: |
651 | 657 |
|
652 | 658 | def _get_alleles_from_serology(self, serology) -> Iterable[str]: |
653 | 659 | alleles = db.serology_to_alleles(self.db_connection, serology) |
654 | | - return filter(self._is_allele_in_db, alleles) |
| 660 | + return set(filter(self._is_allele_in_db, alleles)) |
655 | 661 |
|
656 | 662 | @staticmethod |
657 | 663 | def _combine_with_colon(digits_field): |
|
0 commit comments