22 #include <basic/options/option.hh>
25 #include <basic/Tracer.hh>
29 #include <utility/file/FileName.hh>
31 #include <basic/options/keys/krassk.OptionKeys.gen.hh>
38 #include <utility/vector1.hh>
44 static basic::Tracer
TR(
"protocols.simple_moves.TailsScoreMover");
49 namespace simple_moves {
58 double TailsScoreMover::visit(
59 double in_current_min,
60 int in_current_min_ltail,
61 int in_current_min_rtail,
64 int in_array_of_visits[][200],
67 int in_sequence_length,
72 using namespace scoring;
73 using namespace moves;
74 using namespace basic::options;
75 using namespace core::pose;
77 if(in_ltail > in_sequence_length/2 || in_ltail >= 200 || in_rtail > in_sequence_length/2 || in_rtail>= 200)
80 TR<<
"done" << std::endl;
83 if(in_ltail < 0 || in_ltail > in_sequence_length/2 || in_ltail >= 200 || in_rtail < 0 || in_rtail > in_sequence_length/2 || in_rtail>= 200)
85 out_min_ltail = in_current_min_ltail;
86 out_min_rtail = in_current_min_rtail;
87 return in_current_min;
89 if(in_array_of_visits[in_ltail][in_rtail] ==
VISITED || in_array_of_visits[in_ltail][in_rtail] ==
VISITED_HILL || in_array_of_visits[in_ltail][in_rtail] ==
HILL)
91 out_min_ltail = in_current_min_ltail;
92 out_min_rtail = in_current_min_rtail;
93 return in_current_min;
95 make_tail(tail,in_ltail,in_rtail, in_sequence_length);
96 Real tail_score = score_function()->get_sub_score_exclude_res(pose, tail);
97 Real updated_tail_score = tail_score -
ED*(in_ltail+in_rtail);
100 if(in_ltail!=0 && in_array_of_visits[in_ltail][in_rtail] !=
PREVIOUS_HILL && in_array_of_visits[in_ltail][in_rtail] !=
HILL && in_array_of_visits[in_ltail][in_rtail] !=
VISITED_HILL)
102 make_tail(tail,in_ltail+1,in_rtail, in_sequence_length);
103 Real up_updated_tail_score = score_function()->get_sub_score_exclude_res(pose, tail) -
ED*(in_ltail+1+in_rtail);
104 make_tail(tail,in_ltail-1,in_rtail, in_sequence_length);
105 Real down_updated_tail_score = score_function()->get_sub_score_exclude_res(pose, tail) -
ED*(in_ltail-1+in_rtail);
106 if(up_updated_tail_score < updated_tail_score && down_updated_tail_score < updated_tail_score )
109 m_hill_size = m_hill_size + updated_tail_score;
110 m_number_of_hill_points+=1;
112 in_array_of_visits[in_ltail][in_rtail] =
HILL;
113 out_min_ltail = in_current_min_ltail;
114 out_min_rtail = in_current_min_rtail;
115 return in_current_min;
118 if(in_rtail!=0 && in_array_of_visits[in_ltail][in_rtail] !=
PREVIOUS_HILL && in_array_of_visits[in_ltail][in_rtail] !=
HILL && in_array_of_visits[in_ltail][in_rtail] !=
VISITED_HILL)
120 make_tail(tail,in_ltail,in_rtail+1, in_sequence_length);
121 Real right_updated_tail_score = score_function()->get_sub_score_exclude_res(pose, tail) -
ED*(in_ltail+in_rtail+1);
122 make_tail(tail,in_ltail,in_rtail-1, in_sequence_length);
123 Real left_updated_tail_score = score_function()->get_sub_score_exclude_res(pose, tail) -
ED*(in_ltail+in_rtail-1);
124 if(left_updated_tail_score < updated_tail_score && right_updated_tail_score < updated_tail_score)
127 m_hill_size = m_hill_size + updated_tail_score;
128 m_number_of_hill_points+=1;
130 in_array_of_visits[in_ltail][in_rtail] =
HILL;
131 out_min_ltail = in_current_min_ltail;
132 out_min_rtail = in_current_min_rtail;
133 return in_current_min;
138 if(in_array_of_visits[in_ltail][in_rtail] !=
PREVIOUS_HILL && in_array_of_visits[in_ltail][in_rtail] !=
HILL && in_array_of_visits[in_ltail][in_rtail] !=
VISITED_HILL)
140 in_array_of_visits[in_ltail][in_rtail] =
VISITED;
147 area_file<< in_ltail<<
" " << in_rtail <<
" " << updated_tail_score << std::endl;
148 Real min_updated_tail_score = updated_tail_score;
149 out_min_ltail = in_ltail;
150 out_min_rtail = in_rtail;
154 updated_tail_score = visit(in_current_min,in_current_min_ltail, in_current_min_rtail, in_ltail-1,in_rtail, in_array_of_visits,t_ltail, t_rtail,in_sequence_length,tail, pose,area_file);
155 if(updated_tail_score < min_updated_tail_score)
157 out_min_ltail = t_ltail;
158 out_min_rtail = t_rtail;
159 min_updated_tail_score = updated_tail_score;
161 updated_tail_score = visit(in_current_min, in_current_min_ltail, in_current_min_rtail, in_ltail,in_rtail+1, in_array_of_visits,t_ltail, t_rtail,in_sequence_length,tail, pose,area_file);
162 if(updated_tail_score < min_updated_tail_score)
164 out_min_ltail = t_ltail;
165 out_min_rtail = t_rtail;
166 min_updated_tail_score = updated_tail_score;
168 updated_tail_score = visit(in_current_min,in_current_min_ltail, in_current_min_rtail, in_ltail+1,in_rtail, in_array_of_visits,t_ltail, t_rtail,in_sequence_length,tail, pose,area_file);
169 if(updated_tail_score < min_updated_tail_score)
171 out_min_ltail = t_ltail;
172 out_min_rtail = t_rtail;
173 min_updated_tail_score = updated_tail_score;
175 updated_tail_score = visit(in_current_min,in_current_min_ltail, in_current_min_rtail, in_ltail,in_rtail-1, in_array_of_visits,t_ltail, t_rtail,in_sequence_length,tail, pose,area_file);
176 if(updated_tail_score < min_updated_tail_score)
178 out_min_ltail = t_ltail;
179 out_min_rtail = t_rtail;
180 min_updated_tail_score = updated_tail_score;
182 if( min_updated_tail_score < in_current_min)
183 return min_updated_tail_score;
186 return in_current_min;
187 out_min_ltail = in_current_min_ltail;
188 out_min_rtail = in_current_min_rtail;
195 for(
int rcount = 1; rcount<=in_ltaillength;rcount++)
197 tail.push_back(rcount);
200 for(
int rcount = 1; rcount < in_rtaillength+1; rcount++)
202 tail.push_back(in_sequence_length - in_rtaillength+rcount);
208 double TailsScoreMover::score_mode1(
int& out_min_ltail_length,
int& out_min_rtail_length,std::ofstream & in_tail_output,
pose::Pose & pose)
210 TR<<
"mode 1" << std::endl;
213 Real min_updated_tail_score = score_function()->get_sub_score_exclude_res(pose, tail);
214 Real updated_tail_score = score_function()->get_sub_score_exclude_res(pose, tail);
215 Real min_ltail_length = 0;
216 Real min_rtail_length = 0;
217 int number_of_ltail_steps = sequence_length/2;
218 int number_of_rtail_steps = sequence_length/2;
219 for(
int ltaillength = 0; ltaillength < number_of_ltail_steps; ltaillength ++ )
222 for(
int rcount = 1; rcount<=ltaillength;rcount++)
224 tail.push_back(rcount);
226 for(
int rtaillength = 0; rtaillength < number_of_rtail_steps; rtaillength ++)
229 for(
int rcount = 1; rcount < rtaillength; rcount++)
235 for(
int rcount = 1; rcount < rtaillength+1; rcount++)
237 tail.push_back(sequence_length - rtaillength+rcount);
239 Real tail_score = score_function()->get_sub_score_exclude_res(pose, tail);
240 updated_tail_score = tail_score -
ED*(ltaillength+rtaillength);
241 in_tail_output << updated_tail_score <<
" " << ltaillength <<
" " << rtaillength <<
" "<<tail_score << std::endl;
242 if(updated_tail_score < min_updated_tail_score)
244 min_updated_tail_score = updated_tail_score;
245 min_ltail_length = ltaillength;
246 min_rtail_length = rtaillength;
250 in_tail_output <<
" Min updated score " << min_updated_tail_score <<
" " << min_ltail_length <<
" " << min_rtail_length << std::endl;
251 in_tail_output.close();
252 out_min_ltail_length = (
int)min_ltail_length;
253 out_min_rtail_length = (
int)min_rtail_length;
254 return min_updated_tail_score;
262 double TailsScoreMover::score_mode2(
int& out_min_ltail_length,
int& out_min_rtail_length,std::ofstream & in_tail_output,
pose::Pose & pose)
264 TR<<
"mode 2" << std::endl;
267 int number_of_tail_steps = sequence_length/2;
269 Real min_updated_tail_score = score_function()->get_sub_score_exclude_res(pose, tail);
271 Real updated_tail_score = score_function()->get_sub_score_exclude_res(pose, tail);
272 Real min_tail_length = 0;
273 Real min_ltail_length = 0;
274 Real min_rtail_length = 0;
277 while(updated_tail_score < min_updated_tail_score +
KT && taillength < number_of_tail_steps)
279 tail.push_back(taillength);
280 Real tail_score = score_function()->get_sub_score_exclude_res(pose, tail);
281 updated_tail_score = tail_score -
ED*taillength;
282 if(updated_tail_score < min_updated_tail_score)
284 min_updated_tail_score = updated_tail_score;
285 min_tail_length = taillength;
289 min_ltail_length = min_tail_length;
294 for(
int rcount = 1; rcount<=min_ltail_length;rcount++)
296 tail.push_back(rcount);
298 min_updated_tail_score = score_function()->get_sub_score_exclude_res(pose, tail);
300 updated_tail_score = score_function()->get_sub_score_exclude_res(pose, tail);
304 while(updated_tail_score < min_updated_tail_score +
KT && taillength < number_of_tail_steps)
307 for(
int rcount = 1; rcount < taillength; rcount++)
313 for(
int rcount = 1; rcount < taillength+1; rcount++)
315 tail.push_back(sequence_length - taillength+rcount);
317 Real tail_score = score_function()->get_sub_score_exclude_res(pose, tail);
318 updated_tail_score = tail_score -
ED*(min_ltail_length + taillength);
319 if(updated_tail_score < min_updated_tail_score)
321 min_updated_tail_score = updated_tail_score;
322 min_tail_length = taillength;
326 min_rtail_length = min_tail_length;
327 in_tail_output << min_updated_tail_score <<
" " << min_ltail_length <<
" " << min_rtail_length << std::endl;
328 in_tail_output.close();
330 out_min_ltail_length = (
int)min_ltail_length;
331 out_min_rtail_length = (
int)min_rtail_length;
332 return min_updated_tail_score;
336 double TailsScoreMover::score_mode3(
int& out_min_ltail_length,
int& out_min_rtail_length,std::ofstream & in_tail_output,
pose::Pose & pose)
338 TR<<
"mode 3" << std::endl;
339 int array_of_visits[200][200] = {{0}};
343 int min_ltail_length = 0;
344 int min_rtail_length = 0;
345 Real min_updated_tail_score = 0;
347 double hill_size = 0;
349 while(hill_size <
KT && !m_done_all)
351 min_ltail_length = 0;
352 min_rtail_length = 0;
355 make_tail(tail, 0,0,sequence_length);
356 double min_current_tail_score = score_function()->get_sub_score_exclude_res(pose, tail);
359 min_updated_tail_score = visit(min_current_tail_score, 0, 0,
360 0, 0, array_of_visits, min_ltail_length,
361 min_rtail_length, sequence_length, tail, pose,in_tail_output);
363 hill_size = (m_hill_size - min_updated_tail_score*m_number_of_hill_points)/m_number_of_hill_points;
369 for (
int i = 0; i < 200; i++)
371 for (
int j=0; j < 200; j++)
373 if(array_of_visits [i][j]==
HILL)
385 array_of_visits [i][j] = 0;
390 in_tail_output <<
" Final Min updated score " << min_updated_tail_score <<
" " << min_ltail_length <<
" " << min_rtail_length << std::endl;
391 in_tail_output.close();
393 out_min_ltail_length = min_ltail_length;
394 out_min_rtail_length = min_rtail_length;
395 return min_updated_tail_score;
405 using namespace scoring;
406 using namespace moves;
407 using namespace basic::options;
408 using namespace core::pose;
411 (*score_function())(pose);
414 int tail_mode_name = basic::options::option[ basic::options::OptionKeys::krassk::tail_mode_name ]();
415 if(tail_mode_name < 1 || tail_mode_name > 3)
417 Error() <<
"No such tail algorithm supported. " << std::endl;
420 string tail_output_file_name = basic::options::option[ basic::options::OptionKeys::krassk::tail_output_file_name ]();
421 const char *
tt = tail_output_file_name.c_str();
423 std::ofstream tail_output_file(
tt, std::ios::app );
424 if(!tail_output_file.good())
426 Error() <<
"Unable to open tail output file for writing. " << std::endl;
429 double free_energy = 0;
430 int out_min_ltail_length = 0;
431 int out_min_rtail_length = 0;
433 switch(tail_mode_name)
437 free_energy = score_mode1(out_min_ltail_length, out_min_rtail_length,tail_output_file,pose);
442 free_energy = score_mode2(out_min_ltail_length, out_min_rtail_length,tail_output_file,pose);
447 free_energy = score_mode3( out_min_ltail_length, out_min_rtail_length,tail_output_file,pose);
452 free_energy = score_mode1(out_min_ltail_length,out_min_rtail_length,tail_output_file,pose);
462 TailsScoreMover::get_name()
const {
463 return "TailsScoreMover";