From bea30154ec77fddbf253e891b90e41a9e8ff508d Mon Sep 17 00:00:00 2001 From: Gabriel Studer <gabriel.studer@unibas.ch> Date: Fri, 4 Apr 2025 15:01:48 +0200 Subject: [PATCH] Scorer: lddt bugfix If it happens that stereochemistry checks remove a full chain, this chain still exists in the chain mapping that is passed to the lDDT scorer. The input check in the lDDT scorer then raises because it gets a mapping for a model chain that does not exist. --- modules/mol/alg/pymod/scoring.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/modules/mol/alg/pymod/scoring.py b/modules/mol/alg/pymod/scoring.py index 9f88d18fc..500a046cd 100644 --- a/modules/mol/alg/pymod/scoring.py +++ b/modules/mol/alg/pymod/scoring.py @@ -2225,10 +2225,6 @@ class Scorer: flat_mapping = self.mapping.GetFlatMapping(mdl_as_key=True) # make alignments accessible by mdl seq name - stereochecked_alns = dict() - for aln in self.stereochecked_aln: - mdl_seq = aln.GetSequence(1) - stereochecked_alns[mdl_seq.name] = aln alns = dict() for aln in self.aln: mdl_seq = aln.GetSequence(1) @@ -2284,10 +2280,25 @@ class Scorer: else: + # keep track what chains we have in the stereochecked model + # there might be really wild cases where a full model + # chain is removed in the stereochemistry checks. + # We need to adapt lddt chain mapping in these cases + mdl_chains = set([ch.name for ch in self.stereochecked_model.chains]) + + # make alignments accessible by mdl seq name + stereochecked_alns = dict() + for aln in self.stereochecked_aln: + mdl_seq = aln.GetSequence(1) + if mdl_seq.GetName() in mdl_chains: + stereochecked_alns[mdl_seq.name] = aln + lddt_chain_mapping = dict() for mdl_ch, trg_ch in flat_mapping.items(): if mdl_ch in stereochecked_alns: lddt_chain_mapping[mdl_ch] = trg_ch + + lddt_score = self.lddt_scorer.lDDT(self.stereochecked_model, chain_mapping = lddt_chain_mapping, residue_mapping = stereochecked_alns, -- GitLab