#define __FPA__IO__MINIMUMSPANNINGTREEREADER__HXX__
#include <fstream>
+#include <sstream>
+#include <itkMacro.h>
+#include <itkOffset.h>
// -------------------------------------------------------------------------
-template< class T >
-T* fpa::IO::MinimumSpanningTreeReader< T >::
+template< class _TTree >
+_TTree* fpa::IO::MinimumSpanningTreeReader< _TTree >::
GetOutput( )
{
- return( itkDynamicCastInDebugMode< T* >( this->GetPrimaryOutput( ) ) );
+ return(
+ dynamic_cast< _TTree* >( this->itk::ProcessObject::GetOutput( 0 ) )
+ );
}
// -------------------------------------------------------------------------
-template< class T >
-void fpa::IO::MinimumSpanningTreeReader< T >::
+template< class _TTree >
+void fpa::IO::MinimumSpanningTreeReader< _TTree >::
Update( )
{
this->GenerateData( );
}
// -------------------------------------------------------------------------
-template< class T >
-fpa::IO::MinimumSpanningTreeReader< T >::
+template< class _TTree >
+fpa::IO::MinimumSpanningTreeReader< _TTree >::
MinimumSpanningTreeReader( )
: Superclass( ),
m_FileName( "" )
{
- this->itk::ProcessObject::SetNumberOfRequiredOutputs( 1 );
- this->itk::ProcessObject::SetNthOutput( 0, T::New( ) );
+ this->SetNumberOfRequiredInputs( 0 );
+ this->SetNumberOfRequiredOutputs( 0 );
+ typename _TTree::Pointer out = _TTree::New( );
+ this->itk::ProcessObject::SetNthOutput( 0, out.GetPointer( ) );
}
// -------------------------------------------------------------------------
-template< class T >
-fpa::IO::MinimumSpanningTreeReader< T >::
+template< class _TTree >
+fpa::IO::MinimumSpanningTreeReader< _TTree >::
~MinimumSpanningTreeReader( )
{
}
// -------------------------------------------------------------------------
-template< class T >
-void fpa::IO::MinimumSpanningTreeReader< T >::
+template< class _TTree >
+void fpa::IO::MinimumSpanningTreeReader< _TTree >::
GenerateData( )
{
- T* output = this->GetOutput( );
- output->Clear( );
-
- std::ifstream in( this->m_FileName.c_str( ) );
- if( !in )
+ _TTree* tree = this->GetOutput( );
+
+ char* buff = NULL;
+ std::ifstream file(
+ this->m_FileName.c_str( ),
+ std::ios::in | std::ios::binary | std::ios::ate
+ );
+ if( !file )
{
itkExceptionMacro(
<< "Error opening file to read a minimum spanning tree: \""
} // fi
- unsigned int dim;
- unsigned long nSeeds, nVertices;
- in >> dim >> nSeeds;
+ // Put all file into a memory buffer
+ auto size = file.tellg( );
+ buff = new char[ size ];
+ file.seekg( 0, std::ios::beg );
+ file.read ( buff, size );
+ file.close( );
+ std::istringstream in( buff );
+
+ // Read basic data
+ unsigned int dim, fill_queue;
+ in >> dim >> fill_queue;
+ tree->SetFillNodeQueue( fill_queue == 1 );
+
+ // Read regions
+ typename _TTree::IndexType li, ri, bi;
+ typename _TTree::SizeType ls, rs, bs;
+ li.Fill( 0 );
+ ri = bi = li;
+ ls.Fill( 0 );
+ rs = bs = ls;
+ for( unsigned int d = 0; d < dim; ++d )
+ if( d < _TTree::ImageDimension )
+ in >> li[ d ] >> ls[ d ];
+ for( unsigned int d = 0; d < dim; ++d )
+ if( d < _TTree::ImageDimension )
+ in >> ri[ d ] >> rs[ d ];
+ for( unsigned int d = 0; d < dim; ++d )
+ if( d < _TTree::ImageDimension )
+ in >> bi[ d ] >> bs[ d ];
+ typename _TTree::RegionType lr, rr, br;
+ lr.SetIndex( li ); lr.SetSize( ls );
+ rr.SetIndex( ri ); rr.SetSize( rs );
+ br.SetIndex( bi ); br.SetSize( bs );
+
+ // Read spatial information
+ typename _TTree::SpacingType spc;
+ typename _TTree::PointType ori;
+ typename _TTree::DirectionType dir;
+ for( unsigned int d = 0; d < dim; ++d )
+ if( d < _TTree::ImageDimension )
+ in >> ori[ d ];
+ for( unsigned int d = 0; d < dim; ++d )
+ if( d < _TTree::ImageDimension )
+ in >> spc[ d ];
+ for( unsigned int d = 0; d < dim; ++d )
+ {
+ if( d < _TTree::ImageDimension )
+ {
+ for( unsigned int e = 0; e < dim; ++e )
+ if( e < _TTree::ImageDimension )
+ in >> dir[ d ][ e ];
- typedef typename T::TCollisions _TCollisions;
- typedef typename _TCollisions::value_type _TCollisionsRow;
- typedef typename _TCollisionsRow::value_type _TCollision;
- typedef typename T::TVertex _TVertex;
+ } // fi
- _TCollisions
- collisions( nSeeds, _TCollisionsRow( nSeeds, _TCollision( _TVertex( ), false ) ) );
- for( unsigned long i = 0; i < nSeeds; ++i )
+ } // rof
+
+ // Allocate memory and prepare it
+ tree->SetLargestPossibleRegion( lr );
+ tree->SetRequestedRegion( rr );
+ tree->SetBufferedRegion( br );
+ tree->SetOrigin( ori );
+ tree->SetSpacing( spc );
+ tree->SetDirection( dir );
+ tree->Allocate( );
+ tree->Clear( );
+
+ // Read collisions
+ typedef typename _TTree::TCollision _TCollision;
+ typedef typename _TTree::TCollisionsRow _TCollisionsRow;
+ typename _TTree::TCollisions coll;
+ unsigned long coll_size;
+ in >> coll_size;
+ for( unsigned long i = 0; i < coll_size; ++i )
{
- for( unsigned long j = 0; j < nSeeds; ++j )
- {
- int val;
- in >> val;
- collisions[ i ][ j ].second = ( val == 1 );
+ coll.push_back( _TCollisionsRow( ) );
+ unsigned long row_size;
+ in >> row_size;
+ for( unsigned long j = 0; j < row_size; ++j )
+ {
+ typename _TTree::IndexType v;
+ for( unsigned int d = 0; d < dim; ++d )
+ if( d < _TTree::ImageDimension )
+ in >> v[ d ];
+ unsigned int b;
+ in >> b;
+ coll[ i ].push_back( _TCollision( v, b == 1 ) );
+
} // rof
} // rof
+ tree->SetCollisions( coll );
- in >> nVertices;
- for( unsigned long vId = 0; vId < nVertices; ++vId )
+ // Read vertices
+ while( !in.eof( ) )
{
- typename T::TVertex v0, v1;
+ short fid;
+ double cost;
+ typename _TTree::IndexType v;
+ typename _TTree::IndexType::OffsetType p;
+ in >> fid >> cost;
for( unsigned int d = 0; d < dim; ++d )
- {
- long val;
- in >> val;
- if( d < T::TVertex::Dimension )
- v0[ d ] = val;
-
- } // rof
+ if( d < _TTree::ImageDimension )
+ in >> v[ d ];
for( unsigned int d = 0; d < dim; ++d )
- {
- long val;
- in >> val;
- if( d < T::TVertex::Dimension )
- v1[ d ] = val;
+ if( d < _TTree::ImageDimension )
+ in >> p[ d ];
+ tree->SetNode( v, v + p, fid, cost );
- } // rof
- short fId;
- in >> fId;
- output->SetParent( v0, v1, fId );
+ } // elihw
- } // rof
- output->SetCollisions( collisions );
- in.close( );
+ // Free buffer
+ delete [] buff;
}
#endif // __FPA__IO__MINIMUMSPANNINGTREEREADER__HXX__