1 #ifndef __FPA__IO__MINIMUMSPANNINGTREEREADER__HXX__
2 #define __FPA__IO__MINIMUMSPANNINGTREEREADER__HXX__
9 // -------------------------------------------------------------------------
10 template< class _TTree >
11 _TTree* fpa::IO::MinimumSpanningTreeReader< _TTree >::
15 dynamic_cast< _TTree* >( this->itk::ProcessObject::GetOutput( 0 ) )
19 // -------------------------------------------------------------------------
20 template< class _TTree >
21 void fpa::IO::MinimumSpanningTreeReader< _TTree >::
24 this->GenerateData( );
27 // -------------------------------------------------------------------------
28 template< class _TTree >
29 fpa::IO::MinimumSpanningTreeReader< _TTree >::
30 MinimumSpanningTreeReader( )
34 this->SetNumberOfRequiredInputs( 0 );
35 this->SetNumberOfRequiredOutputs( 0 );
36 typename _TTree::Pointer out = _TTree::New( );
37 this->itk::ProcessObject::SetNthOutput( 0, out.GetPointer( ) );
40 // -------------------------------------------------------------------------
41 template< class _TTree >
42 fpa::IO::MinimumSpanningTreeReader< _TTree >::
43 ~MinimumSpanningTreeReader( )
47 // -------------------------------------------------------------------------
48 template< class _TTree >
49 void fpa::IO::MinimumSpanningTreeReader< _TTree >::
52 _TTree* tree = this->GetOutput( );
56 this->m_FileName.c_str( ),
57 std::ios::in | std::ios::binary | std::ios::ate
62 << "Error opening file to read a minimum spanning tree: \""
70 // Put all file into a memory buffer
71 auto size = file.tellg( );
72 buff = new char[ size ];
73 file.seekg( 0, std::ios::beg );
74 file.read ( buff, size );
76 std::istringstream in( buff );
79 unsigned int dim, fill_queue;
80 in >> dim >> fill_queue;
81 tree->SetFillNodeQueue( fill_queue == 1 );
84 typename _TTree::IndexType li, ri, bi;
85 typename _TTree::SizeType ls, rs, bs;
90 for( unsigned int d = 0; d < dim; ++d )
91 if( d < _TTree::ImageDimension )
92 in >> li[ d ] >> ls[ d ];
93 for( unsigned int d = 0; d < dim; ++d )
94 if( d < _TTree::ImageDimension )
95 in >> ri[ d ] >> rs[ d ];
96 for( unsigned int d = 0; d < dim; ++d )
97 if( d < _TTree::ImageDimension )
98 in >> bi[ d ] >> bs[ d ];
99 typename _TTree::RegionType lr, rr, br;
100 lr.SetIndex( li ); lr.SetSize( ls );
101 rr.SetIndex( ri ); rr.SetSize( rs );
102 br.SetIndex( bi ); br.SetSize( bs );
104 // Read spatial information
105 typename _TTree::SpacingType spc;
106 typename _TTree::PointType ori;
107 typename _TTree::DirectionType dir;
108 for( unsigned int d = 0; d < dim; ++d )
109 if( d < _TTree::ImageDimension )
111 for( unsigned int d = 0; d < dim; ++d )
112 if( d < _TTree::ImageDimension )
114 for( unsigned int d = 0; d < dim; ++d )
116 if( d < _TTree::ImageDimension )
118 for( unsigned int e = 0; e < dim; ++e )
119 if( e < _TTree::ImageDimension )
126 // Allocate memory and prepare it
127 tree->SetLargestPossibleRegion( lr );
128 tree->SetRequestedRegion( rr );
129 tree->SetBufferedRegion( br );
130 tree->SetOrigin( ori );
131 tree->SetSpacing( spc );
132 tree->SetDirection( dir );
137 typedef typename _TTree::TCollision _TCollision;
138 typedef typename _TTree::TCollisionsRow _TCollisionsRow;
139 typename _TTree::TCollisions coll;
140 unsigned long coll_size;
142 for( unsigned long i = 0; i < coll_size; ++i )
144 coll.push_back( _TCollisionsRow( ) );
146 unsigned long row_size;
148 for( unsigned long j = 0; j < row_size; ++j )
150 typename _TTree::IndexType v;
151 for( unsigned int d = 0; d < dim; ++d )
152 if( d < _TTree::ImageDimension )
156 coll[ i ].push_back( _TCollision( v, b == 1 ) );
161 tree->SetCollisions( coll );
168 typename _TTree::IndexType v;
169 typename _TTree::IndexType::OffsetType p;
171 for( unsigned int d = 0; d < dim; ++d )
172 if( d < _TTree::ImageDimension )
174 for( unsigned int d = 0; d < dim; ++d )
175 if( d < _TTree::ImageDimension )
177 tree->SetNode( v, v + p, fid, cost );
185 #endif // __FPA__IO__MINIMUMSPANNINGTREEREADER__HXX__