00001
00002
00003
00004
00005
00006
00007 #include "mrilib.h"
00008 #include "thd.h"
00009
00010
00011
00012
00013
00014
00015 static int native_order = -1 ;
00016 static int no_mmap = -1 ;
00017 static int no_ordwarn = -1 ;
00018
00019 THD_datablock * THD_init_one_datablock( char *dirname , char *headname )
00020 {
00021 THD_datablock *dblk ;
00022 THD_diskptr *dkptr ;
00023 int ii ;
00024 char prefix[THD_MAX_NAME] = "\0" ;
00025 int default_order ;
00026
00027 ENTRY("THD_init_one_datablock") ;
00028
00029
00030
00031 if( dirname == NULL || strlen(dirname) == 0 ||
00032 headname == NULL || strlen(headname) == 0 ) RETURN( NULL ) ;
00033
00034 FILENAME_TO_PREFIX(headname,prefix) ;
00035 if( strlen(prefix) == 0 ||
00036 strstr(headname,DATASET_HEADER_SUFFIX) == NULL ) RETURN( NULL ) ;
00037
00038
00039
00040 if( native_order < 0 ) native_order = mri_short_order() ;
00041
00042 no_mmap = AFNI_yesenv("AFNI_NOMMAP") ;
00043 no_ordwarn = AFNI_yesenv("AFNI_NO_BYTEORDER_WARNING") ;
00044
00045 { char *hh = getenv("AFNI_BYTEORDER_INPUT") ;
00046 default_order = native_order ;
00047 if( hh != NULL ){
00048 if( strncmp(hh,LSB_FIRST_STRING,ORDER_LEN) == 0 )
00049 default_order = LSB_FIRST ;
00050 else if( strncmp(hh,MSB_FIRST_STRING,ORDER_LEN) == 0 )
00051 default_order = MSB_FIRST ;
00052 }
00053 }
00054
00055 #if 1
00056
00057 dblk = EDIT_empty_datablock() ;
00058 dkptr = dblk->diskptr ;
00059
00060 #else
00061
00062
00063 dblk = myXtNew( THD_datablock ) ;
00064 dblk->type = DATABLOCK_TYPE ;
00065 dblk->brick = NULL ;
00066 dblk->brick_bytes = NULL ;
00067 dblk->brick_fac = NULL ;
00068 dblk->total_bytes = 0 ;
00069 dblk->malloc_type = DATABLOCK_MEM_UNDEFINED ;
00070 dblk->parent = NULL ;
00071
00072 dblk->brick_lab = NULL ;
00073 dblk->brick_keywords = NULL ;
00074 dblk->brick_statcode = NULL ;
00075 dblk->brick_stataux = NULL ;
00076
00077 dblk->master_nvals = 0 ;
00078 dblk->master_ival = NULL ;
00079 dblk->master_bytes = NULL ;
00080
00081 dblk->master_bot = 1.0 ;
00082 dblk->master_top = 0.0 ;
00083
00084 DBLK_unlock(dblk) ;
00085
00086 dblk->shm_idcode[0] = '\0' ;
00087
00088 INIT_KILL(dblk->kl) ;
00089
00090 dblk->diskptr = dkptr = myXtNew( THD_diskptr ) ;
00091 dkptr->type = DISKPTR_TYPE ;
00092 dkptr->storage_mode = STORAGE_UNDEFINED ;
00093 #if 0
00094 dkptr->byte_order = native_order ;
00095 #else
00096 dkptr->byte_order = default_order;
00097 #endif
00098
00099 ADDTO_KILL(dblk->kl,dkptr) ;
00100
00101 #endif
00102
00103
00104
00105 THD_read_all_atr( headname , dblk ) ;
00106
00107
00108
00109 ii = THD_datablock_from_atr( dblk, dirname, headname ) ;
00110 if( ii == 0 ){
00111 THD_delete_datablock( dblk ) ;
00112 myXtFree(dblk) ;
00113 RETURN( NULL ) ;
00114 }
00115
00116 #if 0
00117 if( PRINT_TRACING ){
00118 char str[256] ;
00119 sprintf(str,"rank=%d nvals=%d dim[0]=%d dim[1]=%d dim[2]=%d",
00120 dkptr->rank , dkptr->nvals ,
00121 dkptr->dimsizes[0] , dkptr->dimsizes[1] , dkptr->dimsizes[2] ) ;
00122 STATUS(str) ;
00123 }
00124 #endif
00125
00126 RETURN( dblk ) ;
00127 }
00128
00129
00130
00131 #undef MYHEAD
00132 #define MYHEAD ((headname==NULL) ? "UNKNOWN" : headname)
00133
00134
00135
00136
00137
00138 int THD_datablock_from_atr( THD_datablock *dblk, char *dirname, char *headname )
00139 {
00140 THD_diskptr *dkptr ;
00141 ATR_int *atr_rank , *atr_dimen , *atr_scene , *atr_btype ;
00142 ATR_float *atr_flt ;
00143 ATR_string *atr_labs ;
00144 int ii , view_type , func_type , dset_type , nx,ny,nz,nvox , nvals , ibr,typ ;
00145 Boolean ok ;
00146 char prefix[THD_MAX_NAME]="Unknown" ;
00147 MRI_IMAGE *qim ;
00148 int brick_ccode ;
00149
00150 ENTRY("THD_datablock_from_atr") ;
00151
00152 if( dblk == NULL || dblk->natr <= 0 ) RETURN(0) ;
00153
00154 dkptr = dblk->diskptr ;
00155
00156
00157
00158 atr_rank = THD_find_int_atr( dblk , ATRNAME_DATASET_RANK ) ;
00159 atr_dimen = THD_find_int_atr( dblk , ATRNAME_DATASET_DIMENSIONS ) ;
00160 atr_scene = THD_find_int_atr( dblk , ATRNAME_SCENE_TYPE ) ;
00161
00162
00163
00164 if( atr_rank == NULL || atr_dimen == NULL || atr_scene == NULL ) RETURN(0) ;
00165
00166
00167
00168 STATUS("loading *_type from SCENE") ;
00169
00170 view_type = atr_scene->in[0] ;
00171 func_type = atr_scene->in[1] ;
00172 dset_type = atr_scene->in[2] ;
00173
00174
00175
00176 ok = True ;
00177 nvox = 1 ;
00178
00179 STATUS("loading from RANK") ;
00180
00181 dkptr->rank = atr_rank->in[0] ;
00182 dkptr->nvals = dblk->nvals = nvals = atr_rank->in[1] ;
00183
00184 STATUS("loading from DIMENSIONS") ;
00185
00186 for( ii=0 ; ii < dkptr->rank ; ii++ ){
00187 dkptr->dimsizes[ii] = atr_dimen->in[ii] ;
00188 ok = ( ok && dkptr->dimsizes[ii] >= 1 ) ;
00189 nvox *= dkptr->dimsizes[ii] ;
00190 }
00191
00192 #if 0
00193 if( PRINT_TRACING ){
00194 char str[256] ;
00195 sprintf(str,"rank=%d nvals=%d dim[0]=%d dim[1]=%d dim[2]=%d nvox=%d",
00196 dkptr->rank , dkptr->nvals ,
00197 dkptr->dimsizes[0] , dkptr->dimsizes[1] , dkptr->dimsizes[2] , nvox ) ;
00198 STATUS(str) ;
00199 }
00200 #endif
00201
00202 if( !ok || nvals < 1 ||
00203 dkptr->rank < THD_MIN_RANK || dkptr->rank > THD_MAX_RANK ){
00204 STATUS("bad rank!!??") ;
00205 RETURN(0) ;
00206 }
00207
00208
00209
00210 STATUS("creating storage filenames") ;
00211
00212 if( headname != NULL && strchr(headname,'+') != NULL ){
00213 FILENAME_TO_PREFIX(headname,prefix) ;
00214 THD_init_diskptr_names( dkptr, dirname,NULL,prefix , view_type , True ) ;
00215 } else {
00216 if( headname != NULL ) MCW_strncpy(prefix,headname,THD_MAX_NAME) ;
00217 THD_init_diskptr_names( dkptr, dirname,NULL,prefix , view_type , True ) ;
00218 }
00219
00220
00221
00222 STATUS("checking if .BRIK file exists") ;
00223
00224 brick_ccode = COMPRESS_filecode(dkptr->brick_name) ;
00225 if( brick_ccode != COMPRESS_NOFILE )
00226 dkptr->storage_mode = STORAGE_BY_BRICK ;
00227
00228
00229
00230 if( headname != NULL && dkptr->storage_mode == STORAGE_UNDEFINED ){
00231 atr_labs = THD_find_string_atr(dblk,"VOLUME_FILENAMES") ;
00232 if( atr_labs != NULL ){
00233 dkptr->storage_mode = STORAGE_BY_VOLUMES ;
00234 dblk->malloc_type = DATABLOCK_MEM_MALLOC ;
00235 }
00236 }
00237
00238
00239
00240 dblk->brick_fac = (float *) XtMalloc( sizeof(float) * nvals ) ;
00241 for( ibr=0 ; ibr < nvals ; ibr++ ) dblk->brick_fac[ibr] = 0.0 ;
00242
00243
00244
00245 atr_flt = THD_find_float_atr( dblk , ATRNAME_BRICK_FLTFAC ) ;
00246 if( atr_flt != NULL ){
00247 for( ibr=0 ; ibr < nvals && ibr < atr_flt->nfl ; ibr++ )
00248 dblk->brick_fac[ibr] = atr_flt->fl[ibr] ;
00249 }
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 atr_btype = THD_find_int_atr( dblk , ATRNAME_BRICK_TYPES ) ;
00262
00263 if( atr_btype == NULL ){
00264 THD_init_datablock_brick( dblk , MRI_short , NULL ) ;
00265 } else {
00266 THD_init_datablock_brick( dblk , atr_btype->nin , atr_btype->in ) ;
00267 }
00268
00269 if( !THD_datum_constant(dblk) ){
00270 fprintf(stderr,
00271 "\n** WARNING: File %s has mixed-type sub-bricks. ", MYHEAD ) ;
00272 }
00273
00274
00275
00276 atr_labs = THD_find_string_atr( dblk , ATRNAME_BYTEORDER ) ;
00277 if( atr_labs != NULL && atr_labs->nch > 0 ){
00278
00279 if( strncmp(atr_labs->ch,LSB_FIRST_STRING,ORDER_LEN) == 0 )
00280 dkptr->byte_order = LSB_FIRST ;
00281 else if( strncmp(atr_labs->ch,MSB_FIRST_STRING,ORDER_LEN) == 0 )
00282 dkptr->byte_order = MSB_FIRST ;
00283 else
00284 fprintf(stderr,"*** Unknown %s found in dataset %s\n",
00285 ATRNAME_BYTEORDER , MYHEAD ) ;
00286
00287 } else if( !no_ordwarn &&
00288 DBLK_BRICK_TYPE(dblk,0) != MRI_byte &&
00289 dblk->diskptr->storage_mode == STORAGE_BY_BRICK ){
00290
00291 static int first=1 ;
00292 if( first ){
00293 fprintf(stderr,
00294 "\n*** The situation below can be rectified with program '3drefit -byteorder':\n");
00295 first = 0 ;
00296 }
00297 fprintf(stderr," ** Dataset %s: assuming byteorder %s\n",
00298 MYHEAD , BYTE_ORDER_STRING(dkptr->byte_order) ) ;
00299 }
00300
00301
00302
00303
00304 if( dkptr->storage_mode == STORAGE_BY_BRICK ){
00305 #if MMAP_THRESHOLD > 0
00306 dblk->malloc_type = (dblk->total_bytes > MMAP_THRESHOLD)
00307 ? DATABLOCK_MEM_MMAP : DATABLOCK_MEM_MALLOC ;
00308 DBLK_mmapfix(dblk) ;
00309 #else
00310 dblk->malloc_type = DATABLOCK_MEM_MALLOC ;
00311 #endif
00312
00313
00314
00315
00316
00317
00318 if( brick_ccode >= 0 || dkptr->byte_order != native_order || no_mmap )
00319 dblk->malloc_type = DATABLOCK_MEM_MALLOC ;
00320 }
00321
00322
00323
00324 THD_init_datablock_labels( dblk ) ;
00325
00326 atr_labs = THD_find_string_atr( dblk , ATRNAME_BRICK_LABS ) ;
00327
00328 if( atr_labs != NULL && atr_labs->nch > 0 ){
00329 int ipos = -1 , ipold , ngood ;
00330
00331 for( ibr=0 ; ibr < nvals ; ibr++ ){
00332
00333 for( ipold = ipos++ ;
00334 ipos < atr_labs->nch && atr_labs->ch[ipos] != '\0' ;
00335 ipos++ ) ;
00336
00337 ngood = ipos - ipold - 1 ;
00338 if( ngood > 0 ){
00339 XtFree(dblk->brick_lab[ibr]) ;
00340 if( ngood > 32 ) ngood = 32 ;
00341 dblk->brick_lab[ibr] = (char *) XtMalloc(sizeof(char)*(ngood+2)) ;
00342 memcpy( dblk->brick_lab[ibr] , atr_labs->ch+(ipold+1) , ngood ) ;
00343 dblk->brick_lab[ibr][ngood] = '\0' ;
00344 }
00345
00346 if( ipos >= atr_labs->nch ) break ;
00347 }
00348 }
00349
00350
00351
00352 THD_init_datablock_keywords( dblk ) ;
00353
00354 atr_labs = THD_find_string_atr( dblk , ATRNAME_BRICK_KEYWORDS ) ;
00355
00356 if( atr_labs != NULL && atr_labs->nch > 0 ){
00357 int ipos = -1 , ipold , ngood ;
00358
00359 for( ibr=0 ; ibr < nvals ; ibr++ ){
00360
00361 for( ipold = ipos++ ;
00362 ipos < atr_labs->nch && atr_labs->ch[ipos] != '\0' ;
00363 ipos++ ) ;
00364
00365 ngood = ipos - ipold - 1 ;
00366 if( ngood > 0 ){
00367 XtFree(dblk->brick_keywords[ibr]) ;
00368 dblk->brick_keywords[ibr] = (char *) XtMalloc(sizeof(char)*(ngood+2)) ;
00369 memcpy( dblk->brick_keywords[ibr] , atr_labs->ch+(ipold+1) , ngood ) ;
00370 dblk->brick_keywords[ibr][ngood] = '\0' ;
00371 }
00372
00373 if( ipos >= atr_labs->nch ) break ;
00374 }
00375 }
00376
00377
00378
00379 atr_labs = THD_find_string_atr( dblk , "BRICK_STATSYM" ) ;
00380 if( atr_labs != NULL && atr_labs->nch > 0 ){
00381 NI_str_array *sar ; int scode,np ; float parm[3] ;
00382 sar = NI_decode_string_list( atr_labs->ch , ";" ) ;
00383 if( sar != NULL && sar->num > 0 ){
00384 for( ibr=0 ; ibr < nvals && ibr < sar->num ; ibr++ ){
00385 NI_stat_decode( sar->str[ibr] , &scode , parm,parm+1,parm+2 ) ;
00386 if( scode >= AFNI_FIRST_STATCODE && scode <= AFNI_LAST_STATCODE ){
00387 np = NI_stat_numparam(scode) ;
00388 THD_store_datablock_stataux( dblk , ibr,scode,np,parm ) ;
00389 }
00390 }
00391 NI_delete_str_array(sar) ;
00392 }
00393 } else {
00394 atr_flt = THD_find_float_atr( dblk , ATRNAME_BRICK_STATAUX ) ;
00395 if( atr_flt != NULL && atr_flt->nfl >= 3 ){
00396 int ipos=0 , iv,nv,jv ;
00397
00398
00399
00400
00401
00402 while( ipos <= atr_flt->nfl - 3 ){
00403 iv = (int) ( atr_flt->fl[ipos++] ) ;
00404 jv = (int) ( atr_flt->fl[ipos++] ) ;
00405 nv = (int) ( atr_flt->fl[ipos++] ) ;
00406
00407 if( nv > atr_flt->nfl - ipos ) nv = atr_flt->nfl - ipos ;
00408
00409 THD_store_datablock_stataux( dblk , iv , jv , nv , atr_flt->fl + ipos ) ;
00410 ipos += nv ;
00411 }
00412 }
00413 }
00414 #if 0
00415 if( PRINT_TRACING ){
00416 char str[256] ;
00417 sprintf(str,"rank=%d nvals=%d dim[0]=%d dim[1]=%d dim[2]=%d",
00418 dkptr->rank , dkptr->nvals ,
00419 dkptr->dimsizes[0] , dkptr->dimsizes[1] , dkptr->dimsizes[2] ) ;
00420 STATUS(str) ;
00421 }
00422 #endif
00423
00424 RETURN(1) ;
00425 }
00426
00427
00428
00429
00430 #define ATR_IS_STR(nnn) ( (atr_str = THD_find_string_atr(blk,nnn)) != NULL )
00431 #define ATR_IS_FLT(nnn) ( (atr_flt = THD_find_float_atr (blk,nnn)) != NULL )
00432 #define ATR_IS_INT(nnn) ( (atr_int = THD_find_int_atr (blk,nnn)) != NULL )
00433
00434
00435
00436
00437
00438
00439
00440
00441 void THD_datablock_apply_atr( THD_3dim_dataset *dset )
00442 {
00443 THD_datablock *blk ;
00444 THD_diskptr *dkptr ;
00445 THD_dataxes *daxes ;
00446 ATR_int *atr_int = NULL ;
00447 ATR_float *atr_flt = NULL;
00448 ATR_string *atr_str = NULL ;
00449 int ii , view_type , func_type , dset_type , nx,ny,nz,nvox , nvals , ibr,typ ;
00450 Boolean ok ;
00451 char prefix[THD_MAX_NAME]="Unknown" ;
00452 MRI_IMAGE *qim ;
00453 int brick_ccode ;
00454
00455 ENTRY("THD_datablock_apply_atr") ;
00456
00457 if( !ISVALID_DSET(dset) ) EXRETURN ;
00458
00459 blk = dset->dblk ; if( blk == NULL ) EXRETURN ;
00460 nvals = blk->nvals ; if( nvals <= 0 ) EXRETURN ;
00461 daxes = dset->daxes ; if( daxes == NULL ) EXRETURN ;
00462 dkptr = blk->diskptr ;
00463
00464
00465
00466 if( ATR_IS_STR(ATRNAME_BRICK_LABS) ){
00467 int ipos = -1 , ipold , ngood ;
00468
00469 STATUS("brick labels") ;
00470 if( blk->brick_lab == NULL ) THD_init_datablock_labels( blk ) ;
00471
00472 for( ibr=0 ; ibr < nvals ; ibr++ ){
00473
00474 for( ipold = ipos++ ;
00475 ipos < atr_str->nch && atr_str->ch[ipos] != '\0' ;
00476 ipos++ ) ;
00477
00478 ngood = ipos - ipold - 1 ;
00479 if( ngood > 0 ){
00480 XtFree(blk->brick_lab[ibr]) ;
00481 if( ngood > 32 ) ngood = 32 ;
00482 blk->brick_lab[ibr] = (char *) XtMalloc(sizeof(char)*(ngood+2)) ;
00483 memcpy( blk->brick_lab[ibr] , atr_str->ch+(ipold+1) , ngood ) ;
00484 blk->brick_lab[ibr][ngood] = '\0' ;
00485 }
00486
00487 if( ipos >= atr_str->nch ) break ;
00488 }
00489 }
00490
00491
00492
00493 if( ATR_IS_STR(ATRNAME_KEYWORDS) ){
00494 STATUS("dataset keywords") ;
00495 dset->keywords = XtNewString( atr_str->ch ) ;
00496 }
00497
00498
00499
00500 if( ATR_IS_STR(ATRNAME_BRICK_KEYWORDS) ){
00501 int ipos = -1 , ipold , ngood ;
00502
00503 STATUS("brick keywords") ;
00504 if( blk->brick_keywords == NULL ) THD_init_datablock_keywords( blk ) ;
00505
00506 for( ibr=0 ; ibr < nvals ; ibr++ ){
00507
00508 for( ipold = ipos++ ;
00509 ipos < atr_str->nch && atr_str->ch[ipos] != '\0' ;
00510 ipos++ ) ;
00511
00512 ngood = ipos - ipold - 1 ;
00513 if( ngood > 0 ){
00514 XtFree(blk->brick_keywords[ibr]) ;
00515 blk->brick_keywords[ibr] = (char *) XtMalloc(sizeof(char)*(ngood+2)) ;
00516 memcpy( blk->brick_keywords[ibr] , atr_str->ch+(ipold+1) , ngood ) ;
00517 blk->brick_keywords[ibr][ngood] = '\0' ;
00518 }
00519
00520 if( ipos >= atr_str->nch ) break ;
00521 }
00522 }
00523
00524
00525
00526 if( ATR_IS_FLT(ATRNAME_BRICK_STATAUX) ){
00527 int ipos=0 , iv,nv,jv ;
00528
00529 STATUS("brick stataux") ;
00530
00531
00532
00533
00534
00535 while( ipos <= atr_flt->nfl - 3 ){
00536 iv = (int) ( atr_flt->fl[ipos++] ) ;
00537 jv = (int) ( atr_flt->fl[ipos++] ) ;
00538 nv = (int) ( atr_flt->fl[ipos++] ) ;
00539
00540 if( nv > atr_flt->nfl - ipos ) nv = atr_flt->nfl - ipos ;
00541
00542 THD_store_datablock_stataux( blk , iv , jv , nv , atr_flt->fl + ipos ) ;
00543 ipos += nv ;
00544 }
00545 }
00546
00547
00548
00549 if( ATR_IS_STR(ATRNAME_IDSTRING) )
00550 MCW_strncpy( dset->idcode.str , atr_str->ch , MCW_IDSIZE ) ;
00551
00552 if( ATR_IS_STR(ATRNAME_IDDATE) )
00553 MCW_strncpy( dset->idcode.date , atr_str->ch , MCW_IDDATE ) ;
00554
00555 if( ATR_IS_STR(ATRNAME_IDANATPAR) )
00556 MCW_strncpy( dset->anat_parent_idcode.str , atr_str->ch , MCW_IDSIZE ) ;
00557
00558 if( ATR_IS_STR(ATRNAME_IDWARPPAR) )
00559 MCW_strncpy( dset->warp_parent_idcode.str , atr_str->ch , MCW_IDSIZE ) ;
00560
00561
00562
00563 if( ATR_IS_STR(ATRNAME_ANATOMY_PARENT) &&
00564 ISZERO_IDCODE(dset->anat_parent_idcode) )
00565 MCW_strncpy( dset->anat_parent_name , atr_str->ch , THD_MAX_NAME ) ;
00566
00567 if( ATR_IS_STR(ATRNAME_WARP_PARENT) &&
00568 ISZERO_IDCODE(dset->warp_parent_idcode) )
00569 MCW_strncpy( dset->warp_parent_name , atr_str->ch , THD_MAX_NAME ) ;
00570
00571 if( ATR_IS_STR(ATRNAME_DATANAME) )
00572 MCW_strncpy( dset->self_name , atr_str->ch , THD_MAX_NAME ) ;
00573
00574
00575
00576 if( ATR_IS_FLT(ATRNAME_MARKSXYZ) && ATR_IS_STR(ATRNAME_MARKSLAB) ){
00577 int im , llen ;
00578 THD_ivec3 iv ;
00579 float xxdown,xxup , yydown,yyup , zzdown,zzup ;
00580
00581 STATUS("markers") ;
00582
00583 if( dset->markers == NULL ){
00584 dset->markers = myXtNew( THD_marker_set ) ;
00585 ADDTO_KILL(dset->kl , dset->markers) ;
00586 }
00587
00588 COPY_INTO_STRUCT( *(dset->markers) ,
00589 MARKS_FSTART ,
00590 float ,
00591 atr_flt->fl ,
00592 MARKS_FSIZE ) ;
00593
00594 COPY_INTO_STRUCT( *(dset->markers) ,
00595 MARKS_LSTART ,
00596 char ,
00597 atr_str->ch ,
00598 MARKS_LSIZE ) ;
00599
00600 xxdown = daxes->xxmin ; xxup = daxes->xxmax ;
00601 yydown = daxes->yymin ; yyup = daxes->yymax ;
00602 zzdown = daxes->zzmin ; zzup = daxes->zzmax ;
00603
00604 dset->markers->numdef = dset->markers->numset = 0 ;
00605
00606 for( im=0 ; im < MARKS_MAXNUM ; im++ ){
00607 llen = strlen( &(dset->markers->label[im][0]) ) ;
00608 dset->markers->valid[im] =
00609 (llen > 0) &&
00610 ( dset->markers->xyz[im][0] >= xxdown ) &&
00611 ( dset->markers->xyz[im][0] <= xxup ) &&
00612 ( dset->markers->xyz[im][1] >= yydown ) &&
00613 ( dset->markers->xyz[im][1] <= yyup ) &&
00614 ( dset->markers->xyz[im][2] >= zzdown ) &&
00615 ( dset->markers->xyz[im][2] <= zzup ) ;
00616
00617 if( dset->markers->valid[im] ) (dset->markers->numset)++ ;
00618
00619 if( llen > 0 ) (dset->markers->numdef)++ ;
00620
00621 dset->markers->ovcolor[im] = -1 ;
00622 }
00623
00624 if( ATR_IS_STR(ATRNAME_MARKSHELP) ){
00625 COPY_INTO_STRUCT( *(dset->markers) ,
00626 MARKS_HSTART ,
00627 char ,
00628 atr_str->ch ,
00629 MARKS_HSIZE ) ;
00630 } else {
00631 for( im=0 ; im < MARKS_MAXNUM ; im++ )
00632 dset->markers->help[im][0] = '\0' ;
00633 }
00634
00635 if( ATR_IS_INT(ATRNAME_MARKSFLAG) ){
00636 COPY_INTO_STRUCT( *(dset->markers) ,
00637 MARKS_ASTART ,
00638 int ,
00639 atr_int->in ,
00640 MARKS_ASIZE ) ;
00641 dset->markers->type = dset->markers->aflags[0] ;
00642 } else {
00643 for( im=0 ; im < MARKS_MAXFLAG ; im++ )
00644 dset->markers->aflags[im] = -1 ;
00645 }
00646 }
00647
00648
00649
00650 if( ATR_IS_INT(ATRNAME_WARP_TYPE) && ATR_IS_FLT(ATRNAME_WARP_DATA) ){
00651 int wtype = atr_int->in[0] , rtype = atr_int->in[1] ;
00652
00653 STATUS("warp") ;
00654
00655 dset->warp = myXtNew( THD_warp ) ;
00656 ADDTO_KILL( dset->kl , dset->warp ) ;
00657 switch( wtype ){
00658 case WARP_AFFINE_TYPE:{
00659 THD_affine_warp *ww = (THD_affine_warp *) dset->warp ;
00660 ww->type = wtype ;
00661 ww->resam_type = rtype ;
00662 ww->warp.type = MAPPING_LINEAR_TYPE ;
00663
00664 COPY_INTO_STRUCT( ww->warp ,
00665 MAPPING_LINEAR_FSTART ,
00666 float ,
00667 atr_flt->fl ,
00668 MAPPING_LINEAR_FSIZE ) ;
00669 }
00670 break ;
00671
00672 case WARP_TALAIRACH_12_TYPE:{
00673 THD_talairach_12_warp *ww =
00674 (THD_talairach_12_warp *) dset->warp ;
00675 int iw , ioff ;
00676 ww->type = wtype ;
00677 ww->resam_type = rtype ;
00678 for( iw=0 ; iw < 12 ; iw++ ){
00679 ww->warp[iw].type = MAPPING_LINEAR_TYPE ;
00680
00681 ioff = iw * MAPPING_LINEAR_FSIZE ;
00682
00683 COPY_INTO_STRUCT( ww->warp[iw] ,
00684 MAPPING_LINEAR_FSTART ,
00685 float ,
00686 &(atr_flt->fl[ioff]) ,
00687 MAPPING_LINEAR_FSIZE ) ;
00688
00689 }
00690 }
00691 break ;
00692
00693 }
00694 }
00695
00696
00697
00698 if( ATR_IS_FLT(ATRNAME_BRICK_STATS) ){
00699 int qq ;
00700 STATUS("brick statistics") ;
00701 dset->stats = myXtNew( THD_statistics ) ;
00702 dset->stats->type = STATISTICS_TYPE ;
00703 dset->stats->parent = (XtPointer) dset ;
00704 dset->stats->nbstat = blk->nvals ;
00705 dset->stats->bstat = (THD_brick_stats *)
00706 XtMalloc( sizeof(THD_brick_stats) * blk->nvals ) ;
00707 for( qq=0 ; qq < blk->nvals ; qq++ ){
00708 if( 2*qq+1 < atr_flt->nfl ){
00709 dset->stats->bstat[qq].min = atr_flt->fl[2*qq] ;
00710 dset->stats->bstat[qq].max = atr_flt->fl[2*qq+1] ;
00711 } else {
00712 INVALIDATE_BSTAT( dset->stats->bstat[qq] ) ;
00713 }
00714 }
00715 ADDTO_KILL( dset->kl , dset->stats->bstat ) ;
00716 ADDTO_KILL( dset->kl , dset->stats ) ;
00717 }
00718
00719
00720
00721 if( ATR_IS_INT(ATRNAME_TAGSET_NUM) &&
00722 ATR_IS_FLT(ATRNAME_TAGSET_FLOATS) &&
00723 ATR_IS_STR(ATRNAME_TAGSET_LABELS) ){
00724
00725 int nin=atr_int->nin , nfl=atr_flt->nfl , nch=atr_str->nch ;
00726 int ii , ntag , nfper , jj , kk ;
00727
00728 STATUS("tagset") ;
00729 ntag = atr_int->in[0] ;
00730 nfper = atr_int->in[1] ;
00731
00732 if( ntag > MAX_TAG_NUM ) ntag = MAX_TAG_NUM ;
00733
00734 dset->tagset = myXtNew( THD_usertaglist ) ;
00735 ADDTO_KILL( dset->kl , dset->tagset ) ;
00736
00737 dset->tagset->num = ntag ;
00738 strcpy( dset->tagset->label , "Bebe Rebozo" ) ;
00739
00740
00741
00742 #undef TF
00743 #define TF(i,j) \
00744 ( ((j)<nfper && (i)*nfper+(j)<nfl) ? atr_flt->fl[(i)*nfper+(j)] : -666.0 )
00745
00746 for( ii=0 ; ii < ntag ; ii++ ){
00747 dset->tagset->tag[ii].x = TF(ii,0) ;
00748 dset->tagset->tag[ii].y = TF(ii,1) ;
00749 dset->tagset->tag[ii].z = TF(ii,2) ;
00750 dset->tagset->tag[ii].val = TF(ii,3) ;
00751 dset->tagset->tag[ii].ti = TF(ii,4) ;
00752 if( dset->tagset->tag[ii].ti >= 0 ){
00753 dset->tagset->tag[ii].set = 1 ;
00754 } else {
00755 dset->tagset->tag[ii].set = 0 ; dset->tagset->tag[ii].ti = 0 ;
00756 }
00757 }
00758 #undef TF
00759
00760
00761
00762 jj = 0 ;
00763 for( ii=0 ; ii < ntag ; ii++ ){
00764 if( jj < nch ){
00765 kk = strlen( atr_str->ch + jj ) ;
00766 if( kk > 0 ) TAG_SETLABEL( dset->tagset->tag[ii] , atr_str->ch + jj );
00767 else sprintf( dset->tagset->tag[ii].label , "Tag %d" , ii+1 );
00768 jj += kk+1 ;
00769 } else {
00770 sprintf( dset->tagset->tag[ii].label , "Tag %d" , ii+1 ) ;
00771 }
00772 }
00773 }
00774
00775 EXRETURN ;
00776 }
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796 void THD_init_datablock_brick( THD_datablock *dblk, int ntype, void *btype )
00797 {
00798 int ibr , nx,ny,nz , typ , nvals ;
00799 MRI_IMAGE *qim ;
00800 THD_datablock *pblk = NULL ;
00801 int *itype = NULL ;
00802
00803 ENTRY("THD_init_datablock_brick") ;
00804
00805 if( ! ISVALID_DATABLOCK(dblk) ) EXRETURN ;
00806 if( ntype < 0 && btype == NULL ) EXRETURN ;
00807 if( ntype == 0 && btype != NULL ) EXRETURN ;
00808
00809 if( ntype < 0 ){
00810 pblk = (THD_datablock *) btype ;
00811 if( ! ISVALID_DATABLOCK(pblk) ) EXRETURN ;
00812 } else {
00813 itype = (int *) btype ;
00814 }
00815
00816 nx = dblk->diskptr->dimsizes[0] ;
00817 ny = dblk->diskptr->dimsizes[1] ;
00818 nz = dblk->diskptr->dimsizes[2] ;
00819 nvals = dblk->nvals ; if( nvals < 1 ) EXRETURN ;
00820
00821
00822
00823 if( dblk->brick_bytes == NULL ){
00824 STATUS("making dblk->brick_bytes") ;
00825 dblk->brick_bytes = (int *) XtMalloc( sizeof(int) * nvals ) ;
00826 }
00827
00828 if( dblk->brick_fac == NULL ){
00829 STATUS("making dblk->brick_fac") ;
00830 dblk->brick_fac = (float *) XtMalloc( sizeof(float) * nvals ) ;
00831 for( ibr=0 ; ibr < nvals ; ibr++ )
00832 dblk->brick_fac[ibr] = (ntype < 0) ? pblk->brick_fac[ibr] : 0.0 ;
00833 }
00834
00835 dblk->total_bytes = 0 ;
00836
00837 if( dblk->brick != NULL ){
00838 STATUS("destroying old dblk->brick") ;
00839 DESTROY_IMARR( dblk->brick ) ;
00840 }
00841
00842 STATUS("making new dblk->brick") ;
00843 INIT_IMARR( dblk->brick ) ;
00844
00845
00846
00847 STATUS("starting sub-brick creations") ;
00848 for( ibr=0 ; ibr < nvals ; ibr++ ){
00849 if( ntype < 0 ){ typ = DBLK_BRICK_TYPE(pblk,ibr) ;
00850 } else if( itype == NULL ){
00851 typ = ntype ;
00852 } else {
00853 if( ibr < ntype ) typ = itype[ibr] ;
00854 else typ = itype[ntype-1] ;
00855 }
00856
00857 qim = mri_new_vol_empty( nx,ny,nz , typ ) ;
00858 ADDTO_IMARR( dblk->brick , qim ) ;
00859
00860 dblk->brick_bytes[ibr] = qim->pixel_size * qim->nvox ;
00861 dblk->total_bytes += dblk->brick_bytes[ibr] ;
00862 }
00863
00864 STATUS("exiting") ;
00865 EXRETURN ;
00866 }
00867
00868
00869
00870
00871
00872 int THD_need_brick_factor( THD_3dim_dataset * dset )
00873 {
00874 int ii , nval ;
00875
00876 ENTRY("THD_need_brick_factor") ;
00877
00878 if( ! ISVALID_DSET(dset) ) RETURN( 0 ) ;
00879 if( ! ISVALID_DATABLOCK(dset->dblk) ) RETURN( 0 ) ;
00880 if( dset->dblk->brick_fac == NULL ) RETURN( 0 ) ;
00881
00882 nval = DSET_NVALS(dset) ;
00883 for( ii=0 ; ii < nval ; ii++ )
00884 if( DSET_BRICK_FACTOR(dset,ii) != 0.0 &&
00885 DSET_BRICK_FACTOR(dset,ii) != 1.0 ) RETURN( 1 ) ;
00886
00887 RETURN( 0 ) ;
00888 }