41 #include <basic/Tracer.hh>
44 #include <basic/prof.hh>
49 #include <basic/datacache/CacheableData.hh>
58 #include <utility/vector1.hh>
67 using namespace conformation::symmetry;
69 static basic::Tracer
TR(
"core.scoring.SymmetricScoreFunction");
118 TR <<
"Warning!!! Using a symmetric score function on a non-symmetric pose" << std::endl;
119 ScoreFunction asym_score( static_cast< ScoreFunction const & >( (*
this) ) );
120 return ( asym_score )(pose);
126 PROF_START( basic::SCORE );
146 TR.Error <<
"STARTING SCORE NON-ZERO!" << std::endl;
163 PROF_START( basic::SCORE_NEIGHBOR_ENERGIES );
167 PROF_STOP ( basic::SCORE_NEIGHBOR_ENERGIES );
170 PROF_START( basic::SCORE_LONG_RANGE_ENERGIES );
172 PROF_STOP ( basic::SCORE_LONG_RANGE_ENERGIES );
203 PROF_STOP ( basic::SCORE );
221 dynamic_cast<SymmetricConformation &> ( pose.
conformation()) );
225 dynamic_cast< SymmetricEnergies & > ( pose.
energies()) );
231 std::list< methods::EnergyMethodCOP > eval_derivs_with_pose_enmeths;
232 for ( AllMethods::const_iterator iter=
all_methods().begin(),
233 iter_end=
all_methods().end(); iter != iter_end; ++iter ) {
234 if ((*iter)->defines_high_order_terms( pose ) || (*iter)->minimize_in_whole_structure_context( pose ) )
235 eval_derivs_with_pose_enmeths.push_back( *iter );
244 bool accumulate_fixed_energies( symm_info.fa_is_independent(ii) &&
245 ii > symm_info.num_total_residues_without_pseudo() );
248 min_map, pose, accumulate_fixed_energies, fixed_energies );
249 g->get_minimization_node( ii )->weight( symm_info.score_multiply_factor() );
251 min_map, pose,
false, fixed_energies );
258 edge_iter = g->edge_list_begin(),
259 edge_iter_end = g->edge_list_end(),
260 dedge_iter = dg->edge_list_begin(),
261 dedge_iter_end = dg->edge_list_end(),
263 edge_iter != edge_iter_end; ++edge_iter, ++dedge_iter, ++ee_edge_iter ) {
264 Size const node1 = (*edge_iter)->get_first_node_ind();
265 Size const node2 = (*edge_iter)->get_second_node_ind();
266 assert( node1 == (*ee_edge_iter)->get_first_node_ind() );
267 assert( node2 == (*ee_edge_iter)->get_second_node_ind() );
268 assert( node1 == (*dedge_iter)->get_first_node_ind() );
269 assert( node2 == (*dedge_iter)->get_second_node_ind() );
270 assert( symm_info.bb_follows( node1 ) == 0 || symm_info.bb_follows( node2 ) == 0 );
273 bool const res_moving_wrt_eachother(
274 domain_map( node1 ) == 0 ||
275 domain_map( node2 ) == 0 ||
276 domain_map( node1 ) != domain_map( node2 ) );
278 Real edge_weight = symm_info.score_multiply( node1, node2 );
279 if ( edge_weight != 0.0 ) {
281 MinimizationEdge & minedge( static_cast< MinimizationEdge & > (**edge_iter) );
284 minedge, min_map, pose, res_moving_wrt_eachother,
true,
285 static_cast< EnergyEdge const *
> (*ee_edge_iter), fixed_energies, edge_weight );
286 minedge.
weight( edge_weight );
288 MinimizationEdge & minedge( static_cast< MinimizationEdge & > (**dedge_iter) );
291 minedge, min_map, pose, res_moving_wrt_eachother,
false,
292 static_cast< EnergyEdge const *
> (*ee_edge_iter), fixed_energies );
308 iter != iter_end; ++iter ) {
313 if ( !lrec || lrec->empty() )
continue;
318 rni = lrec->const_upper_neighbor_iterator_begin( ii ),
319 rniend = lrec->const_upper_neighbor_iterator_end( ii );
320 (*rni) != (*rniend); ++(*rni) ) {
321 Size const jj = rni->upper_neighbor_id();
322 bool const res_moving_wrt_eachother(
323 domain_map( ii ) == 0 ||
324 domain_map( jj ) == 0 ||
325 domain_map( ii ) != domain_map( jj ) );
327 Real edge_weight = symm_info.score_multiply( ii, jj );
328 if ( edge_weight != 0.0 ) {
332 res_moving_wrt_eachother,
true, rni, fixed_energies, edge_weight );
336 pose.
residue( ii ), pose.
residue( jj ), *iter, *dg, min_map, pose,
337 res_moving_wrt_eachother,
false, rni, fixed_energies );
345 edge_iter_end = g->edge_list_end(); edge_iter != edge_iter_end; ) {
346 Size const node1 = (*edge_iter)->get_first_node_ind();
347 Size const node2 = (*edge_iter)->get_second_node_ind();
349 MinimizationEdge & minedge( static_cast< MinimizationEdge & > (**edge_iter) );
361 g->delete_edge( *edge_iter );
363 edge_iter = edge_iter_next;
368 edge_iter_end = dg->edge_list_end(); edge_iter != edge_iter_end; ) {
370 Size const node2 = (*edge_iter)->get_second_node_ind();
372 MinimizationEdge & minedge( static_cast< MinimizationEdge & > (**edge_iter) );
385 g->delete_edge( *edge_iter );
387 edge_iter = edge_iter_next;
392 for ( std::list< methods::EnergyMethodCOP >::const_iterator
393 iter = eval_derivs_with_pose_enmeths.begin(),
394 iter_end = eval_derivs_with_pose_enmeths.end();
395 iter != iter_end; ++iter ) {
396 (*iter)->setup_for_minimizing( pose, *
this, min_map );
397 g->add_whole_pose_context_enmeth( *iter );
405 g->set_fixed_energies( fixed_energies );
406 symm_energies.set_minimization_graph( g );
407 symm_energies.set_derivative_graph( dg );
422 EnergyMap & total_energies( const_cast< EnergyMap & > ( energies.total_energies() ) );
425 dynamic_cast<SymmetricConformation &> ( pose.
conformation()) );
429 EnergyGraph & energy_graph( energies.energy_graph() );
435 bool const minimizing( energies.use_nblist() );
442 edge_iter = g->const_edge_list_begin(),
443 edge_iter_end = g->const_edge_list_end();
444 edge_iter != edge_iter_end; ++edge_iter ) {
445 Size const node1 = (*edge_iter)->get_first_node_ind();
446 Size const node2 = (*edge_iter)->get_second_node_ind();
449 MinimizationEdge const & minedge( static_cast< MinimizationEdge const & > (**edge_iter) );
460 iru = energy_graph.get_node(i)->upper_edge_list_begin(),
462 iru != irue; ++iru ) {
463 EnergyEdge & edge( static_cast< EnergyEdge & > (**iru) );
476 tbemap[
cd_2b_types()[ ii ]] *= symm_info->score_multiply(i,j);
495 tbemap[
ci_2b_types()[ ii ]] *= symm_info->score_multiply(i,j);
503 tbemap[
ci_2b_types()[ ii ]] *= symm_info->score_multiply(i,j);
519 total_energies.accumulate( tbemap,
ci_2b_types() );
520 total_energies.accumulate( tbemap,
cd_2b_types() );
531 if ( minimizing )
return;
535 dynamic_cast<SymmetricConformation &> ( pose.
conformation()) );
544 if ( !lrec || lrec->empty() )
continue;
549 rni = lrec->upper_neighbor_iterator_begin( ii ),
550 rniend = lrec->upper_neighbor_iterator_end( ii );
551 (*rni) != (*rniend); ++(*rni) ) {
553 if ( ! rni->energy_computed() ) {
554 Size jj = rni->upper_neighbor_id();
555 (*iter)->residue_pair_energy( pose.
residue(ii), pose.
residue( jj ), pose, *
this, emap );
556 emap *= symm_info->score_multiply( ii, jj );
557 rni->save_energy( emap );
565 rni->mark_energy_computed();
568 rni->retrieve_energy( emap );
570 total_energies += emap;
585 rni = lrec->upper_neighbor_iterator_begin( ii ),
586 rniend = lrec->upper_neighbor_iterator_end( ii );
587 (*rni) != (*rniend); ++(*rni) ) {
590 Size jj = rni->upper_neighbor_id();
591 (*iter)->residue_pair_energy( pose.
residue(ii), pose.
residue(jj), pose, *
this, emap );
592 emap *= symm_info->score_multiply( ii, jj );
594 rni->save_energy( emap );
597 total_energies += emap;
611 EnergyMap & totals( energies.total_energies() );
615 dynamic_cast<SymmetricConformation &> ( pose.
conformation()) );
618 bool const minimizing( energies.use_nblist() );
624 for (
Size ii = 1; ii <= symm_info->num_total_residues_without_pseudo(); ++ii ) {
625 if ( !symm_info->fa_is_independent(ii) )
continue;
629 MinimizationNode const & iiminnode = * mingraph->get_minimization_node( ii );
635 if ( !symm_info->fa_is_independent(i) ||
636 i > symm_info->num_total_residues_without_pseudo() )
continue;
638 EnergyMap & emap( energies.onebody_energies( i ) );
641 if ( energies.res_moved( i ) ) {
645 emap *= symm_info->score_multiply(i,i);
651 cd_1b_emap *= symm_info->score_multiply_factor();
657 if ( energies.res_moved( i ) ) {
660 ci_intrares_emap *= symm_info->score_multiply_factor();
661 emap += ci_intrares_emap;
670 cd_2b_emap *= symm_info->score_multiply_factor();
675 energies.reset_res_moved( i );
676 for ( std::vector< Size>::const_iterator
677 clone = symm_info->bb_clones( i ).begin(),
678 clone_end = symm_info->bb_clones( i ).end();
680 energies.reset_res_moved( *
clone );
692 dynamic_cast<SymmetricConformation &> ( pose.
conformation()) );
700 for (
Size ii = 1; ii <= symm_info->num_total_residues_without_pseudo(); ++ii ) {
701 if ( symm_info->bb_is_independent( ii ) || g->get_node( ii )->num_edges() != 0 ) {
702 g->get_minimization_node( ii )->setup_for_derivatives( pose.
residue(ii), pose, *this );
707 edgeit = g->edge_list_begin(), edgeit_end = g->edge_list_end();
708 edgeit != edgeit_end; ++edgeit ) {
720 for (
Size ii = 1; ii <= symm_info->num_total_residues_without_pseudo(); ++ii ) {
721 if ( dg->get_node( ii )->num_edges() != 0 ) {
722 dg->get_minimization_node( ii )->setup_for_derivatives( pose.
residue(ii), pose, *this );
727 edgeit = dg->edge_list_begin(), edgeit_end = dg->edge_list_end();
728 edgeit != edgeit_end; ++edgeit ) {
737 for ( MinimizationGraph::Energies::const_iterator
738 iter = g->whole_pose_context_enmeths_begin(),
739 iter_end = g->whole_pose_context_enmeths_end();
740 iter != iter_end; ++iter ) {
741 (*iter)->setup_for_derivatives( pose, *
this );
770 eval_atom_derivative_for_minnode( minnode, atomno, rsd, pose, domain_map, *this, weights(), F1, F2 );
772 ResSingleMinimizationData const & ressingle_min_data( minnode.res_min_data() );
774 for ( graph::Node::EdgeListConstIter
775 edgeit = minnode.const_edge_list_begin(), edgeit_end = minnode.const_edge_list_end();
776 edgeit != edgeit_end; ++edgeit ) {
777 Vector f1(0.0), f2(0.0);
778 MinimizationEdge const & minedge = static_cast< MinimizationEdge const & > ( (**edgeit) );
779 Size const other_rsdno = minedge.get_other_ind( rsdno );
780 conformation::Residue const & other_rsd( pose.residue( other_rsdno ));
781 ResSingleMinimizationData const & other_ressingle_min_data( mingraph->get_minimization_node( other_rsdno )->res_min_data() );
783 eval_atom_deriv_for_minedge( minedge, atomno, rsd, other_rsd,
784 ressingle_min_data, other_ressingle_min_data,
785 pose, domain_map, *this, weights(), f1, f2 );
786 //std::cout << " scoring minedge with " << other_rsdno << " " << f1.x() << " " << f2.x() << std::endl;
792 ResSingleMinimizationData const & dressingle_min_data( dmingraph->get_minimization_node( rsdno )->res_min_data() );
793 for ( graph::Node::EdgeListConstIter
794 edgeit = dmingraph->get_minimization_node( rsdno )->const_edge_list_begin(),
795 edgeit_end = dmingraph->get_minimization_node( rsdno )->const_edge_list_end();
796 edgeit != edgeit_end; ++edgeit ) {
797 Vector f1(0.0), f2(0.0);
798 MinimizationEdge const & minedge = static_cast< MinimizationEdge const & > ( (**edgeit) );
799 Size const other_rsdno = minedge.get_other_ind( rsdno );
800 conformation::Residue const & other_rsd( pose.residue( other_rsdno ));
801 ResSingleMinimizationData const & other_dressingle_min_data( dmingraph->get_minimization_node( other_rsdno )->res_min_data() );
803 eval_atom_deriv_for_minedge( minedge, atomno, rsd, other_rsd,
804 dressingle_min_data, other_dressingle_min_data,
805 pose, domain_map, *this, weights(), f1, f2 );
806 //std::cout << " deriv minedge with " << other_rsdno << " " << f1.x() << " " << f2.x() << std::endl;
812 for ( MinimizationGraph::Energies::const_iterator
813 iter = mingraph->whole_pose_context_enmeths_begin(),
814 iter_end = mingraph->whole_pose_context_enmeths_end();
815 iter != iter_end; ++iter ) {
816 (*iter)->eval_atom_derivative( atom_id, pose, domain_map, *
this,
weights(), F1, F2 );
836 MinimizationNode const & minnode = * mingraph->get_minimization_node( rsdno );
854 dynamic_cast<SymmetricConformation &> ( pose.
conformation()) );
858 for (
Size i = 1; i <= hbond_set.
nhbonds(); ++i ) {
861 Real sr_bb_hbenergy = 0.0;
862 Real lr_bb_hbenergy = 0.0;
866 sr_bb_hbenergy = hbond.energy() * hbond.weight();
869 lr_bb_hbenergy = hbond.energy() * hbond.weight();
877 TR.Warning <<
"Warning: energy from unexpected HB type ignored " << hbond.eval_type() << std::endl;
883 factor = symm_info->score_multiply( hbond.don_res() , hbond.acc_res() );
887 if ( symm_info->bb_follows( hbond.acc_res() ) == hbond.don_res() ||
888 symm_info->bb_follows( hbond.don_res() ) == hbond.acc_res() ) {
889 factor = symm_info->score_multiply_factor() - 1;
891 intersubunit_energy[
hbond_lr_bb ] += factor*lr_bb_hbenergy;
892 intersubunit_energy[
hbond_sr_bb ] += factor*sr_bb_hbenergy;
905 dynamic_cast<SymmetricConformation &> ( pose.
conformation()) );
908 for (
Size i = 1; i <= hbond_set->nhbonds(); ++i ) {
910 Size acc( hbond.acc_res() );
911 Size don( hbond.don_res() );
912 if ( symm_info->fa_is_independent( acc ) ) {
913 for ( std::vector<Size>::const_iterator
clone=symm_info->bb_clones(acc).begin(), clone_end=symm_info->bb_clones(acc).end();
915 hbond_set->set_backbone_backbone_acceptor( *
clone, hbond_set->acc_bbg_in_bb_bb_hbond( acc ) );
918 if ( symm_info->fa_is_independent( don ) ) {
919 for ( std::vector<Size>::const_iterator
clone=symm_info->bb_clones(don).begin(), clone_end=symm_info->bb_clones(don).end();
921 hbond_set->set_backbone_backbone_acceptor( *
clone, hbond_set->acc_bbg_in_bb_bb_hbond( don ) );
935 ( static_cast< hbonds::HBondSet & >
939 dynamic_cast<SymmetricConformation &> ( pose.
conformation()) );
943 if ( symm_info->get_use_symmetry() ) {
944 if ( !symm_info->fa_is_independent( res ) ) {
945 int symm_res ( symm_info->bb_follows( res ) );
946 int neighbors_symm ( hbond_set->nbrs( symm_res ) );
947 hbond_set->set_nbrs( res, neighbors_symm );
965 dynamic_cast<SymmetricConformation &> ( pose.
conformation()) );
969 if ( symm_info->get_use_symmetry() ) {
970 if ( !symm_info->fa_is_independent( res ) ) {
971 int symm_res ( symm_info->bb_follows( res ) );
972 double fcen6_symm ( cenlist->fcen6( symm_res) );
973 double fcen10_symm ( cenlist->fcen10( symm_res ) );
974 double fcen12_symm ( cenlist->fcen12( symm_res ) );
975 cenlist->set_fcen6( res, fcen6_symm );
976 cenlist->set_fcen10( res, fcen10_symm );
977 cenlist->set_fcen12( res, fcen12_symm );
1012 dynamic_cast<SymmetricConformation &> ( pose.
conformation()) );
1014 Size const factor ( symm_info->score_multiply_factor() - 1 );
1033 delta_energy -= interface_energies;
1034 delta_energy *= factor;
1040 delta_energy += new_interface_energy;
1046 delta_energy += interchain_contact_energy;
1053 for (
Size j=1; j<=type_i.size(); ++j) {
1056 delta_energy -= deldel_energy;