27 #include <boost/algorithm/string/join.hpp>
63 #include <basic/prof.hh>
64 #include <basic/Tracer.hh>
65 #include <basic/database/open.hh>
66 #include <numeric/random/DistributionSampler.hh>
67 #include <ObjexxFCL/format.hh>
68 #include <utility/io/izstream.hh>
69 #include <utility/string_util.hh>
72 #include <utility/vector1.hh>
77 static basic::Tracer
tr(
"core.scoring");
79 using namespace ObjexxFCL;
80 using namespace ObjexxFCL::fmt;
86 void lregister_ScoreFunction( lua_State * lstate ) {
87 luabind::module(lstate,
"core")
89 luabind::namespace_(
"scoring")
91 luabind::class_<ScoreFunction>(
"ScoreFunction")
98 Size n_minimization_sfxn_evals( 0 );
102 ScoreFunction::ScoreFunction()
108 ScoreFunction::~ScoreFunction() {}
115 return new_score_function;
122 ScoreFunction::reset()
124 score_function_info_current_ =
true;
126 any_intrares_energies_ =
false;
128 initialize_methods_arrays();
141 add_weights_from_file( filename );
149 vector<string> tokens;
150 ScoreTypes terms = get_nonzero_weighted_scoretypes();
151 for (ScoreTypes::const_iterator i = terms.begin(); i != terms.end(); ++i) {
153 if (has_nonzero_weight(term)) {
154 tokens.push_back(
str(boost::format(
"%1% : %2%") % term % get_weight(term)));
157 return "{" + boost::algorithm::join(tokens,
", ") +
"}";
165 void ScoreFunction::perturb_weights() {
166 using boost::math::normal;
168 using numeric::random::DistributionSampler;
171 ScoreTypes terms = get_nonzero_weighted_scoretypes();
172 for (ScoreTypes::const_iterator i = terms.begin(); i != terms.end(); ++i) {
174 if (has_nonzero_weight(term)) {
175 Real weight = get_weight(term);
177 normal dist(0, weight / 8);
178 DistributionSampler<normal> sampler(dist);
180 Real perturbed_weight = weight + sampler.sample();
181 set_weight(term, std::max(perturbed_weight, 0.0));
183 << weight <<
" => " << perturbed_weight << std::endl;
205 utility::io::izstream data( filename );
207 if ( ! patch ) { utility_exit_with_message(
"Unable to open weights file: "+filename ); }
208 else { utility_exit_with_message(
"Unable to open weights-patch file: "+filename ); }
214 while ( getline( data, line ) ) {
215 std::istringstream l( line );
217 if ( l.fail() || tag[0] ==
'#' )
continue;
220 if ( tag ==
"ETABLE" ) {
223 }
else if ( tag ==
"METHOD_WEIGHTS" ) {
226 utility_exit_with_message(
"unrecognized score_type: "+line );
229 while ( !l.fail() ) {
231 if ( l.fail() )
break;
234 energy_method_options_->set_method_weights( score_type, wts );
235 }
else if ( tag ==
"STRAND_STRAND_WEIGHTS" ) {
238 while ( !l.fail() ) {
240 if ( l.fail() )
break;
241 values.push_back( value );
243 if ( values.size() != 2 )
244 utility_exit_with_message(
"incorrect number of arguments to STRAND_STRAND_WEIGHTS: " + line );
245 energy_method_options_->set_strand_strand_weights( values[1], values[2] );
246 }
else if ( tag ==
"NO_PROTEIN_PROTEIN_HACK_ELEC" ) {
247 energy_method_options_->exclude_protein_protein_hack_elec(
true );
248 }
else if ( tag ==
"NO_MONOMER_HACK_ELEC" ) {
249 energy_method_options_->exclude_monomer_hack_elec(
true );
250 }
else if ( tag ==
"INCLUDE_DNA_DNA" ) {
251 energy_method_options_->exclude_DNA_DNA(
false );
252 }
else if ( tag ==
"NO_HB_ENV_DEP" ) {
253 energy_method_options_->hbond_options().use_hb_env_dep(
false );
254 }
else if ( tag ==
"NO_HB_ENV_DEP_DNA" ) {
255 energy_method_options_->hbond_options().use_hb_env_dep_DNA(
false );
256 }
else if ( tag ==
"NO_SMOOTH_HB_ENV_DEP" ) {
257 energy_method_options_->hbond_options().smooth_hb_env_dep(
false );
258 }
else if ( tag ==
"NO_BB_DONOR_ACCEPTOR_CHECK" ) {
259 energy_method_options_->hbond_options().bb_donor_acceptor_check(
false );
260 }
else if ( tag ==
"COARSE_RNA" ) {
261 std::cout <<
"ATOM_VDW set to COARSE_RNA" << std::endl;
262 energy_method_options_->atom_vdw_atom_type_set_name(
"coarse_rna" );
263 }
else if ( tag ==
"INCLUDE_INTRA_RES_RNA_HB" ) {
264 std::cout <<
"INCLUDE_INTRA_RES_RNA_HB==true" << std::endl;
265 energy_method_options_->hbond_options().include_intra_res_RNA(
true );
266 }
else if ( tag ==
"INCLUDE_HB_DNA_DNA" ) {
267 energy_method_options_->hbond_options().exclude_DNA_DNA(
false );
268 }
else if ( tag ==
"BOND_ANGLE_CENTRAL_ATOMS_TO_SCORE" ) {
271 while ( !l.fail() ) {
273 if ( l.fail() )
break;
274 central_atoms.push_back( central_atom );
276 if ( ! energy_method_options_->bond_angle_residue_type_param_set() ) {
279 energy_method_options_->bond_angle_residue_type_param_set()->central_atoms_to_score( central_atoms );
280 }
else if ( tag ==
"BOND_ANGLE_USE_RESIDUE_TYPE_THETA0" ) {
281 if ( ! energy_method_options_->bond_angle_residue_type_param_set() ) {
284 energy_method_options_->bond_angle_residue_type_param_set()->use_residue_type_theta0(
true );
285 }
else if ( tag ==
"UNFOLDED_ENERGIES_TYPE" ) {
288 energy_method_options_->unfolded_energies_type( type );
289 }
else if ( tag ==
"HACK_ELEC_MIN_DIS" ) {
292 energy_method_options_->hackelec_min_dis( value );
293 }
else if ( tag ==
"HACK_ELEC_MAX_DIS" ) {
296 energy_method_options_->hackelec_max_dis( value );
297 }
else if ( tag ==
"HACK_ELEC_NO_DIS_DEP_DIE" ) {
298 energy_method_options_->hackelec_no_dis_dep_die(
true );
307 l >> score_type >> wt;
309 utility_exit_with_message(
"bad line in file "+filename+
":"+line );
311 set_weight( score_type, wt );
316 l >> score_type >> operation >> wt;
318 tr.Error <<
"could not parse line in patch-file: " << line << std::endl;
321 if ( operation ==
"*=" ) {
322 set_weight( score_type, weights_[ score_type ]*wt );
323 }
else if ( operation ==
"=" ) {
324 set_weight( score_type, wt );
326 utility_exit_with_message(
327 "unrecognized scorefunction patch operation "+operation+
" in file: "+filename
340 ScoreFunction::set_energy_method_options(
342 energy_method_options_in )
344 energy_method_options_
351 reset_energy_methods();
353 score_function_info_current_ =
false;
360 ScoreFunction::reset_energy_methods()
377 ScoreFunction::apply_patch_from_file(
std::string const & patch_tag )
385 ScoreFunction::set_etable(
392 energy_method_options_->etable_type( etable_name );
393 reset_energy_methods();
394 score_function_info_current_ =
false;
399 ScoreFunction::set_method_weights(
405 energy_method_options_->set_method_weights( t, wts );
406 reset_energy_methods();
407 score_function_info_current_ =
false;
414 if (
this == &src )
return *
this;
423 initialize_methods_arrays();
425 for ( AllMethods::const_iterator it = src.
all_methods_.begin(),
427 add_method( (*it)->clone() );
429 update_intrares_energy_status();
430 assert( check_methods() );
453 out <<
"ScoreFunction::show():\nweights:";
471 if ( the_weight != 0.0 ) {
483 out <<
"------------------------------------------------------------\n";
484 out <<
" Scores Weight Raw Score Wghtd.Score\n";
485 out <<
"------------------------------------------------------------\n";
486 float sum_weighted=0.0;
496 out <<
"---------------------------------------------------\n";
497 out <<
" Total weighted score: " << F(9,3,sum_weighted) <<
'\n';
503 out <<
"---------------------------------------------\n";
504 out <<
" Scores Weight \n";
505 out <<
"---------------------------------------------\n";
513 out <<
"---------------------------------------------------\n";
520 out <<
"------------------------------------------------------------\n";
521 out <<
" Scores Weight Raw Score Wghtd.Score\n";
522 out <<
"------------------------------------------------------------\n";
523 float sum_weighted=0.0;
527 << F(9,3,energies[
ScoreType(i) ] ) <<
" "
533 out <<
"---------------------------------------------------\n";
534 out <<
" Total weighted score: " << F(9,3,sum_weighted) <<
'\n';
544 out <<
' ' << LJ(16,
ScoreType(i)) <<
' ';
554 float sum_weighted=0.0;
560 out << F(9,3,sum_weighted);
583 #ifdef APL_TEMP_DEBUG
585 std::cout <<
"n_minimization_sfxn_evals: " << n_minimization_sfxn_evals << std::endl;
586 n_minimization_sfxn_evals = 0;
589 ++n_minimization_sfxn_evals;
601 PROF_START( basic::SCORE );
617 PROF_START( basic::SCORE_BEGIN_NOTIFY );
622 std::cout <<
"STARTING SCORE NON-ZERO!" << std::endl;
624 PROF_STOP( basic::SCORE_BEGIN_NOTIFY );
627 PROF_START( basic::SCORE_SETUP );
631 PROF_STOP( basic::SCORE_SETUP );
635 PROF_START( basic::SCORE_NEIGHBOR_ENERGIES );
639 PROF_STOP ( basic::SCORE_NEIGHBOR_ENERGIES );
642 PROF_START( basic::SCORE_LONG_RANGE_ENERGIES );
646 PROF_STOP ( basic::SCORE_LONG_RANGE_ENERGIES );
648 PROF_START( basic::SCORE_ONEBODY_ENERGIES );
653 PROF_STOP( basic::SCORE_ONEBODY_ENERGIES );
655 PROF_START( basic::SCORE_FINALIZE );
658 for ( AllMethods::const_iterator it=
all_methods_.begin(),
669 PROF_STOP( basic::SCORE_FINALIZE );
674 PROF_START( basic::SCORE_DOT );
680 PROF_STOP( basic::SCORE_DOT );
682 PROF_START( basic::SCORE_END_NOTIFY );
687 PROF_STOP( basic::SCORE_END_NOTIFY );
689 PROF_STOP ( basic::SCORE );
696 return (*
this)(pose);
706 ScoreFunction::score_components( pose::Pose & pose ) const
708 // completely unnecessary temporary hack to force refold if nec. for profiling
709 pose.residue( pose.total_residue() );
711 PROF_START( basic::SCORE );
712 //std::cout << "ScoreFunction::operator()\n";
714 // notify the pose that we are starting a score evaluation.
715 // also tells the cached energies object about the scoring
716 // parameters, for the purposes of invalidating cached data
719 // at this point the dof/xyz-moved information will be converted
720 // to a domain map. Energy/neighbor links between pair-moved residues
721 // will be deleted, and 1d energies of res-moved residues will be
724 // further structure modification will be prevented until scoring is
727 pose.scoring_begin( *this );
728 //std::cout << "ScoreFunction::operator() 1\n";
730 if ( pose.energies().total_energy() != 0.0 ) {
731 std::cout << "STARTING SCORE NON-ZERO!" << std::endl;
734 // ensure that the total_energies are zeroed out -- this happens in Energies.scoring_begin()
735 // unneccessary pose.energies().total_energies().clear();
736 //std::cout << "ScoreFunction::operator() 2\n";
738 // do any setup necessary
739 setup_for_scoring( pose );
741 // evaluate the residue pair energies that exist between possibly-distant residues
742 PROF_START( basic::LONG_RANGE_ENERGIES );
744 eval_long_range_twobody_energies( pose );
746 PROF_STOP ( basic::LONG_RANGE_ENERGIES );
748 // evaluate the onebody energies -- rama, dunbrack, ...
749 eval_onebody_energies( pose );
751 // give energyfunctions a chance update/finalize energies
752 // etable nblist calculation is performed here
753 for ( AllMethods::const_iterator it=all_methods_.begin(),
754 it_end = all_methods_.end(); it != it_end; ++it ) {
755 (*it)->finalize_total_energy( pose, *this, pose.energies().finalized_energies() );
758 // notify that scoring is over
759 pose.scoring_end( *this );
761 PROF_STOP ( basic::SCORE );
765 pose.energies().energy_graph();
769 EnergyMap const & total_energies( pose.energies().total_energies() );
771 pose.energies().total_energy() = total_energies.dot( weights_ );
772 return pose.energies().total_energy();
785 assert(energies.energies_updated());
787 EnergyGraph const & energy_graph( energies.energy_graph() );
792 if(!residue_mask[i])
continue;
795 iru = energy_graph.get_node(i)->const_upper_edge_list_begin(),
797 iru != irue; ++iru ) {
798 EnergyEdge const & edge( static_cast< EnergyEdge const &> (**iru) );
800 if(!residue_mask[j])
continue;
810 if(!residue_mask[i])
continue;
811 EnergyMap const & emap( energies.onebody_energies( i ) );
831 ( static_cast< hbonds::HBondSet const & >
847 if( !lrec || lrec->empty() )
continue;
851 if(!residue_mask[ii])
continue;
854 rni = lrec->const_upper_neighbor_iterator_begin( ii ),
855 rniend = lrec->const_upper_neighbor_iterator_end( ii );
856 (*rni) != (*rniend); ++(*rni) ) {
857 if(!residue_mask[rni->upper_neighbor_id()])
continue;
860 rni->retrieve_energy( emap );
874 if(!residue_mask[ii])
continue;
876 rni = lrec->const_upper_neighbor_iterator_begin( ii ),
877 rniend = lrec->const_upper_neighbor_iterator_end( ii );
878 (*rni) != (*rniend); ++(*rni) ) {
879 if(!residue_mask[rni->upper_neighbor_id()])
continue;
882 rni->retrieve_energy( emap );
899 return get_sub_score(const_cast<pose::Pose const &>(pose), residue_mask);
914 assert(energies.energies_updated());
917 EnergyGraph const & energy_graph( energies.energy_graph() );
921 if(!residue_mask[i])
continue;
924 iru = energy_graph.get_node(i)->const_upper_edge_list_begin(),
926 iru != irue; ++iru ) {
927 EnergyEdge const & edge( static_cast< EnergyEdge const &> (**iru) );
929 if(!residue_mask[j])
continue;
942 if(!residue_mask[i])
continue;
943 EnergyMap onebody_emap(energies.onebody_energies(i));
962 ( static_cast< hbonds::HBondSet const & >
979 if( !lrec || lrec->empty() )
continue;
983 if(!residue_mask[ii])
continue;
986 rni = lrec->const_upper_neighbor_iterator_begin( ii ),
987 rniend = lrec->const_upper_neighbor_iterator_end( ii );
988 (*rni) != (*rniend); ++(*rni) ) {
989 if(!residue_mask[rni->upper_neighbor_id()])
continue;
992 rni->retrieve_energy( lr_emap );
1006 if(!residue_mask[ii])
continue;
1008 rni = lrec->const_upper_neighbor_iterator_begin( ii ),
1009 rniend = lrec->const_upper_neighbor_iterator_end( ii );
1010 (*rni) != (*rniend); ++(*rni) ) {
1011 if(!residue_mask[rni->upper_neighbor_id()])
continue;
1014 rni->retrieve_energy( lr_emap );
1031 return get_sub_score(const_cast<pose::Pose const &>(pose), residue_mask, emap);
1045 ii = exclude_res.begin(), ie = exclude_res.end();
1047 residue_mask[*ii] =
false;
1065 ii = exclude_res.begin(), ie = exclude_res.end();
1067 residue_mask[*ii] =
false;
1069 return get_sub_score(const_cast<pose::Pose const &>(pose), residue_mask);
1084 ii = exclude_res.begin(), ie = exclude_res.end();
1086 residue_mask[*ii] =
false;
1105 ii = exclude_res.begin(), ie = exclude_res.end();
1107 residue_mask[*ii] =
false;
1109 get_sub_score(const_cast<pose::Pose const &>(pose), residue_mask, emap);
1125 EnergyMap & total_energies( const_cast< EnergyMap & > ( energies.total_energies() ) );
1128 EnergyGraph & energy_graph( energies.energy_graph() );
1134 bool const minimizing( energies.use_nblist() );
1142 edge_iter = g->get_node( ii )->const_upper_edge_list_begin(),
1143 edge_iter_end = g->get_node( ii )->const_upper_edge_list_end();
1144 edge_iter != edge_iter_end; ++edge_iter ) {
1145 Size const jj = (*edge_iter)->get_second_node_ind();
1147 MinimizationEdge const & minedge( static_cast< MinimizationEdge const & > (**edge_iter) );
1159 iru = energy_graph.get_node(i)->upper_edge_list_begin(),
1161 iru != irue; ++iru ) {
1162 EnergyEdge & edge( static_cast< EnergyEdge & > (**iru) );
1206 total_energies.accumulate( tbemap,
ci_2b_types() );
1207 total_energies.accumulate( tbemap,
cd_2b_types() );
1219 if ( minimizing )
return;
1225 if ( !lrec || lrec->empty() )
continue;
1230 rni = lrec->upper_neighbor_iterator_begin( ii ),
1231 rniend = lrec->upper_neighbor_iterator_end( ii );
1232 (*rni) != (*rniend); ++(*rni) ) {
1234 if ( ! rni->energy_computed() ) {
1235 (*iter)->residue_pair_energy(
1237 pose.
residue( rni->upper_neighbor_id() ),
1238 pose, *
this, emap );
1239 rni->save_energy( emap );
1246 rni->mark_energy_computed();
1249 rni->retrieve_energy( emap );
1251 total_energies += emap;
1266 rni = lrec->upper_neighbor_iterator_begin( ii ),
1267 rniend = lrec->upper_neighbor_iterator_end( ii );
1268 (*rni) != (*rniend); ++(*rni) ) {
1271 (*iter)->residue_pair_energy(
1273 pose.
residue( rni->upper_neighbor_id() ),
1274 pose, *
this, emap );
1276 rni->save_energy( emap );
1279 total_energies += emap;
1372 // just for debugging, since this involves some extra calculation
1376 for ( AllMethods::const_iterator it=all_methods_.begin(),
1377 it_end = all_methods_.end(); it != it_end; ++it ) {
1378 (*it)->finalize_total_energy( pose, *this, emap );
1380 //std::cout << "before: " << tmp_score << std::endl;
1381 tmp_score += emap.dot( weights_ );
1384 // this warning is only relevant if all energies are 1body or 2body,
1385 // ie no whole-structure energies which are not assigned to an
1386 // individual residue
1387 Real const expected_score( energies.total_energy() );
1388 //std::cout << "[ DEBUG ] score-check: " << tmp_score << ' ' <<
1389 // expected_score << std::endl;
1390 if ( std::abs( tmp_score - expected_score ) > 1e-2 ) {
1391 std::cout << "[ WARNING ] score mismatch: " << tmp_score << ' ' <<
1392 expected_score << std::endl;
1395 } // accumulate_residue_total_energies
1405 EnergyMap & totals( energies.total_energies() );
1407 bool const minimizing( energies.use_nblist() );
1415 MinimizationNode const & iiminnode = * mingraph->get_minimization_node( ii );
1422 EnergyMap & emap( energies.onebody_energies( i ) );
1425 if ( energies.res_moved( i ) ) {
1438 if ( energies.res_moved( i ) ) {
1449 energies.reset_res_moved( i );
1465 (*iter)->eval_intrares_energy( rsd, pose, *
this, emap );
1469 (*iter)->eval_intrares_energy( rsd, pose, *
this, emap );
1483 (*iter)->evaluate_rotamer_intrares_energies( set, pose, *
this, energies );
1487 (*iter)->evaluate_rotamer_intrares_energies( set, pose, *
this, energies );
1501 (*iter)->evaluate_rotamer_intrares_energy_maps( set, pose, *
this, emaps );
1505 (*iter)->evaluate_rotamer_intrares_energy_maps( set, pose, *
this, emaps );
1519 (*iter)->eval_intrares_energy( rsd, pose, *
this, emap );
1533 (*iter)->eval_intrares_energy( rsd, pose, *
this, emap );
1546 for ( CI_1B_Methods::const_iterator iter =
ci_1b_methods_.begin(),
1548 (*iter)->residue_energy( rsd, pose, emap );
1559 for ( CD_1B_Methods::const_iterator iter =
cd_1b_methods_.begin(),
1561 (*iter)->residue_energy( rsd, pose, emap );
1575 for ( CI_2B_Methods::const_iterator iter =
ci_2b_methods_.begin(),
1577 (*iter)->residue_pair_energy( rsd1, rsd2, pose, *
this, emap );
1591 for ( CI_2B_Methods::const_iterator iter =
ci_2b_methods_.begin(),
1593 (*iter)->backbone_backbone_energy( rsd1, rsd2, pose, *
this, emap );
1607 for ( CI_2B_Methods::const_iterator iter =
ci_2b_methods_.begin(),
1609 (*iter)->backbone_sidechain_energy( rsd1, rsd2, pose, *
this, emap );
1622 for ( CI_2B_Methods::const_iterator iter =
ci_2b_methods_.begin(),
1624 (*iter)->sidechain_sidechain_energy( rsd1, rsd2, pose, *
this, emap );
1640 for ( CD_2B_Methods::const_iterator
1643 (*iter)->residue_pair_energy( rsd1, rsd2, pose, *
this, emap );
1655 for ( CD_2B_Methods::const_iterator iter =
cd_2b_methods_.begin(),
1657 (*iter)->backbone_backbone_energy( rsd1, rsd2, pose, *
this, emap );
1671 for ( CD_2B_Methods::const_iterator iter =
cd_2b_methods_.begin(),
1673 (*iter)->backbone_sidechain_energy( rsd1, rsd2, pose, *
this, emap );
1686 for ( CD_2B_Methods::const_iterator iter =
cd_2b_methods_.begin(),
1688 (*iter)->sidechain_sidechain_energy( rsd1, rsd2, pose, *
this, emap );
1711 for ( CD_2B_Methods::const_iterator iter =
cd_2b_methods_.begin(),
1713 (*iter)->bump_energy_full( rsd1, rsd2, pose, *
this, emap );
1715 for ( CI_2B_Methods::const_iterator iter =
ci_2b_methods_.begin(),
1717 (*iter)->bump_energy_full( rsd1, rsd2, pose, *
this, emap );
1739 for ( CD_2B_Methods::const_iterator iter =
cd_2b_methods_.begin(),
1741 (*iter)->bump_energy_backbone( rsd1, rsd2, pose, *
this, emap );
1743 for ( CI_2B_Methods::const_iterator iter =
ci_2b_methods_.begin(),
1745 (*iter)->bump_energy_backbone( rsd1, rsd2, pose, *
this, emap );
1755 FArray2D< core::PackerEnergy > & energy_table
1758 for ( CD_2B_Methods::const_iterator iter =
cd_2b_methods_.begin(),
1760 (*iter)->evaluate_rotamer_pair_energies(
1761 set1, set2, pose, *
this,
weights(), energy_table );
1763 for ( CI_2B_Methods::const_iterator iter =
ci_2b_methods_.begin(),
1765 (*iter)->evaluate_rotamer_pair_energies(
1766 set1, set2, pose, *
this,
weights(), energy_table );
1784 return ( ( intxn_radius > 0 &&
1785 rsd1.nbr_atom_xyz().distance_squared( rsd2.nbr_atom_xyz() ) < intxn_radius * intxn_radius ) ||
1797 for ( LR_2B_Methods::const_iterator iter =
lr_2b_methods_.begin(),
1799 if ( (*iter)->defines_residue_pair_energy( pose, res1, res2 )) {
1855 ScoreFunction::CI_2B_Methods::const_iterator
1861 ScoreFunction::CI_2B_Methods::const_iterator
1867 ScoreFunction::CD_2B_Methods::const_iterator
1873 ScoreFunction::CD_2B_Methods::const_iterator
1925 for ( CD_2B_Methods::const_iterator iter =
cd_2b_methods_.begin(),
1927 (*iter)->evaluate_rotamer_background_energies(
1928 set1, residue2, pose, *
this,
weights(), energy_vector );
1930 for ( CI_2B_Methods::const_iterator iter =
ci_2b_methods_.begin(),
1932 (*iter)->evaluate_rotamer_background_energies(
1933 set1, residue2, pose, *
this,
weights(), energy_vector );
1943 using namespace methods;
1948 if ( setting ==
Real(0.0) ) {
1949 if ( old_weight !=
Real(0.0) ) {
1956 for ( ScoreTypes::const_iterator
1957 iter = method->score_types().begin(),
1958 iter_end = method->score_types().end(); iter != iter_end; ++iter ) {
1960 has_nonzero_weight =
true;
1964 if ( ! has_nonzero_weight ) {
1973 if ( old_weight ==
Real(0.0) ) {
1979 assert( std::abs( old_weight ) < 1e-2 );
1985 if ( t ==
python )
return;
2018 using namespace methods;
2023 for ( AllMethods::const_iterator it=
all_methods_.begin(),
2025 for ( ScoreTypes::const_iterator
t=(*it)->score_types().begin(),
2026 t_end=(*it)->score_types().end();
t != t_end; ++
t ) {
2032 it != it_end; ++it ) {
2034 ScoreType const t( static_cast< ScoreType >( it - counter.begin() + 1));
2035 Real const count( *it );
2036 if ( count > 1.5 ) {
2037 utility_exit_with_message(
"multiple methods for same score type!" );
2038 }
else if ( count < 0.5 && std::abs(
weights_[ t ] > 1e-2 ) ) {
2039 utility_exit_with_message(
2053 for ( CD_2B_Methods::const_iterator iter =
cd_2b_methods_.begin(),
2055 if ( (*iter)->defines_intrares_energy(
weights())) {
2062 if ( (*iter)->defines_intrares_energy(
weights())) {
2068 for ( CI_2B_Methods::const_iterator iter =
ci_2b_methods_.begin(),
2070 if ( (*iter)->defines_intrares_energy(
weights() )) {
2077 if ( (*iter)->defines_intrares_energy(
weights() )) {
2091 for ( AllMethods::const_iterator it=
all_methods_.begin(),
2093 (*it)->setup_for_scoring( pose, *
this );
2101 mingraph->get_minimization_node( ii )->setup_for_scoring( pose.
residue( ii ), pose, *this );
2106 edgeit = mingraph->edge_list_begin(), edgeit_end = mingraph->edge_list_end();
2107 edgeit != edgeit_end; ++edgeit ) {
2116 for ( MinimizationGraph::Energies::const_iterator
2117 iter = mingraph->whole_pose_context_enmeths_begin(),
2118 iter_end = mingraph->whole_pose_context_enmeths_end();
2119 iter != iter_end; ++iter ) {
2120 (*iter)->setup_for_scoring( pose, *
this );
2133 for ( AllMethods::const_iterator iter=
all_methods_.begin(),
2134 iter_end=
all_methods_.end(); iter != iter_end; ++iter ) {
2135 (*iter)->setup_for_packing( pose, residues_repacking, residues_designing );
2146 for ( AllMethods::const_iterator iter=
all_methods_.begin(),
2147 iter_end=
all_methods_.end(); iter != iter_end; ++iter ) {
2148 (*iter)->prepare_rotamers_for_packing( pose, set );
2159 for ( AllMethods::const_iterator iter=
all_methods_.begin(),
2160 iter_end=
all_methods_.end(); iter != iter_end; ++iter ) {
2161 (*iter)->update_residue_for_packing( pose, resid );
2188 edgeit = mingraph->edge_list_begin(), edgeit_end = mingraph->edge_list_end();
2189 edgeit != edgeit_end; ++edgeit ) {
2198 for ( MinimizationGraph::Energies::const_iterator
2199 iter = mingraph->whole_pose_context_enmeths_begin(),
2200 iter_end = mingraph->whole_pose_context_enmeths_end();
2201 iter != iter_end; ++iter ) {
2202 (*iter)->setup_for_derivatives( pose, *
this );
2214 for ( AllMethods::const_iterator iter=
all_methods_.begin(),
2215 iter_end=
all_methods_.end(); iter != iter_end; ++iter ) {
2216 (*iter)->finalize_after_derivatives( pose, *
this );
2245 std::list< methods::EnergyMethodCOP > eval_derivs_with_pose_enmeths;
2246 for ( AllMethods::const_iterator iter=
all_methods_.begin(),
2247 iter_end=
all_methods_.end(); iter != iter_end; ++iter ) {
2248 if ((*iter)->defines_high_order_terms( pose ) || (*iter)->minimize_in_whole_structure_context( pose ) )
2249 eval_derivs_with_pose_enmeths.push_back( *iter );
2257 min_map, pose,
true, fixed_energies );
2265 edge_iter = g->edge_list_begin(),
2266 edge_iter_end = g->edge_list_end(),
2268 edge_iter != edge_iter_end; ++edge_iter, ++ee_edge_iter ) {
2269 Size const node1 = (*edge_iter)->get_first_node_ind();
2270 Size const node2 = (*edge_iter)->get_second_node_ind();
2271 assert( node1 == (*ee_edge_iter)->get_first_node_ind() );
2272 assert( node2 == (*ee_edge_iter)->get_second_node_ind() );
2274 MinimizationEdge & minedge( static_cast< MinimizationEdge & > (**edge_iter) );
2276 bool const res_moving_wrt_eachother(
2277 domain_map( node1 ) == 0 ||
2278 domain_map( node2 ) == 0 ||
2279 domain_map( node1 ) != domain_map( node2 ) );
2283 minedge, min_map, pose, res_moving_wrt_eachother,
true,
2284 static_cast< EnergyEdge const *
> (*ee_edge_iter), fixed_energies );
2299 iter != iter_end; ++iter ) {
2305 if ( !lrec || lrec->empty() )
continue;
2310 rni = lrec->const_upper_neighbor_iterator_begin( ii ),
2311 rniend = lrec->const_upper_neighbor_iterator_end( ii );
2312 (*rni) != (*rniend); ++(*rni) ) {
2313 Size const jj = rni->upper_neighbor_id();
2314 bool const res_moving_wrt_eachother(
2315 domain_map( ii ) == 0 ||
2316 domain_map( jj ) == 0 ||
2317 domain_map( ii ) != domain_map( jj ) );
2319 pose.
residue( ii ), pose.
residue( jj ), *iter, *g, min_map, pose,
2320 res_moving_wrt_eachother,
true, rni, fixed_energies );
2328 edge_iter_end = g->edge_list_end(); edge_iter != edge_iter_end; ) {
2329 Size const node1 = (*edge_iter)->get_first_node_ind();
2330 Size const node2 = (*edge_iter)->get_second_node_ind();
2332 MinimizationEdge & minedge( static_cast< MinimizationEdge & > (**edge_iter) );
2343 g->delete_edge( *edge_iter );
2345 edge_iter = edge_iter_next;
2350 for ( std::list< methods::EnergyMethodCOP >::const_iterator
2351 iter = eval_derivs_with_pose_enmeths.begin(),
2352 iter_end = eval_derivs_with_pose_enmeths.end();
2353 iter != iter_end; ++iter ) {
2354 (*iter)->setup_for_minimizing( pose, *
this, min_map );
2355 g->add_whole_pose_context_enmeth( *iter );
2363 g->set_fixed_energies( fixed_energies );
2382 bool accumulate_fixed_energies,
2389 for ( CI_1B_Methods::const_iterator iter =
ci_1b_methods_.begin(),
2393 if ( domain_map( seqpos ) != 0 && accumulate_fixed_energies ) {
2398 for ( CD_1B_Methods::const_iterator iter =
cd_1b_methods_.begin(),
2405 for ( CI_2B_Methods::const_iterator iter =
ci_2b_methods_.begin(),
2410 if ( domain_map( seqpos ) != 0 && accumulate_fixed_energies ) {
2417 for ( CD_2B_Methods::const_iterator iter =
cd_2b_methods_.begin(),
2422 for ( LR_2B_Methods::const_iterator iter =
lr_2b_methods_.begin(),
2425 if ( domain_map( seqpos ) == 0 && accumulate_fixed_energies && (*iter)->method_type() ==
methods::ci_lr_2b ) {
2446 for ( CI_1B_Methods::const_iterator iter = ci_1b_methods_.begin(),
2447 iter_end = ci_1b_methods_.end(); iter != iter_end; ++iter ) {
2448 if ( domain_map( seqpos ) == 0 && ! (*iter)->minimize_in_whole_structure_context( pose ) ) {
2449 if ( (*iter)->defines_score_for_residue( rsd )) {
2450 (*iter)->setup_for_minimizing_for_residue(
2451 rsd, pose, *this, min_map,
2452 min_node.res_min_data() );
2457 for ( CD_1B_Methods::const_iterator iter = cd_1b_methods_.begin(),
2458 iter_end = cd_1b_methods_.end(); iter != iter_end; ++iter ) {
2459 // domain map check here?
2460 if ( ! (*iter)->minimize_in_whole_structure_context( pose ) && (*iter)->defines_score_for_residue( rsd )) {
2461 (*iter)->setup_for_minimizing_for_residue(
2462 rsd, pose, *this, min_map,
2463 min_node.res_min_data() );
2467 for ( CI_2B_Methods::const_iterator iter = ci_2b_methods_.begin(),
2468 iter_end = ci_2b_methods_.end(); iter != iter_end; ++iter ) {
2469 if ( ! (*iter)->minimize_in_whole_structure_context( pose ) ) {
2472 (*iter)->setup_for_minimizing_for_residue(
2473 rsd, pose, *this, min_map,
2474 min_node.res_min_data() );
2479 for ( CD_2B_Methods::const_iterator iter = cd_2b_methods_.begin(),
2480 iter_end = cd_2b_methods_.end(); iter != iter_end; ++iter ) {
2481 // domain map check here?
2482 if ( ! (*iter)->minimize_in_whole_structure_context( pose ) ) {
2483 (*iter)->setup_for_minimizing_for_residue(
2484 rsd, pose, *this, min_map,
2485 min_node.res_min_data() );
2489 for ( LR_2B_Methods::const_iterator iter = lr_2b_methods_.begin(),
2490 iter_end = lr_2b_methods_.end(); iter != iter_end; ++iter ) {
2491 // domain map check here? -- should separate CI and CD LR2B energies
2492 if ( ! (*iter)->minimize_in_whole_structure_context( pose ) ) {
2493 (*iter)->setup_for_minimizing_for_residue(
2494 rsd, pose, *this, min_map,
2495 min_node.res_min_data() );
2509 bool const res_moving_wrt_eachother,
2510 bool accumulate_fixed_energies,
2516 assert( ! accumulate_fixed_energies || energy_edge );
2519 if ( res_moving_wrt_eachother ) {
2520 for ( CI_2B_Methods::const_iterator iter =
ci_2b_methods_.begin(),
2524 }
else if ( accumulate_fixed_energies ) {
2529 for ( CD_2B_Methods::const_iterator iter =
cd_2b_methods_.begin(),
2531 if ( ! min_edge.
add_twobody_enmeth( *iter, res1, res2, pose, res_moving_wrt_eachother )
2532 && accumulate_fixed_energies ) {
2546 bool const res_moving_wrt_eachother,
2547 bool accumulate_fixed_energies,
2550 Real const edge_weight
2556 if ( res_moving_wrt_eachother &&
2557 lr2benergy->defines_score_for_residue_pair( res1, res2, res_moving_wrt_eachother )) {
2565 minedge->
add_twobody_enmeth( lr2benergy, res1, res2, pose, res_moving_wrt_eachother );
2566 minedge->
weight( edge_weight );
2567 }
else if ( accumulate_fixed_energies ) {
2571 rni->accumulate_energy( fixed_energies );
2595 for ( MinimizationGraph::Energies::const_iterator
2596 iter = mingraph->whole_pose_context_enmeths_begin(),
2597 iter_end = mingraph->whole_pose_context_enmeths_end();
2598 iter != iter_end; ++iter ) {
2599 (*iter)->eval_atom_derivative( atom_id, pose, domain_map, *
this,
weights_, F1, F2 );
2626 MinimizationNode const & minnode = * mingraph->get_minimization_node( rsdno );
2675 using namespace methods;
2680 for ( ScoreTypes::const_iterator
2681 iter = method->score_types().begin(),
2682 iter_end = method->score_types().end(); iter != iter_end; ++iter ) {
2688 switch ( method->method_type() ) {
2692 ( static_cast< ContextIndependentTwoBodyEnergy* >( method() ) );
2697 ( static_cast< ContextDependentTwoBodyEnergy* >( method() ) );
2702 ( static_cast< ContextIndependentOneBodyEnergy* >( method() ) );
2707 ( static_cast< ContextDependentOneBodyEnergy* >( method() ) );
2712 static_cast< ContextIndependentLRTwoBodyEnergy* >( method() ) );
2714 static_cast< LongRangeTwoBodyEnergy* >( method() ) );
2719 static_cast< ContextDependentLRTwoBodyEnergy* >( method() ) );
2721 static_cast< LongRangeTwoBodyEnergy* >( method() ) );
2726 static_cast< WholeStructureEnergy* >( method() ) );
2730 utility_exit_with_message(
"unrecognized method type " );
2740 Real const new_weight,
2745 new_weight ==
Real(0.0) ||
2748 utility_exit_with_message(
"bad call to ScoreFunction::add_extra_method" );
2759 std::map< ScoreType, Real >
const & new_weights,
2763 for ( std::map< ScoreType, Real >::const_iterator it= new_weights.begin(); it != new_weights.end(); ++it ) {
2765 Real const new_weight( it->second );
2769 utility_exit_with_message(
"bad call to ScoreFunction::add_extra_method" );
2786 assert( std::find( v.begin(), v.end(),
t ) != v.end() );
2787 v.erase( std::find( v.begin(), v.end(),
t ) );
2793 using namespace methods;
2797 for ( ScoreTypes::const_iterator
2798 iter = method->score_types().begin(),
2799 iter_end = method->score_types().end(); iter != iter_end; ++iter ) {
2804 bool rebuild_lr_methods(
false );
2806 switch ( method->method_type() ) {
2829 rebuild_lr_methods =
true;
2835 rebuild_lr_methods =
true;
2846 utility_exit_with_message(
"unrecognized method type " );
2849 if ( rebuild_lr_methods ) {
2898 for ( CD_2B_Methods::const_iterator iter =
cd_2b_methods_.begin(),
2900 if ( (*iter)->atomic_interaction_cutoff() > max_cutoff ) {
2901 max_cutoff = (*iter)->atomic_interaction_cutoff();
2904 for ( CI_2B_Methods::const_iterator iter =
ci_2b_methods_.begin(),
2906 if ( (*iter)->atomic_interaction_cutoff() > max_cutoff ) {
2907 max_cutoff = (*iter)->atomic_interaction_cutoff();
2910 for ( WS_Methods::const_iterator iter =
ws_methods_.begin(),
2911 iter_end =
ws_methods_.end(); iter != iter_end; ++iter ) {
2912 if ( (*iter)->atomic_interaction_cutoff() > max_cutoff ) {
2913 max_cutoff = (*iter)->atomic_interaction_cutoff();
2929 for ( AllMethods::const_iterator it=
all_methods_.begin(),
2931 (*it)->indicate_required_context_graphs(context_graphs_required);
2946 utility::io::izstream data1( name );
2947 if ( data1.good() ) {
2950 utility::io::izstream data2( name + extension );
2951 if ( data2.good() ) {
2952 return name + extension;
2954 utility::io::izstream data3( basic::database::full_name(
"scoring/weights/"+name+extension,
false ) );
2955 if ( data3.good() ) {
2956 return basic::database::full_name(
"scoring/weights/"+name+extension );
2958 utility::io::izstream data4( basic::database::full_name(
"scoring/weights/"+name,
false ) );
2959 if ( data4.good() ) {
2960 return basic::database::full_name(
"scoring/weights/"+name );
2962 utility_exit_with_message(
"Unable to open weights/patch file. None of (./)" + name +
" or " +
2963 "(./)" + name + extension +
" or " +
2964 basic::database::full_name(
"scoring/weights/"+name,
false ) +
" or " +
2965 basic::database::full_name(
"scoring/weights/"+name+extension,
false ) +
" exist" );