Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
StrandPairing.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 and is made available under license.
5 // The Rosetta software is developed by the contributing members of the Rosetta Commons consortium.
6 // Copyright in the Rosetta software belongs to the developers and their institutions.
7 // For more information, see www.rosettacommons.org.
8 
9 /// @file ./src/protocols/src/fldsgn/topology/StrandPairing.cc
10 /// @brief
11 /// @author Nobuyasu Koga ( nobuyasu@u.washington.edu )
12 
13 // unit header
15 
16 
17 // Project Headers
20 
21 // utility headers
22 #include <utility/string_util.hh>
23 #include <utility/exit.hh>
24 
25 
26 // C++ headers
27 #include <cassert>
28 #include <iostream>
29 #include <sstream>
30 #include <boost/lexical_cast.hpp>
31 #include <basic/Tracer.hh>
32 
33 #include <utility/vector1.hh>
34 
35 
36 
37 static basic::Tracer TR( "protocols.topology.StrandPairing" );
38 
39 using namespace core;
42 
43 namespace protocols {
44 namespace fldsgn {
45 namespace topology {
46 
47 /// @brief default constructor
48 StrandPairing::StrandPairing():
49  s1_( 0 ),
50  s2_( 0 ),
51  begin1_( 0 ),
52  end1_( 0 ),
53  begin2_( 0 ),
54  end2_( 0 ),
55  rgstr_shift_( 99 ),
56  orient_( 'N' ),
57  has_bulge_( false ),
58  name_( "" )
59 {}
60 
61 
62 /// @brief value constructor
64  Size const s1,
65  Size const s2,
66  Size const b1,
67  Size const b2,
68  Size const p,
69  Real const rs,
70  char const o
71 ):
72  s1_( s1 ),
73  s2_( s2 ),
74  begin1_( b1 ),
75  end1_( b1 ),
76  begin2_( b2 ),
77  end2_( b2 ),
78  rgstr_shift_( rs ),
79  orient_( o ),
80  has_bulge_( false )
81 {
82  runtime_assert( s1 < s2 );
83  runtime_assert( b1 < b2 );
84  pleats1_.push_back( p );
85  pleats2_.push_back( p );
86  residue_pair_.insert( std::map< Size, Size >::value_type( b1, b2 ) );
87  residue_pair_.insert( std::map< Size, Size >::value_type( b2, b1 ) );
88  initialize();
89 }
90 
91 
92 /// @brief value constructor
94  Size const s1,
95  Size const s2,
96  Real const rs,
97  char const o
98 ):
99  s1_( s1 ),
100  s2_( s2 ),
101  begin1_( 0 ),
102  end1_( 0 ),
103  begin2_( 0 ),
104  end2_( 0 ),
105  rgstr_shift_( rs ),
106  orient_( o ),
107  has_bulge_( false )
108 {
109  runtime_assert( s1 < s2 );
110  initialize();
111 }
112 
113 
114 /// @brief value constructor
116  begin1_( 0 ),
117  end1_( 0 ),
118  begin2_( 0 ),
119  end2_( 0 ),
120  has_bulge_( false )
121 {
122  utility::vector1< String > parts( utility::string_split( spair, '.' ) );
123  runtime_assert( parts.size() == 3 );
124 
125  utility::vector1< String > st( utility::string_split( parts[1], '-' ) );
126  s1_ = boost::lexical_cast<Size>( st[1] );
127  s2_ = boost::lexical_cast<Size>( st[2] );
128  runtime_assert( s1_ < s2_ );
129 
130  orient_ = parts[2][0];
131  runtime_assert( orient_ == 'P' || orient_ == 'A' || orient_ == 'N' );
132  rgstr_shift_ = boost::lexical_cast<Real>( parts[3] );
133 
134  name_ = spair;
135 }
136 
137 
138 /// @brief initialize StrandPairing
139 void
141 {
142  using namespace boost;
143  name_ = lexical_cast<String>(s1_) + '-' + lexical_cast<String>(s2_) + '.' + orient_ + '.'+ lexical_cast<String>(rgstr_shift_);
144 }
145 
146 
147 /// @brief copy constructor
149  ReferenceCount(),
150  s1_( sp.s1_ ),
151  s2_( sp.s2_ ),
152  begin1_( sp.begin1_ ),
153  end1_( sp.end1_ ),
154  begin2_( sp.begin2_ ),
155  end2_( sp.end2_ ),
156  pleats1_( sp.pleats1_ ),
157  pleats2_( sp.pleats2_ ),
159  orient_( sp.orient_ ),
160  has_bulge_( sp.has_bulge_ ),
161  name_( sp.name_ ),
163 {}
164 
165 
166 /// @brief default destructor
168 
169 
170 /// @brief clone this object
173 {
174  return new StrandPairing( *this );
175 }
176 
177 
178 /// @brief return name
179 std::ostream & operator<<( std::ostream & out, const StrandPairing &sp )
180 {
181  out << sp.name();
182  out << ": " << sp.begin1() << "-" << sp.end1() << "." << sp.begin2() << "-" << sp.end2();
183  return out;
184 }
185 
186 
187 /// @brief
188 bool
189 StrandPairing::elongate( Size const r1, Size const r2, Size const p1, Size const p2 )
190 {
191  runtime_assert( r2 > r1 );
192 
193  // set residue pair
194  residue_pair_.insert( std::map< Size, Size >::value_type( r1, r2 ) );
195  residue_pair_.insert( std::map< Size, Size >::value_type( r2, r1 ) );
196 
197  if ( begin1_ == 0 && begin2_ == 0 ) {
198  begin1_ = r1;
199  begin2_ = r2;
200  end1_ = r1;
201  end2_ = r2;
202  pleats1_.push_back( p1 );
203  pleats2_.push_back( p2 );
204  return true;
205  }
206 
207  if( r1 < end1_ ) {
208  return false;
209  }
210  if( (orient_ == 'P' && r2 < end2_) || (orient_ == 'A' && r2 > end2_) ) {
211  return false;
212  }
213 
214  // runtime_assert( r1 > end1_ );
215 
216  // if( orient_ == 'P' ){
217  // runtime_assert( r2 > end2_ );
218  // }else{
219  // runtime_assert( r2 < end2_ );
220  // }
221 
222  end1_ = r1;
223  end2_ = r2;
224 
225  if( size1() != size2() ){
226  has_bulge_ = true;
227  }
228 
229  return true;
230 }
231 
232 
233 /// @brief
234 bool
235 StrandPairing::add_pair( Size const r1, Size const r2, char const orient, Real const rgstr )
236 {
237  runtime_assert( r2 > r1 );
238 
239  if( orient_ != orient ) return false;
240 
241  residue_pair_.insert( std::map< Size, Size >::value_type( r1, r2 ) );
242  residue_pair_.insert( std::map< Size, Size >::value_type( r2, r1 ) );
243 
244  if ( begin1_ == 0 && begin2_ == 0 ) {
245  begin1_ = r1;
246  begin2_ = r2;
247  end1_ = r1;
248  end2_ = r2;
249  return true;
250  }
251 
252  if( r1 <= begin1_ ) {
253  begin1_ = r1;
254  rgstr_shift_ = rgstr;
255  } else if( end1_ <= r1 ) {
256  end1_ = r1;
257  }
258 
259  if( r2 <= begin2_ ) {
260  begin2_ = r2;
261  rgstr_shift_ = rgstr;
262  } else if( end2_ <= r2 ) {
263  end2_ = r2;
264  }
265 
266  if( size1() != size2() ){
267  has_bulge_ = true;
268  }
269  return true;
270 }
271 
272 
273 /// @brief return length of 1st strand
274 Size
276 {
277  return end1_ - begin1_ + 1;
278 }
279 
280 
281 /// @brief return length of 2nd strand
282 Size
284 {
285  return end2_ - begin2_ + 1;
286 }
287 
288 
289 /// @brief return length of 2nd strand
290 bool
292  if( orient_ == 'P' ) {
293  return true;
294  }else{
295  return false;
296  }
297 }
298 
299 /// @brief whether input residue is included in this StrandPairinge or not
300 bool
302 
303  if ( begin1_ <= end1_ ) {
304  if( begin1_ <= res && res <= end1_ ) return true;
305  } else {
306  if( end1_ <= res && res <= begin1_ ) return true;
307  }
308 
309  if ( begin2_ <= end2_ ) {
310  if( begin2_ <= res && res <= end2_ ) return true;
311  } else {
312  if( end2_ <= res && res <= begin2_ ) return true;
313  }
314 
315  return false;
316 
317 }
318 
319 /// @brief return residue pairing
320 Size
322 {
323  runtime_assert( (begin1_ <= res && res <= end1_) || (begin2_ <= res && res <= end2_) );
324  return residue_pair_[ res ];
325 }
326 
327 /// @brief reset begin1_, end1_, begin2_, end2_ based on ssinfo
328 void
330 {
331  Real ir_ist = ss_info->strand( s1_ )->begin();
332  Real len_ist = ss_info->strand( s1_ )->length();
333  Real ir_jst = ss_info->strand( s2_ )->begin();
334  Real er_jst = ss_info->strand( s2_ )->end();
335  Real len_jst = ss_info->strand( s2_ )->length();
336 
337  Real start_ist, start_jst, len,inc;
338 
339  if( is_parallel() ){ // parallel
340 
341  inc = 1;
342 
343  if( rgstr_shift_ >= 0 ) {
344  start_ist = ir_ist + rgstr_shift_;
345  start_jst = ir_jst;
346  if( len_ist >= (len_jst+rgstr_shift_) ) {
347  // i =========>
348  // j =====>
349  len = len_jst;
350  }else{
351  // i =========>
352  // j ==========>
353  len = len_ist - rgstr_shift_;
354  }
355  } else {
356  start_ist = ir_ist;
357  start_jst = ir_jst - rgstr_shift_;
358  if( len_ist >= (len_jst+rgstr_shift_) ) {
359  // i ==========>
360  // j ==========>
361  len = len_jst + rgstr_shift_;
362  } else {
363  // i =====>
364  // j ==========>
365  len = len_ist ;
366  }
367  }
368 
369  } else { // anti parallel
370 
371  inc = -1;
372 
373  if( rgstr_shift_ >= 0 ) {
374  start_ist = ir_ist + rgstr_shift_;
375  start_jst = er_jst;
376  if( len_ist >= (len_jst+rgstr_shift_) ) {
377  // i ==========>
378  // j <=====
379  len = len_jst;
380  } else {
381  // i =========>
382  // j <=========
383  len = len_ist - rgstr_shift_;
384  }
385 
386  } else {
387 
388  start_ist = ir_ist;
389  start_jst = er_jst + rgstr_shift_;
390  if( len_ist >= (len_jst+rgstr_shift_) ) {
391  // i =========>
392  // j <=========
393  len = len_jst + rgstr_shift_;
394  } else {
395  // i =========>
396  // j <==============
397  len = len_ist;
398  }
399 
400  } // if( rgstr_shift_ >= 0 )
401  } // if is_parallel ?
402 
403 
404  for( Size i=1; i<=len ;i++ ) {
405  runtime_assert( start_ist > 0 && start_jst > 0 );
406  if( ! elongate( Size( start_ist ), Size( start_jst ), 0, 0 ) ) {
407  TR << "elongation failed ! " << std::endl;
408  runtime_assert( false );
409  }
410 
411  start_ist ++;
412  start_jst += inc;
413  }
414 
415 }
416 
417 
418 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
419 /// @brief default constructor
421  spairset_name_( "" ),
422  num_strands_( 0 ),
423  finalized_( false ),
424  empty_( new StrandPairing )
425 {}
426 
427 
428 /// @brief value constructor
430  strand_pairings_( strand_pairings ),
431  spairset_name_( "" ),
432  num_strands_( 0 ),
433  finalized_( false ),
434  empty_( new StrandPairing )
435 {
436  finalize();
437 }
438 
439 
440 /// @brief value constructor
441 StrandPairingSet::StrandPairingSet( String const & spairstring, SS_Info2_COP const ssinfo ):
442  spairset_name_( "" ),
443  num_strands_( 0 ),
444  finalized_( false ),
445  empty_( new StrandPairing )
446 {
447  if( spairstring == "" ) {
448  return;
449  }
450 
451  utility::vector1< String > spairs( utility::string_split( spairstring, ';' ) );
452  for( utility::vector1< String >::const_iterator iter = spairs.begin(); iter != spairs.end() ; ++iter) {
453  String spair( *iter );
454  StrandPairingOP sp = new StrandPairing( spair );
455  if( ssinfo ) {
456  sp->redefine_begin_end( ssinfo );
457  }
458  push_back( sp );
459  }
460  finalize();
461 }
462 
463 
464 /// @brief value constructor
465 StrandPairingSet::StrandPairingSet( SS_Info2 const & ssinfo, DimerPairings const & dimer_pairs ):
466  spairset_name_( "" ),
467  num_strands_( 0 ),
468  finalized_( false ),
469  empty_( new StrandPairing )
470 {
471  initialize_by_dimer_pairs( ssinfo, dimer_pairs );
472 }
473 
474 
475 /// @brief copy constructor
477  ReferenceCount(),
478  strand_pairings_( s.strand_pairings_ ),
479  spairset_name_( s.spairset_name_ ),
480  num_strands_( s.num_strands_ ),
481  finalized_( s.finalized_ ),
482  map_strand_pairings_( s.map_strand_pairings_ ),
483  neighbor_strands_( s.neighbor_strands_ ),
484  empty_( s.empty_ )
485 {}
486 
487 
488 /// @brief destructor
490 
491 
492 /// @brief clone this object
495 {
496  return new StrandPairingSet( *this );
497 }
498 
499 
500 /// @brief output detail of strand pairing set
501 std::ostream & operator<<( std::ostream & out, const StrandPairingSet &s )
502 {
503  out << "#### StrandPairingSet Info " << std::endl;
504  out << "# " << s.name() << std::endl;
505 
506  StrandPairings const & spairs( s.strand_pairings() );
507  for( StrandPairings::const_iterator iter = spairs.begin(); iter != spairs.end(); ++iter ) {
508  out << "# " << (**iter) << std::endl;
509  }
510 
511  return out;
512 }
513 
514 
515 /// @brief add StrandPairingOP to StandPairingSet
516 void
518 {
519  finalized_ = false;
520  strand_pairings_.push_back( sop );
521 }
522 
523 
524 /// @brief add StrandPairingOP to StandPairingSet
525 void
527 {
528  strand_pairings_.push_back( sop );
529  finalize();
530 }
531 
532 
533 /// @brief clear data of this StrandParingSet
534 void
536 {
537  strand_pairings_.clear();
538  spairset_name_ = "";
539  finalized_ = false;
540  map_strand_pairings_.clear();
541  neighbor_strands_.clear();
542 }
543 
544 /// @brief return num of strand_pairing
547 {
548  return strand_pairings_.size();
549 }
550 
551 
552 
553 /// @brief return spairset_name_
554 String
556 {
557  runtime_assert( finalized_ );
558  return spairset_name_;
559 }
560 
561 
562 /// @brief return all strand pairings
563 StrandPairings const &
565 {
566  return strand_pairings_;
567 }
568 
569 
570 /// @brief return one of the stand_pairings given a number
573 {
574  runtime_assert( s <= strand_pairings_.size() );
575  return strand_pairings_[ s ];
576 }
577 
578 
579 /// @brief
581 StrandPairingSet::strand_pairing( Size const s1, Size const s2 ) const
582 {
583  runtime_assert( finalized_ );
584  if( s1 <= num_strands_ && s2 <= num_strands_ ) {
585  return map_strand_pairings_[ s1 ][ s2 ];
586  } else {
587  return empty_;
588  }
589 }
590 
591 /// @brief
594 {
595  runtime_assert( finalized_ );
596  runtime_assert( s <= num_strands_ );
597  return neighbor_strands_[ s ];
598 }
599 
600 
601 /// @brief the name of StrandPairingSet without register shift
602 /// For example, 2kl8 of ferredoxin-like fold is described as 1-3.A;2-3.A;1-4.A
603 String
605 {
606  String spairs = "";
607  std::ostringstream name;
608  for ( StrandPairings::const_iterator it=strand_pairings_.begin(),
609  ite=strand_pairings_.end(); it != ite; ++it ) {
610  StrandPairing const & spair( **it );
611  utility::vector1< String > sp( utility::string_split( spair.name(), '.' ) );
612  runtime_assert( sp.size() == 3 );
613  if( spairs == "" ){
614  spairs = sp[ 1 ] + '.' + sp[ 2 ];
615  }else{
616  spairs = spairs + ';' + sp[ 1 ] + '.' + sp[ 2 ];
617  }
618  }
619  return spairs;
620 }
621 
622 
623 /// @brief
625 {
626  return ( a->name() < b->name() );
627 }
628 
629 
630 /// @brief
631 void
633 {
635 
636  finalized_ = true;
637 
638  // sort strand_parings_ by name_ of StrandPairingOP
639  std::sort( strand_pairings_.begin(), strand_pairings_.end(), pointer_sorter );
640 
641  //
642  for ( StrandPairings::const_iterator it=strand_pairings_.begin(), ite=strand_pairings_.end(); it != ite; ++it ) {
643 
644  StrandPairing spair(**it);
645 
646  // set spairset_name_
647  if( spairset_name_ == "" ){
648  spairset_name_ = spair.name();
649  }else{
650  spairset_name_ += ';' + spair.name();
651  }
652  // find max number of strands
653  if( spair.s2() > num_strands_ ){
654  num_strands_ = spair.s2();
655  }
656  }
657 
659  for( Size i=1; i<=num_strands_; i++ ) {
660 
661  // initialize neighbor_strands
662  VecSize vec;
663  neighbor_strands_.insert( std::map< Size, VecSize >::value_type( i, vec ) );
664 
665  // initialize map_strand_pairings_
666  map_strand_pairings_[i].resize( num_strands_ );
667  for( Size j=1; j<=num_strands_; j++ ) {
669  }
670  }
671 
672  for ( StrandPairings::const_iterator it=strand_pairings_.begin(), ite=strand_pairings_.end(); it != ite; ++it ) {
673  StrandPairingOP const spair( *it );
674  // define map_strand_pairings_
675  map_strand_pairings_[ spair->s1() ][ spair->s2() ] = spair;
676  map_strand_pairings_[ spair->s2() ][ spair->s1() ] = spair;
677  // define neighbor_strands_
678  VecSize & neighbor1 ( neighbor_strands_[ spair->s1() ] );
679  VecSize & neighbor2 ( neighbor_strands_[ spair->s2() ] );
680  neighbor1.push_back( spair->s2() );
681  neighbor2.push_back( spair->s1() );
682  }
683  //TR << "#strands = " << num_strands_ << std::endl;
684 }
685 
686 
687 /// @brief
691 {
692  return ( a->size1() > b->size1() );
693 }
694 
695 /// @brief
696 void
698 {
699  runtime_assert( drop_spairs.size() <= strand_pairings_.size() );
700 
701  StrandPairings new_spairs;
702  for( Size jj=1; jj<=strand_pairings_.size(); jj++ ) {
703  bool drop( false );
704  for( Size ii=1; ii<=drop_spairs.size(); ii++ ) {
705  if( strand_pairings_[ jj ]->name() == drop_spairs[ ii ]->name() ) {
706  drop = true;
707  break;
708  }
709  }
710 
711  if( ! drop ) {
712  new_spairs.push_back( strand_pairings_[ jj ] );
713  }
714  }
715 
716  clear();
717  strand_pairings_ = new_spairs;
718 
719  finalize();
720 }
721 
722 
723 
724 /// @brief
725 void
727 {
728  if( ! finalized_ ) {
729  finalize();
730  }
731 
733 
734  bool modified( false );
735  StrandPairings drop_spairs;
736  for( Size ist=1; ist<=num_strands_; ist++ ) {
737 
738  StrandPairings spairs;
739  if( neighbor_strands( ist ).size() > 2 ) {
740 
741  modified = true;
742  for ( VecSize::const_iterator
743  it=neighbor_strands( ist ).begin(), ite=neighbor_strands( ist ).end(); it != ite; ++it ) {
744  Size jst( *it );
745  spairs.push_back( strand_pairing( ist, jst ) );
746  }
747  std::sort( spairs.begin(), spairs.end(), sort_by_length );
748 
749  for( Size i=3; i<=spairs.size(); i++ ) {
750  if( pairmap[ spairs[ i ]->s1() ][ spairs[ i ]->s2() ] ) continue;
751  pairmap[ spairs[ i ]->s1() ][ spairs[ i ]->s2() ] = true;
752  pairmap[ spairs[ i ]->s2() ][ spairs[ i ]->s1() ] = true;
753  drop_spairs.push_back( spairs[ i ] );
754  }
755  }
756 
757  }
758 
759  if( modified ) {
760  drop_strand_pairs( drop_spairs );
761  }
762 
763 }
764 
765 /// @brief initialize StrandPairingSet based on dimer_pairs ( under developed )
766 void
768 {
769  // set number of strands
770  num_strands_ = ssinfo.strands().size();
771 
772  // intialize map strand pairings
774  for( Size i=1; i<=num_strands_; i++ ) {
775  map_strand_pairings_[i].resize( num_strands_ );
776  for( Size j=1; j<=num_strands_; j++ ) {
778  }
779  }
780 
781  for ( DimerPairings::const_iterator it=dimer_pairs.begin(); it != dimer_pairs.end(); ++it ) {
782 
783  DimerPairing const & dp ( **it );
784 
785  if( (dp.sign1() == 1 && dp.sign2() == 1) || (dp.sign1() == 2 && dp.sign2() == 2) ) continue;
786 
787  Size iaa = dp.res1();
788  Size jaa = dp.res2();
789  Size istrand = ssinfo.strand_id( iaa );
790  Size jstrand = ssinfo.strand_id( jaa );
791  Size ist_begin = ssinfo.strand( istrand )->begin();
792  Size jst_begin = ssinfo.strand( jstrand )->begin();
793  Size jst_length = ssinfo.strand( jstrand )->length();
794 
795  StrandPairingOP & spop = map_strand_pairings_[ istrand ][ jstrand ];
796  if( spop == 0 ){
797  spop = new StrandPairing( istrand, jstrand, 0, dp.orient() );
798  strand_pairings_.push_back( spop );
799  }
800 
801  if( dp.orient() == 'A' ){
802 
803  Real rgstr = Real(iaa) - Real(ist_begin) - (Real(jst_length) - (Real(jaa) - Real(jst_begin)));
804  spop->add_pair( iaa, jaa+1, dp.orient(), rgstr );
805  spop->add_pair( iaa+1, jaa, dp.orient(), rgstr );
806 
807  } else if( dp.orient() == 'P' ) {
808 
809  Real rgstr = Real(iaa) - Real(ist_begin) - ( Real(jaa) - Real(jst_begin) );
810  spop->add_pair( iaa, jaa, dp.orient(), rgstr );
811  spop->add_pair( iaa+1, jaa+1, dp.orient(), rgstr );
812 
813  } else {
814  runtime_assert( false );
815  }
816 
817  } // for ( DimerPairings )
818 
819  finalize();
820 
821 }
822 
823 
824 
825 } // namespace topology
826 } // namespace fldsgn
827 } // namespace protocols