Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
PdbDataFeatures.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 src/protocols/features/PdbDataFeatures.cc
11 /// @author Sam DeLuca
12 
14 
15 //project headers
16 #include <core/pose/PDBInfo.hh>
17 #include <core/pose/Pose.hh>
19 
20 //External
21 #include <boost/uuid/uuid.hpp>
22 #include <boost/uuid/uuid_io.hpp>
23 
24 //Basic Headers
25 #include <basic/database/sql_utils.hh>
26 #include <basic/database/schema_generator/PrimaryKey.hh>
27 #include <basic/database/schema_generator/ForeignKey.hh>
28 #include <basic/database/schema_generator/Column.hh>
29 #include <basic/database/schema_generator/Schema.hh>
30 #include <basic/database/schema_generator/Constraint.hh>
31 #include <basic/options/option.hh>
32 #include <basic/options/keys/inout.OptionKeys.gen.hh>
33 
34 #include <basic/database/insert_statement_generator/InsertGenerator.hh>
35 #include <basic/database/insert_statement_generator/RowData.hh>
36 
37 //Utility Headers
38 #include <utility/sql_database/DatabaseSessionManager.hh>
39 #include <utility/vector1.hh>
40 #include <utility/tools/make_vector.hh>
41 
42 // External Headers
43 #include <cppdb/frontend.h>
44 
45 // C++ Headers
46 #include <algorithm>
47 #include <limits>
48 
49 namespace protocols {
50 namespace features {
51 
52 using std::string;
53 using std::max;
54 using std::min;
55 using std::numeric_limits;
56 using core::Size;
57 using core::Real;
59 using core::pose::Pose;
60 using utility::sql_database::sessionOP;
61 using utility::vector1;
62 using basic::database::safely_read_from_database;
63 using basic::database::safely_prepare_statement;
64 using basic::database::safely_write_to_database;
65 using basic::database::table_exists;
66 using cppdb::result;
67 using cppdb::statement;
71 using basic::database::insert_statement_generator::InsertGenerator;
72 using basic::database::insert_statement_generator::RowData;
73 using basic::database::insert_statement_generator::RowDataBaseOP;
74 
75 
77 {
78 
79 }
80 
82 {
83 
84 }
85 
87 {
88 
89 }
90 
92 {
93  return "PdbDataFeatures";
94 }
95 
96 void
97 PdbDataFeatures::write_schema_to_db(utility::sql_database::sessionOP db_session) const{
98  using namespace basic::database::schema_generator;
99 
100  Column struct_id("struct_id", new DbUUID(), false);
101  Column residue_number("residue_number", new DbInteger(), false);
102 
103  utility::vector1<Column> pkey_cols;
104  pkey_cols.push_back(struct_id);
105  pkey_cols.push_back(residue_number);
106 
107  //******residue_pdb_identification******//
108  Column chain_id("chain_id", new DbText(), false);
109  Column insertion_code("insertion_code", new DbText(), false);
110  Column pdb_residue_number("pdb_residue_number", new DbInteger(), false);
111 
112  utility::vector1<std::string> fkey_reference_cols;
113  fkey_reference_cols.push_back("struct_id");
114  fkey_reference_cols.push_back("resNum");
115 
116  Schema residue_pdb_identification("residue_pdb_identification", PrimaryKey(pkey_cols));
117  residue_pdb_identification.add_column(struct_id);
118  residue_pdb_identification.add_column(residue_number);
119  residue_pdb_identification.add_column(chain_id);
120  residue_pdb_identification.add_column(insertion_code);
121  residue_pdb_identification.add_column(pdb_residue_number);
122 
123  residue_pdb_identification.add_foreign_key(ForeignKey(struct_id, "structures", "struct_id", true));
124 
125  residue_pdb_identification.write(db_session);
126 
127 
128  //******residue_pdb_confidence******//
129  Column max_temperature("max_temperature", new DbReal(), false);
130  Column max_bb_temperature("max_bb_temperature", new DbReal(), false);
131  Column max_sc_temperature("max_sc_temperature", new DbReal(), false);
132  Column min_occupancy("min_occupancy", new DbReal(), false);
133  Column min_bb_occupancy("min_bb_occupancy", new DbReal(), false);
134  Column min_sc_occupancy("min_sc_occupancy", new DbReal(), false);
135 
136  utility::vector1<Column> pdb_ident_pkeys;
137  pdb_ident_pkeys.push_back(struct_id);
138  pdb_ident_pkeys.push_back(residue_number);
139 
140  Schema residue_pdb_confidence("residue_pdb_confidence", PrimaryKey(pkey_cols));
141  residue_pdb_confidence.add_column(struct_id);
142  residue_pdb_confidence.add_column(residue_number);
143  residue_pdb_confidence.add_column(max_temperature);
144  residue_pdb_confidence.add_column(max_bb_temperature);
145  residue_pdb_confidence.add_column(max_sc_temperature);
146  residue_pdb_confidence.add_column(min_occupancy);
147  residue_pdb_confidence.add_column(min_bb_occupancy);
148  residue_pdb_confidence.add_column(min_sc_occupancy);
149 
150  residue_pdb_confidence.add_foreign_key(ForeignKey(struct_id, "structures", "struct_id", true));
151 
152  residue_pdb_confidence.write(db_session);
153 
154 }
155 
158  utility::vector1<std::string> dependencies;
159  dependencies.push_back("StructureFeatures");
160  return dependencies;
161 }
162 
163 
165  Pose const & pose,
166  vector1<bool> const & relevant_residues,
167  boost::uuids::uuid struct_id,
168  sessionOP db_session )
169 {
171  pose, relevant_residues, struct_id, db_session);
173  pose, relevant_residues, struct_id, db_session);
174  return 0;
175 }
176 
178  boost::uuids::uuid struct_id,
179  sessionOP db_session)
180 {
181  string id_statement_string = "DELETE FROM residue_pdb_identification WHERE struct_id = ?;\n";
182  statement id_stmt(safely_prepare_statement(id_statement_string,db_session));
183  id_stmt.bind(1,struct_id);
184  safely_write_to_database(id_stmt);
185 
186  string confidence_statement_string = "DELETE FROM residue_pdb_confidence WHERE struct_id = ?;\n";
187  statement confidence_stmt(
188  safely_prepare_statement(confidence_statement_string, db_session));
189  confidence_stmt.bind(1,struct_id);
190  safely_write_to_database(confidence_stmt);
191 }
192 
194  sessionOP db_session,
195  boost::uuids::uuid struct_id,
196  Pose & pose)
197 {
198  load_residue_pdb_identification(db_session, struct_id, pose);
199  load_residue_pdb_confidence(db_session, struct_id, pose);
200 }
201 
202 
204  sessionOP db_session,
205  boost::uuids::uuid struct_id,
206  Pose & pose)
207 {
208  if(!table_exists(db_session, "residue_pdb_identification")) return;
209 
210  vector1<int> pdb_numbers;
211  vector1<char> pdb_chains;
212  vector1<char> insertion_codes;
213  string statement_string =
214  "SELECT\n"
215  " r_id.struct_id,\n"
216  " r_id.residue_number,\n"
217  " r_id.chain_id,\n"
218  " r_id.insertion_code,\n"
219  " r_id.pdb_residue_number\n"
220  "FROM\n"
221  " residue_pdb_identification AS r_id\n"
222  "WHERE\n"
223  " r_id.struct_id=?;";
224 
225  statement stmt(safely_prepare_statement(statement_string,db_session));
226  stmt.bind(1,struct_id);
227  result res(safely_read_from_database(stmt));
228 
229  while(res.next()) {
230  boost::uuids::uuid temp;
231  Size residue_number;
232  //cppdb doesn't do char's
233  string chain_id;
234  string insertion_code;
235  int pdb_residue_number;
236 
237  res >> temp >> residue_number >> chain_id >> insertion_code >> pdb_residue_number;
238 
239  pdb_chains.push_back(chain_id[0]);
240  insertion_codes.push_back(insertion_code[0]);
241  pdb_numbers.push_back(pdb_residue_number);
242  }
243 
244  if(!pose.pdb_info()){
245  pose.pdb_info(new PDBInfo(pose.total_residue()));
246  }
247 
248  pose.pdb_info()->set_numbering(pdb_numbers);
249  pose.pdb_info()->set_chains(pdb_chains);
250  pose.pdb_info()->set_icodes(insertion_codes);
251 }
252 
254  Pose const & pose,
255  vector1< bool > const & relevant_residues,
256  boost::uuids::uuid struct_id,
257  sessionOP db_session
258 ) {
259 
260  InsertGenerator pdb_ident_insert("residue_pdb_identification");
261  pdb_ident_insert.add_column("struct_id");
262  pdb_ident_insert.add_column("residue_number");
263  pdb_ident_insert.add_column("chain_id");
264  pdb_ident_insert.add_column("insertion_code");
265  pdb_ident_insert.add_column("pdb_residue_number");
266 
267  RowDataBaseOP struct_id_data = new RowData<boost::uuids::uuid>("struct_id",struct_id);
268 
269  Size res_num(pose.n_residue());
270  for(Size index = 1; index <= res_num; ++index) {
271  if(!relevant_residues[index]) continue;
272 
273  string chain_id(& pose.pdb_info()->chain(index),1);
274  string insertion_code(&pose.pdb_info()->icode(index),1);
275  int pdb_residue_number = pose.pdb_info()->number(index);
276 
277  RowDataBaseOP index_data = new RowData<Size>("residue_number",index);
278  RowDataBaseOP chain_id_data = new RowData<string>("chain_id",chain_id);
279  RowDataBaseOP insertion_code_data = new RowData<string>("insertion_code",insertion_code);
280  RowDataBaseOP pdb_resnum_data = new RowData<int>("pdb_residue_number",pdb_residue_number );
281  pdb_ident_insert.add_row(
282  utility::tools::make_vector(struct_id_data,index_data,chain_id_data,insertion_code_data,pdb_resnum_data));
283 
284 
285  }
286  pdb_ident_insert.write_to_database(db_session);
287 }
288 
289 
291  sessionOP db_session,
292  boost::uuids::uuid struct_id,
293  Pose & pose)
294 {
295  if(!table_exists(db_session, "residue_pdb_confidence")) return;
296 
297  if(!pose.pdb_info()){
298  pose.pdb_info(new PDBInfo(pose.total_residue()));
299  }
300 
301  std::string statement_string =
302  "SELECT\n"
303  " r_conf.residue_number,\n"
304  " r_conf.max_bb_temperature,\n"
305  " r_conf.max_sc_temperature,\n"
306  " r_conf.min_bb_occupancy,\n"
307  " r_conf.min_sc_occupancy\n"
308  "FROM\n"
309  " residue_pdb_confidence AS r_conf\n"
310  "WHERE\n"
311  " r_conf.struct_id=?;";
312 
313  statement stmt(safely_prepare_statement(statement_string,db_session));
314  stmt.bind(1,struct_id);
315  result res(safely_read_from_database(stmt));
316 
317  while(res.next()) {
318  Size residue_number;
319  Real max_bb_temperature;
320  Real max_sc_temperature;
321  Real min_bb_occupancy;
322  Real min_sc_occupancy;
323 
324  res
325  >> residue_number
326  >> max_bb_temperature
327  >> max_sc_temperature
328  >> min_bb_occupancy
329  >> min_sc_occupancy;
330 
331  Residue const & residue(pose.residue(residue_number));
332 
333  pose.pdb_info()->resize_atom_records(
334  residue_number, residue.nheavyatoms(), false);
335 
336  for(
337  Size atom_index=1;
338  atom_index <= residue.last_backbone_atom();
339  ++atom_index){
340  pose.pdb_info()->temperature(
341  residue_number, atom_index, max_bb_temperature);
342  pose.pdb_info()->occupancy(
343  residue_number, atom_index, min_bb_occupancy);
344  }
345  for(
346  Size atom_index = residue.first_sidechain_atom();
347  atom_index <= residue.nheavyatoms();
348  ++atom_index){
349  pose.pdb_info()->temperature(
350  residue_number, atom_index, max_sc_temperature);
351  pose.pdb_info()->occupancy(
352  residue_number, atom_index, min_sc_occupancy);
353  }
354  }
355 }
356 
357 
359  Pose const & pose,
360  vector1< bool > const & relevant_residues,
361  boost::uuids::uuid struct_id,
362  sessionOP db_session
363 ) {
364  PDBInfoCOP pdb_info(pose.pdb_info());
365  if(!pdb_info) return;
366 
367 
368  InsertGenerator confidence_insert("residue_pdb_confidence");
369  confidence_insert.add_column("struct_id");
370  confidence_insert.add_column("residue_number");
371  confidence_insert.add_column("max_temperature");
372  confidence_insert.add_column("max_bb_temperature");
373  confidence_insert.add_column("max_sc_temperature");
374  confidence_insert.add_column("min_occupancy");
375  confidence_insert.add_column("min_bb_occupancy");
376  confidence_insert.add_column("min_sc_occupancy");
377 
378 
379  RowDataBaseOP struct_id_data = new RowData<boost::uuids::uuid>("struct_id",struct_id);
380 
381  for(Size ri=1; ri <= pose.n_residue(); ++ri) {
382  if(!relevant_residues[ri]) continue;
383 
384  Residue const & r(pose.residue(ri));
385  Real max_bb_temperature(-1), max_sc_temperature(-1);
386  Real min_bb_occupancy(9999999);
387  Real min_sc_occupancy(9999999);
388  Size const n_bb(r.n_mainchain_atoms());
389  Size const n_sc(r.nheavyatoms() - r.n_mainchain_atoms());
390  for(Size ai=1; ai <= n_bb; ++ai){
391  max_bb_temperature = max(max_bb_temperature, pdb_info->temperature(ri, ai));
392  min_bb_occupancy = min(min_bb_occupancy, pdb_info->occupancy(ri, ai));
393  }
394  for(Size ai=1; ai <= n_sc; ++ai){
395  max_sc_temperature = max(max_sc_temperature, pdb_info->temperature(ri, ai));
396  min_sc_occupancy = min(min_sc_occupancy, pdb_info->occupancy(ri, ai));
397  }
398  Real const max_temperature = max(max_bb_temperature, max_sc_temperature);
399  Real const min_occupancy = min(min_bb_occupancy, min_sc_occupancy);
400 
401  RowDataBaseOP residue_number_data = new RowData<Size>("residue_number",ri);
402  RowDataBaseOP max_temp_data = new RowData<Real>("max_temperature",max_temperature);
403  RowDataBaseOP max_bb_temp_data = new RowData<Real>("max_bb_temperature",max_bb_temperature);
404  RowDataBaseOP max_sc_temp_data = new RowData<Real>("max_sc_temperature",max_sc_temperature);
405  RowDataBaseOP min_occupancy_data = new RowData<Real>("min_occupancy",min_occupancy);
406  RowDataBaseOP min_bb_occupancy_data = new RowData<Real>("min_bb_occupancy",min_bb_occupancy);
407  RowDataBaseOP min_sc_occupancy_data = new RowData<Real>("min_sc_occupancy",min_sc_occupancy);
408 
409  confidence_insert.add_row(
410  utility::tools::make_vector(struct_id_data,residue_number_data,max_temp_data,max_bb_temp_data,max_sc_temp_data,
411  min_occupancy_data,min_bb_occupancy_data,min_sc_occupancy_data)
412  );
413 
414  }
415 
416  confidence_insert.write_to_database(db_session);
417 
418 }
419 
420 
421 
422 
423 }
424 }