00001 #include "afni.h"
00002
00003
00004
00005
00006
00007 void AFNI_time_lock_change_CB( Widget w , XtPointer cd , XtPointer calld )
00008 {
00009 Three_D_View *im3d = (Three_D_View *) cd ;
00010 Three_D_View *qq3d ;
00011 int bval , ii , bold ;
00012
00013 ENTRY("AFNI_time_lock_change_CB") ;
00014
00015 if( ! IM3D_VALID(im3d) ) EXRETURN ;
00016
00017
00018
00019 bold = GLOBAL_library.time_lock ;
00020 bval = MCW_val_bbox( im3d->vwid->dmode->time_lock_bbox ) ;
00021 if( bval == bold ) EXRETURN ;
00022
00023
00024
00025 GLOBAL_library.time_lock = bval ;
00026
00027
00028
00029 for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ ){
00030 qq3d = GLOBAL_library.controllers[ii] ;
00031 if( qq3d == im3d || ! IM3D_VALID(qq3d) ) continue ;
00032
00033 MCW_set_bbox( qq3d->vwid->dmode->time_lock_bbox , bval ) ;
00034 }
00035 RESET_AFNI_QUIT(im3d) ;
00036 EXRETURN ;
00037 }
00038
00039
00040
00041 void AFNI_time_lock_carryout( Three_D_View *im3d )
00042 {
00043 Three_D_View *qq3d ;
00044 MCW_arrowval *tav ;
00045 int new_index , qq_index , qq_top , cc , glock , ii ;
00046 static int busy = 0 ;
00047
00048 ENTRY("AFNI_time_lock_carryout") ;
00049
00050
00051
00052 glock = GLOBAL_library.controller_lock ;
00053
00054 if( busy ) EXRETURN ;
00055 if( glock == 0 ) EXRETURN ;
00056 if( !IM3D_OPEN(im3d) ) EXRETURN ;
00057 if( GLOBAL_library.ignore_lock ) EXRETURN ;
00058 if( ! GLOBAL_library.time_lock ) EXRETURN ;
00059
00060 ii = AFNI_controller_index(im3d) ;
00061
00062 if( ii < 0 ) EXRETURN ;
00063 if( ((1<<ii) & glock) == 0 ) EXRETURN ;
00064
00065
00066
00067 busy = 1 ;
00068
00069
00070
00071 new_index = im3d->vinfo->time_index ;
00072
00073
00074
00075
00076
00077 for( cc=0 ; cc < MAX_CONTROLLERS ; cc++ ){
00078
00079 qq3d = GLOBAL_library.controllers[cc] ;
00080
00081 if( IM3D_OPEN(qq3d) && qq3d != im3d && ((1<<cc) & glock) != 0 ){
00082
00083 qq_index = qq3d->vinfo->time_index ;
00084 qq_top = qq3d->vinfo->top_index ;
00085
00086 if( qq3d->vinfo->time_on && qq_top > 1 && qq_index != new_index ){
00087 tav = qq3d->vwid->imag->time_index_av ;
00088 AV_assign_ival( tav , new_index ) ;
00089 if( tav->ival != qq_index )
00090 AFNI_time_index_CB( tav , (XtPointer) qq3d ) ;
00091 }
00092 }
00093 }
00094
00095 busy = 0 ;
00096 EXRETURN ;
00097 }
00098
00099
00100
00101
00102
00103 void AFNI_lock_enforce_CB( Widget w , XtPointer cd , XtPointer calld )
00104 {
00105 Three_D_View *im3d = (Three_D_View *) cd ;
00106
00107 ENTRY("AFNI_lock_enforce_CB") ;
00108 AFNI_lock_carryout( im3d ) ;
00109 AFNI_time_lock_carryout( im3d ) ;
00110 RESET_AFNI_QUIT(im3d) ;
00111 EXRETURN ;
00112 }
00113
00114
00115
00116 void AFNI_lock_change_CB( Widget w , XtPointer cd , XtPointer calld )
00117 {
00118 Three_D_View *im3d = (Three_D_View *) cd ;
00119 Three_D_View *qq3d ;
00120 int bval , ii , bold ;
00121
00122 ENTRY("AFNI_lock_change_CB") ;
00123
00124 if( ! IM3D_VALID(im3d) ) EXRETURN ;
00125
00126
00127
00128 bold = GLOBAL_library.controller_lock ;
00129 bval = MCW_val_bbox( im3d->vwid->dmode->lock_bbox ) ;
00130 if( bval == bold ) EXRETURN ;
00131
00132
00133
00134 GLOBAL_library.controller_lock = bval ;
00135
00136
00137
00138 for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ ){
00139 qq3d = GLOBAL_library.controllers[ii] ;
00140 if( qq3d == im3d || ! IM3D_VALID(qq3d) ) continue ;
00141
00142 MCW_set_bbox( qq3d->vwid->dmode->lock_bbox , bval ) ;
00143 }
00144 RESET_AFNI_QUIT(im3d) ;
00145 EXRETURN ;
00146 }
00147
00148
00149
00150 void AFNI_lock_clear_CB( Widget w , XtPointer cd , XtPointer calld )
00151 {
00152 Three_D_View *qq3d ;
00153 int ii ;
00154
00155 ENTRY("AFNI_lock_clear_CB") ;
00156
00157 GLOBAL_library.controller_lock = 0 ;
00158 for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ ){
00159 qq3d = GLOBAL_library.controllers[ii] ;
00160 if( IM3D_VALID(qq3d) )
00161 MCW_set_bbox( qq3d->vwid->dmode->lock_bbox , 0 ) ;
00162 }
00163 EXRETURN ;
00164 }
00165
00166
00167
00168 void AFNI_lock_setall_CB( Widget w , XtPointer cd , XtPointer calld )
00169 {
00170 Three_D_View *qq3d ;
00171 int ii ;
00172
00173 ENTRY("AFNI_lock_setall_CB") ;
00174
00175 GLOBAL_library.controller_lock = 0 ;
00176 for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ )
00177 GLOBAL_library.controller_lock |= (1<<ii) ;
00178
00179 for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ ){
00180 qq3d = GLOBAL_library.controllers[ii] ;
00181 if( IM3D_VALID(qq3d) )
00182 MCW_set_bbox( qq3d->vwid->dmode->lock_bbox ,
00183 GLOBAL_library.controller_lock ) ;
00184 }
00185 EXRETURN ;
00186 }
00187
00188
00189
00190 void AFNI_lock_carryout( Three_D_View *im3d )
00191 {
00192 Three_D_View *qq3d ;
00193 int ii,jj,kk , cc , glock ;
00194 THD_fvec3 old_fv , fv ;
00195 THD_ivec3 iv ;
00196 THD_dataxes *qaxes , *daxes ;
00197 static int busy = 0 ;
00198
00199 ENTRY("AFNI_lock_carryout") ;
00200
00201
00202
00203 glock = GLOBAL_library.controller_lock ;
00204
00205 if( busy ) EXRETURN ;
00206 if( glock == 0 ) EXRETURN ;
00207 if( !IM3D_OPEN(im3d) ) EXRETURN ;
00208 if( GLOBAL_library.ignore_lock ) EXRETURN ;
00209
00210 ii = AFNI_controller_index(im3d) ;
00211
00212 if( ii < 0 ) EXRETURN ;
00213 if( ((1<<ii) & glock) == 0 ) EXRETURN ;
00214
00215
00216
00217 busy = 1 ;
00218
00219
00220
00221 LOAD_FVEC3( old_fv , im3d->vinfo->xi, im3d->vinfo->yj, im3d->vinfo->zk ) ;
00222
00223 LOAD_ANAT_VIEW(im3d) ;
00224 daxes = CURRENT_DAXES(im3d->anat_now) ;
00225
00226
00227
00228
00229
00230
00231 for( cc=0 ; cc < MAX_CONTROLLERS ; cc++ ){
00232
00233 qq3d = GLOBAL_library.controllers[cc] ;
00234
00235 if( IM3D_OPEN(qq3d) && qq3d != im3d && ((1<<cc) & glock) != 0 ){
00236
00237 LOAD_ANAT_VIEW(qq3d) ;
00238 qaxes = CURRENT_DAXES(qq3d->anat_now) ;
00239
00240 if( !GLOBAL_library.ijk_lock ){
00241
00242 fv = AFNI_transform_vector( im3d->anat_now, old_fv, qq3d->anat_now ) ;
00243 fv = THD_dicomm_to_3dmm( qq3d->anat_now , fv ) ;
00244 iv = THD_3dmm_to_3dind ( qq3d->anat_now , fv ) ;
00245 ii = iv.ijk[0] ; jj = iv.ijk[1] ; kk = iv.ijk[2] ;
00246
00247 } else {
00248
00249 ii = im3d->vinfo->i1 * qaxes->nxx / daxes->nxx ;
00250 jj = im3d->vinfo->j2 * qaxes->nyy / daxes->nyy ;
00251 kk = im3d->vinfo->k3 * qaxes->nzz / daxes->nzz ;
00252 }
00253
00254
00255
00256 if( ii >= 0 && ii < qaxes->nxx &&
00257 jj >= 0 && jj < qaxes->nyy && kk >= 0 && kk < qaxes->nzz ){
00258
00259 SAVE_VPT(qq3d) ;
00260 AFNI_set_viewpoint( qq3d , ii,jj,kk , REDISPLAY_ALL ) ;
00261 }
00262 }
00263 }
00264
00265 busy = 0 ;
00266 EXRETURN ;
00267 }
00268
00269
00270
00271
00272
00273 void AFNI_ijk_lock_change_CB( Widget w , XtPointer cd , XtPointer calld )
00274 {
00275 Three_D_View *im3d = (Three_D_View *) cd ;
00276 Three_D_View *qq3d ;
00277 int bval , ii , bold ;
00278
00279 ENTRY("AFNI_ijk_lock_change_CB") ;
00280
00281 if( ! IM3D_VALID(im3d) ) EXRETURN ;
00282
00283
00284
00285 bold = GLOBAL_library.ijk_lock ;
00286 bval = MCW_val_bbox( im3d->vwid->dmode->ijk_lock_bbox ) ;
00287 if( bval == bold ) EXRETURN ;
00288
00289
00290
00291 GLOBAL_library.ijk_lock = bval ;
00292
00293
00294
00295 for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ ){
00296 qq3d = GLOBAL_library.controllers[ii] ;
00297 if( qq3d == im3d || ! IM3D_VALID(qq3d) ) continue ;
00298
00299 MCW_set_bbox( qq3d->vwid->dmode->ijk_lock_bbox , bval ) ;
00300 }
00301 RESET_AFNI_QUIT(im3d) ;
00302 EXRETURN ;
00303 }
00304
00305
00306
00307 void AFNI_thresh_lock_carryout( Three_D_View *im3d )
00308 {
00309 Three_D_View *qq3d ;
00310 static int busy = 0 ;
00311 int glock , cc,ii , dopval,dothresh ;
00312 float thresh , pval , tval ;
00313 char cmd[64] , *eee ;
00314
00315 ENTRY("AFNI_thresh_lock_carryout") ;
00316
00317
00318
00319 glock = GLOBAL_library.controller_lock ;
00320
00321 if( busy ) EXRETURN;
00322 if( glock == 0 ) EXRETURN;
00323 if( !IM3D_OPEN(im3d) ) EXRETURN;
00324 if( GLOBAL_library.ignore_lock ) EXRETURN;
00325
00326 eee = getenv( "AFNI_THRESH_LOCK" ) ;
00327 if( eee == NULL ) EXRETURN ;
00328 dothresh = (*eee == 'V' || *eee == 'v') ;
00329 dopval = (*eee == 'P' || *eee == 'p') && im3d->fim_now != NULL ;
00330 if( !dothresh && !dopval ) EXRETURN ;
00331
00332 ii = AFNI_controller_index(im3d) ;
00333
00334 if( ii < 0 ) EXRETURN ;
00335 if( ((1<<ii) & glock) == 0 ) EXRETURN ;
00336
00337
00338
00339 busy = 1 ;
00340
00341
00342
00343 thresh = im3d->vinfo->func_threshold * im3d->vinfo->func_thresh_top ;
00344
00345
00346
00347 if( dopval ){
00348 pval = THD_stat_to_pval( thresh ,
00349 DSET_BRICK_STATCODE(im3d->fim_now,im3d->vinfo->thr_index) ,
00350 DSET_BRICK_STATAUX (im3d->fim_now,im3d->vinfo->thr_index) ) ;
00351 if( pval < 0.0 || pval > 1.0 ){ dopval = 0; dothresh = 1; }
00352 }
00353
00354
00355
00356
00357
00358 for( cc=0 ; cc < MAX_CONTROLLERS ; cc++ ){
00359
00360 qq3d = GLOBAL_library.controllers[cc] ;
00361
00362 if( IM3D_OPEN(qq3d) && qq3d != im3d && ((1<<cc) & glock) != 0 ){
00363
00364 if( dothresh )
00365 sprintf( cmd , "SET_THRESHNEW %c %.4f **" , 'A'+cc , thresh ) ;
00366 else if( dopval && qq3d->fim_now != NULL &&
00367 DSET_BRICK_STATCODE(qq3d->fim_now,qq3d->vinfo->thr_index) > 0 )
00368 sprintf( cmd , "SET_THRESHNEW %c %g *p" , 'A'+cc , pval ) ;
00369 else
00370 continue ;
00371
00372 AFNI_driver( cmd ) ;
00373 }
00374 }
00375
00376 busy = 0 ;
00377 EXRETURN ;
00378 }
00379
00380
00381
00382 void AFNI_equate_pbars( Three_D_View *lh3d , Three_D_View *rh3d )
00383 {
00384 MCW_pbar *lbar , *rbar ;
00385 char cmd[1024] ;
00386 int cc , qq ;
00387 MCW_DCOV *ovc = GLOBAL_library.dc->ovc ;
00388
00389 ENTRY("AFNI_equate_pbars") ;
00390
00391 if( !IM3D_OPEN(lh3d) || !IM3D_OPEN(rh3d) ) EXRETURN ;
00392
00393 lbar = lh3d->vwid->func->inten_pbar ;
00394 rbar = rh3d->vwid->func->inten_pbar ;
00395
00396 cc = AFNI_controller_index(lh3d) ; if( cc < 0 ) EXRETURN ;
00397
00398 if( !rbar->bigmode ){
00399 sprintf(cmd,"SET_PBAR_ALL %c.%c%d" , 'A'+cc ,
00400 (rbar->mode) ? '+' : '-' , rbar->num_panes ) ;
00401 for( qq=0 ; qq < rbar->num_panes ; qq++ )
00402 sprintf(cmd+strlen(cmd)," %s=%s",
00403 AV_uformat_fval(rbar->pval[qq]) ,
00404 ovc->label_ov[rbar->ov_index[qq]] ) ;
00405 } else {
00406 sprintf(cmd,"SET_PBAR_ALL %c.%c%d %f %s\n" , 'A'+cc ,
00407 (rbar->mode) ? '+' : '-' , 99 ,
00408 rbar->bigtop , PBAR_get_bigmap(rbar) ) ;
00409 if( rbar->bigflip )
00410 sprintf(cmd+strlen(cmd)," FLIP") ;
00411 if( rbar->bigrota )
00412 sprintf(cmd+strlen(cmd)," ROTA=%d",rbar->bigrota) ;
00413 }
00414
00415 AFNI_driver( cmd ) ; EXRETURN ;
00416 }
00417
00418
00419
00420 void AFNI_pbar_lock_carryout( Three_D_View *im3d )
00421 {
00422 Three_D_View *qq3d ;
00423 static int busy = 0 ;
00424 int glock , cc,ii ;
00425 char *eee ;
00426
00427 ENTRY("AFNI_pbar_lock_carryout") ;
00428
00429
00430
00431 glock = GLOBAL_library.controller_lock ;
00432
00433 if( busy ) EXRETURN;
00434 if( glock == 0 ) EXRETURN;
00435 if( !IM3D_OPEN(im3d) ) EXRETURN;
00436 if( GLOBAL_library.ignore_lock ) EXRETURN;
00437
00438 eee = getenv( "AFNI_PBAR_LOCK" ) ;
00439 if( eee == NULL ) EXRETURN ;
00440 if( *eee != 'Y' && *eee != 'y' ) EXRETURN ;
00441
00442 ii = AFNI_controller_index(im3d) ;
00443
00444 if( ii < 0 ) EXRETURN ;
00445 if( ((1<<ii) & glock) == 0 ) EXRETURN ;
00446
00447
00448
00449 busy = 1 ;
00450
00451
00452
00453
00454 for( cc=0 ; cc < MAX_CONTROLLERS ; cc++ ){
00455
00456 qq3d = GLOBAL_library.controllers[cc] ;
00457
00458 if( IM3D_OPEN(qq3d) && qq3d != im3d && ((1<<cc) & glock) != 0 ){
00459
00460 AFNI_equate_pbars( qq3d , im3d ) ;
00461 }
00462 }
00463
00464 busy = 0 ;
00465 EXRETURN ;
00466 }
00467
00468
00469
00470 void AFNI_thrdrag_lock_carryout( Three_D_View *im3d )
00471 {
00472 Three_D_View *qq3d ;
00473 static int busy = 0 ;
00474 int glock , cc,ii , dothresh,dopval , ival , stop ;
00475 float thresh , pval , tval ;
00476 char *eee ;
00477
00478 ENTRY("AFNI_thrdrag_lock_carryout") ;
00479
00480
00481
00482 glock = GLOBAL_library.controller_lock ;
00483
00484 if( busy ) EXRETURN;
00485 if( glock == 0 ) EXRETURN;
00486 if( !IM3D_OPEN(im3d) ) EXRETURN;
00487 if( GLOBAL_library.ignore_lock ) EXRETURN;
00488
00489 eee = getenv( "AFNI_THRESH_LOCK" ) ;
00490 if( eee == NULL ) EXRETURN ;
00491 dothresh = (*eee == 'V' || *eee == 'v') ;
00492 dopval = (*eee == 'P' || *eee == 'p') && im3d->fim_now != NULL ;
00493 if( !dothresh && !dopval ) EXRETURN ;
00494
00495 ii = AFNI_controller_index(im3d) ;
00496
00497 if( ii < 0 ) EXRETURN ;
00498 if( ((1<<ii) & glock) == 0 ) EXRETURN ;
00499
00500
00501
00502 busy = 1 ;
00503
00504 ival = rint(im3d->vinfo->func_threshold/THR_FACTOR) ;
00505 thresh = im3d->vinfo->func_threshold * im3d->vinfo->func_thresh_top ;
00506 stop = (int)( rint( pow(10.0,THR_TOP_EXPON) ) - 1.0 ) ;
00507
00508 if( dopval ){
00509 pval = THD_stat_to_pval( thresh ,
00510 DSET_BRICK_STATCODE(im3d->fim_now,im3d->vinfo->thr_index) ,
00511 DSET_BRICK_STATAUX (im3d->fim_now,im3d->vinfo->thr_index) ) ;
00512 if( pval < 0.0 || pval > 1.0 ){ dopval = 0; dothresh = 1; }
00513 }
00514
00515
00516
00517
00518
00519 for( cc=0 ; cc < MAX_CONTROLLERS ; cc++ ){
00520
00521 qq3d = GLOBAL_library.controllers[cc] ;
00522
00523 if( IM3D_OPEN(qq3d) && qq3d != im3d && ((1<<cc) & glock) != 0 ){
00524
00525 if( qq3d->vinfo->func_thresh_top == im3d->vinfo->func_thresh_top ){
00526
00527 if( dopval && qq3d->fim_now != NULL &&
00528 DSET_BRICK_STATCODE(qq3d->fim_now,qq3d->vinfo->thr_index) > 0 ){
00529
00530 tval = THD_pval_to_stat( pval ,
00531 DSET_BRICK_STATCODE(qq3d->fim_now,qq3d->vinfo->thr_index),
00532 DSET_BRICK_STATAUX (qq3d->fim_now,qq3d->vinfo->thr_index) );
00533 ival = rint( tval/(THR_FACTOR*qq3d->vinfo->func_thresh_top) ) ;
00534 if( ival < 0 ) ival = 0 ; else if( ival > stop ) ival = stop ;
00535
00536 } else if( !dothresh ){
00537 continue ;
00538 }
00539
00540
00541
00542 XmScaleSetValue( qq3d->vwid->func->thr_scale , ival ) ;
00543 qq3d->vinfo->func_threshold = THR_FACTOR * ival ;
00544 AFNI_set_thr_pval( qq3d ) ;
00545 }
00546 }
00547 }
00548
00549 busy = 0 ;
00550 EXRETURN ;
00551 }
00552
00553
00554
00555 void AFNI_range_lock_carryout( Three_D_View *im3d )
00556 {
00557 Three_D_View *qq3d ;
00558 static int busy = 0 ;
00559 int glock , cc,ii,nn ;
00560 float val ;
00561 char cmd[64] , *eee ;
00562
00563 ENTRY("AFNI_range_lock_carryout") ;
00564
00565
00566
00567 glock = GLOBAL_library.controller_lock ;
00568
00569 if( busy ) EXRETURN;
00570 if( glock == 0 ) EXRETURN;
00571 if( !IM3D_OPEN(im3d) ) EXRETURN;
00572 if( GLOBAL_library.ignore_lock ) EXRETURN;
00573
00574 eee = getenv( "AFNI_RANGE_LOCK" );
00575 if( eee == NULL ) EXRETURN;
00576 if( *eee != 'Y' && *eee != 'y' ) EXRETURN;
00577
00578 ii = AFNI_controller_index(im3d);
00579
00580 if( ii < 0 ) EXRETURN;
00581 if( ((1<<ii) & glock) == 0 ) EXRETURN;
00582
00583
00584
00585 val = im3d->vinfo->fim_range ;
00586 if( val <= 0.0 ) EXRETURN;
00587
00588
00589
00590
00591 for( nn=cc=0 ; cc < MAX_CONTROLLERS ; cc++ ){
00592 qq3d = GLOBAL_library.controllers[cc] ;
00593 if( qq3d != im3d && IM3D_OPEN(qq3d) && ((1<<cc) & glock) != 0 ) nn++ ;
00594 }
00595 if( nn < 1 ) EXRETURN ;
00596
00597
00598
00599 busy = 1 ;
00600
00601
00602
00603
00604 for( cc=0 ; cc < MAX_CONTROLLERS ; cc++ ){
00605
00606 qq3d = GLOBAL_library.controllers[cc] ;
00607
00608 if( IM3D_OPEN(qq3d) && ((1<<cc) & glock) != 0 ){
00609
00610 if( qq3d == im3d &&
00611 MCW_val_bbox(im3d->vwid->func->range_bbox) == 0 ) continue;
00612
00613 sprintf( cmd , "SET_FUNC_RANGE %c.%.6f" , 'A'+cc , val ) ;
00614 AFNI_driver( cmd ) ;
00615 }
00616 }
00617
00618 busy = 0 ;
00619 EXRETURN ;
00620 }