Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
cacheable_observers.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 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file basic/datacache/cacheable_observers.cc
11 /// @brief a bunch of cacheable observers
12 ///
13 /// @author Florian Richter ( floric@u.washington.edu)
14 
15 // Unit headers
17 
18 // Package headers
19 // AUTO-REMOVED #include <basic/datacache/BasicDataCache.hh>
22 
23 // Project headers
26 #include <core/pose/Pose.hh>
27 
28 #include <ObjexxFCL/FArray1D.hh>
29 
30 //c++ headers
31 #include <set>
32 
33 #include <utility/vector1.hh>
34 #include <boost/foreach.hpp>
35 
36 //Auto Headers
37 #define foreach BOOST_FOREACH
38 namespace core {
39 namespace pose {
40 namespace datacache {
41 
42 
43 /// @brief default constructor
46 {
47  length_events_.clear();
48 }
49 
50 
51 /// @brief copy constructor
53  CacheableObserver( rval )
54 {
56 }
57 
59  detach_from();
60 }
61 
62 
63 /// @brief copy assignment
66  if ( this != &rval ) {
68 
70  }
71 
72  return *this;
73 }
74 
77  return length_events_;
78 }
79 
80 
83 {
84  return new LengthEventCollector();
85 }
86 
89 {
90  return new LengthEventCollector( *this );
91 }
92 
93 
94 void
97 ){
98 
99  using namespace core::conformation::signals;
100  length_events_.clear();
101 
102  foreach(LengthEvent event, events){
103  length_events_.push_back( LengthEvent( event ) );
104  }
105 
106 }
107 
108 /// @details all this class does is keep track of length events
109 void
111 
113 }
114 
115 void
117 
119 
120 }
121 
122 void
124 
125  length_event_link_.invalidate();
126 
127 }
128 
129 
131 : Parent() {}
132 
134  : Parent( rval ), segments_(rval.segments_ ) {}
135 
137  detach_from(); }
138 
139 /// @brief copy assignment
142  if ( this != &rval ) {
144 
145  segments_ = rval.segments_;
146  }
147 
148  return *this;
149 }
150 
153 {
154  return new SpecialSegmentsObserver();
155 }
156 
159 {
160  return new SpecialSegmentsObserver( *this );
161 }
162 
163 void
165 {
166  segments_.clear();
167 }
168 
169 void
171  Size begin,
172  Size end
173 ){
174  //dummy check
175  if( begin > end ) utility_exit_with_message("Negative length segment added to SpecialSegmentsObserver.");
176 
177  segments_.push_back( std::pair< Size, Size >(begin, end ) );
178 }
179 
180 
181 void
183  ObjexxFCL::FArray1D_bool & array,
184  core::pose::Pose const & pose,
185  bool const value
186 ){
187 
190 
191 
192  for( core::Size i = 1; i <= segments.size(); ++i ){
193  for( core::Size j = segments[i].first; j < segments[i].second; ++j ) array[ j - 1 ] = value;
194  }
195  }
196 }
197 
198 /// @details figure out where the loops are after the length has changed
199 /// note: in case the segment got deleted, it will also be removed from
200 /// the observer
201 void
203 
204  std::set< Size > deleted_segments; //in case stuff gets deleted, we have to rearrange the segment vector
205  //std::cerr << "SSO getting hit with event at pos " << event.position << " of change " << event.length_change << " ";
206  for( Size i(1); i<= segments_.size(); ++i ){
207  //3 possibilites:
208  //1. event downstream of segment, segment remains unchanged
209  //2. event upstream of segment, segment gets shifted or (partially) deleted
210  //3. event in segment, segment gets lengthened/shortened
211  //std::cerr << "(" << segments_[i].first << "," << segments_[i].second << ")" << "moves to ";
212 
213  //1.
214  if( event.position > segments_[i].second ){} //event happened downstream of the segment, i.e. segment unchanged
215 
216  //2.
217  else if( event.position < segments_[i].first ){
218 
219  if( event.length_change < 0 ) { //deletion?
220 
221  if( int( event.position - event.length_change ) > int(segments_[i].second) ){ //complete segment deleted?
222  deleted_segments.insert(i);
223  }
224  else if( int( event.position - event.length_change ) > int(segments_[i].first) ){ //partial segment deleted?
225  segments_[i].first = event.position - event.length_change;
226  segments_[i].second += event.length_change;
227  }
228  else{ //deletion before segment
229  segments_[i].first += event.length_change;
230  segments_[i].second += event.length_change;
231  }
232  } //if length_change < 0 //deletion
233  else{ //insertion before segment
234  segments_[i].first += event.length_change;
235  segments_[i].second += event.length_change;
236  }
237  } //if event.position < segments_[i].first
238 
239  //3. event in segment
240  else{
241  if( event.length_change < 0 ){ //deletion?
242  if( int( event.position - event.length_change ) > int(segments_[i].second) ){ //deletion past end of segment?
243  segments_[i].second = event.position;
244  }
245  else{ //deletion within segment
246  segments_[i].second += event.length_change;
247  }
248  } //if deletion
249  else{ //insertion in segment
250  segments_[i].second += event.length_change;
251  }
252  }
253  //std::cerr << "(" << segments_[i].first << "," << segments_[i].second << ") ";
254  }//loop over segments
255  //std::cerr << std::endl;
256 
257  //in case complete segments have been deleted, we need to restructure the vector
258  if( deleted_segments.size() > 0 ){
259  utility::vector1< Segment > new_segments;
260  for( Size i = 1; i <= segments_.size(); ++i){
261  if( deleted_segments.find( i ) != deleted_segments.end() ) new_segments.push_back( segments_[i] );
262  }
263  segments_ = new_segments;
264  }
265 }
266 
267 
268 void
270 
272 
273 }
274 
275 void
277 
278  length_event_link_.invalidate();
279 
280 }
281 
282 
283 
284 } // namespace datacache
285 } // namespace pose
286 } // namespace core