diff --git a/sidechain/pymod/_reconstruct_sidechains.py b/sidechain/pymod/_reconstruct_sidechains.py index 2b1601a98a380f3f293fc2c48f7e3dada105662e..f39a1bd5cfd0c8bea47874fbacf62cf54036945b 100644 --- a/sidechain/pymod/_reconstruct_sidechains.py +++ b/sidechain/pymod/_reconstruct_sidechains.py @@ -323,10 +323,10 @@ def _GetDisulfidBridges(frame_residues, cystein_indices, res_list, rotamer_libra continue cys_ca_positions.append(ca.GetPos()) cys_cb_positions.append(cb.GetPos()) - # get RotamerGroup + # get RotamerGroup in case of disulfids, we do FRM in any case rot_group = _GetRotamerGroup(r.handle, sidechain.CYD, i, rotamer_library, rotamer_constructor, phi_angles[i], - psi_angles[i], use_frm, bbdep) + psi_angles[i], True, bbdep) rot_group.AddFrameEnergy(frame) cystein_rot_groups.append(rot_group) indices_with_rot_groups.append(i) diff --git a/sidechain/src/sidechain_env_listener.cc b/sidechain/src/sidechain_env_listener.cc index 52150b9aea7de72d0307e9980dca5b8e866d98f9..89519e04bece2de9fd057828019fe6c7f6b44eeb 100644 --- a/sidechain/src/sidechain_env_listener.cc +++ b/sidechain/src/sidechain_env_listener.cc @@ -93,11 +93,7 @@ void SidechainEnvListener::Init(const loop::AllAtomEnv& base_env) { if (use_frm_) frm_rotamer_group_.assign(num_residues, FRMRotamerGroupPtr()); else rrm_rotamer_group_.assign(num_residues, RRMRotamerGroupPtr()); if (add_cyd_rotamers_) { - if (use_frm_) { - cyd_frm_rotamer_group_.assign(num_residues, FRMRotamerGroupPtr()); - } else { - cyd_rrm_rotamer_group_.assign(num_residues, RRMRotamerGroupPtr()); - } + cyd_frm_rotamer_group_.assign(num_residues, FRMRotamerGroupPtr()); } } @@ -203,13 +199,8 @@ void SidechainEnvListener::SetResidue_(loop::ConstAllAtomPositionsPtr all_pos, } // set extra cystein rotamer if needed if (add_cyd_rotamers_ && r_id == CYS) { - if (use_frm_) { - CreateRotamerGroup(cyd_frm_rotamer_group_[res_idx], n_pos, ca_pos, - cb_pos, CYD, res_idx); - } else { - CreateRotamerGroup(cyd_rrm_rotamer_group_[res_idx], n_pos, ca_pos, - cb_pos, CYD, res_idx); - } + CreateRotamerGroup(cyd_frm_rotamer_group_[res_idx], n_pos, ca_pos, + cb_pos, CYD, res_idx); } } } else { @@ -218,12 +209,11 @@ void SidechainEnvListener::SetResidue_(loop::ConstAllAtomPositionsPtr all_pos, env_.Remove(&env_data_[res_idx], env_data_[res_idx].pos); bb_frame_residue_[res_idx].reset(); sc_frame_residue_[res_idx].reset(); + cyd_frm_rotamer_group_[res_idx].reset(); if (use_frm_) { frm_rotamer_group_[res_idx].reset(); - cyd_frm_rotamer_group_[res_idx].reset(); } else { rrm_rotamer_group_[res_idx].reset(); - cyd_rrm_rotamer_group_[res_idx].reset(); } } } diff --git a/sidechain/src/sidechain_env_listener.hh b/sidechain/src/sidechain_env_listener.hh index 9f467ce14223413b7e7a8f44b9b134f95cb90817..ad0b411f0ef343e3691b28cf0490aad34b10c0b2 100644 --- a/sidechain/src/sidechain_env_listener.hh +++ b/sidechain/src/sidechain_env_listener.hh @@ -83,16 +83,19 @@ public: return rrm_rotamer_group_[res_idx]; } FRMRotamerGroupPtr GetCydFRMRotamerGroup(uint res_idx) const { - if (!use_frm_) { - throw promod3::Error("SidechainEnvListener doesn't have FRMRotamers!"); - } return cyd_frm_rotamer_group_[res_idx]; } RRMRotamerGroupPtr GetCydRRMRotamerGroup(uint res_idx) const { - if (use_frm_) { - throw promod3::Error("SidechainEnvListener doesn't have RRMRotamers!"); + // typically all disulfid evaluations are done with FRM disulfids + // (even when use_frm is false), so this is just a nasty fallback + uint num_rotamers = cyd_frm_rotamer_group_[res_idx]->size(); + std::vector<RRMRotamerPtr> rrm_rotamers(num_rotamers); + for(uint i = 0; i < num_rotamers; ++i){ + rrm_rotamers[i] = (*cyd_frm_rotamer_group_[res_idx])[i]->ToRRMRotamer(); } - return cyd_rrm_rotamer_group_[res_idx]; + RRMRotamerGroupPtr p(new RRMRotamerGroup(rrm_rotamers, res_idx)); + + return p; } // for convenience: use overload to set rot_group based on type @@ -190,7 +193,6 @@ private: // extra rotamer groups (r_id == CYD) for cysteins to handle disulfid bridges // -> constructed for res. with r_id == CYS indep. of all_rotamers_ setting! std::vector<FRMRotamerGroupPtr> cyd_frm_rotamer_group_; - std::vector<RRMRotamerGroupPtr> cyd_rrm_rotamer_group_; }; }} // ns diff --git a/sidechain/src/sidechain_reconstructor.cc b/sidechain/src/sidechain_reconstructor.cc index e1f9dd10c3d5e5bd4a478bd9c909c4a5753023ff..0fa9cfb9dae8e9f0e2c61ed728ea3e5a69cd5dab 100644 --- a/sidechain/src/sidechain_reconstructor.cc +++ b/sidechain/src/sidechain_reconstructor.cc @@ -375,8 +375,9 @@ void SidechainReconstructor::SolveSystem_( // handle cysteins res->disulfid_bridges.clear(); if (build_disulfids_) { - BuildDisulfids_<RotamerGroup>(res, cys_indices, frame_residues, - has_sidechain); + // we use the FRM rotamer model in any case for reconstructing disulfids + BuildDisulfids_<FRMRotamerGroup>(res, cys_indices, frame_residues, + has_sidechain); } // collect rotamers