diff --git a/sidechain/doc/rotamer.rst b/sidechain/doc/rotamer.rst index 7e87093f6e637bc336cd96a4f5c10d44c883914b..c729b48e792d3ee17eca63d68e3ffa10187fc26b 100644 --- a/sidechain/doc/rotamer.rst +++ b/sidechain/doc/rotamer.rst @@ -254,7 +254,7 @@ Details can be found in the relevant publication [canutescu2003]_. The VINA scoring function ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The VINA scoring function is a combination of scores that are named +The VINA scoring function is a combination of functional forms that are named gaussian1, gaussian2, repulsion, hydrophobic and hbond in the Autodock Vina software [trott2010]_. VINA only evaluates heavy atoms. Gaussian1, gaussian2 and repulsion are evaluated for all pairs of particles. Hydrophobic is only @@ -263,6 +263,43 @@ evaluated between hydrogen bond donor/acceptor pairs. While SCWRL3 and SCWRL4 are intended to evaluate sidechain-sidechain interactions in proteins, VINA is mainly targeted at interactions between sidechains and ligands. +The functional forms are linearly combined with the default weights from +the Autodock Vina Software. They're set as global variables and can be +extracted with: + +.. method:: GetVINAWeightGaussian1 + + +.. method:: GetVINAWeightGaussian2 + + +.. method:: GetVINAWeightRepulsion + + +.. method:: GetVINAWeightHydrophobic + + +.. method:: GetVINAWeightHBond + +You can set custom weights. A call to the following functions overwrites +according weights globally which affects any subsequent score evaluation: + +.. method:: SetVINAWeightGaussian1(w) + + +.. method:: SetVINAWeightGaussian2(w) + + +.. method:: SetVINAWeightRepulsion(w) + + +.. method:: SetVINAWeightHydrophobic(w) + + +.. method:: SetVINAWeightHBond(w) + + + The VINA scoring function differentiates between the following particle types: .. class:: VINAParticleType diff --git a/sidechain/pymod/export_rotamer_constructor.cc b/sidechain/pymod/export_rotamer_constructor.cc index 0950dddbbe747815a4556d261e3b5d422a4cbc6b..ae7853a0bc1638dbd6225c79307f890964ed335c 100644 --- a/sidechain/pymod/export_rotamer_constructor.cc +++ b/sidechain/pymod/export_rotamer_constructor.cc @@ -23,6 +23,7 @@ #include <promod3/sidechain/scwrl4_rotamer_constructor.hh> #include <promod3/sidechain/scwrl3_rotamer_constructor.hh> #include <promod3/sidechain/vina_rotamer_constructor.hh> +#include <promod3/sidechain/vina_particle_scoring.hh> using namespace boost::python; using namespace promod3::sidechain; @@ -475,4 +476,15 @@ void export_RotamerConstructor(){ &VINARotamerConstructor::ConstructFRMRotamerHeuristic, (arg("res"))) ; + def("SetVINAWeightGaussian1", &SetVINAWeightGaussian1, (arg("weight"))); + def("SetVINAWeightGaussian2", &SetVINAWeightGaussian2, (arg("weight"))); + def("SetVINAWeightRepulsion", &SetVINAWeightRepulsion, (arg("weight"))); + def("SetVINAWeightHydrophobic", &SetVINAWeightHydrophobic, (arg("weight"))); + def("SetVINAWeightHBond", &SetVINAWeightHBond, (arg("weight"))); + + def("GetVINAWeightGaussian1", &GetVINAWeightGaussian1); + def("GetVINAWeightGaussian2", &GetVINAWeightGaussian2); + def("GetVINAWeightRepulsion", &GetVINAWeightRepulsion); + def("GetVINAWeightHydrophobic", &GetVINAWeightHydrophobic); + def("GetVINAWeightHBond", &GetVINAWeightHBond); } diff --git a/sidechain/src/vina_particle_scoring.cc b/sidechain/src/vina_particle_scoring.cc index c048e2149d865988b229932c212a076ef2e198b7..c5a52d6f9507a967f870f1ee5fcbd4e91bdbb0c3 100644 --- a/sidechain/src/vina_particle_scoring.cc +++ b/sidechain/src/vina_particle_scoring.cc @@ -20,6 +20,25 @@ namespace promod3 { namespace sidechain { +Real VINAParam::gaussian1_weight_ = -0.035579; +Real VINAParam::gaussian2_weight_ = -0.005156; +Real VINAParam::repulsion_weight_ = 0.840245; +Real VINAParam::hydrophobic_weight_ = -0.035069; +Real VINAParam::hbond_weight_ = -0.587439; + +void SetVINAWeightGaussian1(float w) { VINAParam::gaussian1_weight_ = w; } +void SetVINAWeightGaussian2(float w) { VINAParam::gaussian2_weight_ = w; } +void SetVINAWeightRepulsion(float w) { VINAParam::repulsion_weight_ = w; } +void SetVINAWeightHydrophobic(float w) { VINAParam::hydrophobic_weight_ = w; } +void SetVINAWeightHBond(float w) { VINAParam::hbond_weight_ = w; } + +Real GetVINAWeightGaussian1() { return VINAParam::gaussian1_weight_; } +Real GetVINAWeightGaussian2() { return VINAParam::gaussian2_weight_; } +Real GetVINAWeightRepulsion() { return VINAParam::repulsion_weight_; } +Real GetVINAWeightHydrophobic() { return VINAParam::hydrophobic_weight_; } +Real GetVINAWeightHBond() { return VINAParam::hbond_weight_; } + + VINAParam::VINAParam(VINAParticleType t, const geom::Vec3& pos): pos_(pos), radius_(VINAVDWRadii[t]), @@ -82,13 +101,6 @@ bool VINAParam::EqualTo(PScoringParam* other) const { Real VINAPairwiseScore(VINAParam* p_one, VINAParam* p_two) { - // linear weights of the different terms - const Real w_gaussian1 = -0.035579; - const Real w_gaussian2 = -0.005156; - const Real w_repulsion = 0.840245; - const Real w_hydrophobic = -0.035069; - const Real w_hbond = -0.587439; - Real r = geom::Distance(p_one->pos_, p_two->pos_); Real d = r - (p_one->radius_ + p_two->radius_); @@ -120,11 +132,11 @@ Real VINAPairwiseScore(VINAParam* p_one, VINAParam* p_two) { e_hbond = (d < Real(-0.7) ? 1.0 : (d/Real(-0.7))); } - Real e = w_gaussian1 * e_gaussian1 + - w_gaussian2 * e_gaussian2 + - w_repulsion * e_repulsion + - w_hydrophobic * e_hydrophobic + - w_hbond * e_hbond; + Real e = VINAParam::gaussian1_weight_ * e_gaussian1 + + VINAParam::gaussian2_weight_ * e_gaussian2 + + VINAParam::repulsion_weight_ * e_repulsion + + VINAParam::hydrophobic_weight_ * e_hydrophobic + + VINAParam::hbond_weight_ * e_hbond; return e; } diff --git a/sidechain/src/vina_particle_scoring.hh b/sidechain/src/vina_particle_scoring.hh index 204cfb6144f4d925fa74b5e1ae01e391a7fedfdf..b2df5010dea73756fe50620e717fe9e02a73443a 100644 --- a/sidechain/src/vina_particle_scoring.hh +++ b/sidechain/src/vina_particle_scoring.hh @@ -64,6 +64,18 @@ const Real VINAVDWRadii[18] = { 0.0 // INVALID }; +void SetVINAWeightGaussian1(float w); +void SetVINAWeightGaussian2(float w); +void SetVINAWeightRepulsion(float w); +void SetVINAWeightHydrophobic(float w); +void SetVINAWeightHBond(float w); + +Real GetVINAWeightGaussian1(); +Real GetVINAWeightGaussian2(); +Real GetVINAWeightRepulsion(); +Real GetVINAWeightHydrophobic(); +Real GetVINAWeightHBond(); + struct VINAParam : public PScoringParam { VINAParam(VINAParticleType t, const geom::Vec3& pos); @@ -95,6 +107,11 @@ struct VINAParam : public PScoringParam { bool hydrophobic_; bool hbond_acceptor_; bool hbond_donor_; + static Real gaussian1_weight_; + static Real gaussian2_weight_; + static Real repulsion_weight_; + static Real hydrophobic_weight_; + static Real hbond_weight_; }; Real VINAPairwiseScore(VINAParam* p_one, VINAParam* p_two);