OpenWalnut  1.5.0dev
WDataSetFiberVector.cpp
1 //---------------------------------------------------------------------------
2 //
3 // Project: OpenWalnut ( http://www.openwalnut.org )
4 //
5 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
6 // For more information see http://www.openwalnut.org/copying
7 //
8 // This file is part of OpenWalnut.
9 //
10 // OpenWalnut is free software: you can redistribute it and/or modify
11 // it under the terms of the GNU Lesser General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // OpenWalnut is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU Lesser General Public License for more details.
19 //
20 // You should have received a copy of the GNU Lesser General Public License
21 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
22 //
23 //---------------------------------------------------------------------------
24 
25 #include <algorithm>
26 #include <memory>
27 #include <string>
28 #include <vector>
29 
30 #include "../common/WLogger.h"
31 #include "../common/datastructures/WFiber.h"
32 #include "WDataSet.h"
33 #include "WDataSetFiberVector.h"
34 
35 // prototype instance as singleton
36 std::shared_ptr< WPrototyped > WDataSetFiberVector::m_prototype = std::shared_ptr< WPrototyped >();
37 
39  : WMixinVector< WFiber >(),
40  WDataSet()
41 {
42 }
43 
44 WDataSetFiberVector::WDataSetFiberVector( std::shared_ptr< std::vector< WFiber > > fibs )
45  : WMixinVector< WFiber >( *fibs ), // COPYING this into this since, WMixinVector has no possibility for references or std::shared_ptr
46  WDataSet()
47 {
48 }
49 
50 WDataSetFiberVector::WDataSetFiberVector( std::shared_ptr< const WDataSetFibers > fiberDS )
51  : WMixinVector< WFiber >(),
52  WDataSet()
53 {
54  if( !fiberDS.get() )
55  {
56  wlog::error( "WDataSetFiberVector" ) << "During constructing a WDataSetFiberVector out of an empty WDataSetFibers";
57  return;
58  }
59 
60  if( fiberDS->getFilename() != "" )
61  {
62  setFilename( fiberDS->getFilename() );
63  }
64  size_t numLines = fiberDS->size();
65  const std::vector< size_t >& lineLengths = *fiberDS->getLineLengths();
66  reserve( numLines );
67 
68  while( size() < numLines )
69  {
70  WFiber fib;
71  for( size_t i = 0; i < lineLengths[ size() ]; ++i )
72  {
73  fib.push_back( fiberDS->getPosition( size(), i ) );
74  }
75  push_back( fib );
76  }
77 }
78 
80  : WMixinVector< WFiber >( other ),
81  WDataSet()
82 {
83 }
84 
86 {
87  if( this == &other )
88  {
89  return *this;
90  }
91  assign( other.begin(), other.end() );
92  return *this;
93 }
94 
96 {
97  // since no pointer deallocation is needed, nothing to do here
98 }
99 
101 {
102  std::sort( begin(), end(), hasMorePointsThen );
103 }
104 
105 std::shared_ptr< WDataSetFiberVector > WDataSetFiberVector::generateDataSetOutOfUsedFibers( const std::vector< bool > &unused ) const
106 {
107  std::shared_ptr< WDataSetFiberVector > result( new WDataSetFiberVector() );
108  assert( unused.size() == size() );
109  for( size_t i = 0 ; i < unused.size(); ++i )
110  {
111  if( !unused[i] )
112  {
113  result->push_back( at( i ) );
114  }
115  }
116  return result;
117 }
118 
120 {
121  return false;
122 }
123 
124 const std::string WDataSetFiberVector::getName() const
125 {
126  return "WDataSetFiberVector";
127 }
128 
129 const std::string WDataSetFiberVector::getDescription() const
130 {
131  return "Contains tracked fiber data.";
132 }
133 
134 std::shared_ptr< WPrototyped > WDataSetFiberVector::getPrototype()
135 {
136  if( !m_prototype )
137  {
138  m_prototype = std::shared_ptr< WPrototyped >( new WDataSetFiberVector() );
139  }
140 
141  return m_prototype;
142 }
143 
144 std::shared_ptr< WDataSetFibers > WDataSetFiberVector::toWDataSetFibers() const
145 {
146  std::shared_ptr< std::vector< float > > points( new std::vector< float > );
147  std::shared_ptr< std::vector< size_t > > fiberStartIndices( new std::vector< size_t > );
148  std::shared_ptr< std::vector< size_t > > fiberLengths( new std::vector< size_t > );
149  std::shared_ptr< std::vector< size_t > > pointFiberMapping( new std::vector< size_t > );
150 
151  fiberStartIndices->reserve( size() );
152  fiberLengths->reserve( size() );
153  // other reserving for points and pointFiberMapping is not possible here without cycling through the whole data
154 
155  size_t fiberID = 0;
156  for( const_iterator cit = begin(); cit != end(); ++cit, ++fiberID )
157  {
158  const WFiber& fib = *cit;
159  // the division by 3 is necessary since it carries the point numbers not the number of the i'th component
160  fiberStartIndices->push_back( points->size() / 3 );
161  fiberLengths->push_back( fib.size() );
162  for( WFiber::const_iterator fit = fib.begin(); fit != fib.end(); ++fit )
163  {
164  points->push_back( ( *fit )[0] );
165  points->push_back( ( *fit )[1] );
166  points->push_back( ( *fit )[2] );
167  pointFiberMapping->push_back( fiberID );
168  }
169  }
170 
171  return std::shared_ptr< WDataSetFibers >( new WDataSetFibers( points, fiberStartIndices, fiberLengths, pointFiberMapping ) );
172 }
173 
174 std::shared_ptr< WFiber > centerLine( std::shared_ptr< const WDataSetFiberVector > tracts )
175 {
176  if( !tracts || tracts->empty() ) // invalid data produces invalid center lines
177  {
178  return std::shared_ptr< WFiber >( new WFiber() );
179  }
180 
181  size_t avgTractSize = 0;
182  for( WDataSetFiberVector::const_iterator cit = tracts->begin(); cit != tracts->end(); ++cit )
183  {
184  avgTractSize += cit->size();
185  }
186  avgTractSize /= tracts->size();
187 
188  WFiber firstTract( tracts->front() );
189  firstTract.resampleByNumberOfPoints( avgTractSize );
190  std::shared_ptr< WFiber > result( new WFiber( firstTract ) ); // copy the first tract into result centerline
191 
192  for( size_t tractIndex = 1; tractIndex < tracts->size(); ++tractIndex )
193  {
194  WFiber other( tracts->at( tractIndex ) );
195  other.resampleByNumberOfPoints( avgTractSize );
196  other.unifyDirectionBy( firstTract );
197 
198  for( size_t pointIndex = 0; pointIndex < avgTractSize; ++pointIndex )
199  {
200  result->at( pointIndex ) += other[ pointIndex ];
201  }
202  }
203 
204  for( size_t pointIndex = 0; pointIndex < avgTractSize; ++pointIndex )
205  {
206  result->at( pointIndex ) /= static_cast< double >( tracts->size() );
207  }
208 
209  return result;
210 }
211 
212 std::shared_ptr< WFiber > longestLine( std::shared_ptr< const WDataSetFiberVector > tracts )
213 {
214  if( !tracts || tracts->empty() ) // invalid data produces invalid longest lines
215  {
216  return std::shared_ptr< WFiber >( new WFiber() );
217  }
218 
219  size_t maxSize = 0;
220  size_t maxIndex = 0;
221 
222  for( size_t tractIndex = 0; tractIndex < tracts->size(); ++tractIndex )
223  {
224  if( maxSize < tracts->at( tractIndex ).size() )
225  {
226  maxSize = tracts->at( tractIndex ).size();
227  maxIndex = tractIndex;
228  }
229  }
230 
231  return std::shared_ptr< WFiber >( new WFiber( tracts->at( maxIndex ) ) );
232 }
233 
234 std::shared_ptr< WFiber > centerLine( std::shared_ptr< const WDataSetFibers > tracts )
235 {
236  return centerLine( std::shared_ptr< WDataSetFiberVector >( new WDataSetFiberVector( tracts ) ) );
237 }
238 
239 std::shared_ptr< WFiber > longestLine( std::shared_ptr< const WDataSetFibers > tracts )
240 {
241  return longestLine( std::shared_ptr< WDataSetFiberVector >( new WDataSetFiberVector( tracts ) ) );
242 }
Represents a simple set of WFibers.
virtual const std::string getDescription() const
Gets the description for this prototype.
std::shared_ptr< WDataSetFiberVector > generateDataSetOutOfUsedFibers(const std::vector< bool > &unused) const
Generates new WDataSetFiberVector out of the used fibers from this dataset.
std::shared_ptr< WDataSetFibers > toWDataSetFibers() const
Convert this dataset into WDataSetFibers format for other purposes if needed.
virtual ~WDataSetFiberVector()
Destructs WDataSetFiberVector instances.
static std::shared_ptr< WPrototyped > getPrototype()
Returns a prototype instantiated with the true type of the deriving class.
WDataSetFiberVector()
Default constructor for creating an empty fiber vector.
void sortDescLength()
Sort fibers descending on their length and update.
virtual bool isTexture() const
Determines whether this dataset can be used as a texture.
static std::shared_ptr< WPrototyped > m_prototype
The prototype as singleton.
virtual const std::string getName() const
Gets the name of this prototype.
WDataSetFiberVector & operator=(const WDataSetFiberVector &other)
Operator for assigning instances of WDataSetFiberVector.
Represents a simple set of WFibers.
Base class for all data set types.
Definition: WDataSet.h:50
void setFilename(const std::string filename)
Set the name of the file that this data set stems from.
Definition: WDataSet.cpp:58
Represents a neural pathway.
Definition: WFiber.h:40
This is taken from OpenSceneGraph <osg/MixinVector> but copy and pasted in order to reduce dependency...
Definition: WMixinVector.h:48
void reserve(size_type new_capacity)
Wrapper around std::vector member function.
Definition: WMixinVector.h:227
size_type size() const
Wrapper around std::vector member function.
Definition: WMixinVector.h:267
void push_back(const value_type &value)
Wrapper around std::vector member function.
Definition: WMixinVector.h:457
const_iterator end() const
Wrapper around std::vector member function.
Definition: WMixinVector.h:327
const_iterator begin() const
Wrapper around std::vector member function.
Definition: WMixinVector.h:307
const_reference at(size_type index) const
Wrapper around std::vector member function.
Definition: WMixinVector.h:413
void assign(size_type count, const value_type &value)
Wrapper around std::vector member function.
Definition: WMixinVector.h:436
vector_type::const_iterator const_iterator
Compares to std::vector type.
Definition: WMixinVector.h:87
WStreamedLogger error(const std::string &source)
Logging an error message.
Definition: WLogger.h:298