18 #include <boost/uuid/uuid.hpp>
19 #include <boost/uuid/uuid_io.hpp>
22 #include <basic/options/option.hh>
23 #include <basic/options/keys/in.OptionKeys.gen.hh>
24 #include <basic/options/keys/inout.OptionKeys.gen.hh>
31 #include <utility/tag/Tag.hh>
34 #include <basic/database/sql_utils.hh>
35 #include <basic/database/schema_generator/PrimaryKey.hh>
36 #include <basic/database/schema_generator/ForeignKey.hh>
37 #include <basic/database/schema_generator/Column.hh>
38 #include <basic/database/schema_generator/Schema.hh>
39 #include <basic/database/schema_generator/Constraint.hh>
40 #include <basic/Tracer.hh>
41 #include <basic/options/option.hh>
42 #include <basic/options/keys/inout.OptionKeys.gen.hh>
44 #include <basic/database/insert_statement_generator/InsertGenerator.hh>
45 #include <basic/database/insert_statement_generator/RowData.hh>
49 #include <utility/vector1.hh>
50 #include <utility/sql_database/DatabaseSessionManager.hh>
51 #include <utility/tools/make_vector.hh>
54 #include <cppdb/frontend.h>
57 #include <boost/foreach.hpp>
58 #define foreach BOOST_FOREACH
63 static basic::Tracer
TR(
"protocols.features.UnrecognizedAtomFeatures");
82 using utility::tools::make_vector;
83 using utility::sql_database::sessionOP;
84 using boost::uuids::uuid;
85 using cppdb::statement;
86 using basic::database::insert_statement_generator::InsertGenerator;
87 using basic::database::insert_statement_generator::RowDataBaseOP;
88 using basic::database::insert_statement_generator::RowData;
91 neighbor_distance_cutoff_(12.0)
93 if(!basic::options::option[basic::options::OptionKeys::in::remember_unrecognized_res]() || !basic::options::option[basic::options::OptionKeys::in::remember_unrecognized_water]()){
94 TR.Warning <<
"Use -in:remember_unrecognized_res and -in:remember_unrecognized_water to locate unrecognized atoms." << endl;
99 Real neighbor_distance_cutoff
101 neighbor_distance_cutoff_(neighbor_distance_cutoff)
108 neighbor_distance_cutoff_(src.neighbor_distance_cutoff_)
131 using namespace basic::database::schema_generator;
133 Column struct_id(
"struct_id",
new DbUUID());
134 Column residue_number(
"residue_number",
new DbInteger());
135 Column name3(
"name3",
new DbText());
136 Column max_temperature(
"max_temperature",
new DbReal());
138 Columns residues_pkey_cols;
139 residues_pkey_cols.push_back(struct_id);
140 residues_pkey_cols.push_back(residue_number);
142 Columns foreign_key_columns;
143 foreign_key_columns.push_back(struct_id);
145 reference_columns.push_back(
"struct_id");
146 ForeignKey foreign_key(foreign_key_columns,
"structures", reference_columns,
true);
148 Schema table(
"unrecognized_residues", PrimaryKey(residues_pkey_cols));
149 table.add_column(name3);
150 table.add_column(max_temperature);
151 table.add_foreign_key(foreign_key);
152 table.write(db_session);
161 using namespace basic::database::schema_generator;
163 Column struct_id(
"struct_id",
new DbUUID());
164 Column residue_number(
"residue_number",
new DbInteger());
165 Column atom_name(
"atom_name",
new DbText());
166 Column coord_x(
"coord_x",
new DbReal());
167 Column coord_y(
"coord_y",
new DbReal());
168 Column coord_z(
"coord_z",
new DbReal());
169 Column temperature(
"temperature",
new DbReal());
171 Columns residues_pkey_cols;
172 residues_pkey_cols.push_back(struct_id);
173 residues_pkey_cols.push_back(residue_number);
174 residues_pkey_cols.push_back(atom_name);
176 Columns foreign_key_columns;
177 foreign_key_columns.push_back(struct_id);
179 reference_columns.push_back(
"struct_id");
180 ForeignKey foreign_key(foreign_key_columns,
"structures", reference_columns,
true);
182 Schema table(
"unrecognized_atoms", PrimaryKey(residues_pkey_cols));
183 table.add_column(coord_x);
184 table.add_column(coord_y);
185 table.add_column(coord_z);
186 table.add_column(temperature);
187 table.add_foreign_key(foreign_key);
188 table.write(db_session);
196 using namespace basic::database::schema_generator;
198 Column struct_id(
"struct_id",
new DbUUID(),
false);
199 Column residue_number(
"residue_number",
new DbInteger(),
false);
200 Column unrecognized_residue_number(
"unrecognized_residue_number",
new DbReal(),
false);
201 Column closest_contact(
"closest_contact",
new DbReal(),
false);
203 Columns primary_key_columns;
204 primary_key_columns.push_back(struct_id);
205 primary_key_columns.push_back(residue_number);
206 PrimaryKey primary_key(primary_key_columns);
208 Columns foreign_key_columns;
209 foreign_key_columns.push_back(struct_id);
210 foreign_key_columns.push_back(residue_number);
212 reference_columns.push_back(
"struct_id");
213 reference_columns.push_back(
"resNum");
214 ForeignKey foreign_key(foreign_key_columns,
"residues", reference_columns,
true);
218 Schema table(
"unrecognized_neighbors", primary_key);
219 table.add_column(unrecognized_residue_number);
220 table.add_column(closest_contact);
221 table.add_foreign_key(foreign_key);
222 table.write(db_session);
229 dependencies.push_back(
"StructureFeatures");
230 dependencies.push_back(
"ResidueFeatures");
249 boost::uuids::uuid
const struct_id,
262 boost::uuids::uuid
const struct_id,
266 if(!pdb_info)
return;
269 InsertGenerator insert_generator(
"unrecognized_residues");
270 insert_generator.add_column(
"struct_id");
271 insert_generator.add_column(
"residue_number");
272 insert_generator.add_column(
"name3");
273 insert_generator.add_column(
"max_temperature");
275 RowDataBaseOP struct_id_data =
new RowData<boost::uuids::uuid>(
"struct_id", struct_id);
277 map< Size, UnrecognizedAtomRecord const * > ur_found;
281 ua(pdb_info->get_unrecognized_atoms().begin()),
282 ua_end(pdb_info->get_unrecognized_atoms().end());
284 map< Size, UnrecognizedAtomRecord const * >::const_iterator
285 i(ur_found.find(ua->res_num()));
286 if( i == ur_found.end()){
287 ur_found[ua->res_num()] = &(*ua);
289 if (i->second->temp() > ua->temp()){
290 ur_found[ua->res_num()] = &(*ua);
296 map<Size, UnrecognizedAtomRecord const * >::const_iterator
297 i = ur_found.begin(), ie = ur_found.end();
302 insert_generator.add_row(
305 RowDataBaseOP(
new RowData<Size>(
"residue_number", ua.
res_num())),
306 RowDataBaseOP(
new RowData<string>(
"name3", ua.
res_name())),
307 RowDataBaseOP(
new RowData<Real>(
"max_temperature", ua.
temp()))));
310 insert_generator.write_to_database(db_session);
317 uuid
const struct_id,
321 if(!pdb_info)
return;
324 InsertGenerator insert_generator(
"unrecognized_atoms");
325 insert_generator.add_column(
"struct_id");
326 insert_generator.add_column(
"residue_number");
327 insert_generator.add_column(
"atom_name");
328 insert_generator.add_column(
"coord_x");
329 insert_generator.add_column(
"coord_y");
330 insert_generator.add_column(
"coord_z");
331 insert_generator.add_column(
"temperature");
333 RowDataBaseOP struct_id_data =
new RowData<uuid>(
"struct_id", struct_id);
337 insert_generator.add_row(
340 RowDataBaseOP(
new RowData<Size>(
"residue_number", ua.
res_num())),
341 RowDataBaseOP(
new RowData<string>(
"atom_name", ua.
atom_name())),
342 RowDataBaseOP(
new RowData<Real>(
"coord_x", ua.
coords().x())),
343 RowDataBaseOP(
new RowData<Real>(
"coord_y", ua.
coords().y())),
344 RowDataBaseOP(
new RowData<Real>(
"coord_z", ua.
coords().z())),
345 RowDataBaseOP(
new RowData<Real>(
"temperature", ua.
temp()))));
349 insert_generator.write_to_database(db_session);
356 uuid
const struct_id,
360 if(!pdb_info)
return;
363 InsertGenerator insert_generator(
"unrecognized_neighbors");
364 insert_generator.add_column(
"struct_id");
365 insert_generator.add_column(
"residue_number");
366 insert_generator.add_column(
"unrecognized_residue_number");
367 insert_generator.add_column(
"closest_contact");
369 RowDataBaseOP struct_id_data =
new RowData<uuid>(
"struct_id", struct_id);
371 map< Size, pair< Size, Real > > closest_contact;
375 if(!relevant_residues[resNum])
continue;
378 Size closest_ua_resNum(0);
379 Distance closest_ua_distance(10000000);
384 ua_distance < closest_ua_distance){
385 closest_ua_resNum = ua.
res_num();
386 closest_ua_distance = ua_distance;
390 insert_generator.add_row(
393 RowDataBaseOP(
new RowData<Size>(
"residue_number", resNum)),
395 new RowData<Size>(
"unrecognized_residue_number", closest_ua_resNum)),
397 new RowData<Distance>(
"closest_contact", closest_ua_distance))));
401 insert_generator.write_to_database(db_session);
407 boost::uuids::uuid struct_id,
408 sessionOP db_session) {