Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
AtomTypeDatabaseIO.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/core/chemical/AtomTypeDatabaseIO.cc
11 /// @brief Write chemical information associated with atom types to a database
12 /// @author Matthew O'Meara
13 
14 // Project Headers
15 #include <basic/Tracer.hh>
16 #include <core/types.hh>
20 #include <core/chemical/types.hh>
21 #include <basic/database/sql_utils.hh>
22 #include <basic/options/option.hh>
23 #include <basic/options/keys/inout.OptionKeys.gen.hh>
24 #include <basic/database/schema_generator/PrimaryKey.hh>
25 #include <basic/database/schema_generator/ForeignKey.hh>
26 #include <basic/database/schema_generator/Column.hh>
27 #include <basic/database/schema_generator/Schema.hh>
28 
29 
30 
31 #include <utility/vector1.hh>
32 
33 // Boost Headers
34 #include <boost/foreach.hpp>
35 #include <boost/assign/list_of.hpp>
36 #define foreach BOOST_FOREACH
37 
38 #include <vector>
39 
40 namespace core {
41 namespace chemical {
42 
43 using std::string;
44 using core::Real;
45 
46 using utility::vector1;
48 using utility::sql_database::sessionOP;
49 using basic::database::write_schema_to_database;
50 using basic::database::safely_prepare_statement;
51 using basic::database::safely_read_from_database;
52 using basic::database::safely_write_to_database;
53 
54 using cppdb::statement;
55 using cppdb::result;
56 
58 
60 
61 
62 //////////////////////////
63 // //
64 // Public Interface //
65 // //
66 //////////////////////////
67 
68 
69 void
71  sessionOP db_session
72 ) const {
77 }
78 
79 void
81  sessionOP db_session
82 ) const {
83  using namespace basic::database::schema_generator;
84 
85  Column atom_type_set_name("atom_type_set_name", new DbText(64));
86  Column name("name", new DbText(32));
87  Column element("element", new DbText(2));
88  Column lennard_jones_radius("lennard_jones_radius", new DbReal());
89  Column lennard_jones_well_depth("lennard_jones_well_depth", new DbReal());
90  Column lazaridis_karplus_lambda("lazaridis_karplus_lambda", new DbReal());
91  Column lazaridis_karplus_degrees_of_freedom("lazaridis_karplus_degrees_of_freedom", new DbReal());
92  Column lazaridis_karplus_volume("lazaridis_karplus_volume", new DbReal());
93 
94  Columns primary_key_columns;
95  primary_key_columns.push_back(atom_type_set_name);
96  primary_key_columns.push_back(name);
97  PrimaryKey primary_key(primary_key_columns);
98 
99  Schema table("atom_types", primary_key);
100  table.add_column(element);
101  table.add_column(lennard_jones_radius);
102  table.add_column(lennard_jones_well_depth);
103  table.add_column(lazaridis_karplus_lambda);
104  table.add_column(lazaridis_karplus_degrees_of_freedom);
105  table.add_column(lazaridis_karplus_volume);
106 
107  table.write(db_session);
108 }
109 
110 void
112  sessionOP db_session
113 ) const {
114  using namespace basic::database::schema_generator;
115  using namespace basic::database;
116  using namespace boost::assign;
117 
118  Column property("property", new DbText(32));
119 
120  Columns primary_key_columns;
121  primary_key_columns.push_back(property);
122  PrimaryKey primary_key(primary_key_columns);
123 
124  Schema table("atom_type_property_values", primary_key);
125 
126  table.write(db_session);
127 
128  // insert values
129  string const table_name("atom_type_property_values");
130  std::vector<string> column_names;
131  column_names.push_back("property");
132  insert_or_ignore(table_name, column_names, list_of("'ACCEPTOR'"), db_session);
133  insert_or_ignore(table_name, column_names, list_of("'ACCEPTOR'"), db_session);
134  insert_or_ignore(table_name, column_names, list_of("'DONOR'"), db_session);
135  insert_or_ignore(table_name, column_names, list_of("'POLAR_HYDROGEN'"), db_session);
136  insert_or_ignore(table_name, column_names, list_of("'AROMATIC'"), db_session);
137  insert_or_ignore(table_name, column_names, list_of("'H2O'"), db_session);
138  insert_or_ignore(table_name, column_names, list_of("'ORBITALS'"), db_session);
139  insert_or_ignore(table_name, column_names, list_of("'VIRTUAL'"), db_session);
140  insert_or_ignore(table_name, column_names, list_of("'SP2_HYBRID'"), db_session);
141  insert_or_ignore(table_name, column_names, list_of("'SP3_HYBRID'"), db_session);
142  insert_or_ignore(table_name, column_names, list_of("'RING_HYBRID'"), db_session);
143 
144 }
145 
146 void
148  sessionOP db_session
149 ) const {
150  using namespace basic::database::schema_generator;
151 
152  Column atom_type_set_name("atom_type_set_name", new DbText(64));
153  Column name("name", new DbText(4));
154  Column property("property", new DbText(32));
155 
156  Columns primary_key_columns;
157  primary_key_columns.push_back(atom_type_set_name);
158  primary_key_columns.push_back(name);
159  primary_key_columns.push_back(property);
160  PrimaryKey primary_key(primary_key_columns);
161 
162  Columns foreign_key_columns1;
163  foreign_key_columns1.push_back(atom_type_set_name);
164  foreign_key_columns1.push_back(name);
165  vector1< std::string > reference_columns1;
166  reference_columns1.push_back("atom_type_set_name");
167  reference_columns1.push_back("name");
168  ForeignKey foreign_key1(foreign_key_columns1, "atom_types", reference_columns1, true);
169 
170  Columns foreign_key_columns2;
171  foreign_key_columns2.push_back(property);
172  vector1< std::string > reference_columns2;
173  reference_columns2.push_back("property");
174  ForeignKey foreign_key2(foreign_key_columns2, "atom_type_property_values", reference_columns2, true);
175 
176 
177  Schema table("atom_type_properties", primary_key);
178  table.add_foreign_key(foreign_key1);
179  table.add_foreign_key(foreign_key2);
180 
181  table.write(db_session);
182 }
183 
184 
185 void
187  sessionOP db_session
188 ) const {
189  using namespace basic::database::schema_generator;
190 
191  Column atom_type_set_name("atom_type_set_name", new DbText(64));
192  Column name("name", new DbText(32));
193  Column parameter("parameter", new DbText(32));
194  Column value("value", new DbReal());
195 
196  Columns primary_key_columns;
197  primary_key_columns.push_back(atom_type_set_name);
198  primary_key_columns.push_back(name);
199  primary_key_columns.push_back(parameter);
200  PrimaryKey primary_key(primary_key_columns);
201 
202  Columns foreign_key_columns;
203  foreign_key_columns.push_back(atom_type_set_name);
204  foreign_key_columns.push_back(name);
205  vector1< std::string > reference_columns;
206  reference_columns.push_back("atom_type_set_name");
207  reference_columns.push_back("name");
208  ForeignKey foreign_key(foreign_key_columns, "atom_types", reference_columns, true);
209 
210  Schema table("atom_type_extra_parameters", primary_key);
211  table.add_foreign_key(foreign_key);
212  table.add_column(value);
213 
214  table.write(db_session);
215 }
216 
217 
218 void
220  sessionOP db_session
221 ) const {
222  write_schema_to_db(db_session);
223 }
224 
225 void
227  AtomTypeSet const & atom_type_set,
228  sessionOP db_session
229 ) const {
230  string const & atom_type_set_name(atom_type_set.name());
231 
232  string stmt_string =
233  "SELECT * FROM atom_types WHERE atom_type_set_name = ?";
234  statement stmt(safely_prepare_statement(stmt_string, db_session));
235  stmt.bind(1, atom_type_set_name);
236  result res(safely_read_from_database(stmt));
237  if(res.next()) return;
238 
239 
240  for(Size atom_index=1; atom_index <= atom_type_set.n_atomtypes(); ++atom_index){
241  AtomType const & atom_type(atom_type_set[atom_index]);
243  atom_type_set_name, atom_type, db_session);
245  atom_type_set_name, atom_type, db_session);
247  atom_type_set, atom_type, db_session);
248  }
249 }
250 
253  sessionOP db_session
254 ) const {
255 
256  vector1<string> atom_names;
257 
258  string stmt_string = "SELECT name FROM atom_types;";
259  statement stmt(safely_prepare_statement(stmt_string, db_session));
260  result res(safely_read_from_database(stmt));
261  while(res.next())
262  {
263  string name;
264  res >> name;
265  atom_names.push_back(name);
266  }
267  return atom_names;
268 }
269 
270 
271 ///////////////////////
272 // //
273 // Helper Methods //
274 // //
275 ///////////////////////
276 
277 
278 void
280  string const & atom_type_set_name,
281  AtomType const & atom_type,
282  sessionOP db_session
283 ) const {
284 
285  string stmt_string = "INSERT INTO atom_types (atom_type_set_name, name, element, lennard_jones_radius, lennard_jones_well_depth, lazaridis_karplus_lambda, lazaridis_karplus_degrees_of_freedom, lazaridis_karplus_volume) VALUES (?,?,?,?,?,?,?,?);";
286  statement stmt(safely_prepare_statement(stmt_string, db_session));
287 
288  stmt.bind(1,atom_type_set_name);
289  stmt.bind(2,atom_type.name());
290  stmt.bind(3,atom_type.element());
291  stmt.bind(4,atom_type.lj_radius());
292  stmt.bind(5,atom_type.lj_wdepth());
293  stmt.bind(6,atom_type.lk_lambda());
294  stmt.bind(7,atom_type.lk_dgfree());
295  stmt.bind(8,atom_type.lk_volume());
296  safely_write_to_database(stmt);
297 
298 }
299 
300 
301 void
303  string const & atom_type_set_name,
304  AtomType const & atom_type,
305  sessionOP db_session
306 ) const {
307 
308  string statement_string = "INSERT INTO atom_type_properties (atom_type_set_name, name, property) VALUES (?,?,?);";
309  statement stmt(safely_prepare_statement(statement_string, db_session));
310 
311  vector1<string> properties(atom_type.get_all_properties());
313  property_iter = properties.begin(), property_end = properties.end();
314  property_iter != property_end; ++property_iter){
315  stmt.bind(1, atom_type_set_name);
316  stmt.bind(2, atom_type.name());
317  stmt.bind(3, *property_iter);
318  safely_write_to_database(stmt);
319  }
320 }
321 
322 
323 void
325  AtomTypeSet const & atom_type_set,
326  AtomType const & atom_type,
327  sessionOP db_session
328 ) const {
329 
330  string const atom_type_set_name = atom_type_set.name();
331 
332  string stmt_string = "INSERT INTO atom_type_extra_parameters (atom_type_set_name, name, parameter, value) VALUES (?,?,?,?);";
333  statement stmt(safely_prepare_statement(stmt_string, db_session));
334 
335  for(std::map<std::string, int>::const_iterator
336  extra_parameter_index_iter =
337  atom_type_set.extra_parameter_indices().begin(),
338  extra_parameter_index_iter_end =
339  atom_type_set.extra_parameter_indices().end();
340  extra_parameter_index_iter != extra_parameter_index_iter_end;
341  ++extra_parameter_index_iter){
342 
343  string const extra_parameter_name(extra_parameter_index_iter->first);
344  Size const extra_parameter_index(extra_parameter_index_iter->second);
345  stmt.bind(1, atom_type_set_name);
346  stmt.bind(2, atom_type.name());
347  stmt.bind(3, extra_parameter_name);
348  stmt.bind(4, atom_type.extra_parameter(extra_parameter_index));
349  safely_write_to_database(stmt);
350  }
351 }
352 
353 
354 } // namespace
355 } // namespace