00001
00002
00003
00004
00005
00006
00007 #undef MAIN
00008
00009 #include "afni.h"
00010 #include "mrilib.h"
00011
00012
00013
00014
00015
00016
00017 int AFNI_ts_in_library( MRI_IMAGE * tsim )
00018 {
00019 int its ;
00020
00021 ENTRY("AFNI_ts_in_library") ;
00022
00023 if( GLOBAL_library.timeseries != NULL &&
00024 IMARR_COUNT(GLOBAL_library.timeseries) > 0 && tsim != NULL ){
00025
00026 for( its=0 ; its < IMARR_COUNT(GLOBAL_library.timeseries) ; its++ )
00027 if( tsim == IMARR_SUBIMAGE(GLOBAL_library.timeseries,its) )
00028 RETURN(its) ;
00029 }
00030
00031 RETURN(-1) ;
00032 }
00033
00034
00035
00036 void AFNI_fimmer_pickref_CB( Widget wcall ,
00037 XtPointer cd , MCW_choose_cbs * cbs )
00038 {
00039 Three_D_View * im3d = (Three_D_View *) cd ;
00040 int its ;
00041 MRI_IMAGE * tsim ;
00042
00043 ENTRY("AFNI_fimmer_pickref_CB") ;
00044
00045 if( ! IM3D_VALID(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
00046 if( cbs->reason != mcwCR_timeseries ) EXRETURN ;
00047
00048 its = cbs->ival ;
00049 if( its >= 0 && its < IMARR_COUNT(GLOBAL_library.timeseries) ){
00050
00051 tsim = IMARR_SUBIMAGE(GLOBAL_library.timeseries,its) ;
00052 AFNI_fimmer_setref( im3d , tsim ) ;
00053 im3d->fimdata->refadd_count = 1 ;
00054 }
00055
00056 EXRETURN ;
00057 }
00058
00059
00060
00061 void AFNI_fimmer_pickort_CB( Widget wcall ,
00062 XtPointer cd , MCW_choose_cbs * cbs )
00063 {
00064 Three_D_View * im3d = (Three_D_View *) cd ;
00065 int its ;
00066 MRI_IMAGE * tsim ;
00067
00068 ENTRY("AFNI_fimmer_pickort_CB") ;
00069
00070 if( ! IM3D_VALID(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
00071 if( cbs->reason != mcwCR_timeseries ) EXRETURN ;
00072
00073 its = cbs->ival ;
00074 if( its >= 0 && its < IMARR_COUNT(GLOBAL_library.timeseries) ){
00075
00076 tsim = IMARR_SUBIMAGE(GLOBAL_library.timeseries,its) ;
00077 AFNI_fimmer_setort( im3d , tsim ) ;
00078 }
00079
00080 EXRETURN ;
00081 }
00082
00083
00084
00085
00086
00087 void AFNI_fimmer_setref( Three_D_View * im3d , MRI_IMAGE * tsim )
00088 {
00089 int ii ;
00090
00091 ENTRY("AFNI_fimmer_setref") ;
00092
00093 if( ! IM3D_VALID(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
00094
00095 if(PRINT_TRACING)
00096 { char str[256] ;
00097 sprintf(str,"setting fimref to %s",
00098 (tsim==NULL) ? "Nothing" : (tsim->name==NULL) ? "NoName" : tsim->name) ;
00099 STATUS(str) ; }
00100
00101 if( im3d->g123 != NULL )
00102 drive_MCW_grapher( im3d->g123 , graDR_addref_ts , (XtPointer) tsim ) ;
00103
00104 if( im3d->g231 != NULL )
00105 drive_MCW_grapher( im3d->g231 , graDR_addref_ts , (XtPointer) tsim ) ;
00106
00107 if( im3d->g312 != NULL )
00108 drive_MCW_grapher( im3d->g312 , graDR_addref_ts , (XtPointer) tsim ) ;
00109
00110 ii = AFNI_ts_in_library( tsim ) ;
00111
00112 if(PRINT_TRACING)
00113 { char str[256] ; sprintf(str,"found new ref in library at ii=%d",ii) ;
00114 STATUS(str) ; }
00115
00116 ii = AFNI_ts_in_library( im3d->fimdata->fimref ) ;
00117
00118
00119
00120
00121 if(PRINT_TRACING)
00122 { char str[256] ; sprintf(str,"found old ref in library at ii=%d",ii) ;
00123 STATUS(str) ; }
00124
00125 if( ii < 0 && im3d->fimdata->fimref != NULL ){
00126 mri_free(im3d->fimdata->fimref) ;
00127 STATUS("freed old ref since wasn't in library") ;
00128 }
00129
00130 im3d->fimdata->fimref = tsim ;
00131
00132 if( DSET_GRAPHABLE(im3d->anat_now) )
00133 im3d->fimdata->fimdset = im3d->anat_now ;
00134
00135 ALLOW_COMPUTE_FIM(im3d) ;
00136 EXRETURN ;
00137 }
00138
00139
00140
00141 void AFNI_fimmer_setort( Three_D_View * im3d , MRI_IMAGE * tsim )
00142 {
00143 int ii ;
00144
00145 ENTRY("AFNI_fimmer_setort") ;
00146
00147 if( ! IM3D_VALID(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
00148
00149 if(PRINT_TRACING)
00150 { char str[256] ;
00151 sprintf(str,"setting fimort to %s",
00152 (tsim==NULL) ? "Nothing" : (tsim->name==NULL) ? "NoName" : tsim->name) ;
00153 STATUS(str) ; }
00154
00155 if( im3d->g123 != NULL )
00156 drive_MCW_grapher( im3d->g123 , graDR_addort_ts , (XtPointer) tsim ) ;
00157
00158 if( im3d->g231 != NULL )
00159 drive_MCW_grapher( im3d->g231 , graDR_addort_ts , (XtPointer) tsim ) ;
00160
00161 if( im3d->g312 != NULL )
00162 drive_MCW_grapher( im3d->g312 , graDR_addort_ts , (XtPointer) tsim ) ;
00163
00164 ii = AFNI_ts_in_library( tsim ) ;
00165
00166 if(PRINT_TRACING)
00167 { char str[256] ; sprintf(str,"found new ort in library at ii=%d",ii) ;
00168 STATUS(str) ; }
00169
00170 ii = AFNI_ts_in_library( im3d->fimdata->fimort ) ;
00171
00172
00173
00174
00175 if(PRINT_TRACING)
00176 { char str[256] ; sprintf(str,"found old ort in library at ii=%d",ii) ;
00177 STATUS(str) ; }
00178
00179 if( ii < 0 && im3d->fimdata->fimort != NULL ){
00180 mri_free(im3d->fimdata->fimort) ;
00181 STATUS("freed old ort since wasn't in library") ;
00182 }
00183
00184 im3d->fimdata->fimort = tsim ;
00185
00186 if( DSET_GRAPHABLE(im3d->anat_now) )
00187 im3d->fimdata->fimdset = im3d->anat_now ;
00188
00189 ALLOW_COMPUTE_FIM(im3d) ;
00190 EXRETURN ;
00191 }
00192
00193
00194
00195
00196
00197 void AFNI_fimmer_setignore( Three_D_View * im3d , int new_ignore )
00198 {
00199 int ii ;
00200
00201 ENTRY("AFNI_fimmer_setignore") ;
00202
00203 if( ! IM3D_VALID(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
00204
00205 if( im3d->g123 != NULL )
00206 drive_MCW_grapher( im3d->g123 , graDR_setignore , (XtPointer) new_ignore ) ;
00207
00208 if( im3d->g231 != NULL )
00209 drive_MCW_grapher( im3d->g231 , graDR_setignore , (XtPointer) new_ignore ) ;
00210
00211 if( im3d->g312 != NULL )
00212 drive_MCW_grapher( im3d->g312 , graDR_setignore , (XtPointer) new_ignore ) ;
00213
00214 im3d->fimdata->init_ignore = new_ignore ;
00215
00216 if( DSET_GRAPHABLE(im3d->anat_now) )
00217 im3d->fimdata->fimdset = im3d->anat_now ;
00218
00219 ALLOW_COMPUTE_FIM(im3d) ;
00220 EXRETURN ;
00221 }
00222
00223
00224
00225
00226
00227 void AFNI_fimmer_setpolort( Three_D_View * im3d , int new_polort )
00228 {
00229 int ii ;
00230
00231 ENTRY("AFNI_fimmer_setpolort") ;
00232
00233 if( ! IM3D_VALID(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
00234
00235 if( im3d->g123 != NULL )
00236 drive_MCW_grapher( im3d->g123 , graDR_polort , (XtPointer) new_polort ) ;
00237
00238 if( im3d->g231 != NULL )
00239 drive_MCW_grapher( im3d->g231 , graDR_polort , (XtPointer) new_polort ) ;
00240
00241 if( im3d->g312 != NULL )
00242 drive_MCW_grapher( im3d->g312 , graDR_polort , (XtPointer) new_polort ) ;
00243
00244 im3d->fimdata->polort = new_polort ;
00245
00246 if( DSET_GRAPHABLE(im3d->anat_now) )
00247 im3d->fimdata->fimdset = im3d->anat_now ;
00248
00249 ALLOW_COMPUTE_FIM(im3d) ;
00250 EXRETURN ;
00251 }
00252
00253
00254
00255
00256
00257
00258 #ifndef FIM_THR
00259 #define FIM_THR 0.0999
00260 #endif
00261
00262
00263
00264
00265
00266
00267
00268 THD_3dim_dataset * AFNI_fimmer_compute( Three_D_View * im3d ,
00269 THD_3dim_dataset * dset_time ,
00270 MRI_IMAGE * ref_ts , MRI_IMAGE * ort_ts ,
00271 THD_session * sess , int code, int ucode )
00272 {
00273 THD_3dim_dataset * new_dset=NULL ;
00274 char new_prefix[THD_MAX_PREFIX] ;
00275 char old_prefix[THD_MAX_PREFIX] ;
00276 THD_slist_find fff ;
00277 int ifim , it,iv , nvox , ngood_ref , ntime , it1 , dtyp , nxyz , itbot ;
00278 float * vval, * tsar, * aval, * rbest, * abest, * pbest, * pval, * bbest, * bval;
00279 int * indx ;
00280 short * bar ;
00281 short * ibest ;
00282 void * ptr ;
00283 float stataux[MAX_STAT_AUX] ;
00284 float fthr , topval ;
00285 int nx_ref , ny_ref , ivec , nnow ;
00286 PCOR_references ** pc_ref ;
00287 PCOR_voxel_corr ** pc_vc ;
00288
00289 int fim_nref , nx_ort , ny_ort , internal_ort ;
00290 float * ortar ;
00291 static float * ref_vec = NULL ;
00292 static int nref_vec = -666 ;
00293
00294 int ibr_best , ibr_perc , ibr_fim , ibr_corr , ibr_base , nbrik ;
00295
00296 int polort = im3d->fimdata->polort , ip ;
00297
00298 float top_perc = 0.0 ;
00299
00300 int ibr_pave , ibr_aver ;
00301 float * paval , * avval , * pabest , * avbest ;
00302
00303 int ibr_ptop , ibr_topl , ibr_sigm ;
00304 float * ptval , * tlval , *sgval ,
00305 * ptbest, * tlbest, *sgbest ;
00306
00307 #ifndef DONT_USE_METER
00308 Widget meter = NULL ;
00309 int meter_perc , meter_pold ;
00310 #endif
00311
00312 int nupdt = 0 ,
00313 min_updt = 5 ,
00314 first_updt = 1 ;
00315
00316 ENTRY("AFNI_fimmer_compute") ;
00317
00318
00319
00320 if( ! DSET_GRAPHABLE(dset_time) ||
00321 ref_ts == NULL ||
00322 ref_ts->kind != MRI_float ||
00323 ! IM3D_OPEN(im3d) ||
00324 im3d->type != AFNI_3DDATA_VIEW ||
00325 (code == 0 && ucode == 0) ||
00326 ref_ts->nx < DSET_NUM_TIMES(dset_time) ){
00327
00328 if(PRINT_TRACING)
00329 { char str[256] ;
00330 sprintf(str,"illegal inputs: ntime=%d num_ts=%d",
00331 DSET_NUM_TIMES(dset_time), (ref_ts==NULL) ? (0) : (ref_ts->nx) ) ;
00332 STATUS(str) ; }
00333
00334 RETURN(NULL) ;
00335 }
00336
00337
00338
00339 if( ort_ts != NULL ){
00340 nx_ort = ort_ts->nx ;
00341 ny_ort = ort_ts->ny ;
00342 ortar = MRI_FLOAT_PTR(ort_ts) ;
00343
00344 internal_ort = (nx_ort < DSET_NUM_TIMES(dset_time)) ;
00345 } else {
00346 internal_ort = 1 ;
00347 }
00348 fim_nref = (internal_ort) ? (polort+2) : (ny_ort+polort+2) ;
00349
00350 if( nref_vec < fim_nref ){
00351 ref_vec = (float *) XtRealloc( (char *)ref_vec, sizeof(float)*fim_nref ) ;
00352 nref_vec = fim_nref ;
00353 }
00354
00355 itbot = im3d->fimdata->init_ignore ;
00356 nx_ref = ref_ts->nx ;
00357 ny_ref = ref_ts->ny ;
00358 ntime = DSET_NUM_TIMES(dset_time) ;
00359 ngood_ref = 0 ;
00360 it1 = -1 ;
00361 for( ivec=0 ; ivec < ny_ref ; ivec++ ){
00362 tsar = MRI_FLOAT_PTR(ref_ts) + (ivec*nx_ref) ;
00363 ifim = 0 ;
00364 for( it=itbot ; it < ntime ; it++ ){
00365 if( tsar[it] < WAY_BIG ){ ifim++ ; if( it1 < 0 ) it1 = it ; }
00366 }
00367
00368 if( ifim < min_updt ){
00369 STATUS("ref_ts has too few good entries!") ;
00370 RETURN(NULL) ;
00371 }
00372
00373 ngood_ref = MAX( ifim , ngood_ref ) ;
00374 }
00375
00376
00377
00378
00379 dtyp = DSET_BRICK_TYPE(dset_time,it1) ;
00380 if( ! AFNI_GOOD_FUNC_DTYPE(dtyp) ){
00381 STATUS("illegal input data type!") ;
00382 RETURN(NULL) ;
00383 }
00384
00385
00386
00387 MCW_strncpy( old_prefix , DSET_PREFIX(dset_time) , THD_MAX_PREFIX-3 ) ;
00388
00389 if( ! ISVALID_SESSION(sess) ){
00390 sprintf( new_prefix , "%s@%d" , old_prefix , 1 ) ;
00391 } else {
00392 for( ifim=1 ; ifim < 99 ; ifim++ ){
00393 sprintf( new_prefix , "%s@%d" , old_prefix , ifim ) ;
00394 fff = THD_dset_in_session( FIND_PREFIX , new_prefix , sess ) ;
00395 if( fff.dset == NULL ) break ;
00396 }
00397 if( ifim == 99 ){
00398 STATUS("can't create new prefix!") ;
00399 RETURN(NULL) ;
00400 }
00401 }
00402
00403 if(PRINT_TRACING)
00404 { char str[256] ;
00405 sprintf(str,"new prefix = %s",new_prefix) ; STATUS(str) ; }
00406
00407
00408
00409 THD_load_datablock( dset_time->dblk ) ;
00410
00411 nxyz = dset_time->dblk->diskptr->dimsizes[0]
00412 * dset_time->dblk->diskptr->dimsizes[1]
00413 * dset_time->dblk->diskptr->dimsizes[2] ;
00414
00415
00416
00417
00418
00419 switch( dtyp ){
00420
00421 case MRI_short:{
00422 short * dar = (short *) DSET_ARRAY(dset_time,it1) ;
00423 for( iv=0,fthr=0.0 ; iv < nxyz ; iv++ ) fthr += abs(dar[iv]) ;
00424 fthr = FIM_THR * fthr / nxyz ;
00425
00426 if(PRINT_TRACING)
00427 { char str[256] ; sprintf(str,"fthr = %g",fthr) ; STATUS(str) ; }
00428
00429 for( iv=0,nvox=0 ; iv < nxyz ; iv++ )
00430 if( abs(dar[iv]) > fthr ) nvox++ ;
00431 indx = (int *) malloc( sizeof(int) * nvox ) ;
00432 if( indx == NULL ){
00433 fprintf(stderr,"\n*** indx malloc failure in AFNI_fimmer_compute\n") ;
00434 RETURN(NULL) ;
00435 }
00436 for( iv=0,nvox=0 ; iv < nxyz ; iv++ )
00437 if( abs(dar[iv]) > fthr ) indx[nvox++] = iv ;
00438 }
00439 break ;
00440
00441 case MRI_float:{
00442 float * dar = (float *) DSET_ARRAY(dset_time,it1) ;
00443 for( iv=0,fthr=0.0 ; iv < nxyz ; iv++ ) fthr += fabs(dar[iv]) ;
00444 fthr = FIM_THR * fthr / nxyz ;
00445
00446 if(PRINT_TRACING)
00447 { char str[256] ; sprintf(str,"fthr = %g",fthr) ; STATUS(str) ; }
00448
00449 for( iv=0,nvox=0 ; iv < nxyz ; iv++ )
00450 if( fabs(dar[iv]) > fthr ) nvox++ ;
00451 indx = (int *) malloc( sizeof(int) * nvox ) ;
00452 if( indx == NULL ){
00453 fprintf(stderr,"\n*** indx malloc failure in AFNI_fimmer_compute\n") ;
00454 RETURN(NULL) ;
00455 }
00456 for( iv=0,nvox=0 ; iv < nxyz ; iv++ )
00457 if( fabs(dar[iv]) > fthr ) indx[nvox++] = iv ;
00458 }
00459 break ;
00460
00461 case MRI_byte:{
00462 byte * dar = (byte *) DSET_ARRAY(dset_time,it1) ;
00463 for( iv=0,fthr=0.0 ; iv < nxyz ; iv++ ) fthr += dar[iv] ;
00464 fthr = FIM_THR * fthr / nxyz ;
00465
00466 if(PRINT_TRACING)
00467 { char str[256] ; sprintf(str,"fthr = %g",fthr) ; STATUS(str) ; }
00468
00469 for( iv=0,nvox=0 ; iv < nxyz ; iv++ )
00470 if( dar[iv] > fthr ) nvox++ ;
00471 indx = (int *) malloc( sizeof(int) * nvox ) ;
00472 if( indx == NULL ){
00473 fprintf(stderr,"\n*** indx malloc failure in AFNI_fimmer_compute\n") ;
00474 RETURN(NULL) ;
00475 }
00476 for( iv=0,nvox=0 ; iv < nxyz ; iv++ )
00477 if( dar[iv] > fthr ) indx[nvox++] = iv ;
00478 }
00479 break ;
00480 }
00481
00482 if(PRINT_TRACING)
00483 { char str[256] ; sprintf(str,"number of voxels = %d",nvox) ; STATUS(str) ; }
00484
00485
00486
00487 if( nvox == 0 ){
00488 fprintf(stderr,"\n*** no voxels to FIM on!"
00489 "\n*** try setting the Bkg Thresh lower"
00490 "\n [on the FIM -> Edit Ideal menu]\a\n") ;
00491 free(indx) ; RETURN(NULL) ;
00492 }
00493
00494
00495
00496 vval = (float *) malloc( sizeof(float) * nvox) ;
00497 if( vval == NULL ){
00498 fprintf(stderr,"\n*** vval malloc failure in AFNI_fimmer_compute\n") ;
00499 free(indx) ; RETURN(NULL) ;
00500 }
00501
00502
00503
00504 ibr_fim=ibr_corr=ibr_best=ibr_perc=ibr_base = -1 ; nbrik = 0 ;
00505 ibr_pave = ibr_aver = -1 ;
00506 ibr_ptop = ibr_topl = ibr_sigm = -1 ;
00507
00508 if( (code & FIM_ALPHA_MASK)!= 0) { ibr_fim = nbrik; nbrik++; }
00509 if( (code & FIM_BEST_MASK) != 0 && ny_ref > 1){ ibr_best = nbrik; nbrik++; }
00510 if( (code & FIM_PERC_MASK) != 0) { ibr_perc = nbrik; nbrik++; }
00511 if( (code & FIM_PAVE_MASK) != 0) { ibr_pave = nbrik; nbrik++; }
00512 if( (code & FIM_BASE_MASK) != 0) { ibr_base = nbrik; nbrik++; }
00513 if( (code & FIM_AVER_MASK) != 0) { ibr_aver = nbrik; nbrik++; }
00514 if( (code & FIM_CORR_MASK) != 0) { ibr_corr = nbrik; nbrik++; }
00515 if( (code & FIM_PTOP_MASK) != 0) { ibr_ptop = nbrik; nbrik++; }
00516 if( (code & FIM_TOPL_MASK) != 0) { ibr_topl = nbrik; nbrik++; }
00517 if( (code & FIM_SIGM_MASK) != 0) { ibr_sigm = nbrik; nbrik++; }
00518
00519
00520
00521 if(PRINT_TRACING)
00522 { char str[256] ; sprintf(str,"number of bricks = %d",nbrik) ; STATUS(str) ; }
00523
00524 if( nbrik == 0 ){
00525
00526 #ifndef DONT_USE_METER
00527 meter = MCW_popup_meter( im3d->vwid->top_shell , METER_TOP_WIDE ) ;
00528 meter_pold = 0 ;
00529 #endif
00530
00531 goto ucode_stuff ;
00532 }
00533
00534
00535
00536 if(PRINT_TRACING)
00537 { char str[256] ;
00538 sprintf(str,"code of FIM_MASKs = %d",code) ; STATUS(str) ; }
00539
00540
00541
00542 if( ny_ref > 1 ){
00543 aval = (float *) malloc(sizeof(float) * nvox) ;
00544 rbest = (float *) malloc(sizeof(float) * nvox) ;
00545 abest = (float *) malloc(sizeof(float) * nvox) ;
00546 ibest = (short *) malloc(sizeof(short) * nvox) ;
00547 pbest = (float *) malloc(sizeof(float) * nvox) ;
00548 bbest = (float *) malloc(sizeof(float) * nvox) ;
00549 pval = (float *) malloc(sizeof(float) * nvox) ;
00550 bval = (float *) malloc(sizeof(float) * nvox) ;
00551
00552 paval = (float *) malloc(sizeof(float) * nvox) ;
00553 avval = (float *) malloc(sizeof(float) * nvox) ;
00554 pabest = (float *) malloc(sizeof(float) * nvox) ;
00555 avbest = (float *) malloc(sizeof(float) * nvox) ;
00556
00557 ptval = (float *) malloc(sizeof(float) * nvox) ;
00558 tlval = (float *) malloc(sizeof(float) * nvox) ;
00559 sgval = (float *) malloc(sizeof(float) * nvox) ;
00560 ptbest = (float *) malloc(sizeof(float) * nvox) ;
00561 tlbest = (float *) malloc(sizeof(float) * nvox) ;
00562 sgbest = (float *) malloc(sizeof(float) * nvox) ;
00563
00564 if( sgbest == NULL ){
00565 fprintf(stderr,"\n*** 'best' malloc failure in AFNI_fimmer_compute\n") ;
00566 free(vval) ; free(indx) ;
00567 if( aval != NULL ) free(aval) ;
00568 if( rbest != NULL ) free(rbest) ;
00569 if( abest != NULL ) free(abest) ;
00570 if( ibest != NULL ) free(ibest) ;
00571 if( pbest != NULL ) free(pbest) ;
00572 if( bbest != NULL ) free(bbest) ;
00573 if( pval != NULL ) free(pval) ;
00574 if( bval != NULL ) free(bval) ;
00575 if( paval != NULL ) free(paval) ;
00576 if( avval != NULL ) free(avval) ;
00577 if( pabest!= NULL ) free(pabest);
00578 if( avbest!= NULL ) free(avbest);
00579 if( ptval != NULL ) free(ptval) ;
00580 if( tlval != NULL ) free(tlval) ;
00581 if( sgval != NULL ) free(sgval) ;
00582 if( ptbest!= NULL ) free(ptbest);
00583 if( tlbest!= NULL ) free(tlbest);
00584 if( sgbest!= NULL ) free(sgbest);
00585 RETURN(NULL) ;
00586 }
00587 } else {
00588 aval = rbest = abest = pbest = bbest = pval = bval = NULL ;
00589 paval = avval = pabest = avbest = NULL ;
00590 ptval = tlval = ptbest = tlbest = NULL ;
00591 sgval = sgbest = NULL ;
00592 ibest = NULL ;
00593 }
00594
00595 if(PRINT_TRACING)
00596 { char str[256] ;
00597 sprintf(str,"nxyz = %d nvox = %d",nxyz,nvox) ; STATUS(str) ; }
00598
00599
00600
00601 pc_ref = (PCOR_references **) malloc( sizeof(PCOR_references *) * ny_ref ) ;
00602 pc_vc = (PCOR_voxel_corr **) malloc( sizeof(PCOR_voxel_corr *) * ny_ref ) ;
00603
00604 if( pc_ref == NULL || pc_vc == NULL ){
00605 free(vval) ; free(indx) ; free(pc_ref) ; free(pc_vc) ;
00606 if( aval != NULL ) free(aval) ;
00607 if( rbest != NULL ) free(rbest) ;
00608 if( abest != NULL ) free(abest) ;
00609 if( ibest != NULL ) free(ibest) ;
00610 if( pbest != NULL ) free(pbest) ;
00611 if( bbest != NULL ) free(bbest) ;
00612 if( pval != NULL ) free(pval) ;
00613 if( bval != NULL ) free(bval) ;
00614 if( paval != NULL ) free(paval) ;
00615 if( avval != NULL ) free(avval) ;
00616 if( pabest!= NULL ) free(pabest);
00617 if( avbest!= NULL ) free(avbest);
00618 if( ptval != NULL ) free(ptval) ;
00619 if( tlval != NULL ) free(tlval) ;
00620 if( sgval != NULL ) free(sgval) ;
00621 if( ptbest!= NULL ) free(ptbest);
00622 if( tlbest!= NULL ) free(tlbest);
00623 if( sgbest!= NULL ) free(sgbest);
00624 fprintf(stderr,"\n*** FIM initialization fails in AFNI_fimmer_compute\n") ;
00625 RETURN(NULL) ;
00626 }
00627
00628 ifim = 0 ;
00629 for( ivec=0 ; ivec < ny_ref ; ivec++ ){
00630 pc_ref[ivec] = new_PCOR_references( fim_nref ) ;
00631 pc_vc[ivec] = new_PCOR_voxel_corr( nvox , fim_nref ) ;
00632 if( pc_ref[ivec] == NULL || pc_vc[ivec] == NULL ) ifim++ ;
00633 }
00634
00635 if( ifim > 0 ){
00636 for( ivec=0 ; ivec < ny_ref ; ivec++ ){
00637 free_PCOR_references(pc_ref[ivec]) ;
00638 free_PCOR_voxel_corr(pc_vc[ivec]) ;
00639 }
00640 free(vval) ; free(indx) ; free(pc_ref) ; free(pc_vc) ;
00641 if( aval != NULL ) free(aval) ;
00642 if( rbest != NULL ) free(rbest) ;
00643 if( abest != NULL ) free(abest) ;
00644 if( ibest != NULL ) free(ibest) ;
00645 if( pbest != NULL ) free(pbest) ;
00646 if( bbest != NULL ) free(bbest) ;
00647 if( pval != NULL ) free(pval) ;
00648 if( bval != NULL ) free(bval) ;
00649 if( paval != NULL ) free(paval) ;
00650 if( avval != NULL ) free(avval) ;
00651 if( pabest!= NULL ) free(pabest);
00652 if( avbest!= NULL ) free(avbest);
00653 if( ptval != NULL ) free(ptval) ;
00654 if( tlval != NULL ) free(tlval) ;
00655 if( sgval != NULL ) free(sgval) ;
00656 if( ptbest!= NULL ) free(ptbest);
00657 if( tlbest!= NULL ) free(tlbest);
00658 if( sgbest!= NULL ) free(sgbest);
00659 fprintf(stderr,"\n*** FIM initialization fails in AFNI_fimmer_compute\n") ;
00660 RETURN(NULL) ;
00661 }
00662
00663
00664
00665 STATUS("making new dataset") ;
00666
00667 new_dset = EDIT_empty_copy( dset_time ) ;
00668
00669 if( nbrik == 1 && ucode == 0 ){
00670 it = EDIT_dset_items( new_dset ,
00671 ADN_prefix , new_prefix ,
00672 ADN_malloc_type , DATABLOCK_MEM_MALLOC ,
00673 ADN_type , ISHEAD(dset_time)
00674 ? HEAD_FUNC_TYPE : GEN_FUNC_TYPE ,
00675 ADN_func_type , FUNC_FIM_TYPE ,
00676 ADN_nvals , 1 ,
00677 ADN_datum_all , MRI_short ,
00678 ADN_ntt , 0 ,
00679 ADN_none ) ;
00680
00681 } else if( nbrik == 2 && ibr_corr == 1 && ucode == 0 ){
00682 it = EDIT_dset_items( new_dset ,
00683 ADN_prefix , new_prefix ,
00684 ADN_malloc_type , DATABLOCK_MEM_MALLOC ,
00685 ADN_type , ISHEAD(dset_time)
00686 ? HEAD_FUNC_TYPE : GEN_FUNC_TYPE ,
00687 ADN_func_type , FUNC_COR_TYPE ,
00688 ADN_nvals , 2 ,
00689 ADN_datum_all , MRI_short ,
00690 ADN_ntt , 0 ,
00691 ADN_none ) ;
00692
00693 } else if( nbrik > 0 ){
00694 it = EDIT_dset_items( new_dset ,
00695 ADN_prefix , new_prefix ,
00696 ADN_malloc_type , DATABLOCK_MEM_MALLOC ,
00697 ADN_type , ISHEAD(dset_time)
00698 ? HEAD_FUNC_TYPE : GEN_FUNC_TYPE ,
00699 ADN_func_type , FUNC_BUCK_TYPE ,
00700 ADN_nvals , nbrik ,
00701 ADN_datum_all , MRI_short ,
00702 ADN_ntt , 0 ,
00703 ADN_none ) ;
00704 } else {
00705 it = 999 ;
00706 }
00707
00708 if( it > 0 ){
00709 fprintf(stderr,
00710 "\n*** EDIT_dset_items error %d in AFNI_fimmer_compute\n",it) ;
00711 THD_delete_3dim_dataset( new_dset , False ) ;
00712 for( ivec=0 ; ivec < ny_ref ; ivec++ ){
00713 free_PCOR_references(pc_ref[ivec]) ;
00714 free_PCOR_voxel_corr(pc_vc[ivec]) ;
00715 }
00716 free(vval) ; free(indx) ; free(pc_ref) ; free(pc_vc) ;
00717 if( aval != NULL ) free(aval) ;
00718 if( rbest != NULL ) free(rbest) ;
00719 if( abest != NULL ) free(abest) ;
00720 if( ibest != NULL ) free(ibest) ;
00721 if( pbest != NULL ) free(pbest) ;
00722 if( bbest != NULL ) free(bbest) ;
00723 if( pval != NULL ) free(pval) ;
00724 if( bval != NULL ) free(bval) ;
00725 if( paval != NULL ) free(paval) ;
00726 if( avval != NULL ) free(avval) ;
00727 if( pabest!= NULL ) free(pabest);
00728 if( avbest!= NULL ) free(avbest);
00729 if( ptval != NULL ) free(ptval) ;
00730 if( tlval != NULL ) free(tlval) ;
00731 if( sgval != NULL ) free(sgval) ;
00732 if( ptbest!= NULL ) free(ptbest);
00733 if( tlbest!= NULL ) free(tlbest);
00734 if( sgbest!= NULL ) free(sgbest);
00735 RETURN(NULL) ;
00736 }
00737
00738
00739
00740 if( ibr_fim >= 0 )
00741 EDIT_BRICK_LABEL( new_dset , ibr_fim , "Fit Coef" ) ;
00742 if( ibr_corr >= 0 )
00743 EDIT_BRICK_LABEL( new_dset , ibr_corr , "Correlation" ) ;
00744 if( ibr_best >= 0 )
00745 EDIT_BRICK_LABEL( new_dset , ibr_best , "Best Index" ) ;
00746 if( ibr_perc >= 0 )
00747 EDIT_BRICK_LABEL( new_dset , ibr_perc , "% Change" ) ;
00748 if( ibr_base >= 0 )
00749 EDIT_BRICK_LABEL( new_dset , ibr_base , "Baseline" ) ;
00750
00751 if( ibr_pave >= 0 )
00752 EDIT_BRICK_LABEL( new_dset , ibr_pave , "% From Ave" ) ;
00753 if( ibr_aver >= 0 )
00754 EDIT_BRICK_LABEL( new_dset , ibr_aver , "Average" ) ;
00755
00756 if( ibr_ptop >= 0 )
00757 EDIT_BRICK_LABEL( new_dset , ibr_ptop , "% From Top" ) ;
00758 if( ibr_topl >= 0 )
00759 EDIT_BRICK_LABEL( new_dset , ibr_topl , "Topline" ) ;
00760 if( ibr_sigm >= 0 )
00761 EDIT_BRICK_LABEL( new_dset , ibr_sigm , "Sigma Resid" ) ;
00762
00763
00764
00765 if( ibr_perc >= 0 || ibr_pave >= 0 || ibr_ptop >= 0 ){
00766 char * cp = my_getenv("AFNI_FIM_PERCENT_LIMIT") ;
00767 if( cp != NULL ){
00768 float tp = strtod(cp,NULL) ;
00769 if( tp > 0.0 ) top_perc = tp ;
00770 }
00771 }
00772
00773
00774
00775 STATUS("making output bricks") ;
00776
00777 for( iv=0 ; iv < new_dset->dblk->nvals ; iv++ ){
00778 ptr = malloc( DSET_BRICK_BYTES(new_dset,iv) ) ;
00779 mri_fix_data_pointer( ptr , DSET_BRICK(new_dset,iv) ) ;
00780 }
00781
00782 if( THD_count_databricks(new_dset->dblk) < new_dset->dblk->nvals ){
00783 fprintf(stderr,
00784 "\n*** failure to malloc new bricks in AFNI_fimmer_compute\n") ;
00785 THD_delete_3dim_dataset( new_dset , False ) ;
00786 for( ivec=0 ; ivec < ny_ref ; ivec++ ){
00787 free_PCOR_references(pc_ref[ivec]) ;
00788 free_PCOR_voxel_corr(pc_vc[ivec]) ;
00789 }
00790 free(vval) ; free(indx) ; free(pc_ref) ; free(pc_vc) ;
00791 if( aval != NULL ) free(aval) ;
00792 if( rbest != NULL ) free(rbest) ;
00793 if( abest != NULL ) free(abest) ;
00794 if( ibest != NULL ) free(ibest) ;
00795 if( pbest != NULL ) free(pbest) ;
00796 if( bbest != NULL ) free(bbest) ;
00797 if( pval != NULL ) free(pval) ;
00798 if( bval != NULL ) free(bval) ;
00799 if( paval != NULL ) free(paval) ;
00800 if( avval != NULL ) free(avval) ;
00801 if( pabest!= NULL ) free(pabest);
00802 if( avbest!= NULL ) free(avbest);
00803 if( ptval != NULL ) free(ptval) ;
00804 if( tlval != NULL ) free(tlval) ;
00805 if( sgval != NULL ) free(sgval) ;
00806 if( ptbest!= NULL ) free(ptbest);
00807 if( tlbest!= NULL ) free(tlbest);
00808 if( sgbest!= NULL ) free(sgbest);
00809 RETURN(NULL) ;
00810 }
00811
00812
00813
00814
00815 #ifndef DONT_USE_METER
00816 meter = MCW_popup_meter( im3d->vwid->top_shell , METER_TOP_WIDE ) ;
00817 meter_pold = 0 ;
00818 #endif
00819
00820 STATUS("starting recursive least squares") ;
00821
00822 for( it=itbot ; it < ntime ; it++ ){
00823
00824 nnow = 0 ;
00825
00826 for( ivec=0 ; ivec < ny_ref ; ivec++ ){
00827
00828 tsar = MRI_FLOAT_PTR(ref_ts) + (ivec*nx_ref) ;
00829 if( tsar[it] >= WAY_BIG ) continue ;
00830
00831 ref_vec[0] = 1.0 ;
00832 for( ip=1 ; ip <= polort ; ip++ )
00833 ref_vec[ip] = ref_vec[ip-1] * ((float)it) ;
00834
00835 if( internal_ort ){
00836 ref_vec[ip] = tsar[it] ;
00837 } else {
00838 for( iv=0 ; iv < ny_ort ; iv++ )
00839 ref_vec[iv+ip] = ortar[it + iv*nx_ort] ;
00840
00841 ref_vec[ny_ort+ip] = tsar[it] ;
00842 }
00843
00844 if(PRINT_TRACING)
00845 { char str[256] ;
00846 sprintf(str,"time index=%d ideal[%d]=%f" , it,ivec,tsar[it] ) ;
00847 STATUS(str) ; }
00848
00849
00850
00851 update_PCOR_references( ref_vec , pc_ref[ivec] ) ;
00852
00853
00854
00855 if( nnow == 0 ){
00856 float fac ;
00857 switch( dtyp ){
00858 case MRI_short:{
00859 short * dar = (short *) DSET_ARRAY(dset_time,it) ;
00860 for( iv=0; iv < nvox; iv++ ) vval[iv] = (float) dar[indx[iv]];
00861 }
00862 break ;
00863
00864 case MRI_float:{
00865 float * dar = (float *) DSET_ARRAY(dset_time,it) ;
00866 for( iv=0; iv < nvox; iv++ ) vval[iv] = (float) dar[indx[iv]];
00867 }
00868 break ;
00869
00870 case MRI_byte:{
00871 byte * dar = (byte *) DSET_ARRAY(dset_time,it) ;
00872 for( iv=0; iv < nvox; iv++ ) vval[iv] = (float) dar[indx[iv]];
00873 }
00874 break ;
00875 }
00876 fac = DSET_BRICK_FACTOR(dset_time,it) ;
00877 if( fac > 0.0 )
00878 for( iv=0 ; iv < nvox ; iv++ ) vval[iv] *= fac ;
00879 }
00880
00881
00882
00883 PCOR_update_float( vval , pc_ref[ivec] , pc_vc[ivec] ) ;
00884 nnow++ ;
00885 }
00886
00887 if( nnow > 0 ) nupdt++ ;
00888
00889 #ifndef DONT_USE_METER
00890 meter_perc = (int) ( 100.0 * nupdt / ngood_ref ) ;
00891 if( meter_perc != meter_pold ){
00892 MCW_set_meter( meter , meter_perc ) ;
00893 meter_pold = meter_perc ;
00894 }
00895 #endif
00896
00897 }
00898
00899
00900
00901
00902
00903
00904 stataux[0] = nupdt ;
00905 stataux[1] = (ny_ref==1) ? 1 : 2 ;
00906 stataux[2] = fim_nref - 1 ;
00907 for( iv=3 ; iv < MAX_STAT_AUX ; iv++ ) stataux[iv] = 0.0 ;
00908
00909 if( ibr_corr >= 0 ){
00910 if( new_dset->func_type == FUNC_COR_TYPE )
00911 EDIT_dset_items( new_dset, ADN_stat_aux, stataux, ADN_none ) ;
00912
00913 EDIT_BRICK_TO_FICO( new_dset, ibr_corr, stataux[0],stataux[1],stataux[2] ) ;
00914 }
00915
00916 #ifndef DONT_USE_METER
00917 # define METERIZE(ib) do { meter_perc = (int) ( 100.0 * (ib) / nbrik ) ; \
00918 if( meter_perc != meter_pold ){ \
00919 MCW_set_meter( meter , meter_perc ) ; \
00920 meter_pold = meter_perc ; \
00921 } } while(0)
00922 #else
00923 # define METERIZE(ib)
00924 #endif
00925
00926
00927
00928
00929 if( ny_ref == 1 ){
00930
00931
00932
00933 if( ibr_fim >= 0 ){
00934
00935 STATUS("getting 1 ref alpha") ;
00936
00937 PCOR_get_coef( pc_ref[0] , pc_vc[0] , vval ) ;
00938
00939 topval = 0.0 ;
00940 for( iv=0 ; iv < nvox ; iv++ )
00941 if( fabs(vval[iv]) > topval ) topval = fabs(vval[iv]) ;
00942
00943 bar = DSET_ARRAY( new_dset , ibr_fim ) ;
00944 memset( bar , 0 , sizeof(short)*nxyz ) ;
00945
00946 if( topval > 0.0 ){
00947 topval = MRI_TYPE_maxval[MRI_short] / topval ;
00948 for( iv=0 ; iv < nvox ; iv++ )
00949 bar[indx[iv]] = (short)(topval * vval[iv] + 0.499) ;
00950
00951 stataux[ibr_fim] = 1.0/topval ;
00952 } else {
00953 stataux[ibr_fim] = 0.0 ;
00954 }
00955
00956 METERIZE(ibr_fim) ;
00957 }
00958
00959 if( ibr_corr >= 0 ){
00960
00961 STATUS("getting 1 ref pcor") ;
00962
00963 PCOR_get_pcor( pc_ref[0] , pc_vc[0] , vval ) ;
00964
00965 bar = DSET_ARRAY( new_dset , ibr_corr ) ;
00966 memset( bar , 0 , sizeof(short)*nxyz ) ;
00967
00968 for( iv=0 ; iv < nvox ; iv++ )
00969 bar[indx[iv]] = (short)(FUNC_COR_SCALE_SHORT * vval[iv] + 0.499) ;
00970
00971 stataux[ibr_corr] = 1.0 / FUNC_COR_SCALE_SHORT ;
00972
00973 METERIZE(ibr_corr) ;
00974 }
00975
00976 if( ibr_perc >= 0 ){
00977
00978 STATUS("getting 1 ref perc") ;
00979
00980 PCOR_get_perc( pc_ref[0] , pc_vc[0] , vval , NULL , 0 ) ;
00981
00982 if( top_perc > 0.0 ) EDIT_clip_float( top_perc , nvox , vval ) ;
00983
00984 topval = 0.0 ;
00985 for( iv=0 ; iv < nvox ; iv++ )
00986 if( fabs(vval[iv]) > topval ) topval = fabs(vval[iv]) ;
00987
00988 bar = DSET_ARRAY( new_dset , ibr_perc ) ;
00989 memset( bar , 0 , sizeof(short)*nxyz ) ;
00990
00991 if( topval > 0.0 ){
00992 topval = MRI_TYPE_maxval[MRI_short] / topval ;
00993 for( iv=0 ; iv < nvox ; iv++ )
00994 bar[indx[iv]] = (short)(topval * vval[iv] + 0.499) ;
00995
00996 stataux[ibr_perc] = 1.0/topval ;
00997 } else {
00998 stataux[ibr_perc] = 0.0 ;
00999 }
01000
01001 METERIZE(ibr_perc) ;
01002 }
01003
01004 if( ibr_pave >= 0 ){
01005
01006 STATUS("getting 1 ref pave") ;
01007
01008 PCOR_get_perc( pc_ref[0] , pc_vc[0] , vval , NULL , 1 ) ;
01009
01010 if( top_perc > 0.0 ) EDIT_clip_float( top_perc , nvox , vval ) ;
01011
01012 topval = 0.0 ;
01013 for( iv=0 ; iv < nvox ; iv++ )
01014 if( fabs(vval[iv]) > topval ) topval = fabs(vval[iv]) ;
01015
01016 bar = DSET_ARRAY( new_dset , ibr_pave ) ;
01017 memset( bar , 0 , sizeof(short)*nxyz ) ;
01018
01019 if( topval > 0.0 ){
01020 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01021 for( iv=0 ; iv < nvox ; iv++ )
01022 bar[indx[iv]] = (short)(topval * vval[iv] + 0.499) ;
01023
01024 stataux[ibr_pave] = 1.0/topval ;
01025 } else {
01026 stataux[ibr_pave] = 0.0 ;
01027 }
01028
01029 METERIZE(ibr_pave) ;
01030 }
01031
01032 if( ibr_ptop >= 0 ){
01033
01034 STATUS("getting 1 ref ptop") ;
01035
01036 PCOR_get_perc( pc_ref[0] , pc_vc[0] , vval , NULL , 2 ) ;
01037
01038 if( top_perc > 0.0 ) EDIT_clip_float( top_perc , nvox , vval ) ;
01039
01040 topval = 0.0 ;
01041 for( iv=0 ; iv < nvox ; iv++ )
01042 if( fabs(vval[iv]) > topval ) topval = fabs(vval[iv]) ;
01043
01044 bar = DSET_ARRAY( new_dset , ibr_ptop ) ;
01045 memset( bar , 0 , sizeof(short)*nxyz ) ;
01046
01047 if( topval > 0.0 ){
01048 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01049 for( iv=0 ; iv < nvox ; iv++ )
01050 bar[indx[iv]] = (short)(topval * vval[iv] + 0.499) ;
01051
01052 stataux[ibr_ptop] = 1.0/topval ;
01053 } else {
01054 stataux[ibr_ptop] = 0.0 ;
01055 }
01056
01057 METERIZE(ibr_ptop) ;
01058 }
01059
01060 if( ibr_base >= 0 ){
01061
01062 STATUS("getting 1 ref base") ;
01063
01064 PCOR_get_perc( pc_ref[0] , pc_vc[0] , NULL , vval , 0 ) ;
01065
01066 topval = 0.0 ;
01067 for( iv=0 ; iv < nvox ; iv++ )
01068 if( fabs(vval[iv]) > topval ) topval = fabs(vval[iv]) ;
01069
01070 bar = DSET_ARRAY( new_dset , ibr_base ) ;
01071 memset( bar , 0 , sizeof(short)*nxyz ) ;
01072
01073 if( topval > 0.0 ){
01074 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01075 for( iv=0 ; iv < nvox ; iv++ )
01076 bar[indx[iv]] = (short)(topval * vval[iv] + 0.499) ;
01077
01078 stataux[ibr_base] = 1.0/topval ;
01079 } else {
01080 stataux[ibr_base] = 0.0 ;
01081 }
01082
01083 METERIZE(ibr_base) ;
01084 }
01085
01086 if( ibr_aver >= 0 ){
01087
01088 STATUS("getting 1 ref aver") ;
01089
01090 PCOR_get_perc( pc_ref[0] , pc_vc[0] , NULL , vval , 1 ) ;
01091
01092 topval = 0.0 ;
01093 for( iv=0 ; iv < nvox ; iv++ )
01094 if( fabs(vval[iv]) > topval ) topval = fabs(vval[iv]) ;
01095
01096 bar = DSET_ARRAY( new_dset , ibr_aver ) ;
01097 memset( bar , 0 , sizeof(short)*nxyz ) ;
01098
01099 if( topval > 0.0 ){
01100 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01101 for( iv=0 ; iv < nvox ; iv++ )
01102 bar[indx[iv]] = (short)(topval * vval[iv] + 0.499) ;
01103
01104 stataux[ibr_aver] = 1.0/topval ;
01105 } else {
01106 stataux[ibr_aver] = 0.0 ;
01107 }
01108
01109 METERIZE(ibr_aver) ;
01110 }
01111
01112 if( ibr_topl >= 0 ){
01113
01114 STATUS("getting 1 ref topl") ;
01115
01116 PCOR_get_perc( pc_ref[0] , pc_vc[0] , NULL , vval , 2 ) ;
01117
01118 topval = 0.0 ;
01119 for( iv=0 ; iv < nvox ; iv++ )
01120 if( fabs(vval[iv]) > topval ) topval = fabs(vval[iv]) ;
01121
01122 bar = DSET_ARRAY( new_dset , ibr_topl ) ;
01123 memset( bar , 0 , sizeof(short)*nxyz ) ;
01124
01125 if( topval > 0.0 ){
01126 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01127 for( iv=0 ; iv < nvox ; iv++ )
01128 bar[indx[iv]] = (short)(topval * vval[iv] + 0.499) ;
01129
01130 stataux[ibr_topl] = 1.0/topval ;
01131 } else {
01132 stataux[ibr_topl] = 0.0 ;
01133 }
01134
01135 METERIZE(ibr_topl) ;
01136 }
01137
01138 if( ibr_sigm >= 0 ){
01139
01140 STATUS("getting 1 ref sigm") ;
01141
01142 PCOR_get_stdev( pc_vc[0] , vval ) ;
01143
01144 topval = 0.0 ;
01145 for( iv=0 ; iv < nvox ; iv++ )
01146 if( fabs(vval[iv]) > topval ) topval = fabs(vval[iv]) ;
01147
01148 bar = DSET_ARRAY( new_dset , ibr_sigm ) ;
01149 memset( bar , 0 , sizeof(short)*nxyz ) ;
01150
01151 if( topval > 0.0 ){
01152 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01153 for( iv=0 ; iv < nvox ; iv++ )
01154 bar[indx[iv]] = (short)(topval * vval[iv] + 0.499) ;
01155
01156 stataux[ibr_sigm] = 1.0/topval ;
01157 } else {
01158 stataux[ibr_sigm] = 0.0 ;
01159 }
01160
01161 METERIZE(ibr_sigm) ;
01162 }
01163
01164 } else {
01165
01166
01167
01168
01169
01170 STATUS("getting first ref results") ;
01171
01172 PCOR_get_coef( pc_ref[0] , pc_vc[0] , abest ) ;
01173 PCOR_get_pcor( pc_ref[0] , pc_vc[0] , rbest ) ;
01174 PCOR_get_perc( pc_ref[0] , pc_vc[0] , pbest , bbest , 0 ) ;
01175 PCOR_get_perc( pc_ref[0] , pc_vc[0] , pabest, avbest, 1 ) ;
01176 PCOR_get_perc( pc_ref[0] , pc_vc[0] , ptbest, tlbest, 2 ) ;
01177 PCOR_get_stdev( pc_vc[0] , sgbest ) ;
01178
01179 for( iv=0 ; iv < nvox ; iv++ ) ibest[iv] = 1 ;
01180
01181
01182
01183
01184
01185 for( ivec=1 ; ivec < ny_ref ; ivec++ ){
01186
01187 STATUS(" == getting results for next ref") ;
01188
01189 PCOR_get_coef( pc_ref[ivec] , pc_vc[ivec] , aval ) ;
01190 PCOR_get_pcor( pc_ref[ivec] , pc_vc[ivec] , vval ) ;
01191 PCOR_get_perc( pc_ref[ivec] , pc_vc[ivec] , pval , bval , 0 ) ;
01192 PCOR_get_perc( pc_ref[ivec] , pc_vc[ivec] , paval, avval, 1 ) ;
01193 PCOR_get_perc( pc_ref[ivec] , pc_vc[ivec] , ptval, tlval, 2 ) ;
01194 PCOR_get_stdev( pc_vc[ivec] , sgval ) ;
01195
01196 STATUS(" == and finding the best results") ;
01197
01198 for( iv=0 ; iv < nvox ; iv++ ){
01199 if( fabs(vval[iv]) > fabs(rbest[iv]) ){
01200 rbest[iv] = vval[iv] ;
01201 abest[iv] = aval[iv] ;
01202 ibest[iv] = (ivec+1) ;
01203 pbest[iv] = pval[iv] ;
01204 bbest[iv] = bval[iv] ;
01205 pabest[iv]= paval[iv] ;
01206 avbest[iv]= avval[iv] ;
01207 ptbest[iv]= ptval[iv] ;
01208 tlbest[iv]= tlval[iv] ;
01209 sgbest[iv]= sgval[iv] ;
01210 }
01211 }
01212 }
01213
01214
01215
01216
01217
01218
01219 if( ibr_fim >= 0 ){
01220
01221 if(PRINT_TRACING)
01222 { char str[256]; sprintf(str,"getting ibr_fim=%d",ibr_fim); STATUS(str); }
01223
01224 topval = 0.0 ;
01225 for( iv=0 ; iv < nvox ; iv++ )
01226 if( fabs(abest[iv]) > topval ) topval = fabs(abest[iv]) ;
01227
01228 bar = DSET_ARRAY( new_dset , ibr_fim ) ;
01229 memset( bar , 0 , sizeof(short)*nxyz ) ;
01230
01231 if( topval > 0.0 ){
01232 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01233 for( iv=0 ; iv < nvox ; iv++ )
01234 bar[indx[iv]] = (short)(topval * abest[iv] + 0.499) ;
01235
01236 stataux[ibr_fim] = 1.0/topval ;
01237 } else {
01238 stataux[ibr_fim] = 0.0 ;
01239 }
01240
01241 METERIZE(ibr_fim) ;
01242 }
01243
01244
01245
01246 if( ibr_corr >= 0 ){
01247
01248 if(PRINT_TRACING)
01249 { char str[256]; sprintf(str,"getting ibr_corr=%d",ibr_corr); STATUS(str); }
01250
01251 bar = DSET_ARRAY( new_dset , ibr_corr ) ;
01252 memset( bar , 0 , sizeof(short)*nxyz ) ;
01253
01254 for( iv=0 ; iv < nvox ; iv++ )
01255 bar[indx[iv]] = (short)(FUNC_COR_SCALE_SHORT * rbest[iv] + 0.499) ;
01256
01257 stataux[ibr_corr] = 1.0 / FUNC_COR_SCALE_SHORT ;
01258
01259 METERIZE(ibr_corr) ;
01260 }
01261
01262
01263
01264 if( ibr_best >= 0 ){
01265
01266 if(PRINT_TRACING)
01267 { char str[256]; sprintf(str,"getting ibr_best=%d",ibr_best); STATUS(str); }
01268
01269 bar = DSET_ARRAY( new_dset , ibr_best ) ;
01270 memset( bar , 0 , sizeof(short)*nxyz ) ;
01271 for( iv=0 ; iv < nvox ; iv++ ) bar[indx[iv]] = ibest[iv] ;
01272 stataux[ibr_best] = 0.0 ;
01273
01274 METERIZE(ibr_best) ;
01275 }
01276
01277
01278
01279 if( ibr_perc >= 0 ){
01280
01281 if(PRINT_TRACING)
01282 { char str[256]; sprintf(str,"getting ibr_perc=%d",ibr_perc); STATUS(str); }
01283
01284 if( top_perc > 0.0 ) EDIT_clip_float( top_perc , nvox , pbest ) ;
01285
01286 topval = 0.0 ;
01287 for( iv=0 ; iv < nvox ; iv++ )
01288 if( fabs(pbest[iv]) > topval ) topval = fabs(pbest[iv]) ;
01289
01290 bar = DSET_ARRAY( new_dset , ibr_perc ) ;
01291 memset( bar , 0 , sizeof(short)*nxyz ) ;
01292
01293 if( topval > 0.0 ){
01294 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01295 for( iv=0 ; iv < nvox ; iv++ )
01296 bar[indx[iv]] = (short)(topval * pbest[iv] + 0.499) ;
01297
01298 stataux[ibr_perc] = 1.0/topval ;
01299 } else {
01300 stataux[ibr_perc] = 0.0 ;
01301 }
01302
01303 METERIZE(ibr_perc) ;
01304 }
01305
01306
01307
01308 if( ibr_pave >= 0 ){
01309
01310 if(PRINT_TRACING)
01311 { char str[256]; sprintf(str,"getting ibr_pave=%d",ibr_pave); STATUS(str); }
01312
01313 if( top_perc > 0.0 ) EDIT_clip_float( top_perc , nvox , pabest ) ;
01314
01315 topval = 0.0 ;
01316 for( iv=0 ; iv < nvox ; iv++ )
01317 if( fabs(pabest[iv]) > topval ) topval = fabs(pabest[iv]) ;
01318
01319 bar = DSET_ARRAY( new_dset , ibr_pave ) ;
01320 memset( bar , 0 , sizeof(short)*nxyz ) ;
01321
01322 if( topval > 0.0 ){
01323 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01324 for( iv=0 ; iv < nvox ; iv++ )
01325 bar[indx[iv]] = (short)(topval * pabest[iv] + 0.499) ;
01326
01327 stataux[ibr_pave] = 1.0/topval ;
01328 } else {
01329 stataux[ibr_pave] = 0.0 ;
01330 }
01331
01332 METERIZE(ibr_pave) ;
01333 }
01334
01335
01336
01337 if( ibr_ptop >= 0 ){
01338
01339 if(PRINT_TRACING)
01340 { char str[256]; sprintf(str,"getting ibr_ptop=%d",ibr_ptop); STATUS(str); }
01341
01342 if( top_perc > 0.0 ) EDIT_clip_float( top_perc , nvox , ptbest ) ;
01343
01344 topval = 0.0 ;
01345 for( iv=0 ; iv < nvox ; iv++ )
01346 if( fabs(ptbest[iv]) > topval ) topval = fabs(ptbest[iv]) ;
01347
01348 bar = DSET_ARRAY( new_dset , ibr_ptop ) ;
01349 memset( bar , 0 , sizeof(short)*nxyz ) ;
01350
01351 if( topval > 0.0 ){
01352 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01353 for( iv=0 ; iv < nvox ; iv++ )
01354 bar[indx[iv]] = (short)(topval * ptbest[iv] + 0.499) ;
01355
01356 stataux[ibr_ptop] = 1.0/topval ;
01357 } else {
01358 stataux[ibr_ptop] = 0.0 ;
01359 }
01360
01361 METERIZE(ibr_ptop) ;
01362 }
01363
01364
01365
01366 if( ibr_base >= 0 ){
01367
01368 if(PRINT_TRACING)
01369 { char str[256]; sprintf(str,"getting ibr_base=%d",ibr_base); STATUS(str); }
01370
01371 topval = 0.0 ;
01372 for( iv=0 ; iv < nvox ; iv++ )
01373 if( fabs(bbest[iv]) > topval ) topval = fabs(bbest[iv]) ;
01374
01375 bar = DSET_ARRAY( new_dset , ibr_base ) ;
01376 memset( bar , 0 , sizeof(short)*nxyz ) ;
01377
01378 if( topval > 0.0 ){
01379 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01380 for( iv=0 ; iv < nvox ; iv++ )
01381 bar[indx[iv]] = (short)(topval * bbest[iv] + 0.499) ;
01382
01383 stataux[ibr_base] = 1.0/topval ;
01384 } else {
01385 stataux[ibr_base] = 0.0 ;
01386 }
01387
01388 METERIZE(ibr_base) ;
01389 }
01390
01391
01392
01393 if( ibr_aver >= 0 ){
01394
01395 if(PRINT_TRACING)
01396 { char str[256]; sprintf(str,"getting ibr_aver=%d",ibr_aver); STATUS(str); }
01397
01398 topval = 0.0 ;
01399 for( iv=0 ; iv < nvox ; iv++ )
01400 if( fabs(avbest[iv]) > topval ) topval = fabs(avbest[iv]) ;
01401
01402 bar = DSET_ARRAY( new_dset , ibr_aver ) ;
01403 memset( bar , 0 , sizeof(short)*nxyz ) ;
01404
01405 if( topval > 0.0 ){
01406 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01407 for( iv=0 ; iv < nvox ; iv++ )
01408 bar[indx[iv]] = (short)(topval * avbest[iv] + 0.499) ;
01409
01410 stataux[ibr_aver] = 1.0/topval ;
01411 } else {
01412 stataux[ibr_aver] = 0.0 ;
01413 }
01414
01415 METERIZE(ibr_aver) ;
01416 }
01417
01418
01419
01420 if( ibr_topl >= 0 ){
01421
01422 if(PRINT_TRACING)
01423 { char str[256]; sprintf(str,"getting ibr_topl=%d",ibr_topl); STATUS(str); }
01424
01425 topval = 0.0 ;
01426 for( iv=0 ; iv < nvox ; iv++ )
01427 if( fabs(tlbest[iv]) > topval ) topval = fabs(tlbest[iv]) ;
01428
01429 bar = DSET_ARRAY( new_dset , ibr_topl ) ;
01430 memset( bar , 0 , sizeof(short)*nxyz ) ;
01431
01432 if( topval > 0.0 ){
01433 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01434 for( iv=0 ; iv < nvox ; iv++ )
01435 bar[indx[iv]] = (short)(topval * tlbest[iv] + 0.499) ;
01436
01437 stataux[ibr_topl] = 1.0/topval ;
01438 } else {
01439 stataux[ibr_topl] = 0.0 ;
01440 }
01441
01442 METERIZE(ibr_topl) ;
01443 }
01444
01445
01446
01447 if( ibr_sigm >= 0 ){
01448
01449 if(PRINT_TRACING)
01450 { char str[256]; sprintf(str,"getting ibr_sigm=%d",ibr_sigm); STATUS(str); }
01451
01452 topval = 0.0 ;
01453 for( iv=0 ; iv < nvox ; iv++ )
01454 if( fabs(sgbest[iv]) > topval ) topval = fabs(sgbest[iv]) ;
01455
01456 bar = DSET_ARRAY( new_dset , ibr_sigm ) ;
01457 memset( bar , 0 , sizeof(short)*nxyz ) ;
01458
01459 if( topval > 0.0 ){
01460 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01461 for( iv=0 ; iv < nvox ; iv++ )
01462 bar[indx[iv]] = (short)(topval * sgbest[iv] + 0.499) ;
01463
01464 stataux[ibr_sigm] = 1.0/topval ;
01465 } else {
01466 stataux[ibr_sigm] = 0.0 ;
01467 }
01468
01469 METERIZE(ibr_sigm) ;
01470 }
01471
01472 }
01473
01474
01475
01476
01477 STATUS("setting brick_fac") ;
01478
01479 (void) EDIT_dset_items( new_dset , ADN_brick_fac , stataux , ADN_none ) ;
01480
01481 #ifndef DONT_USE_METER
01482 MCW_set_meter( meter , 100 ) ;
01483 #endif
01484
01485
01486
01487 for( ivec=0 ; ivec < ny_ref ; ivec++ ){
01488 free_PCOR_references(pc_ref[ivec]) ;
01489 free_PCOR_voxel_corr(pc_vc[ivec]) ;
01490 }
01491 free(pc_ref) ; free(pc_vc) ;
01492 if( aval != NULL ) free(aval) ;
01493 if( rbest != NULL ) free(rbest) ;
01494 if( abest != NULL ) free(abest) ;
01495 if( ibest != NULL ) free(ibest) ;
01496 if( pbest != NULL ) free(pbest) ;
01497 if( bbest != NULL ) free(bbest) ;
01498 if( pval != NULL ) free(pval) ;
01499 if( bval != NULL ) free(bval) ;
01500 if( paval != NULL ) free(paval) ;
01501 if( avval != NULL ) free(avval) ;
01502 if( pabest!= NULL ) free(pabest);
01503 if( avbest!= NULL ) free(avbest);
01504 if( ptval != NULL ) free(ptval) ;
01505 if( tlval != NULL ) free(tlval) ;
01506 if( sgval != NULL ) free(sgval) ;
01507 if( ptbest!= NULL ) free(ptbest);
01508 if( tlbest!= NULL ) free(tlbest);
01509 if( sgbest!= NULL ) free(sgbest);
01510
01511
01512
01513
01514 ucode_stuff:
01515
01516 #define MAXUFUN 64
01517 #define MAXTS 32
01518
01519 if( ucode != 0 ){
01520 MCW_function_list * rlist = &(GLOBAL_library.registered_fim) ;
01521 int uuse[MAXUFUN] , nbrik[MAXUFUN] , brik1[MAXUFUN] ;
01522 void * udata[MAXUFUN] ;
01523 generic_func * ufunc[MAXUFUN] ;
01524 int nuse , uu , newbrik , oldbrik ;
01525 FIMdata fd ;
01526 MRI_IMAGE * tsim ;
01527 float * tsar , * val , ** vbr ;
01528 short * sar ;
01529 int nts , jts , nbad=0 ;
01530 MRI_IMARR * imar ;
01531
01532
01533
01534 for( newbrik=nuse=uu=0 ; uu < rlist->num && nuse < MAXUFUN ; uu++ ){
01535 if( (ucode & (1<<uu)) != 0 ){
01536 uuse [nuse] = uu ;
01537 ufunc[nuse] = rlist->funcs[uu] ;
01538 nbrik[nuse] = rlist->flags[uu] ;
01539 udata[nuse] = rlist->func_data[uu] ;
01540 brik1[nuse] = newbrik ;
01541 newbrik += nbrik[nuse] ;
01542 nuse++ ;
01543 }
01544 }
01545
01546 if( nuse == 0 ) goto final_exit ;
01547
01548
01549
01550 fd.ref_ts = ref_ts ;
01551 fd.ort_ts = ort_ts ;
01552 fd.nvox = nvox ;
01553 fd.ignore = im3d->fimdata->init_ignore ;
01554 fd.polort = polort ;
01555
01556 #ifndef DONT_USE_METER
01557 MCW_set_meter( meter , 0 ) ; meter_pold = 0.0 ;
01558 #endif
01559
01560 for( uu=0 ; uu < nuse ; uu++ )
01561 #if 0
01562 ufunc[uu]( ntime , NULL , udata[uu] , nbrik[uu] , (void *)(&fd) ) ;
01563 #else
01564 AFNI_CALL_fim_function( ufunc[uu] ,
01565 ntime, NULL, udata[uu], nbrik[uu], &fd ) ;
01566 #endif
01567
01568
01569
01570
01571
01572
01573 vbr = (float **) malloc(sizeof(float *)*newbrik) ;
01574 for( iv=0 ; iv < newbrik ; iv++ )
01575 vbr[iv] = (float *) malloc(sizeof(float)*nvox) ;
01576
01577 val = (float *) malloc(sizeof(float)*newbrik) ;
01578
01579 for( iv=0 ; iv < nvox ; iv+=MAXTS ){
01580 nts = MIN( MAXTS , nvox-iv ) ;
01581 imar = THD_extract_many_series( nts,indx+iv , dset_time ) ;
01582
01583 for( jts=0 ; jts < nts ; jts++ ){
01584 tsim = IMARR_SUBIMAGE(imar,jts) ;
01585 tsar = MRI_FLOAT_PTR(tsim) ;
01586
01587 for( uu=0 ; uu < nuse ; uu++ ){
01588 #if 0
01589 ufunc[uu]( ntime , tsar ,
01590 udata[uu] , nbrik[uu] , (void *) val ) ;
01591 #else
01592 AFNI_CALL_fim_function( ufunc[uu] ,
01593 ntime, tsar, udata[uu], nbrik[uu], val ) ;
01594 #endif
01595
01596 for( it=0 ; it < nbrik[uu] ; it++ )
01597 vbr[it+brik1[uu]][iv+jts] = val[it] ;
01598 }
01599 }
01600
01601 DESTROY_IMARR(imar) ;
01602
01603 #ifndef DONT_USE_METER
01604 meter_perc = (int) ( 100.0 * iv / nvox ) ;
01605 if( meter_perc != meter_pold ){
01606 MCW_set_meter( meter , meter_perc ) ;
01607 meter_pold = meter_perc ;
01608 }
01609 #endif
01610 }
01611 free(val) ;
01612 #ifndef DONT_USE_METER
01613 MCW_set_meter( meter , 100 ) ;
01614 #endif
01615
01616
01617
01618 if( new_dset != NULL ){
01619 oldbrik = DSET_NVALS(new_dset) ;
01620 } else {
01621 oldbrik = 0 ;
01622
01623 new_dset = EDIT_empty_copy( dset_time ) ;
01624
01625 EDIT_dset_items( new_dset ,
01626 ADN_prefix , new_prefix ,
01627 ADN_malloc_type , DATABLOCK_MEM_MALLOC ,
01628 ADN_type , ISHEAD(dset_time)
01629 ? HEAD_FUNC_TYPE : GEN_FUNC_TYPE ,
01630 ADN_func_type , FUNC_BUCK_TYPE ,
01631 ADN_nvals , newbrik ,
01632 ADN_datum_all , MRI_short ,
01633 ADN_ntt , 0 ,
01634 ADN_none ) ;
01635 }
01636
01637
01638
01639
01640
01641
01642 for( iv=0 ; iv < newbrik ; iv++ ){
01643 tsar = vbr[iv] ;
01644 topval = 0.0 ;
01645
01646 nbad += thd_floatscan( nvox , tsar ) ;
01647
01648 for( it=0 ; it < nvox ; it++ )
01649 if( fabs(tsar[it]) > topval ) topval = fabs(tsar[it]) ;
01650
01651 sar = (short *) calloc(sizeof(short),nxyz) ;
01652
01653 if( topval > 0.0 ){
01654 topval = MRI_TYPE_maxval[MRI_short] / topval ;
01655 for( it=0 ; it < nvox ; it++ )
01656 sar[indx[it]] = (short)(topval * tsar[it] + 0.499) ;
01657
01658 topval = 1.0/topval ;
01659 }
01660
01661 free(tsar) ;
01662
01663 if( oldbrik > 0 ){
01664 EDIT_add_brick( new_dset , MRI_short , topval , sar ) ;
01665 } else {
01666 mri_fix_data_pointer( sar , DSET_BRICK(new_dset,iv) ) ;
01667 EDIT_BRICK_FACTOR( new_dset , iv , topval ) ;
01668 }
01669 }
01670 free(vbr) ;
01671
01672
01673
01674 for( uu=0 ; uu < nuse ; uu++ )
01675 #if 0
01676 ufunc[uu]( -(brik1[uu]+oldbrik) , NULL ,
01677 udata[uu] , nbrik[uu] , (void *) new_dset ) ;
01678 #else
01679 AFNI_CALL_fim_function( ufunc[uu] ,
01680 -(brik1[uu]+oldbrik) , NULL ,
01681 udata[uu] , nbrik[uu] , new_dset ) ;
01682 #endif
01683
01684 if( nbad > 0 )
01685 fprintf(stderr,
01686 "++ Warning: %d bad floats computed by user fimfuncs!\n\a",
01687 nbad ) ;
01688
01689 }
01690
01691 final_exit:
01692 free(vval) ; free(indx) ;
01693
01694
01695
01696 #ifndef DONT_USE_METER
01697 MCW_popdown_meter(meter) ;
01698 #endif
01699
01700 RETURN(new_dset) ;
01701 }
01702
01703
01704
01705 #ifdef USE_FUNC_FIM
01706 void AFNI_fimmer_menu_CB( Widget w , XtPointer cd , XtPointer cbs )
01707 {
01708 FIM_menu * fmenu = (FIM_menu *) cd ;
01709 Three_D_View * im3d = (Three_D_View *) fmenu->parent ;
01710
01711 ENTRY("AFNI_fimmer_menu_CB") ;
01712
01713 if( ! IM3D_OPEN(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
01714
01715
01716
01717 if( w == fmenu->fim_pickref_pb ){
01718 if( IMARR_COUNT(GLOBAL_library.timeseries) > 0 ){
01719 int init_ts = AFNI_ts_in_library( im3d->fimdata->fimref ) ;
01720
01721 MCW_choose_timeseries( fmenu->fim_cbut , "FIM Reference Vector" ,
01722 GLOBAL_library.timeseries , init_ts ,
01723 AFNI_fimmer_pickref_CB , (XtPointer) im3d ) ;
01724 } else {
01725 (void) MCW_popup_message(
01726 fmenu->fim_cbut ,
01727 "No timeseries library\nexists to pick from!" ,
01728 MCW_USER_KILL | MCW_TIMER_KILL ) ;
01729 }
01730 }
01731
01732
01733
01734 else if( w == fmenu->fim_pickort_pb ){
01735 if( IMARR_COUNT(GLOBAL_library.timeseries) > 0 ){
01736 int init_ts = AFNI_ts_in_library( im3d->fimdata->fimort ) ;
01737
01738 MCW_choose_timeseries( fmenu->fim_cbut , "FIM Ort Vector" ,
01739 GLOBAL_library.timeseries , init_ts ,
01740 AFNI_fimmer_pickort_CB , (XtPointer) im3d ) ;
01741 } else {
01742 (void) MCW_popup_message(
01743 fmenu->fim_cbut ,
01744 "No timeseries library\nexists to pick from!" ,
01745 MCW_USER_KILL | MCW_TIMER_KILL ) ;
01746 }
01747 }
01748
01749
01750
01751 else if( w == fmenu->fim_execute_pb ){
01752 AFNI_fimmer_execute( im3d , 0 , 0 ) ;
01753 }
01754
01755
01756
01757 else if( w == fmenu->fim_ignore_down_pb ){
01758 if( im3d->fimdata->init_ignore > 0 )
01759 AFNI_fimmer_setignore( im3d , im3d->fimdata->init_ignore - 1 ) ;
01760 }
01761
01762 else if( w == fmenu->fim_ignore_up_pb ){
01763 AFNI_fimmer_setignore( im3d , im3d->fimdata->init_ignore + 1 ) ;
01764 }
01765
01766 else if( w == fmenu->fim_ignore_choose_pb ){
01767 #ifdef USE_OPTMENUS
01768 AFNI_fimmer_ignore_choose_CB( fmenu->fim_ignore_choose_av , im3d ) ;
01769 #else
01770 MCW_choose_integer( fmenu->fim_cbut , "Initial Ignore" ,
01771 0 , 999 , im3d->fimdata->init_ignore ,
01772 AFNI_fimmer_ignore_choose_CB , (XtPointer) im3d ) ;
01773 #endif
01774 }
01775
01776
01777
01778
01779 #define STRLIST_SIZE (THD_MAX_PREFIX+12)
01780
01781 else if( w == fmenu->fim_pickdset_pb ){
01782 static char * strlist[THD_MAX_SESSION_SIZE] ;
01783 static int first_call = 1 ;
01784
01785 int num_str , ii , init_str=-1 , vv , jj ;
01786
01787
01788
01789 if( GLOBAL_library.have_dummy_dataset ){ BEEPIT ; EXRETURN ; }
01790
01791 if( first_call ){
01792 for( ii=0 ; ii < THD_MAX_SESSION_SIZE ; ii++ )
01793 strlist[ii] = (char*)XtMalloc( sizeof(char) * (STRLIST_SIZE+1) ) ;
01794 first_call = 0 ;
01795 }
01796
01797
01798
01799 num_str = 0 ;
01800 vv = im3d->vinfo->view_type ;
01801 for( ii=0 ; ii < im3d->ss_now->num_dsset ; ii++ ){
01802
01803 if( DSET_GRAPHABLE(im3d->ss_now->dsset[ii][vv]) ){
01804 MCW_strncpy( strlist[num_str] ,
01805 im3d->ss_now->dsset[ii][vv]->dblk->diskptr->prefix ,
01806 THD_MAX_PREFIX ) ;
01807
01808 jj = ii ;
01809
01810 if( im3d->fimdata->fimdset == im3d->ss_now->dsset[ii][vv] )
01811 init_str = num_str ;
01812
01813 num_str ++ ;
01814 }
01815 }
01816
01817
01818
01819 if( num_str <= 0 ){
01820
01821 (void) MCW_popup_message(
01822 fmenu->fim_cbut ,
01823 "No time dependent (3D+time)\n"
01824 "datasets exist to choose from!" ,
01825 MCW_USER_KILL | MCW_TIMER_KILL ) ;
01826
01827 } else if( num_str == 1 ){
01828
01829 im3d->fimdata->fimdset = im3d->ss_now->dsset[jj][vv] ;
01830 ALLOW_COMPUTE_FIM(im3d) ;
01831
01832 } else {
01833
01834 MCW_choose_strlist( fmenu->fim_cbut , "3D+time Dataset" ,
01835 num_str , init_str , strlist ,
01836 AFNI_fimmer_dset_choose_CB , (XtPointer) im3d ) ;
01837 }
01838 }
01839
01840
01841
01842 else {
01843 XBell( im3d->dc->display , 100 ) ;
01844 }
01845
01846
01847
01848 EXRETURN ;
01849 }
01850 #endif
01851
01852
01853
01854 #ifdef USE_FUNC_FIM
01855
01856 #ifdef USE_OPTMENUS
01857 void AFNI_fimmer_ignore_choose_CB( MCW_arrowval * cbs , XtPointer cd )
01858 #else
01859 void AFNI_fimmer_ignore_choose_CB( Widget wcaller, XtPointer cd, MCW_choose_cbs * cbs )
01860 #endif
01861 {
01862 Three_D_View * im3d = (Three_D_View *) cd ;
01863
01864 if( ! IM3D_VALID(im3d) ) return ;
01865
01866 AFNI_fimmer_setignore( im3d , cbs->ival ) ;
01867 return ;
01868 }
01869 #endif
01870
01871 #ifdef USE_FUNC_FIM
01872 void AFNI_fimmer_dset_choose_CB( Widget wcaller , XtPointer cd , MCW_choose_cbs * cbs )
01873 {
01874 Three_D_View * im3d = (Three_D_View *) cd ;
01875 int ii , vv , num_str ;
01876
01877 if( ! IM3D_VALID(im3d) ) return ;
01878 if( GLOBAL_library.have_dummy_dataset ){ BEEPIT ; EXRETURN ; }
01879
01880 num_str = 0 ;
01881 vv = im3d->vinfo->view_type ;
01882 for( ii=0 ; ii < im3d->ss_now->num_dsset ; ii++ ){
01883 if( DSET_GRAPHABLE(im3d->ss_now->dsset[ii][vv]) ){
01884 if( num_str == cbs->ival ) break ;
01885 num_str ++ ;
01886 }
01887 }
01888
01889 if( ii < im3d->ss_now->num_dsset ){
01890 im3d->fimdata->fimdset = im3d->ss_now->dsset[ii][vv] ;
01891 ALLOW_COMPUTE_FIM(im3d) ;
01892 } else {
01893 fprintf(stderr,"\n*** Illegal choice in AFNI_fimmer_dset_choose_CB:"
01894 "\n*** cbs->ival = %d but num_str = %d\a\n",
01895 cbs->ival , num_str ) ;
01896 }
01897
01898 return ;
01899 }
01900 #endif
01901
01902
01903
01904 void AFNI_fimmer_execute( Three_D_View * im3d , int code, int ucode )
01905 {
01906 THD_3dim_dataset * new_dset , * dset_time ;
01907 MRI_IMAGE * ref_ts , * ort_ts ;
01908 THD_session * sess ;
01909 int ifunc ;
01910
01911 ENTRY("AFNI_fimmer_execute") ;
01912
01913 if( ! IM3D_OPEN(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
01914 if( GLOBAL_library.have_dummy_dataset ){ BEEPIT ; EXRETURN ; }
01915
01916 #if 0
01917 dset_time = im3d->anat_now ;
01918 #else
01919 dset_time = im3d->fimdata->fimdset ;
01920 #endif
01921
01922 if( ! DSET_GRAPHABLE(dset_time) ){ XBell(im3d->dc->display,100) ; EXRETURN ; }
01923
01924 ref_ts = im3d->fimdata->fimref ;
01925 ort_ts = im3d->fimdata->fimort ;
01926 if( ref_ts == NULL ){ XBell(im3d->dc->display,100) ; EXRETURN ; }
01927
01928 sess = im3d->ss_now ;
01929 if( ! ISVALID_SESSION(sess) || sess->num_dsset >= THD_MAX_SESSION_SIZE ){
01930 XBell(im3d->dc->display,100) ; EXRETURN ;
01931 }
01932
01933 SHOW_AFNI_PAUSE ;
01934
01935
01936
01937 new_dset = AFNI_fimmer_compute( im3d, dset_time, ref_ts, ort_ts,
01938 sess, code,ucode ) ;
01939
01940
01941
01942 if( new_dset == NULL ){
01943 SHOW_AFNI_READY ;
01944 XBell(im3d->dc->display,100) ; EXRETURN ;
01945 }
01946
01947 AFNI_fimmer_redisplay( 1 , im3d , new_dset ) ;
01948 AFNI_SEE_FUNC_ON(im3d) ;
01949
01950
01951
01952 { char his[512] ; int hh ;
01953 tross_Copy_History( dset_time , new_dset ) ;
01954 sprintf(his,"afni FIM: 3D+time=%s ignore=%d polort=%d",
01955 DSET_HEADNAME(dset_time) ,
01956 im3d->fimdata->init_ignore , im3d->fimdata->polort ) ;
01957 if( ref_ts->name != NULL ){
01958 hh = strlen(his) ; sprintf(his+hh," ref=%s",ref_ts->name) ;
01959 }
01960 if( ort_ts != NULL && ort_ts->name != NULL ){
01961 hh = strlen(his) ; sprintf(his+hh," ort=%s",ort_ts->name) ;
01962 }
01963 tross_Append_History( new_dset , his ) ;
01964 }
01965
01966
01967
01968 (void) THD_write_3dim_dataset( NULL,NULL , new_dset , True ) ;
01969
01970
01971
01972 AFNI_force_adoption( sess , False ) ;
01973 AFNI_make_descendants( GLOBAL_library.sslist ) ;
01974
01975 SHOW_AFNI_READY ;
01976 EXRETURN ;
01977 }
01978
01979
01980
01981 void AFNI_fimmer_redisplay( int first_call ,
01982 Three_D_View * im3d , THD_3dim_dataset * new_dset )
01983 {
01984 int ifunc ;
01985 THD_session * sess = im3d->ss_now ;
01986
01987 ENTRY("AFNI_fimmer_redisplay") ;
01988
01989 if( first_call ){
01990
01991 STATUS("first_call mode") ;
01992
01993
01994
01995 ifunc = sess->num_dsset ;
01996 sess->dsset[ifunc][new_dset->view_type] = new_dset ;
01997 sess->num_dsset ++ ;
01998 im3d->vinfo->func_num = ifunc ;
01999
02000 STATUS("loading statistics") ;
02001 THD_load_statistics( new_dset ) ;
02002
02003 im3d->vinfo->fim_index = 0 ;
02004 im3d->vinfo->thr_index = 1 ;
02005 if( DSET_NVALS(new_dset) == 1 ) im3d->vinfo->thr_index = 0 ;
02006
02007 AFNI_initialize_view( im3d->anat_now , im3d ) ;
02008
02009 } else {
02010
02011 STATUS("redisplay mode") ;
02012
02013
02014
02015 STATUS("loading statistics") ;
02016 THD_load_statistics( new_dset ) ;
02017 AFNI_reset_func_range( im3d ) ;
02018 AFNI_set_thr_pval( im3d ) ;
02019
02020 AFNI_redisplay_func( im3d ) ;
02021 }
02022
02023 EXRETURN ;
02024 }
02025
02026
02027
02028
02029
02030
02031 void AFNI_add_interruptable( Widget w )
02032 {
02033 Window wwin , wroot , wpar ;
02034 int ii ;
02035 Window * wchild ;
02036 unsigned int nchild ;
02037
02038
02039
02040 if( w == NULL ){
02041 if( GLOBAL_library.interruptables.windows != NULL ){
02042 DESTROY_XTARR( GLOBAL_library.interruptables.windows ) ;
02043 GLOBAL_library.interruptables.windows = NULL ;
02044 }
02045
02046 if( GLOBAL_library.interruptables.widgets != NULL ){
02047 for( ii=0 ; ii < GLOBAL_library.interruptables.widgets->num ; ii++ )
02048 MCW_set_widget_cursor( GLOBAL_library.interruptables.widgets->ar[ii] , 0 );
02049
02050 DESTROY_XTARR( GLOBAL_library.interruptables.widgets ) ;
02051 GLOBAL_library.interruptables.widgets = NULL ;
02052 }
02053 return ;
02054 }
02055
02056
02057
02058 if( ! XtIsRealized(w) ) return ;
02059 wwin = XtWindowOfObject(w) ; if( wwin == (Window) NULL ) return ;
02060
02061
02062
02063 nchild = 0 ;
02064 (void) XQueryTree( XtDisplay(w) , wwin , &wroot , &wpar , &wchild , &nchild ) ;
02065
02066 if( GLOBAL_library.interruptables.windows == NULL )
02067 INIT_XTARR( GLOBAL_library.interruptables.windows ) ;
02068
02069 if( GLOBAL_library.interruptables.widgets == NULL )
02070 INIT_XTARR( GLOBAL_library.interruptables.widgets ) ;
02071
02072 ADDTO_XTARR( GLOBAL_library.interruptables.windows , wwin ) ;
02073 ADDTO_XTARR( GLOBAL_library.interruptables.widgets , w ) ;
02074
02075 for( ii=0 ; ii < nchild ; ii++ )
02076 ADDTO_XTARR( GLOBAL_library.interruptables.windows , wchild[ii] ) ;
02077
02078 XFree( wchild ) ;
02079
02080 NORMAL_cursorize( w) ;
02081
02082 return ;
02083 }
02084
02085
02086
02087 void AFNI_process_interrupts( Widget w )
02088 {
02089 Display * dis = XtDisplay(w) ;
02090 XEvent ev ;
02091 int ii , nwin ;;
02092
02093
02094
02095 XFlush( dis ) ; XmUpdateDisplay( w ) ;
02096
02097
02098
02099 if( GLOBAL_library.interruptables.windows == NULL ||
02100 GLOBAL_library.interruptables.windows->num == 0 ) return ;
02101
02102 nwin = GLOBAL_library.interruptables.windows->num ;
02103
02104
02105
02106
02107
02108 while( XCheckMaskEvent( dis ,
02109 ButtonPressMask | ButtonReleaseMask |
02110 ButtonMotionMask | PointerMotionMask |
02111 KeyPressMask | KeyReleaseMask , &ev ) ){
02112
02113 for( ii=0 ; ii < nwin ; ii++ ){
02114 if( ev.xany.window ==
02115 (Window) GLOBAL_library.interruptables.windows->ar[ii] ){
02116
02117 XtDispatchEvent( &ev ) ;
02118 break ;
02119 }
02120 }
02121
02122 if( ii == nwin ) XBell( dis , 100 ) ;
02123 XUngrabPointer( dis , CurrentTime ) ;
02124 }
02125
02126 return ;
02127 }
02128
02129
02130
02131 #ifdef USE_FUNC_FIM
02132 void AFNI_fimmer_fix_optmenu( Three_D_View * im3d )
02133 {
02134 int igtop , ntime ;
02135
02136 ENTRY("AFNI_fimmer_fix_optmenu") ;
02137
02138 if( ! IM3D_VALID(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
02139
02140
02141
02142 if( im3d->fimdata->fimdset == NULL ) EXRETURN ;
02143 ntime = DSET_NUM_TIMES(im3d->fimdata->fimdset) ; if( ntime < 2 ) EXRETURN ;
02144
02145 igtop = MIN( ntime-3 , 99 ) ;
02146 igtop = MAX( igtop , 1 ) ;
02147
02148 if( im3d->vwid->func->fim_menu->fim_ignore_choose_av->imax != igtop ){
02149
02150 if(PRINT_TRACING)
02151 { char str[256] ;
02152 sprintf(str,"refit 0..%d, init %d",igtop,im3d->fimdata->init_ignore) ;
02153 STATUS(str) ; }
02154
02155 refit_MCW_optmenu( im3d->vwid->func->fim_menu->fim_ignore_choose_av ,
02156 0 , igtop , im3d->fimdata->init_ignore, 0,
02157 NULL , NULL ) ;
02158 } else {
02159
02160 if(PRINT_TRACING)
02161 { char str[256] ;
02162 sprintf(str,"assign init %d",im3d->fimdata->init_ignore) ;
02163 STATUS(str) ; }
02164
02165 AV_assign_ival( im3d->vwid->func->fim_menu->fim_ignore_choose_av ,
02166 im3d->fimdata->init_ignore ) ;
02167 }
02168
02169 EXRETURN ;
02170 }
02171 #endif