Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
InterfaceBuilder.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file core/pack/task/ResfileReader.cc
11 /// @brief implementation of resfile reader and its command classes
12 /// @author Gordon Lemmon (glemmon@gmail.com)
13 ///
14 
15 // Project Headers
16 #include <core/pose/Pose.hh>
18 #include <core/types.hh>
19 #include <basic/Tracer.hh>
20 
21 // Unit Headers
25 #include <core/pose/util.hh>
26 
27 // Utility headers
28 #include <utility/tag/Tag.hh>
29 #include <utility/string_util.hh>
30 
31 // Boost Headers
32 #include <boost/foreach.hpp>
33 
35 #include <utility/vector0.hh>
36 #include <utility/excn/Exceptions.hh>
37 #include <utility/vector1.hh>
38 
39 #define foreach BOOST_FOREACH
40 
41 namespace protocols {
42 namespace ligand_docking {
43 
44 static basic::Tracer interface_builder_tracer("protocols.ligand_docking.ligand_options.InterfaceBuilder", basic::t_debug);
45 
47  ReferenceCount(),
48  ligand_areas_(),
49  extension_window_(0)
50 {}
51 
53  ReferenceCount(),
54  ligand_areas_(that.ligand_areas_),
55  extension_window_(that.extension_window_)
56 {}
57 
59 
60 //@brief parse XML (specifically in the context of the parser/scripting scheme)
61 void
63  utility::tag::TagPtr const tag,
65 ){
66  if ( tag->hasOption("extension_window") ){
67  extension_window_= tag->getOption<core::Size>("extension_window");
68  }
69  if (! tag->hasOption("ligand_areas")) throw utility::excn::EXCN_RosettaScriptsOption("InterfaceBuilders need at least one ligand area to build around");
70 
71  std::string ligand_areas_string= tag->getOption<std::string>("ligand_areas");
72  utility::vector1<std::string> ligand_area_strings= utility::string_split(ligand_areas_string, ',');
73 
74  foreach(std::string ligand_area_string, ligand_area_strings){
75  LigandAreaOP ligand_area = datamap.get< protocols::ligand_docking::LigandArea * >( "ligand_areas", ligand_area_string);
76  ligand_areas_[ ligand_area->chain_ ] = ligand_area;
77  }
78 }
79 
81  ligand_options::Interface interface( pose.total_residue(), ligand_options::InterfaceInfo() ); // init all positions to false
82  find_interface_residues(interface, pose);
83  if (extension_window_ > 0) enforce_minimum_length(interface, pose);
84  interface_builder_tracer.Debug<< "built interface: "<< interface<< std::endl;
85  return interface;
86 }
87 
89  ligand_options::Interface & interface,
90  core::pose::Pose const & pose
91 )const{
92  LigandAreas::const_iterator ligand_area= ligand_areas_.begin();
93  for(; ligand_area != ligand_areas_.end(); ++ligand_area){
94  char const & chain= ligand_area->first;
96  foreach(core::Size chain_id, chain_ids){
97  core::Size ligand_residue_id= pose.conformation().chain_begin(chain_id);
98  core::Size const & end= pose.conformation().chain_end(chain_id);
99  for(; ligand_residue_id <= end; ++ligand_residue_id){
100  interface[ligand_residue_id].type= ligand_options::InterfaceInfo::is_interface;
101  interface[ligand_residue_id].chain_id= chain_id;
102  interface[ligand_residue_id].chain= chain;
103  find_protein_residues(interface, ligand_residue_id, pose);
104  }
105  }
106  }
107  interface_builder_tracer.Debug << "interface: " << interface << std::endl;
108 }
109 
110 // First call "find_ligand_residues"
112  ligand_options::Interface & interface,
113  core::Size ligand_residue_id,
114  core::pose::Pose const & pose
115 )const{
116  for(core::Size i = 1, i_end = pose.total_residue(); i <= i_end; ++i) {
117  if(pose.residue(i).is_protein() &&
118  interface[i].type != ligand_options::InterfaceInfo::is_interface){
119  set_interface_residue(interface, i, ligand_residue_id, pose);
120  }
121  }
122 }
123 
125  ligand_options::Interface & interface,
126  core::Size const potential_interface_residue_id,
127  core::Size const ligand_interface_residue_id,
128  core::pose::Pose const & pose
129 )const{
130  core::conformation::Residue const & potential_interface_residue = pose.residue(potential_interface_residue_id);
131  core::conformation::Residue const & ligand_residue = pose.residue(ligand_interface_residue_id);
132 
133  core::Size const & chain_id= interface[ligand_interface_residue_id].chain_id;
134  core::Size const & chain= interface[ligand_interface_residue_id].chain;
135 
136  if( is_interface_residue(potential_interface_residue, ligand_residue, chain)){
137  interface[potential_interface_residue_id].type= ligand_options::InterfaceInfo::is_interface;
138  interface[potential_interface_residue_id].chain_id= chain_id;
139  interface[potential_interface_residue_id].chain= chain;
140  }
141 }
142 
144  core::conformation::Residue const & potential_interface_residue,
145  core::conformation::Residue const & ligand_interface_residue,
146  char const chain
147 )const {
148  core::Size const potential_interface_neighbor_atom_id= potential_interface_residue.nbr_atom();
149  core::Vector const potential_interface_vector= potential_interface_residue.xyz(potential_interface_neighbor_atom_id);
150 
151  LigandAreas::const_iterator found= ligand_areas_.find(chain);
152  assert(found != ligand_areas_.end());
153  LigandAreaOP const ligand_area = found->second;
154 
155  double cutoff = ligand_area->add_nbr_radius_ ?
156  potential_interface_residue.nbr_radius() + ligand_area->cutoff_ :
157  ligand_area->cutoff_;
158 
159  if (ligand_area->all_atom_mode_){
160  return ligand_options::check_all_ligand_atoms(ligand_interface_residue, potential_interface_vector, cutoff);
161  }
162  else{
163  return ligand_options::check_neighbor_ligand_atom(ligand_interface_residue, potential_interface_vector, cutoff);
164  }
165 }
166 
168  ligand_options::Interface & interface,
169  core::pose::Pose const & pose
170 ) const{
171  for(core::Size chain_id=1; chain_id <= pose.conformation().num_chains(); ++chain_id){
172  core::Size start= pose.conformation().chain_begin(chain_id);
173  core::Size end= pose.conformation().chain_end(chain_id);
174  if(pose.residue(start).is_polymer()){ // because ligand residues don't know about terminus
175  interface.enforce_minimum_length(start, end, extension_window_);
176  }
177  }
178 }
179 
182  return ligand_areas_;
183 }
184 
185 } //namespace ligand_docking
186 } //namespace protocols