From 02492a7e1d38728e0b09b6f0508efaf3399ff70e Mon Sep 17 00:00:00 2001 From: VGPReys Date: Sat, 8 Aug 2026 16:14:37 +0200 Subject: [PATCH 1/8] fix dna nucleobase atom selection default for capri --- src/haddock/libs/libalign.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/haddock/libs/libalign.py b/src/haddock/libs/libalign.py index 0af3740c95..baf95aa9ff 100644 --- a/src/haddock/libs/libalign.py +++ b/src/haddock/libs/libalign.py @@ -204,7 +204,7 @@ "martini3" : PROT_SIDE_CHAINS_DICT_MARTINI3 } -# Bases +# For DNA, we use nucleo-bases as default atom selection DNA_ATOMS = [ "C5", "N9", @@ -223,14 +223,15 @@ "C4", "O6", ] -DNA_ATOMS_MARTINI2 = ["BB1", "BB2", "BB3"] - +DNA_ATOMS_MARTINI2 = ["SC1", "SC2", "SC3", "SC4"] +DNA_ATOMS_MARTINI3 = ["SC1", "SC2", "SC3", "SC4"] DNA_ATOMS_all = { "aa" : DNA_ATOMS, "martini2" : DNA_ATOMS_MARTINI2, - "martini3" : DNA_ATOMS_MARTINI2 + "martini3" : DNA_ATOMS_MARTINI3, } +# Definition of all atoms in DNA DNA_FULL_DICT = { "DA": [ "P", @@ -356,13 +357,15 @@ "DG" : ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], "DT" : ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"] } - +DNA_FULL_DICT_MARTINI3 = DNA_FULL_DICT_MARTINI2 DNA_FULL_DICT_all = { "aa" : DNA_FULL_DICT, "martini2" : DNA_FULL_DICT_MARTINI2, - "martini3" : DNA_FULL_DICT_MARTINI2 + "martini3" : DNA_FULL_DICT_MARTINI3, } +# RNA definitions +# Backbone RNA_RES = ["A", "G", "C", "U"] RNA_ATOMS = ["P", "O5'", "C5'", "C4'", "C3'", "O3'"] RNA_ATOMS_MARTINI2 = ["BB1", "BB2", "BB3"] @@ -373,6 +376,7 @@ "martini3" : RNA_ATOMS_MARTINI2 } +# All atoms in RNA RNA_FULL_DICT = { "A": [ "P", @@ -477,11 +481,11 @@ "G" : ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], "U" : ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"] } - +RNA_FULL_DICT_MARTINI3 = RNA_FULL_DICT_MARTINI2 RNA_FULL_DICT_all = { "aa" : RNA_FULL_DICT, "martini2" : RNA_FULL_DICT_MARTINI2, - "martini3" : RNA_FULL_DICT_MARTINI2 + "martini3" : RNA_FULL_DICT_MARTINI3, } From 49f62319e4897c5ecbd38c2761c6d392402fee6c Mon Sep 17 00:00:00 2001 From: VGPReys Date: Sat, 8 Aug 2026 16:44:14 +0200 Subject: [PATCH 2/8] lint --- src/haddock/libs/libalign.py | 406 ++++++++++++++++++----------------- 1 file changed, 213 insertions(+), 193 deletions(-) diff --git a/src/haddock/libs/libalign.py b/src/haddock/libs/libalign.py index baf95aa9ff..d9965eb169 100644 --- a/src/haddock/libs/libalign.py +++ b/src/haddock/libs/libalign.py @@ -42,11 +42,101 @@ slc_y, slc_z, split_by_chain, - ) +) RES_TO_BE_IGNORED = ["SHA", "WAT"] +ResCode = Literal[ + "C", + "D", + "S", + "Q", + "K", + "I", + "P", + "T", + "F", + "N", + "G", + "H", + "L", + "R", + "W", + "A", + "V", + "E", + "Y", + "M", + "A", + "G", + "C", + "T", + "X", +] +""" +The single letter code of a residue. + +Unrecognized residues' code is `X`. +""" + +RES_3L1L = dict( + [ + ("CYS", "C"), + ("ASP", "D"), + ("SER", "S"), + ("GLN", "Q"), + ("LYS", "K"), + ("ILE", "I"), + ("PRO", "P"), + ("THR", "T"), + ("PHE", "F"), + ("ASN", "N"), + ("GLY", "G"), + ("HIS", "H"), + ("LEU", "L"), + ("ARG", "R"), + ("TRP", "W"), + ("ALA", "A"), + ("VAL", "V"), + ("GLU", "E"), + ("TYR", "Y"), + ("MET", "M"), + ("DA", "A"), + ("DG", "G"), + ("DC", "C"), + ("DT", "T"), + ("A", "A"), + ("G", "G"), + ("C", "C"), + ("U", "U"), + # 9/8/2023: adding non-standard amino-acids (src/haddock/cns/toppar/protein-allhdg5-4.top) # noqa: E501 + ("ALY", "K"), + ("ASH", "D"), + ("CFE", "C"), + ("CSP", "C"), + ("CYC", "C"), + ("CYF", "C"), + ("CYM", "C"), + ("DDZ", "A"), + ("GLH", "E"), + ("HLY", "P"), + ("HY3", "P"), + ("HYP", "P"), + ("M3L", "K"), + ("MLY", "K"), + ("MLZ", "K"), + ("MSE", "M"), + ("NEP", "H"), + ("PNS", "S"), + ("PTR", "Y"), + ("SEP", "S"), + ("TOP", "T"), + ("TYP", "Y"), + ("TYS", "Y"), + ] +) + PROT_RES = [ "ALA", "ARG", @@ -75,9 +165,9 @@ PROT_ATOMS = ["C", "N", "CA", "O"] PROT_ATOMS_MARTINI2 = ["BB"] PROT_ATOMS_all = { - "aa" : PROT_ATOMS, - "martini2" : PROT_ATOMS_MARTINI2, - "martini3" : PROT_ATOMS_MARTINI2 # The backbone particle is identical between MARTINI 2 and 3 + "aa": PROT_ATOMS, + "martini2": PROT_ATOMS_MARTINI2, + "martini3": PROT_ATOMS_MARTINI2, # The backbone particle is identical between MARTINI 2 and 3 } # Side chains @@ -133,75 +223,75 @@ } PROT_SIDE_CHAINS_DICT_MARTINI2 = { - "GLY": ['BB'], - "ALA": ['BB'], - "CYS": ['BB', 'SC1'], - "VAL": ['BB', 'SC1'], - "LEU": ['BB', 'SC1'], - "ILE": ['BB', 'SC1'], - "MET": ['BB', 'SC1'], - "PRO": ['BB', 'SC1'], - "ASN": ['BB', 'SC1'], - "GLN": ['BB', 'SC1'], - "ASP": ['BB', 'SC1'], - "ASP0": ['BB', 'SC1'], - "GLU": ['BB', 'SC1'], - "GLU0": ['BB', 'SC1'], - "THR": ['BB', 'SC1'], - "SER": ['BB', 'SC1'], - "LYS": ['BB', 'SC1', 'SC2'], - "LSN": ['BB', 'SC1', 'SC2'], - "ARG": ['BB', 'SC1', 'SC2'], - "ARG0": ['BB', 'SC1', 'SC2'], - "HIS": ['BB', 'SC1', 'SC2', 'SC3'], - "HSE": ['BB', 'SC1', 'SC2', 'SC3'], - "HSD": ['BB', 'SC1', 'SC2', 'SC3'], - "HSP": ['BB', 'SC1', 'SC2', 'SC3'], - "PHE": ['BB', 'SC1', 'SC2', 'SC3'], - "TYR": ['BB', 'SC1', 'SC2', 'SC3'], - "TRP": ['BB', 'SC1', 'SC2', 'SC3', 'SC4'], + "GLY": ["BB"], + "ALA": ["BB"], + "CYS": ["BB", "SC1"], + "VAL": ["BB", "SC1"], + "LEU": ["BB", "SC1"], + "ILE": ["BB", "SC1"], + "MET": ["BB", "SC1"], + "PRO": ["BB", "SC1"], + "ASN": ["BB", "SC1"], + "GLN": ["BB", "SC1"], + "ASP": ["BB", "SC1"], + "ASP0": ["BB", "SC1"], + "GLU": ["BB", "SC1"], + "GLU0": ["BB", "SC1"], + "THR": ["BB", "SC1"], + "SER": ["BB", "SC1"], + "LYS": ["BB", "SC1", "SC2"], + "LSN": ["BB", "SC1", "SC2"], + "ARG": ["BB", "SC1", "SC2"], + "ARG0": ["BB", "SC1", "SC2"], + "HIS": ["BB", "SC1", "SC2", "SC3"], + "HSE": ["BB", "SC1", "SC2", "SC3"], + "HSD": ["BB", "SC1", "SC2", "SC3"], + "HSP": ["BB", "SC1", "SC2", "SC3"], + "PHE": ["BB", "SC1", "SC2", "SC3"], + "TYR": ["BB", "SC1", "SC2", "SC3"], + "TRP": ["BB", "SC1", "SC2", "SC3", "SC4"], } PROT_SIDE_CHAINS_DICT_MARTINI3 = { - "GLY": ['BB'], - "ALA": ['BB', 'SC1'], - "CYS": ['BB', 'SC1'], - "VAL": ['BB', 'SC1'], - "LEU": ['BB', 'SC1'], - "ILE": ['BB', 'SC1'], - "MET": ['BB', 'SC1'], - "PRO": ['BB', 'SC1'], - "HYP": ['BB', 'SC1'], - "ASN": ['BB', 'SC1'], - "GLN": ['BB', 'SC1'], - "ASP": ['BB', 'SC1'], - "ASPP": ['BB', 'SC1'], - "ASH": ['BB', 'SC1'], - "GLU": ['BB', 'SC1'], - "GLUP": ['BB', 'SC1'], - "GLH": ['BB', 'SC1'], - "LYS": ['BB', 'SC1', 'SC2'], - "LSN": ['BB', 'SC1', 'SC2'], - "LYN": ['BB', 'SC1', 'SC2'], - "THR": ['BB', 'SC1'], - "SER": ['BB', 'SC1'], - "ARG": ['BB', 'SC1', 'SC2'], - "HIS": ['BB', 'SC1', 'SC2', 'SC3'], - "HIE": ['BB', 'SC1', 'SC2', 'SC3'], - "HSE": ['BB', 'SC1', 'SC2', 'SC3'], - "HSD": ['BB', 'SC1', 'SC2', 'SC3'], - "HID": ['BB', 'SC1', 'SC2', 'SC3'], - "HSP": ['BB', 'SC1', 'SC2', 'SC3'], - "HIP": ['BB', 'SC1', 'SC2', 'SC3'], - "PHE": ['BB', 'SC1', 'SC2', 'SC3'], - "TYR": ['BB', 'SC1', 'SC2', 'SC3', 'SC4'], - "TRP": ['BB', 'SC1', 'SC2', 'SC3', 'SC4', 'SC5'], + "GLY": ["BB"], + "ALA": ["BB", "SC1"], + "CYS": ["BB", "SC1"], + "VAL": ["BB", "SC1"], + "LEU": ["BB", "SC1"], + "ILE": ["BB", "SC1"], + "MET": ["BB", "SC1"], + "PRO": ["BB", "SC1"], + "HYP": ["BB", "SC1"], + "ASN": ["BB", "SC1"], + "GLN": ["BB", "SC1"], + "ASP": ["BB", "SC1"], + "ASPP": ["BB", "SC1"], + "ASH": ["BB", "SC1"], + "GLU": ["BB", "SC1"], + "GLUP": ["BB", "SC1"], + "GLH": ["BB", "SC1"], + "LYS": ["BB", "SC1", "SC2"], + "LSN": ["BB", "SC1", "SC2"], + "LYN": ["BB", "SC1", "SC2"], + "THR": ["BB", "SC1"], + "SER": ["BB", "SC1"], + "ARG": ["BB", "SC1", "SC2"], + "HIS": ["BB", "SC1", "SC2", "SC3"], + "HIE": ["BB", "SC1", "SC2", "SC3"], + "HSE": ["BB", "SC1", "SC2", "SC3"], + "HSD": ["BB", "SC1", "SC2", "SC3"], + "HID": ["BB", "SC1", "SC2", "SC3"], + "HSP": ["BB", "SC1", "SC2", "SC3"], + "HIP": ["BB", "SC1", "SC2", "SC3"], + "PHE": ["BB", "SC1", "SC2", "SC3"], + "TYR": ["BB", "SC1", "SC2", "SC3", "SC4"], + "TRP": ["BB", "SC1", "SC2", "SC3", "SC4", 'SC5'], } PROT_SIDE_CHAINS_DICT_all = { - "aa" : PROT_SIDE_CHAINS_DICT, - "martini2" : PROT_SIDE_CHAINS_DICT_MARTINI2, - "martini3" : PROT_SIDE_CHAINS_DICT_MARTINI3 + "aa": PROT_SIDE_CHAINS_DICT, + "martini2": PROT_SIDE_CHAINS_DICT_MARTINI2, + "martini3": PROT_SIDE_CHAINS_DICT_MARTINI3 } # For DNA, we use nucleo-bases as default atom selection @@ -226,9 +316,9 @@ DNA_ATOMS_MARTINI2 = ["SC1", "SC2", "SC3", "SC4"] DNA_ATOMS_MARTINI3 = ["SC1", "SC2", "SC3", "SC4"] DNA_ATOMS_all = { - "aa" : DNA_ATOMS, - "martini2" : DNA_ATOMS_MARTINI2, - "martini3" : DNA_ATOMS_MARTINI3, + "aa": DNA_ATOMS, + "martini2": DNA_ATOMS_MARTINI2, + "martini3": DNA_ATOMS_MARTINI3, } # Definition of all atoms in DNA @@ -352,16 +442,16 @@ } DNA_FULL_DICT_MARTINI2 = { - "DA" : ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], - "DC" : ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"], - "DG" : ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], - "DT" : ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"] + "DA": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], + "DC": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"], + "DG": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], + "DT": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"] } DNA_FULL_DICT_MARTINI3 = DNA_FULL_DICT_MARTINI2 DNA_FULL_DICT_all = { - "aa" : DNA_FULL_DICT, - "martini2" : DNA_FULL_DICT_MARTINI2, - "martini3" : DNA_FULL_DICT_MARTINI3, + "aa": DNA_FULL_DICT, + "martini2": DNA_FULL_DICT_MARTINI2, + "martini3": DNA_FULL_DICT_MARTINI3, } # RNA definitions @@ -371,9 +461,9 @@ RNA_ATOMS_MARTINI2 = ["BB1", "BB2", "BB3"] RNA_ATOMS_all = { - "aa" : RNA_ATOMS, - "martini2" : RNA_ATOMS_MARTINI2, - "martini3" : RNA_ATOMS_MARTINI2 + "aa": RNA_ATOMS, + "martini2": RNA_ATOMS_MARTINI2, + "martini3": RNA_ATOMS_MARTINI2 } # All atoms in RNA @@ -476,16 +566,16 @@ } RNA_FULL_DICT_MARTINI2 = { - "A" : ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], - "C" : ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"], - "G" : ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], - "U" : ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"] + "A": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], + "C": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"], + "G": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], + "U": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"] } RNA_FULL_DICT_MARTINI3 = RNA_FULL_DICT_MARTINI2 RNA_FULL_DICT_all = { - "aa" : RNA_FULL_DICT, - "martini2" : RNA_FULL_DICT_MARTINI2, - "martini3" : RNA_FULL_DICT_MARTINI3, + "aa": RNA_FULL_DICT, + "martini2": RNA_FULL_DICT_MARTINI2, + "martini3": RNA_FULL_DICT_MARTINI3, } @@ -587,7 +677,7 @@ def load_coords( add_resname : bool use the residue name in the identifier - + keep_hetatm : bool Should HETATM lines be considered ? @@ -604,9 +694,12 @@ def load_coords( idx: int = 0 # Set types of coordinates lines to extract if keep_hetatm: - coordinates_line_to_extract = ("ATOM", "HETATM", ) + coordinates_line_to_extract = ( + "ATOM", + "HETATM", + ) else: - coordinates_line_to_extract = ("ATOM", ) + coordinates_line_to_extract = ("ATOM",) # Check filetype if isinstance(pdb_f, PDBFile): pdb_f = pdb_f.rel_path @@ -704,9 +797,7 @@ def load_coords( return coord_dic, chain_ranges -def get_atoms(pdb: PDBPath, - full: bool = False, - ff: str = "aa") -> AtomsDict: +def get_atoms(pdb: PDBPath, full: bool = False, ff: str = "aa") -> AtomsDict: """Identify what is the molecule type of each PDB. Parameters @@ -771,41 +862,10 @@ def get_atoms(pdb: PDBPath, return atom_dic -ResCode = Literal[ - "C", - "D", - "S", - "Q", - "K", - "I", - "P", - "T", - "F", - "N", - "G", - "H", - "L", - "R", - "W", - "A", - "V", - "E", - "Y", - "M", - "A", - "G", - "C", - "T", - "X", -] -""" -The single letter code of a residue. - -Unrecognized residues' code is `X`. -""" - - -def pdb2fastadic(pdb_f: PDBPath, keep_hetatm: bool = False) -> dict[str, dict[int, str]]: +def pdb2fastadic( + pdb_f: PDBPath, + keep_hetatm: bool = False, +) -> dict[str, dict[int, str]]: """ Write the sequence as a fasta. @@ -821,68 +881,22 @@ def pdb2fastadic(pdb_f: PDBPath, keep_hetatm: bool = False) -> dict[str, dict[in seq_dic : dict dict of fasta sequences (one per chain) """ - res_codes = dict( - [ - ("CYS", "C"), - ("ASP", "D"), - ("SER", "S"), - ("GLN", "Q"), - ("LYS", "K"), - ("ILE", "I"), - ("PRO", "P"), - ("THR", "T"), - ("PHE", "F"), - ("ASN", "N"), - ("GLY", "G"), - ("HIS", "H"), - ("LEU", "L"), - ("ARG", "R"), - ("TRP", "W"), - ("ALA", "A"), - ("VAL", "V"), - ("GLU", "E"), - ("TYR", "Y"), - ("MET", "M"), - ("DA", "A"), - ("DG", "G"), - ("DC", "C"), - ( - "DT", - "T", - ), # 9/8/2023: adding non-standard amino-acids (src/haddock/cns/toppar/protein-allhdg5-4.top) # noqa: E501 - ("ALY", "K"), - ("ASH", "D"), - ("CFE", "C"), - ("CSP", "C"), - ("CYC", "C"), - ("CYF", "C"), - ("CYM", "C"), - ("DDZ", "A"), - ("GLH", "E"), - ("HLY", "P"), - ("HY3", "P"), - ("HYP", "P"), - ("M3L", "K"), - ("MLY", "K"), - ("MLZ", "K"), - ("MSE", "M"), - ("NEP", "H"), - ("PNS", "S"), - ("PTR", "Y"), - ("SEP", "S"), - ("TOP", "T"), - ("TYP", "Y"), - ("TYS", "Y"), - ] - ) seq_dic: dict[str, dict[int, str]] = {} if isinstance(pdb_f, PDBFile): pdb_f = pdb_f.rel_path - coord_req = ("ATOM", "HETATM", ) if keep_hetatm else ("ATOM", ) - with open(pdb_f) as fh: + coord_req = ( + ( + "ATOM", + "HETATM", + ) + if keep_hetatm + else ("ATOM",) + ) + + with open(pdb_f, "r") as fh: for line in fh.readlines(): if line.startswith(coord_req): res_num = int(line[slc_resseq]) @@ -891,7 +905,7 @@ def pdb2fastadic(pdb_f: PDBPath, keep_hetatm: bool = False) -> dict[str, dict[in if res_name in RES_TO_BE_IGNORED: continue try: - one_letter = res_codes[res_name] + one_letter = RES_3L1L[res_name] except KeyError: one_letter = "X" if chain not in seq_dic: @@ -901,7 +915,9 @@ def pdb2fastadic(pdb_f: PDBPath, keep_hetatm: bool = False) -> dict[str, dict[in def get_align( - method: str, lovoalign_exec: FilePath, keep_hetatm: bool = False, + method: str, + lovoalign_exec: FilePath, + keep_hetatm: bool = False, ) -> partial[dict[str, dict[int, int]]]: """ Get the alignment function. @@ -962,12 +978,13 @@ def align_strct( """ if lovoalign_exec is None: log.error( - "Structural alignment needs LovoAlign " "get it at github.com/m3g/lovoalign" + "Structural alignment needs LovoAlign " + "get it at github.com/m3g/lovoalign" ) raise ALIGNError("Path to LovoAlign executable required.") if not lovoalign_exec: - raise ALIGNError("lovoalign_exec parameter not defined ") + raise ALIGNError("lovoalign_exec parameter not defined.") if not os.access(lovoalign_exec, os.X_OK): raise ALIGNError(f"{lovoalign_exec!r} for LovoAlign is not executable") @@ -1013,7 +1030,7 @@ def align_strct( alignment_end_index = i - 2 elif "ERROR" in line: failed_pdb = line.split()[-1] - _msg = f"LovoAlign could not read {failed_pdb} " "is it a ligand?" + _msg = f"LovoAlign could not read {failed_pdb} is it a ligand?" log.warning(_msg) alignment_pass = False @@ -1023,7 +1040,8 @@ def align_strct( if not alignment_pass: # This alignment failed, move on to the next log.warning( - f"Skipping alignment of chain {chain}, " "used sequential matching" + f"Skipping alignment of chain {chain}, " + "used sequential matching" ) continue @@ -1051,7 +1069,10 @@ def align_strct( ", please check the results carefully" ) else: - log.info(f'"Structural" identity of chain {chain} is {identity:.2f}%') + log.info( + f'"Structural" identity of chain {chain} ' + f"is {identity:.2f}%" + ) # logging.debug("Reading alignment and matching numbering") for element in alignment: @@ -1382,8 +1403,7 @@ def dump_as_izone(fname, numbering_dic, model2ref_chain_dict=None): # izone_str = ( "ZONE " - f"{chain}{bound_res}:{unb_chain}{unbound_res}" - f"{os.linesep}" + f"{chain}{bound_res}:{unb_chain}{unbound_res}{os.linesep}" ) fh.write(izone_str) From 8e33439c8a9e7021fe9af325f1a2cf2c384794e5 Mon Sep 17 00:00:00 2001 From: VGPReys Date: Sun, 9 Aug 2026 13:29:32 +0200 Subject: [PATCH 3/8] lint2 --- src/haddock/libs/libalign.py | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/haddock/libs/libalign.py b/src/haddock/libs/libalign.py index d9965eb169..e0e8698ad4 100644 --- a/src/haddock/libs/libalign.py +++ b/src/haddock/libs/libalign.py @@ -167,7 +167,7 @@ PROT_ATOMS_all = { "aa": PROT_ATOMS, "martini2": PROT_ATOMS_MARTINI2, - "martini3": PROT_ATOMS_MARTINI2, # The backbone particle is identical between MARTINI 2 and 3 + "martini3": PROT_ATOMS_MARTINI2, # The backbone particle is identical between MARTINI 2 and 3 } # Side chains @@ -285,13 +285,13 @@ "HIP": ["BB", "SC1", "SC2", "SC3"], "PHE": ["BB", "SC1", "SC2", "SC3"], "TYR": ["BB", "SC1", "SC2", "SC3", "SC4"], - "TRP": ["BB", "SC1", "SC2", "SC3", "SC4", 'SC5'], + "TRP": ["BB", "SC1", "SC2", "SC3", "SC4", "SC5"], } PROT_SIDE_CHAINS_DICT_all = { "aa": PROT_SIDE_CHAINS_DICT, "martini2": PROT_SIDE_CHAINS_DICT_MARTINI2, - "martini3": PROT_SIDE_CHAINS_DICT_MARTINI3 + "martini3": PROT_SIDE_CHAINS_DICT_MARTINI3, } # For DNA, we use nucleo-bases as default atom selection @@ -445,7 +445,7 @@ "DA": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], "DC": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"], "DG": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], - "DT": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"] + "DT": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"], } DNA_FULL_DICT_MARTINI3 = DNA_FULL_DICT_MARTINI2 DNA_FULL_DICT_all = { @@ -459,11 +459,11 @@ RNA_RES = ["A", "G", "C", "U"] RNA_ATOMS = ["P", "O5'", "C5'", "C4'", "C3'", "O3'"] RNA_ATOMS_MARTINI2 = ["BB1", "BB2", "BB3"] - +RNA_ATOMS_MARTINI3 = RNA_ATOMS_MARTINI2 RNA_ATOMS_all = { "aa": RNA_ATOMS, "martini2": RNA_ATOMS_MARTINI2, - "martini3": RNA_ATOMS_MARTINI2 + "martini3": RNA_ATOMS_MARTINI3, } # All atoms in RNA @@ -569,7 +569,7 @@ "A": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], "C": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"], "G": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3", "SC4"], - "U": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"] + "U": ["BB1", "BB2", "BB3", "SC1", "SC2", "SC3"], } RNA_FULL_DICT_MARTINI3 = RNA_FULL_DICT_MARTINI2 RNA_FULL_DICT_all = { @@ -978,8 +978,7 @@ def align_strct( """ if lovoalign_exec is None: log.error( - "Structural alignment needs LovoAlign " - "get it at github.com/m3g/lovoalign" + "Structural alignment needs LovoAlign get it at github.com/m3g/lovoalign" ) raise ALIGNError("Path to LovoAlign executable required.") @@ -1040,8 +1039,7 @@ def align_strct( if not alignment_pass: # This alignment failed, move on to the next log.warning( - f"Skipping alignment of chain {chain}, " - "used sequential matching" + f"Skipping alignment of chain {chain}, used sequential matching" ) continue @@ -1070,8 +1068,7 @@ def align_strct( ) else: log.info( - f'"Structural" identity of chain {chain} ' - f"is {identity:.2f}%" + f'"Structural" identity of chain {chain} is {identity:.2f}%' ) # logging.debug("Reading alignment and matching numbering") @@ -1402,8 +1399,7 @@ def dump_as_izone(fname, numbering_dic, model2ref_chain_dict=None): unb_chain = model2ref_chain_dict[chain] # izone_str = ( - "ZONE " - f"{chain}{bound_res}:{unb_chain}{unbound_res}{os.linesep}" + f"ZONE {chain}{bound_res}:{unb_chain}{unbound_res}{os.linesep}" ) fh.write(izone_str) From 083e68bab6bbb09c862dafe92c8a7459007c804a Mon Sep 17 00:00:00 2001 From: VGPReys Date: Sun, 9 Aug 2026 14:40:07 +0200 Subject: [PATCH 4/8] lint3 --- src/haddock/libs/libalign.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/haddock/libs/libalign.py b/src/haddock/libs/libalign.py index e0e8698ad4..1af553d6d9 100644 --- a/src/haddock/libs/libalign.py +++ b/src/haddock/libs/libalign.py @@ -285,7 +285,7 @@ "HIP": ["BB", "SC1", "SC2", "SC3"], "PHE": ["BB", "SC1", "SC2", "SC3"], "TYR": ["BB", "SC1", "SC2", "SC3", "SC4"], - "TRP": ["BB", "SC1", "SC2", "SC3", "SC4", "SC5"], + "TRP": ["BB", "SC1", "SC2", "SC3", "SC4", "SC5"], } PROT_SIDE_CHAINS_DICT_all = { @@ -1067,9 +1067,7 @@ def align_strct( ", please check the results carefully" ) else: - log.info( - f'"Structural" identity of chain {chain} is {identity:.2f}%' - ) + log.info(f'"Structural" identity of chain {chain} is {identity:.2f}%') # logging.debug("Reading alignment and matching numbering") for element in alignment: From a5a5f1c65db54ef862da3cd8f31d3eadd59487f2 Mon Sep 17 00:00:00 2001 From: VGPReys Date: Mon, 10 Aug 2026 09:01:23 +0200 Subject: [PATCH 5/8] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35133081ae..b2726e15a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Changelog +- 2026-08-04: Fixed nucleobase selection for DNA default caprieval - Issue #1658 - 2026-08-04: Added workflow module ordering validation - related to Issue #1530 - 2026-08-02: Fixed logging/warning leaks - Issue #1647 - 2026-07-31: Fixed D-amino acid detection - Issue #1636 From fea5b1aa2ab2b93c7f2555730cb174ebe85a2076 Mon Sep 17 00:00:00 2001 From: VGPReys Date: Mon, 10 Aug 2026 09:01:53 +0200 Subject: [PATCH 6/8] changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2726e15a6..50d9c83391 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -- 2026-08-04: Fixed nucleobase selection for DNA default caprieval - Issue #1658 +- 2026-08-10: Fixed nucleobase selection for DNA default caprieval - Issue #1658 - 2026-08-04: Added workflow module ordering validation - related to Issue #1530 - 2026-08-02: Fixed logging/warning leaks - Issue #1647 - 2026-07-31: Fixed D-amino acid detection - Issue #1636 From 774a448380ff1ef954d1939097395bc970e597aa Mon Sep 17 00:00:00 2001 From: VGPReys Date: Mon, 10 Aug 2026 14:12:01 +0200 Subject: [PATCH 7/8] fix --- src/haddock/libs/libalign.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/haddock/libs/libalign.py b/src/haddock/libs/libalign.py index 1af553d6d9..85d2f479bb 100644 --- a/src/haddock/libs/libalign.py +++ b/src/haddock/libs/libalign.py @@ -106,10 +106,6 @@ ("DG", "G"), ("DC", "C"), ("DT", "T"), - ("A", "A"), - ("G", "G"), - ("C", "C"), - ("U", "U"), # 9/8/2023: adding non-standard amino-acids (src/haddock/cns/toppar/protein-allhdg5-4.top) # noqa: E501 ("ALY", "K"), ("ASH", "D"), From 4a946ff7869d953e40eec81817e7b88dd3fa3804 Mon Sep 17 00:00:00 2001 From: VGPReys Date: Mon, 10 Aug 2026 14:45:41 +0200 Subject: [PATCH 8/8] fix atom names in DNA and RNA FULL_DICTs --- src/haddock/libs/libalign.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/haddock/libs/libalign.py b/src/haddock/libs/libalign.py index 85d2f479bb..61ebd7a40a 100644 --- a/src/haddock/libs/libalign.py +++ b/src/haddock/libs/libalign.py @@ -321,8 +321,8 @@ DNA_FULL_DICT = { "DA": [ "P", - "O1P", - "O2P", + "OP1", + "OP2", "O5'", "C5'", "C4'", @@ -350,8 +350,8 @@ ], "DG": [ "P", - "O1P", - "O2P", + "OP1", + "OP2", "O5'", "C5'", "C4'", @@ -379,8 +379,8 @@ ], "DC": [ "P", - "O1P", - "O2P", + "OP1", + "OP2", "O5'", "C5'", "C4'", @@ -408,8 +408,8 @@ ], "DT": [ "P", - "O1P", - "O2P", + "OP1", + "OP2", "O5'", "C5'", "C4'", @@ -526,13 +526,11 @@ "C2'", "O2'", "C1'", - "N9", "C5", - "C6", "O6", "N1", "C2", - "N2", + "O2", "N3", "C4", "N4",