Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
PhiPsiSquareWell.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 // This file is part of the Rosetta software suite && is made available under license.
5 // The Rosetta software is developed by the contributing members of the Rosetta Commons consortium.
6 // (C) 199x-2009 Rosetta Commons participating institutions && developers.
7 // For more information, see http://www.rosettacommons.org/.
8 
9 /// @file protocols/frag_picker/scores/FragmentCrmsd.cc
10 /// @brief Object that scores a fragment by root mean square deviation of Phi && Psi dihedrals
11 /// @author Dominik Gront (dgront@chem.uw.edu.pl)
12 
14 
17 // AUTO-REMOVED #include <protocols/frag_picker/VallProvider.hh>
19 #ifdef WIN32
21 #endif
22 
24 
25 // option key includes
26 #include <basic/options/option.hh>
27 #include <basic/options/keys/OptionKeys.hh>
28 #include <basic/options/keys/in.OptionKeys.gen.hh>
29 
30 #include <basic/Tracer.hh>
31 // AUTO-REMOVED #include <core/io/pdb/pose_io.hh>
32 
33 // utils
34 #include <ObjexxFCL/FArray1D.hh>
35 #include <basic/prof.hh>
36 
38 #include <utility/vector1.hh>
39 
40 //Auto Headers
41 #include <core/pose/Pose.hh>
42 
43 
44 // C++
45 
46 // Boost
47 
48 namespace protocols {
49 namespace frag_picker {
50 namespace scores {
51 
52 using namespace basic::options;
53 using namespace basic::options::OptionKeys;
54 
55 static basic::Tracer tr(
56  "protocols.frag_picker.scores.PhiPsiSquareWell");
57 
58  PhiPsiSquareWell::PhiPsiSquareWell(Size priority, Real lowest_acceptable_value, bool use_lowest,
59  core::pose::PoseOP reference_pose) :
60  CachingScoringMethod(priority, lowest_acceptable_value, use_lowest, "PhiPsiSquareWell") {
61 
62  Size n_atoms_ = reference_pose->total_residue();
63  query_phi_.redimension(n_atoms_);
64  query_psi_.redimension(n_atoms_);
65  query_d_phi_.redimension(n_atoms_);
66  query_d_psi_.redimension(n_atoms_);
67  existing_data_.resize(n_atoms_);
68  for (Size i = 1; i <= n_atoms_; ++i) {
69  query_phi_(i) = reference_pose->phi(i);
70  query_psi_(i) = reference_pose->psi(i);
71  query_d_phi_(i) = 0.0;
72  query_d_psi_(i) = 0.0;
73  existing_data_[i] = true;
74  }
75 }
76 
77  PhiPsiSquareWell::PhiPsiSquareWell(Size priority, Real lowest_acceptable_value, bool use_lowest,
78  PhiPsiTalosIO& reader) :
79  CachingScoringMethod(priority, lowest_acceptable_value, use_lowest, "PhiPsiSquareWell") {
80 
81  Size n_atoms_ = reader.get_sequence().length();
82  query_phi_.redimension(n_atoms_);
83  query_psi_.redimension(n_atoms_);
84  query_d_phi_.redimension(n_atoms_);
85  query_d_psi_.redimension(n_atoms_);
86  query_dist_.redimension(n_atoms_);
87  query_s2_.redimension(n_atoms_);
88  query_cnt_.resize(n_atoms_);
89  query_class_.resize(n_atoms_);
90  existing_data_.resize(n_atoms_);
91  for (Size i = 1; i <= n_atoms_; ++i) {
92 
93  if (!reader.has_entry(i)) {
94  existing_data_[i] = false;
95  tr.Warning << "Lack of data for position " << i
96  << std::endl;
97  continue;
98  }
99 
100  if ( (reader.quality(i) == "Warn")
101  || (reader.quality(i) == "Dyn")
102  || (reader.quality(i) == "None") ) {
103  existing_data_[i] = false;
104  tr.Info << "Untrustworthy data at position " << i << " due to prediction class " << reader.quality(i)
105  << std::endl;
106  continue;
107  }
108 
109  //boost::tuple<Size, char, Real, Real, Real, Real, Real, Real, Size,
110  // std::string> entry = reader.get_entry(i);
111  if ((reader.phi(i) > 181) || (reader.phi(i) < -181)
112  || (reader.psi(i) > 181) || (reader.psi(i) < -181)) {
113  existing_data_[i] = false;
114  tr.Warning
115  << "Unphysical Phi/Psi observation at position " << i
116  << std::endl;
117  continue;
118  }
119 
120  existing_data_[i] = true;
121  query_phi_(i) = reader.phi(i);
122  query_psi_(i) = reader.psi(i);
123  query_d_phi_(i) = reader.d_phi(i);
124  query_d_psi_(i) = reader.d_psi(i);
125  }
126 }
127 
129 
130  chunk_phi_.redimension(current_chunk->size());
131  chunk_psi_.redimension(current_chunk->size());
132  for (Size i = 1; i <= current_chunk->size(); ++i) {
133  VallResidueOP r = current_chunk->at(i);
134  chunk_phi_(i) = r->phi();
135  chunk_psi_(i) = r->psi();
136  }
137 }
138 
140  FragmentScoreMapOP scores) {
141 
142  return score(fragment, scores);
143 
144 // std::string ctmp = fragment->get_chunk()->chunk_key();
145 // if (ctmp.compare(cached_scores_id_) != 0) {
146 // do_caching(fragment->get_chunk());
147 // cached_scores_id_ = ctmp;
148 // }
149 
150 // PROF_START( basic::FRAGMENTPICKING_PHIPSI_SCORE );
151 // Size offset_q = fragment->get_first_index_in_query() - 1;
152 // Size offset_v = fragment->get_first_index_in_vall() - 1;
153 // Real score = 0.0;
154 // Real tmp = 0.0;
155 // for (Size i = 1; i < fragment->get_length(); ++i) {
156 // if (!existing_data_[i + offset_q])
157 // continue;
158 // Real d = 0.0;
159 
160 // tmp = std::abs(chunk_phi_(i + offset_v) - query_phi_(i + offset_q));
161 
162 // if ( tmp > 180.0 ) tmp = std::abs(tmp - 360.0);
163 
164 // if ( tmp > query_d_phi_(i + offset_q) ) {
165 // tmp = tmp - query_d_phi_(i + offset_q);
166 // } else {
167 // tmp = 0.0;
168 // }
169 
170 // d += tmp * tmp;
171 
172 // tmp = std::abs(chunk_psi_(i + offset_v) - query_psi_(i + offset_q));
173 
174 // if ( tmp > 180.0 ) tmp = std::abs(tmp - 360.0);
175 
176 // if ( tmp > query_d_psi_(i + offset_q) ) {
177 // tmp = tmp - query_d_psi_(i + offset_q);
178 // } else {
179 // tmp = 0.0;
180 // }
181 
182 // d += tmp * tmp;
183 
184 // score += std::sqrt(d);
185 // }
186 
187 // score = score / ((Real) fragment->get_length());
188 // PROF_STOP( basic::FRAGMENTPICKING_PHIPSI_SCORE );
189 
190 // scores->set_score_component(score, id_);
191 // if ((score > lowest_acceptable_value_) && (use_lowest_ == true))
192 // return false;
193 
194 // return true;
195 }
196 
197 
199  FragmentScoreMapOP scores) {
200 
201  PROF_START( basic::FRAGMENTPICKING_PHIPSI_SCORE );
202  Size offset_q = fragment->get_first_index_in_query() - 1;
203  Size offset_v = fragment->get_first_index_in_vall() - 1;
204  VallChunkOP chunk = fragment->get_chunk();
205  Real score = 0.0;
206  Real tmp = 0.0;
207 
209  values.resize(fragment->get_length());
210 
211  for (Size i = 1; i < fragment->get_length(); ++i) {
212  Real d = 0.0;
213  VallResidueOP r = chunk->at(i + offset_v);
214 
215  values[i] = 0;
216  if (!existing_data_[i + offset_q])
217  continue;
218 
219  tmp = std::abs(r->phi() - query_phi_(i + offset_q));
220 
221  if ( tmp > 180.0 ) tmp = std::abs(tmp - 360.0);
222 
223  if ( tmp > query_d_phi_(i + offset_q) ) {
224  tmp = tmp - query_d_phi_(i + offset_q);
225  } else {
226  tmp = 0.0;
227  }
228 
229  d += tmp * tmp;
230 
231  if ( tmp > 0.0 ) {
232  d += 1 / ( 1 + exp( -5*( tmp / query_d_phi_(i + offset_q) ) + 5) );
233  }
234 
235  tmp = std::abs(r->psi() - query_psi_(i + offset_q));
236 
237  if ( tmp > 180.0 ) tmp = std::abs(tmp - 360.0);
238 
239  if ( tmp > query_d_psi_(i + offset_q) ) {
240  tmp = tmp - query_d_psi_(i + offset_q);
241  } else {
242  tmp = 0.0;
243  }
244 
245  if ( tmp > 0.0 ) {
246  d += 1 / ( 1 + exp( -5*( tmp / query_d_psi_(i + offset_q) ) + 5) );
247  }
248 
249  values[i] = std::sqrt(d);
250  //score += d;
251  }
252 
253 
254 
255  std::sort( values.begin(), values.end() );
256 
257  score = 0.0;
258  for (Size i = 1; i <= fragment->get_length(); i++) {
259  //~1 at 1, ~0.05 at f->get_length, 0.5 at 0.7*f->get_length()
260  Real sigmoid_weight( 1 / ( 1 + exp( (10*( (Real) i ) / fragment->get_length()) - 7 ) ) );
261 
262  score += sigmoid_weight*values[i];
263  }
264 
265 
266  score = score / ((Real) fragment->get_length());
267  PROF_STOP( basic::FRAGMENTPICKING_PHIPSI_SCORE );
268 
269  scores->set_score_component(score, id_);
270  if ((score > lowest_acceptable_value_) && (use_lowest_ == true))
271  return false;
272 
273  return true;
274 }
275 
277 }
278 
279 /// @brief Creates a PhiPsiSquareWell scoring method
280 /// @param priority - priority of the scoring method. The higher value the earlier the score
281 /// will be evaluated
282 /// @param lowest_acceptable_value - if a calculated score is higher than this value,
283 /// fragment will be neglected
284 /// @param FragmentPickerOP object - not used
285 /// @param extras - additional parameters to create a new object. Allowed values are:
286 /// - empty: then the maker tries to create a scoring object from a TALOS file
287 /// trying in::file::talos_phi_psi flag. If fails, will try to use a pose from in::file::s
288 /// - a pdb file, pdb extension is necessary. This will create a pose && steal Phi && Psi
289 /// - a TALOS file with Phi/Psi prediction (tab extension is necessary)
291  Real lowest_acceptable_value, bool use_lowest, FragmentPickerOP //picker
292  , std::string input_file) {
293 
294  if (input_file != "") {
295  Size pos = input_file.find(".pdb");
296  if (pos != std::string::npos) {
297  core::pose::PoseOP nativePose = new core::pose::Pose;
298  core::import_pose::pose_from_pdb(*nativePose, input_file);
299  tr.Info
300  << "Reference file for Phi,Psi scoring loaded from "
301  << input_file << std::endl;
302  tr.Debug << "its sequence is:\n"
303  << nativePose->sequence() << std::endl;
304 
305  return (FragmentScoringMethodOP) new PhiPsiSquareWell(priority,
306  lowest_acceptable_value, use_lowest, nativePose);
307  }
308  pos = input_file.find(".tab");
309  if (pos != std::string::npos) {
310  tr.Info
311  << "Reference file for Phi,Psi scoring loaded from a TALOS file: "
312  << input_file << std::endl;
313  PhiPsiTalosIO in(input_file);
314  in.write(tr.Debug);
315  return (FragmentScoringMethodOP) new PhiPsiSquareWell(priority,
316  lowest_acceptable_value, use_lowest, in);
317  }
318  }
319 
320  if (option[in::file::talos_phi_psi].user()) {
321  tr.Info
322  << "Reference file for Phi,Psi scoring loaded from a TALOS file: "
323  << input_file << std::endl;
324  PhiPsiTalosIO in(option[in::file::talos_phi_psi]());
325  in.write(tr.Debug);
326  return (FragmentScoringMethodOP) new PhiPsiSquareWell(priority,
327  lowest_acceptable_value, use_lowest, in);
328  }
329  if (option[in::file::s].user()) {
330  core::pose::PoseOP nativePose = new core::pose::Pose;
331  core::import_pose::pose_from_pdb(*nativePose, option[in::file::s]()[1]);
332  tr.Info << "Reference file for Phi,Psi scoring loaded from "
333  << option[in::file::s]()[1] << std::endl;
334  tr.Debug << "its sequence is:\n"
335  << nativePose->sequence() << std::endl;
336 
337  return (FragmentScoringMethodOP) new PhiPsiSquareWell(priority,
338  lowest_acceptable_value, use_lowest, nativePose);
339  }
340  if (option[in::file::native].user()) {
341  core::pose::PoseOP nativePose = new core::pose::Pose;
342  core::import_pose::pose_from_pdb(*nativePose, option[in::file::native]());
343  tr.Info << "Reference file for Phi,Psi scoring loaded from "
344  << option[in::file::native]() << std::endl;
345  tr.Debug << "its sequence is:\n"
346  << nativePose->sequence() << std::endl;
347 
348  return (FragmentScoringMethodOP) new PhiPsiSquareWell(priority,
349  lowest_acceptable_value, use_lowest, nativePose);
350  }
351 
352  utility_exit_with_message(
353  "Can't read a reference Phi,Psi data. Provide a structure with in::file::s flag\n\t or a Phi-Psi prediction in TALOS format.");
354 
355  return NULL;
356 }
357 
358 } // scores
359 } // frag_picker
360 } // protocols