30 #include "../common/WLogger.h"
31 #include "../common/datastructures/WFiber.h"
33 #include "WDataSetFiberVector.h"
56 wlog::error(
"WDataSetFiberVector" ) <<
"During constructing a WDataSetFiberVector out of an empty WDataSetFibers";
60 if( fiberDS->getFilename() !=
"" )
64 size_t numLines = fiberDS->size();
65 const std::vector< size_t >& lineLengths = *fiberDS->getLineLengths();
68 while(
size() < numLines )
71 for(
size_t i = 0; i < lineLengths[
size() ]; ++i )
102 std::sort(
begin(),
end(), hasMorePointsThen );
108 assert( unused.size() ==
size() );
109 for(
size_t i = 0 ; i < unused.size(); ++i )
113 result->push_back(
at( i ) );
126 return "WDataSetFiberVector";
131 return "Contains tracked fiber data.";
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 > );
151 fiberStartIndices->reserve(
size() );
152 fiberLengths->reserve(
size() );
160 fiberStartIndices->
push_back( points->size() / 3 );
161 fiberLengths->push_back( fib.
size() );
164 points->push_back( ( *fit )[0] );
165 points->push_back( ( *fit )[1] );
166 points->push_back( ( *fit )[2] );
167 pointFiberMapping->push_back( fiberID );
171 return std::shared_ptr< WDataSetFibers >(
new WDataSetFibers( points, fiberStartIndices, fiberLengths, pointFiberMapping ) );
174 std::shared_ptr< WFiber > centerLine( std::shared_ptr< const WDataSetFiberVector > tracts )
176 if( !tracts || tracts->empty() )
178 return std::shared_ptr< WFiber >(
new WFiber() );
181 size_t avgTractSize = 0;
184 avgTractSize += cit->size();
186 avgTractSize /= tracts->size();
188 WFiber firstTract( tracts->front() );
189 firstTract.resampleByNumberOfPoints( avgTractSize );
190 std::shared_ptr< WFiber > result(
new WFiber( firstTract ) );
192 for(
size_t tractIndex = 1; tractIndex < tracts->size(); ++tractIndex )
194 WFiber other( tracts->at( tractIndex ) );
195 other.resampleByNumberOfPoints( avgTractSize );
196 other.unifyDirectionBy( firstTract );
198 for(
size_t pointIndex = 0; pointIndex < avgTractSize; ++pointIndex )
200 result->at( pointIndex ) += other[ pointIndex ];
204 for(
size_t pointIndex = 0; pointIndex < avgTractSize; ++pointIndex )
206 result->at( pointIndex ) /=
static_cast< double >( tracts->size() );
212 std::shared_ptr< WFiber > longestLine( std::shared_ptr< const WDataSetFiberVector > tracts )
214 if( !tracts || tracts->empty() )
216 return std::shared_ptr< WFiber >(
new WFiber() );
222 for(
size_t tractIndex = 0; tractIndex < tracts->size(); ++tractIndex )
224 if( maxSize < tracts->at( tractIndex ).size() )
226 maxSize = tracts->at( tractIndex ).size();
227 maxIndex = tractIndex;
231 return std::shared_ptr< WFiber >(
new WFiber( tracts->at( maxIndex ) ) );
234 std::shared_ptr< WFiber > centerLine( std::shared_ptr< const WDataSetFibers > tracts )
236 return centerLine( std::shared_ptr< WDataSetFiberVector >(
new WDataSetFiberVector( tracts ) ) );
239 std::shared_ptr< WFiber > longestLine( std::shared_ptr< const WDataSetFibers > tracts )
241 return longestLine( std::shared_ptr< WDataSetFiberVector >(
new WDataSetFiberVector( tracts ) ) );
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.
void setFilename(const std::string filename)
Set the name of the file that this data set stems from.
Represents a neural pathway.
This is taken from OpenSceneGraph <osg/MixinVector> but copy and pasted in order to reduce dependency...
void reserve(size_type new_capacity)
Wrapper around std::vector member function.
size_type size() const
Wrapper around std::vector member function.
void push_back(const value_type &value)
Wrapper around std::vector member function.
const_iterator end() const
Wrapper around std::vector member function.
const_iterator begin() const
Wrapper around std::vector member function.
const_reference at(size_type index) const
Wrapper around std::vector member function.
void assign(size_type count, const value_type &value)
Wrapper around std::vector member function.
vector_type::const_iterator const_iterator
Compares to std::vector type.
WStreamedLogger error(const std::string &source)
Logging an error message.