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