00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef _MCW_3DDATASET_
00012 #define _MCW_3DDATASET_
00013
00014
00015 #define DSET_VERSION_LATEST "1996-07-10"
00016 #define DSET_VERSION_COMPARE(v1,v2) strcmp(v1,v2)
00017
00018
00019 #include <unistd.h>
00020 #include <stdlib.h>
00021 #include <stdio.h>
00022 #include <string.h>
00023 #include <math.h>
00024 #include <errno.h>
00025 #include <ctype.h>
00026
00027 #include <X11/Intrinsic.h>
00028
00029 #include "mcw_malloc.h"
00030
00031 #include "killer.h"
00032 #include "vecmat.h"
00033 #include "machdep.h"
00034 #include "mrilib.h"
00035 #include "tagset.h"
00036
00037 #include "thd_compress.h"
00038
00039 #ifndef myXtFree
00040
00041 #define myXtFree(xp) (XtFree((char *)(xp)) , (xp)=NULL)
00042 #endif
00043
00044 #ifndef myXtNew
00045
00046 #define myXtNew(type) ((type *) XtCalloc(1,(unsigned) sizeof(type)))
00047 #endif
00048
00049 struct THD_3dim_dataset ;
00050
00051 #include "niml.h"
00052 #include "afni_suma.h"
00053
00054
00055
00056 #define ALLOW_MINC
00057
00058
00059
00060 #define STRING_HAS_SUFFIX(ss,suf) \
00061 ((ss != NULL) && (suf != NULL) && \
00062 (strlen(ss) >= strlen(suf)) && \
00063 (strcmp(ss+strlen(ss)-strlen(suf),suf) == 0))
00064
00065
00066
00067
00068
00069 #define THD_MAX_NAME 256
00070
00071
00072
00073 #define THD_MAX_LABEL 38
00074
00075
00076
00077 #define THD_MAX_PREFIX (127+1)
00078
00079
00080
00081 #define THD_MAX_VIEWCODE (4+1)
00082
00083
00084
00085 #define THD_MAX_SUFFIX (4+1)
00086
00087
00088
00089 #define THD_MAX_FILECODE (THD_MAX_PREFIX+THD_MAX_VIEWCODE)
00090
00091
00092
00093
00094
00095 #define THD_DEFAULT_LABEL "Viggo!"
00096
00097
00098
00099 #define THD_MAX_SESSION_SIZE 4096
00100
00101
00102
00103 #define THD_MAX_NUM_SESSION 80
00104
00105 #define THD_MAX_CHOICES THD_MAX_SESSION_SIZE
00106
00107 #define THD_MAX_MARKSET 5
00108
00109 #define FAIL -1
00110 #define SUCCESS 1
00111
00112
00113
00114
00115
00116
00117
00118 #define ILLEGAL_TYPE -666
00119
00120
00121
00122
00123
00124 typedef void generic_func() ;
00125
00126
00127
00128 typedef float float_func() ;
00129
00130
00131
00132 typedef struct {
00133 int num ;
00134 int * flags ;
00135 char ** labels ;
00136 generic_func ** funcs ;
00137
00138 void ** func_data ;
00139 int * func_code ;
00140
00141 generic_func ** func_init ;
00142 } MCW_function_list ;
00143
00144
00145 #define RETURNS_STRING 1
00146
00147
00148 #define NEEDS_DSET_INDEX 2
00149
00150
00151 #define PROCESS_MRI_IMAGE 4
00152
00153
00154 #define FUNC_0D 0
00155
00156 #define FUNC_1D 1
00157
00158 #define FUNC_2D 2
00159
00160 #define FUNC_3D 3
00161
00162
00163 #define FUNC_FIM 71
00164
00165
00166
00167
00168
00169 #define TWO_ONE(x,y) x ## y
00170
00171
00172
00173 #define TWO_TWO(x,y) TWO_ONE(x,y)
00174
00175
00176
00177
00178
00179
00180 #define COPY_INTO_STRUCT(str,off,type,ptr,n) \
00181 (void) memcpy( (char *)(&(str))+(off), (char *)(ptr), (n)*sizeof(type) )
00182
00183
00184
00185
00186
00187
00188 #define COPY_FROM_STRUCT(str,off,type,ptr,n) \
00189 (void) memcpy( (char *)(ptr), (char *)(&(str))+(off), (n)*sizeof(type) )
00190
00191
00192
00193
00194
00195
00196
00197
00198 #ifndef MCW_strncpy
00199 #define MCW_strncpy(dest,src,n) \
00200 ( (void) strncpy( (dest) , (src) , (n)-1 ) , (dest)[(n)-1] = '\0' )
00201 #endif
00202
00203
00204
00205 #define IC_DSET 44301
00206 #define IC_FLIM 55402
00207
00208
00209
00210 typedef struct {
00211 int num ;
00212 int nall ;
00213 XtPointer * ar ;
00214 int * ic ;
00215 } XtPointer_array ;
00216
00217
00218
00219 #define INC_XTARR 8
00220
00221
00222
00223
00224
00225 #define INIT_XTARR(name) \
00226 ( (name) = XtNew(XtPointer_array) , \
00227 (name)->num = (name)->nall = 0 , \
00228 (name)->ar = NULL , \
00229 (name)->ic = NULL )
00230
00231
00232
00233 #define ADDTO_XTARR(name,bblk) \
00234 { if( (name)->num == (name)->nall ){ \
00235 (name)->nall += INC_XTARR ; \
00236 (name)->ar = (XtPointer *) \
00237 XtRealloc( (char *) (name)->ar , \
00238 sizeof(XtPointer) * (name)->nall ) ; \
00239 (name)->ic = (int *) XtRealloc( (char *) (name)->ic , \
00240 sizeof(int) * (name)->nall ) ; \
00241 } \
00242 if( (XtPointer) (bblk) != NULL ){ \
00243 (name)->ar[(name)->num] = (XtPointer) (bblk) ; \
00244 (name)->ic[(name)->num] = 0 ; \
00245 ((name)->num)++ ; \
00246 } }
00247
00248
00249
00250 #define XTARR_NUM(name) ((name)->num)
00251
00252
00253
00254 #define XTARR_XT(name,i) ((name)->ar[i])
00255
00256 #define XTARR_IC(name,i) ((name)->ic[i])
00257
00258
00259
00260
00261
00262
00263 #define FREE_XTARR(name) \
00264 if( (name) != NULL ){ \
00265 myXtFree( (name)->ar ) ; \
00266 myXtFree( (name)->ic ) ; \
00267 myXtFree( (name) ) ; \
00268 (name) = NULL ; }
00269
00270
00271 #define DESTROY_XTARR FREE_XTARR
00272
00273
00274
00275
00276
00277 typedef struct {
00278 int num ;
00279 int nall ;
00280 char ** ar ;
00281 KILL_list kl ;
00282 } THD_string_array ;
00283
00284
00285
00286 #define SARR_STRING(ss,qq) ((ss)->ar[(qq)])
00287
00288
00289
00290 #define SARR_NUM(ss) ((ss)->num)
00291
00292 #define INC_SARR 64
00293
00294
00295
00296
00297
00298
00299 #define INIT_SARR(name) \
00300 ( (name) = XtNew(THD_string_array) , \
00301 (name)->num = (name)->nall = 0 , \
00302 (name)->ar = NULL , \
00303 INIT_KILL((name)->kl) )
00304
00305
00306
00307 #define ADDTO_SARR(name,str) \
00308 do{ if( (name)->num == (name)->nall ){ \
00309 (name)->nall += INC_SARR ; \
00310 (name)->ar = (char **) XtRealloc( (char *) (name)->ar , \
00311 sizeof(char *) * (name)->nall ) ; \
00312 } \
00313 if( (str) != NULL ){ \
00314 (name)->ar[(name)->num] = (char *) XtMalloc( strlen((str))+1 ) ;\
00315 strcpy( (name)->ar[(name)->num] , (str) ) ; \
00316 ADDTO_KILL((name)->kl,(name)->ar[(name)->num]) ; \
00317 ((name)->num)++ ; \
00318 } } while(0)
00319
00320
00321
00322 #define REMOVEFROM_SARR(name,ijk) \
00323 do{ SINGLE_KILL((name)->kl,(name)->ar[(ijk)]) ; \
00324 (name)->ar[(ijk)] = NULL ; } while(0)
00325
00326
00327
00328 #define DESTROY_SARR(name) \
00329 do{ if( (name) != NULL ){ \
00330 KILL_KILL((name)->kl) ; \
00331 myXtFree( (name)->ar ) ; \
00332 myXtFree( (name) ) ; } } while(0)
00333
00334 extern int SARR_find_string( THD_string_array * sar , char * str ) ;
00335 extern int SARR_find_substring( THD_string_array * sar , char * sub ) ;
00336
00337 extern int SARR_lookfor_string ( THD_string_array * sar , char * str , int nstart ) ;
00338 extern int SARR_lookfor_substring( THD_string_array * sar , char * sub , int nstart ) ;
00339
00340
00341
00342
00343
00344
00345
00346 #define PATH_CONCAT(pout,p1,p2) \
00347 do{ int zq ; strcpy((pout),(p1)) ; zq = strlen((pout)) ; \
00348 if( (pout)[zq-1] != '/' ) strcat((pout),"/") ; \
00349 strcat((pout),(p2)) ; } while(0)
00350
00351
00352
00353 #undef ALLOW_DATASET_VLIST
00354 #ifdef ALLOW_DATASET_VLIST
00355
00356
00357
00358 typedef struct {
00359 int num ;
00360 int nall ;
00361 THD_fvec3 * xyz ;
00362 THD_ivec3 * ijk ;
00363 struct THD_3dim_dataset * parent ;
00364 } THD_vector_list ;
00365
00366 #define INC_VLIST 64
00367
00368
00369
00370 #define INIT_VLIST(name,ddd) \
00371 ( (name) = XtNew(THD_vector_list) , \
00372 (name)->num = (name)->nall = 0 , \
00373 (name)->xyz = NULL , (name)->ijk = NULL , \
00374 (name)->parent = (ddd) )
00375
00376
00377
00378
00379
00380
00381
00382 #define ADD_FVEC_TO_VLIST(name,vec) \
00383 { if( (name)->num == (name)->nall ){ \
00384 (name)->nall += INC_VLIST ; \
00385 (name)->xyz = (THD_fvec3 * ) XtRealloc( (char *) (name)->xyz , \
00386 sizeof(THD_fvec3) * (name)->nall ) ; \
00387 (name)->ijk = (THD_ivec3 * ) XtRealloc( (char *) (name)->ijk , \
00388 sizeof(THD_ivec3) * (name)->nall ) ; \
00389 } \
00390 (name)->xyz[(name)->num] = (vec); \
00391 (name)->ijk[(name)->num] = THD_3dmm_to_3dind((name)->parent,(vec)) ; \
00392 ((name)->num)++; }
00393
00394
00395
00396
00397
00398
00399
00400 #define ADD_IVEC_TO_VLIST(name,vec) \
00401 { if( (name)->num == (name)->nall ){ \
00402 (name)->nall += INC_VLIST ; \
00403 (name)->xyz = (THD_fvec3 * ) XtRealloc( (char *) (name)->xyz , \
00404 sizeof(THD_fvec3) * (name)->nall ) ; \
00405 (name)->ijk = (THD_ivec3 * ) XtRealloc( (char *) (name)->ijk , \
00406 sizeof(THD_ivec3) * (name)->nall ) ; \
00407 } \
00408 (name)->ijk[(name)->num] = (vec); \
00409 (name)->xyz[(name)->num] = THD_3dind_to_3dmm((name)->parent,(vec)) ; \
00410 ((name)->num)++; }
00411
00412
00413
00414 #define DESTROY_VLIST(name) \
00415 { if( (name) != NULL ){ \
00416 myXtFree( (name)->xyz ) ; \
00417 myXtFree( (name)->ijk ) ; \
00418 myXtFree( (name) ) ; } }
00419
00420 #endif
00421
00422
00423
00424
00425
00426 #define ATR_STRING_TYPE 0
00427 #define ATR_FLOAT_TYPE 1
00428 #define ATR_INT_TYPE 2
00429
00430 #define FIRST_ATR_TYPE 0
00431 #define LAST_ATR_TYPE 2
00432
00433
00434
00435 static char * ATR_typestr[] = {
00436 "string-attribute" , "float-attribute" , "integer-attribute"
00437 } ;
00438
00439
00440
00441 typedef struct {
00442 int type ;
00443 char * name ;
00444 int nin ;
00445 int * in ;
00446 } ATR_int ;
00447
00448
00449
00450 typedef struct {
00451 int type ;
00452 char * name ;
00453 int nfl ;
00454 float * fl ;
00455 } ATR_float ;
00456
00457
00458
00459 typedef struct {
00460 int type ;
00461 char * name ;
00462 int nch ;
00463 char * ch ;
00464 } ATR_string ;
00465
00466 #define ZBLOCK 126
00467 extern void THD_zblock(int,char *) ;
00468 extern void THD_unzblock(int,char *) ;
00469
00470
00471
00472 typedef union {
00473 int type ;
00474 ATR_string str_atr ;
00475 ATR_float flo_atr ;
00476 ATR_int int_atr ;
00477 } ATR_any ;
00478
00479
00480
00481
00482 #define MAPPING_LINEAR_TYPE 0
00483 #define MAPPING_LINEAR_STR "LINEAR_MAPPING"
00484
00485 #define FIRST_MAPPING_TYPE 0
00486 #define LAST_MAPPING_TYPE 0
00487
00488 static char * MAPPING_typestr[] = {
00489 MAPPING_LINEAR_STR
00490 } ;
00491
00492
00493
00494 typedef struct {
00495 int type ;
00496
00497 THD_mat33 mfor ;
00498 THD_mat33 mbac ;
00499
00500 THD_fvec3 bvec;
00501 THD_fvec3 svec;
00502 THD_fvec3 bot ;
00503 THD_fvec3 top ;
00504 } THD_linear_mapping ;
00505
00506
00507
00508 #define COPY_LMAP_BOUNDS(m1,m2) ( (m1).bot=(m2).bot , (m1).top=(m2).top )
00509
00510
00511
00512
00513 #define LOAD_INVERSE_LMAP(map) \
00514 ( (map).mbac = MAT_INV((map).mfor) , \
00515 (map).svec = MATVEC((map).mbac,(map).bvec) ,\
00516 NEGATE_FVEC3((map).svec) )
00517
00518 #define MAPPING_LINEAR_FSTART XtOffsetOf(THD_linear_mapping,mfor)
00519 #define MAPPING_LINEAR_FEND (XtOffsetOf(THD_linear_mapping,top)+sizeof(THD_fvec3))
00520 #define MAPPING_LINEAR_FSIZE ((MAPPING_LINEAR_FEND-MAPPING_LINEAR_FSTART)/sizeof(float))
00521
00522
00523
00524 #define DUMP_LMAP(m) \
00525 ( printf("THD_linear_mapping:\n") , \
00526 printf(" mfor = %8.4f %8.4f %8.4f\n", \
00527 (m).mfor.mat[0][0], (m).mfor.mat[0][1], (m).mfor.mat[0][2] ) , \
00528 printf(" %8.4f %8.4f %8.4f\n", \
00529 (m).mfor.mat[1][0], (m).mfor.mat[1][1], (m).mfor.mat[1][2] ) , \
00530 printf(" %8.4f %8.4f %8.4f\n", \
00531 (m).mfor.mat[2][0], (m).mfor.mat[2][1], (m).mfor.mat[2][2] ) , \
00532 printf(" mbac = %8.4f %8.4f %8.4f\n", \
00533 (m).mbac.mat[0][0], (m).mbac.mat[0][1], (m).mbac.mat[0][2] ) , \
00534 printf(" %8.4f %8.4f %8.4f\n", \
00535 (m).mbac.mat[1][0], (m).mbac.mat[1][1], (m).mbac.mat[1][2] ) , \
00536 printf(" %8.4f %8.4f %8.4f\n", \
00537 (m).mbac.mat[2][0], (m).mbac.mat[2][1], (m).mbac.mat[2][2] ) , \
00538 printf(" bvec = %8.4f %8.4f %8.4f\n", \
00539 (m).bvec.xyz[0] , (m).bvec.xyz[1] , (m).bvec.xyz[2] ) , \
00540 printf(" svec = %8.4f %8.4f %8.4f\n", \
00541 (m).svec.xyz[0] , (m).svec.xyz[1] , (m).svec.xyz[2] ) , \
00542 printf(" bot = %8.4f %8.4f %8.4f\n", \
00543 (m).bot.xyz[0] , (m).bot.xyz[1] , (m).bot.xyz[2] ) , \
00544 printf(" top = %8.4f %8.4f %8.4f\n\n", \
00545 (m).top.xyz[0] , (m).top.xyz[1] , (m).top.xyz[2] ) )
00546
00547
00548
00549
00550 #define MARKS_MAXNUM 10
00551 #define MARKS_MAXLAB 20
00552 #define MARKS_MAXHELP 256
00553 #define MARKS_MAXFLAG 8
00554
00555
00556
00557 typedef struct {
00558 int numdef ;
00559 int numset ;
00560
00561 char label[MARKS_MAXNUM][MARKS_MAXLAB] ;
00562
00563 char help[MARKS_MAXNUM][MARKS_MAXHELP] ;
00564
00565 int ovcolor[MARKS_MAXNUM] ;
00566
00567 Boolean valid[MARKS_MAXNUM] ;
00568
00569 float xyz[MARKS_MAXNUM][3] ;
00570
00571 int aflags[MARKS_MAXFLAG] ;
00572
00573 int type ;
00574 char name[MARKS_MAXLAB] ;
00575 } THD_marker_set ;
00576
00577 #define MARKS_FSIZE (MARKS_MAXNUM*3)
00578 #define MARKS_FSTART XtOffsetOf(THD_marker_set,xyz)
00579
00580 #define MARKS_LSIZE (MARKS_MAXNUM*MARKS_MAXLAB)
00581 #define MARKS_LSTART XtOffsetOf(THD_marker_set,label)
00582
00583 #define MARKS_HSIZE (MARKS_MAXNUM*MARKS_MAXHELP)
00584 #define MARKS_HSTART XtOffsetOf(THD_marker_set,help)
00585
00586 #define MARKS_ASIZE MARKS_MAXFLAG
00587 #define MARKS_ASTART XtOffsetOf(THD_marker_set,aflags)
00588
00589
00590
00591 #define MARKSET_ALIGN 1
00592 #define MARKSET_BOUNDING 2
00593
00594 #define MARKACTION_NONE 0
00595 #define MARKACTION_WARP 1
00596 #define MARKACTION_REGISTER 2
00597
00598
00599
00600
00601
00602 #define NMARK_ALIGN 5
00603
00604 static int THD_align_aflags[MARKS_MAXFLAG] = {
00605 MARKSET_ALIGN , MARKACTION_WARP
00606 } ;
00607
00608 #define IMARK_ACSE 0
00609 #define IMARK_ACPM 1
00610 #define IMARK_PCIE 2
00611 #define IMARK_MSA1 3
00612 #define IMARK_MSA2 4
00613
00614
00615
00616 static char * THD_align_label[NMARK_ALIGN] = {
00617 "AC superior edge" ,
00618 "AC posterior margin" ,
00619 "PC inferior edge" ,
00620 "First mid-sag pt" ,
00621 "Another mid-sag pt"
00622 } ;
00623
00624
00625
00626 static char * THD_align_help[NMARK_ALIGN] = {
00627 "This is the uppermost point\n"
00628 "on the anterior commisure,\n"
00629 "in the mid-sagittal plane." ,
00630
00631 "This is the rearmost point\n"
00632 "on the anterior commisure,\n"
00633 "in the mid-sagittal plane.\n"
00634 "[Just a couple mm behind and\n"
00635 " below the AC superior edge.]" ,
00636
00637 "This is the bottommost point\n"
00638 "on the posterior commissure,\n"
00639 "in the mid-sagittal plane." ,
00640
00641 "You must also specify two other points in the\n"
00642 "mid-sagittal plane, ABOVE the corpus callosum\n"
00643 "(i.e., in the longitudinal fissure). These\n"
00644 "points are needed to define the vertical plane." ,
00645
00646 "You must also specify two other points in the\n"
00647 "mid-sagittal plane, ABOVE the corpus callosum\n"
00648 "(i.e., in the longitudinal fissure). These\n"
00649 "points are needed to define the vertical plane." ,
00650
00651 } ;
00652
00653
00654
00655
00656
00657 #define NMARK_BOUNDING 6
00658
00659 static int THD_bounding_aflags[MARKS_MAXFLAG] = {
00660 MARKSET_BOUNDING , MARKACTION_WARP
00661 } ;
00662
00663 #define IMARK_MANT 0
00664 #define IMARK_MPOS 1
00665 #define IMARK_MSUP 2
00666 #define IMARK_MINF 3
00667 #define IMARK_MLEF 4
00668 #define IMARK_MRIG 5
00669
00670
00671
00672
00673 #define ATLAS_FRONT_TO_AC 70.0
00674 #define ATLAS_AC_TO_PC 23.0
00675 #define ATLAS_PC_TO_BACK 79.0
00676
00677 #define ATLAS_BOT_TO_AC 42.0
00678 #define ATLAS_AC_TO_TOP 74.0
00679 #define ATLAS_AC_TO_LAT 68.0
00680
00681 #define ATLAS_BBOX_LAT 80.0
00682 #define ATLAS_BBOX_ANT 80.0
00683 #define ATLAS_BBOX_POS 110.0
00684 #define ATLAS_BBOX_INF 55.0
00685 #define ATLAS_BBOX_SUP 85.0
00686
00687 #define ATLAS_BBOX_INF_NEW 65.0
00688
00689 #define ATLAS_ALIGNBOX_LAT 95.0
00690 #define ATLAS_ALIGNBOX_ANT 95.0
00691 #define ATLAS_ALIGNBOX_POS 140.0
00692 #define ATLAS_ALIGNBOX_SUP 100.0
00693 #define ATLAS_ALIGNBOX_INF 70.0
00694
00695 #define MAX_ALLOWED_DEVIATION 2.0
00696 #define MIN_ALLOWED_DEVIATION 0.5
00697
00698
00699
00700 static char * THD_bounding_label[NMARK_BOUNDING] = {
00701 "Most anterior point" ,
00702 "Most posterior point" ,
00703 "Most superior point" ,
00704 "Most inferior point" ,
00705 "Most left point" ,
00706 "Most right point"
00707 } ;
00708
00709
00710
00711 static char * THD_bounding_help[NMARK_BOUNDING] = {
00712 "The frontmost point of the frontal cortex;\n"
00713 "needed for brain length [atlas y = -70 mm]" ,
00714
00715 "The hindmost point of the occipital cortex;\n"
00716 "needed for brain length [atlas y = +102 mm]" ,
00717
00718 "The topmost point of the parietal cortex;\n"
00719 "needed for brain height [atlas z = +74 mm]" ,
00720
00721 "The lowest point of the temporal cortex;\n"
00722 "needed for brain height [atlas z = -42 mm]" ,
00723
00724 "The most lateral (left) point of the parietotemporal cortex;\n"
00725 "needed for brain width [atlas x = +68 mm]" ,
00726
00727 "The most lateral (right) point of the parietotemporal cortex;\n"
00728 "needed for brain width [atlas x = -68 mm]"
00729
00730 } ;
00731
00732
00733
00734
00735 #define WARP_AFFINE_TYPE 0
00736 #define WARP_AFFINE_STR "WARP_AFFINE"
00737
00738 #define WARP_TALAIRACH_12_TYPE 1
00739 #define WARP_TALAIRACH_12_STR "WARP_TALAIRACH_12"
00740
00741 #define FIRST_WARP_TYPE 0
00742 #define LAST_WARP_TYPE 1
00743
00744 static char * WARP_typestr[] = {
00745 WARP_AFFINE_STR , WARP_TALAIRACH_12_STR
00746 } ;
00747
00748
00749
00750 #define RESAM_NN_TYPE 0
00751 #define RESAM_NN_STR "Nearest Neighbor"
00752
00753 #define RESAM_LINEAR_TYPE 1
00754 #define RESAM_LINEAR_STR "Linear Interpolation"
00755
00756 #define RESAM_CUBIC_TYPE 2
00757 #define RESAM_CUBIC_STR "Cubic Interpolation"
00758
00759 #define RESAM_BLOCK_TYPE 3
00760 #define RESAM_BLOCK_STR "Blocky Interpolation"
00761
00762 #define FIRST_RESAM_TYPE 0
00763 #define LAST_RESAM_TYPE 3
00764
00765 static char * RESAM_typestr[] = {
00766 RESAM_NN_STR , RESAM_LINEAR_STR , RESAM_CUBIC_STR , RESAM_BLOCK_STR
00767 } ;
00768
00769 #define NSTR_SHORT_RESAM 2
00770 static char * RESAM_shortstr[] = { "NN" , "Li" , "Cu" , "Bk" } ;
00771
00772
00773
00774 typedef struct {
00775 int type ;
00776 int resam_type ;
00777
00778 THD_linear_mapping warp[12] ;
00779 } THD_talairach_12_warp ;
00780
00781 #define W_RAS 0
00782 #define W_LAS 1
00783 #define W_RMS 2
00784 #define W_LMS 3
00785 #define W_RPS 4
00786 #define W_LPS 5
00787 #define W_RAI 6
00788 #define W_LAI 7
00789 #define W_RMI 8
00790 #define W_LMI 9
00791 #define W_RPI 10
00792 #define W_LPI 11
00793
00794 #define WARP_TALAIRACH_12_SIZE (12*MAPPING_LINEAR_FSIZE)
00795
00796
00797
00798 #define DUMP_T12_MAP(t12,xx,yy,zz) \
00799 ( printf("\n--- submap " # xx # yy # zz "\n" ) , \
00800 DUMP_LMAP( (t12).warp[W_ ## xx ## yy ## zz] ) )
00801
00802
00803
00804 #define DUMP_T12_WARP(t12) \
00805 ( printf("\n12 region Talairach warp:") , \
00806 DUMP_T12_MAP((t12),R,A,S) , DUMP_T12_MAP((t12),L,A,S) , \
00807 DUMP_T12_MAP((t12),R,M,S) , DUMP_T12_MAP((t12),L,M,S) , \
00808 DUMP_T12_MAP((t12),R,P,S) , DUMP_T12_MAP((t12),L,P,S) , \
00809 DUMP_T12_MAP((t12),R,A,I) , DUMP_T12_MAP((t12),L,A,I) , \
00810 DUMP_T12_MAP((t12),R,M,I) , DUMP_T12_MAP((t12),L,M,I) , \
00811 DUMP_T12_MAP((t12),R,P,I) , DUMP_T12_MAP((t12),L,P,I) )
00812
00813
00814
00815 typedef struct {
00816 int type ;
00817 int resam_type ;
00818
00819 THD_linear_mapping warp ;
00820 } THD_affine_warp ;
00821
00822 #define WARP_AFFINE_SIZE (MAPPING_LINEAR_FSIZE)
00823
00824
00825
00826 typedef union {
00827 int type ;
00828 THD_affine_warp rig_bod ;
00829 THD_talairach_12_warp tal_12 ;
00830 } THD_warp ;
00831
00832
00833
00834 #define ISVALID_WARP(ww) ( (ww) != NULL && \
00835 (ww)->type >= FIRST_WARP_TYPE && \
00836 (ww)->type <= LAST_WARP_TYPE )
00837
00838
00839
00840 static THD_warp tempA_warp ;
00841
00842
00843
00844 #define IDENTITY_WARP \
00845 ( tempA_warp.rig_bod.type = WARP_AFFINE_TYPE , \
00846 tempA_warp.rig_bod.resam_type = RESAM_NN_TYPE , \
00847 tempA_warp.rig_bod.warp.type = MAPPING_LINEAR_TYPE , \
00848 LOAD_DIAG_MAT( tempA_warp.rig_bod.warp.mfor , 1, 1, 1 ) ,\
00849 LOAD_DIAG_MAT( tempA_warp.rig_bod.warp.mbac , 1, 1, 1 ) ,\
00850 LOAD_FVEC3( tempA_warp.rig_bod.warp.bvec , 0, 0, 0 ) ,\
00851 LOAD_FVEC3( tempA_warp.rig_bod.warp.svec , 0, 0, 0 ) ,\
00852 LOAD_FVEC3( tempA_warp.rig_bod.warp.bot , -9999,-9999,-9999 ) ,\
00853 LOAD_FVEC3( tempA_warp.rig_bod.warp.top , 9999, 9999, 9999 ) ,\
00854 tempA_warp )
00855
00856
00857
00858 #define ROTGEN_WARP(th,ff,aa,bb) \
00859 ( tempA_warp.rig_bod.type = WARP_AFFINE_TYPE , \
00860 tempA_warp.rig_bod.resam_type = RESAM_NN_TYPE , \
00861 tempA_warp.rig_bod.warp.type = MAPPING_LINEAR_TYPE , \
00862 LOAD_ROTGEN_MAT(tempA_warp.rig_bod.warp.mfor, th,ff,aa,bb) , \
00863 LOAD_ROTGEN_MAT(tempA_warp.rig_bod.warp.mbac,-th,ff,aa,bb) , \
00864 LOAD_FVEC3( tempA_warp.rig_bod.warp.bvec, 0, 0, 0 ) ,\
00865 LOAD_FVEC3( tempA_warp.rig_bod.warp.svec, 0, 0, 0 ) ,\
00866 LOAD_FVEC3( tempA_warp.rig_bod.warp.bot , -9999,-9999,-9999 ) ,\
00867 LOAD_FVEC3( tempA_warp.rig_bod.warp.top , 9999, 9999, 9999 ) ,\
00868 tempA_warp )
00869
00870 #define ROTX_WARP(th) ROTGEN_WARP(th,0,1,2)
00871 #define ROTY_WARP(th) ROTGEN_WARP(th,1,2,0)
00872 #define ROTZ_WARP(th) ROTGEN_WARP(th,2,0,1)
00873
00874
00875
00876 #define CEN_WARP(ww,xin,yin,zin,xout,yout,zout) \
00877 do{ THD_fvec3 tv , uv ; \
00878 LOAD_FVEC3(tv,xin,yin,zin) ; \
00879 uv = MATVEC((ww).rig_bod.warp.mfor,tv) ; \
00880 LOAD_FVEC3(tv,xout,yout,zout) ; \
00881 (ww).rig_bod.warp.bvec = SUB_FVEC3(uv,tv) ; \
00882 (ww).rig_bod.warp.svec = \
00883 MATVEC((ww).rig_bod.warp.mbac,(ww).rig_bod.warp.bvec) ; \
00884 NEGATE_FVEC3((ww).rig_bod.warp.svec) ; \
00885 } while(0)
00886
00887
00888
00889
00890 #define DISKPTR_TYPE 47
00891
00892 #define THD_MAX_RANK 3
00893 #define THD_MIN_RANK 3
00894 #define THD_MAX_RANK_EVER 5
00895
00896
00897
00898 #define DATASET_HEADER_SUFFIX "HEAD"
00899 #define DATASET_BRICK_SUFFIX "BRIK"
00900 #define DATASET_NOTES_SUFFIX "NOTE"
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913 #define STORAGE_UNDEFINED 0
00914 #define STORAGE_BY_BRICK 2
00915 #define STORAGE_BY_MINC 3
00916 #define STORAGE_BY_VOLUMES 4
00917 #define STORAGE_BY_ANALYZE 5
00918 #define STORAGE_BY_CTFMRI 6
00919 #define STORAGE_BY_CTFSAM 7
00920 #define STORAGE_BY_1D 8
00921 #define STORAGE_BY_3D 9
00922 #define STORAGE_BY_NIFTI 10
00923 #define STORAGE_BY_MPEG 11
00924
00925 #define LAST_STORAGE_MODE 11
00926
00927
00928
00929
00930
00931
00932
00933 typedef struct {
00934 int type ;
00935 int rank ;
00936 int nvals ;
00937 int dimsizes[THD_MAX_RANK] ;
00938 int storage_mode ;
00939
00940 int byte_order ;
00941
00942 char prefix[THD_MAX_PREFIX] ;
00943 char viewcode[THD_MAX_VIEWCODE] ;
00944 char filecode[THD_MAX_FILECODE] ;
00945
00946 char directory_name[THD_MAX_NAME] ;
00947 char header_name[THD_MAX_NAME] ;
00948 char brick_name[THD_MAX_NAME] ;
00949 } THD_diskptr ;
00950
00951 #define ATRNAME_BYTEORDER "BYTEORDER_STRING"
00952
00953 extern void THD_delete_diskptr( THD_diskptr * ) ;
00954
00955
00956
00957 #define ISVALID_DISKPTR(dk) ( (dk)!=NULL && (dk)->type==DISKPTR_TYPE )
00958
00959
00960
00961 #define PREFIX_VIEW_TO_FILECODE(pr,vv,fc) sprintf( (fc),"%s+%s",(pr),(vv) )
00962
00963
00964
00965
00966
00967
00968
00969
00970 #define FILECODE_TO_PREFIX(fc,pr) \
00971 do{ char *qq , *ff , *pp ; \
00972 if( strstr((fc),"+") == NULL ){ \
00973 (pr)[0] = '\0' ; \
00974 } else { \
00975 for( qq=fc+strlen((fc)) ; *qq != '+' ; qq-- ) ; \
00976 for( ff=(fc) , (pp)=(pr) ; ff < qq ; ff++,pp++ ) *pp = *ff ; \
00977 *pp = '\0' ; } break ; } while(1)
00978
00979 #if 0
00980 #define FILECODE_TO_PREFIX(fc,pr) \
00981 do{ char *qq , *ff , *pp ; \
00982 if( (qq=strstr((fc),"+")) == NULL ){ \
00983 (pr)[0] = '\0' ; \
00984 } else { \
00985 for( ff=(fc) , (pp)=(pr) ; ff < qq ; ff++,pp++ ) *pp = *ff ; \
00986 *pp = '\0' ; } break ; } while(1)
00987 #endif
00988
00989
00990
00991 #define FILENAME_TO_PREFIX(fn,pr) \
00992 do{ int ii ; \
00993 for( ii=strlen((fn)) ; ii >= 0 ; ii-- ) \
00994 if( (fn)[ii] == '/' ) break ; \
00995 FILECODE_TO_PREFIX( (fn)+(ii+1) , (pr) ) ; break ; } while(1)
00996
00997
00998
00999
01000 #define DATABLOCK_TYPE 37
01001
01002 #define DATABLOCK_MEM_UNDEFINED 1
01003 #define DATABLOCK_MEM_MALLOC 2
01004 #define DATABLOCK_MEM_MMAP 4
01005 #define DATABLOCK_MEM_ANY (DATABLOCK_MEM_MALLOC | DATABLOCK_MEM_MMAP)
01006 #define DATABLOCK_MEM_SHARED 8
01007
01008
01009
01010 #define ISVALID_MEM_CODE(mm) \
01011 ( (mm) == DATABLOCK_MEM_MALLOC || (mm) == DATABLOCK_MEM_MMAP \
01012 || (mm) == DATABLOCK_MEM_ANY \
01013 || (mm) == DATABLOCK_MEM_SHARED )
01014
01015 #ifndef MMAP_THRESHOLD
01016
01017 # define MMAP_THRESHOLD 999999
01018 #endif
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031 typedef struct {
01032 int type ;
01033
01034 int nvals ;
01035
01036 MRI_IMARR * brick ;
01037 float * brick_fac ;
01038 int * brick_bytes ;
01039
01040
01041
01042 char ** brick_lab ;
01043 char ** brick_keywords ;
01044 int * brick_statcode ;
01045 float ** brick_stataux ;
01046
01047 int64_t total_bytes ;
01048 int malloc_type ;
01049 int locked ;
01050
01051
01052 int master_nvals ;
01053 int * master_ival ;
01054 int * master_bytes ;
01055
01056 float master_bot ;
01057 float master_top ;
01058
01059 THD_diskptr * diskptr ;
01060
01061 int natr ;
01062 int natr_alloc ;
01063 ATR_any * atr ;
01064
01065
01066
01067 KILL_list kl ;
01068 XtPointer parent ;
01069
01070 char shm_idcode[32] ;
01071 int shm_idint ;
01072 } THD_datablock ;
01073
01074
01075
01076 #define DBLK_mallocize(db) THD_force_malloc_type((db),DATABLOCK_MEM_MALLOC)
01077
01078
01079
01080 #define DBLK_mmapize(db) THD_force_malloc_type((db),DATABLOCK_MEM_MMAP)
01081
01082
01083
01084 #define DBLK_anyize(db) THD_force_malloc_type((db),DATABLOCK_MEM_ANY)
01085
01086
01087
01088 #define DBLK_IS_MALLOC(db) ((db)->malloc_type == DATABLOCK_MEM_MALLOC)
01089
01090
01091
01092 #define DBLK_IS_MMAP(db) ((db)->malloc_type == DATABLOCK_MEM_MMAP)
01093
01094
01095
01096 #define DBLK_IS_SHARED(db) ((db)->malloc_type == DATABLOCK_MEM_SHARED)
01097
01098
01099
01100 #define DBLK_shareize(db) THD_force_malloc_type((db),DATABLOCK_MEM_SHARED)
01101
01102
01103
01104 #define DBLK_lock(db) ((db)->locked = 1)
01105
01106
01107
01108 #define DBLK_unlock(db) ((db)->locked = ((db)->locked<2) ? 0 : 2)
01109
01110
01111
01112 #define DBLK_LOCKED(db) ((db)->locked)
01113
01114
01115 #define DBLK_superlock(db) ((db)->locked = 2)
01116
01117
01118
01119 #define DBLK_IS_MASTERED(db) \
01120 ((db)->master_nvals > 0 && (db)->master_ival != NULL && (db)->master_bytes != NULL)
01121
01122 extern void THD_delete_datablock ( THD_datablock * ) ;
01123 extern void THD_init_datablock_brick ( THD_datablock * , int , void * ) ;
01124 extern void THD_init_datablock_labels ( THD_datablock * ) ;
01125 extern void THD_init_datablock_keywords ( THD_datablock * ) ;
01126 extern void THD_copy_datablock_auxdata ( THD_datablock * , THD_datablock * ) ;
01127 extern void THD_init_datablock_stataux ( THD_datablock * ) ;
01128 extern void THD_store_datablock_stataux ( THD_datablock *,int,int,int,float * );
01129 extern void THD_store_datablock_label ( THD_datablock * , int , char * ) ;
01130 extern void THD_store_datablock_keywords ( THD_datablock * , int , char * ) ;
01131 extern void THD_append_datablock_keywords( THD_datablock * , int , char * ) ;
01132 extern int THD_datablock_from_atr ( THD_datablock *, char *, char * ) ;
01133
01134
01135
01136 #define THD_null_datablock_auxdata(blk) ( (blk)->brick_lab = NULL , \
01137 (blk)->brick_keywords = NULL , \
01138 (blk)->brick_statcode = NULL , \
01139 (blk)->brick_stataux = NULL )
01140
01141 extern int THD_string_has( char * , char * ) ;
01142
01143
01144
01145 #define ISVALID_DATABLOCK(bk) ( (bk) != NULL && (bk)->type == DATABLOCK_TYPE )
01146
01147
01148
01149 #define ISVALID_DBLK ISVALID_DATABLOCK
01150
01151
01152
01153
01154
01155 typedef struct {
01156 int num ;
01157 int nall ;
01158 THD_datablock ** ar ;
01159 } THD_datablock_array ;
01160
01161 #define INC_DBARR 8
01162
01163
01164
01165 #define INIT_DBARR(name) \
01166 ( (name) = XtNew(THD_datablock_array) ,\
01167 (name)->num = (name)->nall = 0 , \
01168 (name)->ar = NULL )
01169
01170
01171
01172 #define ADDTO_DBARR(name,bblk) \
01173 { if( (name)->num == (name)->nall ){ \
01174 (name)->nall += INC_DBARR ; \
01175 (name)->ar = (THD_datablock **) \
01176 XtRealloc( (char *) (name)->ar , \
01177 sizeof(THD_datablock *) * (name)->nall ) ; \
01178 } \
01179 if( (bblk) != NULL ){ \
01180 (name)->ar[(name)->num] = (bblk) ; \
01181 ((name)->num)++ ; \
01182 } }
01183
01184
01185
01186 #define FREE_DBARR(name) \
01187 if( (name) != NULL ){ \
01188 myXtFree( (name)->ar ) ; \
01189 myXtFree( (name) ) ; }
01190
01191
01192
01193
01194 #define DATAXES_TYPE 27
01195
01196
01197
01198 #define DEFAULT_RESAMPLE_VOX 1.0
01199
01200
01201
01202 #define ORI_R2L_TYPE 0
01203 #define ORI_R2L_STR "Right-to-Left"
01204
01205 #define ORI_L2R_TYPE 1
01206 #define ORI_L2R_STR "Left-to-Right"
01207
01208 #define ORI_P2A_TYPE 2
01209 #define ORI_P2A_STR "Posterior-to-Anterior"
01210
01211 #define ORI_A2P_TYPE 3
01212 #define ORI_A2P_STR "Anterior-to-Posterior"
01213
01214 #define ORI_I2S_TYPE 4
01215 #define ORI_I2S_STR "Inferior-to-Superior"
01216
01217 #define ORI_S2I_TYPE 5
01218 #define ORI_S2I_STR "Superior-to-Inferior"
01219
01220 #define ORI_GEN_TYPE 6
01221 #define ORI_GEN_STR "General"
01222
01223 #define FIRST_ORIENT_TYPE 0
01224 #define LAST_ORIENT_TYPE 5
01225
01226 #define LONGEST_ORIENT_TYPESTR strlen(ORI_P2A_STR)
01227
01228 static char * ORIENT_typestr[] = {
01229 ORI_R2L_STR , ORI_L2R_STR , ORI_P2A_STR ,
01230 ORI_A2P_STR , ORI_I2S_STR , ORI_S2I_STR , ORI_GEN_STR
01231 } ;
01232
01233 static char * ORIENT_shortstr[] = {
01234 "R-L" , "L-R" , "P-A" , "A-P" , "I-S" , "S-I" , "GEN"
01235 } ;
01236
01237 static char * ORIENT_tinystr[] = {
01238 "RL" , "LR" , "PA" , "AP" , "IS" , "SI" , "??"
01239 } ;
01240
01241 static char ORIENT_xyz[] = "xxyyzzg" ;
01242
01243
01244
01245
01246 static char ORIENT_sign[] = "+--++-" ;
01247
01248 static char ORIENT_first[] = "RLPAIS" ;
01249
01250 static int ORIENT_xyzint[] = { 1,1 , 2,2 , 3,3 , 666 } ;
01251
01252 #define ORIENT_OPPOSITE(orc) \
01253 ( ((orc) % 2 == 0) ? ((orc)+1) : ((orc)-1) )
01254
01255
01256
01257
01258
01259 typedef struct {
01260 int type ;
01261
01262 int nxx ;
01263 int nyy ;
01264 int nzz ;
01265
01266 float xxorg ;
01267 float yyorg ;
01268 float zzorg ;
01269 float xxdel ;
01270 float yydel ;
01271 float zzdel ;
01272
01273 float xxmin ;
01274 float xxmax ;
01275 float yymin ;
01276 float yymax ;
01277 float zzmin ;
01278 float zzmax ;
01279
01280 int xxorient ;
01281 int yyorient ;
01282 int zzorient ;
01283
01284 THD_mat33 to_dicomm ;
01285
01286
01287
01288
01289 XtPointer parent ;
01290 } THD_dataxes ;
01291
01292
01293 #define DAXES_XCEN(dax) ((dax)->xxorg + 0.5*((dax)->nxx - 1) * (dax)->xxdel)
01294
01295
01296 #define DAXES_YCEN(dax) ((dax)->yyorg + 0.5*((dax)->nyy - 1) * (dax)->yydel)
01297
01298
01299 #define DAXES_ZCEN(dax) ((dax)->zzorg + 0.5*((dax)->nzz - 1) * (dax)->zzdel)
01300
01301 #if 1
01302 #define DAXES_NUM(dax,ori) \
01303 ( (ORIENT_xyzint[(ori)] == ORIENT_xyzint[(dax)->xxorient]) ? (dax)->nxx : \
01304 (ORIENT_xyzint[(ori)] == ORIENT_xyzint[(dax)->yyorient]) ? (dax)->nyy : \
01305 (ORIENT_xyzint[(ori)] == ORIENT_xyzint[(dax)->zzorient]) ? (dax)->nzz : 0 )
01306 #else
01307 #define DAXES_NUM(dax,ori) ( ( ORIENT_xyzint[(ori)] == 1 ) ? (dax)->nxx : \
01308 ( ORIENT_xyzint[(ori)] == 2 ) ? (dax)->nyy : \
01309 ( ORIENT_xyzint[(ori)] == 3 ) ? (dax)->nzz : 0 )
01310 #endif
01311
01312
01313
01314
01315
01316
01317
01318
01319 #define DATAXES_TO_DISKPTR(ds) \
01320 ( (ds)->dblk->diskptr->dimsizes[0] = (ds)->daxes->nxx , \
01321 (ds)->dblk->diskptr->dimsizes[1] = (ds)->daxes->nyy , \
01322 (ds)->dblk->diskptr->dimsizes[2] = (ds)->daxes->nzz )
01323
01324
01325
01326 #define ISVALID_DATAXES(dax) ( (dax) != NULL && (dax)->type == DATAXES_TYPE )
01327
01328
01329
01330 #define EQUIV_DATAXES(cax,dax) \
01331 ( ISVALID_DATAXES((cax)) && \
01332 ISVALID_DATAXES((dax)) && \
01333 (cax)->nxx == (dax)->nxx && \
01334 (cax)->nyy == (dax)->nyy && \
01335 (cax)->nzz == (dax)->nzz && \
01336 fabs( (cax)->xxorg - (dax)->xxorg ) < 0.01 && \
01337 fabs( (cax)->yyorg - (dax)->yyorg ) < 0.01 && \
01338 fabs( (cax)->zzorg - (dax)->zzorg ) < 0.01 && \
01339 fabs( (cax)->xxdel - (dax)->xxdel ) < 0.001 && \
01340 fabs( (cax)->yydel - (dax)->yydel ) < 0.001 && \
01341 fabs( (cax)->zzdel - (dax)->zzdel ) < 0.001 && \
01342 (cax)->xxorient == (dax)->xxorient && \
01343 (cax)->yyorient == (dax)->yyorient && \
01344 (cax)->zzorient == (dax)->zzorient )
01345
01346 extern void THD_edit_dataxes( float , THD_dataxes * , THD_dataxes * ) ;
01347
01348 int THD_get_axis_direction( THD_dataxes *, int ) ;
01349
01350
01351
01352
01353 #define TIMEAXIS_TYPE 907
01354
01355 #define UNITS_MSEC_TYPE 77001
01356 #define UNITS_SEC_TYPE 77002
01357 #define UNITS_HZ_TYPE 77003
01358
01359 static char * UNITS_TYPE_labelstring[] = { "ms" , "s" , "Hz" } ;
01360
01361
01362
01363 #define UNITS_TYPE_LABEL(uu) UNITS_TYPE_labelstring[(uu)-UNITS_MSEC_TYPE]
01364
01365
01366
01367
01368
01369
01370
01371
01372
01373
01374
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384
01385
01386 typedef struct {
01387 int type ;
01388 int ntt ;
01389 float ttorg ;
01390 float ttdel ;
01391 float ttdur ;
01392
01393 int units_type ;
01394
01395 int nsl ;
01396 float * toff_sl ;
01397 float zorg_sl ;
01398 float dz_sl ;
01399 } THD_timeaxis ;
01400
01401
01402
01403 #define ISVALID_TIMEAXIS(tax) ((tax) != NULL && (tax)->type == TIMEAXIS_TYPE)
01404
01405
01406
01407
01408 #define STATISTICS_TYPE 17
01409
01410
01411
01412
01413
01414 typedef struct {
01415 float min ;
01416 float max ;
01417 } THD_brick_stats ;
01418
01419
01420
01421 typedef struct {
01422 int type ;
01423 int nbstat ;
01424 THD_brick_stats * bstat ;
01425 XtPointer parent ;
01426 } THD_statistics ;
01427
01428
01429
01430 #define ISVALID_STATISTIC(st) ( (st) != NULL && (st)->type == STATISTICS_TYPE )
01431
01432
01433
01434 #define ISVALID_BSTAT(bst) ( (bst).min <= (bst).max )
01435
01436
01437
01438 #define INVALIDATE_BSTAT(bst) ( (bst).min = 1.0 , (bst).max = -1.0 )
01439
01440
01441
01442 #define KILL_STATISTIC(st) \
01443 do{ if( ISVALID_STATISTIC(st) ){ \
01444 XtFree((char *)(st)->bstat) ; XtFree((char *)(st)) ; } } while(0)
01445
01446
01447
01448
01449 #ifndef IDCODE_PREFIX
01450 # define MCW_IDPREFIX "NIH_"
01451 #else
01452 # define MCW_IDPREFIX IDCODE_PREFIX
01453 #endif
01454
01455
01456 #define MCW_IDSIZE 32
01457
01458
01459 #define MCW_IDDATE 48
01460
01461
01462
01463 typedef struct {
01464 char str[MCW_IDSIZE] ;
01465 char date[MCW_IDDATE] ;
01466 } MCW_idcode ;
01467
01468 extern MCW_idcode MCW_new_idcode (void) ;
01469 extern void MCW_hash_idcode( char *, struct THD_3dim_dataset * ) ;
01470
01471
01472
01473 #define EQUIV_IDCODES(id,ie) (strncmp((id).str,(ie).str,MCW_IDSIZE) == 0)
01474
01475
01476
01477 #define EQUIV_DSETS(ds,es) \
01478 ( (ds)==(es) || \
01479 ((ds)!=NULL && (es)!=NULL && EQUIV_IDCODES((ds)->idcode,(es)->idcode)) )
01480
01481
01482
01483 #define DUPLICATE_DSETS(ds,es) \
01484 ( (ds) != (es) && \
01485 (ds) != NULL && \
01486 (es) != NULL && EQUIV_IDCODES((ds)->idcode,(es)->idcode) )
01487
01488
01489
01490 #define ZERO_IDCODE(id) ((id).str[0] = (id).date[0] = '\0')
01491
01492
01493
01494 #define ISZERO_IDCODE(id) ((id).str[0] == '\0')
01495
01496 #define ATRNAME_IDSTRING "IDCODE_STRING"
01497 #define ATRNAME_IDDATE "IDCODE_DATE"
01498 #define ATRNAME_IDANATPAR "IDCODE_ANAT_PARENT"
01499 #define ATRNAME_IDWARPPAR "IDCODE_WARP_PARENT"
01500
01501
01502
01503
01504
01505
01506 typedef struct {
01507 int xxsign , yysign , zzsign ,
01508 first , second , third ,
01509 xxor , yyor , zzor ;
01510 char orcode[4] ;
01511 } THD_coorder ;
01512
01513 extern void THD_coorder_fill( char * , THD_coorder * ) ;
01514 extern void THD_dicom_to_coorder( THD_coorder *, float *, float *, float * ) ;
01515 extern void THD_coorder_to_dicom( THD_coorder *, float *, float *, float * ) ;
01516
01517
01518
01519
01520
01521
01522 #define HEAD_ANAT_TYPE 0
01523 #define HEAD_ANAT_STR "3DIM_HEAD_ANAT"
01524
01525 #define HEAD_FUNC_TYPE 1
01526 #define HEAD_FUNC_STR "3DIM_HEAD_FUNC"
01527
01528 #define GEN_ANAT_TYPE 2
01529 #define GEN_ANAT_STR "3DIM_GEN_ANAT"
01530
01531 #define GEN_FUNC_TYPE 3
01532 #define GEN_FUNC_STR "3DIM_GEN_FUNC"
01533
01534 #define FIRST_3DIM_TYPE 0
01535 #define LAST_3DIM_TYPE 3
01536
01537 #define LONGEST_3DIM_TYPESTR strlen(HEAD_ANAT_STR)
01538
01539 static char * DATASET_typestr[] = {
01540 HEAD_ANAT_STR , HEAD_FUNC_STR , GEN_ANAT_STR , GEN_FUNC_STR
01541 } ;
01542
01543
01544
01545 #define VIEW_ORIGINAL_TYPE 0
01546 #define VIEW_ORIGINAL_STR "Original View"
01547 #define VIEW_ORIGINAL_CODE "orig"
01548
01549 #define VIEW_ACPCALIGNED_TYPE 1
01550 #define VIEW_ACPCALIGNED_STR "AC-PC Aligned"
01551 #define VIEW_ACPCALIGNED_CODE "acpc"
01552
01553 #define VIEW_TALAIRACH_TYPE 2
01554 #define VIEW_TALAIRACH_STR "Talairach View"
01555 #define VIEW_TALAIRACH_CODE "tlrc"
01556
01557 #define VIEW_REGISTERED_TYPE 3
01558 #define VIEW_REGISTERED_STR "Registered View"
01559 #define VIEW_REGISTERED_CODE "rgst"
01560
01561 #define FIRST_VIEW_TYPE 0
01562 #define LAST_VIEW_TYPE 2
01563
01564 #define LONGEST_VIEW_TYPESTR strlen(VIEW_REGISTERED_STR)
01565
01566 static char * VIEW_typestr[] = {
01567 VIEW_ORIGINAL_STR , VIEW_ACPCALIGNED_STR ,
01568 VIEW_TALAIRACH_STR , VIEW_REGISTERED_STR
01569 } ;
01570
01571 static char * VIEW_codestr[] = {
01572 VIEW_ORIGINAL_CODE , VIEW_ACPCALIGNED_CODE ,
01573 VIEW_TALAIRACH_CODE , VIEW_REGISTERED_CODE
01574 } ;
01575
01576
01577
01578 #define FUNC_FIM_TYPE 0
01579 #define FUNC_FIM_STR "Intensity"
01580 #define FUNC_FIM_PREFIX "fim"
01581 #define FUNC_FIM_LABEL "fim"
01582 #define FUNC_FIM_DESCRIPTOR "Functional Intensity"
01583 #define FUNC_FIM_MASK (1 << FUNC_FIM_TYPE)
01584
01585
01586
01587 #define FUNC_PAIR_TYPE 1
01588 #define FUNC_PAIR_STR "Inten+Thr"
01589 #define FUNC_PAIR_PREFIX "fith"
01590
01591 #define FUNC_THR_TYPE FUNC_PAIR_TYPE
01592 #define FUNC_THR_STR FUNC_PAIR_STR
01593 #define FUNC_THR_PREFIX FUNC_PAIR_PREFIX
01594 #define FUNC_THR_TOP 1.0
01595 #define FUNC_THR_SCALE_SHORT 10000
01596 #define FUNC_THR_SCALE_BYTE 100
01597 #define FUNC_THR_LABEL "Thr "
01598 #define FUNC_THR_DESCRIPTOR "Old style threshold"
01599 #define FUNC_THR_MASK (1 << FUNC_PAIR_TYPE)
01600
01601 #define FUNC_COR_TYPE 2
01602 #define FUNC_COR_STR "Inten+Cor"
01603 #define FUNC_COR_PREFIX "fico"
01604 #define FUNC_COR_TOP 1.0
01605 #define FUNC_COR_SCALE_SHORT 10000
01606 #define FUNC_COR_SCALE_BYTE 100
01607 #define FUNC_COR_LABEL "Corr"
01608 #define FUNC_COR_DESCRIPTOR "Correlation Coefficient"
01609 #define FUNC_COR_MASK (1 << FUNC_COR_TYPE)
01610
01611 #define FUNC_TT_TYPE 3
01612 #define FUNC_TT_STR "Inten+Ttest"
01613 #define FUNC_TT_PREFIX "fitt"
01614 #define FUNC_TT_TOP 10.0
01615 #define FUNC_TT_SCALE_SHORT 1000
01616 #define FUNC_TT_SCALE_BYTE 10
01617 #define FUNC_TT_LABEL "T-t "
01618 #define FUNC_TT_DESCRIPTOR "Student t-statistic"
01619 #define FUNC_TT_MASK (1 << FUNC_TT_TYPE)
01620
01621
01622 #define FUNC_FT_TYPE 4
01623 #define FUNC_FT_STR "Inten+Ftest"
01624 #define FUNC_FT_PREFIX "fift"
01625 #define FUNC_FT_TOP 100.0
01626 #define FUNC_FT_SCALE_SHORT 100
01627 #define FUNC_FT_SCALE_BYTE 1
01628 #define FUNC_FT_LABEL "F-t "
01629 #define FUNC_FT_DESCRIPTOR "Fisher F-statistic"
01630 #define FUNC_FT_MASK (1 << FUNC_FT_TYPE)
01631
01632
01633 #define FUNC_ZT_TYPE 5
01634 #define FUNC_ZT_STR "Inten+Ztest"
01635 #define FUNC_ZT_PREFIX "fizt"
01636 #define FUNC_ZT_TOP 10.0
01637 #define FUNC_ZT_SCALE_SHORT 1000
01638 #define FUNC_ZT_SCALE_BYTE 10
01639 #define FUNC_ZT_LABEL "Z-t "
01640 #define FUNC_ZT_DESCRIPTOR "Normal (Gaussian) Z"
01641 #define FUNC_ZT_MASK (1 << FUNC_ZT_TYPE)
01642
01643
01644 #define FUNC_CT_TYPE 6
01645 #define FUNC_CT_STR "Inten+ChiSq"
01646 #define FUNC_CT_PREFIX "fict"
01647 #define FUNC_CT_TOP 100.0
01648 #define FUNC_CT_SCALE_SHORT 100
01649 #define FUNC_CT_SCALE_BYTE 1
01650 #define FUNC_CT_LABEL "ChiS"
01651 #define FUNC_CT_DESCRIPTOR "Chi-Squared statistic"
01652 #define FUNC_CT_MASK (1 << FUNC_CT_TYPE)
01653
01654
01655 #define FUNC_BT_TYPE 7
01656 #define FUNC_BT_STR "Inten+Beta"
01657 #define FUNC_BT_PREFIX "fibt"
01658 #define FUNC_BT_TOP 1.0
01659 #define FUNC_BT_SCALE_SHORT 10000
01660 #define FUNC_BT_SCALE_BYTE 100
01661 #define FUNC_BT_LABEL "Beta"
01662 #define FUNC_BT_DESCRIPTOR "Beta Distribution"
01663 #define FUNC_BT_MASK (1 << FUNC_BT_TYPE)
01664
01665
01666 #define FUNC_BN_TYPE 8
01667 #define FUNC_BN_STR "Inten+Binom"
01668 #define FUNC_BN_PREFIX "fibn"
01669 #define FUNC_BN_TOP 100.0
01670 #define FUNC_BN_SCALE_SHORT 100
01671 #define FUNC_BN_SCALE_BYTE 1
01672 #define FUNC_BN_LABEL "Bino"
01673 #define FUNC_BN_DESCRIPTOR "Binomial Distribution"
01674 #define FUNC_BN_MASK (1 << FUNC_BN_TYPE)
01675
01676
01677 #define FUNC_GT_TYPE 9
01678 #define FUNC_GT_STR "Inten+Gamma"
01679 #define FUNC_GT_PREFIX "figt"
01680 #define FUNC_GT_TOP 10.0
01681 #define FUNC_GT_SCALE_SHORT 1000
01682 #define FUNC_GT_SCALE_BYTE 10
01683 #define FUNC_GT_LABEL "Gam "
01684 #define FUNC_GT_DESCRIPTOR "Gamma Distribution"
01685 #define FUNC_GT_MASK (1 << FUNC_GT_TYPE)
01686
01687
01688 #define FUNC_PT_TYPE 10
01689 #define FUNC_PT_STR "Inten+Poisson"
01690 #define FUNC_PT_PREFIX "fipt"
01691 #define FUNC_PT_TOP 100.0
01692 #define FUNC_PT_SCALE_SHORT 100
01693 #define FUNC_PT_SCALE_BYTE 1
01694 #define FUNC_PT_LABEL "Pois"
01695 #define FUNC_PT_DESCRIPTOR "Poisson Distribution"
01696 #define FUNC_PT_MASK (1 << FUNC_PT_TYPE)
01697
01698
01699 #define FUNC_BUCK_TYPE 11
01700 #define FUNC_BUCK_STR "Func-Bucket"
01701 #define FUNC_BUCK_PREFIX "fbuc"
01702 #define FUNC_BUCK_TOP 1.0
01703 #define FUNC_BUCK_SCALE_SHORT 1
01704 #define FUNC_BUCK_SCALE_BYTE 1
01705 #define FUNC_BUCK_LABEL "Buck"
01706 #define FUNC_BUCK_DESCRIPTOR "Function Bucket"
01707 #define FUNC_BUCK_MASK (1 << FUNC_BUCK_TYPE)
01708
01709 #define FIRST_FUNC_TYPE 0
01710 #define LAST_FUNC_TYPE 11
01711
01712 #define FIRST_STAT_TYPE 2
01713 #define LAST_STAT_TYPE 10
01714
01715 #define FUNC_ALL_MASK (FUNC_FIM_MASK | FUNC_THR_MASK | \
01716 FUNC_COR_MASK | FUNC_TT_MASK | FUNC_FT_MASK | \
01717 FUNC_ZT_MASK | FUNC_CT_MASK | FUNC_BT_MASK | \
01718 FUNC_BN_MASK | FUNC_GT_MASK | FUNC_PT_MASK | \
01719 FUNC_BUCK_MASK )
01720
01721 #define LONGEST_FUNC_TYPESTR strlen(FUNC_PT_STR)
01722
01723 static char * FUNC_typestr[] = {
01724 FUNC_FIM_STR , FUNC_THR_STR , FUNC_COR_STR , FUNC_TT_STR , FUNC_FT_STR ,
01725 FUNC_ZT_STR , FUNC_CT_STR , FUNC_BT_STR ,
01726 FUNC_BN_STR , FUNC_GT_STR , FUNC_PT_STR , FUNC_BUCK_STR
01727 } ;
01728
01729 static char * FUNC_prefixstr[] = {
01730 FUNC_FIM_PREFIX , FUNC_THR_PREFIX , FUNC_COR_PREFIX ,
01731 FUNC_TT_PREFIX , FUNC_FT_PREFIX ,
01732 FUNC_ZT_PREFIX , FUNC_CT_PREFIX , FUNC_BT_PREFIX ,
01733 FUNC_BN_PREFIX , FUNC_GT_PREFIX , FUNC_PT_PREFIX , FUNC_BUCK_PREFIX
01734 } ;
01735
01736 static float FUNC_topval[] = {
01737 1.0 , FUNC_THR_TOP , FUNC_COR_TOP , FUNC_TT_TOP , FUNC_FT_TOP ,
01738 FUNC_ZT_TOP , FUNC_CT_TOP , FUNC_BT_TOP ,
01739 FUNC_BN_TOP , FUNC_GT_TOP , FUNC_PT_TOP , FUNC_BUCK_TOP
01740 } ;
01741
01742 static int FUNC_scale_short[] = {
01743 1 , FUNC_THR_SCALE_SHORT , FUNC_COR_SCALE_SHORT ,
01744 FUNC_TT_SCALE_SHORT , FUNC_FT_SCALE_SHORT ,
01745 FUNC_ZT_SCALE_SHORT , FUNC_CT_SCALE_SHORT , FUNC_BT_SCALE_SHORT ,
01746 FUNC_BN_SCALE_SHORT , FUNC_GT_SCALE_SHORT , FUNC_PT_SCALE_SHORT ,
01747 FUNC_BUCK_SCALE_SHORT
01748 } ;
01749
01750 static int FUNC_scale_byte[] = {
01751 1 , FUNC_THR_SCALE_BYTE , FUNC_COR_SCALE_BYTE ,
01752 FUNC_TT_SCALE_BYTE , FUNC_FT_SCALE_BYTE ,
01753 FUNC_ZT_SCALE_BYTE , FUNC_CT_SCALE_BYTE , FUNC_BT_SCALE_BYTE ,
01754 FUNC_BN_SCALE_BYTE , FUNC_GT_SCALE_BYTE , FUNC_PT_SCALE_BYTE ,
01755 FUNC_BUCK_SCALE_BYTE
01756 } ;
01757
01758 static char * FUNC_label[] = {
01759 FUNC_FIM_LABEL , FUNC_THR_LABEL , FUNC_COR_LABEL , FUNC_TT_LABEL , FUNC_FT_LABEL ,
01760 FUNC_ZT_LABEL , FUNC_CT_LABEL , FUNC_BT_LABEL ,
01761 FUNC_BN_LABEL , FUNC_GT_LABEL , FUNC_PT_LABEL , FUNC_BUCK_LABEL
01762 } ;
01763
01764 static char * FUNC_descriptor[] = {
01765 FUNC_FIM_DESCRIPTOR , FUNC_THR_DESCRIPTOR ,
01766 FUNC_COR_DESCRIPTOR , FUNC_TT_DESCRIPTOR , FUNC_FT_DESCRIPTOR ,
01767 FUNC_ZT_DESCRIPTOR , FUNC_CT_DESCRIPTOR , FUNC_BT_DESCRIPTOR ,
01768 FUNC_BN_DESCRIPTOR , FUNC_GT_DESCRIPTOR , FUNC_PT_DESCRIPTOR ,
01769 FUNC_BUCK_DESCRIPTOR
01770 } ;
01771
01772 #define AFNI_FIRST_STATCODE FUNC_COR_TYPE
01773 #define AFNI_LAST_STATCODE FUNC_PT_TYPE
01774
01775 static int FUNC_nvals[] = { 1, 2,2,2,2,2,2,2,2,2,2, 1 } ;
01776 static int FUNC_ival_fim[] = { 0, 0,0,0,0,0,0,0,0,0,0, 0 } ;
01777
01778 #define FIMTHR 0
01779
01780 static int FUNC_ival_thr[] = { FIMTHR, 1,1,1,1,1,1,1,1,1,1, 0 } ;
01781
01782 #define FUNC_HAVE_FIM(ftyp) ((ftyp) >= 0 && \
01783 (ftyp) <= LAST_FUNC_TYPE && FUNC_ival_fim[(ftyp)] >= 0)
01784
01785 #define FUNC_HAVE_THR(ftyp) ((ftyp) >= 0 && \
01786 (ftyp) <= LAST_FUNC_TYPE && FUNC_ival_thr[(ftyp)] >= 0)
01787
01788 #define FUNC_IS_STAT(ftyp) ((ftyp) >= FIRST_STAT_TYPE && (ftyp) <= LAST_STAT_TYPE)
01789 #define FUNC_HAVE_PVAL FUNC_IS_STAT
01790
01791
01792
01793 #define MAX_STAT_AUX 64
01794
01795
01796
01797 static int FUNC_need_stat_aux[] = { 0 , 0 , 3 , 1 , 2 ,
01798 0 , 1 , 2 , 2 , 2 , 1 ,
01799 0 } ;
01800
01801
01802
01803 static char * FUNC_label_stat_aux[] = {
01804 "N/A" , "N/A" ,
01805 "SAMPLES FIT-PARAMETERS ORT-PARAMETERS" ,
01806 "DEGREES-of-FREEDOM" ,
01807 "NUMERATOR and DENOMINATOR DEGREES-of-FREEDOM" ,
01808 "N/A" ,
01809 "DEGREES-of-FREEDOM" ,
01810 "A (numerator) and B (denominator)" ,
01811 "NUMBER-of-TRIALS and PROBABILITY-per-TRIAL" ,
01812 "SHAPE and SCALE" ,
01813 "MEAN" ,
01814 "N/A"
01815 } ;
01816
01817
01818
01819
01820
01821
01822
01823
01824
01825
01826
01827
01828
01829
01830
01831
01832
01833
01834
01835 #define ANAT_SPGR_TYPE 0
01836 #define ANAT_SPGR_STR "Spoiled GRASS"
01837 #define ANAT_SPGR_PREFIX "spgr"
01838 #define ANAT_SPGR_MASK (1 << ANAT_SPGR_TYPE)
01839
01840 #define ANAT_FSE_TYPE 1
01841 #define ANAT_FSE_STR "Fast Spin Echo"
01842 #define ANAT_FSE_PREFIX "fse"
01843 #define ANAT_FSE_MASK (1 << ANAT_FSE_TYPE)
01844
01845 #define ANAT_EPI_TYPE 2
01846 #define ANAT_EPI_STR "Echo Planar"
01847 #define ANAT_EPI_PREFIX "epan"
01848 #define ANAT_EPI_MASK (1 << ANAT_EPI_TYPE)
01849
01850 #define ANAT_MRAN_TYPE 3
01851 #define ANAT_MRAN_STR "MRI Anatomy"
01852 #define ANAT_MRAN_PREFIX "anat"
01853 #define ANAT_MRAN_MASK (1 << ANAT_MRAN_TYPE)
01854
01855 #define ANAT_CT_TYPE 4
01856 #define ANAT_CT_STR "CT Scan"
01857 #define ANAT_CT_PREFIX "ct"
01858 #define ANAT_CT_MASK (1 << ANAT_CT_TYPE)
01859
01860 #define ANAT_SPECT_TYPE 5
01861 #define ANAT_SPECT_STR "SPECT Anatomy"
01862 #define ANAT_SPECT_PREFIX "spct"
01863 #define ANAT_SPECT_MASK (1 << ANAT_SPECT_TYPE)
01864
01865 #define ANAT_PET_TYPE 6
01866 #define ANAT_PET_STR "PET Anatomy"
01867 #define ANAT_PET_PREFIX "pet"
01868 #define ANAT_PET_MASK (1 << ANAT_PET_TYPE)
01869
01870 #define ANAT_MRA_TYPE 7
01871 #define ANAT_MRA_STR "MR Angiography"
01872 #define ANAT_MRA_PREFIX "mra"
01873 #define ANAT_MRA_MASK (1 << ANAT_MRA_TYPE)
01874
01875 #define ANAT_BMAP_TYPE 8
01876 #define ANAT_BMAP_STR "B-field Map"
01877 #define ANAT_BMAP_PREFIX "bmap"
01878 #define ANAT_BMAP_MASK (1 << ANAT_BMAP_TYPE)
01879
01880 #define ANAT_DIFF_TYPE 9
01881 #define ANAT_DIFF_STR "Diffusion Map"
01882 #define ANAT_DIFF_PREFIX "diff"
01883 #define ANAT_DIFF_MASK (1 << ANAT_DIFF_TYPE)
01884
01885 #define ANAT_OMRI_TYPE 10
01886 #define ANAT_OMRI_STR "Other MRI"
01887 #define ANAT_OMRI_PREFIX "omri"
01888 #define ANAT_OMRI_MASK (1 << ANAT_OMRI_TYPE)
01889
01890 #define ANAT_BUCK_TYPE 11
01891 #define ANAT_BUCK_STR "Anat Bucket"
01892 #define ANAT_BUCK_PREFIX "abuc"
01893 #define ANAT_BUCK_MASK (1 << ANAT_BUCK_TYPE)
01894
01895 #define ANAT_MAPC_TYPE 12
01896 #define ANAT_MAPC_STR "Mapped Color"
01897 #define ANAT_MAPC_PREFIX "mapc"
01898 #define ANAT_MAPC_MASK (1 << ANAT_MAPC_TYPE)
01899
01900 #define FIRST_ANAT_TYPE 0
01901 #define LAST_ANAT_TYPE 11
01902
01903 #define ANAT_ALL_MASK ( ANAT_SPGR_MASK | ANAT_FSE_MASK | ANAT_EPI_MASK | \
01904 ANAT_MRAN_MASK | ANAT_CT_MASK | ANAT_SPECT_MASK | \
01905 ANAT_PET_MASK | ANAT_MRA_MASK | ANAT_BMAP_MASK | \
01906 ANAT_DIFF_MASK | ANAT_OMRI_MASK| ANAT_BUCK_MASK | \
01907 ANAT_MAPC_MASK )
01908
01909 #define NUM_DSET_TYPES (LAST_FUNC_TYPE + LAST_ANAT_TYPE + 2)
01910
01911 #define LONGEST_ANAT_TYPESTR strlen(ANAT_MRA_STR)
01912
01913 static char * ANAT_typestr[] = {
01914 ANAT_SPGR_STR , ANAT_FSE_STR , ANAT_EPI_STR , ANAT_MRAN_STR ,
01915 ANAT_CT_STR , ANAT_SPECT_STR , ANAT_PET_STR ,
01916 ANAT_MRA_STR , ANAT_BMAP_STR , ANAT_DIFF_STR , ANAT_OMRI_STR ,
01917 ANAT_BUCK_STR , ANAT_MAPC_STR
01918 } ;
01919
01920 static char * ANAT_prefixstr[] = {
01921 ANAT_SPGR_PREFIX , ANAT_FSE_PREFIX , ANAT_EPI_PREFIX , ANAT_MRAN_PREFIX ,
01922 ANAT_CT_PREFIX , ANAT_SPECT_PREFIX , ANAT_PET_PREFIX ,
01923 ANAT_MRA_PREFIX , ANAT_BMAP_PREFIX , ANAT_DIFF_PREFIX , ANAT_OMRI_PREFIX ,
01924 ANAT_BUCK_PREFIX , ANAT_MAPC_PREFIX
01925 } ;
01926
01927
01928
01929 static char * DSET_prefixstr[NUM_DSET_TYPES] = {
01930 FUNC_FIM_PREFIX , FUNC_THR_PREFIX , FUNC_COR_PREFIX ,
01931 FUNC_TT_PREFIX , FUNC_FT_PREFIX ,
01932 FUNC_ZT_PREFIX , FUNC_CT_PREFIX , FUNC_BT_PREFIX ,
01933 FUNC_BN_PREFIX , FUNC_GT_PREFIX , FUNC_PT_PREFIX , FUNC_BUCK_PREFIX ,
01934 ANAT_SPGR_PREFIX , ANAT_FSE_PREFIX , ANAT_EPI_PREFIX , ANAT_MRAN_PREFIX ,
01935 ANAT_CT_PREFIX , ANAT_SPECT_PREFIX , ANAT_PET_PREFIX ,
01936 ANAT_MRA_PREFIX , ANAT_BMAP_PREFIX , ANAT_DIFF_PREFIX , ANAT_OMRI_PREFIX ,
01937 ANAT_BUCK_PREFIX
01938 } ;
01939
01940 #define DSET_PREFIXSTR(ds) ( ISFUNC(ds) ? FUNC_prefixstr[(ds)->func_type] \
01941 : ANAT_prefixstr[(ds)->func_type] )
01942
01943 #define DSET_FUNCLABEL(ds) ( ISFUNC(ds) ? FUNC_label[(ds)->func_type] \
01944 : ANAT_prefixstr[(ds)->func_type] )
01945
01946 #define DSET_TYPESTR(ds) ( ISFUNC(ds) ? FUNC_typestr[(ds)->func_type] \
01947 : ANAT_typestr[(ds)->func_type] )
01948
01949 static int ANAT_nvals[] = { 1,1,1,1,1,1,1,1,1,1,1,1 , 1 } ;
01950 static int ANAT_ival_zero[] = { 0,0,0,0,0,0,0,0,0,0,0,0 , 0 } ;
01951
01952
01953
01954 struct THD_3dim_dataset_array ;
01955
01956
01957
01958
01959 typedef struct THD_3dim_dataset {
01960 int type ;
01961
01962 int view_type ;
01963 int func_type ;
01964
01965 char label1[THD_MAX_LABEL] ;
01966 char label2[THD_MAX_LABEL] ;
01967
01968 THD_datablock * dblk ;
01969 THD_dataxes * daxes ;
01970 THD_dataxes * wod_daxes ;
01971 int wod_flag ;
01972
01973 THD_timeaxis * taxis ;
01974
01975 THD_marker_set * markers ;
01976
01977 struct THD_3dim_dataset * warp_parent ;
01978 THD_warp * warp ;
01979 THD_warp * vox_warp ;
01980
01981 struct THD_3dim_dataset * anat_parent ;
01982
01983 THD_statistics * stats ;
01984
01985 float stat_aux[MAX_STAT_AUX] ;
01986
01987 char warp_parent_name[THD_MAX_NAME] ;
01988 char anat_parent_name[THD_MAX_NAME] ;
01989 char self_name[THD_MAX_NAME] ;
01990
01991 #ifdef ALLOW_DATASET_VLIST
01992 THD_vector_list * pts ;
01993 Boolean pts_original ;
01994 #endif
01995
01996 int death_mark ;
01997
01998 MCW_idcode idcode ;
01999 MCW_idcode anat_parent_idcode ;
02000 MCW_idcode warp_parent_idcode ;
02001
02002 char * keywords ;
02003
02004 THD_usertaglist * tagset ;
02005
02006
02007
02008 KILL_list kl ;
02009 XtPointer parent ;
02010
02011
02012
02013 THD_warp *self_warp ;
02014
02015
02016
02017 char *tcat_list ;
02018 int tcat_num ;
02019 int *tcat_len ;
02020
02021 } THD_3dim_dataset ;
02022
02023
02024
02025 #define DOOMED 665
02026
02027
02028
02029 #define DSET_MARK_FOR_DEATH(ds) \
02030 do{ if( ISVALID_DSET(ds) && ds->death_mark >= 0 ) ds->death_mark = DOOMED ; } while(0)
02031
02032
02033
02034 #define DSET_MARK_FOR_IMMORTALITY(ds) \
02035 do{ if( ISVALID_DSET(ds) ) ds->death_mark = -1 ; } while(0)
02036
02037
02038
02039 #define DSET_MARK_FOR_NORMAL(ds) \
02040 do{ if( ISVALID_DSET(ds) ) ds->death_mark = 0 ; } while(0)
02041
02042
02043
02044 #define DSET_IS_TCAT(ds) (ISVALID_DSET(ds) && (ds)->tcat_list != NULL)
02045
02046
02047
02048 #define CURRENT_DAXES(ds) (((ds)->wod_flag) ? ((ds)->wod_daxes) : ((ds)->daxes))
02049
02050
02051
02052 #define ISVALID_3DIM_DATASET(ds) \
02053 ( (ds) != NULL && (ds)->type >= FIRST_3DIM_TYPE && \
02054 (ds)->type <= LAST_3DIM_TYPE && \
02055 ISVALID_DATABLOCK((ds)->dblk) )
02056
02057
02058
02059 #define ISVALID_DSET ISVALID_3DIM_DATASET
02060
02061
02062
02063 #define ISFUNCTYPE(nn) ( (nn) == HEAD_FUNC_TYPE || (nn) == GEN_FUNC_TYPE )
02064
02065
02066
02067 #define ISFUNC(dset) ( ISVALID_DSET(dset) && ISFUNCTYPE((dset)->type) )
02068
02069
02070
02071 #define ISANATTYPE(nn) ( (nn) == HEAD_ANAT_TYPE || (nn) == GEN_ANAT_TYPE )
02072
02073
02074
02075 #define ISANAT(dset) ( ISVALID_DSET(dset) && ISANATTYPE((dset)->type) )
02076
02077
02078
02079 #define ISHEADTYPE(nn) ( (nn) == HEAD_ANAT_TYPE || (nn) == HEAD_FUNC_TYPE )
02080
02081
02082
02083 #define ISHEAD(dset) ( ISVALID_DSET(dset) && ISHEADTYPE((dset)->type) )
02084
02085
02086
02087 #define ISANATBUCKET(dset) ( ISANAT(dset) && (dset)->func_type == ANAT_BUCK_TYPE )
02088
02089
02090
02091 #define ISFUNCBUCKET(dset) ( ISFUNC(dset) && (dset)->func_type == FUNC_BUCK_TYPE )
02092
02093
02094
02095 #define ISBUCKET(dset) ( ISANATBUCKET(dset) || ISFUNCBUCKET(dset) )
02096
02097
02098
02099 #define DSET_ONDISK(ds) ( ISVALID_DSET(ds) && (ds)->dblk!=NULL && \
02100 (ds)->dblk->diskptr->storage_mode!=STORAGE_UNDEFINED )
02101
02102
02103
02104 #define DSET_IS_BRIK(ds) ( ISVALID_DSET(ds) && (ds)->dblk!=NULL && \
02105 (ds)->dblk->diskptr->storage_mode == STORAGE_BY_BRICK )
02106
02107
02108
02109 #define DBLK_IS_MINC(db) ( ISVALID_DBLK(db) && ISVALID_DISKPTR((db)->diskptr) && \
02110 (db)->diskptr->storage_mode == STORAGE_BY_MINC )
02111
02112
02113
02114 #define DSET_IS_MINC(ds) ( ISVALID_DSET(ds) && ISVALID_DBLK((ds)->dblk) && \
02115 ISVALID_DISKPTR((ds)->dblk->diskptr) && \
02116 (ds)->dblk->diskptr->storage_mode == STORAGE_BY_MINC )
02117
02118
02119
02120 #define DBLK_IS_ANALYZE(db) ( ISVALID_DBLK(db) && ISVALID_DISKPTR((db)->diskptr) && \
02121 (db)->diskptr->storage_mode == STORAGE_BY_ANALYZE )
02122
02123
02124
02125 #define DSET_IS_ANALYZE(ds) ( ISVALID_DSET(ds) && ISVALID_DBLK((ds)->dblk) && \
02126 ISVALID_DISKPTR((ds)->dblk->diskptr) && \
02127 (ds)->dblk->diskptr->storage_mode == STORAGE_BY_ANALYZE )
02128
02129
02130
02131 #define DBLK_IS_CTFMRI(db) ( ISVALID_DBLK(db) && ISVALID_DISKPTR((db)->diskptr) && \
02132 (db)->diskptr->storage_mode == STORAGE_BY_CTFMRI )
02133
02134
02135
02136 #define DSET_IS_CTFMRI(ds) ( ISVALID_DSET(ds) && ISVALID_DBLK((ds)->dblk) && \
02137 ISVALID_DISKPTR((ds)->dblk->diskptr) && \
02138 (ds)->dblk->diskptr->storage_mode == STORAGE_BY_CTFMRI )
02139
02140
02141
02142 #define DBLK_IS_CTFSAM(db) ( ISVALID_DBLK(db) && ISVALID_DISKPTR((db)->diskptr) && \
02143 (db)->diskptr->storage_mode == STORAGE_BY_CTFSAM )
02144
02145
02146
02147 #define DSET_IS_CTFSAM(ds) ( ISVALID_DSET(ds) && ISVALID_DBLK((ds)->dblk) && \
02148 ISVALID_DISKPTR((ds)->dblk->diskptr) && \
02149 (ds)->dblk->diskptr->storage_mode == STORAGE_BY_CTFSAM )
02150
02151
02152
02153 #define DBLK_IS_1D(db) ( ISVALID_DBLK(db) && ISVALID_DISKPTR((db)->diskptr) && \
02154 (db)->diskptr->storage_mode == STORAGE_BY_1D )
02155
02156
02157
02158 #define DBLK_IS_3D(db) ( ISVALID_DBLK(db) && ISVALID_DISKPTR((db)->diskptr) && \
02159 (db)->diskptr->storage_mode == STORAGE_BY_3D )
02160
02161
02162
02163 #define DBLK_IS_NIFTI(db) ( ISVALID_DBLK(db) && ISVALID_DISKPTR((db)->diskptr) && \
02164 (db)->diskptr->storage_mode == STORAGE_BY_NIFTI )
02165
02166
02167
02168 #define DSET_IS_1D(ds) ( ISVALID_DSET(ds) && ISVALID_DBLK((ds)->dblk) && \
02169 ISVALID_DISKPTR((ds)->dblk->diskptr) && \
02170 (ds)->dblk->diskptr->storage_mode == STORAGE_BY_1D )
02171
02172
02173
02174 #define DSET_IS_3D(ds) ( ISVALID_DSET(ds) && ISVALID_DBLK((ds)->dblk) && \
02175 ISVALID_DISKPTR((ds)->dblk->diskptr) && \
02176 (ds)->dblk->diskptr->storage_mode == STORAGE_BY_3D )
02177
02178
02179
02180 #define DSET_IS_NIFTI(ds) ( ISVALID_DSET(ds) && ISVALID_DBLK((ds)->dblk) && \
02181 ISVALID_DISKPTR((ds)->dblk->diskptr) && \
02182 (ds)->dblk->diskptr->storage_mode == STORAGE_BY_NIFTI )
02183
02184
02185
02186 #define DBLK_IS_VOLUMES(db) ( ISVALID_DBLK(db) && \
02187 ISVALID_DISKPTR((db)->diskptr) && \
02188 (db)->diskptr->storage_mode == STORAGE_BY_VOLUMES )
02189
02190
02191
02192 #define DSET_IS_VOLUMES(ds) ( ISVALID_DSET(ds) && \
02193 ISVALID_DBLK((ds)->dblk) && \
02194 ISVALID_DISKPTR((ds)->dblk->diskptr) && \
02195 (ds)->dblk->diskptr->storage_mode == STORAGE_BY_VOLUMES )
02196
02197
02198
02199 #define DBLK_IS_MPEG(db) ( ISVALID_DBLK(db) && ISVALID_DISKPTR((db)->diskptr) && \
02200 (db)->diskptr->storage_mode == STORAGE_BY_MPEG )
02201
02202
02203
02204 #define DSET_IS_MPEG(ds) ( ISVALID_DSET(ds) && ISVALID_DBLK((ds)->dblk) && \
02205 ISVALID_DISKPTR((ds)->dblk->diskptr) && \
02206 (ds)->dblk->diskptr->storage_mode == STORAGE_BY_MPEG )
02207
02208
02209
02210 #define DSET_WRITEABLE(ds) \
02211 ( ISVALID_DSET(ds) && \
02212 ISVALID_DBLK((ds)->dblk) && \
02213 (ds)->warp_parent != NULL && \
02214 !DSET_IS_MINC(ds) && \
02215 !DSET_IS_ANALYZE(ds) )
02216
02217
02218
02219 #define DSET_COMPRESSED(ds) \
02220 ( ISVALID_DSET(ds) && (ds)->dblk!=NULL && \
02221 (ds)->dblk->diskptr != NULL && \
02222 COMPRESS_filecode((ds)->dblk->diskptr->brick_name) >= 0 )
02223
02224
02225
02226 #define PURGE_DSET(ds) \
02227 do{ if( ISVALID_3DIM_DATASET(ds) && DSET_ONDISK(ds) ) \
02228 (void) THD_purge_datablock( (ds)->dblk , DATABLOCK_MEM_ANY ) ; \
02229 } while(0)
02230
02231
02232
02233 #define DSET_INMEMORY(ds) \
02234 ( ISVALID_DSET(ds) && (ds)->dblk!=NULL && \
02235 (ds)->dblk->malloc_type!=DATABLOCK_MEM_UNDEFINED && \
02236 ( (ds)->dblk->diskptr->storage_mode!=STORAGE_UNDEFINED || DSET_LOADED(ds) ) )
02237
02238 #define DBLK_BRICK(db,iv) ((db)->brick->imarr[(iv)])
02239
02240
02241
02242 #define DSET_BRICK(ds,iv) DBLK_BRICK((ds)->dblk,(iv))
02243
02244 #define DBLK_BRICK_TYPE(db,iv) (DBLK_BRICK((db),(iv))->kind)
02245
02246
02247
02248 #define DSET_BRICK_TYPE(ds,iv) DBLK_BRICK_TYPE((ds)->dblk,(iv))
02249
02250
02251
02252 #define DBLK_BRICK_NVOX(db,iv) (DBLK_BRICK((db),(iv))->nvox)
02253
02254 #define DBLK_ARRAY(db,iv) mri_data_pointer( DBLK_BRICK((db),(iv)) )
02255
02256
02257
02258 #define DSET_ARRAY(ds,iv) DBLK_ARRAY((ds)->dblk,(iv))
02259
02260 #define DSET_BRICK_ARRAY DSET_ARRAY
02261 #define DBLK_BRICK_ARRAY DBLK_ARRAY
02262
02263 #define DBLK_BRICK_FACTOR(db,iv) ((db)->brick_fac[(iv)])
02264
02265
02266
02267
02268
02269
02270
02271
02272
02273 #define DSET_BRICK_FACTOR(ds,iv) DBLK_BRICK_FACTOR((ds)->dblk,(iv))
02274
02275 extern int THD_need_brick_factor( THD_3dim_dataset * ) ;
02276
02277 #define DBLK_BRICK_BYTES(db,iv) ((db)->brick_bytes[iv])
02278
02279
02280
02281 #define DSET_BRICK_BYTES(ds,iv) DBLK_BRICK_BYTES((ds)->dblk,(iv))
02282
02283
02284
02285
02286
02287 #define DSET_PRINCIPAL_VALUE(ds) ( ISANAT(ds) ? ANAT_ival_zero[(ds)->func_type] \
02288 : FUNC_ival_fim[(ds)->func_type] )
02289
02290
02291
02292 #define DSET_PRINCIPAL_INDEX DSET_PRINCIPAL_VALUE
02293
02294
02295
02296
02297
02298 #define DSET_THRESH_VALUE(ds) (ISANAT((ds)) ? -1 : FUNC_ival_thr[(ds)->func_type])
02299
02300 #define DSET_THRESH_INDEX DSET_THRESH_VALUE
02301
02302
02303
02304 #define DSET_PREFIX(ds) (((ds)->dblk!=NULL && (ds)->dblk->diskptr!=NULL) \
02305 ? ((ds)->dblk->diskptr->prefix) : "\0" )
02306
02307 extern char * THD_newprefix(THD_3dim_dataset * dset, char * suffix);
02308 extern char * THD_deplus_prefix( char *prefix ) ;
02309
02310
02311
02312 #define DSET_FILECODE(ds) (((ds)->dblk!=NULL && (ds)->dblk->diskptr!=NULL) \
02313 ? ((ds)->dblk->diskptr->filecode) : "\0" )
02314
02315
02316
02317 #define DSET_HEADNAME(ds) ( ((ds)->tcat_list != NULL) ? (ds)->tcat_list \
02318 : ((ds)->dblk!=NULL && (ds)->dblk->diskptr!=NULL) \
02319 ? ((ds)->dblk->diskptr->header_name) : "\0" )
02320
02321
02322
02323 #define DSET_BRIKNAME(ds) (((ds)->dblk!=NULL && (ds)->dblk->diskptr!=NULL) \
02324 ? ((ds)->dblk->diskptr->brick_name) : "\0" )
02325 #define DSET_BRICKNAME DSET_BRIKNAME
02326
02327
02328
02329 #define DSET_DIRNAME(ds) (((ds)->dblk!=NULL && (ds)->dblk->diskptr!=NULL) \
02330 ? ((ds)->dblk->diskptr->directory_name) : "\0" )
02331
02332 #define DSET_SESSNAME DSET_DIRNAME
02333
02334
02335
02336 #define DSET_IDCODE(ds) (&((ds)->idcode))
02337
02338
02339
02340 #define DSET_IDCODE_STR(ds) ((ds)->idcode.str)
02341
02342
02343
02344 #define DBLK_BYTEORDER(db) ((db)->diskptr->byte_order)
02345
02346
02347
02348 #define DSET_BYTEORDER(ds) DBLK_BYTEORDER((ds)->dblk)
02349
02350
02351
02352
02353
02354
02355
02356
02357 #define DSET_NUM_TIMES(ds) ( ((ds)->taxis == NULL) ? 1 : (ds)->taxis->ntt )
02358
02359
02360
02361 #define HAS_TIMEAXIS(ds) ( DSET_NUM_TIMES(ds) > 1 )
02362
02363
02364
02365
02366
02367
02368 #define DSET_NVALS_PER_TIME(ds) ( (ds)->dblk->nvals / DSET_NUM_TIMES(ds) )
02369
02370
02371
02372 #define DSET_NVALS(ds) ( (ds)->dblk->nvals )
02373
02374
02375
02376 #define DSET_NVOX(ds) ( (ds)->daxes->nxx * (ds)->daxes->nyy * (ds)->daxes->nzz )
02377
02378
02379
02380 #define DSET_NX(ds) ((ds)->daxes->nxx)
02381
02382
02383
02384 #define DSET_NY(ds) ((ds)->daxes->nyy)
02385
02386
02387
02388 #define DSET_NZ(ds) ((ds)->daxes->nzz)
02389
02390
02391
02392 #define DSET_DX(ds) ((ds)->daxes->xxdel)
02393
02394
02395
02396 #define DSET_DY(ds) ((ds)->daxes->yydel)
02397
02398
02399
02400 #define DSET_DZ(ds) ((ds)->daxes->zzdel)
02401
02402
02403
02404 #define DSET_XORG(ds) ((ds)->daxes->xxorg)
02405
02406
02407
02408 #define DSET_YORG(ds) ((ds)->daxes->yyorg)
02409
02410
02411
02412 #define DSET_ZORG(ds) ((ds)->daxes->zzorg)
02413
02414
02415
02416 #define DSET_XXMIN(ds) ((ds)->daxes->xxmin)
02417
02418
02419
02420 #define DSET_XXMAX(ds) ((ds)->daxes->xxmax)
02421
02422
02423
02424 #define DSET_YYMIN(ds) ((ds)->daxes->yymin)
02425
02426
02427
02428 #define DSET_YYMAX(ds) ((ds)->daxes->yymax)
02429
02430
02431
02432 #define DSET_ZZMIN(ds) ((ds)->daxes->zzmin)
02433
02434
02435
02436 #define DSET_ZZMAX(ds) ((ds)->daxes->zzmax)
02437
02438
02439
02440
02441
02442 #define DSET_index_to_ix(ds,ii) ( (ii) % (ds)->daxes->nxx)
02443
02444
02445
02446 #define DSET_index_to_jy(ds,ii) ( ((ii) / (ds)->daxes->nxx) % (ds)->daxes->nyy )
02447
02448
02449
02450 #define DSET_index_to_kz(ds,ii) ( (ii) /((ds)->daxes->nxx * (ds)->daxes->nyy ))
02451
02452
02453
02454 #define DSET_ixyz_to_index(ds,ix,jy,kz) ((ix)+((jy)+(kz)*(ds)->daxes->nyy)*(ds)->daxes->nxx)
02455
02456
02457
02458 #define DSET_CUBICAL(ds) ( fabs((ds)->daxes->xxdel) == fabs((ds)->daxes->yydel) && \
02459 fabs((ds)->daxes->xxdel) == fabs((ds)->daxes->zzdel) )
02460
02461 #if 0
02462 #define DSET_GRAPHABLE(ds) ( ISVALID_3DIM_DATASET(ds) && DSET_INMEMORY(ds) && \
02463 (ds)->wod_flag == False && DSET_NUM_TIMES(ds) > 1 && \
02464 ( DSET_ONDISK(ds) || DSET_LOADED(ds) && DSET_LOCKED(ds) ) )
02465 #else
02466
02467
02468
02469
02470 #define DSET_GRAPHABLE(ds) ( ISVALID_3DIM_DATASET(ds) && DSET_INMEMORY(ds) && \
02471 (ds)->wod_flag == False && \
02472 ( DSET_ONDISK(ds) || DSET_LOADED(ds) && DSET_LOCKED(ds) ) )
02473 #endif
02474
02475
02476
02477 #define DSET_TIMESTEP(ds) ( ((ds)->taxis == NULL) ? 0.0 : (ds)->taxis->ttdel )
02478
02479 #define DSET_TR DSET_TIMESTEP
02480
02481
02482
02483
02484
02485 #define DSET_TIMEORIGIN(ds) ( ((ds)->taxis == NULL) ? 0.0 : (ds)->taxis->ttorg )
02486
02487
02488
02489
02490
02491 #define DSET_TIMEDURATION(ds) ( ((ds)->taxis == NULL) ? 0.0 : (ds)->taxis->ttdur )
02492
02493
02494
02495
02496
02497
02498
02499
02500
02501 #define DSET_TIMEUNITS(ds) ( ((ds)->taxis == NULL) ? ILLEGAL_TYPE \
02502 : (ds)->taxis->units_type )
02503
02504
02505
02506
02507
02508
02509 #define DSET_NUM_TTOFF(ds) ( ((ds)->taxis == NULL) ? 0 : (ds)->taxis->nsl )
02510
02511
02512
02513 static char tmp_dblab[8] ;
02514 #define DBLK_BRICK_LAB(db,iv) ( ((db)->brick_lab != NULL) ? ((db)->brick_lab[iv]) : "?" )
02515
02516
02517
02518
02519
02520 #define DSET_BRICK_LAB(ds,iv) DBLK_BRICK_LAB((ds)->dblk,(iv))
02521
02522
02523
02524 #define DSET_BRICK_LABEL DSET_BRICK_LAB
02525
02526 #define DBLK_BRICK_STATCODE(db,iv) \
02527 ( ((db)->brick_statcode != NULL) ? (db)->brick_statcode[iv] : ILLEGAL_TYPE )
02528
02529
02530
02531
02532
02533 #define DSET_BRICK_STATCODE(ds,iv) \
02534 ( ISBUCKET((ds)) ? DBLK_BRICK_STATCODE((ds)->dblk,(iv)) \
02535 : (ISFUNC(ds) && (iv)==FUNC_ival_thr[(ds)->func_type]) \
02536 ? (ds)->func_type : -1 )
02537
02538 #define DBLK_BRICK_STATAUX(db,iv) \
02539 ( ((db)->brick_stataux != NULL) ? (db)->brick_stataux[iv] : NULL )
02540
02541
02542
02543
02544
02545
02546
02547 #define DSET_BRICK_STATAUX(ds,iv) \
02548 ( ISBUCKET((ds)) ? DBLK_BRICK_STATAUX((ds)->dblk,(iv)) \
02549 : (ISFUNC(ds) && (iv)==FUNC_ival_thr[(ds)->func_type]) \
02550 ? (ds)->stat_aux : NULL )
02551
02552 #define DBLK_BRICK_STATPAR(db,iv,jj) \
02553 ( ((db)->brick_stataux != NULL) ? (db)->brick_stataux[iv][jj] : 0.0 )
02554
02555
02556
02557 #define DSET_BRICK_STATPAR(ds,iv,jj) \
02558 ( ISBUCKET((ds)) ? DBLK_BRICK_STATPAR((ds)->dblk,(iv),(jj)) \
02559 : (ISFUNC(ds) && (iv)==FUNC_ival_thr[(ds)->func_type]) \
02560 ? (ds)->stat_aux[jj] : 0.0 )
02561
02562 #define DBLK_BRICK_KEYWORDS(db,iv) \
02563 ( ((db)->brick_keywords != NULL) ? ((db)->brick_keywords[iv]) : NULL )
02564
02565 #define DSET_BRICK_KEYWORDS(ds,iv) DBLK_BRICK_KEYWORDS((ds)->dblk,(iv))
02566
02567 #define DSET_KEYWORDS(ds) ((ds)->keywords)
02568
02569 #define DSET_BRICK_KEYWORDS_HAS(ds,iv,ss) \
02570 THD_string_has( DSET_BRICK_KEYWORDS((ds),(iv)) , (ss) )
02571
02572 #define DSET_KEYWORDS_HAS(ds,ss) \
02573 THD_string_has( DSET_KEYWORDS((ds)) , (ss) )
02574
02575
02576
02577
02578
02579
02580 #define DSET_FIX_NAMES(ds) \
02581 ( strcpy((ds)->self_name,(ds)->dblk->diskptr->directory_name), \
02582 strcat((ds)->self_name,(ds)->dblk->diskptr->filecode) , \
02583 strcpy((ds)->label1 ,(ds)->dblk->diskptr->filecode) , \
02584 strcpy((ds)->label2 ,THD_DEFAULT_LABEL) )
02585
02586
02587
02588
02589
02590
02591 #define RELOAD_STATS(dset) \
02592 if( ISVALID_3DIM_DATASET((dset)) && \
02593 ( !ISVALID_STATISTIC((dset)->stats) || \
02594 ( (dset)->dblk->nvals > 1 && \
02595 (dset)->stats->bstat[1].min > (dset)->stats->bstat[1].max ) ) ){ \
02596 THD_load_statistics((dset)) ; }
02597
02598
02599
02600
02601
02602 #define DSET_VALID_BSTAT(dset,ii) \
02603 ( ISVALID_3DIM_DATASET((dset)) && \
02604 ISVALID_STATISTIC((dset)->stats) && \
02605 (ii) < (dset)->stats->nbstat && \
02606 ISVALID_BSTAT( (dset)->stats->bstat[(ii)] ) )
02607
02608
02609
02610 #define DSET_CRUSH_BSTAT(dset,ii) \
02611 do{ if( DSET_VALID_BSTAT(dset,ii) ) \
02612 INVALIDATE_BSTAT((dset)->stats->bstat[(ii)]) ; } while(0)
02613
02614
02615
02616 #define DSET_KILL_STATS(ds) \
02617 do{ if( (ds)->stats != NULL ){ \
02618 REMOVEFROM_KILL( (ds)->kl, (ds)->stats->bstat ) ; \
02619 REMOVEFROM_KILL( (ds)->kl, (ds)->stats ) ; \
02620 KILL_STATISTIC( (ds)->stats ) ; \
02621 (ds)->stats = NULL ; } } while(0)
02622
02623
02624
02625
02626
02627
02628
02629
02630 #define INIT_STAT_AUX(ds,nf,ff) \
02631 do{ int is ; \
02632 for( is=0 ; is < MAX_STAT_AUX ; is++ ) \
02633 (ds)->stat_aux[is] = (is < (nf)) ? (ff)[is] : 0.0 ; } while(0)
02634
02635
02636
02637 #define ZERO_STAT_AUX(ds) \
02638 do{ int is ; for( is=0 ; is < MAX_STAT_AUX ; is++ ) \
02639 (ds)->stat_aux[is] = 0.0 ; } while(0)
02640
02641
02642
02643
02644
02645
02646
02647 #define DSET_load(ds) THD_load_datablock( (ds)->dblk )
02648
02649
02650
02651
02652
02653 #define DSET_unload(ds) THD_purge_datablock( (ds)->dblk , DATABLOCK_MEM_ANY )
02654
02655
02656
02657
02658
02659
02660 #define DSET_unload_one(ds,iv) THD_purge_one_brick( (ds)->dblk , (iv) )
02661
02662
02663
02664
02665
02666 #define DSET_delete(ds) THD_delete_3dim_dataset((ds),False)
02667
02668
02669
02670
02671
02672 #define DSET_write(ds) ( THD_load_statistics( (ds) ) , \
02673 THD_write_3dim_dataset( NULL,NULL , (ds),True ) )
02674
02675
02676
02677 #define DSET_write_header(ds) THD_write_3dim_dataset( NULL,NULL , (ds),False )
02678
02679
02680
02681
02682
02683 #define DSET_LOADED(ds) ( THD_count_databricks((ds)->dblk) == DSET_NVALS(ds) )
02684
02685
02686
02687 #define DSET_lock(ds) DBLK_lock((ds)->dblk)
02688
02689
02690
02691 #define DSET_unlock(ds) DBLK_unlock((ds)->dblk)
02692
02693
02694
02695 #define DSET_LOCKED(ds) DBLK_LOCKED((ds)->dblk)
02696
02697
02698
02699
02700
02701
02702 #define DSET_mallocize(ds) DBLK_mallocize((ds)->dblk)
02703
02704
02705
02706
02707
02708 #define DSET_mmapize(ds) DBLK_mmapize((ds)->dblk)
02709
02710
02711
02712
02713
02714 #define DSET_shareize(ds) DBLK_shareize((ds)->dblk)
02715
02716
02717
02718
02719
02720 #define DSET_anyize(ds) DBLK_anyize((ds)->dblk)
02721
02722
02723
02724
02725
02726 #define DSET_superlock(ds) DBLK_superlock((ds)->dblk)
02727
02728
02729
02730 #define DSET_IS_MALLOC(ds) DBLK_IS_MALLOC((ds)->dblk)
02731
02732
02733
02734 #define DSET_IS_MMAP(ds) DBLK_IS_MMAP((ds)->dblk)
02735
02736
02737
02738 #define DSET_IS_SHARED(ds) DBLK_IS_SHARED((ds)->dblk)
02739
02740
02741
02742
02743
02744 #define DSET_IS_MASTERED(ds) DBLK_IS_MASTERED((ds)->dblk)
02745
02746
02747 #undef TWOGIG
02748 #define TWOGIG 2147000000
02749
02750 #define DBLK_mmapfix(db) \
02751 do{ if( (db)->malloc_type==DATABLOCK_MEM_MMAP && (db)->total_bytes>TWOGIG ) \
02752 (db)->malloc_type = DATABLOCK_MEM_MALLOC ; } while(0)
02753
02754
02755
02756
02757
02758
02759
02760
02761 typedef struct THD_3dim_dataset_array {
02762 int num ;
02763 int nall ;
02764 THD_3dim_dataset **ar ;
02765 } THD_3dim_dataset_array ;
02766
02767 #define INC_3DARR 8
02768
02769
02770
02771
02772
02773 #define INIT_3DARR(name) \
02774 ( (name) = XtNew(THD_3dim_dataset_array) ,\
02775 (name)->num = (name)->nall = 0 , \
02776 (name)->ar = NULL )
02777
02778
02779
02780 #define ADDTO_3DARR(name,ddset) \
02781 { if( (name)->num == (name)->nall ){ \
02782 (name)->nall += INC_3DARR ; \
02783 (name)->ar = (THD_3dim_dataset **) \
02784 XtRealloc( (char *) (name)->ar , \
02785 sizeof(THD_3dim_dataset *) * (name)->nall ) ; \
02786 } \
02787 if( (ddset) != NULL ){ \
02788 (name)->ar[(name)->num] = (ddset) ; \
02789 ((name)->num)++ ; \
02790 } }
02791
02792
02793
02794
02795
02796
02797
02798 #define FREE_3DARR(name) \
02799 if( (name) != NULL ){ \
02800 myXtFree( (name)->ar ) ; \
02801 myXtFree( (name) ) ; }
02802
02803
02804
02805 #define DSET_IN_3DARR(name,nn) ((name)->ar[(nn)])
02806
02807
02808
02809 #define DSET_ORDERED(d1,d2) \
02810 ( ( (d1)->view_type < (d2)->view_type ) || \
02811 ( (d1)->view_type==(d2)->view_type && (d1)->func_type<(d2)->func_type ) )
02812
02813
02814
02815 #define DSET_SWAP(d1,d2) (dt=(d1),(d1)=(d2),(d2)=dt)
02816
02817
02818
02819 #define SORT_3DARR(name) \
02820 if( (name) != NULL && (name)->num > 1 ){ \
02821 int iid , jjd ; THD_3dim_dataset * dt ; \
02822 for( iid=0 ; iid < (name)->num ; iid++ ){ \
02823 for( jjd=1 ; jjd < (name)->num ; jjd++ ){ \
02824 if( !DSET_ORDERED( (name)->ar[jjd-1] , (name)->ar[jjd] ) ) \
02825 DSET_SWAP( (name)->ar[jjd-1] , (name)->ar[jjd] ) ; \
02826 }}}
02827
02828
02829
02830
02831 #define SESSION_TYPE 97
02832
02833
02834
02835
02836
02837
02838 typedef struct {
02839 int type ;
02840 int num_dsset ;
02841 char sessname[THD_MAX_NAME] ;
02842 char lastname[THD_MAX_NAME] ;
02843
02844 THD_3dim_dataset *dsset[THD_MAX_SESSION_SIZE][LAST_VIEW_TYPE+1] ;
02845
02846
02847 Htable *warptable ;
02848
02849
02850
02851 int su_num ;
02852 SUMA_surface **su_surf ;
02853
02854 int su_numgroup ;
02855 SUMA_surfacegroup **su_surfgroup ;
02856
02857 XtPointer parent ;
02858 } THD_session ;
02859
02860
02861
02862 #define ISVALID_SESSION(ss) ( (ss) != NULL && (ss)->type == SESSION_TYPE )
02863
02864
02865
02866 #define BLANK_SESSION(ss) \
02867 if( ISVALID_SESSION((ss)) ){ \
02868 int id , vv ; \
02869 for( id=0 ; id < THD_MAX_SESSION_SIZE ; id++ ) \
02870 for( vv=0 ; vv <= LAST_VIEW_TYPE ; vv++ ) (ss)->dsset[id][vv] = NULL; \
02871 (ss)->num_dsset = 0 ; \
02872 (ss)->su_num = 0 ; (ss)->su_surf = NULL ; \
02873 (ss)->su_numgroup = 0 ; (ss)->su_surfgroup = NULL ; \
02874 (ss)->warptable = NULL ; }
02875
02876
02877
02878 #define SESSION_HAS_SUMA(ss) ( (ss)!=NULL && \
02879 (ss)->su_surf!=NULL && \
02880 (ss)->su_num > 0 )
02881
02882 #define SESSIONLIST_TYPE 107
02883
02884
02885
02886
02887
02888
02889 typedef struct {
02890 int type , num_sess ;
02891 THD_session * ssar[THD_MAX_NUM_SESSION] ;
02892 XtPointer parent ;
02893 } THD_sessionlist ;
02894
02895
02896
02897 #define ISVALID_SESSIONLIST(sl) ( (sl)!=NULL && (sl)->type==SESSIONLIST_TYPE )
02898
02899
02900
02901 #define BLANK_SESSIONLIST(sl) \
02902 if( ISVALID_SESSIONLIST((sl)) ){ \
02903 int is ; \
02904 for( is=0 ; is < THD_MAX_NUM_SESSION ; is++ ) (sl)->ssar[is] = NULL ; \
02905 (sl)->num_sess = 0 ; }
02906
02907
02908
02909
02910
02911
02912
02913
02914
02915 typedef struct {
02916 int sess_index ;
02917 int dset_index ;
02918 int view_index ;
02919 THD_3dim_dataset * dset ;
02920 } THD_slist_find ;
02921
02922
02923
02924 #define BADFIND(ff) \
02925 ( (ff).sess_index=(ff).dset_index=(ff).view_index=-1 , \
02926 (ff).dset = NULL )
02927
02928 #define FIND_NAME 1
02929 #define FIND_IDCODE 2
02930 #define FIND_PREFIX 3
02931
02932
02933
02934
02935 #define ATRNAME_DATANAME "DATASET_NAME"
02936 #define ATRNAME_LABEL1 "LABEL_1"
02937 #define ATRNAME_LABEL2 "LABEL_2"
02938
02939 #define ATRNAME_ANATOMY_PARENT "ANATOMY_PARENTNAME"
02940
02941 #define ATRNAME_ORIENT_SPECIFIC "ORIENT_SPECIFIC"
02942 #define ATRTYPE_ORIENT_SPECIFIC ATR_INT_TYPE
02943 #define ATRSIZE_ORIENT_SPECIFIC 3
02944
02945 #define ATRNAME_ORIENT_GENERAL "ORIENT_GENERAL"
02946 #define ATRTYPE_ORIENT_GENERAL ATR_FLOAT_TYPE
02947 #define ATRSIZE_ORIENT_GENERAL 9
02948
02949 #define ATRNAME_ORIGIN "ORIGIN"
02950 #define ATRTYPE_ORIGIN ATR_FLOAT_TYPE
02951 #define ATRSIZE_ORIGIN 3
02952
02953 #define ATRNAME_DELTA "DELTA"
02954 #define ATRTYPE_DELTA ATR_FLOAT_TYPE
02955 #define ATRSIZE_DELTA 3
02956
02957 #define ATRNAME_SKIP "SKIP"
02958 #define ATRTYPE_SKIP ATR_FLOAT_TYPE
02959 #define ATRSIZE_SKIP 3
02960
02961 #define ATRNAME_MARKSXYZ "MARKS_XYZ"
02962 #define ATRTYPE_MARKSXYZ ATR_FLOAT_TYPE
02963 #define ATRSIZE_MARKSXYZ MARKS_FSIZE
02964
02965 #define ATRNAME_MARKSLAB "MARKS_LAB"
02966 #define ATRTYPE_MARKSLAB ATR_STRING_TYPE
02967 #define ATRSIZE_MARKSLAB MARKS_LSIZE
02968
02969 #define ATRNAME_MARKSHELP "MARKS_HELP"
02970 #define ATRTYPE_MARKSHELP ATR_STRING_TYPE
02971 #define ATRSIZE_MARKSHELP MARKS_HSIZE
02972
02973 #define ATRNAME_MARKSFLAG "MARKS_FLAGS"
02974 #define ATRTYPE_MARKSFLAG ATR_INT_TYPE
02975 #define ATRSIZE_MARKSFLAG MARKS_MAXFLAG
02976
02977 #define ATRNAME_TYPESTRING "TYPESTRING"
02978 #define ATRTYPE_TYPESTRING ATR_STRING_TYPE
02979 #define ATRSIZE_TYPESTRING 0
02980
02981 #define ATRNAME_WARP_TYPE "WARP_TYPE"
02982 #define ATRTYPE_WARP_TYPE ATR_INT_TYPE
02983 #define ATRSIZE_WARP_TYPE 8
02984
02985 #define ATRNAME_WARP_DATA "WARP_DATA"
02986 #define ATRTYPE_WARP_DATA ATR_FLOAT_TYPE
02987 #define ATRSIZE_WARP_DATA 0
02988
02989 #define ATRNAME_WARP_PARENT "WARP_PARENTNAME"
02990 #define ATRTYPE_WARP_PARENT ATR_STRING_TYPE
02991 #define ATRSIZE_WARP_PARENT 0
02992
02993 #define ATRNAME_SCENE_TYPE "SCENE_DATA"
02994 #define ATRTYPE_SCENE_TYPE ATR_INT_TYPE
02995 #define ATRSIZE_SCENE_TYPE 8
02996
02997 #define ATRNAME_DATASET_RANK "DATASET_RANK"
02998 #define ATRTYPE_DATASET_RANK ATR_INT_TYPE
02999 #define ATRSIZE_DATASET_RANK 8
03000
03001 #define ATRNAME_DATASET_DIMENSIONS "DATASET_DIMENSIONS"
03002 #define ATRTYPE_DATASET_DIMENSIONS ATR_INT_TYPE
03003 #define ATRSIZE_DATASET_DIMENSIONS THD_MAX_RANK_EVER
03004
03005 #define ATRNAME_MINMAX "MINMAX"
03006 #define ATRTYPE_MINMAX ATR_INT_TYPE
03007
03008 #if 0
03009 # define ATRNAME_DATASET_PREFIX "DATASET_PREFIX"
03010 # define ATRTYPE_DATASET_PREFIX ATR_STRING_TYPE
03011 # define ATRSIZE_DATASET_PREFIX THD_MAX_PREFIX
03012
03013 # define ATRNAME_DATASET_VIEWCODE "DATASET_VIEWCODE"
03014 # define ATRTYPE_DATASET_VIEWCODE ATR_STRING_TYPE
03015 # define ATRSIZE_DATASET_VIEWCODE THD_MAX_VIEWCODE
03016 #endif
03017
03018
03019
03020 #define ATRNAME_BRICK_TYPES "BRICK_TYPES"
03021 #define ATRTYPE_BRICK_TYPES ATR_INT_TYPE
03022 #define ATRSIZE_BRICK_TYPES 0
03023
03024 #define ATRNAME_BRICK_STATS "BRICK_STATS"
03025 #define ATRTYPE_BRICK_STATS ATR_FLOAT_TYPE
03026 #define ATRSIZE_BRICK_STATS 0
03027
03028 #define ATRNAME_BRICK_FLTFAC "BRICK_FLOAT_FACS"
03029 #define ATRTYPE_BRICK_FLTFAC ATR_FLOAT_TYPE
03030 #define ATRSIZE_BRICK_FLTFAC 0
03031
03032
03033
03034 #define ATRNAME_STAT_AUX "STAT_AUX"
03035 #define ATRTYPE_STAT_AUX ATR_FLOAT_TYPE
03036 #define ATRSIZE_STAT_AUX 0
03037
03038
03039
03040 #define ATRNAME_TAXIS_NUMS "TAXIS_NUMS"
03041 #define ATRSIZE_TAXIS_NUMS 8
03042
03043 #define ATRNAME_TAXIS_FLOATS "TAXIS_FLOATS"
03044 #define ATRSIZE_TAXIS_FLOATS 8
03045
03046 #define ATRNAME_TAXIS_OFFSETS "TAXIS_OFFSETS"
03047 #define ATRSIZE_TAXIS_OFFSETS 0
03048
03049
03050
03051 #define ATRNAME_BRICK_LABS "BRICK_LABS"
03052 #define ATRNAME_BRICK_STATAUX "BRICK_STATAUX"
03053 #define ATRNAME_BRICK_KEYWORDS "BRICK_KEYWORDS"
03054
03055 #define ATRNAME_KEYWORDS "DATASET_KEYWORDS"
03056
03057
03058
03059
03060 #ifndef DONT_USE_SCANDIR
03061 #ifdef SCANDIR_WANTS_CONST
03062 extern int THD_select_dirent( const struct dirent * dp ) ;
03063 #else
03064 extern int THD_select_dirent( struct dirent * dp ) ;
03065 #endif
03066 #endif
03067
03068 char * ig_strstr( char *, char *, char * ) ;
03069 void freeup_strings( int n , char **sar ) ;
03070 int breakup_string( char *sin , char ***stok ) ;
03071
03072 extern THD_string_array * THD_get_all_filenames( char * ) ;
03073 extern THD_string_array * THD_extract_regular_files( THD_string_array * ) ;
03074 extern THD_string_array * THD_extract_directories( THD_string_array * ) ;
03075 extern int THD_is_file ( char * ) ;
03076 extern int THD_is_symlink ( char * ) ;
03077 extern int THD_is_directory( char * ) ;
03078 extern int THD_is_ondisk ( char * ) ;
03079 extern int THD_mkdir ( char * ) ;
03080 extern int THD_cwd ( char * ) ;
03081 extern int THD_equiv_files ( char * , char * ) ;
03082 extern unsigned long THD_filesize( char * pathname ) ;
03083 extern THD_string_array * THD_get_all_subdirs( int , char * ) ;
03084 extern THD_string_array * THD_normalize_flist( THD_string_array * ) ;
03085 extern THD_string_array * THD_get_wildcard_filenames( char * ) ;
03086
03087 extern time_t THD_file_mtime( char * ) ;
03088
03089 extern THD_string_array * THD_get_all_executables( char * ) ;
03090 extern THD_string_array * THD_getpathprogs( THD_string_array * );
03091 extern int THD_is_executable( char * pathname ) ;
03092 extern char * THD_find_executable( char * ) ;
03093
03094 extern int THD_is_dataset( char * , char * , int ) ;
03095 extern char * THD_dataset_headname( char * , char * , int ) ;
03096
03097 extern MRI_IMARR * THD_get_all_timeseries( char * ) ;
03098 extern MRI_IMARR * THD_get_many_timeseries( THD_string_array * ) ;
03099 extern char * THD_trailname( char * fname , int lev ) ;
03100
03101 extern int THD_linecount( char * ) ;
03102
03103 extern void THD_read_all_atr ( char * , THD_datablock * ) ;
03104 extern void THD_erase_all_atr( THD_datablock * ) ;
03105 extern void THD_erase_one_atr( THD_datablock * , char * ) ;
03106 extern void THD_read_niml_atr( char * , THD_datablock * ) ;
03107
03108 extern void THD_anonymize_dset ( THD_3dim_dataset * ) ;
03109 extern void THD_anonymize_write( int ) ;
03110
03111 extern ATR_any * THD_find_atr ( THD_datablock * , char * ) ;
03112 extern ATR_float * THD_find_float_atr ( THD_datablock * , char * ) ;
03113 extern ATR_int * THD_find_int_atr ( THD_datablock * , char * ) ;
03114 extern ATR_string * THD_find_string_atr( THD_datablock * , char * ) ;
03115
03116 extern void THD_set_atr( THD_datablock * , char * , int,int, void * ) ;
03117
03118 extern ATR_any * THD_copy_atr( ATR_any *atr ) ;
03119 extern void THD_insert_atr( THD_datablock *blk , ATR_any *atr ) ;
03120
03121 extern void THD_store_dataset_keywords ( THD_3dim_dataset * , char * ) ;
03122 extern void THD_append_dataset_keywords( THD_3dim_dataset * , char * ) ;
03123 extern char * THD_dataset_info( THD_3dim_dataset * , int ) ;
03124 extern char * THD_zzprintf( char * sss , char * fmt , ... ) ;
03125
03126 extern void THD_set_float_atr( THD_datablock * , char * , int , float * ) ;
03127 extern void THD_set_int_atr ( THD_datablock * , char * , int , int * ) ;
03128 extern void THD_set_char_atr ( THD_datablock * , char * , int , char * ) ;
03129
03130
03131
03132 #define THD_set_string_atr(blk,name,str) \
03133 THD_set_char_atr( (blk) , (name) , strlen(str)+1 , (str) )
03134
03135 extern void THD_init_diskptr_names( THD_diskptr *, char *,char *,char * ,
03136 int, Boolean ) ;
03137
03138 extern THD_datablock * THD_init_one_datablock( char *,char * ) ;
03139 extern THD_datablock_array * THD_init_prefix_datablocks( char *, THD_string_array * ) ;
03140
03141 extern XtPointer_array * THD_init_alldir_datablocks( char * ) ;
03142
03143 extern THD_session * THD_init_session( char * ) ;
03144 extern void THD_order_session( THD_session * ) ;
03145
03146 extern THD_3dim_dataset * THD_open_one_dataset( char * ) ;
03147 extern THD_3dim_dataset * THD_open_dataset( char * ) ;
03148 extern THD_3dim_dataset * THD_open_minc( char * ) ;
03149 extern THD_3dim_dataset * THD_open_analyze( char * ) ;
03150 extern THD_3dim_dataset * THD_open_ctfmri( char * ) ;
03151 extern THD_3dim_dataset * THD_open_ctfsam( char * ) ;
03152 extern THD_3dim_dataset * THD_open_1D( char * ) ;
03153 extern THD_3dim_dataset * THD_open_3D( char * ) ;
03154 extern THD_3dim_dataset * THD_open_nifti( char * ) ;
03155 extern THD_3dim_dataset * THD_open_mpeg( char * ) ;
03156 extern THD_3dim_dataset * THD_open_tcat( char * ) ;
03157
03158 extern void THD_datablock_apply_atr( THD_3dim_dataset * ) ;
03159
03160 extern THD_3dim_dataset * THD_fetch_dataset (char *) ;
03161 extern XtPointer_array * THD_fetch_many_datasets(char *) ;
03162 extern MRI_IMAGE * THD_fetch_1D (char *) ;
03163
03164 extern void THD_set_storage_mode( THD_3dim_dataset *,int );
03165
03166 extern int * MCW_get_intlist( int , char * ) ;
03167 extern void MCW_intlist_allow_negative( int ) ;
03168
03169
03170 extern THD_3dim_dataset * THD_copy_dset_subs( THD_3dim_dataset * , int * ) ;
03171
03172
03173
03174 #define MASTER_SHORTHELP_STRING \
03175 "INPUT DATASET NAMES\n" \
03176 "-------------------\n" \
03177 "This program accepts datasets that are modified on input according to the\n" \
03178 "following schemes:\n" \
03179 " 'r1+orig[3..5]' {sub-brick selector}\n" \
03180 " 'r1+orig<100.200>' {sub-range selector}\n" \
03181 " 'r1+orig[3..5]<100..200>' {both selectors}\n" \
03182 " '3dcalc( -a r1+orig -b r2+orig -expr 0.5*(a+b) )' {calculation}\n" \
03183 "For the gruesome details, see the output of 'afni -help'.\n"
03184
03185
03186
03187 #define MASTER_HELP_STRING \
03188 "INPUT DATASET NAMES\n" \
03189 "-------------------\n" \
03190 " An input dataset is specified using one of these forms:\n" \
03191 " 'prefix+view', 'prefix+view.HEAD', or 'prefix+view.BRIK'.\n" \
03192 " You can also add a sub-brick selection list after the end of the\n" \
03193 " dataset name. This allows only a subset of the sub-bricks to be\n" \
03194 " read in (by default, all of a dataset's sub-bricks are input).\n" \
03195 " A sub-brick selection list looks like one of the following forms:\n" \
03196 " fred+orig[5] ==> use only sub-brick #5\n" \
03197 " fred+orig[5,9,17] ==> use #5, #9, and #12\n" \
03198 " fred+orig[5..8] or [5-8] ==> use #5, #6, #7, and #8\n" \
03199 " fred+orig[5..13(2)] or [5-13(2)] ==> use #5, #7, #9, #11, and #13\n" \
03200 " Sub-brick indexes start at 0. You can use the character '$'\n" \
03201 " to indicate the last sub-brick in a dataset; for example, you\n" \
03202 " can select every third sub-brick by using the selection list\n" \
03203 " fred+orig[0..$(3)]\n" \
03204 "\n" \
03205 " N.B.: The sub-bricks are read in the order specified, which may\n" \
03206 " not be the order in the original dataset. For example, using\n" \
03207 " fred+orig[0..$(2),1..$(2)]\n" \
03208 " will cause the sub-bricks in fred+orig to be input into memory\n" \
03209 " in an interleaved fashion. Using\n" \
03210 " fred+orig[$..0]\n" \
03211 " will reverse the order of the sub-bricks.\n" \
03212 "\n" \
03213 " N.B.: You may also use the syntax <a..b> after the name of an input \n" \
03214 " dataset to restrict the range of values read in to the numerical\n" \
03215 " values in a..b, inclusive. For example,\n" \
03216 " fred+orig[5..7]<100..200>\n" \
03217 " creates a 3 sub-brick dataset with values less than 100 or\n" \
03218 " greater than 200 from the original set to zero.\n" \
03219 " If you use the <> sub-range selection without the [] sub-brick\n" \
03220 " selection, it is the same as if you had put [0..$] in front of\n" \
03221 " the sub-range selection.\n" \
03222 "\n" \
03223 " N.B.: Datasets using sub-brick/sub-range selectors are treated as:\n" \
03224 " - 3D+time if the dataset is 3D+time and more than 1 brick is chosen\n" \
03225 " - otherwise, as bucket datasets (-abuc or -fbuc)\n" \
03226 " (in particular, fico, fitt, etc datasets are converted to fbuc!)\n" \
03227 "\n" \
03228 " N.B.: The characters '$ ( ) [ ] < >' are special to the shell,\n" \
03229 " so you will have to escape them. This is most easily done by\n" \
03230 " putting the entire dataset plus selection list inside forward\n" \
03231 " single quotes, as in 'fred+orig[5..7,9]', or double quotes \"x\".\n"
03232
03233
03234
03235 #define CALC_HELP_STRING \
03236 "CALCULATED DATASETS\n" \
03237 "-------------------\n" \
03238 " Datasets may also be specified as runtime-generated results from\n" \
03239 " program 3dcalc. This type of dataset specifier is enclosed in\n" \
03240 " quotes, and starts with the string '3dcalc(':\n" \
03241 " '3dcalc( opt opt ... opt )'\n" \
03242 " where each 'opt' is an option to program 3dcalc; this program\n" \
03243 " is run to generate a dataset in the directory given by environment\n" \
03244 " variable TMPDIR (default=/tmp). This dataset is then read into\n" \
03245 " memory, locked in place, and deleted from disk. For example\n" \
03246 " afni -dset '3dcalc( -a r1+orig -b r2+orig -expr 0.5*(a+b) )'\n" \
03247 " will let you look at the average of datasets r1+orig and r2+orig.\n" \
03248 " N.B.: using this dataset input method will use lots of memory!\n"
03249
03250
03251
03252 #define TS_HELP_STRING \
03253 "TIMESERIES (1D) INPUT\n" \
03254 "---------------------\n" \
03255 "A timeseries file is in the form of a 1D or 2D table of ASCII numbers;\n" \
03256 "for example: 3 5 7\n" \
03257 " 2 4 6\n" \
03258 " 0 3 3\n" \
03259 " 7 2 9\n" \
03260 "This example has 3 rows and 4 columns. Each column is considered as\n" \
03261 "a timeseries in AFNI. The convention is to store this type of data\n" \
03262 "in a filename ending in '.1D'.\n" \
03263 "\n" \
03264 "When specifying a timeseries file to an command-line AFNI program, you\n" \
03265 "can select a subset of columns using the '[...]' notation:\n" \
03266 " 'fred.1D[5]' ==> use only column #5\n" \
03267 " 'fred.1D[5,9,17]' ==> use columns #5, #9, and #12\n" \
03268 " 'fred.1D[5..8]' ==> use columns #5, #6, #7, and #8\n" \
03269 " 'fred.1D[5..13(2)]' ==> use columns #5, #7, #9, #11, and #13\n" \
03270 "Sub-brick indexes start at 0. You can use the character '$'\n" \
03271 "to indicate the last sub-brick in a dataset; for example, you\n" \
03272 "can select every third sub-brick by using the selection list\n" \
03273 " 'fred.1D[0..$(3)]' ==> use columns #0, #3, #6, #9, ....\n" \
03274 "Similarly, you select a subset of the rows using the '{...}' notation:\n" \
03275 " 'fred.1D{0..$(2)}' ==> use rows #0, #2, #4, ....\n" \
03276 "You can also use both notations together, as in\n" \
03277 " 'fred.1D[1,3]{1..$(2)}' ==> columns #1 and #3; rows #1, #3, #5, ....\n" \
03278 "\n" \
03279 "You can also input a 1D time series 'dataset' directly on the command\n" \
03280 "line, without an external file. The 'filename' for such input has the\n" \
03281 "general format\n" \
03282 " '1D:n_1@val_1,n_2@val_2,n_3@val_3,...'\n" \
03283 "where each 'n_i' is an integer and each 'val_i' is a float. For\n" \
03284 "example\n" \
03285 " -a '1D:5@0,10@1,5@0,10@1,5@0'\n" \
03286 "specifies that variable 'a' be assigned to a 1D time series of 35,\n" \
03287 "alternating in blocks between values 0 and value 1.\n"
03288
03289 extern void THD_delete_3dim_dataset( THD_3dim_dataset * , Boolean ) ;
03290 extern THD_3dim_dataset * THD_3dim_from_block( THD_datablock * ) ;
03291 extern void THD_allow_empty_dataset( int ) ;
03292 extern THD_3dim_dataset_array *
03293 THD_array_3dim_from_block( THD_datablock_array * blk_arr ) ;
03294
03295 extern Boolean THD_write_3dim_dataset( char *,char * ,
03296 THD_3dim_dataset * , Boolean );
03297
03298 extern void THD_use_3D_format ( int ) ;
03299 extern void THD_use_NIFTI_format( int ) ;
03300
03301 extern Boolean THD_write_datablock( THD_datablock * , Boolean ) ;
03302 extern Boolean THD_write_atr( THD_datablock * ) ;
03303 extern Boolean THD_write_nimlatr( THD_datablock * ) ;
03304 extern void THD_set_write_compression( int mm ) ;
03305 extern int THD_enviro_write_compression(void) ;
03306 extern int THD_get_write_compression(void) ;
03307
03308 extern void THD_set_write_order( int ) ;
03309 extern void THD_enviro_write_order(void) ;
03310 extern int THD_get_write_order(void) ;
03311
03312 extern int TRUST_host(char *) ;
03313 #define OKHOST(hh) TRUST_host(hh) ;
03314 extern void TRUST_addhost(char *) ;
03315
03316 extern Boolean THD_load_datablock( THD_datablock * ) ;
03317 extern void THD_load_datablock_verbose(int) ;
03318 extern void THD_set_freeup( generic_func * ) ;
03319 extern Boolean THD_purge_datablock( THD_datablock * , int ) ;
03320 extern Boolean THD_purge_one_brick( THD_datablock * , int ) ;
03321 extern void THD_force_malloc_type( THD_datablock * , int ) ;
03322 extern int THD_count_databricks( THD_datablock * dblk ) ;
03323 extern void THD_load_minc( THD_datablock * ) ;
03324 extern void THD_load_analyze( THD_datablock * ) ;
03325 extern void THD_load_ctfmri ( THD_datablock * ) ;
03326 extern void THD_load_ctfsam ( THD_datablock * ) ;
03327 extern void THD_load_1D ( THD_datablock * ) ;
03328 extern void THD_load_3D ( THD_datablock * ) ;
03329 extern void THD_load_nifti ( THD_datablock * ) ;
03330 extern void THD_load_mpeg ( THD_datablock * ) ;
03331 extern void THD_load_tcat ( THD_datablock * ) ;
03332
03333 extern void THD_zerofill_dataset( THD_3dim_dataset * ) ;
03334
03335 extern int THD_datum_constant( THD_datablock * ) ;
03336 #define DSET_datum_constant(ds) THD_datum_constant((ds)->dblk)
03337
03338 #define ALLOW_FSL_FEAT
03339
03340 #define MINC_FLOATIZE_MASK 1
03341 extern int THD_write_minc( char *, THD_3dim_dataset * , int ) ;
03342
03343 extern void THD_write_1D ( char *, char *, THD_3dim_dataset *);
03344 extern void THD_write_3D ( char *, char *, THD_3dim_dataset *);
03345
03346 extern void THD_reconcile_parents( THD_sessionlist * ) ;
03347 extern THD_slist_find THD_dset_in_sessionlist( int,void *, THD_sessionlist *, int ) ;
03348 extern THD_slist_find THD_dset_in_session( int,void * , THD_session * ) ;
03349
03350 extern void THD_check_idcodes( THD_sessionlist * ) ;
03351
03352 extern void THD_load_statistics( THD_3dim_dataset * ) ;
03353 extern void THD_update_statistics( THD_3dim_dataset * ) ;
03354 extern THD_brick_stats THD_get_brick_stats( MRI_IMAGE * ) ;
03355 extern void THD_update_one_bstat( THD_3dim_dataset * , int ) ;
03356
03357 extern THD_fvec3 THD_3dind_to_3dmm( THD_3dim_dataset * , THD_ivec3 ) ;
03358 extern THD_fvec3 THD_3dind_to_3dmm_no_wod( THD_3dim_dataset * , THD_ivec3 ) ;
03359 extern THD_ivec3 THD_3dmm_to_3dind( THD_3dim_dataset * , THD_fvec3 ) ;
03360 extern THD_ivec3 THD_3dmm_to_3dind_no_wod( THD_3dim_dataset * , THD_fvec3 ) ;
03361
03362
03363 extern THD_fvec3 THD_3dfind_to_3dmm( THD_3dim_dataset * , THD_fvec3 ) ;
03364 extern THD_fvec3 THD_3dmm_to_3dfind( THD_3dim_dataset * , THD_fvec3 ) ;
03365
03366 extern THD_fvec3 THD_3dmm_to_dicomm( THD_3dim_dataset * , THD_fvec3 ) ;
03367 extern THD_fvec3 THD_dicomm_to_3dmm( THD_3dim_dataset * , THD_fvec3 ) ;
03368
03369 extern THD_fvec3 THD_tta_to_mni( THD_fvec3 ) ;
03370 extern THD_fvec3 THD_mni_to_tta( THD_fvec3 ) ;
03371 extern void THD_3mni_to_3tta( float *, float *, float *) ;
03372 extern void THD_3tta_to_3mni( float *, float *, float *) ;
03373
03374 extern float THD_timeof ( int , float , THD_timeaxis * ) ;
03375 extern float THD_timeof_vox ( int , int , THD_3dim_dataset * ) ;
03376 extern float THD_timeof_slice( int , int , THD_3dim_dataset * ) ;
03377
03378 extern THD_fvec3 THD_dataset_center( THD_3dim_dataset * ) ;
03379 extern int THD_dataset_mismatch(THD_3dim_dataset *, THD_3dim_dataset *) ;
03380
03381 extern int THD_dataset_tshift( THD_3dim_dataset * , int ) ;
03382
03383 #define MISMATCH_CENTER (1<<0)
03384 #define MISMATCH_DELTA (1<<1)
03385 #define MISMATCH_ORIENT (1<<2)
03386 #define MISMATCH_DIMEN (1<<3)
03387
03388
03389
03390
03391
03392
03393
03394
03395
03396
03397
03398
03399
03400
03401 typedef struct FD_brick {
03402
03403 THD_ivec3 nxyz ;
03404 THD_ivec3 sxyz ;
03405 THD_ivec3 a123 ;
03406
03407 int n1 ;
03408 int d1 ;
03409 int e1 ;
03410 int n2 ;
03411 int d2 ;
03412 int e2 ;
03413 int n3 ;
03414 int d3 ;
03415 int start ;
03416
03417 float del1 ;
03418 float del2 ;
03419 float del3 ;
03420
03421 THD_3dim_dataset * dset ;
03422 int resam_code ;
03423 int thr_resam_code ;
03424
03425 char namecode[32] ;
03426
03427 XtPointer parent ;
03428 } FD_brick ;
03429
03430
03431
03432 #define ROT3(a,b,c,na,nb,nc) ((na)=(b),(nb)=(c),(nc)=(a))
03433
03434
03435
03436 #define BRICK_DRAWABLE(br) ((br)->n1 > 1 && (br)->n2 > 1)
03437 #define BRICK_GRAPHABLE(br) ((br)->n1 >= 1 && (br)->n2 >= 1)
03438
03439 extern FD_brick * THD_3dim_dataset_to_brick( THD_3dim_dataset * ,
03440 int,int,int ) ;
03441
03442 extern MRI_IMAGE * FD_brick_to_mri( int,int , FD_brick * br ) ;
03443 extern MRI_IMAGE * FD_brick_to_series( int , FD_brick * br ) ;
03444
03445 extern float THD_get_voxel( THD_3dim_dataset *dset , int ijk , int ival ) ;
03446
03447 extern MRI_IMAGE * THD_extract_series( int , THD_3dim_dataset * , int ) ;
03448 extern MRI_IMARR * THD_extract_many_series( int, int *, THD_3dim_dataset * );
03449
03450 extern int THD_extract_array( int, THD_3dim_dataset *, int, void * ) ;
03451
03452 extern MRI_IMAGE * THD_extract_float_brick( int , THD_3dim_dataset * ) ;
03453
03454 extern void THD_insert_series( int, THD_3dim_dataset *, int, int, void *, int );
03455
03456
03457
03458 extern void get_linear_trend ( int, float *, float *, float * ) ;
03459 extern void THD_linear_detrend ( int, float *, float *, float * ) ;
03460 extern void get_quadratic_trend ( int, float *, float *, float *, float * ) ;
03461 extern void THD_quadratic_detrend( int, float *, float *, float *, float * ) ;
03462 extern void THD_normalize ( int, float * ) ;
03463 extern void THD_cubic_detrend ( int, float * ) ;
03464
03465 extern void THD_const_detrend ( int, float *, float * );
03466
03467 extern void THD_generic_detrend( int, float *, int, int, float ** ) ;
03468
03469 #define DETREND_linear(n,f) THD_linear_detrend(n,f,NULL,NULL)
03470 #define DETREND_quadratic(n,f) THD_quadratic_detrend(n,f,NULL,NULL,NULL)
03471 #define DETREND_cubic(n,f) THD_cubic_detrend(n,f)
03472 #define DETREND_const(n,f) THD_const_detrend(n,f,NULL)
03473
03474
03475
03476 #define DETREND_polort(p,n,f) \
03477 do{ switch(p){ default: break; \
03478 case 0: DETREND_const(n,f) ; break; \
03479 case 1: DETREND_linear(n,f) ; break; \
03480 case 2: DETREND_quadratic(n,f); break; \
03481 case 3: DETREND_cubic(n,f) ; break; } } while(0)
03482
03483
03484
03485 extern THD_ivec3 THD_fdind_to_3dind( FD_brick * , THD_ivec3 ) ;
03486 extern THD_ivec3 THD_3dind_to_fdind( FD_brick * , THD_ivec3 ) ;
03487
03488 extern THD_fvec3 THD_fdfind_to_3dfind( FD_brick *, THD_fvec3) ;
03489 extern THD_fvec3 THD_3dfind_to_fdfind( FD_brick *, THD_fvec3) ;
03490
03491 extern FD_brick ** THD_setup_bricks( THD_3dim_dataset * ) ;
03492
03493 extern FD_brick * THD_oriented_brick( THD_3dim_dataset *, char *) ;
03494
03495 extern int thd_floatscan ( int , float * ) ;
03496 extern int thd_complexscan( int , complex * ) ;
03497
03498 extern byte * THD_makemask( THD_3dim_dataset *, int,float,float) ;
03499 extern int THD_countmask( int , byte * ) ;
03500 extern byte * THD_automask( THD_3dim_dataset * ) ;
03501 extern void THD_automask_verbose( int ) ;
03502 extern void THD_automask_extclip( int ) ;
03503 extern byte * mri_automask_image( MRI_IMAGE * ) ;
03504 extern byte * mri_automask_imarr( MRI_IMARR * ) ;
03505
03506 extern void THD_autobbox( THD_3dim_dataset * ,
03507 int *, int * , int *, int * , int *, int * ) ;
03508 extern void MRI_autobbox( MRI_IMAGE * ,
03509 int *, int * , int *, int * , int *, int * ) ;
03510
03511 extern int THD_mask_fillin_completely( int,int,int, byte *, int ) ;
03512 extern int THD_mask_fillin_once ( int,int,int, byte *, int ) ;
03513
03514 extern int THD_mask_clip_neighbors( int,int,int, byte *, float,float,float *) ;
03515
03516 extern void THD_mask_clust( int nx, int ny, int nz, byte *mmm ) ;
03517 extern void THD_mask_erode( int nx, int ny, int nz, byte *mmm ) ;
03518
03519 extern int THD_peel_mask( int nx, int ny, int nz , byte *mmm, int pdepth ) ;
03520
03521 extern void THD_mask_dilate( int, int, int, byte *, int ) ;
03522
03523 extern float THD_cliplevel( MRI_IMAGE * , float ) ;
03524 extern MRI_IMAGE * THD_median_brick( THD_3dim_dataset * ) ;
03525 extern MRI_IMAGE * THD_mean_brick ( THD_3dim_dataset * ) ;
03526 extern MRI_IMAGE * THD_rms_brick ( THD_3dim_dataset * ) ;
03527
03528
03529
03530 extern int THD_get_dset_rowcount( THD_3dim_dataset *, int ) ;
03531 extern void * THD_get_dset_row( THD_3dim_dataset *, int, int, int,int,int ) ;
03532 extern void THD_put_dset_row( THD_3dim_dataset *, int,
03533 int, int,int,int, void * row ) ;
03534 extern int THD_dataset_rowfillin( THD_3dim_dataset *, int, int, int ) ;
03535 extern int THD_dataset_zfillin( THD_3dim_dataset *, int, int, int ) ;
03536
03537
03538
03539
03540 #define DELTA_AFTER 1
03541 #define DELTA_BEFORE 2
03542 #define DELTA_FIXED 3
03543
03544
03545
03546 extern void THD_rotangle_user_to_dset( THD_3dim_dataset * ,
03547 float,char, float,char, float,char,
03548 float*,int* , float*,int* , float*,int* );
03549
03550 extern int THD_axcode( THD_3dim_dataset * , char ) ;
03551 extern int THD_handedness( THD_3dim_dataset * ) ;
03552
03553 extern THD_dmat33 DBLE_mat_to_dicomm( THD_3dim_dataset * ) ;
03554 extern THD_mat33 SNGL_mat_to_dicomm( THD_3dim_dataset * ) ;
03555
03556 extern THD_dvecmat THD_rotcom_to_matvec( THD_3dim_dataset * , char * ) ;
03557
03558
03559
03560 extern void THD_rota_method( int ) ;
03561
03562 extern void THD_rota_setpad( int,int,int ) ;
03563 extern void THD_rota_clearpad(void) ;
03564
03565 extern void THD_rota_vol( int, int, int, float, float, float, float *,
03566 int,float, int,float, int,float,
03567 int,float,float,float ) ;
03568
03569 extern MRI_IMAGE * THD_rota3D( MRI_IMAGE * ,
03570 int,float, int,float, int,float,
03571 int,float,float,float ) ;
03572
03573 extern MRI_IMAGE * THD_rota3D_matvec( MRI_IMAGE *, THD_dmat33,THD_dfvec3 ) ;
03574
03575
03576
03577 extern void THD_rota_vol_matvec( int, int, int, float, float, float, float *,
03578 THD_dmat33 , THD_dfvec3 ) ;
03579
03580 extern THD_dvecmat DLSQ_rot_trans( int, THD_dfvec3 *, THD_dfvec3 *, double * );
03581 extern THD_dvecmat DLSQ_affine ( int, THD_dfvec3 *, THD_dfvec3 * );
03582 extern THD_dvecmat DLSQ_rotscl ( int, THD_dfvec3 *, THD_dfvec3 *, int );
03583
03584 extern THD_dvecmat THD_read_dvecmat( char * , int ) ;
03585
03586
03587
03588 #define TM_IXY 2
03589 #define TM_IYZ 0
03590 #define TM_IZX 1
03591
03592
03593
03594 typedef struct {
03595 int nmask[3] ;
03596 byte * mask[3] ;
03597 } Tmask ;
03598
03599 extern void free_Tmask( Tmask * ) ;
03600 extern Tmask * create_Tmask_byte( int, int, int, byte * ) ;
03601 extern Tmask * create_Tmask_rgba( int, int, int, rgba * ) ;
03602
03603 #define TM_ZLINE(tm,i) (tm==NULL || tm->mask[TM_IXY][i])
03604 #define TM_YLINE(tm,i) (tm==NULL || tm->mask[TM_IZX][i])
03605 #define TM_XLINE(tm,i) (tm==NULL || tm->mask[TM_IYZ][i])
03606
03607
03608
03609 extern void THD_rota_vol_byte( int, int, int, float, float, float, byte *,
03610 int,float, int,float, int,float,
03611 int,float,float,float , Tmask * ) ;
03612
03613 extern void THD_rota_byte_mode( int ) ;
03614
03615 extern void THD_rota_vol_matvec_byte( int, int, int, float, float, float, byte *,
03616 THD_mat33 , THD_fvec3 , Tmask * ) ;
03617
03618
03619
03620 extern void SHIFT_set_method( int ) ;
03621 extern int SHIFT_get_method( void ) ;
03622 extern void SHIFT_two_rows( int , int , float , float *, float , float *) ;
03623
03624 extern void fft_shift2 ( int , int , float , float *, float , float *) ;
03625 extern void hept_shift2 ( int , int , float , float *, float , float *) ;
03626 extern void quint_shift2( int , int , float , float *, float , float *) ;
03627 extern void cub_shift2 ( int , int , float , float *, float , float *) ;
03628 extern void lin_shift2 ( int , int , float , float *, float , float *) ;
03629 extern void nn_shift2 ( int , int , float , float *, float , float *) ;
03630 extern void ts_shift2 ( int , int , float , float *, float , float *) ;
03631
03632 extern void hept_shift ( int , float , float *) ;
03633 extern void nn_shift ( int , float , float *) ;
03634 extern void lin_shift ( int , float , float *) ;
03635 extern void cub_shift ( int , float , float *) ;
03636 extern void quint_shift( int , float , float *) ;
03637
03638 extern void THD_fftshift( THD_3dim_dataset *, float,float,float, int ) ;
03639
03640
03641
03642
03643
03644 typedef struct {
03645 MRI_IMARR * fitim ;
03646 double * chol_fitim ;
03647 int xa,xb , ya,yb , za,zb ;
03648 } MRI_3dalign_basis ;
03649
03650 extern void mri_3dalign_edging( int , int , int ) ;
03651 extern void mri_3dalign_edging_default( int , int , int ) ;
03652 extern void mri_3dalign_force_edging( int ) ;
03653 extern void mri_3dalign_wtrimming( int ) ;
03654 extern void mri_3dalign_wproccing( int ) ;
03655 extern void mri_3dalign_scaleinit( float ) ;
03656
03657 extern void mri_3dalign_params( int , float , float , float ,
03658 int , int , int , int ) ;
03659
03660 extern void mri_3dalign_method( int , int , int , int ) ;
03661
03662 extern void mri_3dalign_final_regmode( int ) ;
03663
03664 extern MRI_3dalign_basis * mri_3dalign_setup( MRI_IMAGE * , MRI_IMAGE * ) ;
03665 extern MRI_IMAGE * mri_3dalign_one( MRI_3dalign_basis * , MRI_IMAGE * ,
03666 float *, float *, float *,
03667 float *, float *, float * ) ;
03668 extern MRI_IMARR * mri_3dalign_many( MRI_IMAGE *, MRI_IMAGE * , MRI_IMARR *,
03669 float *, float *, float *,
03670 float *, float *, float * ) ;
03671 extern void mri_3dalign_cleanup( MRI_3dalign_basis * ) ;
03672
03673 extern void mri_3dalign_initvals( float,float,float,float,float,float ) ;
03674
03675
03676
03677
03678
03679 typedef struct {
03680 float min, max, ident, delta, toler ;
03681 float val_init , val_out , val_fixed ;
03682 int fixed ;
03683 char name[32] ;
03684 } MRI_warp3D_param_def ;
03685
03686
03687
03688 typedef struct {
03689
03690
03691
03692 int nparam ;
03693 MRI_warp3D_param_def *param ;
03694 float scale_init , scale_out ;
03695 float delfac , tolfac ;
03696 float twoblur ;
03697
03698 int regmode , verb , max_iter , num_iter , wtproc ;
03699 int xedge , yedge , zedge ;
03700 int regfinal ;
03701
03702 MRI_IMAGE *imbase , *imwt ;
03703
03704 void (*vwfor)(float,float,float,float *,float *,float *) ;
03705 void (*vwinv)(float,float,float,float *,float *,float *) ;
03706 void (*vwset)(int,float *) ;
03707 float (*vwdet)(float,float,float) ;
03708
03709
03710
03711 int nfree ;
03712 MRI_IMAGE *imww ;
03713 MRI_IMAGE *imap ;
03714 MRI_IMAGE *imps ;
03715 MRI_IMAGE *imsk ;
03716 MRI_IMAGE *imps_blur ;
03717
03718 } MRI_warp3D_align_basis ;
03719
03720 extern int mri_warp3D_align_setup ( MRI_warp3D_align_basis * ) ;
03721 extern MRI_IMAGE * mri_warp3d_align_one ( MRI_warp3D_align_basis *, MRI_IMAGE * );
03722 extern void mri_warp3D_align_cleanup( MRI_warp3D_align_basis * ) ;
03723
03724
03725
03726 #if 0
03727 extern float THD_thresh_to_pval( float thr , THD_3dim_dataset * dset ) ;
03728 #endif
03729
03730 extern float THD_stat_to_pval ( float thr , int statcode , float * stataux ) ;
03731 extern float THD_pval_to_stat ( float pval, int statcode , float * stataux ) ;
03732 extern float THD_stat_to_zscore( float thr , int statcode , float * stataux ) ;
03733
03734 extern int THD_filename_ok( char * ) ;
03735 extern int THD_filename_pure( char * ) ;
03736 extern int THD_freemegabytes( char * ) ;
03737
03738 extern THD_warp * AFNI_make_voxwarp( THD_warp * , THD_3dim_dataset * ,
03739 THD_3dim_dataset * ) ;
03740
03741 extern THD_linear_mapping * AFNI_make_voxmap( THD_linear_mapping * ,
03742 THD_dataxes * , THD_dataxes * ) ;
03743
03744 extern void AFNI_concatenate_warp( THD_warp * , THD_warp * ) ;
03745
03746 extern THD_linear_mapping * AFNI_concatenate_lmap( THD_linear_mapping * ,
03747 THD_linear_mapping * ) ;
03748
03749 extern THD_warp * AFNI_make_affwarp_12(float,float,float,float,
03750 float,float,float,float,
03751 float,float,float,float );
03752
03753 extern THD_warp * AFNI_make_affwarp_mat ( THD_mat33 ) ;
03754 extern THD_warp * AFNI_make_affwarp_matvec( THD_mat33 , THD_fvec3 ) ;
03755
03756 extern THD_ivec3 THD_matrix_to_orientation( THD_mat33 R ) ;
03757
03758 extern THD_3dim_dataset * WINsorize( THD_3dim_dataset * ,
03759 int,int,int, float, char *, int,int,byte * );
03760
03761 #define ZPAD_EMPTY (1<<0)
03762 #define ZPAD_PURGE (1<<1)
03763 #define ZPAD_MM (1<<2)
03764
03765 extern THD_3dim_dataset * THD_zeropad( THD_3dim_dataset * ,
03766 int,int,int,int,int,int, char *, int );
03767
03768 extern THD_3dim_dataset * THD_warp3D(
03769 THD_3dim_dataset *,
03770 void w_in2out(float,float,float,float *,float *,float *),
03771 void w_out2in(float,float,float,float *,float *,float *),
03772 void * , char *, int , int ) ;
03773
03774 extern THD_3dim_dataset * THD_warp3D_affine(
03775 THD_3dim_dataset *, THD_vecmat, void *, char *, int, int );
03776
03777 extern THD_3dim_dataset * THD_warp3D_mni2tta( THD_3dim_dataset *, void *,
03778 char *, int, int );
03779 extern THD_3dim_dataset * THD_warp3D_tta2mni( THD_3dim_dataset *, void *,
03780 char *, int, int );
03781
03782 #define WARP3D_NEWGRID 1
03783 #define WARP3D_NEWDSET 2
03784 #define WARP3D_GRIDMASK 7
03785
03786
03787
03788 extern void ENTROPY_setup (void) ;
03789 extern void ENTROPY_setdown (void) ;
03790 extern void ENTROPY_accumulate(int , void *) ;
03791 extern double ENTROPY_compute (void) ;
03792 extern double ENTROPY_dataset (THD_3dim_dataset *) ;
03793 extern double ENTROPY_datablock (THD_datablock *) ;
03794
03795
03796
03797
03798
03799 #define MAX_DSET_NOTES 999
03800 #define MAX_NOTE_SIZE 4000
03801
03802 extern void tross_Add_Note (THD_3dim_dataset *, char *) ;
03803 extern void tross_Delete_Note(THD_3dim_dataset *, int ) ;
03804
03805 extern char * tross_Expand_String( char * ) ;
03806 extern char * tross_Encode_String( char * ) ;
03807 extern void tross_Dont_Encode_Slash( int ) ;
03808
03809 extern void tross_Store_Note ( THD_3dim_dataset * , int , char * ) ;
03810 extern char * tross_Get_Note ( THD_3dim_dataset * , int ) ;
03811 extern char * tross_Get_Notedate ( THD_3dim_dataset * , int ) ;
03812 extern int tross_Get_Notecount( THD_3dim_dataset * ) ;
03813
03814 extern void tross_Addto_History( THD_3dim_dataset *, THD_3dim_dataset *) ;
03815
03816 extern char * tross_datetime(void) ;
03817 extern char * tross_username(void) ;
03818 extern char * tross_hostname(void) ;
03819 extern char * tross_commandline( char * , int , char ** ) ;
03820
03821 extern int AFNI_logger( char * , int , char ** ) ;
03822 extern void AFNI_sleep( int ) ;
03823 #define AFNI_log_string(ss) AFNI_logger(ss,0,NULL)
03824
03825 extern void AFNI_serverlog( char * ) ;
03826
03827 void THD_outlier_count( THD_3dim_dataset *, float, int **, int * ) ;
03828
03829 extern void tross_Append_History ( THD_3dim_dataset * , char * ) ;
03830 extern char * tross_Get_History ( THD_3dim_dataset * ) ;
03831 extern void tross_Make_History ( char *, int, char **, THD_3dim_dataset * ) ;
03832 extern void tross_Copy_History ( THD_3dim_dataset *, THD_3dim_dataset * ) ;
03833 extern void tross_Replace_History( THD_3dim_dataset * , char * ) ;
03834
03835 #define tross_Erase_History(ds) THD_erase_one_atr((ds)->dblk,"HISTORY_NOTE")
03836
03837 extern char * tross_breakup_string( char *, int , int ) ;
03838
03839 #include <stdarg.h>
03840 void tross_multi_Append_History( THD_3dim_dataset * , ... ) ;
03841
03842
03843
03844 extern void B64_to_binary( int, byte *, int *, byte ** ) ;
03845 extern void B64_to_base64( int, byte *, int *, byte ** ) ;
03846 extern void B64_set_linelen( int ) ;
03847 extern void B64_set_crlf( int ) ;
03848
03849 extern char * MD5_static_array ( int , char * ) ;
03850 extern char * MD5_malloc_array ( int , char * ) ;
03851 extern char * MD5_static_string(char *) ;
03852 extern char * MD5_malloc_string(char *) ;
03853 extern char * MD5_static_file (char *) ;
03854 extern char * MD5_malloc_file (char *) ;
03855
03856 extern char * MD5_B64_array ( int , char * ) ;
03857 extern char * MD5_B64_string( char * ) ;
03858 extern char * MD5_B64_file (char * ) ;
03859 extern char * UNIQ_idcode(void) ;
03860 extern void UNIQ_idcode_fill(char *) ;
03861
03862
03863
03864 extern char * TT_whereami( float , float , float ) ;
03865 extern int TT_load_atlas (void);
03866 extern void TT_purge_atlas(void);
03867 extern THD_3dim_dataset * TT_retrieve_atlas(void) ;
03868
03869 extern THD_3dim_dataset * TT_retrieve_atlas_big(void) ;
03870 extern void TT_purge_atlas_big(void);
03871
03872 extern THD_3dim_dataset * TT_retrieve_atlas_either(void);
03873
03874 #define TT_ATLAS_NZ_SMALL 141
03875 #define TT_ATLAS_NZ_BIG 151
03876
03877 #define TT_retrieve_atlas_nz(nz) \
03878 ( ((nz)==TT_ATLAS_NZ_SMALL) \
03879 ? TT_retrieve_atlas() \
03880 : ((nz)==TT_ATLAS_NZ_BIG) ? TT_retrieve_atlas_big() : NULL )
03881
03882
03883
03884 extern float THD_spearman_corr( int,float *,float *) ;
03885 extern float THD_quadrant_corr( int,float *,float *) ;
03886 extern float THD_pearson_corr ( int,float *,float *) ;
03887
03888 extern THD_fvec3 THD_autonudge( THD_3dim_dataset *dsepi, int ivepi,
03889 THD_3dim_dataset *dsant, int ivant,
03890 float step,
03891 int xstep, int ystep, int zstep, int code ) ;
03892
03893 extern MRI_IMAGE * mri_brainormalize( MRI_IMAGE *, int,int,int , MRI_IMAGE **, MRI_IMAGE **) ;
03894 extern void mri_brainormalize_verbose( int ) ;
03895 extern void brainnormalize_coord( float ispat, float jspat, float kspat ,
03896 float *iorig, float *jorig, float *korig ,
03897 THD_3dim_dataset *origset,
03898 float *xrai_orig, float *yrai_orig, float *zrai_orig);
03899 extern MRI_IMAGE * mri_watershedize( MRI_IMAGE * , float ) ;
03900 extern void mri_brainormalize_initialize(float dx, float dy, float dz);
03901 extern float THD_BN_dxyz(void);
03902 extern int THD_BN_nx(void);
03903 extern int THD_BN_ny(void);
03904 extern int THD_BN_nz(void);
03905
03906
03907
03908 extern NI_group * THD_nimlize_dsetatr( THD_3dim_dataset *) ;
03909 extern void THD_dblkatr_from_niml( NI_group *, THD_datablock * ) ;
03910 extern void THD_set_dataset_attributes( THD_3dim_dataset * ) ;
03911
03912 extern THD_3dim_dataset * THD_niml_to_dataset( NI_group * , int ) ;
03913 extern int THD_add_bricks( THD_3dim_dataset * , void * ) ;
03914
03915 #define SBFLAG_INDEX (1<<0)
03916 #define SBFLAG_FACTOR (1<<1)
03917 #define SBFLAG_STATCODE (1<<2)
03918
03919 extern NI_element * THD_subbrick_to_niml( THD_3dim_dataset *, int , int ) ;
03920 extern NI_group * THD_dataset_to_niml( THD_3dim_dataset * ) ;
03921
03922 extern MRI_IMAGE * niml_to_mri( NI_element * ) ;
03923 extern NI_element * mri_to_niml( MRI_IMAGE * ) ;
03924
03925 #endif