27 #include <utility/sql_database/DatabaseSessionManager.hh>
28 #include <utility/vector1.hh>
29 #include <basic/database/sql_utils.hh>
30 #include <basic/database/schema_generator/PrimaryKey.hh>
31 #include <basic/database/schema_generator/ForeignKey.hh>
32 #include <basic/database/schema_generator/Column.hh>
33 #include <basic/database/schema_generator/Schema.hh>
36 #include <ObjexxFCL/FArray5D.hh>
39 #include <numeric/xyzVector.hh>
42 #include <cppdb/frontend.h>
43 #include <boost/uuid/uuid_io.hpp>
59 using ObjexxFCL::FArray5D;
60 using utility::sql_database::sessionOP;
62 using cppdb::statement;
86 using namespace basic::database::schema_generator;
88 Column struct_id(
"struct_id",
new DbUUID());
89 Column residue_type1(
"residue_type1",
new DbText());
90 Column atom_type1(
"atom_type1",
new DbText());
91 Column residue_type2(
"residue_type2",
new DbText());
92 Column atom_type2(
"atom_type2",
new DbText());
93 Column distance_bin(
"distance_bin",
new DbText());
94 Column count(
"count",
new DbInteger());
96 Columns primary_key_columns;
97 primary_key_columns.push_back(struct_id);
98 primary_key_columns.push_back(residue_type1);
99 primary_key_columns.push_back(atom_type1);
100 primary_key_columns.push_back(residue_type2);
101 primary_key_columns.push_back(atom_type2);
102 primary_key_columns.push_back(distance_bin);
103 PrimaryKey primary_key(primary_key_columns);
105 Columns foreign_key_columns;
106 foreign_key_columns.push_back(struct_id);
108 reference_columns.push_back(
"struct_id");
109 ForeignKey foreign_key(foreign_key_columns,
"structures", reference_columns,
true);
111 GreaterThanConstraintOP count_is_non_negative(
new GreaterThanConstraint(count, 0));
113 Schema table(
"atom_in_residue_pairs", primary_key);
114 table.add_foreign_key(foreign_key);
115 table.add_constraint(count_is_non_negative);
116 table.add_column(count);
118 table.write(db_session);
125 dependencies.push_back(
"ResidueFeatures");
133 boost::uuids::uuid
const struct_id,
160 boost::uuids::uuid
const struct_id,
170 Size const max_atm(30);
171 Size const dist_bins(15);
172 FArray5D< Size > counts;
173 counts.dimension(max_res, max_atm, max_res, max_atm, dist_bins, 1);
180 if(!relevant_residues[resNum1])
continue;
183 ir = tenA.get_node( resNum1 )->const_edge_list_begin(),
186 Size resNum2( (*ir)->get_other_ind(resNum1) );
187 if(!relevant_residues[resNum2])
continue;
191 for(
Size atmNum1=1; atmNum1 <= res1.natoms(); ++atmNum1){
192 Vector const & atm1_xyz( res1.xyz(atmNum1) );
194 for(
Size atmNum2=1; atmNum2 <= res2.natoms(); ++atmNum2){
195 Vector const & atm2_xyz( res2.xyz(atmNum2) );
197 Size const dist_bin(static_cast<Size>(ceil(atm1_xyz.distance(atm2_xyz))));
199 counts(res1.aa(), atmNum1, res2.aa(), atmNum2, dist_bin) += 1;
206 std::string stmt_string =
"INSERT INTO atom_in_residue_pairs (struct_id, residue_type1, atom_type1, residue_type2, atom_type2, distance_bin, count) VALUES (?,?,?,?,?,?,?);";
207 cppdb::statement stmt(basic::database::safely_prepare_statement(stmt_string,db_session));
209 for(
Size aa1=1; aa1 <= max_res; ++aa1){
210 for(
Size aa2=1; aa2 <= max_res; ++aa2){
211 for(
Size atmNum1=1; atmNum1 <= max_atm; ++atmNum1){
212 for(
Size atmNum2=1; atmNum2 <= max_atm; ++atmNum2){
213 for(
Size dist_bin=1; dist_bin <= 15; ++dist_bin){
214 Size const count(counts(aa1, atmNum1, aa2, atmNum2, dist_bin));
215 stmt.bind(1,struct_id);
217 stmt.bind(3,atmNum1);
219 stmt.bind(5,atmNum2);
220 stmt.bind(6,dist_bin);
222 basic::database::safely_write_to_database(stmt);