23 #include <boost/uuid/uuid.hpp>
24 #include <boost/uuid/uuid_io.hpp>
27 #include <numeric/HomogeneousTransform.hh>
28 #include <utility/exit.hh>
29 #include <utility/sql_database/DatabaseSessionManager.hh>
30 #include <utility/tag/Tag.hh>
31 #include <utility/vector1.hh>
34 #include <basic/database/sql_utils.hh>
35 #include <basic/options/option.hh>
36 #include <basic/options/keys/inout.OptionKeys.gen.hh>
37 #include <basic/Tracer.hh>
38 #include <basic/database/schema_generator/PrimaryKey.hh>
39 #include <basic/database/schema_generator/ForeignKey.hh>
40 #include <basic/database/schema_generator/Column.hh>
41 #include <basic/database/schema_generator/Schema.hh>
44 #include <cppdb/frontend.h>
47 #include <utility/excn/Exceptions.hh>
54 using basic::database::safely_write_to_database;
55 using basic::database::safely_prepare_statement;
60 using numeric::HomogeneousTransform;
62 using utility::sql_database::sessionOP;
64 using cppdb::statement;
67 static basic::Tracer
TR(
"protocols.features.LoopAnchorFeatures" );
71 use_single_residue_to_define_anchor_transfrom_(true),
78 use_single_residue_to_define_anchor_transfrom_(src.use_single_residue_to_define_anchor_transfrom_),
79 min_loop_length_(src.min_loop_length_),
80 max_loop_length_(src.max_loop_length_)
101 using namespace basic::database::schema_generator;
103 Column struct_id(
"struct_id",
new DbUUID());
104 Column residue_begin(
"residue_begin",
new DbInteger());
105 Column residue_end(
"residue_end",
new DbInteger());
107 Columns primary_key_columns;
108 primary_key_columns.push_back(struct_id);
109 primary_key_columns.push_back(residue_begin);
110 primary_key_columns.push_back(residue_end);
111 PrimaryKey primary_key(primary_key_columns);
113 Columns foreign_key_columns1;
114 foreign_key_columns1.push_back(struct_id);
115 foreign_key_columns1.push_back(residue_begin);
117 reference_columns1.push_back(
"struct_id");
118 reference_columns1.push_back(
"resNum");
119 ForeignKey foreign_key1(foreign_key_columns1,
"residues", reference_columns1,
true);
121 Columns foreign_key_columns2;
122 foreign_key_columns2.push_back(struct_id);
123 foreign_key_columns2.push_back(residue_end);
125 reference_columns2.push_back(
"struct_id");
126 reference_columns2.push_back(
"resNum");
127 ForeignKey foreign_key2(foreign_key_columns2,
"residues", reference_columns2,
true);
129 Schema table(
"loop_anchors", primary_key);
130 table.add_foreign_key(foreign_key1);
131 table.add_foreign_key(foreign_key2);
133 table.write(db_session);
140 using namespace basic::database::schema_generator;
142 Column struct_id(
"struct_id",
new DbUUID());
143 Column residue_begin(
"residue_begin",
new DbInteger());
144 Column residue_end(
"residue_end",
new DbInteger());
145 Column x(
"x",
new DbReal());
146 Column y(
"y",
new DbReal());
147 Column z(
"z",
new DbReal());
148 Column
phi(
"phi",
new DbReal());
149 Column
psi(
"psi",
new DbReal());
150 Column theta(
"theta",
new DbReal());
151 Column alpha(
"alpha",
new DbReal());
152 Column
omega(
"omega",
new DbReal());
154 Columns primary_key_columns;
155 primary_key_columns.push_back(struct_id);
156 primary_key_columns.push_back(residue_begin);
157 primary_key_columns.push_back(residue_end);
158 PrimaryKey primary_key(primary_key_columns);
160 Columns foreign_key_columns;
161 foreign_key_columns.push_back(struct_id);
162 foreign_key_columns.push_back(residue_begin);
163 foreign_key_columns.push_back(residue_end);
165 reference_columns.push_back(
"struct_id");
166 reference_columns.push_back(
"residue_begin");
167 reference_columns.push_back(
"residue_end");
168 ForeignKey foreign_key(foreign_key_columns,
"loop_anchors", reference_columns,
true);
170 Schema table(
"loop_anchor_transforms", primary_key);
171 table.add_foreign_key(foreign_key);
175 table.add_column(phi);
176 table.add_column(psi);
177 table.add_column(theta);
178 table.add_column(alpha);
179 table.add_column(omega);
181 table.write(db_session);
188 using namespace basic::database::schema_generator;
190 Column struct_id(
"struct_id",
new DbUUID());
191 Column residue_begin(
"residue_begin",
new DbInteger());
192 Column residue_end(
"residue_end",
new DbInteger());
193 Column x(
"x",
new DbReal());
194 Column y(
"y",
new DbReal());
195 Column z(
"z",
new DbReal());
196 Column
phi(
"phi",
new DbReal());
197 Column
psi(
"psi",
new DbReal());
198 Column theta(
"theta",
new DbReal());
199 Column alpha(
"alpha",
new DbReal());
200 Column
omega(
"omega",
new DbReal());
202 Columns primary_key_columns;
203 primary_key_columns.push_back(struct_id);
204 primary_key_columns.push_back(residue_begin);
205 primary_key_columns.push_back(residue_end);
206 PrimaryKey primary_key(primary_key_columns);
208 Columns foreign_key_columns;
209 foreign_key_columns.push_back(struct_id);
210 foreign_key_columns.push_back(residue_begin);
211 foreign_key_columns.push_back(residue_end);
213 reference_columns.push_back(
"struct_id");
214 reference_columns.push_back(
"residue_begin");
215 reference_columns.push_back(
"residue_end");
216 ForeignKey foreign_key(foreign_key_columns,
"loop_anchors", reference_columns,
true);
218 Schema table(
"loop_anchor_transforms_three_res", primary_key);
219 table.add_foreign_key(foreign_key);
223 table.add_column(phi);
224 table.add_column(psi);
225 table.add_column(theta);
226 table.add_column(alpha);
227 table.add_column(omega);
229 table.write(db_session);
235 dependencies.push_back(
"ResidueFeatures");
253 std::stringstream error_msg;
255 <<
"The max_loop_length, '" << max_loop_length_ <<
"',"
256 <<
" must be longer than the min_loop_length, '" <<
min_loop_length_ <<
"'." << std::endl;
257 throw utility::excn::EXCN_RosettaScriptsOption(error_msg.str());
268 boost::uuids::uuid struct_id,
271 string loop_anchors_stmt_string =
"INSERT INTO loop_anchors (struct_id, residue_begin, residue_end) VALUES (?,?,?);";
272 statement loop_anchors_stmt(
273 safely_prepare_statement(loop_anchors_stmt_string, db_session));
275 string loop_anchor_transforms_stmt_string =
276 "INSERT INTO loop_anchor_transforms (struct_id, residue_begin, residue_end, x, y, z, phi, psi, theta, alpha, omega) VALUES (?,?,?,?,?,?,?,?,?,?,?);";
277 statement loop_anchor_transforms_stmt(
278 safely_prepare_statement(loop_anchor_transforms_stmt_string, db_session));
280 string loop_anchor_transforms_three_res_stmt_string =
281 "INSERT INTO loop_anchor_transforms_three_res (struct_id, residue_begin, residue_end, x, y, z, phi, psi, theta, alpha, omega) VALUES (?,?,?,?,?,?,?,?,?,?,?);";
282 statement loop_anchor_transforms_three_res_stmt(
283 safely_prepare_statement(loop_anchor_transforms_three_res_stmt_string, db_session));
297 bool bail_out = !relevant_residues[
end];
301 if((chain_ending != chain_ending_end) && (end == *chain_ending))
308 if( (end - begin + 1) < local_min_loop_length){
314 if( (end - begin + 1) >= local_min_loop_length){
315 loop_anchors_stmt.bind(1,struct_id);
316 loop_anchors_stmt.bind(2,begin);
317 loop_anchors_stmt.bind(3,end);
318 basic::database::safely_write_to_database(loop_anchors_stmt);
356 Size number_of_residues = 0;
359 if ( *it ) ++number_of_residues;
361 return number_of_residues;
363 return default_length;
370 residue_vector.push_back(resNo);
371 residue_vector.push_back(resNo);
372 residue_vector.push_back(resNo);
374 residue_vector.push_back(resNo);
375 residue_vector.push_back(resNo + 1);
376 residue_vector.push_back(resNo + 2);
378 return residue_vector;
385 residue_vector.push_back(resNo);
386 residue_vector.push_back(resNo);
387 residue_vector.push_back(resNo);
389 residue_vector.push_back(resNo);
390 residue_vector.push_back(resNo - 1);
391 residue_vector.push_back(resNo - 2);
393 return residue_vector;
401 atom_vector.push_back(1);
402 atom_vector.push_back(2);
403 atom_vector.push_back(3);
406 atom_vector.push_back(2);
407 atom_vector.push_back(2);
408 atom_vector.push_back(2);
414 HomogeneousTransform<Real>
421 runtime_assert_string_msg( (residue_begin.size() == atoms.size()) && (residue_begin.size() == residue_end.size()) &&
422 (residue_begin.size() == 3),
"The length of the residues and atoms vectors must be exactly 3.");
424 HomogeneousTransform<Real> take_off_frame(
427 pose.
residue(residue_begin[3]).
xyz(atoms[3]));
429 HomogeneousTransform<Real> landing_frame(
434 HomogeneousTransform<Real> anchor_transform(
435 take_off_frame.inverse() * landing_frame);
437 return anchor_transform;
442 boost::uuids::uuid struct_id,
452 HomogeneousTransform<Real> anchor_transform(
461 stmt.bind(1, struct_id);
470 stmt.bind(10, alpha);
471 stmt.bind(11, omega);
472 basic::database::safely_write_to_database(stmt);
481 runtime_assert_string_msg( residues.size() == atoms.size() && residues.size() == 3,
482 "The length of the residues and atoms vectors must be exactly 3.");
489 return numeric::arccos(first_vector.dot(second_vector)/(first_vector.norm() * second_vector.norm()));