From 5a1b7ba652d996d77f5f5f3044baa5b142ecd56b Mon Sep 17 00:00:00 2001 From: Kristina Galikova Date: Thu, 6 Apr 2023 22:01:49 +0100 Subject: [PATCH 1/3] make pull request From 9a89ffdea92d908fc9e4f703acba93fcf45a1b24 Mon Sep 17 00:00:00 2001 From: Kristina Galikova Date: Fri, 7 Apr 2023 00:14:16 +0100 Subject: [PATCH 2/3] feat: add better description for double antibody creation parsing issue --- txmatching/patients/hla_functions.py | 43 ++++++++++++++----- txmatching/patients/hla_model.py | 2 +- .../utils/hla_system/hla_preparation_utils.py | 8 +--- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/txmatching/patients/hla_functions.py b/txmatching/patients/hla_functions.py index 9c0fc7705..c2d6c7f5e 100644 --- a/txmatching/patients/hla_functions.py +++ b/txmatching/patients/hla_functions.py @@ -99,7 +99,7 @@ def _check_groups_for_multiple_cutoffs(hla_antibodies: List[HLAAntibody]) -> Lis def _add_single_hla_antibodies(antibody_list_single_code: List[HLAAntibody]) -> Tuple[ - List[ParsingIssueBase], List[HLAAntibody]]: + List[ParsingIssueBase], List[HLAAntibody]]: def _group_key(hla_antibody: HLAAntibody) -> str: return hla_antibody.raw_code @@ -201,7 +201,7 @@ def _add_double_hla_antibodies(antibody_list_double_code: List[HLAAntibody], # if both are mixed add double antibody else: theoretical_parsing_issues, theoretical_antibodies = _resolve_theoretical_antibody( - double_antibody, parsed_hla_codes, mfi_dictionary) + double_antibody, parsed_hla_codes, mfi_dictionary, antibody_list_double_code) hla_antibodies_joined.extend(theoretical_antibodies) parsing_issues.extend(theoretical_parsing_issues) @@ -210,20 +210,16 @@ def _add_double_hla_antibodies(antibody_list_double_code: List[HLAAntibody], def _resolve_theoretical_antibody(double_antibody: HLAAntibody, parsed_hla_codes: Set[str], - mfi_dictionary: Dict[str, List[int]]) -> \ + mfi_dictionary: Dict[str, List[int]], + antibody_list_double_code: List[HLAAntibody]) -> \ Tuple[List[ParsingIssueBase], List[HLAAntibody]]: parsing_issues = [] hla_antibodies = [] # add double antibody and parsing issue hla_antibodies.append(double_antibody) - parsing_issues.append( - ParsingIssueBase( - hla_code_or_group=double_antibody.raw_code + ', ' + double_antibody.second_raw_code, - parsing_issue_detail=ParsingIssueDetail.CREATED_THEORETICAL_ANTIBODY, - message=ParsingIssueDetail.CREATED_THEORETICAL_ANTIBODY.value - ) - ) + + parsing_issues.append(create_parsing_issue_creating_double_antibody(double_antibody, antibody_list_double_code)) # join theoretical alpha and beta unparsed chains with averaged MFI _join_both_chains_if_unparsed(double_antibody, hla_antibodies, parsed_hla_codes, @@ -232,6 +228,33 @@ def _resolve_theoretical_antibody(double_antibody: HLAAntibody, return parsing_issues, hla_antibodies +def create_parsing_issue_creating_double_antibody(double_antibody: HLAAntibody, + antibody_list_double_code: List[HLAAntibody]) -> ParsingIssueBase: + # extract other occurences of alpha chain + alpha_chain_occurences = ', '.join([create_raw_code_for_double_antibody( + antibody) + " mfi: " + str(antibody.mfi) for antibody in antibody_list_double_code if + antibody.raw_code == double_antibody.raw_code and not antibody == double_antibody]) + + # extract other occurences of beta chain + beta_chain_occurences = ', '.join([create_raw_code_for_double_antibody( + antibody) + " mfi: " + str(antibody.mfi) for antibody in antibody_list_double_code if + antibody.second_raw_code == double_antibody.second_raw_code and not antibody == double_antibody]) + + detailed_message = "Other antibodies with alpha: " + alpha_chain_occurences + \ + ". Other antibodies with beta: " + beta_chain_occurences + "." + return ParsingIssueBase( + hla_code_or_group=double_antibody.raw_code + ', ' + double_antibody.second_raw_code, + parsing_issue_detail=ParsingIssueDetail.CREATED_THEORETICAL_ANTIBODY, + message=ParsingIssueDetail.CREATED_THEORETICAL_ANTIBODY.value + detailed_message + ) + + +def create_raw_code_for_double_antibody(hla_antibody: HLAAntibody) -> str: + # Example of HLA antibody raw format: DP[02:01,03:02] + return hla_antibody.raw_code[:2] + '[' + hla_antibody.raw_code.split('*')[1] + ',' + \ + hla_antibody.second_raw_code.split('*')[1] + ']' + + def _parse_double_antibody_mfi_under_cutoff(double_antibody: HLAAntibody, parsed_hla_codes: Set[str], mfi_dictionary: Dict[str, List[int]]) -> List[HLAAntibody]: diff --git a/txmatching/patients/hla_model.py b/txmatching/patients/hla_model.py index 91b3544af..f75223751 100644 --- a/txmatching/patients/hla_model.py +++ b/txmatching/patients/hla_model.py @@ -80,7 +80,7 @@ def __eq__(self, other): self.raw_code == other.raw_code and self.mfi == other.mfi and self.cutoff == other.cutoff and - self.second_raw_code == other.second_raw_code, + self.second_raw_code == other.second_raw_code and self.type == other.type) def __hash__(self): diff --git a/txmatching/utils/hla_system/hla_preparation_utils.py b/txmatching/utils/hla_system/hla_preparation_utils.py index 3461177f2..ae3f028f3 100644 --- a/txmatching/utils/hla_system/hla_preparation_utils.py +++ b/txmatching/utils/hla_system/hla_preparation_utils.py @@ -40,12 +40,6 @@ def create_antibodies(hla_antibodies_list: List[HLAAntibodyRaw]) -> HLAAntibodie ) -def _create_raw_code_for_double_antibody(hla_antibody: HLAAntibody) -> str: - # Example of HLA antibody raw format: DP[02:01,03:02] - return hla_antibody.raw_code[:2] + '[' + hla_antibody.raw_code.split('*')[1] + ',' + \ - hla_antibody.second_raw_code.split('*')[1] + ']' - - def create_antibody(raw_code: str, mfi: int, cutoff: int) -> HLAAntibodyRaw: return HLAAntibodyRaw( raw_code=raw_code, @@ -55,7 +49,7 @@ def create_antibody(raw_code: str, mfi: int, cutoff: int) -> HLAAntibodyRaw: def create_antibody_parsed(raw_code: str, mfi: int, cutoff: int, second_raw_code: str = None, - antibody_type: HLAAntibodyType = HLAAntibodyType.NORMAL) -> HLAAntibody: + antibody_type: HLAAntibodyType = HLAAntibodyType.NORMAL) -> HLAAntibody: code = parse_hla_raw_code_and_return_parsing_issue_list(raw_code)[1] second_code = parse_hla_raw_code_and_return_parsing_issue_list( second_raw_code)[1] if second_raw_code is not None else None From b2d0d4ea8eea4c1835279854112b639929268b5c Mon Sep 17 00:00:00 2001 From: Kristina Galikova Date: Wed, 12 Apr 2023 13:53:45 +0100 Subject: [PATCH 3/3] refac: change how codes are accessed for double antibody parsing isue --- txmatching/patients/hla_functions.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/txmatching/patients/hla_functions.py b/txmatching/patients/hla_functions.py index c2d6c7f5e..5ec1df9cb 100644 --- a/txmatching/patients/hla_functions.py +++ b/txmatching/patients/hla_functions.py @@ -233,14 +233,14 @@ def create_parsing_issue_creating_double_antibody(double_antibody: HLAAntibody, # extract other occurences of alpha chain alpha_chain_occurences = ', '.join([create_raw_code_for_double_antibody( antibody) + " mfi: " + str(antibody.mfi) for antibody in antibody_list_double_code if - antibody.raw_code == double_antibody.raw_code and not antibody == double_antibody]) + antibody.code == double_antibody.code and not antibody == double_antibody]) # extract other occurences of beta chain beta_chain_occurences = ', '.join([create_raw_code_for_double_antibody( antibody) + " mfi: " + str(antibody.mfi) for antibody in antibody_list_double_code if - antibody.second_raw_code == double_antibody.second_raw_code and not antibody == double_antibody]) + antibody.second_code == double_antibody.second_code and not antibody == double_antibody]) - detailed_message = "Other antibodies with alpha: " + alpha_chain_occurences + \ + detailed_message = " Other antibodies with alpha: " + alpha_chain_occurences + \ ". Other antibodies with beta: " + beta_chain_occurences + "." return ParsingIssueBase( hla_code_or_group=double_antibody.raw_code + ', ' + double_antibody.second_raw_code, @@ -251,8 +251,8 @@ def create_parsing_issue_creating_double_antibody(double_antibody: HLAAntibody, def create_raw_code_for_double_antibody(hla_antibody: HLAAntibody) -> str: # Example of HLA antibody raw format: DP[02:01,03:02] - return hla_antibody.raw_code[:2] + '[' + hla_antibody.raw_code.split('*')[1] + ',' + \ - hla_antibody.second_raw_code.split('*')[1] + ']' + return hla_antibody.code.high_res[:2] + '[' + hla_antibody.code.high_res.split('*')[1] + ',' + \ + hla_antibody.second_code.high_res.split('*')[1] + ']' def _parse_double_antibody_mfi_under_cutoff(double_antibody: HLAAntibody,