33 #include <numeric/xyzVector.hh>
34 #include <utility/vector1.hh>
35 #include <utility/sql_database/DatabaseSessionManager.hh>
36 #include <utility/string_util.hh>
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>
52 #include <cppdb/frontend.h>
53 #include <boost/uuid/uuid.hpp>
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;
83 using cppdb::statement;
85 using boost::uuids::uuid;
87 static basic::Tracer
TR(
"protocols.features.RotamerFeatures" );
91 return "RotamerFeatures";
105 using namespace basic::database::schema_generator;
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);
127 primary_key_columns.push_back(struct_id);
128 primary_key_columns.push_back(residue_number);
129 PrimaryKey primary_key(primary_key_columns);
132 residues_foreign_key_columns.push_back(struct_id);
133 residues_foreign_key_columns.push_back(residue_number);
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,
141 residues_foreign_key_reference_columns,
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);
172 dependencies.push_back(
"ResidueFeatures");
184 using namespace basic::options;
185 using namespace basic::options::OptionKeys;
198 if( option[ corrections::score::dun10 ] ){
199 library_name =
"dun10";
201 rotameric_amino_acids, rotameric_n_chi,
202 sraa, srnchi, scind, sampind, sym, astr );
205 library_name =
"dun02";
207 rotameric_amino_acids, rotameric_n_chi );
211 "INSERT INTO residue_rotamers ("
221 " chi1_standard_deviation,"
222 " chi2_standard_deviation,"
223 " chi3_standard_deviation,"
224 " chi4_standard_deviation,"
229 " rotamer_bin_probability) VALUES"
230 " (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);");
231 statement insert_stmt(safely_prepare_statement(insert_sql, db_session));
236 Size residue_number=1;
241 if(!relevant_residues[residue_number])
continue;
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.");
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;
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;
260 bool recognized_residue_type;
264 bool semi_rotameric(
true);
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 ];
275 for(
Size ii=1; ii <= sraa.size(); ++ii){
276 if(sraa[ii] == residue.aa()){
286 }
else if( nchi ==
ONE){
288 residue, scratch, rotamer_bin);
289 }
else if( nchi ==
TWO){
291 residue, scratch, rotamer_bin);
292 }
else if( nchi ==
THREE){
294 residue, scratch, rotamer_bin);
295 }
else if( nchi ==
FOUR){
297 residue, scratch, rotamer_bin);
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;
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));
316 chi_deviations.push_back(
317 periodic_range(chis[chi] - scratch.chimean()[chi], 360));
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);
327 for(
Size chi = 1; chi <= 4; ++chi){
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]);
333 insert_stmt.bind_null(5+chi);
334 insert_stmt.bind_null(9+chi);
335 insert_stmt.bind_null(13+chi);
339 insert_stmt.bind(18, scratch.rotprob());
340 safely_write_to_database(insert_stmt);
347 boost::uuids::uuid struct_id,
348 utility::sql_database::sessionOP db_session
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);