21 #include <utility/sql_database/DatabaseSessionManager.hh>
22 #include <utility/vector1.hh>
23 #include <basic/database/sql_utils.hh>
24 #include <basic/options/option.hh>
25 #include <basic/options/keys/score.OptionKeys.gen.hh>
26 #include <numeric/xyz.functions.hh>
30 #include <basic/basic.hh>
31 #include <basic/Tracer.hh>
32 #include <basic/database/schema_generator/PrimaryKey.hh>
33 #include <basic/database/schema_generator/ForeignKey.hh>
34 #include <basic/database/schema_generator/Column.hh>
35 #include <basic/database/schema_generator/Schema.hh>
43 #include <cppdb/frontend.h>
44 #include <boost/uuid/uuid.hpp>
45 #include <boost/lexical_cast.hpp>
46 #include <boost/uuid/uuid_io.hpp>
52 using cppdb::statement;
58 using utility::sql_database::sessionOP;
60 static basic::Tracer
TR(
"protocols.features.ProteinBondGeometry");
65 basic::options::option[ basic::options::OptionKeys::score::linear_bonded_potential ]();
96 using namespace basic::database::schema_generator;
98 Column struct_id(
"struct_id",
new DbUUID(),
false);
99 Column resNum(
"resNum",
new DbInteger(),
false);
100 Column cenAtmNum(
"cenAtmNum",
new DbInteger(),
false);
101 Column outAtm1Num(
"outAtm1Num",
new DbInteger(),
false);
102 Column outAtm2Num(
"outAtm2Num",
new DbInteger(),
false);
103 Column cenAtmName(
"cenAtmName",
new DbText(),
false);
104 Column outAtm1Name(
"outAtm1Name",
new DbText(),
false);
105 Column outAtm2Name(
"outAtm2Name",
new DbText(),
false);
106 Column ideal(
"ideal",
new DbReal());
107 Column observed(
"observed",
new DbReal());
108 Column difference(
"difference",
new DbReal());
109 Column energy(
"energy",
new DbReal());
111 Columns primary_key_columns;
112 primary_key_columns.push_back(struct_id);
113 primary_key_columns.push_back(resNum);
114 primary_key_columns.push_back(cenAtmNum);
115 primary_key_columns.push_back(outAtm1Num);
116 primary_key_columns.push_back(outAtm2Num);
117 PrimaryKey primary_key(primary_key_columns);
119 Columns foreign_key_columns;
120 foreign_key_columns.push_back(struct_id);
121 foreign_key_columns.push_back(resNum);
123 reference_columns.push_back(
"struct_id");
124 reference_columns.push_back(
"resNum");
125 ForeignKey foreign_key(foreign_key_columns,
"residues", reference_columns,
true);
127 Schema table(
"bond_intrares_angles", primary_key);
128 table.add_foreign_key(foreign_key);
129 table.add_column(cenAtmName);
130 table.add_column(outAtm1Name);
131 table.add_column(outAtm2Name);
132 table.add_column(ideal);
133 table.add_column(observed);
134 table.add_column(difference);
135 table.add_column(energy);
137 table.write(db_session);
144 using namespace basic::database::schema_generator;
146 Column struct_id(
"struct_id",
new DbUUID(),
false);
147 Column cenResNum(
"cenresNum",
new DbInteger(),
false);
148 Column connResNum(
"connResNum",
new DbInteger(),
false);
149 Column cenAtmNum(
"cenAtmNum",
new DbInteger(),
false);
150 Column outAtmCenNum(
"outAtmCenNum",
new DbInteger(),
false);
151 Column outAtmConnNum(
"outAtmConnNum",
new DbInteger(),
false);
152 Column cenAtmName(
"cenAtmName",
new DbText(),
false);
153 Column outAtmCenName(
"outAtmCenName",
new DbText(),
false);
154 Column outAtmConnName(
"outAtmConnName",
new DbText(),
false);
155 Column ideal(
"ideal",
new DbReal());
156 Column observed(
"observed",
new DbReal());
157 Column difference(
"difference",
new DbReal());
158 Column energy(
"energy",
new DbReal());
160 Columns primary_key_columns;
161 primary_key_columns.push_back(struct_id);
162 primary_key_columns.push_back(cenResNum);
163 primary_key_columns.push_back(connResNum);
164 primary_key_columns.push_back(cenAtmNum);
165 primary_key_columns.push_back(outAtmCenNum);
166 primary_key_columns.push_back(outAtmConnNum);
167 PrimaryKey primary_key(primary_key_columns);
169 Columns foreign_key_columns;
170 foreign_key_columns.push_back(struct_id);
171 foreign_key_columns.push_back(cenResNum);
173 reference_columns.push_back(
"struct_id");
174 reference_columns.push_back(
"resNum");
175 ForeignKey foreign_key(foreign_key_columns,
"residues", reference_columns,
true);
177 Schema table(
"bond_interres_angles", primary_key);
178 table.add_foreign_key(foreign_key);
179 table.add_column(cenAtmName);
180 table.add_column(outAtmCenName);
181 table.add_column(outAtmConnName);
182 table.add_column(ideal);
183 table.add_column(observed);
184 table.add_column(difference);
185 table.add_column(energy);
187 table.write(db_session);
194 using namespace basic::database::schema_generator;
196 Column struct_id(
"struct_id",
new DbUUID(),
false);
197 Column resNum(
"resNum",
new DbInteger(),
false);
198 Column atm1Num(
"atm1Num",
new DbInteger(),
false);
199 Column atm2Num(
"atm2Num",
new DbInteger(),
false);
200 Column atm1Name(
"atm1Name",
new DbText(),
false);
201 Column atm2Name(
"atm2Name",
new DbText(),
false);
202 Column ideal(
"ideal",
new DbReal());
203 Column observed(
"observed",
new DbReal());
204 Column difference(
"difference",
new DbReal());
205 Column energy(
"energy",
new DbReal());
207 Columns primary_key_columns;
208 primary_key_columns.push_back(struct_id);
209 primary_key_columns.push_back(resNum);
210 primary_key_columns.push_back(atm1Num);
211 primary_key_columns.push_back(atm2Num);
212 PrimaryKey primary_key(primary_key_columns);
214 Columns foreign_key_columns;
215 foreign_key_columns.push_back(struct_id);
216 foreign_key_columns.push_back(resNum);
218 reference_columns.push_back(
"struct_id");
219 reference_columns.push_back(
"resNum");
220 ForeignKey foreign_key(foreign_key_columns,
"residues", reference_columns,
true);
222 Schema table(
"bond_intrares_lengths", primary_key);
223 table.add_foreign_key(foreign_key);
224 table.add_column(atm1Name);
225 table.add_column(atm2Name);
226 table.add_column(ideal);
227 table.add_column(observed);
228 table.add_column(difference);
229 table.add_column(energy);
231 table.write(db_session);
238 using namespace basic::database::schema_generator;
240 Column struct_id(
"struct_id",
new DbUUID(),
false);
241 Column res1Num(
"res1Num",
new DbInteger(),
false);
242 Column res2Num(
"res2Num",
new DbInteger(),
false);
243 Column atm1Num(
"atm1Num",
new DbInteger(),
false);
244 Column atm2Num(
"atm2Num",
new DbInteger(),
false);
245 Column atm1Name(
"atm1Name",
new DbText(),
false);
246 Column atm2Name(
"atm2Name",
new DbText(),
false);
247 Column ideal(
"ideal",
new DbReal());
248 Column observed(
"observed",
new DbReal());
249 Column difference(
"difference",
new DbReal());
250 Column energy(
"energy",
new DbReal());
252 Columns primary_key_columns;
253 primary_key_columns.push_back(struct_id);
254 primary_key_columns.push_back(res1Num);
255 primary_key_columns.push_back(res2Num);
256 primary_key_columns.push_back(atm1Num);
257 primary_key_columns.push_back(atm2Num);
258 PrimaryKey primary_key(primary_key_columns);
260 Columns foreign_key_columns1;
261 foreign_key_columns1.push_back(struct_id);
262 foreign_key_columns1.push_back(res1Num);
264 reference_columns1.push_back(
"struct_id");
265 reference_columns1.push_back(
"resNum");
266 ForeignKey foreign_key1(foreign_key_columns1,
"residues", reference_columns1,
true);
268 Columns foreign_key_columns2;
269 foreign_key_columns2.push_back(struct_id);
270 foreign_key_columns2.push_back(res2Num);
272 reference_columns2.push_back(
"struct_id");
273 reference_columns2.push_back(
"resNum");
274 ForeignKey foreign_key2(foreign_key_columns2,
"residues", reference_columns2,
true);
276 Schema table(
"bond_interres_lengths", primary_key);
277 table.add_foreign_key(foreign_key1);
278 table.add_foreign_key(foreign_key2);
279 table.add_column(atm1Name);
280 table.add_column(atm2Name);
281 table.add_column(ideal);
282 table.add_column(observed);
283 table.add_column(difference);
284 table.add_column(energy);
286 table.write(db_session);
293 using namespace basic::database::schema_generator;
295 Column struct_id(
"struct_id",
new DbUUID(),
false);
296 Column resNum(
"resNum",
new DbInteger(),
false);
297 Column atm1Num(
"atm1Num",
new DbInteger(),
false);
298 Column atm2Num(
"atm2Num",
new DbInteger(),
false);
299 Column atm3Num(
"atm3Num",
new DbInteger(),
false);
300 Column atm4Num(
"atm4Num",
new DbInteger(),
false);
301 Column atm1Name(
"atm1Name",
new DbText(),
false);
302 Column atm2Name(
"atm2Name",
new DbText(),
false);
303 Column atm3Name(
"atm3Name",
new DbText(),
false);
304 Column atm4Name(
"atm4Name",
new DbText(),
false);
305 Column ideal(
"ideal",
new DbReal(),
false);
306 Column observed(
"observed",
new DbReal(),
false);
307 Column difference(
"difference",
new DbReal(),
false);
308 Column energy(
"energy",
new DbReal(),
false);
310 Columns primary_key_columns;
311 primary_key_columns.push_back(struct_id);
312 primary_key_columns.push_back(resNum);
313 primary_key_columns.push_back(atm1Num);
314 primary_key_columns.push_back(atm2Num);
315 primary_key_columns.push_back(atm3Num);
316 primary_key_columns.push_back(atm4Num);
317 PrimaryKey primary_key(primary_key_columns);
319 Columns foreign_key_columns;
320 foreign_key_columns.push_back(struct_id);
321 foreign_key_columns.push_back(resNum);
323 reference_columns.push_back(
"struct_id");
324 reference_columns.push_back(
"resNum");
325 ForeignKey foreign_key(foreign_key_columns,
"residues", reference_columns,
true);
327 Schema table(
"bond_intrares_torsions", primary_key);
328 table.add_foreign_key(foreign_key);
329 table.add_column(atm1Name);
330 table.add_column(atm2Name);
331 table.add_column(atm3Name);
332 table.add_column(atm4Name);
333 table.add_column(ideal);
334 table.add_column(observed);
335 table.add_column(difference);
336 table.add_column(energy);
338 table.write(db_session);
344 dependencies.push_back(
"ResidueFeatures");
352 boost::uuids::uuid
const struct_id,
367 boost::uuids::uuid
const struct_id,
370 std::string statement_string =
"INSERT INTO bond_intrares_angles (struct_id, resNum, cenAtmNum, outAtm1Num, outAtm2Num, cenAtmName, outAtm1Name, outAtm2Name, ideal, observed, difference, energy) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";
371 statement stmt(basic::database::safely_prepare_statement(statement_string,db_session));
373 Real energy_angle = 0;
376 if(!relevant_residues[i])
continue;
402 db_->lookup_angle_legacy( pose, rsd, rt1, rt2, rt3, Ktheta, theta0 );
403 if (Ktheta == 0.0)
continue;
406 Real const angle = numeric::angle_radians(
412 energy_angle = 0.5*Ktheta*std::fabs(angle-theta0);
415 energy_angle = 0.5*Ktheta*(angle-theta0) * (angle-theta0);
427 stmt.bind(1,struct_id);
437 stmt.bind(11,angle-theta0);
438 stmt.bind(12,energy_angle);
439 basic::database::safely_write_to_database(stmt);
448 boost::uuids::uuid
const struct_id,
451 std::string statement_string =
"INSERT INTO bond_interres_angles (struct_id, cenresNum, connResNum, cenAtmNum, outAtmCenNum, outAtmConnNum, cenAtmName, outAtmCenName, outAtmConnName, ideal, observed, difference, energy) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
452 statement stmt(basic::database::safely_prepare_statement(statement_string,db_session));
455 if(!relevant_residues[i])
continue;
460 if(!relevant_residues[j])
continue;
479 for (
Size ii = 1; ii <= r1_resconn_ids.size(); ++ii ) {
481 Size const resconn_id1( r1_resconn_ids[ii] );
491 for (
Size jj = 1; jj <= rsd1_atoms_wi1_bond_of_ii.size(); ++jj ) {
492 assert( rsd1_atoms_wi1_bond_of_ii[ jj ].key1() == resconn_atomno1 );
493 Size const res1_lower_atomno = rsd1_atoms_wi1_bond_of_ii[ jj ].key2();
495 Real const angle = numeric::angle_radians(
496 rsd1.
atom( res1_lower_atomno ).
xyz(),
497 rsd1.
atom( resconn_atomno1 ).
xyz(),
498 rsd2.
atom( resconn_atomno2 ).
xyz() );
502 db_->lookup_angle_legacy( pose, rsd1, res1_lower_atomno, resconn_atomno1, -resconn_id1, Ktheta, theta0 );
504 if (Ktheta == 0.0)
continue;
507 Real energy_angle = 0;
509 energy_angle += 0.5*Ktheta*std::fabs(angle-theta0);
511 energy_angle += 0.5*Ktheta*(angle-theta0) * (angle-theta0);
515 stmt.bind(1,struct_id);
518 stmt.bind(4,resconn_atomno1);
519 stmt.bind(5,res1_lower_atomno);
520 stmt.bind(6, resconn_atomno2);
524 stmt.bind(10,theta0);
526 stmt.bind(12,angle-theta0);
527 stmt.bind(13,energy_angle);
528 basic::database::safely_write_to_database(stmt);
535 for (
Size jj = 1; jj <= rsd2_atoms_wi1_bond_of_ii.size(); ++jj ) {
536 assert( rsd2_atoms_wi1_bond_of_ii[ jj ].key1() == resconn_atomno2 );
537 Size const res2_lower_atomno = rsd2_atoms_wi1_bond_of_ii[ jj ].key2();
541 db_->lookup_angle_legacy( pose, rsd2, res2_lower_atomno, resconn_atomno2, -resconn_id2, Ktheta, theta0 );
543 if (Ktheta == 0.0)
continue;
544 Real const angle = numeric::angle_radians(
545 rsd2.
atom( res2_lower_atomno ).
xyz(),
546 rsd2.
atom( resconn_atomno2 ).
xyz(),
547 rsd1.
atom( resconn_atomno1 ).
xyz() );
550 Real energy_angle = 0;
552 energy_angle += 0.5*Ktheta*std::fabs(angle-theta0);
554 energy_angle += 0.5*Ktheta*(angle-theta0) * (angle-theta0);
558 stmt.bind(1,struct_id);
561 stmt.bind(4,resconn_atomno2);
562 stmt.bind(5,res2_lower_atomno);
563 stmt.bind(6, resconn_atomno1);
567 stmt.bind(10,theta0);
569 stmt.bind(12,angle-theta0);
570 stmt.bind(13,energy_angle);
571 basic::database::safely_write_to_database(stmt);
582 boost::uuids::uuid
const struct_id,
585 std::string statement_string =
"INSERT INTO bond_intrares_lengths (struct_id, resNum, atm1Num, atm2Num, atm1Name, atm2Name, ideal, observed, difference, energy) VALUES (?,?,?,?,?,?,?,?,?,?)";
586 statement stmt(basic::database::safely_prepare_statement(statement_string,db_session));
589 if(!relevant_residues[i])
continue;
600 for (
Size atm_i=1; atm_i<=rsd_type.
natoms(); ++atm_i) {
602 for (
Size j=1; j<=atm_nbrs.size(); ++j) {
603 Size atm_j = atm_nbrs[j];
612 db_->lookup_length_legacy( pose, rsd, atm_i, atm_j, Kd, d0 );
613 if (Kd == 0.0)
continue;
618 Real energy_length = 0;
620 energy_length += 0.5*Kd*std::fabs(d-d0);
622 energy_length += 0.5*Kd*(d-d0)*(d-d0);
626 stmt.bind(1,struct_id);
635 stmt.bind(10,energy_length);
636 basic::database::safely_write_to_database(stmt);
647 boost::uuids::uuid
const struct_id,
650 std::string statement_string =
"INSERT INTO bond_interres_lengths (struct_id, res1Num, res2Num, atm1Num, atm2Num, atm1Name, atm2Name, ideal, observed, difference, energy) VALUES (?,?,?,?,?,?,?,?,?,?,?)";
651 statement stmt(basic::database::safely_prepare_statement(statement_string,db_session));
655 if(!relevant_residues[i])
continue;
660 if(!relevant_residues[j])
continue;
675 for (
Size ii = 1; ii <= r1_resconn_ids.size(); ++ii ) {
677 Size const resconn_id1( r1_resconn_ids[ii] );
686 ( rsd2.
atom( resconn_atomno2 ).
xyz() - rsd1.
atom( resconn_atomno1 ).
xyz() ).length();
690 db_->lookup_length_legacy( pose, rsd1, resconn_atomno1, -resconn_id1, Kd, d0 );
693 Real energy_length = 0;
695 energy_length += 0.5*Kd*std::fabs(length-d0);
697 energy_length += 0.5*Kd*(length-d0)*(length-d0);
701 stmt.bind(1,struct_id);
704 stmt.bind(4,resconn_atomno1);
705 stmt.bind(5,resconn_atomno2);
710 stmt.bind(10,length-d0);
711 stmt.bind(11,energy_length);
712 basic::database::safely_write_to_database(stmt);
722 boost::uuids::uuid
const struct_id,
725 std::string statement_string =
"INSERT INTO bond_intrares_torsions (struct_id, resNum, atm1Num, atm2Num, atm3Num, atm4Num, atm1Name, atm2Name, atm3Name, atm4Name, ideal, observed, difference, energy) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
726 statement stmt(basic::database::safely_prepare_statement(statement_string,db_session));
729 if(!relevant_residues[i])
continue;
739 for (
Size dihe = 1; dihe <= rsd_type.
ndihe(); ++dihe ){
741 int rt1 = ( rsd_type.
dihedral( dihe ) ).key1();
742 int rt2 = ( rsd_type.
dihedral( dihe ) ).key2();
743 int rt3 = ( rsd_type.
dihedral( dihe ) ).key3();
744 int rt4 = ( rsd_type.
dihedral( dihe ) ).key4();
747 Real Kphi, phi0, phi_step;
748 db_->lookup_torsion_legacy( rsd.
type(), rt1, rt2, rt3, rt4, Kphi, phi0, phi_step );
749 if (Kphi == 0.0)
continue;
752 Real angle = numeric::dihedral_radians
757 Real energy_torsion = 0;
758 Real del_phi = basic::subtract_radian_angles(angle, phi0);
759 if (phi_step>0) del_phi = basic::periodic_range( del_phi, phi_step );
762 energy_torsion += 0.5*Kphi*std::fabs(del_phi);
764 energy_torsion += 0.5*Kphi*del_phi*del_phi;
767 stmt.bind(1,struct_id);
779 stmt.bind(13,del_phi);
780 stmt.bind(14,energy_torsion);
781 basic::database::safely_write_to_database(stmt);