35 #ifndef AIMS_ROI_CLUSTERARG_D_H 36 #define AIMS_ROI_CLUSTERARG_D_H 61 std::string graphsyntax = gr.getSyntax();
62 std::string vertexsyntax =
"cluster";
71 GraphType gtype = Cluster;
83 if( graphsyntax ==
"CorticalFoldArg" )
86 vertexsyntax =
"fold";
114 bec.
syntax = vertexsyntax;
115 mec.
syntax = vertexsyntax;
119 gr.setProperty( graphsyntax +
"_VERSION", std::string(
"1.0" ) );
120 std::vector<float> vs;
121 vs.push_back( data.
sizeX() );
122 vs.push_back( data.
sizeY() );
123 vs.push_back( data.
sizeZ() );
124 vs.push_back( data.
sizeT() );
125 gr.setProperty(
"voxel_size", vs );
130 gr.setProperty(
"boundingbox_min", bb );
131 bb[0] = data.
dimX() - 1;
132 bb[1] = data.
dimY() - 1;
133 bb[2] = data.
dimZ() - 1;
134 gr.setProperty(
"boundingbox_max", bb );
135 std::string outdir = _fileout;
136 std::string::size_type pos = outdir.rfind(
'.' );
137 if( pos != std::string::npos )
138 outdir.erase( pos, outdir.length() - pos );
139 pos = outdir.rfind(
'/' );
140 if( pos != std::string::npos )
141 outdir.erase( 0, pos + 1 );
143 gr.setProperty(
"filename_base", outdir );
144 std::vector<int> colors;
145 colors.push_back( 0 );
146 colors.push_back( 255 );
147 colors.push_back( 0 );
153 std::map<std::string,GraphElementCode>
154 & cltab = (*objtable)[ vertexsyntax ];
155 cltab[ bec.
id ] = bec;
158 cltab[ mec.
id ] = mec;
162 gr.setProperty(
"aims_objects_table", objtable );
169 if( _upth != FLT_MAX )
172 if( _lowth != -FLT_MAX )
181 else if( _lowth != -FLT_MAX )
190 if( _lowth == -FLT_MAX )
204 std::cout <<
"threshold: " << _lowth <<
", bin: " << _binarize
207 datat = th.
bin( data );
216 std::cout <<
"extracting connected components...\n";
221 conv2.convert( datat, datac );
233 bool bgfound =
false;
236 for( z=0; z<datat.
dimZ() && !bgfound; ++z )
237 for( y=0; y<datat.
dimY() && !bgfound; ++y )
238 for( x=0; x<datat.
dimX(); ++x )
239 if( datat( x, y, z ) == 0 )
241 bg = datac( x, y, z );
247 std::cout <<
"done\n";
252 if( !_matrix.empty() )
254 std::cout <<
"reading transformation...\n";
255 std::ifstream ms( _matrix.c_str() );
258 std::cerr <<
"Can't open transformation file " << _matrix
262 std::vector<float> transl( 3 ), rot( 9 );
263 ms >> transl[0] >> transl[1] >> transl[2];
264 ms >> rot[0] >> rot[1] >> rot[2];
265 ms >> rot[3] >> rot[4] >> rot[5];
266 ms >> rot[6] >> rot[7] >> rot[8];
269 std::cerr <<
"transformation file " << _matrix <<
" has wrong format\n";
272 std::cout <<
"done\n";
285 rm(0, 3) = transl[0];
286 rm(1, 3) = transl[1];
287 rm(2, 3) = transl[2];
293 gr.setProperty(
"Talairach_translation", transl );
294 gr.setProperty(
"Talairach_rotation", rot );
303 std::cout <<
"converting to buckets...\n";
307 std::cout <<
"done, " << bck.size() <<
" buckets\n";
311 std::map<size_t, AimsSurfaceTriangle> mesh;
315 std::cout <<
"meshing components...\n";
316 std::map<size_t, std::list<AimsSurfaceTriangle> > meshl;
318 mesher.
setDecimation( 100.0, _deciMaxClearance, _deciMaxError, 120.0 );
322 mesher.
doit( datac, meshl );
323 std::cout <<
"done\n";
326 std::cout <<
"regrouping meshes...\n";
327 std::map<size_t, std::list<AimsSurfaceTriangle> >
::iterator 328 im, em = meshl.end();
329 for( im=meshl.begin(); im!=em; ++im )
337 std::cout <<
"done\n";
351 std::vector<float> pf(3);
354 std::cout <<
"making cluster vertices...\n";
355 for( ib=bck.begin(); ib!=eb; ++ib )
357 std::cout <<
"cluster " << ib->first <<
"..." << std::endl;
361 (*b)[0] = ib->second;
363 v->setProperty(
"index", (
int) ib->first );
364 pt = ib->second.begin()->first;
365 sprintf( num,
"%d", (
int) datat( pt[0], pt[1], pt[2] ) );
366 v->setProperty(
"name", std::string( num ) );
367 v->setProperty(
"point_number", (
int) ib->second.size() );
368 v->setProperty(
"size", voxvol * ib->second.size() );
371 v->setProperty(
"skeleton_label", index++ );
372 v->setProperty(
"ss_point_number", (
int) ib->second.size() );
373 v->setProperty(
"bottom_point_number", (
int) 0 );
382 pf[0] = pf[1] = pf[2] = 0;
384 for( ibb=bk.begin(), ebb=bk.end(); ibb!=ebb; ++ibb )
386 pf[0] += ibb->first[0];
387 pf[1] += ibb->first[1];
388 pf[2] += ibb->first[2];
390 pf[0] = vs[0] * pf[0] / bk.size();
391 pf[1] = vs[1] * pf[1] / bk.size();
392 pf[2] = vs[2] * pf[2] / bk.size();
393 v->setProperty(
"gravity_center", pf );
395 pm = motion.
transform( pf[0], pf[1], pf[2] );
400 v->setProperty(
"refgravity_center", pf );
402 v->setProperty(
"Talairach(mm)", pf );
403 sprintf( num,
"%f %f %f", pf[0], pf[1], pf[2] );
404 v->setProperty(
"label", std::string( num ) );
406 std::cout <<
"clusters created\n";
void convert(const INP &in, OUTP &out) const
Vertex * addVertex(const std::string &s="")
std::string local_file_attribute
AIMSDATA_API AimsTimeSurface< 3, Void > AimsSurfaceTriangle
void setSmoothing(SmoothingType smoothType, int smoothIt, float smoothRate)
std::map< std::string, std::map< std::string, GraphElementCode > > GraphElementTable
void setMinFacetNumber(uint m)
std::string global_index_attribute
void make(Graph &gr, const AimsData< T > &data)
void fillBorder(const T &val)
void setSizeXYZT(float sizex, float sizey, float sizez, float sizet)
AimsData< U > bin(const AimsData< T > &sqv)
void AimsConnectedComponent(AimsData< T > &data, aims::Connectivity::Type connectivity, std::map< T, size_t > &valids, const T &backgrnd=0, bool bin=true, size_t minSize=0, size_t maxSize=0, size_t numMax=0, bool verbose=true)
void doit(const AimsData< short > &thing, const std::string &name, const std::string &mode="binar")
void setSmoothingLaplacian(float smoothFeatureAngle)
static void meshMerge(AimsTimeSurface< D, T > &dst, const AimsTimeSurface< D, T > &add)
std::string global_filename
void setDecimation(float deciReductionRate, float deciMaxClearance, float deciMaxError, float deciFeatureAngle)