Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SecondaryStructureSegmentFeatures.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 SecondaryStructureSegmentFeatures.cc
11 ///
12 /// @brief
13 /// @author Tim Jacobs
14 
15 //Unit headers
17 
18 // Project Headers
19 #include <basic/Tracer.hh>
21 #include <core/pose/Pose.hh>
22 #include <core/types.hh>
24 
25 #ifdef WIN32
27 #endif
28 
29 //Basic Headers
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 
37 // Utility Headers
38 #include <utility/sql_database/DatabaseSessionManager.hh>
39 #include <utility/vector1.hh>
40 
41 namespace protocols{
42 namespace features{
43 
45 {}
46 
48 {
49 }
50 
52 {
53 }
54 
56 
57 ///@brief return string with class name
60 {
61  return "SecondaryStructureSegmentFeatures";
62 }
63 
64 ///@brief generate the table schemas and write them to the database
65 void
67  utility::sql_database::sessionOP db_session) const
68 {
69  using namespace basic::database::schema_generator;
70 
71  //******secondary structure segments******//
72  Column struct_id("struct_id", new DbUUID(), false);
73  Column segment_id("segment_id", new DbInteger(), false);
74  Column residue_begin("residue_begin", new DbInteger(), false);
75  Column residue_end("residue_end", new DbInteger(), false);
76  Column dssp("dssp", new DbText(1), false);
77 
78  utility::vector1<Column> pkey_cols;
79  pkey_cols.push_back(struct_id);
80  pkey_cols.push_back(segment_id);
81 
82  Columns foreign_key_columns1;
83  foreign_key_columns1.push_back(struct_id);
84  utility::vector1< std::string > reference_columns1;
85  reference_columns1.push_back("struct_id");
86  ForeignKey foreign_key1(foreign_key_columns1, "structures", reference_columns1, true);
87 
88  Columns foreign_key_columns2;
89  foreign_key_columns2.push_back(struct_id);
90  foreign_key_columns2.push_back(residue_begin);
91  utility::vector1< std::string > reference_columns2;
92  reference_columns2.push_back("struct_id");
93  reference_columns2.push_back("resNum");
94  ForeignKey foreign_key2(foreign_key_columns2, "residues", reference_columns2, true);
95 
96  Columns foreign_key_columns3;
97  foreign_key_columns3.push_back(struct_id);
98  foreign_key_columns3.push_back(residue_end);
99  utility::vector1< std::string > reference_columns3;
100  reference_columns3.push_back("struct_id");
101  reference_columns3.push_back("resNum");
102  ForeignKey foreign_key3(foreign_key_columns3, "residues", reference_columns3, true);
103 
104 // Columns foreign_key_columns4;
105 // foreign_key_columns4.push_back(dssp);
106 // utility::vector1< std::string > reference_columns4;
107 // reference_columns4.push_back("code");
108 // ForeignKey foreign_key4(foreign_key_columns4, "dssp_codes", reference_columns4, true);
109 
110  Schema secondary_structure_segments("secondary_structure_segments", PrimaryKey(pkey_cols));
111  secondary_structure_segments.add_foreign_key(foreign_key1);
112  secondary_structure_segments.add_foreign_key(foreign_key2);
113  secondary_structure_segments.add_foreign_key(foreign_key3);
114  secondary_structure_segments.add_column(dssp);
115 // secondary_structure_segments.add_foreign_key(foreign_key4);
116 
117  secondary_structure_segments.write(db_session);
118 }
119 
120 ///@brief return the set of features reporters that are required to
121 ///also already be extracted by the time this one is used.
124 {
125  utility::vector1<std::string> dependencies;
126  dependencies.push_back("ResidueFeatures");
127  dependencies.push_back("ResidueSecondaryStructureFeatures");
128  return dependencies;
129 }
130 
131 void
133  utility::tag::TagPtr const /*tag*/,
134  protocols::moves::DataMap & /*data*/,
135  protocols::filters::Filters_map const & /*filters*/,
136  protocols::moves::Movers_map const & /*movers*/,
137  core::pose::Pose const & /*pose*/)
138 {}
139 
140 ///@brief Return true if the dssp code is irregular (blank), hydrogen
141 ///bonded turn(T) or bend(S)
142 bool
144  return
145  dssp_code == "T" ||
146  dssp_code == "S" ||
147  dssp_code == "B" ||
148  dssp_code == "I" ||
149  dssp_code == " ";
150 }
151 
152 bool
154  return
155  dssp_code == "H" ||
156  dssp_code == "G";
157 }
158 
159 ///@brief collect all the feature data for the pose
162  core::pose::Pose const & pose,
163  utility::vector1< bool > const & /*relevant_residues*/,
164  boost::uuids::uuid struct_id,
165  utility::sql_database::sessionOP db_session)
166 {
167  using namespace basic::database;
168 
169  std::string select_secondary_struct_string=
170  "SELECT resNum, dssp\n"
171  "FROM residue_secondary_structure\n"
172  "WHERE struct_id=?\n"
173  "ORDER BY resNum";
174 
175  cppdb::statement select_stmt(safely_prepare_statement(select_secondary_struct_string,db_session));
176  select_stmt.bind(1,struct_id);
177  cppdb::result res=safely_read_from_database(select_stmt);
178 
179  std::string sec_structure_statement_string=
180  "INSERT INTO secondary_structure_segments (struct_id, segment_id, residue_begin, residue_end,dssp)\n"
181  "VALUES (?,?,?,?,?)";
182 
183  core::Size segment_counter=0;
184  std::string segment_secondary="";
185  core::Size segment_begin=1;
186  core::Size segment_end;
187  while(res.next()){
188  core::Size resNum;
189  std::string residue_secondary;
190 
191  res >> resNum >> residue_secondary;
192 
193  //Use non-standard 'L' for all loop-like dssp codes
194  if(is_loop(residue_secondary))
195  {
196  residue_secondary="L";
197  }
198  //include 3/10 helix as 'H', DSSP often classifies ends of helices as 3/10
199  else if(is_helix(residue_secondary))
200  {
201  residue_secondary="H";
202  }
203 
204  if(residue_secondary != segment_secondary)
205  {
206  if(resNum > 1)
207  {
208  segment_end=resNum-1;
209 
210  //write segment to DB
211  cppdb::statement stmt(basic::database::safely_prepare_statement(sec_structure_statement_string,db_session));
212  stmt.bind(1,struct_id);
213  stmt.bind(2,segment_counter);
214  stmt.bind(3,segment_begin);
215  stmt.bind(4,segment_end);
216  stmt.bind(5,segment_secondary);
217  basic::database::safely_write_to_database(stmt);
218 
219  //increment segment secondary structure id
220  ++segment_counter;
221  }
222  segment_secondary = residue_secondary;
223  segment_begin=resNum;
224  }
225  }
226 
227  //write final segment to DB
228  cppdb::statement stmt(basic::database::safely_prepare_statement(sec_structure_statement_string,db_session));
229  stmt.bind(1,struct_id);
230  stmt.bind(2,segment_counter);
231  stmt.bind(3,segment_begin);
232  stmt.bind(4,pose.total_residue());
233  stmt.bind(5,segment_secondary);
234  basic::database::safely_write_to_database(stmt);
235 
236  return 0;
237 }
238 
239 } // namespace
240 } // namespace