From 2e45d526222e916a414ac7e31ff14f081e53b320 Mon Sep 17 00:00:00 2001
From: Gabriel Studer <gabriel.studer@unibas.ch>
Date: Mon, 2 Nov 2020 20:58:58 +0100
Subject: [PATCH] Better error handling in superposition dialog to avoid
 crashing the GUI

---
 modules/gui/pymod/dng/menu.py                |  4 ++++
 modules/gui/pymod/dng/superpositiondialog.py | 16 +++++++++++-----
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/modules/gui/pymod/dng/menu.py b/modules/gui/pymod/dng/menu.py
index 487eec75c..cab4b648f 100644
--- a/modules/gui/pymod/dng/menu.py
+++ b/modules/gui/pymod/dng/menu.py
@@ -212,6 +212,10 @@ class SceneMenu(QMenu):
         gfx_ent_1.UpdatePositions()
         gfx.Scene().CenterOn(gfx_ent_2)
       LogScript('RMSD: %.3f'%sd.rmsd)
+    elif sd.superposition_error != None:
+      LogScript('Superposition Failed: ' + sd.superposition_error)
+    else:
+      LogScript('Superposition Failed!')
 
 class WindowMenu(QMenu):
   def __init__(self, parent=None):
diff --git a/modules/gui/pymod/dng/superpositiondialog.py b/modules/gui/pymod/dng/superpositiondialog.py
index 351cf4f97..790ce49ae 100644
--- a/modules/gui/pymod/dng/superpositiondialog.py
+++ b/modules/gui/pymod/dng/superpositiondialog.py
@@ -122,6 +122,7 @@ class SuperpositionDialog(QtWidgets.QDialog):
     self.rmsd_superposed_atoms = None
     self.rmsd = None
     self.fraction_superposed = None
+    self.superposition_error = None
     self._mmethod_dict = {'number': 'number',
                           'index': 'index',
                           'local alignment': 'local-aln',
@@ -223,11 +224,16 @@ class SuperpositionDialog(QtWidgets.QDialog):
     view_one = self._chain_one.selected_chain
     view_two = self._chain_two.selected_chain
     atoms = self._GetAtomSelection()
-    sp = Superpose(view_two, view_one,
-                   self._mmethod_dict[str(self._methods.currentText())],
-                   atoms, iterative=self._iterative, 
-                   max_iterations=self._it_in.value(), 
-                   distance_threshold=self._dist_in.value())
+    try:
+      sp = Superpose(view_two, view_one,
+                     self._mmethod_dict[str(self._methods.currentText())],
+                     atoms, iterative=self._iterative, 
+                     max_iterations=self._it_in.value(), 
+                     distance_threshold=self._dist_in.value())
+    except Exception as e:
+      # mark as failed by setting superposition_error and let caller handle it
+      self.superposition_error = str(e)
+      return
     self.rmsd = sp.rmsd
     if self._iterative:
       self.rmsd_superposed_atoms = sp.rmsd_superposed_atoms
-- 
GitLab