From 108c8f0ec55cee80e9fe6912b4e14ff81d45f77d Mon Sep 17 00:00:00 2001
From: Gabriel Studer <gabriel.studer@unibas.ch>
Date: Thu, 27 Sep 2018 09:52:33 +0200
Subject: [PATCH] Avoid loading the rotamer library several times for one
 model. This can happen in case of ring punch fixes.

---
 modelling/pymod/_pipeline.py | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/modelling/pymod/_pipeline.py b/modelling/pymod/_pipeline.py
index fdea4850..d68c6ddf 100644
--- a/modelling/pymod/_pipeline.py
+++ b/modelling/pymod/_pipeline.py
@@ -164,7 +164,8 @@ def _GetSimEntity(sim):
 
 
 def BuildSidechains(mhandle, merge_distance=4, fragment_db=None,
-                    structure_db=None, torsion_sampler=None):
+                    structure_db=None, torsion_sampler=None,
+                    rotamer_library=None):
     '''Build sidechains for model.
 
     This is a wrapper for :func:`promod3.modelling.ReconstructSidechains`, 
@@ -190,10 +191,16 @@ def BuildSidechains(mhandle, merge_distance=4, fragment_db=None,
                             if ring punches are found. A default one is loaded
                             if None.
     :type torsion_sampler:  :class:`~promod3.loop.TorsionSampler`
+    :param rotamer_library: Used as parameter for 
+                            :func:`modelling.ReconstructSidechains`, a default 
+                            one is loaded if None.
+    :type rotamer_library:  :class:`~promod3.sidechain.RotamerLib` or
+                            :class:`~promod3.sidechain.BBDepRotamerLib` 
     '''
     prof = core.StaticRuntimeProfiler.StartScoped('pipeline::BuildSidechains')
     ost.LogInfo("Rebuilding sidechains.")
-    ReconstructSidechains(mhandle.model, keep_sidechains=True)
+    ReconstructSidechains(mhandle.model, keep_sidechains=True, 
+                          rotamer_library=rotamer_library)
     # check for ring punches
     rings = GetRings(mhandle.model)
     ring_punches = GetRingPunches(rings, mhandle.model)
@@ -221,7 +228,8 @@ def BuildSidechains(mhandle, merge_distance=4, fragment_db=None,
         FillLoopsByDatabase(mhandle, fragment_db, structure_db,
                             torsion_sampler, ring_punch_detection=2)
         # re-build sidechains
-        ReconstructSidechains(mhandle.model, keep_sidechains=True)
+        ReconstructSidechains(mhandle.model, keep_sidechains=True,
+                              rotamer_library=rotamer_library)
         # restore gaps
         mhandle.gaps = StructuralGapList()
         for g in old_gaps:
@@ -459,6 +467,7 @@ def BuildFromRawModel(mhandle, use_amber_ff=False, extra_force_fields=list()):
     fragment_db = loop.LoadFragDB()
     structure_db = loop.LoadStructureDB()
     torsion_sampler = loop.LoadTorsionSamplerCoil()
+    rotamer_library = sidechain.LoadDunbrackLib()
     merge_distance = 4
 
     # remove terminal gaps
@@ -471,7 +480,7 @@ def BuildFromRawModel(mhandle, use_amber_ff=False, extra_force_fields=list()):
 
     # build sidechains
     BuildSidechains(mhandle, merge_distance, fragment_db,
-                    structure_db, torsion_sampler)
+                    structure_db, torsion_sampler, rotamer_library)
 
     # minimize energy of final model using molecular mechanics
     MinimizeModelEnergy(mhandle, use_amber_ff=use_amber_ff,
-- 
GitLab