diff --git a/modelling/pymod/export_sidechain_reconstructor.cc b/modelling/pymod/export_sidechain_reconstructor.cc index 81e75700c9393359e67a27238159166a5e58c3e0..5c8306f3becb3f13b9c99b3ac0e5906ebf7895a9 100644 --- a/modelling/pymod/export_sidechain_reconstructor.cc +++ b/modelling/pymod/export_sidechain_reconstructor.cc @@ -8,6 +8,20 @@ using namespace boost::python; namespace { +boost::python::list +WrapGetLoopStartIndices(const SidechainReconstructionData& sc_rec_data) { + boost::python::list return_list; + core::AppendVectorToList(sc_rec_data.loop_start_indices, return_list); + return return_list; +} + +boost::python::list +WrapGetLoopLengths(const SidechainReconstructionData& sc_rec_data) { + boost::python::list return_list; + core::AppendVectorToList(sc_rec_data.loop_lengths, return_list); + return return_list; +} + boost::python::list WrapGetRotamerResIndices(const SidechainReconstructionData& sc_rec_data) { boost::python::list return_list; @@ -80,7 +94,8 @@ void export_SidechainReconstructor() { class_<SidechainReconstructionData, SidechainReconstructionDataPtr> ("SidechainReconstructionData", init<>()) .def_readonly("env_pos", &SidechainReconstructionData::env_pos) - .def_readonly("length", &SidechainReconstructionData::length) + .add_property("loop_start_indices", &WrapGetLoopStartIndices) + .add_property("loop_lengths", &WrapGetLoopLengths) .add_property("rotamer_res_indices", &WrapGetRotamerResIndices) .add_property("disulfid_bridges", &WrapGetDisulfidBridges) .add_property("is_n_ter", &WrapGetIsNTer) diff --git a/modelling/src/all_atom_relaxer.cc b/modelling/src/all_atom_relaxer.cc index 6aa0c960b7b2bcd760c1e2e3edc551e078259256..3f99edbf13851294773042c9fc4d4b98c388efe5 100644 --- a/modelling/src/all_atom_relaxer.cc +++ b/modelling/src/all_atom_relaxer.cc @@ -19,11 +19,13 @@ AllAtomRelaxer::AllAtomRelaxer(ScRecDataPtr sc_data, std::vector<uint>& res_indices = sc_data->env_pos->res_indices; for (uint i = 0; i < res_indices.size(); ++i) { const uint res_idx = res_indices[i]; - all_pos_->SetResidue(res_idx, *(sc_data_->env_pos->all_pos), i); + all_pos_->SetResidue(res_idx, *(sc_data->env_pos->all_pos), i); } // setup system - mm_system_creator_->SetupSystem(*all_pos_, res_indices, sc_data_->length, + mm_system_creator_->SetupSystem(*all_pos_, res_indices, + sc_data->loop_start_indices, + sc_data->loop_lengths, sc_data->is_n_ter, sc_data->is_c_ter, sc_data->disulfid_bridges); } diff --git a/modelling/src/sidechain_reconstructor.cc b/modelling/src/sidechain_reconstructor.cc index 81e503c2ca6f2e1f5c61d3c1b7c3c276dc37ea1d..02c47aacca66e71c3c0a6addbf936ca8d1cac11e 100644 --- a/modelling/src/sidechain_reconstructor.cc +++ b/modelling/src/sidechain_reconstructor.cc @@ -41,17 +41,20 @@ SidechainReconstructor::Reconstruct(uint start_resnum, uint num_residues, } // get loop indices - std::vector<uint> indices = idx_handler_->ToIdxVector(start_resnum, + std::vector<uint> indices = idx_handler_->ToIdxVector(start_resnum, num_residues, chain_idx); - return this->ReconstructFromIndices(indices); + std::vector<uint> loop_start_indices(1, 0); + std::vector<uint> loop_lengths(1, num_residues); + return ReconstructFromIndices(indices, loop_start_indices, loop_lengths); } SidechainReconstructionDataPtr -SidechainReconstructor::Reconstruct(const std::vector<uint>& start_resnums, - const std::vector<uint>& num_residues, - const std::vector<uint>& chain_indices) const { +SidechainReconstructor::Reconstruct( + const std::vector<uint>& start_resnums, + const std::vector<uint>& num_residues, + const std::vector<uint>& chain_indices) const { promod3::core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped( "SidechainReconstructor::Reconstruct", 2); @@ -61,32 +64,20 @@ SidechainReconstructor::Reconstruct(const std::vector<uint>& start_resnums, "attached!"); } - if(start_resnums.size() != num_residues.size()){ - String err = "Size inconsistency of input data in SidechainReconstructor!"; - throw promod3::Error(err); - } - - if(start_resnums.size() != chain_indices.size()){ - String err = "Size inconsistency of input data in SidechainReconstructor!"; - throw promod3::Error(err); - } - - std::vector<uint> full_indices; - - for(uint i = 0; i < start_resnums.size(); ++i){ - // get loop indices - std::vector<uint> indices = idx_handler_->ToIdxVector(start_resnums[i], - num_residues[i], - chain_indices[i]); - - full_indices.insert(full_indices.end(), indices.begin(), indices.end()); - } - - return this->ReconstructFromIndices(full_indices); + // get loop indices + std::vector<uint> loop_start_indices; + std::vector<uint> loop_lengths; + std::vector<uint> indices = idx_handler_->ToIdxVector(start_resnums, + num_residues, + chain_indices, + loop_start_indices, + loop_lengths, true); + return ReconstructFromIndices(indices, loop_start_indices, loop_lengths); } void SidechainReconstructor::AttachEnvironment(loop::AllAtomEnv& env, - bool use_frm, bool use_bbdep_lib) { + bool use_frm, + bool use_bbdep_lib) { loop::AllAtomEnvListenerPtr tst = env.GetListener("SidechainEnvListener"); if (tst) { env_ = boost::dynamic_pointer_cast<SidechainEnvListener>(tst); @@ -133,14 +124,18 @@ void SidechainReconstructor::AttachEnvironment(loop::AllAtomEnv& env, } SidechainReconstructionDataPtr -SidechainReconstructor::ReconstructFromIndices(const std::vector<uint>& indices) const{ +SidechainReconstructor::ReconstructFromIndices( + const std::vector<uint>& indices, + const std::vector<uint>& loop_start_indices, + const std::vector<uint>& loop_lengths) const { // prepare result SidechainReconstructionDataPtr res(new SidechainReconstructionData()); res->env_pos.reset(new loop::AllAtomEnvPositions); std::vector<uint>& res_indices = res->env_pos->res_indices; res_indices = indices; - res->length = indices.size(); + res->loop_start_indices = loop_start_indices; + res->loop_lengths = loop_lengths; res->all_pos = all_pos_; std::set<uint> nb_frame_indices; @@ -150,7 +145,7 @@ SidechainReconstructor::ReconstructFromIndices(const std::vector<uint>& indices) std::set<uint> nb_indices; ScCBetaSpatialOrganizer::WithinResult within_result; std::pair<ScCBetaSpatialOrganizerItem*,Real>* a; - for (uint i = 0; i < res->length; ++i) { + for (uint i = 0; i < indices.size(); ++i) { const uint res_idx = res_indices[i]; within_result = env_->FindWithin(GetCxPos_(*all_pos_, res_idx), overall_cutoff); @@ -162,27 +157,27 @@ SidechainReconstructor::ReconstructFromIndices(const std::vector<uint>& indices) } // remove the indices form nb_indices - for(std::vector<uint>::iterator i = res_indices.begin(); - i != res_indices.end(); ++i){ + for (std::vector<uint>::iterator i = res_indices.begin(); + i != res_indices.end(); ++i) { nb_indices.erase(*i); } // remove indices from nb_frame_indices - for(std::vector<uint>::iterator i = res_indices.begin(); - i != res_indices.end(); ++i){ + for (std::vector<uint>::iterator i = res_indices.begin(); + i != res_indices.end(); ++i) { nb_frame_indices.erase(*i); } // and also the nb_indices - for(std::set<uint>::iterator i = nb_indices.begin(); - i != nb_indices.end(); ++i) { + for (std::set<uint>::iterator i = nb_indices.begin(); + i != nb_indices.end(); ++i) { nb_frame_indices.erase(*i); } // append unique surrounding residue indices (first loop part, then rest) res_indices.insert(res_indices.end(), nb_indices.begin(), nb_indices.end()); // assign all frame residues close to the unique surrounding residues - res->rigid_frame_indices.assign(nb_frame_indices.begin(), + res->rigid_frame_indices.assign(nb_frame_indices.begin(), nb_frame_indices.end()); // add information on termini diff --git a/modelling/src/sidechain_reconstructor.hh b/modelling/src/sidechain_reconstructor.hh index 25292bb82d67b3f682c51d5bda1044ec288e8476..abe8be222f85787b027f554dfd73f591980a58df 100644 --- a/modelling/src/sidechain_reconstructor.hh +++ b/modelling/src/sidechain_reconstructor.hh @@ -17,9 +17,11 @@ class SidechainReconstructionData { public: // atoms and res. indices loop::AllAtomEnvPositionsPtr env_pos; - // first *length* residues of env_pos are the ones actually - // being reconstructed - uint length; + // loop residues of env_pos are the ones actually being reconstructed + // -> loop i_loop has res. indices "env_pos->res_indices[i]" for i in + // (loop_start_indices[i_loop] + [0, loop_lengths[i_loop] - 1]) + std::vector<uint> loop_start_indices; + std::vector<uint> loop_lengths; // indices (into env_pos) of residues where we added rotamer sidechains std::vector<uint> rotamer_res_indices; // pairs of indices (into env_pos) of residues where we added disulfid bridge @@ -75,8 +77,13 @@ public: private: + // indices = res. indices of loops to reconstruct + // -> loop i_loop has res. indices "indices[i]" for i in + // (loop_start_indices[i_loop] + [0, loop_lengths[i_loop] - 1]) SidechainReconstructionDataPtr - ReconstructFromIndices(const std::vector<uint>& indices) const; + ReconstructFromIndices(const std::vector<uint>& indices, + const std::vector<uint>& loop_start_indices, + const std::vector<uint>& loop_lengths) const; // HELPERS void CheckEnvListener_(bool use_frm) const; diff --git a/modelling/tests/test_sidechain_reconstructor.cc b/modelling/tests/test_sidechain_reconstructor.cc index a1db8ba86c0dfdbdf8f58d009ade2d726687281f..f7be288b4192618537aeb5a9f4cbcc85ddd3d5e6 100644 --- a/modelling/tests/test_sidechain_reconstructor.cc +++ b/modelling/tests/test_sidechain_reconstructor.cc @@ -61,11 +61,14 @@ void CheckLoopRec(const SidechainReconstructorPtr sc_rec, sc_data->all_pos->GetAA(res_idx)); } // check loop - BOOST_CHECK_EQUAL(sc_data->length, loop_length); - for (uint i = 0; i < sc_data->length; ++i) { + BOOST_CHECK_EQUAL(sc_data->loop_start_indices.size(), 1u); + BOOST_CHECK_EQUAL(sc_data->loop_lengths.size(), 1u); + BOOST_CHECK_EQUAL(sc_data->loop_lengths[0], loop_length); + for (uint i = 0; i < loop_length; ++i) { // all loop res. assumed to be contiguous - const uint res_idx = sc_data->env_pos->res_indices[i]; - BOOST_CHECK(res_idx == start_resnum+i-1); + const uint start_idx = sc_data->loop_start_indices[0]; + const uint res_idx = sc_data->env_pos->res_indices[start_idx + i]; + BOOST_CHECK(res_idx == start_resnum + i - 1); } // check N-ter / C-ter info BOOST_CHECK_EQUAL(sc_data->env_pos->res_indices.size(),