Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
RotamerFeatures.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 be5B
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file protocols/features/RotamerFeatures.cc
11 /// @brief report rotamer library features to the database
12 /// @author Matthew O'Meara
13 
14 // Unit Headers
21 
22 // Project Headers
23 #include <core/chemical/AA.hh>
28 #include <core/pose/Pose.hh>
29 #include <core/types.hh>
30 #include <core/id/AtomID.hh>
31 
32 // Utility Headers
33 #include <numeric/xyzVector.hh>
34 #include <utility/vector1.hh>
35 #include <utility/sql_database/DatabaseSessionManager.hh>
36 #include <utility/string_util.hh>
37 
38 
39 //Basic Headers
40 #include <basic/basic.hh>
41 #include <basic/options/option.hh>
42 #include <basic/options/keys/corrections.OptionKeys.gen.hh>
43 #include <basic/database/sql_utils.hh>
44 #include <basic/database/schema_generator/PrimaryKey.hh>
45 #include <basic/database/schema_generator/ForeignKey.hh>
46 #include <basic/database/schema_generator/Column.hh>
47 #include <basic/database/schema_generator/Schema.hh>
48 #include <basic/database/schema_generator/Constraint.hh>
49 #include <basic/Tracer.hh>
50 
51 // External Headers
52 #include <cppdb/frontend.h>
53 #include <boost/uuid/uuid.hpp>
54 
55 namespace protocols{
56 namespace features{
57 
58 using std::string;
59 using std::endl;
60 using std::copy;
61 using core::Size;
62 using core::Real;
63 using core::Vector;
64 using core::chemical::AA;
77 using core::pose::Pose;
78 using basic::periodic_range;
79 using basic::database::safely_prepare_statement;
80 using basic::database::safely_write_to_database;
81 using utility::sql_database::sessionOP;
82 using utility::vector1;
83 using cppdb::statement;
84 using cppdb::result;
85 using boost::uuids::uuid;
86 
87 static basic::Tracer TR( "protocols.features.RotamerFeatures" );
88 
89 string
91  return "RotamerFeatures";
92 }
93 
94 void
96  sessionOP db_session
97 ) const {
99 }
100 
101 void
103  sessionOP db_session
104 ) const {
105  using namespace basic::database::schema_generator;
106 
107  Column struct_id("struct_id", new DbUUID(), false);
108  Column residue_number("residue_number", new DbInteger(), false);
109  Column rotamer_bin("rotamer_bin", new DbInteger(), false);
110  Column nchi("nchi", new DbInteger(), false);
111  Column semi_rotameric("semi_rotameric", new DbInteger(), false);
112  Column chi1_mean("chi1_mean", new DbReal(), true);
113  Column chi2_mean("chi2_mean", new DbReal(), true);
114  Column chi3_mean("chi3_mean", new DbReal(), true);
115  Column chi4_mean("chi4_mean", new DbReal(), true);
116  Column chi1_standard_deviation("chi1_standard_deviation", new DbReal(), true);
117  Column chi2_standard_deviation("chi2_standard_deviation", new DbReal(), true);
118  Column chi3_standard_deviation("chi3_standard_deviation", new DbReal(), true);
119  Column chi4_standard_deviation("chi4_standard_deviation", new DbReal(), true);
120  Column chi1_deviation("chi1_deviation", new DbReal(), true);
121  Column chi2_deviation("chi2_deviation", new DbReal(), true);
122  Column chi3_deviation("chi3_deviation", new DbReal(), true);
123  Column chi4_deviation("chi4_deviation", new DbReal(), true);
124  Column rotamer_bin_probability("rotamer_bin_probability", new DbReal(), false);
125 
126  vector1<Column> primary_key_columns;
127  primary_key_columns.push_back(struct_id);
128  primary_key_columns.push_back(residue_number);
129  PrimaryKey primary_key(primary_key_columns);
130 
131  vector1<Column> residues_foreign_key_columns;
132  residues_foreign_key_columns.push_back(struct_id);
133  residues_foreign_key_columns.push_back(residue_number);
134 
135  vector1<string> residues_foreign_key_reference_columns;
136  residues_foreign_key_reference_columns.push_back("struct_id");
137  residues_foreign_key_reference_columns.push_back("resNum");
138  ForeignKey residues_foreign_key(
139  residues_foreign_key_columns,
140  "residues",
141  residues_foreign_key_reference_columns,
142  true);
143 
144 
145  Schema residue_rotamers("residue_rotamers", primary_key);
146  residue_rotamers.add_column(struct_id);
147  residue_rotamers.add_column(residue_number);
148  residue_rotamers.add_column(rotamer_bin);
149  residue_rotamers.add_column(nchi);
150  residue_rotamers.add_column(semi_rotameric);
151  residue_rotamers.add_column(chi1_mean);
152  residue_rotamers.add_column(chi2_mean);
153  residue_rotamers.add_column(chi3_mean);
154  residue_rotamers.add_column(chi4_mean);
155  residue_rotamers.add_column(chi1_standard_deviation);
156  residue_rotamers.add_column(chi2_standard_deviation);
157  residue_rotamers.add_column(chi3_standard_deviation);
158  residue_rotamers.add_column(chi4_standard_deviation);
159  residue_rotamers.add_column(chi1_deviation);
160  residue_rotamers.add_column(chi2_deviation);
161  residue_rotamers.add_column(chi3_deviation);
162  residue_rotamers.add_column(chi4_deviation);
163  residue_rotamers.add_column(rotamer_bin_probability);
164  residue_rotamers.add_foreign_key(residues_foreign_key);
165  residue_rotamers.write(db_session);
166 }
167 
168 
171  vector1<string> dependencies;
172  dependencies.push_back("ResidueFeatures");
173  return dependencies;
174 }
175 
176 Size
178  Pose const & pose,
179  vector1< bool > const & relevant_residues,
180  uuid struct_id,
181  sessionOP db_session
182 ) {
183 
184  using namespace basic::options;
185  using namespace basic::options::OptionKeys;
186 
187  string library_name;
188  vector1< AA > rotameric_amino_acids;
189  vector1< Size > rotameric_n_chi;
190 
191  vector1< AA > sraa;
192  vector1< Size > srnchi;
193  vector1< bool > scind;
194  vector1< bool > sampind;
195  vector1< bool > sym;
196  vector1< Real > astr;
197 
198  if( option[ corrections::score::dun10 ] ){
199  library_name = "dun10";
201  rotameric_amino_acids, rotameric_n_chi,
202  sraa, srnchi, scind, sampind, sym, astr );
203 
204  } else {
205  library_name = "dun02";
207  rotameric_amino_acids, rotameric_n_chi );
208  }
209 
210  string insert_sql(
211  "INSERT INTO residue_rotamers ("
212  " struct_id,"
213  " residue_number,"
214  " rotamer_bin,"
215  " nchi,"
216  " semi_rotameric,"
217  " chi1_mean,"
218  " chi2_mean,"
219  " chi3_mean,"
220  " chi4_mean,"
221  " chi1_standard_deviation,"
222  " chi2_standard_deviation,"
223  " chi3_standard_deviation,"
224  " chi4_standard_deviation,"
225  " chi1_deviation,"
226  " chi2_deviation,"
227  " chi3_deviation,"
228  " chi4_deviation,"
229  " rotamer_bin_probability) VALUES"
230  " (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);");
231  statement insert_stmt(safely_prepare_statement(insert_sql, db_session));
232 
234 
235  for(
236  Size residue_number=1;
237  residue_number <= pose.total_residue();
238  ++residue_number){
239 
240  // only report features for the specified subset of residues
241  if(!relevant_residues[residue_number]) continue;
242 
243  Residue const & residue(pose.residue(residue_number));
244  if( residue.type().residue_type_set().name() != FA_STANDARD){
245  utility_exit_with_message("Attempting to report protein rotamer features for a pose that is not full-atom.");
246  }
247 
248  if( ! residue.is_protein() || residue.type().aa() > num_canonical_aas ){
249  TR.Warning << "Unable to report protein rotamer features for residue " << residue_number << " because it is not a canonical amino acid: '" << residue.type().name() << "'" << endl;
250  continue;
251  }
252 
253  if(residue.type().get_use_ncaa_rotlib()){
254  TR.Warning << "Currently the RotamerFeatures only supports canonical amino acids, but this residue type is '" << residue.type().name() << "'" << endl;
255  continue;
256  }
257 
258 
259  Size rotamer_bin(0);
260  bool recognized_residue_type;
261 
262  ChiVector const & chis(residue.chi());
263 
264  bool semi_rotameric(true);
265  Size nchi = 0;
266  for(Size ii=1; ii <= rotameric_amino_acids.size(); ++ii){
267  if (rotameric_amino_acids[ii] == residue.aa()){
268  semi_rotameric = false;
269  nchi = rotameric_n_chi[ ii ];
270  break;
271  }
272  }
273 
274  if(semi_rotameric){
275  for(Size ii=1; ii <= sraa.size(); ++ii){
276  if(sraa[ii] == residue.aa()){
277  nchi = srnchi[ii];
278  break;
279  }
280  }
281  }
282 
283 
284  if(nchi == 0){
285  continue;
286  } else if( nchi == ONE){
287  recognized_residue_type = RotamerInitializer<ONE>::initialize_rotamer(
288  residue, scratch, rotamer_bin);
289  } else if( nchi == TWO){
290  recognized_residue_type = RotamerInitializer<TWO>::initialize_rotamer(
291  residue, scratch, rotamer_bin);
292  } else if( nchi == THREE){
293  recognized_residue_type = RotamerInitializer<THREE>::initialize_rotamer(
294  residue, scratch, rotamer_bin);
295  } else if( nchi == FOUR){
296  recognized_residue_type = RotamerInitializer<FOUR>::initialize_rotamer(
297  residue, scratch, rotamer_bin);
298  } else {
299  continue;
300  }
301 
302  if(!recognized_residue_type){
303  TR.Warning << "Unable to report protein rotamer features for residue " << residue_number << " because there is no rotamer library defined for this residue type: '" << residue.type().name() << "'" << endl;
304  continue;
305  }
306 
307 
308  vector1< Real > chi_deviations(0, 4);
309 
310  for(Size chi = 1; chi <= nchi; ++chi){
311  if(library_name.compare("dun02") == 0){
312  chi_deviations.push_back(
314  chis[chi], scratch.chimean()[chi], residue.aa(), chi));
315  } else {
316  chi_deviations.push_back(
317  periodic_range(chis[chi] - scratch.chimean()[chi], 360));
318  }
319  }
320 
321  insert_stmt.bind(1, struct_id);
322  insert_stmt.bind(2, residue_number);
323  insert_stmt.bind(3, rotamer_bin);
324  insert_stmt.bind(4, nchi);
325  insert_stmt.bind(5, semi_rotameric);
326 
327  for(Size chi = 1; chi <= 4; ++chi){
328  if( chi <= nchi){
329  insert_stmt.bind(5+chi, scratch.chimean()[chi]);
330  insert_stmt.bind(9+chi, scratch.chisd()[chi]);
331  insert_stmt.bind(13+chi, chi_deviations[chi]);
332  } else {
333  insert_stmt.bind_null(5+chi);
334  insert_stmt.bind_null(9+chi);
335  insert_stmt.bind_null(13+chi);
336  }
337  }
338 
339  insert_stmt.bind(18, scratch.rotprob());
340  safely_write_to_database(insert_stmt);
341  }
342  return 0;
343 }
344 
345 void
347  boost::uuids::uuid struct_id,
348  utility::sql_database::sessionOP db_session
349 ){
350 
351  statement conf_stmt(basic::database::safely_prepare_statement("DELETE FROM residue_rotamers WHERE struct_id = ?;\n",db_session));
352  conf_stmt.bind(1,struct_id);
353  basic::database::safely_write_to_database(conf_stmt);
354 }
355 
356 } // namespace
357 } // namespace