Skip to content

Commit 5d7d42b

Browse files
authored
Merge pull request #65 from pbashyal-nmdp/fix_mac_allelic_expansion
Fix MAC codes with allelic expansion
2 parents e7e2c87 + e1c55d9 commit 5d7d42b

File tree

5 files changed

+40
-23
lines changed

5 files changed

+40
-23
lines changed

pyard/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@
2424
from .pyard import ARD
2525

2626
__author__ = """NMDP Bioinformatics"""
27-
__version__ = '0.5.0'
27+
__version__ = '0.5.1'

pyard/pyard.py

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -178,22 +178,22 @@ def redux_gl(self, glstring: str, redux_type: str) -> str:
178178
return self.redux_gl("/".join(alleles), redux_type)
179179

180180
loc_allele = glstring.split(":")
181-
loc_name, code = loc_allele[0], loc_allele[1]
181+
loc_antigen, code = loc_allele[0], loc_allele[1]
182182

183183
# Handle XX codes
184-
if self.is_mac(glstring) and code == "XX" and loc_name in self.xx_codes:
185-
return self.redux_gl("/".join(self.xx_codes[loc_name]), redux_type)
184+
if self.is_mac(glstring) and code == "XX" and loc_antigen in self.xx_codes:
185+
return self.redux_gl("/".join(self.xx_codes[loc_antigen]), redux_type)
186186

187187
# Handle MAC
188188
if self.is_mac(glstring) and is_valid_mac_code(self.db_connection, code):
189189
if HLA_regex.search(glstring):
190190
# Remove HLA- prefix
191191
allele_name = glstring.split("-")[1]
192-
loc_name, code = allele_name.split(":")
193-
alleles = self._get_alleles(code, loc_name)
192+
loc_antigen, code = allele_name.split(":")
193+
alleles = self._get_alleles(code, loc_antigen)
194194
alleles = ["HLA-" + a for a in alleles]
195195
else:
196-
alleles = self._get_alleles(code, loc_name)
196+
alleles = self._get_alleles(code, loc_antigen)
197197
return self.redux_gl("/".join(alleles), redux_type)
198198

199199
return self.redux(glstring, redux_type)
@@ -242,19 +242,28 @@ def _is_valid_allele(self, allele):
242242
return allele in self.valid_alleles
243243
return True
244244

245-
def _get_alleles(self, code, loc_name) -> Iterable[str]:
245+
def _get_alleles(self, code, locus_antigen) -> Iterable[str]:
246246
"""
247247
Look up allele code in database and generate alleles
248248
:param code: allele code to look up
249-
:param loc_name: locus name for alleles
249+
:param locus_antigen: locus name for alleles
250250
:return: valid alleles corresponding to allele code
251251
"""
252252
alleles = mac_code_to_alleles(self.db_connection, code)
253+
254+
# It's an allelic expansion if any of the alleles have a `:`
255+
# else it's a group expansion
256+
is_allelic_expansion = any([':' in allele for allele in alleles])
257+
if is_allelic_expansion:
258+
locus = locus_antigen.split('*')[0] # Just keep the locus name
259+
alleles = [f'{locus}*{a}' for a in alleles]
260+
else:
261+
alleles = [f'{locus_antigen}:{a}' for a in alleles]
262+
253263
if self._remove_invalid:
254-
return filter(self._is_valid_allele,
255-
[f'{loc_name}:{a}' for a in alleles])
264+
return filter(self._is_valid_allele, alleles)
256265
else:
257-
return [f'{loc_name}:{a}' for a in alleles]
266+
return alleles
258267

259268
def _get_alleles_from_serology(self, serology) -> Iterable[str]:
260269
alleles = db.serology_to_alleles(self.db_connection, serology)
@@ -319,11 +328,11 @@ def mac_toG(self, allele: str) -> str:
319328
:return: ARS reduced allele
320329
:rtype: str
321330
"""
322-
loc_name, code = allele.split(":")
331+
locus_antigen, code = allele.split(":")
323332
if HLA_regex.search(allele):
324-
loc_name = loc_name.split("-")[1]
333+
locus_antigen = locus_antigen.split("-")[1] # Remove HLA- prefix
325334
if is_valid_mac_code(self.db_connection, code):
326-
alleles = self._get_alleles(code, loc_name)
335+
alleles = self._get_alleles(code, locus_antigen)
327336
group = [self.toG(a) for a in alleles]
328337
if "X" in group:
329338
return ''
@@ -358,12 +367,12 @@ def expand_mac(self, mac_code: str):
358367
:return: List
359368
:rtype: List
360369
"""
361-
loc_name, code = mac_code.split(":")
370+
locus_antigen, code = mac_code.split(":")
362371
if is_valid_mac_code(self.db_connection, code):
363372
if HLA_regex.search(mac_code):
364-
loc_name = loc_name.split("-")[1]
365-
return ['HLA-' + a for a in self._get_alleles(code, loc_name)]
373+
locus_antigen = locus_antigen.split("-")[1] # Remove HLA- prefix
374+
return ['HLA-' + a for a in self._get_alleles(code, locus_antigen)]
366375
else:
367-
return list(self._get_alleles(code, loc_name))
376+
return list(self._get_alleles(code, locus_antigen))
368377

369378
return ''

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 0.5.0
2+
current_version = 0.5.1
33
commit = True
44
tag = True
55

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343
setup(
4444
name='py-ard',
45-
version='0.5.0',
45+
version='0.5.1',
4646
description="ARD reduction for HLA with python",
4747
long_description=readme + '\n\n' + history,
4848
author="CIBMTR",

tests/features/mac.feature

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,17 @@ Feature: MAC (Multiple Allele Code)
66
When reducing on the <Level> level (ambiguous)
77
Then the reduced allele is found to be <Redux Allele>
88

9-
Examples:
9+
10+
Examples: MACs with group expansions
1011
| Allele | Level | Redux Allele |
1112
| A*01:AB | G | A*01:01:01G/A*01:02 |
1213
| A*01:AB | lgx | A*01:01/A*01:02 |
1314
| HLA-A*01:AB | G | HLA-A*01:01:01G/HLA-A*01:02 |
14-
| HLA-A*01:AB | lgx | HLA-A*01:01/HLA-A*01:02 |
15+
| HLA-A*01:AB | lgx | HLA-A*01:01/HLA-A*01:02 |
16+
17+
18+
Examples: MACs with allelic expansions
19+
| Allele | Level | Redux Allele |
20+
| B*08:ASXJP | G | B*08:01:01G |
21+
| B*08:ASXJP | lgx | B*08:01 |
22+
| C*07:HTGM | lgx | C*07:01/C*07:150Q |

0 commit comments

Comments
 (0)