00001 #include "mrilib.h"
00002 #include "afni.h"
00003 
00004 static int           have_dseTT = -1   ;
00005 static THD_3dim_dataset * dseTT = NULL ;
00006 static THD_3dim_dataset * dseTT_big = NULL ; 
00007 
00008 #define MAX_FIND 9                    
00009 #define WAMIRAD  7.5                  
00010 static MCW_cluster * wamiclust=NULL ;
00011 
00012 
00013 
00014 THD_3dim_dataset * TT_retrieve_atlas(void)
00015 {
00016    if( have_dseTT < 0 ) TT_load_atlas() ;
00017    return dseTT ;                         
00018 }
00019 
00020 
00021 
00022 THD_3dim_dataset * TT_retrieve_atlas_big(void) 
00023 {
00024    if( dseTT_big != NULL ) return dseTT_big ;
00025    if( have_dseTT < 0    ) TT_load_atlas() ;
00026    if( dseTT == NULL     ) return NULL ;
00027    dseTT_big = THD_zeropad( dseTT , 10,0,0,0,0,0 , "TTatlas_big" , 0 ) ;
00028    DSET_unload( dseTT ) ; 
00029    return dseTT_big ;
00030 }
00031 
00032 
00033 
00034 THD_3dim_dataset * TT_retrieve_atlas_either(void) 
00035 {
00036    if( dseTT_big != NULL ) return dseTT_big ;
00037    if( dseTT     != NULL ) return dseTT     ;
00038    if( have_dseTT < 0    ) TT_load_atlas()  ;
00039    return dseTT ;
00040 }
00041 
00042 
00043 
00044 int TT_load_atlas(void)
00045 {
00046    char *epath, *elocal, ename[THD_MAX_NAME], dname[THD_MAX_NAME], *eee ;
00047    int epos , ll , ii , id ;
00048 
00049 ENTRY("TT_load_atlas") ;
00050 
00051    if( have_dseTT >= 0 ) RETURN(have_dseTT) ;  
00052 
00053    have_dseTT = 0 ;  
00054 
00055    
00056 
00057    epath = getenv("AFNI_TTATLAS_DATASET") ;
00058    if( epath != NULL ){
00059      dseTT = THD_open_one_dataset( epath ) ;  
00060      if( dseTT != NULL ){                     
00061        have_dseTT = 1; RETURN(1);
00062      }
00063    }
00064 
00065    
00066 
00067                        epath = getenv("AFNI_PLUGINPATH") ;
00068    if( epath == NULL ) epath = getenv("AFNI_PLUGIN_PATH") ;
00069    if( epath == NULL ) epath = getenv("PATH") ;
00070    if( epath == NULL ) RETURN(0) ;
00071 
00072    
00073 
00074    ll = strlen(epath) ;
00075    elocal = AFMALL(char, sizeof(char) * (ll+2) ) ;
00076 
00077    
00078 
00079    strcpy( elocal , epath ) ; elocal[ll] = ' ' ; elocal[ll+1] = '\0' ;
00080 
00081    
00082 
00083    for( ii=0 ; ii < ll ; ii++ )
00084      if( elocal[ii] == ':' ) elocal[ii] = ' ' ;
00085 
00086    
00087 
00088 
00089    epos = 0 ;
00090 
00091    do{
00092       ii = sscanf( elocal+epos , "%s%n" , ename , &id ); 
00093       if( ii < 1 ) break ;                               
00094 
00095       epos += id ;                                 
00096 
00097       ii = strlen(ename) ;                         
00098       if( ename[ii-1] != '/' ){                    
00099           ename[ii]  = '/' ; ename[ii+1] = '\0' ;
00100       }
00101       strcpy(dname,ename) ;
00102       strcat(dname,"TTatlas+tlrc") ;               
00103 
00104       dseTT = THD_open_one_dataset( dname ) ;      
00105 
00106       if( dseTT != NULL ){                         
00107          free(elocal); have_dseTT = 1; RETURN(1);
00108       }
00109 
00110       strcpy(dname,ename) ;           
00111       strcat(dname,"TTatlas.nii.gz") ;
00112       dseTT = THD_open_one_dataset( dname ) ;
00113       if( dseTT != NULL ){ free(elocal); have_dseTT = 1; RETURN(1); }
00114 
00115    } while( epos < ll ) ;  
00116 
00117    free(elocal) ; RETURN(0) ; 
00118 }
00119 
00120 
00121 
00122 
00123 
00124 void TT_purge_atlas(void)
00125 {
00126   PURGE_DSET(dseTT) ; return ;
00127 }
00128 
00129 void TT_purge_atlas_big(void)
00130 {
00131    if( dseTT_big != NULL ){ DSET_delete(dseTT_big) ; dseTT_big = NULL ; }
00132    return ;
00133 }
00134 
00135 
00136 
00137 
00138 
00139 
00140 
00141 
00142 
00143 
00144 char * TT_whereami( float xx , float yy , float zz )
00145 {
00146    int ii,kk , ix,jy,kz , nx,ny,nz,nxy , aa,bb,cc , ff,b2f,b4f,rff ;
00147    THD_ivec3 ijk ;
00148    byte *b2 , *b4 ;
00149    THD_string_array *sar ;
00150    char *b2lab , *b4lab ;
00151    char lbuf[256] , *rbuf ;
00152    int nfind, b2_find[MAX_FIND], b4_find[MAX_FIND], rr_find[MAX_FIND] ;
00153 
00154    THD_3dim_dataset * dset ; 
00155 
00156 ENTRY("TT_whereami") ;
00157 
00158    
00159 
00160    if( dseTT == NULL ){
00161       ii = TT_load_atlas() ; if( ii == 0 ) RETURN(NULL) ;
00162    }
00163 
00164    
00165 
00166    dset = (dseTT_big != NULL) ? dseTT_big : dseTT ;
00167 
00168 #if 0
00169 if( dset == dseTT_big ) fprintf(stderr,"TT_whereami using dseTT_big\n") ;
00170 else                    fprintf(stderr,"TT_whereami using dseTT\n") ;
00171 #endif
00172 
00173    DSET_load(dset) ;
00174    b2 = DSET_BRICK_ARRAY(dset,0) ; if( b2 == NULL ) RETURN(NULL) ;
00175    b4 = DSET_BRICK_ARRAY(dset,1) ; if( b4 == NULL ) RETURN(NULL) ;
00176 
00177    if( wamiclust == NULL ){
00178       wamiclust = MCW_build_mask( 0,0,0 , 1.0,1.0,1.0 , WAMIRAD ) ;
00179       if( wamiclust == NULL ) RETURN(NULL) ;  
00180 
00181       for( ii=0 ; ii < wamiclust->num_pt ; ii++ )       
00182          wamiclust->mag[ii] = (int)rint(sqrt((double)(
00183                                          wamiclust->i[ii]*wamiclust->i[ii]
00184                                         +wamiclust->j[ii]*wamiclust->j[ii]
00185                                         +wamiclust->k[ii]*wamiclust->k[ii]))) ;
00186 
00187       MCW_sort_cluster( wamiclust ) ;  
00188    }
00189 
00190    
00191 
00192    ijk = THD_3dmm_to_3dind( dset , TEMP_FVEC3(xx,yy,zz) ) ;  
00193    UNLOAD_IVEC3(ijk,ix,jy,kz) ;                               
00194 
00195    nx = DSET_NX(dset) ;               
00196    ny = DSET_NY(dset) ;
00197    nz = DSET_NZ(dset) ; nxy = nx*ny ;
00198 
00199    nfind = 0 ;
00200 
00201    
00202 
00203    kk = ix + jy*nx + kz*nxy ;        
00204    if( b2[kk] != 0 || b4[kk] != 0 ){
00205       b2_find[0] = b2[kk] ;
00206       b4_find[0] = b4[kk] ;
00207       rr_find[0] = 0      ; nfind++ ;
00208    }
00209 
00210    
00211 
00212    for( ii=0 ; ii < wamiclust->num_pt ; ii++ ){
00213 
00214       
00215 
00216       aa = ix + wamiclust->i[ii] ; if( aa < 0 || aa >= nx ) continue ;
00217       bb = jy + wamiclust->j[ii] ; if( bb < 0 || bb >= ny ) continue ;
00218       cc = kz + wamiclust->k[ii] ; if( cc < 0 || cc >= nz ) continue ;
00219 
00220       kk  = aa + bb*nx + cc*nxy ;   
00221       b2f = b2[kk] ; b4f = b4[kk] ; 
00222 
00223       if( b2f == 0 && b4f == 0 )                            continue ;
00224 
00225       for( ff=0 ; ff < nfind ; ff++ ){       
00226          if( b2f == b2_find[ff] ) b2f = 0 ;  
00227          if( b4f == b4_find[ff] ) b4f = 0 ;  
00228       }
00229       if( b2f == 0 && b4f == 0 )                            continue ;
00230 
00231       b2_find[nfind] = b2f ;  
00232       b4_find[nfind] = b4f ;
00233       rr_find[nfind] = (int) wamiclust->mag[ii] ;
00234       nfind++ ;
00235 
00236       if( nfind == MAX_FIND ) break ;  
00237    }
00238 
00239    
00240 
00241 #define WAMI_HEAD "+++++++ nearby Talairach Daemon structures +++++++\n"
00242 #define WAMI_TAIL "\n******** Please use results with caution! ********"  \
00243                   "\n******** Brain anatomy is quite variable! ********"  \
00244                   "\n******** The database may contain errors! ********"
00245 
00246    if( nfind == 0 ){
00247       char xlab[24], ylab[24] , zlab[24] ;
00248       THD_fvec3 tv , mv ;
00249       float mx,my,mz ;
00250       char mxlab[24], mylab[24] , mzlab[24] ;
00251 
00252       sprintf(xlab,"%4.0f mm [%c]",-xx,(xx<0.0)?'R':'L') ;
00253       sprintf(ylab,"%4.0f mm [%c]",-yy,(yy<0.0)?'A':'P') ;
00254       sprintf(zlab,"%4.0f mm [%c]", zz,(zz<0.0)?'I':'S') ;
00255 
00256       LOAD_FVEC3(tv,xx,yy,zz);
00257       mv = THD_tta_to_mni(tv); UNLOAD_FVEC3(mv,mx,my,mz);
00258       sprintf(mxlab,"%4.0f mm [%c]",mx,(mx>=0.0)?'R':'L') ;
00259       sprintf(mylab,"%4.0f mm [%c]",my,(my>=0.0)?'A':'P') ;
00260       sprintf(mzlab,"%4.0f mm [%c]",mz,(mz< 0.0)?'I':'S') ;
00261 
00262       rbuf = AFMALL(char, 500) ;
00263       sprintf(rbuf,"%s\n"
00264                    "Focus point=%s,%s,%s {T-T Atlas}\n"
00265                    "           =%s,%s,%s {MNI Brain}\n"
00266                    "\n"
00267                    "***** Not near any region stored in database *****\n" ,
00268               WAMI_HEAD , xlab,ylab,zlab , mxlab,mylab,mzlab ) ;
00269       RETURN(rbuf) ;
00270    }
00271 
00272    
00273 
00274    if( nfind > 1 ){  
00275      int swap, tmp ;
00276      do{
00277         swap=0 ;
00278         for( ii=1 ; ii < nfind ; ii++ ){
00279            if( rr_find[ii-1] > rr_find[ii] ){
00280              tmp = rr_find[ii-1]; rr_find[ii-1] = rr_find[ii]; rr_find[ii] = tmp;
00281              tmp = b2_find[ii-1]; b2_find[ii-1] = b2_find[ii]; b2_find[ii] = tmp;
00282              tmp = b4_find[ii-1]; b4_find[ii-1] = b4_find[ii]; b4_find[ii] = tmp;
00283              swap++ ;
00284            }
00285         }
00286      } while(swap) ;
00287    }
00288 
00289    
00290 
00291    INIT_SARR(sar) ; ADDTO_SARR(sar,WAMI_HEAD) ;
00292 
00293    
00294 
00295    { char lbuf[128], xlab[24], ylab[24] , zlab[24] ;
00296      sprintf(xlab,"%4.0f mm [%c]",-xx,(xx<0.0)?'R':'L') ;
00297      sprintf(ylab,"%4.0f mm [%c]",-yy,(yy<0.0)?'A':'P') ;
00298      sprintf(zlab,"%4.0f mm [%c]", zz,(zz<0.0)?'I':'S') ;
00299      sprintf(lbuf,"Focus point=%s,%s,%s {T-T Atlas}",xlab,ylab,zlab) ;
00300      ADDTO_SARR(sar,lbuf) ;
00301    }
00302 
00303    
00304 
00305    { THD_fvec3 tv , mv ;
00306      float mx,my,mz ;
00307      char mxlab[24], mylab[24] , mzlab[24] , lbuf[128] ;
00308      LOAD_FVEC3(tv,xx,yy,zz);
00309      mv = THD_tta_to_mni(tv); UNLOAD_FVEC3(mv,mx,my,mz);
00310      sprintf(mxlab,"%4.0f mm [%c]",mx,(mx>=0.0)?'R':'L') ;
00311      sprintf(mylab,"%4.0f mm [%c]",my,(my>=0.0)?'A':'P') ;
00312      sprintf(mzlab,"%4.0f mm [%c]",mz,(mz< 0.0)?'I':'S') ;
00313      sprintf(lbuf,"Focus point=%s,%s,%s {MNI Brain}\n",mxlab,mylab,mzlab) ;
00314      ADDTO_SARR(sar,lbuf) ;
00315    }
00316 
00317    rff = -1 ;  
00318 
00319    for( ff=0 ; ff < nfind ; ff++ ){
00320       b2f = b2_find[ff] ; b4f = b4_find[ff] ; b2lab = NULL ; b4lab = NULL ;
00321 
00322       if( b2f != 0 ){                               
00323          for( ii=0 ; ii < TTO_COUNT ; ii++ )        
00324             if( b2f == TTO_list[ii].tdval ) break ;
00325          if( ii < TTO_COUNT )                       
00326             b2lab = TTO_list[ii].name ;
00327 
00328          if( b2lab != NULL && xx < 0 && strstr(b2lab,"Left") != NULL ) 
00329             b2lab = TTO_list[ii+1].name ;
00330       }
00331 
00332       if( b4f != 0 ){
00333          for( ii=0 ; ii < TTO_COUNT ; ii++ )
00334             if( b4f == TTO_list[ii].tdval ) break ;
00335          if( ii < TTO_COUNT )
00336             b4lab = TTO_list[ii].name ;
00337          if( b4lab != NULL && xx < 0 && strstr(b4lab,"Left") != NULL )
00338             b4lab = TTO_list[ii+1].name ;
00339       }
00340 
00341       if( b2lab == NULL && b4lab == NULL ) continue ;  
00342 
00343       
00344 
00345       lbuf[0] = '\0' ;
00346       if( b2lab != NULL ){
00347          if( rr_find[ff] != rff ){
00348             if( rr_find[ff] > 0 )
00349               sprintf( lbuf , "Within %d mm: %s" , rr_find[ff] , b2lab ) ;
00350             else
00351               sprintf( lbuf , "Focus point: %s" , b2lab ) ;
00352          } else {
00353             sprintf( lbuf , "             %s" , b2lab ) ;
00354          }
00355 
00356          for( kk=strlen(lbuf)-1 ; kk > 0 && lbuf[kk] == '.' ; kk-- )
00357             lbuf[kk] = '\0' ;                  
00358       }
00359 
00360       if( b4lab != NULL ){
00361          kk = strlen(lbuf) ;
00362          if( kk > 0 ){
00363             sprintf( lbuf+kk , " -AND- %s" , b4lab ) ;
00364          } else if( rr_find[ff] != rff ){
00365             if( rr_find[ff] > 0 )
00366               sprintf( lbuf , "Within %d mm: %s" , rr_find[ff] , b4lab ) ;
00367             else
00368               sprintf( lbuf , "Focus point: %s" , b4lab ) ;
00369          } else {
00370             sprintf( lbuf , "             %s" , b4lab ) ;
00371          }
00372 
00373          for( kk=strlen(lbuf)-1 ; kk > 0 && lbuf[kk] == '.' ; kk-- )
00374             lbuf[kk] = '\0' ;
00375       }
00376 
00377       ADDTO_SARR(sar,lbuf) ;  
00378 
00379       rff = rr_find[ff] ;  
00380    }
00381 
00382    
00383 
00384    if( sar->num == 1 ){    
00385       sprintf(lbuf,"Found %d marked but unlabeled regions???\n",nfind) ;
00386       ADDTO_SARR(sar,lbuf) ;
00387    } else {
00388       ADDTO_SARR(sar,WAMI_TAIL) ;  
00389    }
00390 
00391    
00392 
00393    for( nfind=ii=0 ; ii < sar->num ; ii++ ) nfind += strlen(sar->ar[ii]) ;
00394    rbuf = AFMALL(char, nfind + 2*sar->num + 32 ) ; rbuf[0] = '\0' ;
00395    for( ii=0 ; ii < sar->num ; ii++ ){
00396       strcat(rbuf,sar->ar[ii]) ; strcat(rbuf,"\n") ;
00397    }
00398 
00399    DESTROY_SARR(sar) ; RETURN(rbuf) ;
00400 }