18 #include <cppdb/frontend.h>
19 #include <boost/uuid/uuid.hpp>
20 #include <boost/uuid/uuid_io.hpp>
30 #include <basic/options/option.hh>
31 #include <basic/options/keys/inout.OptionKeys.gen.hh>
32 #include <basic/database/sql_utils.hh>
35 #include <numeric/xyzVector.hh>
36 #include <numeric/xyz.functions.hh>
37 #include <numeric/sphericalVector.hh>
39 #include <numeric/constants.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>
47 #include <utility/sql_database/DatabaseSessionManager.hh>
48 #include <utility/vector1.hh>
58 using std::stringstream;
74 using numeric::dihedral_radians;
75 using numeric::sphericalVector;
76 using numeric::xyz_to_spherical;
77 using numeric::constants::r::pi;
78 using numeric::constants::r::pi_over_2;
79 using numeric::constants::r::pi_over_180;
81 using utility::sql_database::sessionOP;
82 using cppdb::statement;
93 distance_cutoff_(distance_cutoff)
99 distance_cutoff_(src.distance_cutoff_)
116 using namespace basic::database::schema_generator;
118 Column struct_id(
"struct_id",
new DbUUID());
119 Column don_resNum(
"don_resNum",
new DbInteger());
120 Column acc_id(
"acc_id",
new DbInteger());
121 Column
psi(
"psi",
new DbReal());
122 Column theta(
"theta",
new DbReal());
123 Column rho(
"rho",
new DbReal());
124 Column orbital(
"orbital",
new DbText());
126 Columns primary_key_columns;
127 primary_key_columns.push_back(struct_id);
128 primary_key_columns.push_back(don_resNum);
129 primary_key_columns.push_back(acc_id);
130 PrimaryKey primary_key(primary_key_columns);
132 Columns foreign_key_columns1;
133 foreign_key_columns1.push_back(struct_id);
134 foreign_key_columns1.push_back(don_resNum);
136 reference_columns1.push_back(
"struct_id");
137 reference_columns1.push_back(
"resNum");
138 ForeignKey foreign_key1(foreign_key_columns1,
"residues", reference_columns1,
true);
140 Columns foreign_key_columns2;
141 foreign_key_columns2.push_back(struct_id);
142 foreign_key_columns2.push_back(acc_id);
144 reference_columns2.push_back(
"struct_id");
145 reference_columns2.push_back(
"site_id");
146 ForeignKey foreign_key2(foreign_key_columns2,
"hbond_sites", reference_columns2,
true);
148 Schema table(
"salt_bridges", primary_key);
149 table.add_foreign_key(foreign_key1);
150 table.add_foreign_key(foreign_key2);
151 table.add_column(psi);
152 table.add_column(theta);
153 table.add_column(rho);
154 table.add_column(orbital);
156 table.write(db_session);
163 dependencies.push_back(
"ResidueFeatures");
164 dependencies.push_back(
"HBondFeatures");
176 boost::uuids::uuid struct_id,
186 " acc.site_id, acc.resNum, acc.atmNum, don.resNum\n"
188 " hbond_sites AS acc, residues AS don\n"
190 " don.struct_id = ? AND acc.struct_id = ? AND\n"
191 " (don.name3 = 'ARG' OR don.name3 = 'LYS' OR don.name3 = 'HIS') AND\n"
192 " (acc.HBChemType = 'hbacc_CXA' OR acc.HBChemType = 'hbacc_CXL');\n";
193 statement hbond_stmt(basic::database::safely_prepare_statement(hbond_string,db_session));
194 hbond_stmt.bind(1,struct_id);
195 hbond_stmt.bind(2,struct_id);
197 result res(basic::database::safely_read_from_database(hbond_stmt));
198 Size acc_site_id, acc_resNum, acc_atmNum, don_resNum;
201 sphericalVector<Real> local_o;
204 std::string salt_bridge_string =
"INSERT INTO salt_bridges (struct_id, don_resNum, acc_id, psi, theta, rho, orbital) VALUES (?,?,?,?,?,?,?)";
205 statement salt_bridge_statement(basic::database::safely_prepare_statement(salt_bridge_string,db_session));
209 res >> acc_site_id >> acc_resNum >> acc_atmNum >> don_resNum;
222 n = d.atom(d.atom_index(
" NZ ")).
xyz();
223 c = d.atom(d.atom_index(
" NZ ")).
xyz();
227 bb = d.atom(d.atom_index(
" CD ")).
xyz();
228 b = d.atom(d.atom_index(
" CE ")).
xyz();
230 psi = dihedral_radians(bb, b, c, o);
231 theta = angle_of(b, c, o) - pi/2;
234 n = d.atom(d.atom_index(
" ND1")).
xyz();
236 c = (n + d.atom(d.atom_index(
" NE2")).
xyz())/2;
240 b = d.atom(d.atom_index(
" CG ")).
xyz();
243 psi = local_o.phi()*pi_over_180;
244 theta = local_o.theta()*pi_over_180 - pi_over_2;
247 c = d.atom(d.atom_index(
" CZ ")).
xyz();
251 b = d.atom(d.atom_index(
" NE ")).
xyz();
258 n = n0.distance(o) < n1.distance(o) ?
259 (n0.distance(o) < n2.distance(o) ? n0 : n2) :
260 (n1.distance(o) < n2.distance(o) ? n1 : n2);
266 psi = local_o.phi()*pi_over_180;
267 theta = local_o.theta()*pi_over_180 - pi_over_2;
270 stringstream err_msg;
272 <<
"Unrecognized salt bridging donor group on rsd: (" << d.name3() <<
", " << don_resNum <<
")" << endl;
273 utility_exit_with_message(err_msg.str());
277 PointPosition const & obb = a.atom(a.atom_base(a.atom_base(acc_atmNum))).xyz();
278 Angle const hb_chi(dihedral_radians(obb, ob, o, n));
279 string const orbital((hb_chi < pi_over_2 && hb_chi > -pi_over_2) ?
"anti" :
"syn");
281 salt_bridge_statement.bind(1,struct_id);
282 salt_bridge_statement.bind(2,don_resNum);
283 salt_bridge_statement.bind(3,acc_site_id);
284 salt_bridge_statement.bind(4,
psi);
285 salt_bridge_statement.bind(5,theta);
286 salt_bridge_statement.bind(6,rho);
287 salt_bridge_statement.bind(7,orbital);
288 basic::database::safely_write_to_database(salt_bridge_statement);