18 #include <boost/uuid/uuid.hpp>
19 #include <boost/uuid/uuid_io.hpp>
31 #include <numeric/xyzVector.hh>
32 #include <utility/vector1.hh>
33 #include <utility/sql_database/DatabaseSessionManager.hh>
34 #include <utility/string_util.hh>
35 #include <utility/tools/make_vector.hh>
38 #include <basic/database/sql_utils.hh>
39 #include <basic/Tracer.hh>
40 #include <basic/database/schema_generator/PrimaryKey.hh>
41 #include <basic/database/schema_generator/ForeignKey.hh>
42 #include <basic/database/schema_generator/Column.hh>
43 #include <basic/database/schema_generator/Schema.hh>
44 #include <basic/database/schema_generator/Constraint.hh>
45 #include <basic/options/option.hh>
46 #include <basic/options/keys/out.OptionKeys.gen.hh>
47 #include <basic/options/keys/inout.OptionKeys.gen.hh>
48 #include <basic/database/insert_statement_generator/InsertGenerator.hh>
49 #include <basic/database/insert_statement_generator/RowData.hh>
53 #include <cppdb/frontend.h>
62 static basic::Tracer
TR(
"protocols.features.ProteinResidueConformationFeatures");
72 using utility::sql_database::sessionOP;
74 using cppdb::statement;
76 using basic::database::insert_statement_generator::InsertGenerator;
77 using basic::database::insert_statement_generator::RowDataBaseOP;
78 using basic::database::insert_statement_generator::RowData;
82 return "ProteinResidueConformationFeatures";
88 using namespace basic::database::schema_generator;
91 Column struct_id(
"struct_id",
new DbUUID(),
false);
92 Column seqpos(
"seqpos",
new DbInteger(),
false);
93 Column secstruct(
"secstruct",
new DbText(),
false);
94 Column
phi(
"phi",
new DbDouble(),
false);
95 Column
psi(
"psi",
new DbDouble(),
false);
96 Column
omega(
"omega",
new DbDouble(),
false);
97 Column chi1(
"chi1",
new DbDouble(),
false);
98 Column chi2(
"chi2",
new DbDouble(),
false);
99 Column chi3(
"chi3",
new DbDouble(),
false);
100 Column chi4(
"chi4",
new DbDouble(),
false);
104 prot_res_pkeys.push_back(struct_id);
105 prot_res_pkeys.push_back(seqpos);
108 fkey_cols.push_back(struct_id);
109 fkey_cols.push_back(seqpos);
112 fkey_reference_cols.push_back(
"struct_id");
113 fkey_reference_cols.push_back(
"resNum");
115 Schema protein_residue_conformation(
"protein_residue_conformation", PrimaryKey(prot_res_pkeys));
116 protein_residue_conformation.add_column(struct_id);
117 protein_residue_conformation.add_column(seqpos);
118 protein_residue_conformation.add_column(secstruct);
119 protein_residue_conformation.add_column(phi);
120 protein_residue_conformation.add_column(psi);
121 protein_residue_conformation.add_column(omega);
122 protein_residue_conformation.add_column(chi1);
123 protein_residue_conformation.add_column(chi2);
124 protein_residue_conformation.add_column(chi3);
125 protein_residue_conformation.add_column(chi4);
126 protein_residue_conformation.add_foreign_key(ForeignKey(fkey_cols,
"residues", fkey_reference_cols,
true));
128 protein_residue_conformation.write(db_session);
131 Column atomno(
"atomno",
new DbInteger(),
false);
132 Column x(
"x",
new DbDouble(),
false);
133 Column y(
"y",
new DbDouble(),
false);
134 Column z(
"z",
new DbDouble(),
false);
137 res_atm_coords_pkeys.push_back(struct_id);
138 res_atm_coords_pkeys.push_back(seqpos);
139 res_atm_coords_pkeys.push_back(atomno);
141 Schema residue_atom_coords(
"residue_atom_coords", PrimaryKey(res_atm_coords_pkeys));
142 residue_atom_coords.add_column(struct_id);
143 residue_atom_coords.add_column(seqpos);
144 residue_atom_coords.add_column(atomno);
145 residue_atom_coords.add_column(x);
146 residue_atom_coords.add_column(y);
147 residue_atom_coords.add_column(z);
148 residue_atom_coords.add_foreign_key(ForeignKey(fkey_cols,
"residues", fkey_reference_cols,
true));
150 residue_atom_coords.write(db_session);
157 dependencies.push_back(
"ResidueFeatures");
166 boost::uuids::uuid struct_id,
173 if(!basic::options::option[basic::options::OptionKeys::out::file::force_nonideal_structure]())
177 if(!relevant_residues[resn])
continue;
189 InsertGenerator conformation_insert(
"protein_residue_conformation");
190 conformation_insert.add_column(
"struct_id");
191 conformation_insert.add_column(
"seqpos");
192 conformation_insert.add_column(
"secstruct");
193 conformation_insert.add_column(
"phi");
194 conformation_insert.add_column(
"psi");
195 conformation_insert.add_column(
"omega");
196 conformation_insert.add_column(
"chi1");
197 conformation_insert.add_column(
"chi2");
198 conformation_insert.add_column(
"chi3");
199 conformation_insert.add_column(
"chi4");
201 InsertGenerator atom_insert(
"residue_atom_coords");
202 atom_insert.add_column(
"struct_id");
203 atom_insert.add_column(
"seqpos");
204 atom_insert.add_column(
"atomno");
205 atom_insert.add_column(
"x");
206 atom_insert.add_column(
"y");
207 atom_insert.add_column(
"z");
209 RowDataBaseOP struct_id_data =
new RowData<boost::uuids::uuid>(
"struct_id",struct_id);
212 if(!relevant_residues[i])
continue;
235 Real chi1 = fullatom && resi.
nchi() >= 1 ? resi.
chi(1) : 0.0;
236 Real chi2 = fullatom && resi.
nchi() >= 2 ? resi.
chi(2) : 0.0;
237 Real chi3 = fullatom && resi.
nchi() >= 3 ? resi.
chi(3) : 0.0;
238 Real chi4 = fullatom && resi.
nchi() >= 4 ? resi.
chi(4) : 0.0;
240 RowDataBaseOP seqpos_data =
new RowData<Size>(
"seqpos",i);
241 RowDataBaseOP secstruct_data =
new RowData<std::string>(
"secstruct",secstruct);
242 RowDataBaseOP phi_data =
new RowData<Real>(
"phi",
phi);
243 RowDataBaseOP psi_data =
new RowData<Real>(
"psi",
psi);
244 RowDataBaseOP omega_data =
new RowData<Real>(
"omega",
omega);
245 RowDataBaseOP chi1_data =
new RowData<Real>(
"chi1",chi1);
246 RowDataBaseOP chi2_data =
new RowData<Real>(
"chi2",chi2);
247 RowDataBaseOP chi3_data =
new RowData<Real>(
"chi3",chi3);
248 RowDataBaseOP chi4_data =
new RowData<Real>(
"chi4",chi4);
251 conformation_insert.add_row(utility::tools::make_vector(
252 struct_id_data,seqpos_data,secstruct_data,phi_data,
253 psi_data,omega_data,chi1_data,chi2_data,chi3_data,chi4_data));
257 for(
Size atom = 1; atom <= resi.
natoms(); ++atom)
261 RowDataBaseOP atomno_data =
new RowData<Size>(
"atomno",atom);
262 RowDataBaseOP x_data =
new RowData<Real>(
"x",coords.x());
263 RowDataBaseOP y_data =
new RowData<Real>(
"y",coords.y());
264 RowDataBaseOP z_data =
new RowData<Real>(
"z",coords.z());
266 atom_insert.add_row(utility::tools::make_vector(
267 struct_id_data,seqpos_data,atomno_data,x_data,y_data,z_data));
273 conformation_insert.write_to_database(db_session);
274 atom_insert.write_to_database(db_session);
281 boost::uuids::uuid struct_id,
282 utility::sql_database::sessionOP db_session
286 statement conf_stmt(basic::database::safely_prepare_statement(
"DELETE FROM protein_residue_conformation WHERE struct_id = ?;\n",db_session));
287 conf_stmt.bind(1,struct_id);
288 basic::database::safely_write_to_database(conf_stmt);
289 statement atom_stmt(basic::database::safely_prepare_statement(
"DELETE FROM residue_atom_coords WHERE struct_id = ?;\n",db_session));
290 atom_stmt.bind(1,struct_id);
291 basic::database::safely_write_to_database(atom_stmt);
298 sessionOP db_session,
299 boost::uuids::uuid struct_id,
307 sessionOP db_session,
308 boost::uuids::uuid struct_id,
312 if(!basic::database::table_exists(db_session,
"protein_residue_conformation")){
313 TR <<
"WARNING: protein_residue_conformation table does not exist and thus respective data will not be added to the pose!" << std::endl;
333 " protein_residue_conformation\n"
335 " protein_residue_conformation.struct_id=?;";
336 statement stmt(basic::database::safely_prepare_statement(statement_string,db_session));
338 stmt.bind(1,struct_id);
340 result res(basic::database::safely_read_from_database(stmt));
346 res >> seqpos >> secstruct >> phi >> psi >> omega >> chi1 >> chi2 >> chi3 >> chi4 ;
351 if(!(phi < 0.00001 && psi < 0.00001 && omega < 0.00001) )
359 if(1 <= nchi) pose.
set_chi(1, seqpos, chi1);
360 if(2 <= nchi) pose.
set_chi(2, seqpos, chi2);
361 if(3 <= nchi) pose.
set_chi(3, seqpos, chi3);
362 if(4 <= nchi) pose.
set_chi(4, seqpos, chi4);
397 sessionOP db_session,
398 boost::uuids::uuid struct_id,
414 " residue_atom_coords\n"
416 " residue_atom_coords.struct_id=?;";
417 statement stmt(basic::database::safely_prepare_statement(statement_string,db_session));
419 stmt.bind(1,struct_id);
421 result res(basic::database::safely_read_from_database(stmt));
429 res >> seqpos >> atomno >> x >> y >> z;
431 atom_ids.push_back(
AtomID(atomno, seqpos));
432 coords.push_back(
Vector(x,y,z));