Skip to content
Snippets Groups Projects
Commit dbdf6721 authored by Gerardo Tauriello's avatar Gerardo Tauriello
Browse files

SCHWED-1740: test multi-loop handling for SidechainReconstructor

parent db050d87
Branches
Tags
No related merge requests found
......@@ -41,7 +41,7 @@ class SidechainReconstructor {
public:
SidechainReconstructor(bool keep_sidechains = true,
bool build_disulfids = true,
bool build_disulfids = true,
bool optimize_subrotamers = false,
Real remodel_cutoff = 20,
Real rigid_frame_cutoff = 0,
......@@ -63,8 +63,8 @@ public:
Reconstruct(uint start_resnum, uint num_residues, uint chain_idx = 0) const;
SidechainReconstructionDataPtr
Reconstruct(const std::vector<uint>& start_resnums,
const std::vector<uint>& num_residues,
Reconstruct(const std::vector<uint>& start_resnums,
const std::vector<uint>& num_residues,
const std::vector<uint>& chain_indices) const;
// options as in SidechainEnvListener (only used if no listener there yet!)
......
This diff is collapsed.
......@@ -42,13 +42,14 @@ SidechainReconstructorPtr GetScRec(const ost::mol::EntityHandle& test_ent) {
return sc_rec;
}
void CheckLoopRec(const SidechainReconstructorPtr sc_rec,
uint start_resnum, uint loop_length, uint num_residues) {
// reconstruct
SidechainReconstructionDataPtr sc_data;
sc_data = sc_rec->Reconstruct(start_resnum, loop_length);
// assume: single chain and res_idx = resnum-1
void CheckRecData(SidechainReconstructionDataPtr sc_data,
const std::vector<uint>& start_resnums,
const std::vector<uint>& loop_lengths,
uint num_residues) {
// check all_pos size
BOOST_CHECK_EQUAL(sc_data->all_pos->GetNumResidues(), num_residues);
// check env_pos consistency
const uint num_rec_residues = sc_data->env_pos->res_indices.size();
BOOST_CHECK_EQUAL(sc_data->env_pos->all_pos->GetNumResidues(),
......@@ -60,16 +61,32 @@ void CheckLoopRec(const SidechainReconstructorPtr sc_rec,
BOOST_CHECK_EQUAL(sc_data->env_pos->all_pos->GetAA(i),
sc_data->all_pos->GetAA(res_idx));
}
// check loop
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) {
// generate expected data for loops -> set to be ok with flips
const uint num_loops = start_resnums.size();
std::set<uint> exp_loop_lengths(loop_lengths.begin(), loop_lengths.end());
std::set<uint> exp_res_indices;
for (uint i_loop = 0; i_loop < num_loops; ++i_loop) {
for (uint idx = 0; idx < loop_lengths[i_loop]; ++idx) {
exp_res_indices.insert(start_resnums[i_loop] + idx - 1);
}
}
// check loops
BOOST_CHECK_EQUAL(sc_data->loop_start_indices.size(), num_loops);
BOOST_CHECK_EQUAL(sc_data->loop_lengths.size(), num_loops);
std::set<uint> sc_loop_lengths(sc_data->loop_lengths.begin(),
sc_data->loop_lengths.end());
BOOST_CHECK(sc_loop_lengths == exp_loop_lengths);
std::set<uint> sc_res_indices;
for (uint i_loop = 0; i_loop < num_loops; ++i_loop) {
// all loop res. assumed to be contiguous
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);
const uint start_idx = sc_data->loop_start_indices[i_loop];
for (uint idx = 0; idx < sc_data->loop_lengths[i_loop]; ++idx) {
sc_res_indices.insert(sc_data->env_pos->res_indices[start_idx + idx]);
}
}
BOOST_CHECK(sc_res_indices == exp_res_indices);
// check N-ter / C-ter info
BOOST_CHECK_EQUAL(sc_data->env_pos->res_indices.size(),
sc_data->is_n_ter.size());
......@@ -82,6 +99,7 @@ void CheckLoopRec(const SidechainReconstructorPtr sc_rec,
BOOST_CHECK(is_nter == sc_data->is_n_ter[i]);
BOOST_CHECK(is_cter == sc_data->is_c_ter[i]);
}
// check rotamer_res_indices
for (uint i = 0; i < sc_data->rotamer_res_indices.size(); ++i) {
const uint i_res = sc_data->rotamer_res_indices[i];
......@@ -89,6 +107,7 @@ void CheckLoopRec(const SidechainReconstructorPtr sc_rec,
const uint res_idx = sc_data->env_pos->res_indices[i_res];
BOOST_CHECK(!(sc_data->all_pos->IsAllSet(res_idx)));
}
// check disulfid_bridges
for (uint i = 0; i < sc_data->disulfid_bridges.size(); ++i) {
const uint i_res1 = sc_data->disulfid_bridges[i].first;
......@@ -102,6 +121,29 @@ void CheckLoopRec(const SidechainReconstructorPtr sc_rec,
}
}
void CheckLoopRec(const SidechainReconstructorPtr sc_rec,
uint start_resnum, uint loop_length, uint num_residues) {
// reconstruct
SidechainReconstructionDataPtr sc_data;
sc_data = sc_rec->Reconstruct(start_resnum, loop_length);
// DEBUG-OUT
// std::cout << "SRN: " << start_resnum << ", LL: " << loop_length
// << ", NR: " << num_residues
// << ", RIS: " << sc_data->env_pos->res_indices.size()
// << ", RRIS: " << sc_data->rotamer_res_indices.size()
// << ", DBS: " << sc_data->disulfid_bridges.size() << "\n";
// turn into vector for check and to call other one
std::vector<uint> start_resnums(1, start_resnum);
std::vector<uint> loop_lengths(1, loop_length);
// check
CheckRecData(sc_data, start_resnums, loop_lengths, num_residues);
// call other one
std::vector<uint> chain_indices(1, 0);
sc_data = sc_rec->Reconstruct(start_resnums, loop_lengths, chain_indices);
// check
CheckRecData(sc_data, start_resnums, loop_lengths, num_residues);
}
void CheckEmptyLoop(const SidechainReconstructionDataPtr sc_data,
uint num_residues) {
// must all be valid and empty
......@@ -145,11 +187,23 @@ BOOST_AUTO_TEST_CASE(test_sidechain_reconstructor_loops) {
std::vector<uint> chain_indices(1, 0);
sc_data = sc_rec->Reconstruct(start_resnums, loop_lengths, chain_indices);
CheckEmptyLoop(sc_data, num_residues);
// try three loops (note: overlap resolution is tested with IdxHandler)
loop_lengths[0] = 3;
start_resnums.push_back(20);
start_resnums.push_back(30);
loop_lengths.push_back(2);
loop_lengths.push_back(1);
chain_indices.push_back(0);
chain_indices.push_back(0);
sc_data = sc_rec->Reconstruct(start_resnums, loop_lengths, chain_indices);
CheckRecData(sc_data, start_resnums, loop_lengths, num_residues);
}
BOOST_AUTO_TEST_CASE(test_sidechain_reconstructor_loops_crn) {
// setup crn to test disulfid bridges
ost::mol::EntityHandle test_ent = LoadTestStructure("data/1crn_sc_test.pdb");
// -> sc missing for THR2 & CYS3, 3 disulfid bridges expected...
uint num_residues = test_ent.GetResidueCount();
SidechainReconstructorPtr sc_rec = GetScRec(test_ent);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment