@@ -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 ''
0 commit comments