Skip to content
Snippets Groups Projects
Commit b888a131 authored by Studer Gabriel's avatar Studer Gabriel
Browse files

make subrotamer optimization available in SidechainReconstructor

parent c1632429
Branches
Tags
No related merge requests found
...@@ -20,7 +20,8 @@ SidechainReconstructor Class ...@@ -20,7 +20,8 @@ SidechainReconstructor Class
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
.. class:: SidechainReconstructor(keep_sidechains=True, build_disulfids=True, \ .. class:: SidechainReconstructor(keep_sidechains=True, build_disulfids=True, \
cutoff=20, graph_max_complexity=100000000, \ optimize_subrotamers=False, cutoff=20, \
graph_max_complexity=100000000, \
graph_intial_epsilon=0.02, \ graph_intial_epsilon=0.02, \
disulfid_score_thresh=45) disulfid_score_thresh=45)
...@@ -41,6 +42,11 @@ SidechainReconstructor Class ...@@ -41,6 +42,11 @@ SidechainReconstructor Class
the result. the result.
:type build_disulfids: :class:`bool` :type build_disulfids: :class:`bool`
:param optimize_subrotamers: Flag, whether the :func:`SubrotamerOptimizer`
with default parametrization should be called
if we're dealing with FRM rotamers.
:type optimize_subrotamers: :class:`bool`
:param cutoff: Cutoff used to search relevant residues surrounding the loop. :param cutoff: Cutoff used to search relevant residues surrounding the loop.
:type cutoff: :class:`float` :type cutoff: :class:`float`
......
...@@ -91,8 +91,9 @@ void export_SidechainReconstructor() { ...@@ -91,8 +91,9 @@ void export_SidechainReconstructor() {
class_<SidechainReconstructor, SidechainReconstructorPtr> class_<SidechainReconstructor, SidechainReconstructorPtr>
("SidechainReconstructor", no_init) ("SidechainReconstructor", no_init)
.def(init<bool, bool, Real, uint64_t, Real, Real>( .def(init<bool, bool, bool, Real, uint64_t, Real, Real>(
(arg("keep_sidechains")=true, arg("build_disulfids")=true, (arg("keep_sidechains")=true, arg("build_disulfids")=true,
arg("optimize_subrotamers")=false,
arg("cutoff")=20, arg("graph_max_complexity")=100000000, arg("cutoff")=20, arg("graph_max_complexity")=100000000,
arg("graph_intial_epsilon")=0.02, arg("graph_intial_epsilon")=0.02,
arg("disulfid_score_thresh")=45))) arg("disulfid_score_thresh")=45)))
......
#include <promod3/sidechain/sidechain_reconstructor.hh> #include <promod3/sidechain/sidechain_reconstructor.hh>
#include <promod3/sidechain/disulfid.hh> #include <promod3/sidechain/disulfid.hh>
#include <promod3/sidechain/rotamer_graph.hh> #include <promod3/sidechain/rotamer_graph.hh>
#include <promod3/sidechain/subrotamer_optimizer.hh>
#include <promod3/core/message.hh> #include <promod3/core/message.hh>
#include <promod3/core/runtime_profiling.hh> #include <promod3/core/runtime_profiling.hh>
...@@ -321,6 +322,24 @@ void SidechainReconstructor::CollectRotamerGroups_( ...@@ -321,6 +322,24 @@ void SidechainReconstructor::CollectRotamerGroups_(
} }
} }
void ApplySubrotamerOptimization(std::vector<FRMRotamerGroupPtr>& rotamer_groups,
const std::vector<int>& solution) {
uint num_rotamer_groups = rotamer_groups.size();
std::vector<FRMRotamerPtr> rotamers(rotamer_groups.size());
for(uint i = 0; i < num_rotamer_groups; ++i){
rotamers[i] = (*rotamer_groups[i])[solution[i]];
}
SubrotamerOptimizer(rotamers);
}
void ApplySubrotamerOptimization(std::vector<RRMRotamerGroupPtr>& rotamer_groups,
const std::vector<int>& solution) {
//there's nothing to do...
}
template<typename RotamerGroup> template<typename RotamerGroup>
void SidechainReconstructor::SolveSystem_( void SidechainReconstructor::SolveSystem_(
SidechainReconstructionDataPtr res) const { SidechainReconstructionDataPtr res) const {
...@@ -377,6 +396,11 @@ void SidechainReconstructor::SolveSystem_( ...@@ -377,6 +396,11 @@ void SidechainReconstructor::SolveSystem_(
std::pair<std::vector<int>,Real> solution = std::pair<std::vector<int>,Real> solution =
graph->TreeSolve(graph_max_complexity_, graph_intial_epsilon_); graph->TreeSolve(graph_max_complexity_, graph_intial_epsilon_);
// do subrotamer optimization if required
if(optimize_subrotamers_){
ApplySubrotamerOptimization(rotamer_groups, solution.first);
}
// apply solution to subset of data // apply solution to subset of data
for (uint i = 0; i < res->rotamer_res_indices.size(); ++i) { for (uint i = 0; i < res->rotamer_res_indices.size(); ++i) {
const uint res_idx = res->rotamer_res_indices[i]; const uint res_idx = res->rotamer_res_indices[i];
......
...@@ -38,12 +38,15 @@ class SidechainReconstructor { ...@@ -38,12 +38,15 @@ class SidechainReconstructor {
public: public:
SidechainReconstructor(bool keep_sidechains = true, SidechainReconstructor(bool keep_sidechains = true,
bool build_disulfids = true, Real cutoff = 20, bool build_disulfids = true,
bool optimize_subrotamers = false,
Real cutoff = 20,
uint64_t graph_max_complexity = 100000000, uint64_t graph_max_complexity = 100000000,
Real graph_intial_epsilon = 0.02, Real graph_intial_epsilon = 0.02,
Real disulfid_score_thresh = 45) Real disulfid_score_thresh = 45)
: keep_sidechains_(keep_sidechains) : keep_sidechains_(keep_sidechains)
, build_disulfids_(build_disulfids) , build_disulfids_(build_disulfids)
, optimize_subrotamers_(optimize_subrotamers)
, cutoff_(cutoff) , cutoff_(cutoff)
, graph_max_complexity_(graph_max_complexity) , graph_max_complexity_(graph_max_complexity)
, graph_intial_epsilon_(graph_intial_epsilon) , graph_intial_epsilon_(graph_intial_epsilon)
...@@ -104,6 +107,7 @@ private: ...@@ -104,6 +107,7 @@ private:
// reconstruction parameters // reconstruction parameters
bool keep_sidechains_; bool keep_sidechains_;
bool build_disulfids_; bool build_disulfids_;
bool optimize_subrotamers_;
Real cutoff_; Real cutoff_;
uint64_t graph_max_complexity_; uint64_t graph_max_complexity_;
Real graph_intial_epsilon_; Real graph_intial_epsilon_;
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
namespace promod3{ namespace sidechain{ namespace promod3{ namespace sidechain{
void SubrotamerOptimizer(std::vector<FRMRotamerPtr>& rotamers, void SubrotamerOptimizer(std::vector<FRMRotamerPtr>& rotamers,
Real active_internal_energy = -0.5, Real active_internal_energy = -2.0,
Real inactive_internal_energy = 0.0, Real inactive_internal_energy = 0.0,
uint max_complexity = 100000000, uint max_complexity = 100000000,
Real initial_epsilon = 0.02); Real initial_epsilon = 0.02);
......
...@@ -23,17 +23,20 @@ class SidechainTests(unittest.TestCase): ...@@ -23,17 +23,20 @@ class SidechainTests(unittest.TestCase):
self.assertLessEqual(geom.Length(a.pos - a_ref.pos), max_dist) self.assertLessEqual(geom.Length(a.pos - a_ref.pos), max_dist)
def CheckEnvVsPy(self, ent, env, keep_sidechains, build_disulfids, def CheckEnvVsPy(self, ent, env, keep_sidechains, build_disulfids,
optimize_subrotamers,
rotamer_model, rotamer_library): rotamer_model, rotamer_library):
# reconstruct sidechains for full OST entity # reconstruct sidechains for full OST entity
ent_py = ent.Copy() ent_py = ent.Copy()
sidechain.Reconstruct(ent_py, keep_sidechains=keep_sidechains, sidechain.Reconstruct(ent_py, keep_sidechains=keep_sidechains,
build_disulfids=build_disulfids, build_disulfids=build_disulfids,
optimize_subrotamers=optimize_subrotamers,
rotamer_model=rotamer_model, rotamer_model=rotamer_model,
rotamer_library=rotamer_library) rotamer_library=rotamer_library)
# same with SidechainReconstructor # same with SidechainReconstructor
sc_rec = sidechain.SidechainReconstructor(keep_sidechains=keep_sidechains, sc_rec = sidechain.SidechainReconstructor(keep_sidechains=keep_sidechains,
build_disulfids=build_disulfids) build_disulfids=build_disulfids,
optimize_subrotamers=optimize_subrotamers)
sc_rec.AttachEnvironment(env, use_frm=(rotamer_model=="frm"), sc_rec.AttachEnvironment(env, use_frm=(rotamer_model=="frm"),
rotamer_library=rotamer_library) rotamer_library=rotamer_library)
res = sc_rec.Reconstruct(1, ent.residue_count) res = sc_rec.Reconstruct(1, ent.residue_count)
...@@ -63,28 +66,33 @@ class SidechainTests(unittest.TestCase): ...@@ -63,28 +66,33 @@ class SidechainTests(unittest.TestCase):
env = loop.AllAtomEnv(seqres_str) env = loop.AllAtomEnv(seqres_str)
env.SetInitialEnvironment(ent) env.SetInitialEnvironment(ent)
self.CheckEnvVsPy(ent, env, keep_sidechains=False, self.CheckEnvVsPy(ent, env, keep_sidechains=False,
build_disulfids=False, rotamer_model="rrm", build_disulfids=False, optimize_subrotamers=False,
rotamer_library=self.rotamer_library) rotamer_model="rrm", rotamer_library=self.rotamer_library)
# reuse env with keep_sidechains=True # reuse env with keep_sidechains=True
self.CheckEnvVsPy(ent, env, keep_sidechains=True, self.CheckEnvVsPy(ent, env, keep_sidechains=True,
build_disulfids=False, rotamer_model="rrm", build_disulfids=False, optimize_subrotamers=False,
rotamer_library=self.rotamer_library) rotamer_model="rrm", rotamer_library=self.rotamer_library)
# vary one by one (need to reset env to get new stuff) # vary one by one (need to reset env to get new stuff)
env = loop.AllAtomEnv(seqres_str) env = loop.AllAtomEnv(seqres_str)
env.SetInitialEnvironment(ent) env.SetInitialEnvironment(ent)
self.CheckEnvVsPy(ent, env, keep_sidechains=True, self.CheckEnvVsPy(ent, env, keep_sidechains=True,
build_disulfids=False, rotamer_model="frm", build_disulfids=False, optimize_subrotamers=False,
rotamer_library=self.rotamer_library) rotamer_model="frm", rotamer_library=self.rotamer_library)
env = loop.AllAtomEnv(seqres_str) env = loop.AllAtomEnv(seqres_str)
env.SetInitialEnvironment(ent) env.SetInitialEnvironment(ent)
self.CheckEnvVsPy(ent, env, keep_sidechains=True, self.CheckEnvVsPy(ent, env, keep_sidechains=True,
build_disulfids=False, rotamer_model="rrm", build_disulfids=False, optimize_subrotamers=False,
rotamer_library=self.rotamer_library) rotamer_model="rrm", rotamer_library=self.rotamer_library)
env = loop.AllAtomEnv(seqres_str) env = loop.AllAtomEnv(seqres_str)
env.SetInitialEnvironment(ent) env.SetInitialEnvironment(ent)
self.CheckEnvVsPy(ent, env, keep_sidechains=True, self.CheckEnvVsPy(ent, env, keep_sidechains=True,
build_disulfids=False, rotamer_model="rrm", build_disulfids=False, optimize_subrotamers=False,
rotamer_library=self.bbdep_rotamer_library) rotamer_model="rrm", rotamer_library=self.bbdep_rotamer_library)
env = loop.AllAtomEnv(seqres_str)
env.SetInitialEnvironment(ent)
self.CheckEnvVsPy(ent, env, keep_sidechains=False,
build_disulfids=True, optimize_subrotamers=True,
rotamer_model="frm", rotamer_library=self.bbdep_rotamer_library)
# crn needed to check for disulfid bridges # crn needed to check for disulfid bridges
ent = io.LoadPDB(os.path.join('data', '1crn_sc_test.pdb')) ent = io.LoadPDB(os.path.join('data', '1crn_sc_test.pdb'))
...@@ -92,8 +100,8 @@ class SidechainTests(unittest.TestCase): ...@@ -92,8 +100,8 @@ class SidechainTests(unittest.TestCase):
env = loop.AllAtomEnv(seqres_str) env = loop.AllAtomEnv(seqres_str)
env.SetInitialEnvironment(ent) env.SetInitialEnvironment(ent)
self.CheckEnvVsPy(ent, env, keep_sidechains=True, self.CheckEnvVsPy(ent, env, keep_sidechains=True,
build_disulfids=True, rotamer_model="rrm", build_disulfids=True, optimize_subrotamers=False,
rotamer_library=self.rotamer_library) rotamer_model="rrm", rotamer_library=self.rotamer_library)
if __name__ == "__main__": if __name__ == "__main__":
from ost import testutils from ost import testutils
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment