33 #include <basic/Tracer.hh>
71 #include <utility/vector1.hh>
76 namespace rotamer_set {
78 static basic::Tracer
tt(
"core.pack.rotamer_set.RotamerSet_",basic::t_info );
82 n_residue_types_( 0 ),
83 n_residue_groups_( 0 ),
85 id_for_current_rotamer_( 0 ),
86 rotamer_offsets_require_update_( false )
96 bool use_neighbor_context
99 using namespace chemical;
104 allowed_iter != allowed_end; ++allowed_iter ) {
110 tt <<
"[ WARNING ] including current in order to get at least 1 rotamer !!!!!! " <<
resid() <<
' ' <<
121 rotsetop_iter != rotsetop_end; ++rotsetop_iter ) {
122 (*rotsetop_iter)->alter_rotamer_set( pose, scorefxn, the_task, packer_neighbor_graph, *
this );
220 bool use_neighbor_context
225 pose, scorefxn, task, concrete_residue, existing_residue,
226 packer_neighbor_graph, use_neighbor_context );
237 bool use_neighbor_context
240 using namespace conformation;
241 using namespace pack::task;
250 }
else if ( concrete_residue->is_DNA() ) {
262 new_rotamers.push_back( rot );
266 for (
Size ii=1; ii<= new_rotamers.size(); ++ii ) {
267 assert( new_rotamers[ii]->seqpos() ==
resid() && new_rotamers[ii]->chain() == existing_residue.
chain() );
271 }
else if ( concrete_residue->is_RNA() ) {
278 for (
Size ii=1; ii<= new_rotamers.size(); ++ii ) {
283 }
else if ( concrete_residue->name() ==
"VRT1" ) {
285 tt <<
"building VRT1 residue at " <<
resid() <<
' ' << existing_residue.
name() <<
"position\n";
286 if ( existing_residue.
name() == concrete_residue->name() ) {
294 rot->seqpos( existing_residue.
seqpos() );
295 rot->chain ( existing_residue.
chain() );
299 }
else if ( concrete_residue->name() ==
"TP3" ) {
306 for (
Size ii=1; ii<= new_rotamers.size(); ++ii ) {
307 new_rotamers[ii]->seqpos(
resid() );
308 new_rotamers[ii]->chain( existing_residue.
chain() );
323 if ( use_neighbor_context ) {
328 for (
Size ii = 1; ii <= concrete_residue->nchi(); ++ii ) {
331 concrete_residue, extra_chi_steps[ ii ] );
341 rotlib->fill_rotamer_vector( pose, scorefxn, task, packer_neighbor_graph, concrete_residue, existing_residue, extra_chi_steps, buried, suggested_rotamers);
345 if ( concrete_residue->n_proton_chi() != 0 ) {
348 for (
Size ii = 1; ii <= concrete_residue->n_proton_chi(); ++ii ) {
352 concrete_residue->proton_chi_2_chi( ii ),
355 ii, proton_chi_chisets);
357 suggested_rotamers.reserve( proton_chi_chisets.size() );
358 for (
Size ii = 1; ii <= proton_chi_chisets.size(); ++ii ) {
359 suggested_rotamers.push_back( existing_residue.
clone() );
360 for (
Size jj = 1; jj <= concrete_residue->n_proton_chi(); ++jj ) {
361 Size jj_protchi = concrete_residue->proton_chi_2_chi( jj );
362 suggested_rotamers[ ii ]->set_chi(
364 proton_chi_chisets[ ii ]->chi[ jj_protchi ] );
376 for (
Size ii = 1; ii <= suggested_rotamers.size(); ++ii ) {
388 switch ( decision ) {
414 }
else if ( suggested_rotamers.size() == 0 && concrete_residue->nchi() == 0 ) {
435 using namespace chemical;
436 using namespace conformation;
448 concrete_residue->aa() ==
aa_his ||
449 concrete_residue->aa() ==
aa_asn ||
450 concrete_residue->aa() ==
aa_gln ) ) {
460 example_rotamer->seqpos( existing_residue.
seqpos() );
462 if ( example_rotamer->has( existing_residue.
atom_name( ii ) ) ) {
463 example_rotamer->set_xyz(
464 example_rotamer->atom_index( existing_residue.
atom_name( ii ) ),
465 existing_residue.
xyz( ii ) );
470 example_rotamer->copy_residue_connections( pose.
residue(
resid() ) );
474 ResidueOP flipped_rotamer = example_rotamer->clone();
475 Real flipped_chi2 = flipped_rotamer->chi(2) + 180;
476 flipped_rotamer->set_chi( 2, flipped_chi2 );
483 Size chi_to_flip( 0 );
484 switch ( concrete_residue->aa() ) {
493 utility_exit_with_message(
"Illegal case statement option.");
499 Real flipped_chi2 = flipped_rotamer->chi( chi_to_flip ) + 180;
500 flipped_rotamer->set_chi( chi_to_flip, flipped_chi2 );
504 }
else if ( concrete_residue->is_NA() ) {
514 example_rotamer->seqpos( existing_residue.
seqpos() );
516 if ( example_rotamer->has( existing_residue.
atom_name( ii ) ) ) {
517 example_rotamer->set_xyz(
518 example_rotamer->atom_index( existing_residue.
atom_name( ii ) ),
519 existing_residue.
xyz( ii ) );
524 example_rotamer->copy_residue_connections( pose.
residue(
resid() ) );
534 if ( concrete_residue->n_proton_chi() != 0 ) {
536 proton_chi_chisets.push_back(
538 for (
Size ii = 1; ii <= concrete_residue->n_proton_chi(); ++ii ) {
542 concrete_residue->proton_chi_2_chi( ii ),
545 ii, proton_chi_chisets);
547 suggested_rotamers.reserve( proton_chi_chisets.size() );
548 for (
Size ii = 1; ii <= proton_chi_chisets.size(); ++ii ) {
549 suggested_rotamers.push_back( existing_residue.
clone() );
550 for (
Size jj = 1; jj <= concrete_residue->n_proton_chi(); ++jj ) {
551 Size jj_protchi = concrete_residue->proton_chi_2_chi( jj );
552 suggested_rotamers[ ii ]->set_chi(
554 proton_chi_chisets[ ii ]->chi[ jj_protchi ] );
557 for (
Size ii = 1; ii <= suggested_rotamers.size(); ++ii ) {
573 int num_10A_neighbors,
579 using namespace task;
585 extra_chi_steps.push_back(1);
586 extra_chi_steps.push_back(-1);
589 extra_chi_steps.push_back(0.5);
590 extra_chi_steps.push_back(-0.5);
593 extra_chi_steps.push_back(1);
594 extra_chi_steps.push_back(2);
595 extra_chi_steps.push_back(-1);
596 extra_chi_steps.push_back(-2);
599 extra_chi_steps.push_back(0.5);
600 extra_chi_steps.push_back(1);
601 extra_chi_steps.push_back(-0.5);
602 extra_chi_steps.push_back(-1);
605 extra_chi_steps.push_back(0.5);
606 extra_chi_steps.push_back(1);
607 extra_chi_steps.push_back(1.5);
608 extra_chi_steps.push_back(2.0);
609 extra_chi_steps.push_back(-0.5);
610 extra_chi_steps.push_back(-1);
611 extra_chi_steps.push_back(-1.5);
612 extra_chi_steps.push_back(-2);
615 extra_chi_steps.push_back(0.33);
616 extra_chi_steps.push_back(0.67);
617 extra_chi_steps.push_back(1);
618 extra_chi_steps.push_back(-0.33);
619 extra_chi_steps.push_back(-0.67);
620 extra_chi_steps.push_back(-1);
623 extra_chi_steps.push_back(0.25);
624 extra_chi_steps.push_back(0.5);
625 extra_chi_steps.push_back(0.75);
626 extra_chi_steps.push_back(1);
627 extra_chi_steps.push_back(1.25);
628 extra_chi_steps.push_back(1.5);
629 extra_chi_steps.push_back(-0.25);
630 extra_chi_steps.push_back(-0.5);
631 extra_chi_steps.push_back(-0.75);
632 extra_chi_steps.push_back(-1);
633 extra_chi_steps.push_back(-1.25);
634 extra_chi_steps.push_back(-1.5);
638 std::cerr <<
"Error in RotamerSet_::set_extrachi_samples, invalid ExtraChiSample type" <<
'\n';
660 using namespace conformation;
661 using namespace scoring;
668 for (
int ii = 1; ii <= nrotamers; ++ii ) {
678 ir = packer_neighbor_graph->get_node( theresid )->const_edge_list_begin(),
679 ire = packer_neighbor_graph->get_node( theresid )->const_edge_list_end();
682 int const neighbor_id( (*ir)->get_other_ind( theresid ) );
697 lr_iter != lr_end; ++lr_iter ) {
699 if ( !lrec || lrec->empty() )
continue;
703 rni = lrec->const_neighbor_iterator_begin( theresid ),
704 rniend = lrec->const_neighbor_iterator_end( theresid );
705 (*rni) != (*rniend); ++(*rni) ) {
706 Size const neighbor_id = rni->neighbor_id();
707 assert( neighbor_id != theresid );
710 (*lr_iter)->evaluate_rotamer_background_energies(
711 *
this, pose.
residue( neighbor_id ), pose, sf,
731 using namespace conformation;
732 using namespace scoring;
736 std::fill( energies.begin(), energies.end(), default_map_of_zeroes );
742 Real last_computed_surfaceE = 0.0;
745 num_neighbors_.resize( pose.
n_residue(), 0 );
751 for (
int ii = 1; ii <= nrotamers; ++ii ) {
766 if ( surface_weight ) {
768 emap[
surface ] = last_computed_surfaceE;
771 last_computed_surfaceE = emap[
surface ];
776 energies[ii] += emap;
780 ir = packer_neighbor_graph->get_node( theresid )->const_edge_list_begin(),
781 ire = packer_neighbor_graph->get_node( theresid )->const_edge_list_end();
783 int const neighbor_id( (*ir)->get_other_ind( theresid ) );
790 energies[ii] += emap2b;
794 energies[ii] += emap2b;
805 lr_iter != lr_end; ++lr_iter ) {
809 if ( !lrec || lrec->empty() )
continue;
813 rniend = lrec->const_neighbor_iterator_end( theresid );
814 (*rni) != (*rniend); ++(*rni) ) {
816 Size const neighbor_id = rni->neighbor_id();
818 if( theresid == neighbor_id )
continue;
820 (*lr_iter)->evaluate_rotamer_background_energy_maps(
821 *
this, pose.
residue( neighbor_id ), pose, sf, sf.
weights(), energies );
881 Size count_copy( 1 );
883 if ( ii != rot_id ) {
884 copy_rotamers[ count_copy ] =
rotamers_[ ii ];
906 assert( rotamers_to_delete.size() ==
rotamers_.size() );
910 if ( rotamers_to_delete[ ii ] ) {
919 if ( n_dropped == 0 )
return;
923 utility_exit_with_message(
"ERROR:: RotamerSet_::drop_rotamers attempted to remove all rotamers without available input_rotamer." );
935 new_rotamers[ count_new ] =
rotamers_[ ii ];
959 for (
Size ii = 1; ii <= rotamer_indices_to_delete.size(); ++ii ) {
960 rotamers_to_delete[ rotamer_indices_to_delete[ ii ] ] =
true;
976 using namespace scoring;
977 using namespace conformation;
982 ir = packer_neighbor_graph->get_node(
resid() )->const_edge_list_begin(),
983 ire = packer_neighbor_graph->get_node(
resid() )->const_edge_list_end();
985 int const neighbor_id( (*ir)->get_other_ind(
resid() ) );
1021 return & rt1 != & rt2;
1070 using namespace chemical;
1075 allowed_iter != allowed_end; ++allowed_iter ) {
1077 existing_residue, *allowed_iter, packer_neighbor_graph);
1092 using namespace conformation;
1093 using namespace pack::task;
1097 if ( concrete_residue->name() !=
"TP3" )
return;
1099 if ( concrete_residue->name() ==
"TP3" ) {
1105 rotamer_sets,
resid(), *concrete_residue,
1106 task, pose, packer_neighbor_graph,
1109 if ( new_rotamers.empty() )
return;
1113 for (
Size ii=1; ii<= new_rotamers.size(); ++ii ) {
1114 new_rotamers[ii]->seqpos(
resid() );
1115 new_rotamers[ii]->chain( existing_residue.
chain() );
1120 utility_exit_with_message(
"unsupported restype for dependent rotamer building: "+concrete_residue->name() );
1175 Size count_seen_residue_types( 1 );
1176 Size count_seen_residue_groups( 1 );
1184 ++count_seen_residue_types;
1189 ++count_seen_residue_groups;