Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
PairFeatures.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 protocols/features/PairFeatures.cc
11 /// @brief report orbital geometry and scores to features statistics scientific benchmark
12 /// @author Matthew O'Meara (mattjomeara@gmail.com)
13 
14 // Unit Headers
16 
17 // Project Headers
21 #include <core/graph/Graph.hh>
22 #include <core/pose/Pose.hh>
24 #include <core/scoring/Energies.hh>
25 #include <core/types.hh>
26 #include <utility/sql_database/DatabaseSessionManager.hh>
27 #include <utility/vector1.hh>
28 #include <basic/database/sql_utils.hh>
29 
30 #include <basic/database/schema_generator/PrimaryKey.hh>
31 #include <basic/database/schema_generator/ForeignKey.hh>
32 #include <basic/database/schema_generator/Column.hh>
33 #include <basic/database/schema_generator/Schema.hh>
34 #include <basic/database/schema_generator/Constraint.hh>
35 // Numeric Headers
36 #include <numeric/xyzVector.hh>
37 
38 // External Headers
39 #include <cppdb/frontend.h>
40 #include <boost/uuid/uuid_io.hpp>
41 
42 namespace protocols{
43 namespace features{
44 
45 using std::string;
47 using core::pose::Pose;
48 using core::Size;
49 using core::Distance;
50 using core::Vector;
51 using core::graph::Graph;
54 using utility::vector1;
55 using utility::sql_database::sessionOP;
56 using cppdb::statement;
57 
59 
62 {}
63 
65 
66 string
67 PairFeatures::type_name() const { return "PairFeatures"; }
68 
69 void
71  sessionOP db_session
72 ) const {
74 }
75 
76 void
78  sessionOP db_session
79 ) const {
80  using namespace basic::database::schema_generator;
81 
82  Column struct_id("struct_id", new DbUUID());
83  Column resNum1("resNum1", new DbInteger());
84  Column resNum2("resNum2", new DbInteger());
85  Column res1_10A_neighbors("res1_10A_neighbors", new DbInteger());
86  Column res2_10A_neighbors("res2_10A_neighbors", new DbInteger());
87  Column actcoord_dist("actcoord_dist", new DbReal());
88  Column polymeric_sequence_dist("polymeric_sequence_dist", new DbInteger());
89 
90  Columns primary_key_columns;
91  primary_key_columns.push_back(struct_id);
92  primary_key_columns.push_back(resNum1);
93  primary_key_columns.push_back(resNum2);
94  PrimaryKey primary_key(primary_key_columns);
95 
96  Columns foreign_key_columns1;
97  foreign_key_columns1.push_back(struct_id);
98  foreign_key_columns1.push_back(resNum1);
99  vector1< std::string > reference_columns1;
100  reference_columns1.push_back("struct_id");
101  reference_columns1.push_back("resNum");
102  ForeignKey foreign_key1(foreign_key_columns1, "residues", reference_columns1, true);
103 
104  Columns foreign_key_columns2;
105  foreign_key_columns2.push_back(struct_id);
106  foreign_key_columns2.push_back(resNum2);
107  vector1< std::string > reference_columns2;
108  reference_columns2.push_back("struct_id");
109  reference_columns2.push_back("resNum");
110  ForeignKey foreign_key2(foreign_key_columns2, "residues", reference_columns2, true);
111 
112  GreaterThanConstraintOP res1_10A_neighbors_is_positive(
113  new GreaterThanConstraint(res1_10A_neighbors, 1.0));
114  GreaterThanConstraintOP res2_10A_neighbors_is_positive(
115  new GreaterThanConstraint(res2_10A_neighbors, 1.0));
116 
117  GreaterThanConstraintOP actcoord_dist_is_nonnegative(
118  new GreaterThanConstraint(actcoord_dist, 0));
119 
120  Schema table("residue_pairs", primary_key);
121  table.add_foreign_key(foreign_key1);
122  table.add_foreign_key(foreign_key2);
123  table.add_constraint(res1_10A_neighbors_is_positive);
124  table.add_constraint(res2_10A_neighbors_is_positive);
125  table.add_column(res1_10A_neighbors);
126  table.add_column(res2_10A_neighbors);
127  table.add_column(actcoord_dist);
128  table.add_column(polymeric_sequence_dist);
129 
130  table.write(db_session);
131 }
132 
133 
136  utility::vector1<std::string> dependencies;
137  dependencies.push_back("ResidueFeatures");
138  return dependencies;
139 }
140 
141 
142 Size
144  Pose const & pose,
145  vector1< bool > const & relevant_residues,
146  boost::uuids::uuid const struct_id,
147  sessionOP db_session
148 ){
149  report_residue_pairs(pose, relevant_residues, struct_id, db_session);
150  return 0;
151 }
152 
153 void
155  Pose const & pose,
156  vector1< bool > const & relevant_residues,
157  boost::uuids::uuid const struct_id,
158  sessionOP db_session
159 ){
160 
161  // assert pose.update_residue_neighbors() has been called:
162  runtime_assert(
163  !pose.conformation().structure_moved() &&
165 
166  // I would like to assert that the actcoords are up to date but that
167  // isn't currently possible.
168  //pose.update_actcoords();
169 
170  TenANeighborGraph const & tenA( pose.energies().tenA_neighbor_graph() );
171 
172  std::string statement_string = "INSERT INTO residue_pairs (struct_id, resNum1, resNum2, res1_10A_neighbors, res2_10A_neighbors, actcoord_dist, polymeric_sequence_dist) VALUES (?,?,?,?,?,?,?);";
173  statement stmt(basic::database::safely_prepare_statement(statement_string,db_session));
174 
175  for(Size resNum1=1; resNum1 <= pose.total_residue(); ++resNum1){
176  if(!relevant_residues[resNum1]) continue;
177  Residue const & res1( pose.residue(resNum1) );
178 
179  Size res1_10A_neighbors(
180  tenA.get_node(resNum1)->num_neighbors_counting_self_static());
181 
182  // TODO: just iterate over the neighbors of res1
183  for(Size resNum2=resNum1+1; resNum2 <= pose.total_residue(); ++resNum2){
184  if(!relevant_residues[resNum2]) continue;
185  Residue const & res2( pose.residue(resNum2) );
186 
187  Distance const actcoord_dist( res1.actcoord().distance( res2.actcoord() ) );
188 
189  if( actcoord_dist > 10 ) continue;
190 
191  Size res2_10A_neighbors(
192  tenA.get_node(resNum2)->num_neighbors_counting_self_static());
193 
194  int polymeric_sequence_dist(res1.polymeric_sequence_distance(res2));
195 
196  stmt.bind(1,struct_id);
197  stmt.bind(2,resNum1);
198  stmt.bind(3,resNum2);
199  stmt.bind(4,res1_10A_neighbors);
200  stmt.bind(5,res2_10A_neighbors);
201  stmt.bind(6,actcoord_dist);
202  stmt.bind(7,polymeric_sequence_dist);
203  basic::database::safely_write_to_database(stmt);
204  }
205  }
206 }
207 
208 } // namesapce
209 } // namespace