34 #include <basic/options/option.hh>
37 #include <ObjexxFCL/FArray1D.hh>
38 #include <ObjexxFCL/string.functions.hh>
47 #include <numeric/trig.functions.hh>
48 #include <numeric/xyzMatrix.fwd.hh>
50 #include <basic/Tracer.hh>
63 #include <basic/options/keys/docking.OptionKeys.gen.hh>
64 #include <basic/options/keys/matdes.OptionKeys.gen.hh>
66 #include <utility/vector1.hh>
75 using namespace ObjexxFCL;
77 static basic::Tracer
TR(
"core.conformation.Interface");
100 partner_ = false_array;
101 is_interface_ = false_array;
109 symmetric_protein_calculate( pose );
114 if( !use_input_partners_ )
115 fold_tree.partition_by_jump( jump_number_, partner_ );
119 Size upstream_jump_res, downstream_jump_res;
120 upstream_jump_res = fold_tree.upstream_jump_residue( jump_number_ );
121 downstream_jump_res = fold_tree.downstream_jump_residue( jump_number_ );
123 TR.Debug <<
"One of the residues is a ligand, calculating the interface between ligand and protein" << std::endl;
124 ligand_calculate( pose );
128 TR.Debug <<
"One of the residues is a nucleic acid, calculating interface of nucleic acids" << std::endl;
129 NA_calculate( pose );
135 TR.Debug <<
"Calculating protein-protein interface" << std::endl;
136 protein_calculate( pose );
165 using namespace core;
166 using namespace conformation;
169 std::vector< int>::iterator new_end_pos;
171 for (
Size i=1; i<=
Size(energy_graph.num_nodes()); ++i ) {
173 iru = energy_graph.get_node(i)->const_upper_edge_list_begin(),
175 iru != irue; ++iru ) {
178 if ( partner_(i) == partner_(j) )
continue;
181 if ( cendist < distance_squared_ ) {
183 is_interface_(i) = is_interface_(j) =
true;
184 pair_list_[1].push_back(i);
185 pair_list_[2].push_back(j);
187 contact_list_[i].push_back(j);
188 contact_list_[j].push_back(i);
194 std::sort( pair_list_[1].begin(), pair_list_[1].
end() );
195 new_end_pos = std::unique( pair_list_[1].begin(), pair_list_[1].
end() );
196 pair_list_[1].erase( new_end_pos, pair_list_[1].
end() );
197 std::sort( pair_list_[2].begin(), pair_list_[2].
end() );
198 new_end_pos = std::unique( pair_list_[2].begin(), pair_list_[2].
end() );
199 pair_list_[2].erase( new_end_pos, pair_list_[2].
end() );
218 Interface::ligand_calculate(
223 using namespace core;
226 if ( ! partner_(i) ) {
227 is_interface_(i) =
true;
233 if ( partner_(j) )
continue;
236 double dist2 = lig_rsd.
xyz(k).distance_squared( prot_rsd.
xyz(prot_rsd.
nbr_atom()) );
238 if ( dist2 <= cutoff * cutoff ) {
239 is_interface_(i) =
true;
241 contact_list_[i].push_back(j);
242 contact_list_[j].push_back(i);
243 goto END_LIGRES_LOOP;
257 using namespace core;
258 using namespace conformation;
261 Real min_distance (1000000.0);
264 if ( partner_(src_rsd) == partner_(i) )
continue;
266 if ( cendist < min_distance ) {
268 min_distance = cendist;
271 distance = min_distance;
290 TR <<
"Interface residues:" << std::endl;
294 TR <<
"Site " << i << std::endl;
295 for (
Size j=1; j<= pair_list_[i].size(); ++j ) {
297 TR <<
" " << rsd.
aa() <<
' ' << rsd.
seqpos() << std::endl;
298 selection += string_of(rsd.
seqpos()) +
'+';
300 if (pair_list_[i].
size() > 0) {
301 TR <<
" sele interface" << i <<
", resi " << selection << std::endl;
303 if ( i==1 ) selection.clear();
328 using namespace basic::options;
329 using namespace basic::options::OptionKeys;
334 task->restrict_to_repacking();
339 task->nonconst_residue_task( ii ).prevent_repacking();
345 if ( option[ docking::norepack1 ]() ) {
346 for (
Size ii = 1 ; ii <= cutpoint; ++ii ) {
347 task->nonconst_residue_task( ii ).prevent_repacking();
350 if ( option[ docking::norepack2 ]() ) {
352 task->nonconst_residue_task( ii ).prevent_repacking();
357 task->or_include_current(
true );
370 using namespace core;
371 using namespace core::conformation;
373 bool is_pair =
false;
375 for(
Size i = 1; i <= contact_list_[rsd1.
seqpos()].size(); i++){
376 if (rsd2.
seqpos() == contact_list_[rsd1.
seqpos()][i]) is_pair =
true;
412 std::vector < bool > interface ( pose.
total_residue(), false );
413 using namespace core;
420 if ( interface[i] ) {
437 bool Interface::is_interface(
Size const position )
const {
return is_interface_(position); }
439 void Interface::jump(
Size const jump_num ) { jump_number_ = jump_num; }
445 for (
Size i=1; i<=is_interface_.size();i++){
446 if (is_interface_(i)) nres++;
456 using namespace core;
457 using namespace conformation;
458 using namespace conformation::symmetry;
461 dynamic_cast<SymmetricConformation const &> ( pose.
conformation()) );
464 ( dynamic_cast< core::scoring::symmetry::SymmetricEnergies const & > ( pose.
energies() ) );
468 if ( symm_info->bb_is_independent(i) ) {
472 std::vector< int>::iterator new_end_pos;
478 iru != irue; ++iru ) {
482 if (basic::options::option[basic::options::OptionKeys::matdes::num_subs_building_block].user()) {
483 Size num_subs = basic::options::option[basic::options::OptionKeys::matdes::num_subs_building_block]();
484 symm_add = (symm_info->subunit_index(i) <= num_subs && symm_info->subunit_index(j) > num_subs) || (symm_info->subunit_index(j) <= num_subs && symm_info->subunit_index(i) > num_subs);
486 symm_add = ( ( (symm_info->bb_is_independent(i) && !symm_info->bb_is_independent(j)) ||
487 (symm_info->bb_is_independent(i) && !symm_info->bb_is_independent(j)) ) );
489 if ( !symm_add )
continue;
494 if ( cendist < distance_squared_ ) {
496 is_interface_(i_sym) = is_interface_(j_sym) =
true;
497 pair_list_[1].push_back(i_sym);
498 pair_list_[2].push_back(j_sym);
500 contact_list_[i_sym].push_back(j_sym);
501 contact_list_[j_sym].push_back(i_sym);
508 std::sort( pair_list_[1].begin(), pair_list_[1].
end() );
509 new_end_pos = std::unique( pair_list_[1].begin(), pair_list_[1].
end() );
510 pair_list_[1].erase( new_end_pos, pair_list_[1].
end() );
511 std::sort( pair_list_[2].begin(), pair_list_[2].
end() );
512 new_end_pos = std::unique( pair_list_[2].begin(), pair_list_[2].
end() );
513 pair_list_[2].erase( new_end_pos, pair_list_[2].
end() );
517 Interface::set_symmetric_pack(
522 set_pack( pose, task );
523 using namespace core::conformation::symmetry;
526 dynamic_cast<SymmetricConformation const &> ( pose.
conformation()) );
530 if ( !symm_info->chi_is_independent(i) ) {
531 task->nonconst_residue_task( i ).prevent_repacking();