Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
FragSet.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 // :noTabs=false:tabSize=4:indentSize=4:
4 //
5 // (c) Copyright Rosetta Commons Member Institutions.
6 // (c) This file is part of the Rosetta software suite and is made available under license.
7 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
8 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
9 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
10 
11 /// @file core/fragments/FragSet.cc
12 /// @brief set of fragments for a certain alignment frame
13 /// @author Oliver Lange (olange@u.washington.edu)
14 /// @author James Thompson (tex@u.washington.edu)
15 /// @date Wed Oct 20 12:08:31 2007
16 ///
17 
18 // Unit Headers
19 #include <core/fragment/FragSet.hh>
20 
21 // Package Headers
22 // AUTO-REMOVED #include <core/fragment/BBTorsionSRFD.hh>
23 #include <core/fragment/Frame.hh>
27 
28 
29 // Project Headers
31 // AUTO-REMOVED #include <core/pose/Pose.hh>
32 #include <core/types.hh>
33 
34 
35 // ObjexxFCL Headers
36 
37 // Utility headers
38 #include <utility/vector1.fwd.hh>
39 #include <utility/exit.hh>
40 // AUTO-REMOVED #include <utility/io/izstream.hh>
41 #include <utility/pointer/owning_ptr.hh>
42 
43 #include <basic/Tracer.hh>
44 
45 #include <ostream>
46 // AUTO-REMOVED #include <set>
47 
48 #include <core/fragment/FragID.hh>
50 #include <utility/vector1.hh>
51 
52 
53 namespace core {
54 namespace fragment {
55 
56 using namespace kinematics;
57 
58 static basic::Tracer tr("core.fragment");
59 
60 ///@brief return a list of frames that all sample the specified region, assume all motions are allowed
61 Size
65  core::Size min_overlap,
66  core::Size min_length,
67  FrameList &frames
68 ) const {
69  kinematics::MoveMap move_map;
70  move_map.set_bb( true );
71  move_map.set_chi( true );
72  move_map.set_jump( true );
73  return region( move_map, start, end, min_overlap, min_length, frames );
74 }
75 
76 
77  // put all fragments in FragID_list into this FragSet.
78  // this function has the following effect:
79  // fragments that belong to the same frame are copied into a new frame
80  // the frame gets added. If all fragments of a frame are in the list, the frame is just added as is
81  //
83  utility::vector1< bool > handled(list.size(), false );
84  Size pos( 1 );
85  for ( FragID_List::iterator it=list.begin(), eit=list.end(); it!=eit; ++it,++pos ) {
86  if ( !handled[ pos ] ) {
87  FrameOP new_frame = it->frame().clone();
88  Size spos( pos );
89  for ( FragID_List::iterator sit=it; sit!=eit; ++sit, spos++ ) {
90  if ( sit->frame_ptr() == it->frame_ptr() ) {
91  handled[ spos ] = true;
92  new_frame->add_fragment( &( sit->fragment() ) );
93  new_frame->clone_cache_data( it->frame(), it->id(), new_frame->nr_frags() /* last added fragment */ );
94  };
95  }
96 
97  tr.Debug << pos << ": add frame " << new_frame << " " << new_frame->nr_frags() << std::endl;
98  add( new_frame );
99  } // handled
100  }
101 }
102 
103 void FragSet::add( FragID const& frag_id ) {
104  Frame const& aFrame( frag_id.frame() );
105  //std::cerr << "FragSet::add_frame " << std::endl;
106  runtime_assert( aFrame.nr_frags() ); // do not allow insertion of empty frames --> makes frag_id iterator sooo much easier
107  Size start ( aFrame.start() );
108  Size end ( aFrame.end() );
109  Size length( aFrame.length() );
110 
111  if ( min_pos() > start ) {
112  set_min_pos( start );
113  };
114 
115  if ( max_pos() < end ) {
116  set_max_pos( end );
117  };
118 
119  // tr.Trace << "frag length " << length << " ( " << max_frag_length() << " ) " << std::endl;
120  if ( length > max_frag_length() ) {
121  tr.Trace << "set max frag length " << length << std::endl;
122  set_max_frag_length( length );
123  }
124 
125  // now add frame:
126  FrameList present_frames;
127  Size nr_present = frames( start, present_frames );
128  if ( nr_present ) {
129  for ( FrameList::iterator it = present_frames.begin(),
130  eit = present_frames.end(); it!=eit; ++it ) {
131  if ( (*it)->is_mergeable( aFrame ) ) {
132  Size const new_id( (*it)->add_fragment( const_cast< FragData*>( frag_id.fragment_ptr().get() ) ) );
133  (*it)->clone_cache_data( aFrame, frag_id.id(), new_id );
134  return; //finished early
135  }
136  }
137  }
138  //didn't found mergable frames at this sequence position
139  // make a new empty frame for this Fragment
140  FrameOP new_frame = aFrame.clone();
141  Size const new_id( new_frame->add_fragment( const_cast< FragData*>( frag_id.fragment_ptr().get() ) ) );
142  new_frame->clone_cache_data( aFrame, frag_id.id(), new_id );
143  add_( new_frame );
144 }
145 
146 void
147 FragSet::generate_insert_map( MoveMap const& mm, InsertMap &insert_map, InsertSize &insert_size ) const {
148  tr.Debug << "generate insert map from Movemap:\n";
149  for ( Size i = 1; i<=max_pos(); i++) {
150  if ( mm.get_bb( i ) ) tr.Debug << "*";
151  else tr.Debug << "x";
152  }
153  tr.Debug << std::endl;
154  typedef std::map< Size, Size> InsertSet;
155  InsertSet insert_set;
156 
157  for ( FrameIterator it=begin(), eit=end(); it!=eit; ++it ) {
158  Size size ( it->is_valid() ? it->is_applicable( mm ) : 0 );
159  if ( size ) {
160  if ( insert_set[ it->start() ] < size ) insert_set[ it->start() ] = size;
161  }
162  }
163 
164  insert_map.clear();
165  insert_size.clear();
166  if( insert_set.size() != 0){
167  insert_size.resize( insert_set.rbegin()->first ); //the largest residue in insert_map
168  }
169  // now copy it into a simple vector of numbers
170  //for ( std::set< std::pair< Size, Size > >::const_iterator it=insert_set.begin(), eit=insert_set.end();
171  for ( InsertSet::const_iterator it=insert_set.begin(), eit=insert_set.end();
172  it!=eit; ++it ) {
173  insert_map.push_back( it->first );
174  insert_size[ it->first ] = it->second;
175  }
176 }
177 
179  Size tot = 0;
180  for ( FrameIterator it=begin(), eit=end(); it!=eit; ++it ) {
181  tot+=(*it)->nr_frags();
182  }
183  return tot; //frames_.size();
184 }
185 
187  Size tot = 0;
188  for ( FrameIterator it=begin(), eit=end(); it!=eit; ++it ) {
189  tot+=1;
190  }
191  return tot; //frames_.size();
192 }
193 
194 void
196  //std::cerr << "FragSet::add_frame " << std::endl;
197  runtime_assert( aFrame->nr_frags() ); // do not allow insertion of empty frames --> makes frag_id iterator sooo much easier
198  Size start ( aFrame->start() );
199  Size end ( aFrame->end() );
200  Size length( aFrame->length() );
201 
202  if ( min_pos() > start ) {
203  set_min_pos( start );
204  };
205 
206  if ( max_pos() < end ) {
207  set_max_pos( end );
208  };
209 
210  // tr.Trace << "frag length " << length << " ( " << max_frag_length() << " ) " << std::endl;
211  if ( length > max_frag_length() ) {
212  tr.Trace << "set max frag length " << length << std::endl;
213  set_max_frag_length( length );
214  }
215 
216  // now add frame:
217  FrameList present_frames;
218  Size nr_present = frames( start, present_frames );
219  if ( !nr_present ) {
220  add_( aFrame );
221  } else {
222  for ( FrameList::iterator it = present_frames.begin(),
223  eit = present_frames.end(); it!=eit; ++it ) {
224  if ( (*it)->is_mergeable( *aFrame ) ) {
225  (*it)->merge( *aFrame );
226  return; //finished early
227  }
228  }
229  //didn't found mergable frames at this sequence position
230  add_( aFrame );
231  }
232 }
233 
234 void
235 FragSet::add( FrameList const& frames ) {
236  for ( FrameList::const_iterator it=frames.begin(), eit=frames.end(); it!=eit; ++it ) {
237  add( *it );
238  }
239 }
240 
241 void
242 FragSet::add( FragSet const& cframes ) {
243  for ( FrameIterator it=cframes.begin(), eit=cframes.end(); it!=eit; ++it ) {
244  add( *it );
245  }
246 }
247 
248 std::ostream& operator<< (std::ostream& out, FragSet const& cfrags ) {
249  for ( FrameIterator it = cfrags.begin(), eit = cfrags.end(); it!=eit; ++it ) {
250  out << *(*it);
251  }
252  return out;
253 }
254 
255 } //fragment
256 } //core