32 #include <basic/database/sql_utils.hh>
33 #include <basic/database/schema_generator/PrimaryKey.hh>
34 #include <basic/database/schema_generator/ForeignKey.hh>
35 #include <basic/database/schema_generator/Column.hh>
36 #include <basic/database/schema_generator/Schema.hh>
37 #include <basic/database/insert_statement_generator/InsertGenerator.hh>
38 #include <basic/database/insert_statement_generator/RowData.hh>
41 #include <numeric/xyzVector.hh>
42 #include <utility/tag/Tag.hh>
43 #include <utility/vector1.hh>
44 #include <utility/tools/make_vector.hh>
45 #include <utility/sql_database/DatabaseSessionManager.hh>
48 #include <cppdb/frontend.h>
49 #include <boost/uuid/uuid_io.hpp>
53 #include <utility/excn/Exceptions.hh>
61 using std::stringstream;
83 using basic::database::insert_statement_generator::InsertGenerator;
84 using basic::database::insert_statement_generator::RowData;
85 using basic::database::insert_statement_generator::RowDataBaseOP;
88 using utility::sql_database::sessionOP;
89 using utility::tools::make_vector;
90 using cppdb::statement;
91 using boost::uuids::uuid;
126 using namespace basic::database::schema_generator;
128 Column batch_id(
"batch_id",
new DbInteger());
129 Column struct_id(
"struct_id",
new DbUUID());
130 Column resNum(
"resNum",
new DbInteger());
131 Column score_type_id(
"score_type_id",
new DbInteger());
132 Column score_value(
"score_value",
new DbReal());
133 Column context_dependent(
"context_dependent",
new DbInteger());
135 Columns primary_key_columns;
136 primary_key_columns.push_back(batch_id);
137 primary_key_columns.push_back(struct_id);
138 primary_key_columns.push_back(resNum);
139 primary_key_columns.push_back(score_type_id);
140 PrimaryKey primary_key(primary_key_columns);
142 Columns foreign_key_columns1;
143 foreign_key_columns1.push_back(struct_id);
144 foreign_key_columns1.push_back(resNum);
146 reference_columns1.push_back(
"struct_id");
147 reference_columns1.push_back(
"resNum");
148 ForeignKey foreign_key1(foreign_key_columns1,
"residues", reference_columns1,
true);
150 Columns foreign_key_columns2;
151 foreign_key_columns2.push_back(batch_id);
152 foreign_key_columns2.push_back(score_type_id);
154 reference_columns2.push_back(
"batch_id");
155 reference_columns2.push_back(
"score_type_id");
156 ForeignKey foreign_key2(foreign_key_columns2,
"score_types", reference_columns2,
true);
159 Schema table(
"residue_scores_1b", primary_key);
160 table.add_foreign_key(foreign_key1);
161 table.add_foreign_key(foreign_key2);
162 table.add_column(score_value);
163 table.add_column(context_dependent);
165 table.write(db_session);
172 using namespace basic::database::schema_generator;
174 Column batch_id(
"batch_id",
new DbInteger());
175 Column struct_id(
"struct_id",
new DbUUID());
176 Column resNum1(
"resNum1",
new DbInteger());
177 Column resNum2(
"resNum2",
new DbInteger());
178 Column score_type_id(
"score_type_id",
new DbInteger());
179 Column score_value(
"score_value",
new DbReal());
180 Column context_dependent(
"context_dependent",
new DbInteger());
182 Columns primary_key_columns;
183 primary_key_columns.push_back(batch_id);
184 primary_key_columns.push_back(struct_id);
185 primary_key_columns.push_back(resNum1);
186 primary_key_columns.push_back(resNum2);
187 primary_key_columns.push_back(score_type_id);
188 PrimaryKey primary_key(primary_key_columns);
190 Columns foreign_key_columns1;
191 foreign_key_columns1.push_back(struct_id);
192 foreign_key_columns1.push_back(resNum1);
194 reference_columns1.push_back(
"struct_id");
195 reference_columns1.push_back(
"resNum");
196 ForeignKey foreign_key1(foreign_key_columns1,
"residues", reference_columns1,
true);
198 Columns foreign_key_columns2;
199 foreign_key_columns2.push_back(struct_id);
200 foreign_key_columns2.push_back(resNum2);
202 reference_columns2.push_back(
"struct_id");
203 reference_columns2.push_back(
"resNum");
204 ForeignKey foreign_key2(foreign_key_columns2,
"residues", reference_columns2,
true);
206 Columns foreign_key_columns3;
207 foreign_key_columns3.push_back(batch_id);
208 foreign_key_columns3.push_back(score_type_id);
210 reference_columns3.push_back(
"batch_id");
211 reference_columns3.push_back(
"score_type_id");
212 ForeignKey foreign_key3(foreign_key_columns3,
"score_types", reference_columns3,
true);
215 Schema table(
"residue_scores_2b", primary_key);
216 table.add_foreign_key(foreign_key1);
217 table.add_foreign_key(foreign_key2);
218 table.add_foreign_key(foreign_key3);
219 table.add_column(score_value);
220 table.add_column(context_dependent);
222 table.write(db_session);
229 using namespace basic::database::schema_generator;
231 Column batch_id(
"batch_id",
new DbInteger());
232 Column struct_id(
"struct_id",
new DbUUID());
233 Column resNum1(
"resNum1",
new DbInteger());
234 Column resNum2(
"resNum2",
new DbInteger());
235 Column score_type_id(
"score_type_id",
new DbInteger());
236 Column score_value(
"score_value",
new DbReal());
237 Column context_dependent(
"context_dependent",
new DbInteger());
239 Columns primary_key_columns;
240 primary_key_columns.push_back(batch_id);
241 primary_key_columns.push_back(struct_id);
242 primary_key_columns.push_back(resNum1);
243 primary_key_columns.push_back(resNum2);
244 primary_key_columns.push_back(score_type_id);
245 PrimaryKey primary_key(primary_key_columns);
247 Columns foreign_key_columns1;
248 foreign_key_columns1.push_back(struct_id);
249 foreign_key_columns1.push_back(resNum1);
251 reference_columns1.push_back(
"struct_id");
252 reference_columns1.push_back(
"resNum");
253 ForeignKey foreign_key1(foreign_key_columns1,
"residues", reference_columns1,
true);
255 Columns foreign_key_columns2;
256 foreign_key_columns2.push_back(struct_id);
257 foreign_key_columns2.push_back(resNum2);
259 reference_columns2.push_back(
"struct_id");
260 reference_columns2.push_back(
"resNum");
261 ForeignKey foreign_key2(foreign_key_columns2,
"residues", reference_columns2,
true);
263 Columns foreign_key_columns3;
264 foreign_key_columns3.push_back(batch_id);
265 foreign_key_columns3.push_back(score_type_id);
267 reference_columns3.push_back(
"batch_id");
268 reference_columns3.push_back(
"score_type_id");
269 ForeignKey foreign_key3(foreign_key_columns3,
"score_types", reference_columns3,
true);
272 Schema table(
"residue_scores_lr_2b", primary_key);
273 table.add_foreign_key(foreign_key1);
274 table.add_foreign_key(foreign_key2);
275 table.add_foreign_key(foreign_key3);
276 table.add_column(score_value);
277 table.add_column(context_dependent);
279 table.write(db_session);
286 dependencies.push_back(
"ResidueFeatures");
287 dependencies.push_back(
"ScoreTypeFeatures");
299 if(tag->hasOption(
"scorefxn")){
300 string const scorefxn_name(tag->getOption<
string>(
"scorefxn"));
303 stringstream error_msg;
305 <<
"The " <<
type_name() <<
" reporter requires a 'scorefxn' tag:" << endl
307 <<
" <feature name=" <<
type_name() <<
" scorefxn=(name_of_score_function) />" << endl;
308 throw utility::excn::EXCN_RosettaScriptsOption(error_msg.str());
316 boost::uuids::uuid
const struct_id,
319 Pose pose_copy(pose);
320 (*scfxn_)(pose_copy);
357 boost::uuids::uuid
const struct_id,
365 Pose temp_pose = pose;
366 scfxn_->setup_for_scoring(temp_pose);
371 vector1<bool> relevant_and_virtual_residues(relevant_residues);
378 relevant_and_virtual_residues[i] =
true;
384 temp_pose, relevant_and_virtual_residues, batch_id, struct_id, db_session);
387 temp_pose, relevant_and_virtual_residues, batch_id, struct_id, db_session);
390 temp_pose, relevant_and_virtual_residues, batch_id, struct_id, db_session);
399 uuid
const struct_id,
406 InsertGenerator insert_onebody(
"residue_scores_1b");
407 insert_onebody.add_column(
"batch_id");
408 insert_onebody.add_column(
"struct_id");
409 insert_onebody.add_column(
"resNum");
410 insert_onebody.add_column(
"score_type_id");
411 insert_onebody.add_column(
"score_value");
412 insert_onebody.add_column(
"context_dependent");
414 RowDataBaseOP batch_id_data(
new RowData<Size>(
"batch_id", batch_id));
415 RowDataBaseOP struct_id_data(
new RowData<uuid>(
"struct_id", struct_id));
420 if(!relevant_residues[resNum])
continue;
423 RowDataBaseOP resNum_data(
424 new RowData<Size>(
"resNum", resNum));
427 RowDataBaseOP context_dependent_data(
428 new RowData<bool>(
"context_dependent",
false));
431 scfxn_->eval_ci_1b(rsd, pose, emap);
432 for(ScoreTypes::const_iterator st =
ci_1b.begin(), ste =
ci_1b.end(); st != ste; ++st){
433 if(!emap[*st])
continue;
435 RowDataBaseOP score_type_id_data(
436 new RowData<Size>(
"score_type_id", *st));
437 RowDataBaseOP score_value_data(
438 new RowData<Real>(
"score_value", emap[*st]));
440 insert_onebody.add_row(
442 batch_id_data, struct_id_data, resNum_data,
443 score_type_id_data, score_value_data, context_dependent_data));
447 RowDataBaseOP context_dependent_data(
448 new RowData<bool>(
"context_dependent",
true));
451 scfxn_->eval_cd_1b(rsd, pose, emap);
452 for(ScoreTypes::const_iterator
456 if(!emap[*st])
continue;
458 RowDataBaseOP score_type_id_data(
459 new RowData<Size>(
"score_type_id", *st));
460 RowDataBaseOP score_value_data(
461 new RowData<Real>(
"score_value", emap[*st]));
463 insert_onebody.add_row(
465 batch_id_data, struct_id_data, resNum_data,
466 score_type_id_data, score_value_data, context_dependent_data));
471 insert_onebody.write_to_database(db_session);
479 uuid
const struct_id,
485 assert(energies.energies_updated());
487 EnergyGraph const & energy_graph( energies.energy_graph() );
493 InsertGenerator insert_twobody(
"residue_scores_2b");
494 insert_twobody.add_column(
"batch_id");
495 insert_twobody.add_column(
"struct_id");
496 insert_twobody.add_column(
"resNum1");
497 insert_twobody.add_column(
"resNum2");
498 insert_twobody.add_column(
"score_type_id");
499 insert_twobody.add_column(
"score_value");
500 insert_twobody.add_column(
"context_dependent");
502 RowDataBaseOP batch_id_data(
new RowData<Size>(
"batch_id", batch_id));
503 RowDataBaseOP struct_id_data(
new RowData<uuid>(
"struct_id", struct_id));
506 if(!relevant_residues[resNum])
continue;
511 iru = energy_graph.get_node(resNum)->const_upper_edge_list_begin(),
513 iru != irue; ++iru ) {
514 EnergyEdge const & edge( static_cast< EnergyEdge const &> (**iru) );
517 if(!relevant_residues[otherResNum])
continue;
519 Size resNum1, resNum2;
520 if( resNum < otherResNum ){
522 resNum2 = otherResNum;
524 resNum1 = otherResNum;
530 RowDataBaseOP resNum1_data(
531 new RowData<Size>(
"resNum1", resNum1));
532 RowDataBaseOP resNum2_data(
533 new RowData<Size>(
"resNum2", resNum2));
537 RowDataBaseOP context_dependent_data(
538 new RowData<bool>(
"context_dependent",
false));
541 scfxn_->eval_ci_2b(rsd, otherRsd, pose, emap);
542 for(ScoreTypes::const_iterator st =
ci_2b.begin(), ste =
ci_2b.end(); st != ste; ++st){
543 if(!emap[*st])
continue;
545 RowDataBaseOP score_type_id_data(
546 new RowData<Size>(
"score_type_id", *st));
547 RowDataBaseOP score_value_data(
548 new RowData<Real>(
"score_value", emap[*st]));
550 insert_twobody.add_row(
552 batch_id_data, struct_id_data, resNum1_data, resNum2_data,
553 score_type_id_data, score_value_data, context_dependent_data));
558 RowDataBaseOP context_dependent_data(
559 new RowData<bool>(
"context_dependent",
true));
562 scfxn_->eval_cd_2b(rsd, otherRsd, pose, emap);
563 for(ScoreTypes::const_iterator st =
cd_2b.begin(), ste =
cd_2b.end(); st != ste; ++st){
564 if(!emap[*st])
continue;
566 RowDataBaseOP score_type_id_data(
567 new RowData<Size>(
"score_type_id", *st));
568 RowDataBaseOP score_value_data(
569 new RowData<Real>(
"score_value", emap[*st]));
571 insert_twobody.add_row(
573 batch_id_data, struct_id_data, resNum1_data, resNum2_data,
574 score_type_id_data, score_value_data, context_dependent_data));
579 insert_twobody.write_to_database(db_session);
588 uuid
const struct_id,
596 InsertGenerator insert_twobody_longrange(
"residue_scores_lr_2b");
597 insert_twobody_longrange.add_column(
"batch_id");
598 insert_twobody_longrange.add_column(
"struct_id");
599 insert_twobody_longrange.add_column(
"resNum1");
600 insert_twobody_longrange.add_column(
"resNum2");
601 insert_twobody_longrange.add_column(
"score_type_id");
602 insert_twobody_longrange.add_column(
"score_value");
603 insert_twobody_longrange.add_column(
"context_dependent");
605 RowDataBaseOP batch_id_data(
new RowData<Size>(
"batch_id", batch_id));
606 RowDataBaseOP struct_id_data(
new RowData<uuid>(
"struct_id", struct_id));
611 RowDataBaseOP context_dependent_data(
612 new RowData<bool>(
"context_dependent",
false));
614 for(ScoreFunction::CI_LR_2B_Methods::const_iterator
615 iter =
scfxn_->ci_lr_2b_methods_begin(),
616 iter_end =
scfxn_->ci_lr_2b_methods_end();
617 iter != iter_end; ++iter ) {
620 if( !lrec || lrec->empty() )
continue;
624 if(!relevant_residues[resNum])
continue;
627 rni = lrec->const_upper_neighbor_iterator_begin( resNum ),
628 rniend = lrec->const_upper_neighbor_iterator_end( resNum );
629 (*rni) != (*rniend); ++(*rni) ) {
630 Size const otherResNum(rni->upper_neighbor_id());
631 if(!relevant_residues[otherResNum])
continue;
633 Size resNum1, resNum2;
634 if( resNum < otherResNum ){
636 resNum2 = otherResNum;
638 resNum1 = otherResNum;
642 assert(rni->energy_computed());
644 rni->retrieve_energy( emap );
646 RowDataBaseOP resNum1_data(
647 new RowData<Size>(
"resNum1", resNum1));
648 RowDataBaseOP resNum2_data(
649 new RowData<Size>(
"resNum2", resNum2));
652 ScoreTypes::const_iterator
655 if(!emap[*st])
continue;
657 RowDataBaseOP score_type_id_data(
658 new RowData<Size>(
"score_type_id", *st));
659 RowDataBaseOP score_value_data(
660 new RowData<Real>(
"score_value", emap[*st]));
662 insert_twobody_longrange.add_row(
664 batch_id_data, struct_id_data, resNum1_data, resNum2_data,
665 score_type_id_data, score_value_data, context_dependent_data));
675 RowDataBaseOP context_dependent_data(
676 new RowData<bool>(
"context_dependent",
true));
678 for(ScoreFunction::CD_LR_2B_Methods::const_iterator
679 iter =
scfxn_->cd_lr_2b_methods_begin(),
680 iter_end =
scfxn_->cd_lr_2b_methods_end();
681 iter != iter_end; ++iter ) {
684 if( !lrec || lrec->empty() )
continue;
688 if(!relevant_residues[resNum])
continue;
691 rni = lrec->const_upper_neighbor_iterator_begin( resNum ),
692 rniend = lrec->const_upper_neighbor_iterator_end( resNum );
693 (*rni) != (*rniend); ++(*rni) ) {
694 Size const otherResNum(rni->upper_neighbor_id());
695 if(!relevant_residues[otherResNum])
continue;
697 Size resNum1, resNum2;
698 if( resNum < otherResNum ){
700 resNum2 = otherResNum;
702 resNum1 = otherResNum;
706 assert(rni->energy_computed());
708 rni->retrieve_energy( emap );
710 RowDataBaseOP resNum1_data(
711 new RowData<Size>(
"resNum1", resNum1));
712 RowDataBaseOP resNum2_data(
713 new RowData<Size>(
"resNum2", resNum2));
716 ScoreTypes::const_iterator
719 if(!emap[*st])
continue;
721 RowDataBaseOP score_type_id_data(
722 new RowData<Size>(
"score_type_id", *st));
723 RowDataBaseOP score_value_data(
724 new RowData<Real>(
"score_value", emap[*st]));
726 insert_twobody_longrange.add_row(
728 batch_id_data, struct_id_data, resNum1_data, resNum2_data,
729 score_type_id_data, score_value_data, context_dependent_data));
735 insert_twobody_longrange.write_to_database(db_session);