diff --git a/sidechain/pymod/_reconstruct_sidechains.py b/sidechain/pymod/_reconstruct_sidechains.py index 44764d9e8119618067a05692345980131bfc8e91..3c15dd49e454f887561aa3bea4af40b9d284819b 100644 --- a/sidechain/pymod/_reconstruct_sidechains.py +++ b/sidechain/pymod/_reconstruct_sidechains.py @@ -289,7 +289,6 @@ def _GetRotamerGroups(res_list, rot_ids, indices, rot_lib, rot_constructor, except: continue # keep best ones - rot_group.CalculateInternalEnergies() frame.SetFrameEnergy(rot_group) rot_group.ApplySelfEnergyThresh() rotamer_groups.append(rot_group) diff --git a/sidechain/pymod/export_rotamer.cc b/sidechain/pymod/export_rotamer.cc index a9234df8e5f388591ae8dc0c1d21068d38710a01..067e3141eb8c5519518ee3991389625aee7a8cd5 100644 --- a/sidechain/pymod/export_rotamer.cc +++ b/sidechain/pymod/export_rotamer.cc @@ -249,6 +249,17 @@ void SetFRMFrameEnergyTwo(FRMRotamerPtr p, Real e, uint index) { p->SetFrameEnergy(e,index); } +void AddFRMFrameEnergyOne(FRMRotamerPtr p, Real e) { + p->AddFrameEnergy(e); +} + +void AddFRMFrameEnergyTwo(FRMRotamerPtr p, Real e, uint index) { + if (index >= p->subrotamer_size()) { + throw promod3::Error("Invalid subrotamer index"); + } + p->AddFrameEnergy(e,index); +} + } void export_Rotamer() @@ -262,17 +273,17 @@ void export_Rotamer() .def("ApplyOnResidue", WrapRRMApplyOnResAA, (arg("all_atom"), arg("res_idx"))) .def("GetTransformedCopy",&RRMRotamer::GetTransformedCopy,(arg("transform"))) - .def("CalculateInternalEnergy", &RRMRotamer::CalculateInternalEnergy,(arg("normalization_factor"))) - .def("GetInternalEnergy",&RRMRotamer::GetInternalEnergy) .def("GetInternalEnergyPrefactor",&RRMRotamer::GetInternalEnergyPrefactor) + .def("GetInternalEnergy",&RRMRotamer::GetInternalEnergy) .def("GetFrameEnergy",&RRMRotamer::GetFrameEnergy) .def("GetSelfEnergy",&RRMRotamer::GetSelfEnergy) .def("GetProbability",&RRMRotamer::GetProbability) - .def("SetInternalEnergy",&RRMRotamer::SetInternalEnergy, - (arg("internal_energy"))) .def("SetInternalEnergyPrefactor",&RRMRotamer::SetInternalEnergyPrefactor, (arg("prefactor"))) + .def("SetInternalEnergy",&RRMRotamer::SetInternalEnergy, + (arg("internal_energy"))) .def("SetFrameEnergy",&RRMRotamer::SetFrameEnergy,(arg("frame_energy"))) + .def("AddFrameEnergy",&RRMRotamer::AddFrameEnergy,(arg("frame_energy"))) .def("SetProbability",&RRMRotamer::SetProbability,(arg("probability"))) ; @@ -291,20 +302,21 @@ void export_Rotamer() .def("ApplyOnResidue", WrapFRMApplyOnResAA, (arg("all_atom"), arg("res_idx"))) .def("GetTransformedCopy",&FRMRotamer::GetTransformedCopy,(arg("transform"))) - .def("CalculateInternalEnergy", &FRMRotamer::CalculateInternalEnergy,(arg("normalization_factor"))) - .def("GetInternalEnergy",&FRMRotamer::GetInternalEnergy) .def("GetInternalEnergyPrefactor",&FRMRotamer::GetInternalEnergyPrefactor) + .def("GetInternalEnergy",&FRMRotamer::GetInternalEnergy) .def("GetFrameEnergy",&GetFRMFrameEnergyOne) .def("GetFrameEnergy",&GetFRMFrameEnergyTwo) .def("GetSelfEnergy",&FRMRotamer::GetSelfEnergy) .def("GetTemperature",&FRMRotamer::GetTemperature) .def("GetProbability",&FRMRotamer::GetProbability) + .def("SetInternalEnergyPrefactor",&FRMRotamer::SetInternalEnergyPrefactor,(arg("prefactor"))) .def("SetInternalEnergy",&FRMRotamer::SetInternalEnergy, (arg("internal_energy"))) - .def("SetInternalEnergyPrefactor",&FRMRotamer::SetInternalEnergyPrefactor,(arg("prefactor"))) .def("SetFrameEnergy",&SetFRMFrameEnergyOne,(arg("frame_energy"))) .def("SetFrameEnergy",&SetFRMFrameEnergyTwo, (arg("frame_energy"),arg("subrotamer_index"))) + .def("AddFrameEnergy",&AddFRMFrameEnergyOne,(arg("frame_energy"))) + .def("AddFrameEnergy",&AddFRMFrameEnergyTwo,(arg("frame_energy"),arg("subrotamer_index"))) .def("SetTemperature",&FRMRotamer::SetTemperature,(arg("temperature"))) .def("SetProbability",&FRMRotamer::SetProbability,(arg("probability"))) ; @@ -322,7 +334,6 @@ void export_Rotamer() .def("ApplyOnResidue", WrapRRMGApplyOnResAA, (arg("index"), arg("all_atom"), arg("res_idx"))) .def("Merge",&RRMRotamerGroup::Merge,(arg("other"))) - .def("CalculateInternalEnergies", &RRMRotamerGroup::CalculateInternalEnergies) .def("ApplySelfEnergyThresh", &RRMRotamerGroup::ApplySelfEnergyThresh, (arg("thresh")=30)) ; @@ -340,7 +351,6 @@ void export_Rotamer() .def("ApplyOnResidue", WrapFRMGApplyOnResAA, (arg("index"), arg("all_atom"), arg("res_idx"))) .def("Merge",&FRMRotamerGroup::Merge,(arg("other"))) - .def("CalculateInternalEnergies", &FRMRotamerGroup::CalculateInternalEnergies) .def("ApplySelfEnergyThresh", &FRMRotamerGroup::ApplySelfEnergyThresh, (arg("thresh")=30)) ; diff --git a/sidechain/pymod/export_scwrl_rotamer_constructor.cc b/sidechain/pymod/export_scwrl_rotamer_constructor.cc index 27a425766d9f2d8074b504aaa2c13b26db63dd18..3f014a8f2e5e26c49fc5182f98d9640547bc5054 100644 --- a/sidechain/pymod/export_scwrl_rotamer_constructor.cc +++ b/sidechain/pymod/export_scwrl_rotamer_constructor.cc @@ -142,6 +142,16 @@ FrameResiduePtr WrapSCFrame_aa(SCWRLRotamerConstructor& constructor, id, residue_index); } +void AssignInternalEnergiesRRM(const SCWRLRotamerConstructor& constructor, + RRMRotamerGroupPtr group){ + constructor.AssignInternalEnergies(group); +} + +void AssignInternalEnergiesFRM(const SCWRLRotamerConstructor& constructor, + FRMRotamerGroupPtr group){ + constructor.AssignInternalEnergies(group); +} + } // anon ns @@ -221,6 +231,8 @@ void export_SCWRLRotamerConstructor(){ arg("all_atom_pos_idx"), arg("rotamer_id"), arg("residue_index"))) + .def("AssignInternalEnergies", &AssignInternalEnergiesRRM) + .def("AssignInternalEnergies", &AssignInternalEnergiesFRM) ; } diff --git a/sidechain/src/rotamer.cc b/sidechain/src/rotamer.cc index b66fddbaeedffc4843e0d931894fdd5a6f43f217..ed56c2dc0f9fa877e733859190b6fe8cf49a3ea7 100644 --- a/sidechain/src/rotamer.cc +++ b/sidechain/src/rotamer.cc @@ -108,10 +108,6 @@ void RRMRotamer::ApplyOnResidue(loop::AllAtomPositions& all_atom, } } -void RRMRotamer::CalculateInternalEnergy(Real normalization_factor){ - internal_energy_ = -internal_e_prefactor_*std::log(probability_/normalization_factor); -} - FRMRotamer::FRMRotamer(Particle* particles, size_t n_particles, Real T, Real probability, Real internal_e_prefactor): particles_(particles), n_particles_(n_particles), @@ -251,9 +247,4 @@ void FRMRotamer::ApplyOnResidue(loop::AllAtomPositions& all_atom, } } -void FRMRotamer::CalculateInternalEnergy(Real normalization_factor){ - internal_energy_ = -internal_e_prefactor_*std::log(probability_/normalization_factor); -} - - }}//ns diff --git a/sidechain/src/rotamer.hh b/sidechain/src/rotamer.hh index 405b66aee231951ec2d5337d669e29d890fae95a..650d90bb1ef7730b8b34f600b98d1f42d9c840eb 100644 --- a/sidechain/src/rotamer.hh +++ b/sidechain/src/rotamer.hh @@ -48,28 +48,22 @@ public: RRMRotamerPtr GetTransformedCopy(const geom::Transform& t) const; - void CalculateInternalEnergy(Real normalization_factor); + Real GetInternalEnergyPrefactor() const { return internal_e_prefactor_; } - inline Real GetInternalEnergy() const { return internal_energy_; } + Real GetInternalEnergy() const { return internal_energy_; } - inline Real GetInternalEnergyPrefactor() const { - return internal_e_prefactor_; - } - - inline Real GetFrameEnergy() const { return frame_energy_; } - - inline Real GetSelfEnergy() const { - return internal_energy_ + frame_energy_; - } + Real GetFrameEnergy() const { return frame_energy_; } - inline Real GetProbability() const { return probability_; } + Real GetSelfEnergy() const { return internal_energy_ + frame_energy_; } - void SetInternalEnergy(Real e) { internal_energy_ = e; } + Real GetProbability() const { return probability_; } void SetInternalEnergyPrefactor(Real prefactor) { internal_e_prefactor_ = prefactor; } + void SetInternalEnergy(Real e) { internal_energy_ = e; } + void SetFrameEnergy(Real e) { frame_energy_ = e; } void AddFrameEnergy(Real e) { frame_energy_ += e; } @@ -96,7 +90,6 @@ private: }; - class FRMRotamer { public: @@ -116,33 +109,26 @@ public: void AddSubrotamerDefinition(const std::vector<int>& definition); - //this function expects the frame energy to be set!!! - //Real PairwiseEnergy(const FRMRotamerPtr other) const; + Real GetInternalEnergyPrefactor() const { return internal_e_prefactor_; } - void CalculateInternalEnergy(Real normalization_factor); + Real GetInternalEnergy() const { return internal_energy_; } - inline Real GetInternalEnergy() const { return internal_energy_; } + Real GetFrameEnergy() const { return frame_energy_; } - inline Real GetInternalEnergyPrefactor() const { - return internal_e_prefactor_; - } - - inline Real GetFrameEnergy() const { return frame_energy_; } + Real GetFrameEnergy(int index) const { return frame_energies_[index]; } - inline Real GetFrameEnergy(int index) const { return frame_energies_[index]; } + Real GetSelfEnergy() const { return internal_energy_ + frame_energy_; } - inline Real GetSelfEnergy() const { return internal_energy_ + frame_energy_; } + Real GetTemperature() const { return T_; } - inline Real GetTemperature() const { return T_; } - - inline Real GetProbability() const { return probability_; } - - void SetInternalEnergy(Real e) { internal_energy_ = e; } + Real GetProbability() const { return probability_; } void SetInternalEnergyPrefactor(Real prefactor) { internal_e_prefactor_ = prefactor; } + void SetInternalEnergy(Real e) { internal_energy_ = e; } + void SetFrameEnergy(Real e) { frame_energy_ = e; } void SetFrameEnergy(Real e, int index) { frame_energies_[index] = e; } diff --git a/sidechain/src/rotamer_group.cc b/sidechain/src/rotamer_group.cc index a28ec0fed9ad7f81631d0725e5dbee874727d87e..b8575d7f13dc173021c90d019be48231633c9ed3 100644 --- a/sidechain/src/rotamer_group.cc +++ b/sidechain/src/rotamer_group.cc @@ -120,15 +120,6 @@ Real* RRMRotamerGroup::CalculatePairwiseEnergies(RRMRotamerGroupPtr other, return data; } -void RRMRotamerGroup::CalculateInternalEnergies(){ - core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped( - "RRMRotamerGroup::CalculateInternalEnergies", 2); - Real max_p = this->GetMaxP(); - for(iterator i = rotamers_.begin();i != this->end(); ++i){ - (*i)->CalculateInternalEnergy(max_p); - } -} - Real RRMRotamerGroup::GetMaxP() const{ Real max_p = std::numeric_limits<Real>::min(); for(const_iterator i = this->begin(); i != this->end(); ++i){ @@ -494,15 +485,6 @@ Real* FRMRotamerGroup::CalculatePairwiseEnergies(FRMRotamerGroupPtr other, return data; } -void FRMRotamerGroup::CalculateInternalEnergies(){ - core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped( - "FRMRotamerGroup::CalculateInternalEnergies", 2); - Real max_p = this->GetMaxP(); - for(iterator i = rotamers_.begin();i != this->end(); ++i){ - (*i)->CalculateInternalEnergy(max_p); - } -} - Real FRMRotamerGroup::GetMaxP() const{ Real max_p = std::numeric_limits<Real>::min(); for(const_iterator i = this->begin(); i != this->end(); ++i){ diff --git a/sidechain/src/rotamer_group.hh b/sidechain/src/rotamer_group.hh index d346b38577750a8c2cc55d33f1fc870c5be22a11..061bf86f19a83cdf91621de2e8bc5f5c6748e01e 100644 --- a/sidechain/src/rotamer_group.hh +++ b/sidechain/src/rotamer_group.hh @@ -42,8 +42,6 @@ public: Real* CalculatePairwiseEnergies(RRMRotamerGroupPtr other, Real threshold); - void CalculateInternalEnergies(); - Real GetMaxP() const; void ApplySelfEnergyThresh(Real self_energy_thresh = 30); @@ -100,8 +98,6 @@ public: Real* CalculatePairwiseEnergies(FRMRotamerGroupPtr other, Real threshold); - void CalculateInternalEnergies(); - Real GetMaxP() const; void ApplySelfEnergyThresh(Real self_energy_thresh = 30); diff --git a/sidechain/src/scwrl_rotamer_constructor.cc b/sidechain/src/scwrl_rotamer_constructor.cc index 2b0a401e33e45bc048f1b946a23b06a313a624a7..a8257126cb666b47afdb7ed3997a703d5bceeca8 100644 --- a/sidechain/src/scwrl_rotamer_constructor.cc +++ b/sidechain/src/scwrl_rotamer_constructor.cc @@ -1237,7 +1237,29 @@ FrameResiduePtr SCWRLRotamerConstructor::ConstructSidechainFrameResidue( return p; } +void SCWRLRotamerConstructor::AssignInternalEnergies(RRMRotamerGroupPtr group) const{ + + Real max_p = group->GetMaxP(); + for(uint i = 0; i < group->size(); ++i){ + RRMRotamerPtr r = (*group)[i]; + Real internal_e_prefactor = r->GetInternalEnergyPrefactor(); + Real probability = r->GetProbability(); + Real e = -internal_e_prefactor * std::log(probability/max_p); + r->SetInternalEnergy(e); + } +} + +void SCWRLRotamerConstructor::AssignInternalEnergies(FRMRotamerGroupPtr group) const{ + Real max_p = group->GetMaxP(); + for(uint i = 0; i < group->size(); ++i){ + FRMRotamerPtr r = (*group)[i]; + Real internal_e_prefactor = r->GetInternalEnergyPrefactor(); + Real probability = r->GetProbability(); + Real e = -internal_e_prefactor * std::log(probability/max_p); + r->SetInternalEnergy(e); + } +} // INTERNAL FUNCTIONS @@ -1306,6 +1328,7 @@ RRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructRRMRotamerGroup( RRMRotamerGroupPtr group = boost::make_shared<RRMRotamerGroup>(rotamers, residue_index); + this->AssignInternalEnergies(group); return group; } @@ -1378,6 +1401,7 @@ FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup( FRMRotamerGroupPtr group = boost::make_shared<FRMRotamerGroup>(rotamers, residue_index); + this->AssignInternalEnergies(group); return group; } diff --git a/sidechain/src/scwrl_rotamer_constructor.hh b/sidechain/src/scwrl_rotamer_constructor.hh index 22d379d00bd0f98843123da8c6a5c8f357b1d79e..75f8416eb45caa158132a8ae9b3e3015286c79af 100644 --- a/sidechain/src/scwrl_rotamer_constructor.hh +++ b/sidechain/src/scwrl_rotamer_constructor.hh @@ -358,6 +358,11 @@ public: const promod3::loop::AllAtomPositions& all_atom, uint aa_res_idx, RotamerID id, uint residue_index); + // Assign internal energies to rotamer groups + void AssignInternalEnergies(RRMRotamerGroupPtr group) const; + + void AssignInternalEnergies(FRMRotamerGroupPtr group) const; + private: // Construct the rotamer groups after all backbone position information has diff --git a/sidechain/src/sidechain_env_listener.hh b/sidechain/src/sidechain_env_listener.hh index e5bd07ecbf6bf5a0a2050ff99e79f04cedac8874..32ded5d66342290dab8fd356e18cbc264ca0fb8c 100644 --- a/sidechain/src/sidechain_env_listener.hh +++ b/sidechain/src/sidechain_env_listener.hh @@ -124,7 +124,7 @@ public: r_id, res_idx, library_); } - rot_group->CalculateInternalEnergies(); + rot_constructor_.AssignInternalEnergies(rot_group); } void CreateRotamerGroup(RRMRotamerGroupPtr& rot_group, const geom::Vec3& n_pos, const geom::Vec3& ca_pos, @@ -143,7 +143,7 @@ public: res_idx, library_); } - rot_group->CalculateInternalEnergies(); + rot_constructor_.AssignInternalEnergies(rot_group); } private: