Doxygen Source Code Documentation
thd_nimlatr.c File Reference
#include "mrilib.h"#include "thd.h"#include "niml.h"Go to the source code of this file.
Defines | |
| #define | SZMAX 1000 |
Functions | |
| NI_group * | THD_nimlize_dsetatr (THD_3dim_dataset *dset) |
| void | THD_dblkatr_from_niml (NI_group *ngr, THD_datablock *blk) |
| THD_3dim_dataset * | THD_niml_to_dataset (NI_group *ngr, int nodata) |
| int | THD_add_bricks (THD_3dim_dataset *dset, void *nini) |
| NI_element * | THD_subbrick_to_niml (THD_3dim_dataset *dset, int ival, int flags) |
| NI_group * | THD_dataset_to_niml (THD_3dim_dataset *dset) |
| NI_element * | mri_to_niml (MRI_IMAGE *im) |
| MRI_IMAGE * | niml_to_mri (NI_element *nel) |
| int | AFNI_obj_to_dataset (NI_objcontainer *dc) |
| int | AFNI_dataset_to_obj (NI_objcontainer *dc) |
Define Documentation
|
|
|
Function Documentation
|
|
Definition at line 636 of file thd_nimlatr.c. References ISVALID_DSET, NI_objcontainer::self_data, and THD_dataset_to_niml().
00637 {
00638 NI_group *ngr ;
00639 THD_3dim_dataset *dset ;
00640
00641 if( dc == NULL || strcmp(dc->typename,"AFNI_dataset") != 0 ) return 0 ;
00642
00643 dset = (THD_3dim_dataset *)dc->self_data ;
00644 if( !ISVALID_DSET(dset) ) return 0 ;
00645
00646 ngr = THD_dataset_to_niml( dset ) ;
00647 if( ngr == NULL ) return 0 ;
00648
00649 dc->self_data = (void *)ngr ;
00650 return 1 ;
00651 }
|
|
|
Definition at line 620 of file thd_nimlatr.c. References NI_free_element(), NI_objcontainer::self_data, NI_objcontainer::self_name, and THD_niml_to_dataset().
00621 {
00622 THD_3dim_dataset *dset ;
00623
00624 if( dc == NULL || strcmp(dc->self_name,"AFNI_dataset") != 0 ) return 0 ;
00625
00626 dset = THD_niml_to_dataset( (NI_group *)dc->self_data , 0 ) ;
00627 if( dset == NULL ) return 0 ;
00628
00629 NI_free_element( dc->self_data ) ;
00630 dc->self_data = (void *)dset ;
00631 return 1 ;
00632 }
|
|
|
Put an MRI_IMAGE into a NIML data element. ----------------------------------------------------------------------------- Definition at line 517 of file thd_nimlatr.c. References MRI_IMAGE::dt, MRI_IMAGE::du, MRI_IMAGE::dv, MRI_IMAGE::dw, MRI_IMAGE::dx, MRI_IMAGE::dy, MRI_IMAGE::dz, ENTRY, MRI_IMAGE::kind, mri_data_pointer(), MRI_IMAGE::name, NI_add_column(), NI_new_data_element(), NI_set_attribute(), MRI_IMAGE::nt, MRI_IMAGE::nu, MRI_IMAGE::nv, MRI_IMAGE::nvox, MRI_IMAGE::nw, MRI_IMAGE::nx, MRI_IMAGE::ny, MRI_IMAGE::nz, RETURN, MRI_IMAGE::to, MRI_IMAGE::uo, MRI_IMAGE::vo, MRI_IMAGE::wo, MRI_IMAGE::xo, MRI_IMAGE::yo, and MRI_IMAGE::zo. Referenced by main().
00518 {
00519 NI_element *nel ;
00520 void *vpt ;
00521 char rhs[256] ;
00522
00523 ENTRY("mri_to_niml") ;
00524
00525 vpt = mri_data_pointer(im) ;
00526 if( vpt == NULL ) RETURN(NULL) ;
00527
00528 nel = NI_new_data_element( "MRI_IMAGE" , im->nvox ) ;
00529
00530 /* put in some attributes about the MRI_IMAGE struct */
00531
00532 sprintf( rhs , "%d,%d,%d,%d,%d,%d,%d" ,
00533 im->nx , im->ny , im->nz , im->nt , im->nu , im->nv , im->nw ) ;
00534 NI_set_attribute( nel , "mri_dimen" , rhs ) ;
00535
00536 if( im->dx != 0.0 || im->dy != 0.0 || im->dz != 0.0 ||
00537 im->dt != 0.0 || im->du != 0.0 || im->dv != 0.0 || im->dw != 0.0 ){
00538
00539 sprintf( rhs , "%f,%f,%f,%f,%f,%f,%f" ,
00540 im->dx , im->dy , im->dz , im->dt , im->du , im->dv , im->dw ) ;
00541 NI_set_attribute( nel , "mri_dxyz" , rhs ) ;
00542 }
00543
00544 if( im->xo != 0.0 || im->yo != 0.0 || im->zo != 0.0 ||
00545 im->to != 0.0 || im->uo != 0.0 || im->vo != 0.0 || im->wo != 0.0 ){
00546
00547 sprintf( rhs , "%f,%f,%f,%f,%f,%f,%f" ,
00548 im->xo , im->yo , im->zo , im->to , im->uo , im->vo , im->wo ) ;
00549 NI_set_attribute( nel , "mri_xyzo" , rhs ) ;
00550 }
00551
00552 if( im->name != NULL && im->name[0] != '\0' )
00553 NI_set_attribute( nel , "mri_name" , rhs ) ;
00554
00555 /* put in the data */
00556 NI_add_column( nel , im->kind , vpt ) ;
00557
00558 RETURN(nel) ;
00559 }
|
|
|
Convert a NIML element to an MRI_IMAGE. ----------------------------------------------------------------------------- Definition at line 565 of file thd_nimlatr.c. References MRI_IMAGE::dt, MRI_IMAGE::du, MRI_IMAGE::dv, MRI_IMAGE::dw, MRI_IMAGE::dx, MRI_IMAGE::dy, MRI_IMAGE::dz, ENTRY, mri_add_name(), mri_data_pointer(), mri_new_7D_generic(), NI_element::name, NI_ELEMENT_TYPE, NI_element_type(), NI_get_attribute(), MRI_IMAGE::nvox, nz, MRI_IMAGE::pixel_size, RETURN, MRI_IMAGE::to, MRI_IMAGE::uo, NI_element::vec, NI_element::vec_len, NI_element::vec_num, NI_element::vec_typ, MRI_IMAGE::vo, MRI_IMAGE::wo, MRI_IMAGE::xo, MRI_IMAGE::yo, and MRI_IMAGE::zo. Referenced by AIVVV_workproc(), and process_NIML_MRI_IMAGE().
00566 {
00567 char *rhs ;
00568 int nx=1,ny=1,nz=1,nt=1,nu=1,nv=1,nw=1 ;
00569 MRI_IMAGE *im ;
00570 void *vpt ;
00571 int nvox ;
00572
00573 ENTRY("niml_to_mri") ;
00574
00575 if( NI_element_type(nel) != NI_ELEMENT_TYPE ||
00576 strcmp(nel->name,"MRI_IMAGE") != 0 ||
00577 nel->vec_num != 1 ||
00578 nel->vec_len <= 0 ) RETURN(NULL) ;
00579
00580 rhs = NI_get_attribute( nel , "mri_dimen" ) ;
00581 if( rhs == NULL ) RETURN(NULL) ;
00582 sscanf( rhs , "%d,%d,%d,%d,%d,%d,%d" ,
00583 &nx , &ny , &nz , &nt , &nu , &nv , &nw ) ;
00584 if( nx < 1 ) nx = 1 ;
00585 if( ny < 1 ) ny = 1 ;
00586 if( nz < 1 ) nz = 1 ;
00587 if( nt < 1 ) nt = 1 ;
00588 if( nu < 1 ) nu = 1 ;
00589 if( nv < 1 ) nv = 1 ;
00590 if( nw < 1 ) nw = 1 ;
00591
00592 im = mri_new_7D_generic( nx,ny,nz,nt,nu,nv,nw ,
00593 nel->vec_typ[0] , 1 ) ;
00594 if( im == NULL ) RETURN(NULL) ;
00595
00596 vpt = mri_data_pointer(im) ;
00597 nvox = im->nvox ; if( nvox > nel->vec_len ) nvox = nel->vec_len ;
00598 memcpy( vpt , nel->vec[0] , im->pixel_size * nvox ) ;
00599
00600 rhs = NI_get_attribute( nel , "mri_dxyz" ) ;
00601 if( rhs != NULL )
00602 sscanf( rhs , "%f,%f,%f,%f,%f,%f,%f" ,
00603 &(im->dx), &(im->dy), &(im->dz),
00604 &(im->dt), &(im->du), &(im->dv), &(im->dw) ) ;
00605
00606 rhs = NI_get_attribute( nel , "mri_xyzo" ) ;
00607 if( rhs != NULL )
00608 sscanf( rhs , "%f,%f,%f,%f,%f,%f,%f" ,
00609 &(im->xo), &(im->yo), &(im->zo),
00610 &(im->to), &(im->uo), &(im->vo), &(im->wo) ) ;
00611
00612 rhs = NI_get_attribute( nel , "mri_name" ) ;
00613 if( rhs != NULL ) mri_add_name( rhs , im ) ;
00614
00615 RETURN(im) ;
00616 }
|
|
||||||||||||
|
Scan the NIML data or group element for sub-bricks to add to the given dataset.
Definition at line 329 of file thd_nimlatr.c. References AFNI_GOOD_DTYPE, calloc, DSET_ARRAY, DSET_CRUSH_BSTAT, DSET_NVALS, DSET_NVOX, EDIT_add_brick(), EDIT_BRICK_FACTOR, EDIT_substitute_brick(), ENTRY, ISVALID_DSET, mri_datum_size(), NI_element::name, NI_element_type(), NI_get_attribute(), NI_GROUP_TYPE, NI_group::part, NI_group::part_num, RETURN, STATUS, strtod(), tt, NI_element::vec, NI_element::vec_len, NI_element::vec_num, and NI_element::vec_typ. Referenced by process_NIML_AFNI_dataset(), process_NIML_AFNI_volumedata(), and THD_niml_to_dataset().
00330 {
00331 int nbr=0 , tt=NI_element_type(nini) ;
00332 NI_element *nel ;
00333 int nxyz , ii , jj , nbar , vlen , kk , bb ;
00334 void *bar ;
00335 char *str ;
00336 float fac ;
00337
00338 ENTRY("THD_add_bricks") ;
00339
00340 if( !ISVALID_DSET(dset) || tt < 0 ) RETURN(0) ;
00341
00342 /*-- if have a group element, do the parts by recursion --*/
00343
00344 if( tt == NI_GROUP_TYPE ){
00345 NI_group *ngr = (NI_group *)nini ;
00346 int ip ;
00347 for( ip=0 ; ip < ngr->part_num ; ip++ ) /* loop over parts */
00348 nbr += THD_add_bricks( dset , ngr->part[ip] ) ;
00349 RETURN(nbr) ;
00350 }
00351
00352 /*-- if here, have a single data element --*/
00353
00354 nel = (NI_element *)nini ;
00355
00356 /*- check element name to see if it's what we want -*/
00357
00358 if( strcasecmp(nel->name,"VOLUME_DATA") != 0 ) RETURN(0) ;
00359
00360 nxyz = DSET_NVOX(dset) ; /* number of voxels in a sub-brick */
00361 vlen = nel->vec_len ; /* number of values in a column of data */
00362 if( vlen > nxyz ) vlen = nxyz ;
00363
00364 if( nel->vec_num < 1 || vlen < 1 ) RETURN(0) ; /* no data at all? */
00365
00366 /*- find index of sub-brick, if present -*/
00367
00368 kk = -1 ; /* flag for overwrite */
00369 str = NI_get_attribute( nel , "AFNI_index" ) ;
00370 if( str == NULL ) str = NI_get_attribute( nel , "index" ) ;
00371 if( str != NULL && isdigit(*str) )
00372 kk = (int)strtol( str , NULL , 10 ) ;
00373
00374 /*- and scale factor, if present -*/
00375
00376 fac = 0.0 ;
00377 str = NI_get_attribute( nel , "scale_factor" ) ;
00378 if( str == NULL ) str = NI_get_attribute( nel , "AFNI_factor" ) ;
00379 if( str != NULL && ( *str== '-' || isdigit(*str) ) )
00380 fac = (float)strtod( str , NULL ) ;
00381
00382 if(PRINT_TRACING){
00383 char str[256] ;
00384 sprintf(str,"kk=%d vlen=%d nxyz=%d fac=%f\n",kk,vlen,nxyz,fac);
00385 STATUS(str);
00386 }
00387
00388 /*- loop over columns and enter them into the dataset -*/
00389
00390 for( jj=0 ; jj < nel->vec_num ; jj++ ){
00391
00392 if( !AFNI_GOOD_DTYPE(nel->vec_typ[jj]) ) continue ; /* skip this */
00393
00394 /* create a volume array to hold this data */
00395
00396 nbar = mri_datum_size(nel->vec_typ[jj]) ; /* size of one value */
00397 bar = calloc( nbar , nxyz ) ; /* will be zero filled */
00398 if( bar == NULL ) RETURN(nbr) ; /* malloc failure! */
00399
00400 /* copy data from element into this volume */
00401
00402 memcpy( bar , nel->vec[jj] , vlen*nbar ) ;
00403
00404 /* find a place (bb) to put this volume in the dataset */
00405
00406 if( kk < 0 ){ /* scan for an empty sub-brick */
00407 for( ii=0 ; ii < DSET_NVALS(dset) ; ii++ )
00408 if( DSET_ARRAY(dset,ii) == NULL ) break ;
00409 if( ii == DSET_NVALS(dset) ) kk = ii ; /* all full */
00410 bb = ii ; /* put here */
00411 } else if( kk > DSET_NVALS(dset) ){
00412 bb = DSET_NVALS(dset) ; /* at end */
00413 } else {
00414 bb = kk ; /* exactly here */
00415 }
00416
00417 if( bb < DSET_NVALS(dset) ){ /* replace existing data */
00418 EDIT_substitute_brick( dset , bb , nel->vec_typ[jj] , bar ) ;
00419
00420 } else { /* append new sub-brick */
00421 bb = DSET_NVALS(dset) ;
00422 EDIT_add_brick( dset , nel->vec_typ[jj] , 0.0 , bar ) ;
00423 }
00424 nbr++ ; /* 1 more sub-brick! */
00425
00426 if( fac > 0.0 ) EDIT_BRICK_FACTOR(dset,bb,fac) ;
00427 else if( fac <= 0.0 ) EDIT_BRICK_FACTOR(dset,bb,0.0) ;
00428
00429 DSET_CRUSH_BSTAT(dset,bb) ;
00430
00431 if( kk >= 0 ) kk++ ; /* move to next sub-brick */
00432 }
00433
00434 RETURN(nbr) ;
00435 }
|
|
|
Put an entire dataset into a single NI group element. ----------------------------------------------------------------------------- Definition at line 487 of file thd_nimlatr.c. References DSET_NVALS, ENTRY, NI_add_to_group(), NI_rename_group(), RETURN, STATUS, THD_nimlize_dsetatr(), and THD_subbrick_to_niml(). Referenced by AFNI_dataset_to_obj(), main(), and SUMA_SendDset_Afni().
00488 {
00489 NI_element *nel ;
00490 NI_group *ngr ;
00491 int iv ;
00492
00493 ENTRY("THD_dataset_to_niml") ;
00494
00495 /* put AFNI dataset attributes into a group */
00496
00497 ngr = THD_nimlize_dsetatr( dset ) ;
00498 if( ngr == NULL ) RETURN(NULL) ;
00499
00500 NI_rename_group( ngr , "AFNI_dataset" ) ;
00501
00502 /* now add a data element for each sub-brick */
00503
00504 STATUS("adding sub-bricks") ;
00505 for( iv=0 ; iv < DSET_NVALS(dset) ; iv++ ){
00506 nel = THD_subbrick_to_niml( dset , iv , 0 ) ;
00507 if( nel != NULL ) NI_add_to_group( ngr , nel ) ;
00508 }
00509
00510 RETURN(ngr) ;
00511 }
|
|
||||||||||||
|
Given a NIML group element, read AFNI attribute elements from it and load these into a datablock. ----------------------------------------------------------------------- Definition at line 121 of file thd_nimlatr.c. References ATRNAME_IDSTRING, ENTRY, free, malloc, NI_element::name, NI_ELEMENT_TYPE, NI_element_type(), NI_FLOAT, NI_get_attribute(), NI_GROUP_TYPE, NI_INT, NI_STRING, NI_group::part, NI_group::part_num, NI_group::part_typ, STATUS, THD_set_char_atr(), THD_set_float_atr(), THD_set_int_atr(), THD_set_string_atr, THD_unzblock(), NI_element::vec, NI_element::vec_len, NI_element::vec_num, and NI_element::vec_typ. Referenced by THD_niml_to_dataset(), THD_open_nifti(), and THD_read_niml_atr().
00122 {
00123 ATR_any *atr ;
00124 NI_element *nel ;
00125 int ip ;
00126 char *rhs ;
00127
00128 ENTRY("THD_dblkatr_from_niml") ;
00129
00130 if( ngr == NULL ||
00131 NI_element_type(ngr) != NI_GROUP_TYPE ||
00132 blk == NULL ) EXRETURN ;
00133
00134 /*-- loop over parts and extract data from any '<AFNI_atr ...>' elements --*/
00135
00136 for( ip=0 ; ip < ngr->part_num ; ip++ ){
00137
00138 switch( ngr->part_typ[ip] ){
00139
00140 /*-- a sub-group ==> recursion! --*/
00141
00142 case NI_GROUP_TYPE:
00143 THD_dblkatr_from_niml( (NI_group *)ngr->part[ip] , blk ) ;
00144 break ;
00145
00146 /*- data ==> see if is marked as an AFNI_atr and has exactly 1 column
00147 if so, then extract that column and load into datablock -*/
00148
00149 case NI_ELEMENT_TYPE:{ /* data ==> see if is an AFNI attribute */
00150 NI_element *nel = (NI_element *)ngr->part[ip] ;
00151 char *rhs = NI_get_attribute( nel , "atr_name" ) ;
00152 if( rhs == NULL )
00153 rhs = NI_get_attribute( nel , "AFNI_name" ) ;
00154
00155 if( strcasecmp(nel->name,"AFNI_atr") == 0 && /* AFNI attribute? */
00156 nel->vec_num == 1 && /* with some data? */
00157 nel->vec_len > 0 && /* that is nonempty? */
00158 rhs != NULL && /* and has a name? */
00159 *rhs != '\0' ){ /* a nonempty name? */
00160
00161 STATUS(rhs) ;
00162
00163 switch( nel->vec_typ[0] ){ /* 3 different data types of attributes */
00164
00165 /* float attribute: copy 1st column of numbers into AFNI */
00166
00167 case NI_FLOAT:
00168 THD_set_float_atr( blk , rhs ,
00169 nel->vec_len , (float *)nel->vec[0] ) ;
00170 break ;
00171
00172 /* int attribute: ditto */
00173
00174 case NI_INT:
00175 THD_set_int_atr( blk , rhs ,
00176 nel->vec_len , (int *)nel->vec[0] ) ;
00177 break ;
00178
00179 /* 02 Jun 2005: if have more than one String here,
00180 must reassemble them into a single array */
00181
00182 case NI_STRING:{
00183 char **sar = (char **)nel->vec[0] , *str ;
00184 int nch , nstr=nel->vec_len , istr , lll=0 ;
00185 for( istr=0 ; istr < nstr ; istr++ ) lll += strlen(sar[istr]) ;
00186 str = malloc(lll+4) ; *str = '\0' ;
00187 for( istr=0 ; istr < nstr ; istr++ ) strcat(str,sar[istr]) ;
00188 nch = strlen(str) ;
00189 THD_unzblock( nch+1 , str ) ; /* re-insert NULs */
00190 THD_set_char_atr( blk , rhs , nch+1 , str ) ;
00191 free(str) ;
00192 }
00193 break ;
00194 }
00195 }
00196 }
00197 break ;
00198 }
00199 } /* end of loop over pieces-parts */
00200
00201 /* 01 Jun 2005: special case:
00202 reset the IDCODE_STRING attribute if the group element so indicates
00203 (thereby overriding the AFNI_atr element of that name, if was present) */
00204
00205 rhs = NI_get_attribute(ngr,"self_idcode") ;
00206 if( rhs == NULL ) rhs = NI_get_attribute(ngr,"AFNI_idcode") ;
00207 if( rhs != NULL && *rhs != '\0' ){
00208 STATUS("reset idcode") ;
00209 THD_set_string_atr( blk , ATRNAME_IDSTRING , rhs ) ;
00210 }
00211
00212 EXRETURN ;
00213 }
|
|
||||||||||||
|
Make an AFNI dataset from a NIML group element.
Definition at line 234 of file thd_nimlatr.c. References ADN_none, ADN_prefix, DSET_mallocize, EDIT_dset_items(), EDIT_empty_datablock(), ENTRY, THD_3dim_dataset::idcode, MCW_IDSIZE, NI_element_type(), NI_get_attribute(), NI_GROUP_TYPE, NI_strncpy(), RETURN, MCW_idcode::str, THD_3dim_from_block(), THD_add_bricks(), THD_allow_empty_dataset(), THD_datablock_from_atr(), THD_dblkatr_from_niml(), THD_delete_datablock(), THD_update_statistics(), and THD_zerofill_dataset(). Referenced by AFNI_obj_to_dataset(), and process_NIML_AFNI_dataset().
00235 {
00236 THD_3dim_dataset *dset ;
00237 THD_datablock *blk ;
00238 char *rhs ;
00239 int ii ;
00240
00241 ENTRY("THD_niml_to_dataset") ;
00242
00243 if( ngr == NULL ||
00244 NI_element_type(ngr) != NI_GROUP_TYPE ) RETURN(NULL) ;
00245
00246 /* create the shell of a dataset's datablock and populate it's attributes */
00247
00248 blk = EDIT_empty_datablock() ;
00249
00250 THD_dblkatr_from_niml( ngr , blk ) ; /* load attributes from NIML */
00251
00252 /* build the datablock from the loaded attributes */
00253
00254 ii = THD_datablock_from_atr( blk , NULL , NULL ) ;
00255
00256 if( ii == 0 ){ /* bad attributes */
00257 THD_delete_datablock( blk ) ; RETURN(NULL) ;
00258 }
00259
00260 /* build the dataset from the datablock */
00261
00262 THD_allow_empty_dataset(1) ;
00263 dset = THD_3dim_from_block( blk ) ;
00264 THD_allow_empty_dataset(0) ;
00265 if( dset == NULL ){ THD_delete_datablock( blk ); RETURN(NULL); }
00266
00267 DSET_mallocize(dset) ; /* just to be sure */
00268
00269 /* change the name of the dataset? */
00270
00271 rhs = NI_get_attribute( ngr , "self_prefix" ) ;
00272 if( rhs == NULL )
00273 rhs = NI_get_attribute( ngr , "AFNI_prefix" ) ; /* for the 'old' way */
00274 if( rhs != NULL )
00275 EDIT_dset_items( dset , ADN_prefix,rhs , ADN_none ) ;
00276
00277 /* change the idcode of the dataset? */
00278
00279 rhs = NI_get_attribute( ngr , "self_idcode" ) ;
00280 if( rhs == NULL )
00281 rhs = NI_get_attribute( ngr , "AFNI_idcode" ) ; /* for the 'old' way */
00282 if( rhs != NULL )
00283 NI_strncpy( dset->idcode.str , rhs , MCW_IDSIZE ) ;
00284
00285 /* now scan the group element for data elements that fill sub-bricks */
00286
00287 if( !nodata ){
00288 (void)THD_add_bricks( dset , ngr ) ;
00289 THD_update_statistics( dset ) ;
00290 }
00291
00292 /* 18 Mar 2005: if the header orders, zero fill any undefined bricks */
00293
00294 rhs = NI_get_attribute( ngr , "AFNI_zerofill" ) ;
00295 if( rhs != NULL && toupper(rhs[0]) == 'Y' ) THD_zerofill_dataset(dset);
00296
00297 RETURN(dset) ;
00298 }
|
|
|
Write all the attributes for a datablock into a set of NIML data elements, stored in a NIML group element. ----------------------------------------------------------------------- Definition at line 10 of file thd_nimlatr.c. References THD_datablock::atr, ATR_FLOAT_TYPE, ATR_INT_TYPE, ATR_STRING_TYPE, calloc, ATR_string::ch, THD_3dim_dataset::dblk, ENTRY, ATR_float::fl, free, THD_3dim_dataset::idcode, ATR_int::in, ISVALID_DSET, malloc, ATR_string::name, ATR_int::name, ATR_float::name, THD_datablock::natr, ATR_string::nch, ATR_float::nfl, NI_add_column(), NI_add_to_group(), NI_FLOAT, NI_INT, NI_new_data_element(), NI_new_group_element(), NI_rename_group(), NI_set_attribute(), NI_STRING, NI_TEXT_MODE, ATR_int::nin, NI_element::outmode, RETURN, MCW_idcode::str, THD_set_dataset_attributes(), THD_zblock(), ATR_any::type, and ZBLOCK. Referenced by main(), nifti_set_afni_extension(), SUMA_SendDset_Afni(), THD_dataset_to_niml(), and THD_write_nimlatr().
00011 {
00012 THD_datablock *blk ;
00013 ATR_any *atr_any ;
00014 NI_element *nel ;
00015 int ia , ii ;
00016 NI_group *ngr = NULL ; /* will be output */
00017
00018 ENTRY("THD_nimlize_dsetatr") ;
00019
00020 /*--- sanity checks ---*/
00021
00022 if( !ISVALID_DSET(dset) ) RETURN(ngr) ;
00023 blk = dset->dblk ;
00024 if( blk == NULL ) RETURN(ngr) ;
00025
00026 THD_set_dataset_attributes( dset ) ;
00027 if( blk->natr == 0 || blk->atr == NULL ) RETURN(ngr) ;
00028
00029 /* create empty output group */
00030
00031 ngr = NI_new_group_element() ;
00032
00033 NI_rename_group( ngr , "AFNI_dataset" ) ;
00034
00035 NI_set_attribute( ngr , "self_idcode" , dset->idcode.str ) ;
00036
00037 /* make a data element for each attribute ... */
00038
00039 for( ia=0 ; ia < blk->natr ; ia++ ){
00040
00041 atr_any = &(blk->atr[ia]) ;
00042 if( atr_any == NULL ) continue ; /* bad attribute */
00043
00044 switch( atr_any->type ){
00045
00046 /* numeric types are easy: a single column vector with the numbers */
00047
00048 case ATR_FLOAT_TYPE:{
00049 ATR_float *atr_flo = (ATR_float *)atr_any ;
00050
00051 nel = NI_new_data_element( "AFNI_atr" , atr_flo->nfl ) ;
00052 nel->outmode = NI_TEXT_MODE ;
00053 NI_set_attribute( nel , "atr_name" , atr_flo->name ) ;
00054 NI_add_column( nel , NI_FLOAT , atr_flo->fl ) ;
00055 NI_add_to_group( ngr , nel ) ;
00056 }
00057 break ;
00058
00059 case ATR_INT_TYPE:{
00060 ATR_int *atr_int = (ATR_int *)atr_any ;
00061
00062 nel = NI_new_data_element( "AFNI_atr" , atr_int->nin ) ;
00063 nel->outmode = NI_TEXT_MODE ;
00064 NI_set_attribute( nel , "atr_name" , atr_int->name ) ;
00065 NI_add_column( nel , NI_INT , atr_int->in ) ;
00066 NI_add_to_group( ngr , nel ) ;
00067 }
00068 break ;
00069
00070 /* 02 Jun 2005: If string to save is too long, break it into pieces.
00071 Will have to be reassembled on input into one string. */
00072
00073 #undef SZMAX
00074 #define SZMAX 1000
00075 case ATR_STRING_TYPE:{
00076 ATR_string *atr_str = (ATR_string *)atr_any ;
00077 int nnn , nstr , istr , ibot,itop ;
00078 char **sar ;
00079
00080 nnn = atr_str->nch ; if( nnn <= 0 ) break ;
00081 nstr = ((nnn-1)/SZMAX) + 1 ;
00082 sar = (char **)malloc(sizeof(char *)*nstr) ;
00083 for( istr=0 ; istr < nstr ; istr++ ){
00084 ibot = istr*SZMAX ;
00085 itop = ibot+SZMAX ; if( itop > atr_str->nch ) itop = atr_str->nch ;
00086 nnn = itop-ibot ;
00087 sar[istr] = (char *)calloc(1,nnn+1) ;
00088 memcpy( sar[istr] , atr_str->ch+ibot , nnn ) ;
00089 THD_zblock( nnn , sar[istr] ) ;
00090 sar[istr][nnn] = '\0' ;
00091 }
00092 if( nnn > 1 && sar[nstr-1][nnn-1] == ZBLOCK )
00093 sar[nstr-1][nnn-1] = '\0' ;
00094
00095 nel = NI_new_data_element( "AFNI_atr" , nstr ) ;
00096 nel->outmode = NI_TEXT_MODE ;
00097 NI_set_attribute( nel , "atr_name" , atr_str->name ) ;
00098
00099 NI_add_column( nel , NI_STRING , sar ) ;
00100 NI_add_to_group( ngr , nel ) ;
00101
00102 for( istr=0 ; istr < nstr ; istr++ ) free((void *)sar[istr]) ;
00103 free((void *)sar) ;
00104 }
00105 break ;
00106
00107 } /* end of switch on atr type */
00108
00109 } /* end of loop over all atr's */
00110
00111 /*--- done ---*/
00112
00113 RETURN(ngr) ;
00114 }
|
|
||||||||||||||||
|
Put a dataset sub-brick into a '<VOLUME_DATA ...>' element.
Definition at line 442 of file thd_nimlatr.c. References DSET_ARRAY, DSET_BRICK_FACTOR, DSET_BRICK_TYPE, DSET_NVALS, DSET_NVOX, ENTRY, flags, THD_3dim_dataset::idcode, ISVALID_DSET, mri_datum_size(), NI_add_column(), NI_BINARY_MODE, NI_new_data_element(), NI_set_attribute(), NI_element::outmode, RETURN, SBFLAG_FACTOR, SBFLAG_INDEX, and MCW_idcode::str. Referenced by main(), SUMA_SendDset_Afni(), and THD_dataset_to_niml().
00443 {
00444 NI_element *nel ;
00445 char rhs[64] ;
00446 void *bar ;
00447 int ityp , nxyz , nbar ;
00448
00449 ENTRY("THD_subbrick_to_niml") ;
00450
00451 if( !ISVALID_DSET(dset) ||
00452 ival < 0 || ival >= DSET_NVALS(dset) ) RETURN(NULL) ;
00453
00454 bar = DSET_ARRAY(dset,ival) ; if( bar == NULL ) RETURN(NULL) ;
00455
00456 ityp = DSET_BRICK_TYPE(dset,ival) ; /* type of data in bar */
00457 nbar = mri_datum_size(ityp) ; /* size of one value */
00458 nxyz = DSET_NVOX(dset) ; /* number of voxels */
00459
00460 nel = NI_new_data_element( "VOLUME_DATA" , nxyz ) ;
00461 NI_set_attribute( nel , "domain_parent_idcode" , dset->idcode.str ) ;
00462 NI_add_column( nel , ityp , bar ) ;
00463 nel->outmode = NI_BINARY_MODE ; /* write this in binary mode */
00464
00465 /*-- add any special attributes desired by the caller --*/
00466
00467 if( (flags & SBFLAG_INDEX) ){
00468 sprintf(rhs,"%d",ival) ;
00469 NI_set_attribute( nel , "index" , rhs ) ;
00470 }
00471
00472 if( (flags & SBFLAG_FACTOR) ){
00473 float fac = DSET_BRICK_FACTOR(dset,ival) ;
00474 if( fac > 0.0 ){
00475 sprintf(rhs,"%f",fac) ;
00476 NI_set_attribute( nel , "scale_factor" , rhs ) ;
00477 }
00478 }
00479
00480 RETURN(nel) ;
00481 }
|