25 #include <basic/database/sql_utils.hh>
26 #include <basic/database/schema_generator/PrimaryKey.hh>
27 #include <basic/database/schema_generator/ForeignKey.hh>
28 #include <basic/database/schema_generator/Column.hh>
29 #include <basic/database/schema_generator/Schema.hh>
32 #include <numeric/xyzVector.hh>
33 #include <numeric/xyz.functions.hh>
34 #include <numeric/sphericalVector.hh>
36 #include <numeric/constants.hh>
39 #include <utility/sql_database/DatabaseSessionManager.hh>
40 #include <utility/vector1.hh>
43 #include <cppdb/frontend.h>
46 #include <boost/uuid/uuid_io.hpp>
56 using std::stringstream;
73 using numeric::dihedral_radians;
74 using numeric::sphericalVector;
75 using numeric::xyz_to_spherical;
76 using numeric::constants::r::pi;
77 using numeric::constants::r::pi_over_2;
78 using numeric::constants::r::pi_over_180;
80 using utility::sql_database::sessionOP;
81 using cppdb::statement;
83 using boost::uuids::uuid;
93 distance_cutoff_(distance_cutoff)
99 distance_cutoff_(src.distance_cutoff_)
110 using namespace basic::database::schema_generator;
112 Column struct_id(
"struct_id",
new DbUUID(),
false);
113 Column q1_site_id(
"q1_site_id",
new DbInteger(),
false);
114 Column q2_site_id(
"q2_site_id",
new DbInteger(),
false);
115 Column q1_charge(
"q1_charge",
new DbInteger(),
false);
116 Column q2_charge(
"q2_charge",
new DbInteger(),
false);
117 Column B1q1q2_angle(
"B1q1q2_angle",
new DbReal(),
false);
118 Column B2q2q1_angle(
"B2q2q1_angle",
new DbReal(),
false);
119 Column q1q2_distance(
"q1q2_distance",
new DbReal(),
false);
120 Column B1q1_torsion(
"B1q1_torsion",
new DbReal(),
false);
121 Column B2q2_torsion(
"B2q2_torsion",
new DbReal(),
false);
124 pkeys.push_back(struct_id);
125 pkeys.push_back(q1_site_id);
126 pkeys.push_back(q2_site_id);
130 fkey_site1_cols.push_back(struct_id);
131 fkey_site1_cols.push_back(q1_site_id);
134 fkey_site1_reference_cols.push_back(
"struct_id");
135 fkey_site1_reference_cols.push_back(
"site_id");
138 fkey_site2_cols.push_back(struct_id);
139 fkey_site2_cols.push_back(q2_site_id);
142 fkey_site2_reference_cols.push_back(
"struct_id");
143 fkey_site2_reference_cols.push_back(
"site_id");
145 Schema charge_charge_pairs(
"charge_charge_pairs", PrimaryKey(pkeys));
146 charge_charge_pairs.add_column(struct_id);
147 charge_charge_pairs.add_column(q1_site_id);
148 charge_charge_pairs.add_column(q2_site_id);
149 charge_charge_pairs.add_column(q1_charge);
150 charge_charge_pairs.add_column(q2_charge);
151 charge_charge_pairs.add_column(B1q1q2_angle);
152 charge_charge_pairs.add_column(B2q2q1_angle);
153 charge_charge_pairs.add_column(q1q2_distance);
154 charge_charge_pairs.add_column(B1q1_torsion);
155 charge_charge_pairs.add_column(B2q2_torsion);
156 charge_charge_pairs.add_foreign_key(
157 ForeignKey(fkey_site1_cols,
"hbond_sites", fkey_site1_reference_cols,
true));
158 charge_charge_pairs.add_foreign_key(
159 ForeignKey(fkey_site2_cols,
"hbond_sites", fkey_site2_reference_cols,
true));
161 charge_charge_pairs.write(db_session);
167 dependencies.push_back(
"ResidueFeatures");
168 dependencies.push_back(
"HBondFeatures");
186 " q1.site_id AS q1_id,\n"
187 " q2.site_id AS q2_id,\n"
188 " CASE q1.is_donor WHEN 1 THEN 1 ELSE -1 END AS q1_charge,\n"
189 " CASE q2.is_donor WHEN 1 THEN 1 ELSE -1 END AS q2_charge,\n"
190 " q1_xyz.atm_x AS q1_x, q1_xyz.atm_y AS q1_y, q1_xyz.atm_z AS q1_z,\n"
191 " q2_xyz.atm_x AS q2_x, q2_xyz.atm_y AS q2_y, q2_xyz.atm_z AS q2_z,\n"
192 " q1_xyz.base_x AS B1_x, q1_xyz.base_y AS B1_y, q1_xyz.base_z AS B1_z,\n"
193 " q2_xyz.base_x AS B2_x, q2_xyz.base_y AS B2_y, q2_xyz.base_z AS B2_z,\n"
194 " q1_xyz.bbase_x AS C1_x, q1_xyz.bbase_y AS C1_y, q1_xyz.bbase_z AS C1_z,\n"
195 " q2_xyz.bbase_x AS C2_x, q2_xyz.bbase_y AS C2_y, q2_xyz.bbase_z AS C2_z\n"
197 " hbond_sites AS q1,\n"
198 " hbond_sites AS q2,\n"
199 " hbond_site_atoms AS q1_xyz,\n"
200 " hbond_site_atoms AS q2_xyz\n"
202 " q1.struct_id = ? AND q2.struct_id = ? AND\n"
203 " q1.resNum < q2.resNum AND\n"
204 " (q1.HBChemType = 'hbacc_CXL' OR\n"
205 " q1.HBChemType = 'hbacc_IMD' OR q1.HBChemType = 'hbacc_IME' OR q1.HBChemType = 'hbdon_IMD' OR q1.HBChemType = 'hbdon_IME' OR\n"
206 " q1.HBChemType = 'hbdon_AMO' OR\n"
207 " q1.HBChemType = 'hbdon_GDE' OR q1.HBChemType = 'hbdon_GDH' ) AND\n"
208 " (q2.HBChemType = 'hbacc_CXL' OR\n"
209 " q2.HBChemType = 'hbacc_IMD' OR q2.HBChemType = 'hbacc_IME' OR q2.HBChemType = 'hbdon_IMD' OR q2.HBChemType = 'hbdon_IME' OR\n"
210 " q2.HBChemType = 'hbdon_AMO' OR\n"
211 " q2.HBChemType = 'hbdon_GDE' OR q2.HBChemType = 'hbdon_GDH' ) AND\n"
212 " q1_xyz.struct_id = q1.struct_id AND\n"
213 " q2_xyz.struct_id = q2.struct_id AND\n"
214 " q1_xyz.site_id = q1.site_id AND\n"
215 " q2_xyz.site_id = q2.site_id;\n";
217 statement hbond_stmt(basic::database::safely_prepare_statement(hbond_string,db_session));
218 hbond_stmt.bind(1,struct_id);
219 hbond_stmt.bind(2,struct_id);
221 result res(basic::database::safely_read_from_database(hbond_stmt));
222 Size q1_site_id, q2_site_id;
232 std::string charge_charge_string =
"INSERT INTO charge_charge_pairs (struct_id, q1_site_id, q2_site_id, q1_charge, q2_charge, B1q1q2_angle, B2q2q1_angle, q1q2_distance, B1q1_torsion, B2q2_torsion) VALUES (?,?,?,?,?,?,?,?,?,?);";
233 statement charge_charge_statement(basic::database::safely_prepare_statement(charge_charge_string,db_session));
237 res >> q1_site_id >> q2_site_id;
238 res >> q1_charge >> q2_charge;
239 res >> q1_x >> q1_y >> q1_z;
240 res >> q2_x >> q2_y >> q2_z;
241 res >> B1_x >> B1_y >> B1_z;
242 res >> B2_x >> B2_y >> B2_z;
243 res >> C1_x >> C1_y >> C1_z;
244 res >> C2_x >> C2_y >> C2_z;
253 Angle const B1q1q2_angle(angle_of(B1, q1, q2));
254 Angle const B2q2q1_angle(angle_of(B2, q2, q1));
255 Distance const q1q2_distance = q1.distance(q2);
256 Angle const B1q1_torsion(dihedral_radians(C1, B1, q1, q2));
257 Angle const B2q2_torsion(dihedral_radians(C2, B2, q2, q1));
266 charge_charge_statement.bind(1,struct_id);
267 charge_charge_statement.bind(2,q1_site_id);
268 charge_charge_statement.bind(3,q2_site_id);
269 charge_charge_statement.bind(4,q1_charge);
270 charge_charge_statement.bind(5,q2_charge);
271 charge_charge_statement.bind(6,B1q1q2_angle);
272 charge_charge_statement.bind(7,B2q2q1_angle);
273 charge_charge_statement.bind(8,q1q2_distance);
274 charge_charge_statement.bind(9,B1q1_torsion);
275 charge_charge_statement.bind(10,B2q2_torsion);
276 basic::database::safely_write_to_database(charge_charge_statement);