From 02089369b4d1ab4e258fce36f4831bb07540df85 Mon Sep 17 00:00:00 2001
From: Rafal Gumienny <r.gumienny@unibas.ch>
Date: Fri, 20 Apr 2018 09:44:52 +0200
Subject: [PATCH] fix: SCHWED-3121 Save alignments in the output, pull out
 chain_mapping

---
 actions/ost-compare-structures | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)

diff --git a/actions/ost-compare-structures b/actions/ost-compare-structures
index a4a821a5a..b1d2ed816 100644
--- a/actions/ost-compare-structures
+++ b/actions/ost-compare-structures
@@ -450,6 +450,25 @@ def _CheckConsistency(reference, model, chain_mapping, log_error):
     return is_cons
 
 
+def _GetAlignmentsAsFasta(alignments):
+    """Get the alignments as FASTA formated string.
+
+    :param alignments: Alignments
+    :type alignments: list of AlignmentHandle
+    :returns: list of alignments in FASTA format
+    :rtype: list of strings
+    """
+    strings = list()
+    for alignment in alignments:
+        aln_str = ">reference:%s\n%s\n>model:%s\n%s" % (
+            alignment.GetSequence(0).name,
+            alignment.GetSequence(0).GetString(),
+            alignment.GetSequence(1).name,
+            alignment.GetSequence(1).GetString())
+        strings.append(aln_str)
+    return strings
+
+
 def _ReadStructureFile(path):
     """Safely read structure file into OST entity.
 
@@ -618,6 +637,9 @@ def _Main():
                 qs_scorer.chain_mapping,
                 opts.consistency_checks)
             reference_results["info"]["residue_names_consistent"] = is_cons
+            reference_results["info"]["mapping"] = {
+                "chain_mapping": qs_scorer.chain_mapping,
+                "alignments": _GetAlignmentsAsFasta(qs_scorer.alignments)}
             skip_score = False
             if opts.consistency_checks:
                 if not is_cons:
@@ -653,8 +675,7 @@ def _Main():
                         "model_name": model_name,
                         "reference_name": reference_name,
                         "global_score": 0.0,
-                        "best_score": 0.0,
-                        "chain_mapping": qs_scorer.chain_mapping}
+                        "best_score": 0.0}
                 else:
                     ost.LogInfo("Computing QS-score")
                     try:
@@ -664,8 +685,7 @@ def _Main():
                             "model_name": model_name,
                             "reference_name": reference_name,
                             "global_score": qs_scorer.global_score,
-                            "best_score": qs_scorer.best_score,
-                            "chain_mapping": qs_scorer.chain_mapping}
+                            "best_score": qs_scorer.best_score}
                     except qsscoring.QSscoreError as ex:
                         # default handling: report failure and set score to 0
                         ost.LogError('QSscore failed:', str(ex))
@@ -675,8 +695,7 @@ def _Main():
                             "model_name": model_name,
                             "reference_name": reference_name,
                             "global_score": 0.0,
-                            "best_score": 0.0,
-                            "chain_mapping": qs_scorer.chain_mapping}
+                            "best_score": 0.0}
             # Calculate lDDT
             if opts.lddt:
                 ost.LogInfo("-" * 80)
-- 
GitLab