18 #include <basic/Tracer.hh>
31 #include <utility/sql_database/DatabaseSessionManager.hh>
32 #include <utility/tag/Tag.hh>
33 #include <utility/vector1.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>
43 #include <ObjexxFCL/FArray3D.hh>
46 #include <numeric/xyzVector.hh>
49 #include <cppdb/frontend.h>
50 #include <boost/uuid/uuid_io.hpp>
54 #include <utility/excn/Exceptions.hh>
63 using std::upper_bound;
80 using utility::sql_database::sessionOP;
83 using basic::database::safely_write_to_database;
84 using basic::database::safely_prepare_statement;
85 using ObjexxFCL::FArray3D;
86 using cppdb::statement;
88 static Tracer
TR(
"protocols.features.AtomAtomPairFeatures");
137 min_dist_(src.min_dist_),
138 max_dist_(src.max_dist_),
140 relevant_atom_names_(src.relevant_atom_names_),
141 atom_index_to_relevant_atom_index_(src.atom_index_to_relevant_atom_index_),
142 relevant_elements_(src.relevant_elements_)
161 using namespace basic::database::schema_generator;
163 Column struct_id(
"struct_id",
new DbUUID());
164 Column atom_type(
"atom_type",
new DbText());
165 Column element(
"element",
new DbText());
166 Column lower_break(
"lower_break",
new DbReal());
167 Column upper_break(
"upper_break",
new DbReal());
168 Column count(
"count",
new DbInteger());
170 Columns primary_key_columns;
171 primary_key_columns.push_back(struct_id);
172 primary_key_columns.push_back(atom_type);
173 primary_key_columns.push_back(element);
174 primary_key_columns.push_back(lower_break);
175 PrimaryKey primary_key(primary_key_columns);
177 Columns foreign_key_columns;
178 foreign_key_columns.push_back(struct_id);
180 reference_columns.push_back(
"struct_id");
181 ForeignKey foreign_key(foreign_key_columns,
"structures", reference_columns,
true);
183 Schema table(
"atom_pairs", primary_key);
184 table.add_foreign_key(foreign_key);
185 table.add_column(upper_break);
186 table.add_column(count);
188 table.write(db_session);
194 dependencies.push_back(
"StructureFeatures");
210 throw utility::excn::EXCN_RosettaScriptsOption(
"The parameter 'nbins' must be an integer greater than 0.");
219 boost::uuids::uuid
const struct_id,
231 boost::uuids::uuid
const struct_id,
246 <<
"Currently AtomAtomPairFeatures only works "
247 <<
"for the 'fa_standard' AtomTypeSet. This pose has AtomTypeSet '"
256 bin_breaks.push_back(i*bin_width +
min_dist_);
262 Size const initial_value(0);
263 FArray3D< Size > counts;
264 counts.dimension(dim1, dim2, dim3, initial_value);
267 if(!relevant_residues[res_num1])
continue;
270 for(
Size atom_num1=1; atom_num1 <= res1.natoms(); ++atom_num1){
271 Vector const & atom1_xyz( res1.xyz(atom_num1) );
273 Size const atom_index1(res1.type().atom(atom_num1).atom_type_index());
274 map<Size, Size>::const_iterator
const i_relevant_atom_index1(
281 if(!relevant_residues[res_num2])
continue;
284 for(
Size atom_num2=1; atom_num2 <= res2.natoms(); ++atom_num2){
285 string const elem_name2(res2.type().atom_type(atom_num2).element());
286 map< string, Size>::const_iterator i_elem2(
290 Vector const & atom2_xyz( res2.xyz(atom_num2) );
291 Distance dist(atom1_xyz.distance(atom2_xyz));
292 if(dist <= min_dist_ || dist >
max_dist_)
continue;
296 static_cast<Size>(ceil(
298 counts(i_relevant_atom_index1->second, i_elem2->second, dist_bin) += 1;
304 string stmt_string =
"INSERT INTO atom_pairs (struct_id, atom_type, element, lower_break, upper_break, count) VALUES (?,?,?,?,?,?);";
305 statement stmt(safely_prepare_statement(stmt_string,db_session));
309 for(map<string, Size>::const_iterator
312 for(
Size dist_bin=1; dist_bin <=
nbins_; ++dist_bin){
313 Real const lower_break(
min_dist_ + (dist_bin - 1)*bin_width);
315 Size const count(counts(i_atom1,i_elem2->second, dist_bin));
316 stmt.bind(1,struct_id);
318 stmt.bind(3, i_elem2->first);
319 stmt.bind(4, lower_break);
320 stmt.bind(5, upper_break);
322 safely_write_to_database(stmt);