29 #include "../common/WLogger.h"
30 #include "../common/datastructures/WFiber.h"
32 #include "WDataSetFiberVector.h"
55 wlog::error(
"WDataSetFiberVector" ) <<
"During constructing a WDataSetFiberVector out of an empty WDataSetFibers";
59 if( fiberDS->getFilename() !=
"" )
63 size_t numLines = fiberDS->size();
64 const std::vector< size_t >& lineLengths = *fiberDS->getLineLengths();
67 while(
size() < numLines )
70 for(
size_t i = 0; i < lineLengths[
size() ]; ++i )
101 std::sort(
begin(),
end(), hasMorePointsThen );
107 assert( unused.size() ==
size() );
108 for(
size_t i = 0 ; i < unused.size(); ++i )
112 result->push_back(
at( i ) );
125 return "WDataSetFiberVector";
130 return "Contains tracked fiber data.";
145 boost::shared_ptr< std::vector< float > > points(
new std::vector< float > );
146 boost::shared_ptr< std::vector< size_t > > fiberStartIndices(
new std::vector< size_t > );
147 boost::shared_ptr< std::vector< size_t > > fiberLengths(
new std::vector< size_t > );
148 boost::shared_ptr< std::vector< size_t > > pointFiberMapping(
new std::vector< size_t > );
150 fiberStartIndices->reserve(
size() );
151 fiberLengths->reserve(
size() );
159 fiberStartIndices->
push_back( points->size() / 3 );
160 fiberLengths->push_back( fib.
size() );
163 points->push_back( ( *fit )[0] );
164 points->push_back( ( *fit )[1] );
165 points->push_back( ( *fit )[2] );
166 pointFiberMapping->push_back( fiberID );
170 return boost::shared_ptr< WDataSetFibers >(
new WDataSetFibers( points, fiberStartIndices, fiberLengths, pointFiberMapping ) );
173 boost::shared_ptr< WFiber > centerLine( boost::shared_ptr< const WDataSetFiberVector > tracts )
175 if( !tracts || tracts->empty() )
177 return boost::shared_ptr< WFiber >(
new WFiber() );
180 size_t avgTractSize = 0;
183 avgTractSize += cit->size();
185 avgTractSize /= tracts->size();
187 WFiber firstTract( tracts->front() );
189 boost::shared_ptr< WFiber > result(
new WFiber( firstTract ) );
191 for(
size_t tractIndex = 1; tractIndex < tracts->size(); ++tractIndex )
193 WFiber other( tracts->at( tractIndex ) );
195 other.unifyDirectionBy( firstTract );
197 for(
size_t pointIndex = 0; pointIndex < avgTractSize; ++pointIndex )
199 result->at( pointIndex ) += other[ pointIndex ];
203 for(
size_t pointIndex = 0; pointIndex < avgTractSize; ++pointIndex )
205 result->at( pointIndex ) /=
static_cast< double >( tracts->size() );
211 boost::shared_ptr< WFiber > longestLine( boost::shared_ptr< const WDataSetFiberVector > tracts )
213 if( !tracts || tracts->empty() )
215 return boost::shared_ptr< WFiber >(
new WFiber() );
221 for(
size_t tractIndex = 0; tractIndex < tracts->size(); ++tractIndex )
223 if( maxSize < tracts->at( tractIndex ).size() )
225 maxSize = tracts->at( tractIndex ).size();
226 maxIndex = tractIndex;
230 return boost::shared_ptr< WFiber >(
new WFiber( tracts->at( maxIndex ) ) );
233 boost::shared_ptr< WFiber > centerLine( boost::shared_ptr< const WDataSetFibers > tracts )
235 return centerLine( boost::shared_ptr< WDataSetFiberVector >(
new WDataSetFiberVector( tracts ) ) );
238 boost::shared_ptr< WFiber > longestLine( boost::shared_ptr< const WDataSetFibers > tracts )
240 return longestLine( boost::shared_ptr< WDataSetFiberVector >(
new WDataSetFiberVector( tracts ) ) );