Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ProteinRMSDFeatures.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file protocols/features/ProteinRMSDFeatures.cc
11 /// @brief report the root mean squared deviation between two poses
12 /// @author Matthew O'Meara (mattjomeara@gmail.com)
13 
14 // Unit Headers
16 
17 // Project Headers
18 #include <core/pose/util.hh>
19 #include <basic/options/option.hh>
20 #include <basic/options/keys/in.OptionKeys.gen.hh>
21 
22 // Platform Headers
23 #include <basic/Tracer.hh>
24 #include <core/chemical/AA.hh>
27 #include <core/pose/Pose.hh>
28 #include <core/types.hh>
29 #include <core/scoring/rms_util.hh>
32 
33 // Utility Headers
34 #include <numeric/xyzVector.hh>
35 #include <utility/vector1.hh>
36 #include <utility/tag/Tag.hh>
37 #include <utility/sql_database/DatabaseSessionManager.hh>
38 
39 // Basic Headers
40 #include <basic/options/keys/inout.OptionKeys.gen.hh>
41 #include <basic/database/sql_utils.hh>
42 #include <basic/database/schema_generator/PrimaryKey.hh>
43 #include <basic/database/schema_generator/ForeignKey.hh>
44 #include <basic/database/schema_generator/Column.hh>
45 #include <basic/database/schema_generator/Schema.hh>
46 
47 
48 // External Headers
49 #include <cppdb/frontend.h>
50 #include <boost/uuid/uuid.hpp>
51 #include <boost/uuid/uuid_io.hpp>
52 
53 // Boost Headers
54 #include <boost/foreach.hpp>
55 #define foreach BOOST_FOREACH
56 
57 // C++ Headers
58 #include <string>
59 #include <map>
60 #include <list>
61 #include <sstream>
62 
63 #include <utility/vector0.hh>
64 
65 
66 namespace protocols{
67 namespace features{
68 
69 using std::string;
70 using std::list;
71 using std::endl;
72 using core::Size;
74 using core::pose::Pose;
76 using core::pose::PoseOP;
81 using utility::vector1;
82 using utility::sql_database::sessionOP;
84 using cppdb::statement;
85 
86 static basic::Tracer tr("protocols.features.ProteinRMSDFeatures");
87 
88 string
89 ProteinRMSDFeatures::type_name() const { return "ProteinRMSDFeatures"; }
90 
91 
92 PoseCOP
94  return reference_pose_;
95 }
96 
97 void
99  PoseCOP pose
100 ) {
101  reference_pose_ = pose;
102 }
103 
105  PoseCOP reference_pose ) :
106  reference_pose_(reference_pose)
107 {}
108 
109 void
111  sessionOP db_session
112 ) const {
114 }
115 
116 void
118  sessionOP db_session
119 ) const {
120  using namespace basic::database::schema_generator;
121 
122  Column struct_id("struct_id", new DbUUID());
123  Column reference_tag("reference_tag", new DbText(255));
124  Column protein_CA("protein_CA", new DbReal());
125  Column protein_CA_or_CB("protein_CA_or_CB", new DbReal());
126  Column protein_backbone("protein_backbone", new DbReal());
127  Column protein_backbone_including_O("protein_backbone_including_O", new DbReal());
128  Column protein_backbone_sidechain_heavyatom("protein_backbone_sidechain_heavyatom", new DbReal());
129  Column heavyatom("heavyatom", new DbReal());
130  Column nbr_atom("nbr_atom", new DbReal());
131  Column all_atom("all_atom", new DbReal());
132 
133  Columns primary_key_columns;
134  primary_key_columns.push_back(struct_id);
135  primary_key_columns.push_back(reference_tag);
136  PrimaryKey primary_key(primary_key_columns);
137 
138  Columns foreign_key_columns;
139  foreign_key_columns.push_back(struct_id);
140  vector1< std::string > reference_columns;
141  reference_columns.push_back("struct_id");
142  ForeignKey foreign_key(foreign_key_columns, "structures", reference_columns, true);
143 
144  Schema table("protein_rmsd", primary_key);
145  table.add_foreign_key(foreign_key);
146  table.add_column(reference_tag);
147  table.add_column(protein_CA);
148  table.add_column(protein_CA_or_CB);
149  table.add_column(protein_backbone);
150  table.add_column(protein_backbone_including_O);
151  table.add_column(protein_backbone_sidechain_heavyatom);
152  table.add_column(heavyatom);
153  table.add_column(nbr_atom);
154  table.add_column(all_atom);
155 
156  table.write(db_session);
157 }
158 
161  utility::vector1<std::string> dependencies;
162  dependencies.push_back("StructureFeatures");
163  return dependencies;
164 }
165 
166 void
168  TagPtr const tag,
169  DataMap & data,
170  Filters_map const & /*filters*/,
171  Movers_map const & /*movers*/,
172  Pose const & pose
173 ) {
174  runtime_assert(tag->getOption<string>("name") == type_name());
175 
176  if(tag->hasOption("reference_name")){
177  // Use with SavePoseMover
178  // WARNING! reference_pose is not initialized until apply time
180  } else {
181  using namespace basic::options;
182  if (option[OptionKeys::in::file::native].user()) {
183  PoseOP ref_pose = new core::pose::Pose();
184  string native_pdb_fname(option[OptionKeys::in::file::native]());
185  pose_from_pdb(*ref_pose, native_pdb_fname);
186  tr << "Adding features reporter '" << type_name() << "' referencing '"
187  << " the -in:file:native='" << native_pdb_fname << "'" << endl;
188  reference_pose(ref_pose);
189  } else {
190  tr << "Setting '" << type_name() << "' to reference the starting structure." << endl;
191  reference_pose(new Pose(pose));
192  }
193  }
194 }
195 
196 Size
198  Pose const & pose,
199  vector1< bool > const & relevant_residues,
200  boost::uuids::uuid struct_id,
201  sessionOP db_session
202 ){
203  using namespace core::scoring;
204 
205  if(!reference_pose_ || !reference_pose_->total_residue()){
206  utility_exit_with_message("No reference pose has been initialized.");
207  return 0;
208  }
209 
210  list< Size > subset_residues;
211  for(Size i = 1; i <= relevant_residues.size(); ++i){
212  if(relevant_residues[i]) subset_residues.push_back(i);
213  }
214 
215  std::string statement_string = "INSERT INTO protein_rmsd (struct_id, reference_tag, protein_CA, protein_CA_or_CB, protein_backbone, protein_backbone_including_O, protein_backbone_sidechain_heavyatom, heavyatom, nbr_atom, all_atom) VALUES (?,?,?,?,?,?,?,?,?,?);";
216  statement stmt(basic::database::safely_prepare_statement(statement_string,db_session));
217 
218  stmt.bind(1,struct_id);
219  stmt.bind(2,find_tag(*reference_pose_));
220  stmt.bind(3,rmsd_with_super(*reference_pose_, pose, subset_residues, is_protein_CA));
221  stmt.bind(4,rmsd_with_super(*reference_pose_, pose, subset_residues, is_protein_CA_or_CB));
222  stmt.bind(5,rmsd_with_super(*reference_pose_, pose, subset_residues, is_protein_backbone));
223  stmt.bind(6,rmsd_with_super(*reference_pose_, pose, subset_residues, is_protein_backbone_including_O));
224  stmt.bind(7,rmsd_with_super(*reference_pose_, pose, subset_residues, is_protein_sidechain_heavyatom));
225  stmt.bind(8,rmsd_with_super(*reference_pose_, pose, subset_residues, is_heavyatom));
226  stmt.bind(9,rmsd_with_super(*reference_pose_, pose, subset_residues, is_nbr_atom));
227  stmt.bind(10,all_atom_rmsd(*reference_pose_, pose, subset_residues));
228 
229  basic::database::safely_write_to_database(stmt);
230 
231  return 0;
232 }
233 
234 } //namesapce
235 } //namespace