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 }