17 #include <utility/string_util.hh>
18 #include <utility/exit.hh>
20 #include <boost/foreach.hpp>
23 #define foreach BOOST_FOREACH
29 #include <basic/Tracer.hh>
31 #include <utility/tag/Tag.hh>
32 #include <utility/vector1.hh>
37 #include <numeric/xyzVector.hh>
39 #include <numeric/random/random.hh>
42 #include <basic/datacache/BasicDataCache.hh>
89 #include <numeric/random/random.hh>
90 #include <numeric/xyzVector.hh>
91 #include <numeric/xyz.functions.hh>
92 #include <numeric/model_quality/rms.hh>
94 #include <basic/Tracer.hh>
95 #include <boost/unordered/unordered_map.hpp>
98 namespace seeded_abinitio {
100 static basic::Tracer
TR(
"protocols.seeded_abinitio.movers.SegmentHybridizer" );
101 static basic::Tracer
TR_ccd(
"protocols.seeded_abinitio.movers.SegmentHybridizer_ccd" );
102 static numeric::random::RandomGenerator
RG(1245273);
118 return "SegmentHybridizer";
191 bool nterm = (start == 1);
192 bool cterm = (start == nres- len -1 );
198 ObjexxFCL::FArray1D< numeric::Real > ww( 2*4*aln_len, 1.0 );
199 ObjexxFCL::FArray2D< numeric::Real > uu( 3, 3, 0.0 );
202 for (
int i=0; i<(
int)len; ++i) {
205 for (
int tries = 0; tries<
tries_; ++tries) {
212 ObjexxFCL::FArray2D< core::Real > init_coords( 3, 2*4*aln_len );
213 for (
int ii=-aln_len; ii<aln_len; ++ii) {
214 int i = (ii>=0) ? (nterm?len-ii-1:ii) : (cterm?-ii-1:len+ii);
219 com1 += x_1+x_2+x_3+x_4;
220 for (
int j=0; j<3; ++j) {
221 init_coords(j+1,4*(ii+aln_len)+1) = x_1[j];
222 init_coords(j+1,4*(ii+aln_len)+2) = x_2[j];
223 init_coords(j+1,4*(ii+aln_len)+3) = x_3[j];
224 init_coords(j+1,4*(ii+aln_len)+4) = x_4[j];
227 com1 /= 2.0*4.0*aln_len;
228 for (
int ii=0; ii<2*4*aln_len; ++ii) {
229 for (
int j=0; j<3; ++j ) init_coords(j+1,ii+1) -= com1[j];
233 frame.
apply( toget, pose_copy );
236 ObjexxFCL::FArray2D< core::Real > final_coords( 3, 2*4*aln_len );
237 for (
int ii=-aln_len; ii<aln_len; ++ii) {
238 int i = (ii>=0) ? (nterm?len-ii-1:ii) : (cterm?-ii-1:len+ii);
243 com2 += x_1+x_2+x_3+x_4;
244 for (
int j=0; j<3; ++j) {
245 final_coords(j+1,4*(ii+aln_len)+1) = x_1[j];
246 final_coords(j+1,4*(ii+aln_len)+2) = x_2[j];
247 final_coords(j+1,4*(ii+aln_len)+3) = x_3[j];
248 final_coords(j+1,4*(ii+aln_len)+4) = x_4[j];
251 com2 /= 2.0*4.0*aln_len;
252 for (
int ii=0; ii<2*4*aln_len; ++ii) {
253 for (
int j=0; j<3; ++j ) final_coords(j+1,ii+1) -= com2[j];
259 numeric::model_quality::findUU( final_coords, init_coords, ww, 2*4*aln_len, uu, ctx );
260 numeric::model_quality::calc_rms_fast( rms, final_coords, init_coords, ww, 2*4*aln_len, ctx );
262 TR.Debug <<
"fragments rms: " << rms << std::endl;
264 if (rms <
rms_)
break;
265 if (tries >= 50 && rms < 1)
break;
266 if (tries >= 70 && rms < 2)
break;
267 if (tries >= 100 && rms < 4)
break;
271 R.xx( uu(1,1) ); R.xy( uu(2,1) ); R.xz( uu(3,1) );
272 R.yx( uu(1,2) ); R.yy( uu(2,2) ); R.yz( uu(3,2) );
273 R.zx( uu(1,3) ); R.zy( uu(2,3) ); R.zz( uu(3,3) );
275 for (
Size i = 0; i < len; ++i ) {
278 pose.
set_xyz(
id, R * ( pose_copy.
xyz(
id) - com2) + com1 );
299 for (
core::Size j=insert_start; j<= insert_stop -
big_-1 ; ++j ) {
332 for (
Size i=1; i<nres; ++i) {
340 residuals[i] = (d2-1.328685)*(d2-1.328685);
341 if ( residuals[i] > max_residuals[1]) {
342 max_residuals[3] = max_residuals[2]; max_residuals[2] = max_residuals[1]; max_residuals[1] = residuals[i];
343 max_poses[3] = max_poses[2]; max_poses[2] = max_poses[1]; max_poses[1] = i;
344 }
else if ( residuals[i] > max_residuals[2]) {
345 max_residuals[3] = max_residuals[2]; max_residuals[2] = residuals[i];
346 max_poses[3] = max_poses[2]; max_poses[2] = i;
347 }
else if ( residuals[i] > max_residuals[3]) {
348 max_residuals[3] = residuals[i];
354 int select_position = numeric::random::random_range(1,3);
355 core::Size max_pos = max_poses[ select_position ];
365 insert_pos = std::min( insert_pos, insert_pos_stop -
big_-1);
366 insert_pos = std::max( (
int)insert_pos, (
int)insert_pos_start);
397 core::Real bonded_weight_angle = 0.1*max_cart_angle;
398 core::Real bonded_weight_length = 0.1*max_cart_length;
399 core::Real bonded_weight_torsion = 0.1*max_cart_torsion;
410 using namespace core::pose::datacache;
414 tocen->apply( pose );
452 TR<<
"allowing all elements to move, if there is more than 1 chain, it will be the last chain that is allowed to move " <<std::endl;
469 for (
core::Size it = insert_pos_start - 2 ; it > 0 ; it-- ){
471 if ( tgt_ss[it-1] ==
'L' )
break;
479 if ( tgt_ss[it-1] ==
'L' )
break;
488 if ( i >= nterm_mm && i <= cterm_mm ){
525 (*lowres_scorefxn_)(pose);
529 hybridize(pose, insert_pos_start, insert_pos_stop);
530 (*lowres_scorefxn_)(pose);
535 mc->recover_low(pose);
538 TR.Debug <<
"final rms for fragment align: " <<
rms_ << std::endl;
548 TR<<
"final minimization" << std::endl;
566 TR <<
"initialized SegmentHybridizer mover " << std::endl;
572 TR <<
"initialized SegmentHybridizer mover " << std::endl;
579 use_seq_ = tag->getOption<
bool> (
"use_seq", 0 );
581 auto_mm_= tag->getOption<
bool>(
"auto_mm", 1 );
582 tries_=tag->getOption<
int>(
"frag_tries" , 100 );
585 use_frags_=tag->getOption<
bool>(
"use_frags", 1 );
588 extra_min_=tag->getOption<
bool>(
"extra_min", 0 );
592 foreach(
TagPtr const btag, branch_tags ){
594 if( btag->getName() ==
"Span" ) {
603 std::pair <std::string,std::string> segpair;
604 segpair.first = beginS;
606 segpair.second = endS;