19 #include <basic/Tracer.hh>
30 #include <basic/database/sql_utils.hh>
31 #include <basic/database/schema_generator/PrimaryKey.hh>
32 #include <basic/database/schema_generator/ForeignKey.hh>
33 #include <basic/database/schema_generator/Column.hh>
34 #include <basic/database/schema_generator/Schema.hh>
35 #include <basic/database/schema_generator/Constraint.hh>
36 #include <basic/Tracer.hh>
39 #include <numeric/xyzMatrix.hh>
40 #include <numeric/xyzVector.hh>
41 #include <numeric/xyz.functions.hh>
42 #include <numeric/PCA.hh>
43 #include <numeric/xyzVector.io.hh>
47 #include <utility/sql_database/DatabaseSessionManager.hh>
48 #include <utility/vector1.hh>
53 static basic::Tracer
TR(
"protocols.features.SmotifFeatures");
73 return "SmotifFeatures";
80 using namespace basic::database::schema_generator;
81 using namespace utility;
84 Column struct_id(
"struct_id",
new DbUUID(),
false);
85 Column smotif_id(
"smotif_id",
new DbInteger(),
false);
86 Column ss1(
"secondary_struct_segment_id_1",
new DbInteger(),
false);
87 Column ss2(
"secondary_struct_segment_id_2",
new DbInteger(),
false);
88 Column loop(
"loop_segment_id",
new DbInteger(),
false);
91 Column
distance(
"distance",
new DbReal(),
false);
94 Column hoist(
"hoist",
new DbReal(),
false);
97 Column packing(
"packing",
new DbReal(),
false);
100 Column meridian(
"meridian",
new DbReal(),
false);
103 pkey_cols.push_back(struct_id);
104 pkey_cols.push_back(smotif_id);
106 Columns foreign_key_columns1;
107 foreign_key_columns1.push_back(struct_id);
109 reference_columns1.push_back(
"struct_id");
110 ForeignKey foreign_key1(foreign_key_columns1,
"structures", reference_columns1,
true);
112 Columns foreign_key_columns2;
113 foreign_key_columns2.push_back(struct_id);
114 foreign_key_columns2.push_back(ss1);
116 reference_columns2.push_back(
"struct_id");
117 reference_columns2.push_back(
"segment_id");
118 ForeignKey foreign_key2(foreign_key_columns2,
"secondary_structure_segments", reference_columns2,
true);
120 Columns foreign_key_columns3;
121 foreign_key_columns3.push_back(struct_id);
122 foreign_key_columns3.push_back(ss2);
124 reference_columns3.push_back(
"struct_id");
125 reference_columns3.push_back(
"segment_id");
126 ForeignKey foreign_key3(foreign_key_columns3,
"secondary_structure_segments", reference_columns3,
true);
128 Columns foreign_key_columns4;
129 foreign_key_columns4.push_back(struct_id);
130 foreign_key_columns4.push_back(loop);
132 reference_columns4.push_back(
"struct_id");
133 reference_columns4.push_back(
"segment_id");
134 ForeignKey foreign_key4(foreign_key_columns4,
"secondary_structure_segments", reference_columns4,
true);
136 Schema smotifs(
"smotifs", PrimaryKey(pkey_cols));
137 smotifs.add_foreign_key(foreign_key1);
138 smotifs.add_foreign_key(foreign_key2);
139 smotifs.add_foreign_key(foreign_key3);
140 smotifs.add_foreign_key(foreign_key4);
141 smotifs.add_column(distance);
142 smotifs.add_column(hoist);
143 smotifs.add_column(packing);
144 smotifs.add_column(meridian);
146 smotifs.write(db_session);
155 dependencies.push_back(
"SecondaryStructureSegmentFeatures");
174 boost::uuids::uuid struct_id,
175 utility::sql_database::sessionOP db_session)
179 using namespace numeric;
185 "INSERT INTO smotifs (struct_id, smotif_id, secondary_struct_segment_id_1,\n"
186 " secondary_struct_segment_id_2, loop_segment_id, distance, hoist, packing,\n"
187 " meridian) VALUES(?,?,?,?,?,?,?,?,?)";
189 cppdb::statement smotif_insert_stmt =
190 basic::database::safely_prepare_statement(smotif_insert_string, db_session);
193 if(ss_segments.size()>2)
195 for(
Size i=1; i<=ss_segments.size()-2; ++i)
201 if( (ss1.
dssp==
"H" || ss1.
dssp==
"E") &&
217 first_principal_component(ss1_coords);
221 ss1_first_principal_component+=ss1_com;
225 closest_point_on_line(ss1_com, ss1_com_principal_component,
230 closest_point_on_line(ss1_com, ss1_com_principal_component,
236 first_principal_component(ss2_coords);
239 ss2_first_principal_component+=ss2_com;
243 closest_point_on_line(ss2_com, ss2_com_principal_component,
248 closest_point_on_line(ss2_com, ss2_com_principal_component,
252 core::Real hoist_angle_degrees = angle_degrees(p0,p1,p2);
253 core::Real packing_angle_degrees = angle_degrees(p0,p1,p2,p3);
255 core::Real meridian_angle_degrees = dihedral_degrees(p0,p1,p2,p3);
257 smotif_insert_stmt.bind(1, struct_id);
258 smotif_insert_stmt.bind(2, smotif_counter);
262 smotif_insert_stmt.bind(6, distance);
263 smotif_insert_stmt.bind(7, hoist_angle_degrees);
264 smotif_insert_stmt.bind(8, packing_angle_degrees);
265 smotif_insert_stmt.bind(9, meridian_angle_degrees);
267 basic::database::safely_write_to_database(smotif_insert_stmt);
277 boost::uuids::uuid struct_id,
278 utility::sql_database::sessionOP db_session)
281 using cppdb::statement;
287 " segment_id, residue_begin, residue_end, dssp\n"
289 " secondary_structure_segments\n"
292 "ORDER BY segment_id";
294 statement ss_segment_select_statement(
295 basic::database::safely_prepare_statement(ss_segment_select_string,db_session));
296 ss_segment_select_statement.bind(1,struct_id);
297 result res(basic::database::safely_read_from_database(ss_segment_select_statement));
302 Size segment_id, residue_begin, residue_end;
304 res >> segment_id >> residue_begin >> residue_end >> dssp;
310 ss_segment.
dssp = dssp;
312 ss_segments.push_back(ss_segment);