44 #include <ObjexxFCL/FArray2D.hh>
46 #include <utility/vector1.hh>
49 using namespace ObjexxFCL;
54 namespace rotamer_set {
57 SymmetricRotamerSets::SymmetricRotamerSets() {}
58 SymmetricRotamerSets::~SymmetricRotamerSets() {}
65 SymmetricRotamerSets::compute_energies(
72 using namespace interaction_graph;
73 using namespace scoring;
77 ig->initialize( *
this );
78 compute_one_body_energies( pose, scfxn, packer_neighbor_graph, ig );
81 dynamic_cast< PrecomputedPairEnergiesInteractionGraph *
> ( ig.get() );
83 precompute_two_body_energies( pose, scfxn, packer_neighbor_graph, pig );
86 dynamic_cast< SymmOnTheFlyInteractionGraph *
> ( ig.get() );
88 prepare_symm_otf_interaction_graph( pose, scfxn, packer_neighbor_graph, symotfig );
90 utility_exit_with_message(
"Encountered incompatible interaction graph type in SymmetricRotamerSets::compute_energies" );
98 SymmetricRotamerSets::compute_one_body_energies(
106 for (
uint ii = 1; ii <= nmoltenres(); ++ii )
109 rotamer_set_for_moltenresidue( ii )->compute_one_body_energies(
110 pose, scfxn, *task(), packer_neighbor_graph, one_body_energies );
111 ig->add_to_nodes_one_body_energy( ii, one_body_energies );
119 SymmetricRotamerSets::precompute_two_body_energies(
124 bool const finalize_edges
127 using namespace interaction_graph;
128 using namespace scoring;
132 dynamic_cast<SymmetricConformation const &> ( pose.
conformation()) );
136 for (
uint ii = 1; ii <= nmoltenres(); ++ii )
139 uint ii_resid = moltenres_2_resid( ii );
142 uli = packer_neighbor_graph->get_node( ii_resid )->const_upper_edge_list_begin(),
143 ulie = packer_neighbor_graph->get_node( ii_resid )->const_upper_edge_list_end();
146 uint jj_resid = (*uli)->get_second_node_ind();
147 uint jj = resid_2_moltenres( jj_resid );
149 if ( jj == 0 && symm_info->chi_follows( jj_resid ) == 0 )
continue;
151 uint jj_resid_master = jj_resid;
152 if ( symm_info->chi_follows( jj_resid ) != 0 ) jj_resid_master = symm_info->chi_follows( jj_resid );
154 uint jj_master = resid_2_moltenres( jj_resid_master );
156 if ( jj_master == 0 )
continue;
162 uint ii_resid_master = ii_resid;
165 if ( ii_master == jj_master )
continue;
170 if ( jj_resid_master < ii_resid ) {
172 uint temp_ii = ii_master;
173 uint temp_ii_resid = ii_resid_master;
174 ii_master = jj_master;
175 ii_resid_master = jj_resid_master;
177 jj_resid_master = temp_ii_resid;
182 FArray2D< core::PackerEnergy > pair_energy_table(
183 nrotamers_for_moltenres( jj_master ),
184 nrotamers_for_moltenres( ii_master ), 0.0 );
186 RotamerSetOP ii_rotset = rotamer_set_for_moltenresidue( ii_master );
187 RotamerSetOP jj_rotset = rotamer_set_for_moltenresidue( jj_master );
192 if ( symm_info->chi_follows( jj_resid ) != 0 && jj == 0 ) {
195 orient_rotamer_set_to_symmetric_partner(pose,ii_resid_master,jj_resid) );
196 ii_rotset = rotated_ii_rotset;
200 orient_rotamer_set_to_symmetric_partner(pose,jj_resid_master,jj_resid) );
201 jj_rotset = rotated_jj_rotset;
206 *ii_rotset, *jj_rotset, pose, pair_energy_table );
209 pair_energy_table *= symm_info->score_multiply(ii_resid,jj_resid);
210 if ( !pig->get_edge_exists( ii_master, jj_master ) ) {
211 pig->add_edge( ii_master, jj_master );
213 pig->add_to_two_body_energies_for_edge( ii_master, jj_master, pair_energy_table );
217 && final_visit_to_edge( pose, packer_neighbor_graph, ii_resid, jj_resid ) ){
218 pig->declare_edge_energies_final( ii_master, jj_master );
229 lr_iter != lr_end; ++lr_iter ) {
231 if ( !lrec || lrec->empty() )
continue;
234 for (
uint ii = 1; ii <= nmoltenres(); ++ ii ) {
235 uint const ii_resid = moltenres_2_resid( ii );
238 rni = lrec->const_upper_neighbor_iterator_begin( ii_resid ),
239 rniend = lrec->const_upper_neighbor_iterator_end( ii_resid );
240 (*rni) != (*rniend); ++(*rni) ) {
241 Size jj_resid = rni->upper_neighbor_id();
243 uint jj = resid_2_moltenres( jj_resid );
246 if ( jj == 0 && symm_info->chi_follows( jj_resid ) == 0 )
continue;
248 uint jj_resid_master = jj_resid;
249 if ( symm_info->chi_follows( jj_resid ) != 0 ) jj_resid_master = symm_info->chi_follows( jj_resid );
251 uint jj_master = resid_2_moltenres( jj_resid_master );
253 if ( jj_master == 0 )
continue;
259 uint ii_resid_master = ii_resid;
262 if ( ii_master == jj_master )
continue;
267 if ( jj_resid_master < ii_resid ) {
269 uint temp_ii = ii_master;
270 uint temp_ii_resid = ii_resid_master;
271 ii_master = jj_master;
272 ii_resid_master = jj_resid_master;
274 jj_resid_master = temp_ii_resid;
279 FArray2D< core::PackerEnergy > pair_energy_table(
280 nrotamers_for_moltenres( jj_master ),
281 nrotamers_for_moltenres( ii_master ), 0.0 );
283 RotamerSetOP ii_rotset = rotamer_set_for_moltenresidue( ii_master );
284 RotamerSetOP jj_rotset = rotamer_set_for_moltenresidue( jj_master );
289 if ( symm_info->chi_follows( jj_resid ) != 0 && jj == 0 ) {
292 orient_rotamer_set_to_symmetric_partner(pose,ii_resid_master,jj_resid) );
293 ii_rotset = rotated_ii_rotset;
297 orient_rotamer_set_to_symmetric_partner(pose,jj_resid_master,jj_resid) );
298 jj_rotset = rotated_jj_rotset;
302 (*lr_iter)->evaluate_rotamer_pair_energies(
303 *ii_rotset, *jj_rotset, pose, scfxn, scfxn.
weights(), pair_energy_table );
305 pair_energy_table *= symm_info->score_multiply(ii_resid,jj_resid);
307 if ( ! pig->get_edge_exists( ii_master, jj_master ) ) { pig->add_edge( ii_master, jj_master ); }
308 pig->add_to_two_body_energies_for_edge( ii_master, jj_master, pair_energy_table );
309 if ( finalize_edges && final_visit_to_edge( pose, packer_neighbor_graph, ii_resid, jj_resid ) )
310 pig->declare_edge_energies_final( ii_master, jj_master );
319 SymmetricRotamerSets::prepare_symm_otf_interaction_graph(
328 dynamic_cast<SymmetricConformation const &> ( pose.
conformation()) );
333 for (
Size ii = 1; ii <= nmoltenres(); ++ii ) {
334 RotamerSetCOP ii_rotset = rotamer_set_for_moltenresidue( ii );
335 bool all_canonical_aas(
true );
336 for (
Size jj = 1, jje = ii_rotset->get_n_residue_types(); jj <= jje; ++jj ) {
339 all_canonical_aas =
false;
342 if ( all_canonical_aas ) {
343 ig->distinguish_backbone_and_sidechain_for_node( ii,
true );
347 for (
Size ii = 1; ii <= nmoltenres(); ++ii ) {
348 Size ii_resid = moltenres_2_resid( ii );
350 uli = packer_neighbor_graph->get_node( ii_resid )->const_upper_edge_list_begin(),
351 ulie = packer_neighbor_graph->get_node( ii_resid )->const_upper_edge_list_end(); uli != ulie; ++uli ) {
352 Size jj_resid = (*uli)->get_second_node_ind();
353 Size jj = resid_2_moltenres( jj_resid );
360 if ( jj == 0 && symm_info->chi_follows( jj_resid ) == 0 ) {
continue; }
361 Size jj_resid_master = symm_info->chi_follows( jj_resid ) == 0 ? jj_resid : symm_info->chi_follows( jj_resid );
362 Size jj_master = jj == 0 ? resid_2_moltenres( jj_resid_master ) : jj;
364 if ( jj_master == 0 ) {
continue; }
367 if ( jj_master == ii ) {
continue; }
371 Size ii_master( ii ), ii_resid_master( ii_resid );
373 if ( jj_resid_master < ii_resid_master ) {
375 temp = ii_master; ii_master = jj_master; jj_master = temp;
376 temp = ii_resid_master; ii_resid_master =jj_resid_master; jj_resid_master = temp;
383 if ( ! ig->get_edge_exists( ii_master, jj_master ) ) {
384 ig->add_edge( ii_master, jj_master );
385 ig->note_short_range_interactions_exist_for_edge( ii_master, jj_master );
390 assert( ii_resid <= symm_info->num_independent_residues() || jj_resid <= symm_info->num_independent_residues() );
392 ig->set_residues_adjacent_for_subunit_pair_for_edge( ii_master, jj_master,
394 symm_info->subunit_index( (*uli)->get_second_node_ind() ));
403 lr_iter != lr_end; ++lr_iter ) {
405 if ( !lrec || lrec->empty() )
continue;
408 for (
uint ii = 1; ii <= nmoltenres(); ++ ii ) {
409 Size const ii_resid = moltenres_2_resid( ii );
412 rni = lrec->const_upper_neighbor_iterator_begin( ii_resid ),
413 rniend = lrec->const_upper_neighbor_iterator_end( ii_resid );
414 (*rni) != (*rniend); ++(*rni) ) {
416 Size jj_resid = rni->upper_neighbor_id();
417 Size jj = resid_2_moltenres( jj_resid );
424 if ( jj == 0 && symm_info->chi_follows( jj_resid ) == 0 ) {
continue; }
425 Size jj_resid_master = symm_info->chi_follows( jj_resid ) == 0 ? jj_resid : symm_info->chi_follows( jj_resid );
426 Size jj_master = jj == 0 ? resid_2_moltenres( jj_resid_master ) : jj;
428 if ( jj_master == 0 ) {
continue; }
431 if ( jj_master == ii ) {
continue; }
435 Size ii_master( ii ), ii_resid_master( ii_resid );
436 if ( jj_resid_master < ii_resid_master ) {
443 if ( ! ig->get_edge_exists( ii_master, jj_master ) ) {
444 ig->add_edge( ii_master, jj_master );
446 ig->note_long_range_interactions_exist_for_edge( ii_master, jj_master );
451 compute_proline_correction_energies_for_otf_graph( pose, symm_info, sfxn, packer_neighbor_graph, ig );
455 SymmetricRotamerSets::compute_proline_correction_energies_for_otf_graph(
463 using namespace conformation;
464 using namespace conformation::symmetry;
465 using namespace interaction_graph;
467 Size const nsubunits = symm_info->subunits();
473 for (
Size ii = 1; ii <= nsubunits; ++ii ) {
474 example_gly_rotamers[ ii ].resize( nmoltenres() );
475 example_pro_rotamers[ ii ].resize( nmoltenres() );
479 for (
Size ii = 1; ii <= nmoltenres(); ++ii ) {
480 RotamerSetCOP ii_rotset = rotamer_set_for_moltenresidue( ii );
482 Size potential_gly_replacement( 0 );
483 for (
Size jj = 1, jje = ii_rotset->get_n_residue_types(); jj <= jje; ++jj ) {
484 ResidueCOP jj_rotamer = ii_rotset->rotamer( ii_rotset->get_residue_type_begin( jj ) );
486 example_gly_rotamer_inds[ ii ] = ii_rotset->get_residue_type_begin( jj );
488 example_pro_rotamer_inds[ ii ] = ii_rotset->get_residue_type_begin( jj );
489 }
else if ( jj_rotamer->is_protein() ) {
490 potential_gly_replacement = ii_rotset->get_residue_type_begin( jj );
495 if ( example_gly_rotamer_inds[ ii ] == 0 ) {
496 example_gly_rotamer_inds[ ii ] = potential_gly_replacement;
499 for (
Size jj = 1; jj <= nsubunits; ++jj ) {
500 if ( example_pro_rotamer_inds[ ii ] != 0 ) {
501 example_pro_rotamers[ jj ][ ii ] = otfig->get_on_the_fly_node( ii )->get_rotamer( example_pro_rotamer_inds[ ii ], jj ).clone();
503 if ( example_gly_rotamer_inds[ ii ] != 0 ) {
504 example_gly_rotamers[ jj ][ ii ] = otfig->get_on_the_fly_node( ii )->get_rotamer( example_gly_rotamer_inds[ ii ], jj ).clone();
510 for (
Size ii = 1; ii <= nmoltenres(); ++ ii ) {
511 Size const ii_resid = moltenres_2_resid( ii );
512 if ( ! otfig->distinguish_backbone_and_sidechain_for_node( ii ) )
continue;
514 uli = packer_neighbor_graph->get_node( ii_resid )->const_upper_edge_list_begin(),
515 ulie = packer_neighbor_graph->get_node( ii_resid )->const_upper_edge_list_end();
516 uli != ulie; ++uli ) {
517 Size jj_resid = (*uli)->get_second_node_ind();
518 Size jj = resid_2_moltenres( jj_resid );
519 if ( jj == 0 && symm_info->chi_follows( jj_resid ) == 0 )
continue;
520 Size jj_resid_master = symm_info->chi_follows( jj_resid ) == 0 ? jj_resid : symm_info->chi_follows( jj_resid );
521 Size jj_master = jj == 0 ? resid_2_moltenres( jj_resid_master ) : jj;
522 if ( jj_master == 0 )
continue;
523 if ( jj_master == ii )
continue;
524 if ( ! otfig->distinguish_backbone_and_sidechain_for_node( jj_master ) )
continue;
526 Size ii_master( ii ), ii_resid_master( ii_resid );
527 Size ii_subunit = 1;
Size jj_subunit = (jj_resid-1) / symm_info->num_independent_residues() + 1;
529 if ( jj_resid_master < ii_resid_master ) {
531 temp = ii_master; ii_master = jj_master; jj_master = temp;
532 temp = ii_resid_master; ii_resid_master =jj_resid_master; jj_resid_master = temp;
533 temp = ii_subunit; ii_subunit = jj_subunit; jj_subunit = temp;
539 RotamerSetCOP ii_rotset = rotamer_set_for_moltenresidue( ii_master );
540 RotamerSetCOP jj_rotset = rotamer_set_for_moltenresidue( jj_master );
542 Size const iijj_scale = symm_info->score_multiply( ii_resid, jj_resid );
543 if ( iijj_scale == 0 )
continue;
547 SymmOnTheFlyNode * iinode = otfig->get_on_the_fly_node( ii_master );
548 SymmOnTheFlyNode * jjnode = otfig->get_on_the_fly_node( jj_master );
550 for (
Size kk = 1; kk <= ii_rotset->num_rotamers(); ++kk ) {
554 if ( example_gly_rotamer_inds[ jj_master ] != 0 ) {
555 bb_bbnonproE *= get_bb_bbE( pose, scfxn, iinode->get_rotamer( kk, ii_subunit ), *example_gly_rotamers[ jj_subunit ][ jj_master ] );
556 sc_npbb_energy *= get_sc_bbE( pose, scfxn, iinode->get_rotamer( kk, ii_subunit ), *example_gly_rotamers[ jj_subunit ][ jj_master ] );
558 bb_bbnonproE = sc_npbb_energy = 0;
561 if ( example_pro_rotamer_inds[ jj_master ] != 0 ) {
562 bb_bbproE *= get_bb_bbE( pose, scfxn, iinode->get_rotamer( kk, ii_subunit ), *example_pro_rotamers[ jj_subunit ][ jj_master ] );
563 sc_probb_energy *= get_sc_bbE( pose, scfxn, iinode->get_rotamer( kk, ii_subunit ), *example_pro_rotamers[ jj_subunit ][ jj_master ] );
565 bb_bbproE = sc_probb_energy = 0;
568 otfig->add_to_one_body_energy_for_node_state( ii_master, kk, sc_npbb_energy + 0.5 * bb_bbnonproE );
569 otfig->add_ProCorrection_values_for_edge( ii_master, jj_master, ii_master, kk,
570 bb_bbnonproE, bb_bbproE, sc_npbb_energy, sc_probb_energy );
573 for (
Size kk = 1; kk <= jj_rotset->num_rotamers(); ++kk ) {
577 if ( example_gly_rotamer_inds[ ii_master ] != 0 ) {
578 bb_bbnonproE *= get_bb_bbE( pose, scfxn, jjnode->get_rotamer( kk, jj_subunit ), *example_gly_rotamers[ ii_subunit ][ ii_master ] );
579 sc_npbb_energy *= get_sc_bbE( pose, scfxn, jjnode->get_rotamer( kk, jj_subunit ), *example_gly_rotamers[ ii_subunit ][ ii_master ] );
581 bb_bbnonproE = sc_npbb_energy = 0;
584 if ( example_pro_rotamer_inds[ ii_master ] != 0 ) {
585 bb_bbproE *= get_bb_bbE( pose, scfxn, jjnode->get_rotamer( kk, jj_subunit ), *example_pro_rotamers[ ii_subunit ][ ii_master ] );
586 sc_probb_energy *= get_sc_bbE( pose, scfxn, jjnode->get_rotamer( kk, jj_subunit ), *example_pro_rotamers[ ii_subunit ][ ii_master ] );
588 bb_bbproE = sc_probb_energy = 0;
591 otfig->add_to_one_body_energy_for_node_state( jj_master, kk, sc_npbb_energy + 0.5 * bb_bbnonproE );
593 otfig->add_ProCorrection_values_for_edge( ii_master, jj_master, jj_master, kk,
594 bb_bbnonproE, bb_bbproE, sc_npbb_energy, sc_probb_energy );
603 SymmetricRotamerSets::orient_rotamer_set_to_symmetric_partner(
613 sym_rotamer_set->set_resid(sympos);
614 for (Rotamers::const_iterator
615 rot = rotset_in->begin(),
616 rot_end = rotset_in->end();
619 target_rsd->orient_onto_residue( pose.
residue( sympos ) );
620 sym_rotamer_set->add_rotamer( *target_rsd );
622 return sym_rotamer_set;
627 SymmetricRotamerSets::final_visit_to_edge(
636 dynamic_cast<SymmetricConformation const &> ( pose.
conformation()) );
640 uint jj_highest(jj_resid);
641 for ( std::vector< Size>::const_iterator
642 clone = symm_info->chi_clones( jj_resid ).begin(),
643 clone_end = symm_info->chi_clones( jj_resid ).end();
645 if ( *
clone > jj_highest &&
646 packer_neighbor_graph->get_edge_exists(ii_resid, *
clone) )
650 uint ii_highest(ii_resid);
651 for ( std::vector< Size>::const_iterator
652 clone = symm_info->chi_clones( ii_resid ).begin(),
653 clone_end = symm_info->chi_clones( ii_resid ).end();
655 if ( *
clone > ii_highest &&
656 packer_neighbor_graph->get_edge_exists(*
clone, jj_resid) )
659 if ( ii_resid == ii_highest && jj_resid == jj_highest )
return true;