From f5efafc7748ac323f3ca27647a001948c28e4b8e Mon Sep 17 00:00:00 2001
From: Gabriel Studer <gabriel.studer@unibas.ch>
Date: Tue, 31 Oct 2023 13:49:54 +0100
Subject: [PATCH] Scoring: add number of native and model contacts as
 attributes to Scorer

---
 actions/ost-compare-structures   |  2 ++
 modules/mol/alg/pymod/scoring.py | 32 +++++++++++++++++++++++++++-----
 2 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/actions/ost-compare-structures b/actions/ost-compare-structures
index f7021ffd9..9dacd7786 100644
--- a/actions/ost-compare-structures
+++ b/actions/ost-compare-structures
@@ -700,6 +700,8 @@ def _Process(model, reference, args):
         out["fnat"] = scorer.fnat
         out["irmsd"] = scorer.irmsd
         out["lrmsd"] = scorer.lrmsd
+        out["nnat"] = scorer.nnat
+        out["nmdl"] = scorer.nmdl
         out["dockq_ave"] = scorer.dockq_ave
         out["dockq_wave"] = scorer.dockq_wave
         out["dockq_ave_full"] = scorer.dockq_ave_full
diff --git a/modules/mol/alg/pymod/scoring.py b/modules/mol/alg/pymod/scoring.py
index 54dba0937..45ccb439e 100644
--- a/modules/mol/alg/pymod/scoring.py
+++ b/modules/mol/alg/pymod/scoring.py
@@ -289,6 +289,8 @@ class Scorer:
         self._fnonnat = None
         self._irmsd = None
         self._lrmsd = None
+        self._nnat = None
+        self._nmdl = None
         self._dockq_scores = None
         self._dockq_ave = None
         self._dockq_wave = None
@@ -953,6 +955,26 @@ class Scorer:
             self._compute_dockq_scores()
         return self._fnat
 
+    @property
+    def nnat(self):
+        """ N native contacts for interfaces in :attr:`~dockq_interfaces` 
+
+        :class:`list` of :class:`int`
+        """
+        if self._nnat is None:
+            self._compute_dockq_scores()
+        return self._nnat
+
+    @property
+    def nmdl(self):
+        """ N model contacts for interfaces in :attr:`~dockq_interfaces` 
+
+        :class:`list` of :class:`int`
+        """
+        if self._nmdl is None:
+            self._compute_dockq_scores()
+        return self._nmdl
+
     @property
     def fnonnat(self):
         """ fnonnat scores for interfaces in :attr:`~dockq_interfaces` 
@@ -1506,9 +1528,8 @@ class Scorer:
         self._fnonnat = list()
         self._irmsd = list()
         self._lrmsd = list()
-
-        # keep track of native counts for weights in dockq_wave/dockq_wave_full
-        native_counts = list()
+        self._nnat = list()
+        self._nmdl = list()
 
         dockq_alns = dict()
         for aln in self.aln:
@@ -1531,7 +1552,8 @@ class Scorer:
             self._irmsd.append(res["irmsd"])
             self._lrmsd.append(res["lrmsd"])
             self._dockq_scores.append(res["DockQ"])
-            native_counts.append(res["nnat"])
+            self._nnat.append(res["nnat"])
+            self._nmdl.append(res["nmdl"])
 
         # keep track of native counts in target interfaces which are
         # not covered in model in order to compute
@@ -1554,7 +1576,7 @@ class Scorer:
         # - average weighted by native_contacts
         # - the two above including nonmapped_contact_interfaces => set DockQ to 0.0
         scores = np.array([self._dockq_scores])
-        weights = np.array([native_counts])
+        weights = np.array([self._nnat])
         if len(scores) > 0:
             self._dockq_ave = np.mean(scores)
         else:
-- 
GitLab