]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/IO/MinimumSpanningTreeReader.hxx
72eecc2721c5c7ec4689f04c102df32bfdf26bd2
[FrontAlgorithms.git] / lib / fpa / IO / MinimumSpanningTreeReader.hxx
1 #ifndef __FPA__IO__MINIMUMSPANNINGTREEREADER__HXX__
2 #define __FPA__IO__MINIMUMSPANNINGTREEREADER__HXX__
3
4 #include <fstream>
5 #include <sstream>
6 #include <itkMacro.h>
7 #include <itkOffset.h>
8
9 // -------------------------------------------------------------------------
10 template< class _TTree >
11 _TTree* fpa::IO::MinimumSpanningTreeReader< _TTree >::
12 GetOutput( )
13 {
14   return(
15     dynamic_cast< _TTree* >( this->itk::ProcessObject::GetOutput( 0 ) )
16     );
17 }
18
19 // -------------------------------------------------------------------------
20 template< class _TTree >
21 void fpa::IO::MinimumSpanningTreeReader< _TTree >::
22 Update( )
23 {
24   this->GenerateData( );
25 }
26
27 // -------------------------------------------------------------------------
28 template< class _TTree >
29 fpa::IO::MinimumSpanningTreeReader< _TTree >::
30 MinimumSpanningTreeReader( )
31   : Superclass( ),
32     m_FileName( "" )
33 {
34   this->SetNumberOfRequiredInputs( 0 );
35   this->SetNumberOfRequiredOutputs( 0 );
36   typename _TTree::Pointer out = _TTree::New( );
37   this->itk::ProcessObject::SetNthOutput( 0, out.GetPointer( ) );
38 }
39
40 // -------------------------------------------------------------------------
41 template< class _TTree >
42 fpa::IO::MinimumSpanningTreeReader< _TTree >::
43 ~MinimumSpanningTreeReader( )
44 {
45 }
46
47 // -------------------------------------------------------------------------
48 template< class _TTree >
49 void fpa::IO::MinimumSpanningTreeReader< _TTree >::
50 GenerateData( )
51 {
52   _TTree* tree = this->GetOutput( );
53
54   char* buff = NULL;
55   std::ifstream file(
56     this->m_FileName.c_str( ),
57     std::ios::in | std::ios::binary | std::ios::ate
58     );
59   if( !file )
60   {
61     itkExceptionMacro(
62       << "Error opening file to read a minimum spanning tree: \""
63       << this->m_FileName
64       << "\""
65       );
66     return;
67
68   } // fi
69
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 );
75   file.close( );
76   std::istringstream in( buff );
77
78   // Read basic data
79   unsigned int dim, fill_queue;
80   in >> dim >> fill_queue;
81   tree->SetFillNodeQueue( fill_queue == 1 );
82
83   // Read regions
84   typename _TTree::IndexType li, ri, bi;
85   typename _TTree::SizeType ls, rs, bs;
86   li.Fill( 0 );
87   ri = bi = li;
88   ls.Fill( 0 );
89   rs = bs = ls;
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 );
103
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 )
110       in >> ori[ d ];
111   for( unsigned int d = 0; d < dim; ++d )
112     if( d < _TTree::ImageDimension )
113       in >> spc[ d ];
114   for( unsigned int d = 0; d < dim; ++d )
115   {
116     if( d < _TTree::ImageDimension )
117     {
118       for( unsigned int e = 0; e < dim; ++e )
119         if( e < _TTree::ImageDimension )
120           in >> dir[ d ][ e ];
121
122     } // fi
123
124   } // rof
125
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 );
133   tree->Allocate( );
134   tree->Clear( );
135
136   // Read collisions
137   typedef typename _TTree::TCollision     _TCollision;
138   typedef typename _TTree::TCollisionsRow _TCollisionsRow;
139   typename _TTree::TCollisions coll;
140   unsigned long coll_size;
141   in >> coll_size;
142   for( unsigned long i = 0; i < coll_size; ++i )
143   {
144     coll.push_back( _TCollisionsRow( ) );
145
146     unsigned long row_size;
147     in >> row_size;
148     for( unsigned long j = 0; j < row_size; ++j )
149     {
150       typename _TTree::IndexType v;
151       for( unsigned int d = 0; d < dim; ++d )
152         if( d < _TTree::ImageDimension )
153           in >> v[ d ];
154       unsigned int b;
155       in >> b;
156       coll[ i ].push_back( _TCollision( v, b == 1 ) );
157       
158     } // rof
159
160   } // rof
161   tree->SetCollisions( coll );
162
163   // Read vertices
164   while( !in.eof( ) )
165   {
166     short fid;
167     double cost;
168     typename _TTree::IndexType v;
169     typename _TTree::IndexType::OffsetType p;
170     in >> fid >> cost;
171     for( unsigned int d = 0; d < dim; ++d )
172       if( d < _TTree::ImageDimension )
173         in >> v[ d ];
174     for( unsigned int d = 0; d < dim; ++d )
175       if( d < _TTree::ImageDimension )
176         in >> p[ d ];
177     tree->SetNode( v, v + p, fid, cost );
178
179   } // elihw
180
181   // Free buffer
182   delete [] buff;
183 }
184
185 #endif // __FPA__IO__MINIMUMSPANNINGTREEREADER__HXX__
186
187 // eof - $RCSfile$