@@ -174,20 +174,14 @@ def redux_gl(self, glstring: str, redux_type: str) -> str:
174174
175175 # Handle Serology
176176 if self .is_serology (glstring ):
177- if HLA_regex .search (glstring ):
178- # Remove HLA- prefix
179- serology = glstring .split ("-" )[1 ]
180- alleles = self ._get_alleles_from_serology (serology )
181- alleles = ['HLA-' + a for a in alleles ]
182- else :
183- alleles = self ._get_alleles_from_serology (glstring )
177+ alleles = self ._get_alleles_from_serology (glstring )
184178 return self .redux_gl ("/" .join (alleles ), redux_type )
185179
186180 loc_allele = glstring .split (":" )
187181 loc_name , code = loc_allele [0 ], loc_allele [1 ]
188182
189183 # Handle XX codes
190- if ( self .is_mac (glstring ) and glstring . split ( ":" )[ 1 ] == "XX" ) and loc_name in self .xx_codes :
184+ if self .is_mac (glstring ) and code == "XX" and loc_name in self .xx_codes :
191185 return self .redux_gl ("/" .join (self .xx_codes [loc_name ]), redux_type )
192186
193187 # Handle MAC
@@ -207,11 +201,26 @@ def redux_gl(self, glstring: str, redux_type: str) -> str:
207201 @staticmethod
208202 def is_serology (allele : str ) -> bool :
209203 """
210- An allele is serology if the allele name after * is numeral only, no ':'
204+ A serology has the locus name (first 2 letters for DRB1, DRB3, DQB1, DQA1, DPB1 and DPA1)
205+ of the allele followed by numerical antigen.
206+
211207 :param allele: The allele to test for serology
212208 :return: True if serology
213209 """
214- return allele .split ('*' )[1 ].isdigit ()
210+ if '*' in allele or ':' in allele :
211+ return False
212+
213+ locus = allele [0 :2 ]
214+ if locus in ['DR' , 'DP' , 'DQ' ]:
215+ antigen = allele [2 :]
216+ return antigen .isdigit ()
217+
218+ locus = allele [0 :1 ]
219+ if locus in ['A' , 'B' , 'C' , 'D' ]:
220+ antigen = allele [1 :]
221+ return antigen .isdigit ()
222+
223+ return False
215224
216225 @staticmethod
217226 def is_mac (gl : str ) -> bool :
@@ -229,7 +238,9 @@ def _is_valid_allele(self, allele):
229238 :param allele: Allele to test
230239 :return: bool to indicate if allele is valid
231240 """
232- return allele in self .valid_alleles
241+ if self ._remove_invalid :
242+ return allele in self .valid_alleles
243+ return True
233244
234245 def _get_alleles (self , code , loc_name ) -> Iterable [str ]:
235246 """
@@ -239,12 +250,18 @@ def _get_alleles(self, code, loc_name) -> Iterable[str]:
239250 :return: valid alleles corresponding to allele code
240251 """
241252 alleles = mac_code_to_alleles (self .db_connection , code )
242- return filter (self ._is_valid_allele ,
243- [f'{ loc_name } :{ a } ' for a in alleles ])
253+ if self ._remove_invalid :
254+ return filter (self ._is_valid_allele ,
255+ [f'{ loc_name } :{ a } ' for a in alleles ])
256+ else :
257+ return [f'{ loc_name } :{ a } ' for a in alleles ]
244258
245259 def _get_alleles_from_serology (self , serology ) -> Iterable [str ]:
246260 alleles = db .serology_to_alleles (self .db_connection , serology )
247- return filter (self ._is_valid_allele , alleles )
261+ if self ._remove_invalid :
262+ return filter (self ._is_valid_allele , alleles )
263+ else :
264+ return alleles
248265
249266 def isvalid (self , allele : str ) -> bool :
250267 """
@@ -255,6 +272,8 @@ def isvalid(self, allele: str) -> bool:
255272 :return: allele or empty
256273 :rtype: bool
257274 """
275+ if allele == '' :
276+ return False
258277 if not self .is_mac (allele ) and not self .is_serology (allele ):
259278 # Alleles ending with P or G are valid_alleles
260279 if allele .endswith (('P' , 'G' )):
@@ -310,7 +329,6 @@ def mac_toG(self, allele: str) -> str:
310329 return ''
311330 else :
312331 return "/" .join (group )
313-
314332 else :
315333 return ''
316334
0 commit comments