Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
UnrecognizedAtomFeatures.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/UnrecognizedAtomFeatures.cc
11 /// @brief report unrecognized atoms features to features Statistics Scientific Benchmark
12 /// @author Matthew O'Meara
13 
14 // Unit Headers
16 
17 //External
18 #include <boost/uuid/uuid.hpp>
19 #include <boost/uuid/uuid_io.hpp>
20 
21 // Project Headers
22 #include <basic/options/option.hh>
23 #include <basic/options/keys/in.OptionKeys.gen.hh>
24 #include <basic/options/keys/inout.OptionKeys.gen.hh>
26 #include <core/pose/Pose.hh>
27 #include <core/pose/PDBInfo.hh>
28 #include <core/types.hh>
29 #include <core/io/pdb/file_data.hh>
31 #include <utility/tag/Tag.hh>
32 
33 //Basic Headers
34 #include <basic/database/sql_utils.hh>
35 #include <basic/database/schema_generator/PrimaryKey.hh>
36 #include <basic/database/schema_generator/ForeignKey.hh>
37 #include <basic/database/schema_generator/Column.hh>
38 #include <basic/database/schema_generator/Schema.hh>
39 #include <basic/database/schema_generator/Constraint.hh>
40 #include <basic/Tracer.hh>
41 #include <basic/options/option.hh>
42 #include <basic/options/keys/inout.OptionKeys.gen.hh>
43 
44 #include <basic/database/insert_statement_generator/InsertGenerator.hh>
45 #include <basic/database/insert_statement_generator/RowData.hh>
46 
47 
48 // Utility Headers
49 #include <utility/vector1.hh>
50 #include <utility/sql_database/DatabaseSessionManager.hh>
51 #include <utility/tools/make_vector.hh>
52 
53 // External Headers
54 #include <cppdb/frontend.h>
55 
56 // Boost Headers
57 #include <boost/foreach.hpp>
58 #define foreach BOOST_FOREACH
59 
60 namespace protocols{
61 namespace features{
62 
63 static basic::Tracer TR("protocols.features.UnrecognizedAtomFeatures");
64 
65 using std::string;
66 using std::map;
67 using std::endl;
68 using std::pair;
69 using std::make_pair;
70 using core::Size;
71 using core::Real;
72 using core::Distance;
74 using core::pose::Pose;
81 using utility::vector1;
82 using utility::tools::make_vector;
83 using utility::sql_database::sessionOP;
84 using boost::uuids::uuid;
85 using cppdb::statement;
86 using basic::database::insert_statement_generator::InsertGenerator;
87 using basic::database::insert_statement_generator::RowDataBaseOP;
88 using basic::database::insert_statement_generator::RowData;
89 
91  neighbor_distance_cutoff_(12.0)
92 {
93  if(!basic::options::option[basic::options::OptionKeys::in::remember_unrecognized_res]() || !basic::options::option[basic::options::OptionKeys::in::remember_unrecognized_water]()){
94  TR.Warning << "Use -in:remember_unrecognized_res and -in:remember_unrecognized_water to locate unrecognized atoms." << endl;
95  }
96 }
97 
99  Real neighbor_distance_cutoff
100 ) :
101  neighbor_distance_cutoff_(neighbor_distance_cutoff)
102 {}
103 
105  UnrecognizedAtomFeatures const & src
106 ) :
108  neighbor_distance_cutoff_(src.neighbor_distance_cutoff_)
109 {}
110 
112 {}
113 
114 string
115 UnrecognizedAtomFeatures::type_name() const { return "UnrecognizedAtomFeatures"; }
116 
117 void
119  sessionOP db_session
120 ) const {
124 }
125 
126 void
128  sessionOP db_session
129 ) const {
130 
131  using namespace basic::database::schema_generator;
132 
133  Column struct_id("struct_id", new DbUUID());
134  Column residue_number("residue_number", new DbInteger());
135  Column name3("name3", new DbText());
136  Column max_temperature("max_temperature", new DbReal());
137 
138  Columns residues_pkey_cols;
139  residues_pkey_cols.push_back(struct_id);
140  residues_pkey_cols.push_back(residue_number);
141 
142  Columns foreign_key_columns;
143  foreign_key_columns.push_back(struct_id);
144  vector1< string > reference_columns;
145  reference_columns.push_back("struct_id");
146  ForeignKey foreign_key(foreign_key_columns, "structures", reference_columns, true);
147 
148  Schema table("unrecognized_residues", PrimaryKey(residues_pkey_cols));
149  table.add_column(name3);
150  table.add_column(max_temperature);
151  table.add_foreign_key(foreign_key);
152  table.write(db_session);
153 }
154 
155 
156 void
158  sessionOP db_session
159 ) const {
160 
161  using namespace basic::database::schema_generator;
162 
163  Column struct_id("struct_id", new DbUUID());
164  Column residue_number("residue_number", new DbInteger());
165  Column atom_name("atom_name", new DbText());
166  Column coord_x("coord_x", new DbReal());
167  Column coord_y("coord_y", new DbReal());
168  Column coord_z("coord_z", new DbReal());
169  Column temperature("temperature", new DbReal());
170 
171  Columns residues_pkey_cols;
172  residues_pkey_cols.push_back(struct_id);
173  residues_pkey_cols.push_back(residue_number);
174  residues_pkey_cols.push_back(atom_name);
175 
176  Columns foreign_key_columns;
177  foreign_key_columns.push_back(struct_id);
178  vector1< string > reference_columns;
179  reference_columns.push_back("struct_id");
180  ForeignKey foreign_key(foreign_key_columns, "structures", reference_columns, true);
181 
182  Schema table("unrecognized_atoms", PrimaryKey(residues_pkey_cols));
183  table.add_column(coord_x);
184  table.add_column(coord_y);
185  table.add_column(coord_z);
186  table.add_column(temperature);
187  table.add_foreign_key(foreign_key);
188  table.write(db_session);
189 }
190 
191 void
193  sessionOP db_session
194 ) const {
195 
196  using namespace basic::database::schema_generator;
197 
198  Column struct_id("struct_id", new DbUUID(), false);
199  Column residue_number("residue_number", new DbInteger(), false);
200  Column unrecognized_residue_number("unrecognized_residue_number", new DbReal(), false);
201  Column closest_contact("closest_contact", new DbReal(), false);
202 
203  Columns primary_key_columns;
204  primary_key_columns.push_back(struct_id);
205  primary_key_columns.push_back(residue_number);
206  PrimaryKey primary_key(primary_key_columns);
207 
208  Columns foreign_key_columns;
209  foreign_key_columns.push_back(struct_id);
210  foreign_key_columns.push_back(residue_number);
211  vector1< std::string > reference_columns;
212  reference_columns.push_back("struct_id");
213  reference_columns.push_back("resNum");
214  ForeignKey foreign_key(foreign_key_columns, "residues", reference_columns, true);
215  // No foreign key for neighbor_residue_number, because as there is
216  // currently just unrecognized atoms, not unrecognized residues.
217 
218  Schema table("unrecognized_neighbors", primary_key);
219  table.add_column(unrecognized_residue_number);
220  table.add_column(closest_contact);
221  table.add_foreign_key(foreign_key);
222  table.write(db_session);
223 }
224 
225 
228  utility::vector1<std::string> dependencies;
229  dependencies.push_back("StructureFeatures");
230  dependencies.push_back("ResidueFeatures");
231  return dependencies;
232 }
233 
234 void
236  TagPtr const tag,
237  DataMap & /*data*/,
238  Filters_map const & /*filters*/,
239  Movers_map const & /*movers*/,
240  Pose const & /*pose*/
241 ) {
242  neighbor_distance_cutoff_ = tag->getOption<Real>("neighbor_distance_cutoff", 12.0);
243 }
244 
245 Size
247  Pose const & pose,
248  vector1< bool > const & relevant_residues,
249  boost::uuids::uuid const struct_id,
250  sessionOP db_session
251 ){
252  insert_unrecognized_residues_rows(pose, struct_id, db_session);
253  insert_unrecognized_atoms_rows(pose, struct_id, db_session);
254  insert_unrecognized_neighbors_rows(pose, relevant_residues, struct_id, db_session);
255  return 0;
256 }
257 
258 
259 void
261  Pose const & pose,
262  boost::uuids::uuid const struct_id,
263  sessionOP db_session
264 ){
265  PDBInfoCOP pdb_info(pose.pdb_info());
266  if(!pdb_info) return;
267 
268 
269  InsertGenerator insert_generator("unrecognized_residues");
270  insert_generator.add_column("struct_id");
271  insert_generator.add_column("residue_number");
272  insert_generator.add_column("name3");
273  insert_generator.add_column("max_temperature");
274 
275  RowDataBaseOP struct_id_data = new RowData<boost::uuids::uuid>("struct_id", struct_id);
276 
277  map< Size, UnrecognizedAtomRecord const * > ur_found;
278 
279  for(
281  ua(pdb_info->get_unrecognized_atoms().begin()),
282  ua_end(pdb_info->get_unrecognized_atoms().end());
283  ua != ua_end; ++ua){
284  map< Size, UnrecognizedAtomRecord const * >::const_iterator
285  i(ur_found.find(ua->res_num()));
286  if( i == ur_found.end()){
287  ur_found[ua->res_num()] = &(*ua);
288  } else {
289  if (i->second->temp() > ua->temp()){
290  ur_found[ua->res_num()] = &(*ua);
291  }
292  }
293  }
294 
295  for(
296  map<Size, UnrecognizedAtomRecord const * >::const_iterator
297  i = ur_found.begin(), ie = ur_found.end();
298  i != ie; ++i){
299 
300  UnrecognizedAtomRecord const & ua(*(i->second));
301 
302  insert_generator.add_row(
303  make_vector(
304  struct_id_data,
305  RowDataBaseOP(new RowData<Size>("residue_number", ua.res_num())),
306  RowDataBaseOP(new RowData<string>("name3", ua.res_name())),
307  RowDataBaseOP(new RowData<Real>("max_temperature", ua.temp()))));
308  }
309 
310  insert_generator.write_to_database(db_session);
311 }
312 
313 
314 void
316  Pose const & pose,
317  uuid const struct_id,
318  sessionOP db_session
319 ){
320  PDBInfoCOP pdb_info(pose.pdb_info());
321  if(!pdb_info) return;
322 
323 
324  InsertGenerator insert_generator("unrecognized_atoms");
325  insert_generator.add_column("struct_id");
326  insert_generator.add_column("residue_number");
327  insert_generator.add_column("atom_name");
328  insert_generator.add_column("coord_x");
329  insert_generator.add_column("coord_y");
330  insert_generator.add_column("coord_z");
331  insert_generator.add_column("temperature");
332 
333  RowDataBaseOP struct_id_data = new RowData<uuid>("struct_id", struct_id);
334 
335  foreach( UnrecognizedAtomRecord ua, pdb_info->get_unrecognized_atoms()){
336 
337  insert_generator.add_row(
338  make_vector(
339  struct_id_data,
340  RowDataBaseOP(new RowData<Size>("residue_number", ua.res_num())),
341  RowDataBaseOP(new RowData<string>("atom_name", ua.atom_name())),
342  RowDataBaseOP(new RowData<Real>("coord_x", ua.coords().x())),
343  RowDataBaseOP(new RowData<Real>("coord_y", ua.coords().y())),
344  RowDataBaseOP(new RowData<Real>("coord_z", ua.coords().z())),
345  RowDataBaseOP(new RowData<Real>("temperature", ua.temp()))));
346 
347  }
348 
349  insert_generator.write_to_database(db_session);
350 }
351 
352 void
354  Pose const & pose,
355  vector1< bool > const & relevant_residues,
356  uuid const struct_id,
357  sessionOP db_session
358 ){
359  PDBInfoCOP pdb_info(pose.pdb_info());
360  if(!pdb_info) return;
361 
362 
363  InsertGenerator insert_generator("unrecognized_neighbors");
364  insert_generator.add_column("struct_id");
365  insert_generator.add_column("residue_number");
366  insert_generator.add_column("unrecognized_residue_number");
367  insert_generator.add_column("closest_contact");
368 
369  RowDataBaseOP struct_id_data = new RowData<uuid>("struct_id", struct_id);
370 
371  map< Size, pair< Size, Real > > closest_contact;
372 
373 
374  for(Size resNum=1; resNum <= pose.total_residue(); ++resNum){
375  if(!relevant_residues[resNum]) continue;
376  Residue const & res(pose.residue(resNum));
377 
378  Size closest_ua_resNum(0);
379  Distance closest_ua_distance(10000000);
380  foreach( UnrecognizedAtomRecord ua, pdb_info->get_unrecognized_atoms()){
381  Distance const ua_distance(res.actcoord().distance(ua.coords()));
382  if(
383  ua_distance < neighbor_distance_cutoff_ &&
384  ua_distance < closest_ua_distance){
385  closest_ua_resNum = ua.res_num();
386  closest_ua_distance = ua_distance;
387  }
388  }
389  if(closest_ua_distance < neighbor_distance_cutoff_){
390  insert_generator.add_row(
391  make_vector(
392  struct_id_data,
393  RowDataBaseOP(new RowData<Size>("residue_number", resNum)),
394  RowDataBaseOP(
395  new RowData<Size>("unrecognized_residue_number", closest_ua_resNum)),
396  RowDataBaseOP(
397  new RowData<Distance>("closest_contact", closest_ua_distance))));
398  }
399  }
400 
401  insert_generator.write_to_database(db_session);
402 }
403 
404 
405 void
407  boost::uuids::uuid struct_id,
408  sessionOP db_session) {
409 
410  delete_records_from_table("unrecognized_atoms", struct_id, db_session);
411  delete_records_from_table("unrecognized_neighbors", struct_id, db_session);
412 }
413 
414 
415 
416 } // namesapce
417 } // namespace