21 #include <basic/Tracer.hh>
25 #include <utility/exit.hh>
26 #include <utility/pointer/ReferenceCount.hh>
32 #include <numeric/xyzVector.hh>
33 #include <numeric/conversions.hh>
37 #include <utility/vector1.hh>
40 static basic::Tracer
TR(
"protocols.fldsgn.topology.BetaAlphaBetaMotif" );
49 BetaAlphaBetaMotif::BetaAlphaBetaMotif():
54 left_handed_( false ),
59 hsheet_elev_angle_( 0.0 ),
60 geometry_is_initialized_( false )
70 Size const & cross_over ) :
74 cross_over_( cross_over ),
75 left_handed_( false ),
80 hsheet_elev_angle_( 0.0 ),
81 geometry_is_initialized_( false )
89 strand1_( s.strand1_ ),
90 strand2_( s.strand2_ ),
92 cross_over_( s.cross_over_ ),
93 left_handed_( s.left_handed_ ),
94 sheet_plane_( s.sheet_plane_ ),
95 sheet_pos_( s.sheet_pos_ ),
96 hs_dist_( s.hs_dist_ ),
97 hs_angle_( s.hs_angle_ ),
98 hs1_dist_( s.hs1_dist_ ),
99 hs2_dist_( s.hs2_dist_ ),
100 hsheet_elev_angle_( s.hsheet_elev_angle_ ),
101 helix_cycle_( s.helix_cycle_ ),
102 geometry_is_initialized_( s.geometry_is_initialized_ )
126 std::ostringstream
name;
135 std::ostringstream
name;
160 Real neighbor_dist( 14.0 );
163 BB_Pos bb_pos( ssinfo->bb_pos() );
168 Vector cbca = bb_pos.CB( resi ) - bb_pos.CA( resi );
171 for(
Size ii=start; ii<=
end; ii++ ) {
173 Vector bb = bb_pos.CA( resi ) - bb_pos.CA( ii );
175 Real orient = cbca.x()*( bb_pos.CA( ii ).x() - bb_pos.CA( resi ).x() ) +
176 cbca.y()*( bb_pos.CA( ii ).y() - bb_pos.CA( resi ).y() ) +
177 cbca.z()*( bb_pos.CA( ii ).z() - bb_pos.CA( resi ).z() );
179 if( bb.length() <= neighbor_dist && orient > 0 ) {
183 if( neighbor > burial ) {
191 bool compare( std::map< Size, Real >::const_iterator a, std::map< Size, Real >::const_iterator
b )
193 return ( (*a).second < (*b).second );
208 TR <<
"Geometry have to be initialized before calculating helix cycle. ";
209 runtime_assert(
false );
216 BB_Pos bb_pos( ssinfo->bb_pos() );
219 if( hx.length() < 8 ) {
224 bool use_ca(
false );
225 for(
Size ii=1; ii<=h_end; ++ii ) {
226 Size pos( hx.begin() + ii - 1 );
227 if( bb_pos.CB( pos ).is_zero() ) use_ca =
true;
230 std::map< Size, Real > pos_dist;
231 for(
Size ii=1; ii<=h_end; ++ii ) {
233 Size pos( hx.begin() + ii - 1 );
237 hpos = bb_pos.CA( pos );
239 hpos = bb_pos.CB( pos );
243 Vector const helix_center = hx.Nend_pos() + hx.Nend_orient().dot( hpos - hx.Nend_pos() )*hx.Nend_orient();
244 Vector const center2hpos = ( hpos - helix_center ).normalized();
249 if( dist_hpos_sheet < 0 ) {
250 TR <<
" Distance between CA and sheet is negative value. Conformation is something funny. ";
251 TR <<
" Cannot determine helix cycle. " << std::endl;
252 TR <<
"Pos " << pos <<
", " << dist_hpos_sheet << std::endl;
258 if( cos < 0 )
continue;
261 Real dist = dist_hpos_sheet/cos;
264 pos_dist.insert( std::pair< Size, Real >( ii, dist ) );
269 std::map< Size, Real >::iterator it = pos_dist.begin();
270 while( it != pos_dist.end() ) {
271 vec_ite.push_back( it );
276 std::sort( vec_ite.begin(), vec_ite.end(),
compare );
278 if( hx.length() > 8 ) {
280 helix_cycle_.push_back( ( **( vec_ite.begin() + 1 ) ).first );
299 if( ! ssinfo->bbpos_is_set() )
return;
300 runtime_assert( ssinfo->bbpos_is_set() );
305 BB_Pos bb_pos( ssinfo->bb_pos() );
307 if( ! s1.is_geometry_initialized() )
return;
308 if( ! s2.is_geometry_initialized() )
return;
309 if( ! hx.is_geometry_initialized() )
return;
315 Vector const hmid = hx.mid_pos();
323 runtime_assert( isheet == sheet_set->which_sheet(
strand1_ ) );
329 runtime_assert( s1_order > 0 && s2_order > 0 );
331 if( s1_order > s2_order ) sign = -1;
335 int ref1 = sign * (
cross_over_/2 + 1 ) + s1_order + sign*-1;
337 runtime_assert( ref1 > 0 );
339 int s1_orient =
sheet->orient_strand( s1_order );
346 int ref2 = ref1 + sign;
347 runtime_assert( ref2 > 0 );
349 Size ref1_stid =
sheet->order_strand( ref1 );
350 Size ref2_stid =
sheet->order_strand( ref2 );
355 int refs1_orient =
sheet->orient_strand( ref1 );
356 int refs2_orient =
sheet->orient_strand( ref2 );
358 Real ss_sign1( 1.0 ), ss_sign2( 1.0 );
359 if( s1_orient != refs1_orient ) ss_sign1 = -1.0;
360 if( s1_orient != refs2_orient ) ss_sign2 = -1.0;
366 runtime_assert(
" spair1->orient() == 'P' || spair1->orient() == 'A' " );
367 runtime_assert(
" spair1->size1() != 1 || spair1->size2() != 1 " );
370 Size begin1, end1, begin2, end2;
371 if( ref1_stid < ref2_stid ) {
372 begin1 = spair1->begin1();
373 end1 = spair1->end1();
374 if( spair1->orient() ==
'P' ) {
375 begin2 = spair1->begin2();
376 end2 = spair1->end2();
378 begin2 = spair1->end2();
379 end2 = spair1->begin2();
383 if( spair1->orient() ==
'P' ) {
384 begin1 = spair1->begin2();
385 end1 = spair1->end2();
387 begin1 = spair1->end2();
388 end1 = spair1->begin2();
390 begin2 = spair1->begin1();
391 end2 = spair1->end1();
394 Vector const s1p = ( bb_pos.C( end1 ) - bb_pos.N( begin1 ) ).normalized();
395 Vector const s2p = ( bb_pos.C( end2 ) - bb_pos.N( begin2 ) ).normalized();
396 Vector const s1p_mid = ( bb_pos.N( begin1 ) + bb_pos.C( end1 ) )/2.0;
397 Vector const s2p_mid = ( bb_pos.N( begin2 ) + bb_pos.C( end2 ) )/2.0;
401 v1 = ( s2p_mid - s1p_mid ).normalized();
402 v2 = ( ss_sign1*s1p + ss_sign2*s2p ).normalized();
415 int ref3 = ref2 + sign;
416 runtime_assert( ref3 > 0 );
418 Size ref3_stid =
sheet->order_strand( ref3 );
420 int refs3_orient =
sheet->orient_strand( ref3 );
422 Real ss_sign3( 1.0 );
423 if( s1_orient != refs3_orient ) ss_sign3 = -1.0;
426 runtime_assert(
" spair2->orient() == 'P' || spair2->orient() == 'A' " );
427 runtime_assert(
" spair2->size1() != 1 || spair2->size2() != 1 " );
431 if( ref2_stid < ref3_stid ) {
432 if( spair2->orient() ==
'P' ) {
433 begin3 = spair2->begin2();
434 end3 = spair2->end2();
436 begin3 = spair2->end2();
437 end3 = spair2->begin2();
440 begin3 = spair2->begin1();
441 end3 = spair2->end1();
444 Vector const s3p = ( bb_pos.C( end3 ) - bb_pos.N( begin3 ) ).normalized();
445 Vector const s3p_mid = ( bb_pos.N( begin3 ) + bb_pos.C( end3 ) )/2.0;
450 v1 = ( s3p_mid - s1p_mid ).normalized();
451 v2 = ( ss_sign1*s1p + ss_sign2*s2p + ss_sign3*s3p ).normalized();
468 Real angle( numeric::conversions::degrees( angle_of( -hx.orient(), v2 ) ));
478 Vector const hx_on_sheet = ( h1 -
h2 ).normalized();
480 hs_angle_ = numeric::conversions::degrees( angle_of( v2, hx_on_sheet ) );
498 bab_motifs_( bab_motifs )
513 bab_motifs_( s.bab_motifs_ )
550 out <<
"### BetaAlphaBetaMotif Info " << std::endl;
551 out <<
"# helix,strand1-strand2.num_crossover hsheet_dist hs_angl hsheet_elev_angl hs1_dist hs2_dist helix_cycle " << std::endl;
552 for( BetaAlphaBetaMotifs::const_iterator iter = s.
bab_motifs().begin(),
553 iter_end = s.
bab_motifs().end(); iter != iter_end; ++iter ) {
569 Helices helices = ssinfo->helices();
570 Strands strands = ssinfo->strands();
572 if( strands.size() < 2 ) {
576 for(
Size ist1=1; ist1<=strands.size()-1 ; ist1++ ) {
579 Strand const & s1 ( *strands[ ist1 ] );
580 Strand const & s2 ( *strands[ ist2 ] );
582 Size const sheet_num1 ( sheet_set->which_sheet( ist1 ) );
583 Size const sheet_num2 ( sheet_set->which_sheet( ist2 ) );
584 if( sheet_num1 == 0 || sheet_num2 == 0 )
continue;
585 if( sheet_num1 != sheet_num2 )
continue;
587 Size const ord1 = sheet_set->sheet( sheet_num1 )->strand_order( ist1 );
588 Size const ord2 = sheet_set->sheet( sheet_num2 )->strand_order( ist2 );
591 if( orients[ ord1 ] != orients[ ord2 ] )
continue;
593 Size ih( 0 ), ihelix( 0 );
595 for( Helices::const_iterator jt=helices.begin(), jte=helices.end(); jt!=jte; ++jt ) {
597 Helix const & hx( **jt );
599 if( hx.
begin() > s2.
end() )
continue;
606 if( helix_num == 1 ) {
607 runtime_assert( ihelix != 0 );
610 TR.Debug << ist1 <<
" " << ist2 <<
" " << ihelix <<
" " << cross_over << std::endl;
623 if( ! ssinfo->bbpos_is_set() )
return;
624 runtime_assert( ssinfo->bbpos_is_set() );
627 babm->calc_geometry( ssinfo, sheet_set );