diff --git a/loop/doc/mm_system_creation.rst b/loop/doc/mm_system_creation.rst
index 4cea3afc29cd59e1239391d46f13a14161cdc944..7ad0c03a88e75d071685fbee47a3d5f88dcc6530 100644
--- a/loop/doc/mm_system_creation.rst
+++ b/loop/doc/mm_system_creation.rst
@@ -38,7 +38,7 @@ Create MM systems for loops
:type ff_lookup: :class:`ForcefieldLookup`
:param fix_surrounding_hydrogens: If False, the hydrogens of the surrounding
residues can move to improve H-bond building
- (turned off by default as it only has a minor
+ (True by default as it only has a minor
impact on the result and a big one on
performance).
:type fix_surrounding_hydrogens: :class:`bool`
@@ -123,10 +123,10 @@ Create MM systems for loops
:class:`int`
:raises: :exc:`~exceptions.RuntimeError` if loops out of bounds with respect
- to *res_indices*, all loops have length 0, *loop_start_indices* /
- *loop_lengths* or *res_indices* / *is_n_ter* / *is_c_ter* have
- inconsistent lengths, or if any *all_pos[res_indices[i]]* is
- invalid or has unset heavy atoms.
+ to *res_indices*, *loop_start_indices* / *loop_lengths* or
+ *res_indices* / *is_n_ter* / *is_c_ter* have inconsistent lengths,
+ or if any *all_pos[res_indices[i]]* is invalid or has unset heavy
+ atoms.
.. method:: UpdatePositions(all_pos, res_indices)
diff --git a/loop/src/mm_system_creator.cc b/loop/src/mm_system_creator.cc
index 2395048d2be0300c1a84cf8f0e2d66bb4c0e1492..fdda4908ddbd0edaede2c01afc5e69f8caeb0f0b 100644
--- a/loop/src/mm_system_creator.cc
+++ b/loop/src/mm_system_creator.cc
@@ -319,9 +319,7 @@ void MmSystemCreator::SetupSystem(const AllAtomPositions& all_pos,
loop_start_indices_ = loop_start_indices;
loop_lengths_ = loop_lengths;
IdxHandler::ResolveOverlaps(loop_start_indices_, loop_lengths_, true);
- if (loop_lengths_.empty()) {
- throw promod3::Error("No valid loops in MmSystemCreator::SetupSystem!");
- }
+ // note: ok to not have any loops here (should not bother anyone really...)
num_loop_residues_ = 0;
for (uint i_loop = 0; i_loop < loop_lengths_.size(); ++i_loop) {
num_loop_residues_ += loop_lengths_[i_loop];
diff --git a/loop/tests/test_mm_system_creator.cc b/loop/tests/test_mm_system_creator.cc
index 743cac930ddc6e8e721697e7ff4905dd56954701..907136938573fefb1651ec6e91e07e7266d3b0c0 100644
--- a/loop/tests/test_mm_system_creator.cc
+++ b/loop/tests/test_mm_system_creator.cc
@@ -586,6 +586,32 @@ void CheckLoopMinimize(const AllAtomPositions& all_pos,
}
}
}
+
+ ////////////////////////////////////////////////////////////////////////////
+ // try loop of length 0 (nothing should move!)
+ ////////////////////////////////////////////////////////////////////////////
+ // build system
+ loop_lengths[0] = 0;
+ mm_sim.SetupSystem(all_pos, res_indices, loop_start_indices, loop_lengths,
+ is_n_ter, is_c_ter, disulfid_bridges);
+ // run it for a bit
+ sim = mm_sim.GetSimulation();
+ pot_ref_loop = sim->GetPotentialEnergy();
+ sim->ApplySD(0.01, 25);
+ if (fix_surrounding_hydrogens) {
+ // nothing should move...
+ BOOST_CHECK_CLOSE(sim->GetPotentialEnergy(), pot_ref_loop, 1);
+ } else {
+ // hydrogens should move and get better...
+ BOOST_CHECK(sim->GetPotentialEnergy() < pot_ref_loop);
+ }
+ // check heavy atoms (none should move)
+ new_pos = all_pos.Copy();
+ mm_sim.ExtractLoopPositions(*new_pos, res_indices);
+ for (uint i = 0; i < all_pos.GetNumAtoms(); ++i) {
+ const Real dist = geom::Distance(all_pos.GetPos(i), new_pos->GetPos(i));
+ BOOST_CHECK_EQUAL(dist, Real(0));
+ }
}
} // anon ns
@@ -633,7 +659,7 @@ BOOST_AUTO_TEST_CASE(test_mm_system_creator_loop_minimize) {
ost::mol::EntityHandle test_ent = LoadTestStructure("data/1CRN.pdb");
AllAtomPositions all_pos(test_ent.GetResidueList());
// check loop minimization with and w/o inaccurate_pot_e
- CheckLoopMinimize(all_pos, true, false, 8);
+ CheckLoopMinimize(all_pos, false, false, 8);
CheckLoopMinimize(all_pos, false, true, 5);
CheckLoopMinimize(all_pos, true, false, 8);
CheckLoopMinimize(all_pos, true, true, 5);
@@ -749,10 +775,9 @@ BOOST_AUTO_TEST_CASE(test_mm_system_creator_loop_exceptions) {
// check/break multi-loop
std::vector<uint> loop_start_indices;
std::vector<uint> loop_lengths;
- BOOST_CHECK_THROW(mm_sim.SetupSystem(all_pos, res_indices, loop_start_indices,
- loop_lengths, is_n_ter, is_c_ter,
- dis_bridges),
- promod3::Error);
+ BOOST_CHECK_NO_THROW(mm_sim.SetupSystem(all_pos, res_indices,
+ loop_start_indices, loop_lengths,
+ is_n_ter, is_c_ter, dis_bridges));
loop_start_indices.push_back(1);
loop_lengths.push_back(5);
BOOST_CHECK_THROW(mm_sim.SetupSystem(all_pos, res_indices, loop_start_indices,
@@ -760,10 +785,9 @@ BOOST_AUTO_TEST_CASE(test_mm_system_creator_loop_exceptions) {
dis_bridges),
promod3::Error);
loop_lengths[0] = 0;
- BOOST_CHECK_THROW(mm_sim.SetupSystem(all_pos, res_indices, loop_start_indices,
- loop_lengths, is_n_ter, is_c_ter,
- dis_bridges),
- promod3::Error);
+ BOOST_CHECK_NO_THROW(mm_sim.SetupSystem(all_pos, res_indices,
+ loop_start_indices, loop_lengths,
+ is_n_ter, is_c_ter, dis_bridges));
loop_start_indices.push_back(1);
BOOST_CHECK_THROW(mm_sim.SetupSystem(all_pos, res_indices, loop_start_indices,
loop_lengths, is_n_ter, is_c_ter,