diff --git a/loop/src/mm_system_creator.cc b/loop/src/mm_system_creator.cc index a2643e5cebf4940119771b97259250abae9a667a..c071411790bb073461f89b5ea3a92f260ab145b2 100644 --- a/loop/src/mm_system_creator.cc +++ b/loop/src/mm_system_creator.cc @@ -1,6 +1,7 @@ #include <promod3/loop/mm_system_creator.hh> #include <promod3/loop/hydrogen_constructor.hh> +#include <promod3/loop/idx_handler.hh> #include <promod3/core/message.hh> #include <promod3/core/runtime_profiling.hh> @@ -274,6 +275,10 @@ void MmSystemCreator::SetupSystem(const AllAtomPositions& all_pos, // check data consistency const uint num_loops = loop_start_indices.size(); + if (num_loops != loop_lengths.size()) { + throw promod3::Error("Sizes of loop_start_indices and loop_lengths must " + "match in MmSystemCreator::SetupSystem!"); + } for (uint i_loop = 0; i_loop < num_loops; ++i_loop) { // loop from start_idx to start_idx + loop_lengths[i_loop] - 1 const uint start_idx = loop_start_indices[i_loop]; @@ -284,11 +289,11 @@ void MmSystemCreator::SetupSystem(const AllAtomPositions& all_pos, } if (is_n_ter.size() != res_indices.size()) { throw promod3::Error("Sizes of res_indices and is_n_ter must match in " - "in MmSystemCreator::SetupSystem!"); + "MmSystemCreator::SetupSystem!"); } if (is_c_ter.size() != res_indices.size()) { throw promod3::Error("Sizes of res_indices and is_c_ter must match in " - "in MmSystemCreator::SetupSystem!"); + "MmSystemCreator::SetupSystem!"); } for (uint i_res = 0; i_res < res_indices.size(); ++i_res) { const uint res_idx = res_indices[i_res]; @@ -301,21 +306,25 @@ void MmSystemCreator::SetupSystem(const AllAtomPositions& all_pos, for (uint i = 0; i < disulfid_bridges.size(); ++i) { if (disulfid_bridges[i].first >= res_indices.size()) { throw promod3::Error("Invalid disulfid bridge residue index observed in " - "in MmSystemCreator::SetupSystem!"); + "MmSystemCreator::SetupSystem!"); } if (disulfid_bridges[i].second >= res_indices.size()) { throw promod3::Error("Invalid disulfid bridge residue index observed in " - "in MmSystemCreator::SetupSystem!"); + "MmSystemCreator::SetupSystem!"); } } // setup internal data (loop_..., is_X_ter_, ff_aa_, first_idx_) - num_loop_residues_ = 0; - for (uint i_loop = 0; i_loop < num_loops; ++i_loop) { - num_loop_residues_ += loop_lengths[i_loop]; - } 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!"); + } + num_loop_residues_ = 0; + for (uint i_loop = 0; i_loop < loop_lengths_.size(); ++i_loop) { + num_loop_residues_ += loop_lengths_[i_loop]; + } is_n_ter_ = is_n_ter; is_c_ter_ = is_c_ter; SetupNextIRes_(res_indices); @@ -338,7 +347,7 @@ void MmSystemCreator::UpdatePositions(const AllAtomPositions& all_pos, // check data consistency if (ff_aa_.size() != res_indices.size()) { throw promod3::Error("Inconsistent size of res_indices in " - "in MmSystemCreator::SetupSystem!"); + "MmSystemCreator::SetupSystem!"); } for (uint i_res = 0; i_res < res_indices.size(); ++i_res) { const uint res_idx = res_indices[i_res];