int main( int argc , char * argv[] ) { THD_3dim_dataset * dset ; THD_dataxes * daxes ; FD_brick ** brarr , * baxi , * bsag , * bcor ; int iarg , ii ; Boolean ok ; MRI_IMAGE * pim , * flim , * slim ; float * flar ; dset_range dr ; float val , fimfac ; int ival,ityp , kk ; float xbot=BIGG,xtop=BIGG , ybot=BIGG,ytop=BIGG , zbot=BIGG,ztop=BIGG ; int xgood=0 , ygood=0 , zgood=0 , proj_code=PROJ_SUM , mirror_code=MIRR_NO , nsize=0 ; char root[THD_MAX_NAME] = "proj." ; char fname[THD_MAX_NAME] ; int ixbot=0,ixtop=0 , jybot=0,jytop=0 , kzbot=0,kztop=0 ; THD_fvec3 fv ; THD_ivec3 iv ; /*--- read command line arguments ---*/ if( argc < 2 || strncmp(argv[1],"-help",6) == 0 ) Syntax() ; INIT_EDOPT( &PRED_edopt ) ; iarg = 1 ; while( iarg < argc && argv[iarg][0] == '-' ){ DB("new arg:",argv[iarg]) ; /**** check for editing option ****/ ii = EDIT_check_argv( argc , argv , iarg , &PRED_edopt ) ; if( ii > 0 ){ iarg += ii ; continue ; } /**** -sum or -max ****/ if( strncmp(argv[iarg],"-sum",6) == 0 ){ proj_code = PROJ_SUM ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-max",6) == 0 ){ proj_code = PROJ_MMAX ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-amax",6) == 0 ){ proj_code = PROJ_AMAX ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-smax",6) == 0 ){ proj_code = PROJ_SMAX ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-first") == 0 ){ /* 02 Nov 2000 */ proj_code = PROJ_FIRST ; first_thresh = strtod( argv[++iarg] , NULL ) ; iarg++ ; continue ; } /**** -mirror ****/ if( strncmp(argv[iarg],"-mirror",6) == 0 ){ mirror_code = MIRR_YES ; iarg++ ; continue ; } /**** -nsize ****/ if( strncmp(argv[iarg],"-nsize",6) == 0 ){ nsize = 1 ; iarg++ ; continue ; } /**** -output root ****/ if( strncmp(argv[iarg],"-output",6) == 0 || strncmp(argv[iarg],"-root",6) == 0 ){ if( iarg+1 >= argc ){ fprintf(stderr,"\n*** no argument after option %s\n",argv[iarg]) ; exit(-1) ; } MCW_strncpy( root , argv[++iarg] , THD_MAX_NAME-1 ) ; ii = strlen(root) ; if( ii == 0 ){ fprintf(stderr,"\n*** illegal rootname!\n") ; exit(-1) ; } if( root[ii-1] != '.' ){ root[ii] = '.' ; root[ii+1] = '\0' ; } iarg++ ; continue ; } /**** -ALL ****/ if( strncmp(argv[iarg],"-ALL",6) == 0 || strncmp(argv[iarg],"-all",6) == 0 ){ xgood = ygood = zgood = 1 ; xbot = ybot = zbot = -BIGG ; xtop = ytop = ztop = BIGG ; iarg++ ; continue ; } /**** -RL {all | x1 x2} ****/ if( strncmp(argv[iarg],"-RL",6) == 0 || strncmp(argv[iarg],"-LR",6) == 0 || strncmp(argv[iarg],"-rl",6) == 0 || strncmp(argv[iarg],"-lr",6) == 0 || strncmp(argv[iarg],"-sag",6)== 0 ){ char * cerr ; float tf ; xgood = 1 ; /* mark for x projection */ if( iarg+1 >= argc ){ fprintf(stderr,"\n*** no argument after option %s\n",argv[iarg]) ; exit(-1) ; } if( strncmp(argv[iarg+1],"all",6) == 0 || strncmp(argv[iarg+1],"ALL",6) == 0 ){ xbot = -BIGG; xtop = BIGG ; iarg += 2 ; continue ; } if( iarg+2 >= argc ){ fprintf(stderr,"\n*** no argument after option %s\n",argv[iarg]) ; exit(-1) ; } xbot = strtod( argv[iarg+1] , &cerr ) ; if( cerr == argv[iarg+1] ){ fprintf(stderr,"\n*** illegal argument after %s: %s\n", argv[iarg],argv[iarg+1] ) ; exit(-1) ; } if( *cerr == 'R' && xbot > 0.0 ) xbot = -xbot ; xtop = strtod( argv[iarg+2] , &cerr ) ; if( cerr == argv[iarg+2] ){ fprintf(stderr,"\n*** illegal argument after %s: %s\n", argv[iarg],argv[iarg+2] ) ; exit(-1) ; } if( *cerr == 'R' && xtop > 0.0 ) xtop = -xtop ; if( xbot > xtop ){ tf = xbot ; xbot = xtop ; xtop = tf ; } iarg +=3 ; continue ; } /**** -AP {all | y1 y2} ****/ if( strncmp(argv[iarg],"-AP",6) == 0 || strncmp(argv[iarg],"-PA",6) == 0 || strncmp(argv[iarg],"-ap",6) == 0 || strncmp(argv[iarg],"-pa",6) == 0 || strncmp(argv[iarg],"-cor",6)== 0 ){ char * cerr ; float tf ; ygood = 1 ; /* mark for y projection */ if( iarg+1 >= argc ){ fprintf(stderr,"\n*** no argument after option %s\n",argv[iarg]) ; exit(-1) ; } if( strncmp(argv[iarg+1],"all",6) == 0 || strncmp(argv[iarg+1],"ALL",6) == 0 ){ ybot = -BIGG ; ytop = BIGG ; iarg += 2 ; continue ; } if( iarg+2 >= argc ){ fprintf(stderr,"\n*** no argument after option %s\n",argv[iarg]) ; exit(-1) ; } ybot = strtod( argv[iarg+1] , &cerr ) ; if( cerr == argv[iarg+1] ){ fprintf(stderr,"\n*** illegal argument after %s: %s\n", argv[iarg],argv[iarg+1] ) ; exit(-1) ; } if( *cerr == 'A' && ybot > 0.0 ) ybot = -ybot ; ytop = strtod( argv[iarg+2] , &cerr ) ; if( cerr == argv[iarg+2] ){ fprintf(stderr,"\n*** illegal argument after %s: %s\n", argv[iarg],argv[iarg+2] ) ; exit(-1) ; } if( *cerr == 'A' && ytop > 0.0 ) ytop = -ytop ; if( ybot > ytop ){ tf = ybot ; ybot = ytop ; ytop = tf ; } iarg +=3 ; continue ; } /**** -IS {all | z1 z2} ****/ if( strncmp(argv[iarg],"-IS",6) == 0 || strncmp(argv[iarg],"-SI",6) == 0 || strncmp(argv[iarg],"-is",6) == 0 || strncmp(argv[iarg],"-si",6) == 0 || strncmp(argv[iarg],"-axi",6)== 0 ){ char * cerr ; float tf ; zgood = 1 ; /* mark for y projection */ if( iarg+1 >= argc ){ fprintf(stderr,"\n*** no argument after option %s\n",argv[iarg]) ; exit(-1) ; } if( strncmp(argv[iarg+1],"all",6) == 0 || strncmp(argv[iarg+1],"ALL",6) == 0 ){ zbot = -BIGG ; ztop = BIGG ; iarg += 2 ; continue ; } if( iarg+2 >= argc ){ fprintf(stderr,"\n*** no argument after option %s\n",argv[iarg]) ; exit(-1) ; } zbot = strtod( argv[iarg+1] , &cerr ) ; if( cerr == argv[iarg+1] ){ fprintf(stderr,"\n*** illegal argument after %s: %s\n", argv[iarg],argv[iarg+1] ) ; exit(-1) ; } if( *cerr == 'I' && zbot > 0.0 ) zbot = -zbot ; ztop = strtod( argv[iarg+2] , &cerr ) ; if( cerr == argv[iarg+2] ){ fprintf(stderr,"\n*** illegal argument after %s: %s\n", argv[iarg],argv[iarg+2] ) ; exit(-1) ; } if( *cerr == 'I' && ztop > 0.0 ) ztop = -ztop ; if( zbot > ztop ){ tf = zbot ; zbot = ztop ; ztop = tf ; } iarg +=3 ; continue ; } /**** unknown option ****/ fprintf(stderr,"\n*** Unknown option: %s\n",argv[iarg]) ; exit(-1) ; } /* end of loop over input options */ if( ! xgood && ! ygood && ! zgood ){ fprintf(stderr,"\n*** No projections ordered!?\n") ; exit(-1) ; } /*--- open dataset and set up to extract data slices ---*/ dset = THD_open_dataset( argv[iarg] ) ; if( dset == NULL ){ fprintf(stderr,"\n*** Can't open dataset file %s\n",argv[iarg]) ; exit(-1) ; } if( DSET_NUM_TIMES(dset) > 1 ){ fprintf(stderr,"\n*** Can't project time-dependent dataset!\n") ; exit(1) ; } EDIT_one_dataset( dset, &PRED_edopt ) ; daxes = dset->daxes ; brarr = THD_setup_bricks( dset ) ; baxi = brarr[0] ; bsag = brarr[1] ; bcor = brarr[2] ; /*--- determine index range for each direction ---*/ dr = PR_get_range( dset ) ; if( xgood ){ if( xbot < dr.xbot ) xbot = dr.xbot ; if( xtop > dr.xtop ) xtop = dr.xtop ; fv = THD_dicomm_to_3dmm( dset , TEMP_FVEC3(xbot,0,0) ) ; iv = THD_3dmm_to_3dind ( dset , fv ) ; iv = THD_3dind_to_fdind( bsag , iv ) ; ixbot = iv.ijk[2] ; fv = THD_dicomm_to_3dmm( dset , TEMP_FVEC3(xtop,0,0) ) ; iv = THD_3dmm_to_3dind ( dset , fv ) ; iv = THD_3dind_to_fdind( bsag , iv ) ; ixtop = iv.ijk[2] ; if( ixbot > ixtop ) { ii = ixbot ; ixbot = ixtop ; ixtop = ii ; } if( ixbot < 0 ) ixbot = 0 ; if( ixtop >= bsag->n3 ) ixtop = bsag->n3 - 1 ; } if( ygood ){ if( ybot < dr.ybot ) ybot = dr.ybot ; if( ytop > dr.ytop ) ytop = dr.ytop ; fv = THD_dicomm_to_3dmm( dset , TEMP_FVEC3(0,ybot,0) ) ; iv = THD_3dmm_to_3dind ( dset , fv ) ; iv = THD_3dind_to_fdind( bcor , iv ) ; jybot = iv.ijk[2] ; fv = THD_dicomm_to_3dmm( dset , TEMP_FVEC3(0,ytop,0) ) ; iv = THD_3dmm_to_3dind ( dset , fv ) ; iv = THD_3dind_to_fdind( bcor , iv ) ; jytop = iv.ijk[2] ; if( jybot > jytop ) { ii = jybot ; jybot = jytop ; jytop = ii ; } if( jybot < 0 ) jybot = 0 ; if( jytop >= bcor->n3 ) jytop = bcor->n3 - 1 ; } if( zgood ){ if( zbot < dr.zbot ) zbot = dr.zbot ; if( ztop > dr.ztop ) ztop = dr.ztop ; fv = THD_dicomm_to_3dmm( dset , TEMP_FVEC3(0,0,zbot) ) ; iv = THD_3dmm_to_3dind ( dset , fv ) ; iv = THD_3dind_to_fdind( baxi , iv ) ; kzbot = iv.ijk[2] ; fv = THD_dicomm_to_3dmm( dset , TEMP_FVEC3(0,0,ztop) ) ; iv = THD_3dmm_to_3dind ( dset , fv ) ; iv = THD_3dind_to_fdind( baxi , iv ) ; kztop = iv.ijk[2] ; if( kzbot > kztop ) { ii = kzbot ; kzbot = kztop ; kztop = ii ; } if( kzbot < 0 ) kzbot = 0 ; if( kztop >= baxi->n3 ) kztop = baxi->n3 - 1 ; } ival = DSET_PRINCIPAL_VALUE(dset) ; /* index to project */ ityp = DSET_BRICK_TYPE(dset,ival) ; /* type of this data */ fimfac = DSET_BRICK_FACTOR(dset,ival) ; /* scale factor of this data */ /*--- project the x direction, if desired ---*/ if( xgood ){ int n1 = bsag->n1 , n2 = bsag->n2 ; int ss , npix ; float fmax , fmin , scl ; /*-- set up --*/ npix = n1*n2 ; flim = mri_new( n1 , n2 , MRI_float ) ; flar = mri_data_pointer( flim ) ; for( ii=0 ; ii < npix ; ii++ ) flar[ii] = 0.0 ; /*-- actually project --*/ for( ss=ixbot ; ss <= ixtop ; ss++ ){ slim = FD_brick_to_mri( ss , ival , bsag ) ; if( slim->kind != MRI_float ){ pim = mri_to_float( slim ) ; mri_free( slim ) ; slim = pim ; } PR_one_slice( proj_code , slim , flim ) ; mri_free( slim ) ; } /*-- form output --*/ if( fimfac != 0.0 && fimfac != 1.0 ){ slim = mri_scale_to_float( 1.0/fimfac , flim ) ; mri_free(flim) ; flim = slim ; } scl = PR_type_scale( ityp , flim ) ; pim = mri_to_mri_scl( ityp , scl , flim ) ; mri_free( flim ) ; if( nsize ){ slim = mri_nsize( pim ) ; if( slim != NULL && slim != pim ) { mri_free(pim) ; pim = slim ; } } if( scl != 1.0 ) printf("Sagittal projection pixels scaled by %g to avoid overflow!\n", scl ) ; fmax = mri_max(pim) ; fmin = mri_min(pim) ; printf("Sagittal projection min = %g max = %g\n",fmin,fmax) ; strcpy(fname,root) ; strcat(fname,"sag") ; mri_write( fname, pim ) ; mri_free(pim) ; } /*--- project the y direction, if desired ---*/ if( ygood ){ int n1 = bcor->n1 , n2 = bcor->n2 ; int ss , npix ; float fmax , fmin , scl ; /*-- set up --*/ npix = n1*n2 ; flim = mri_new( n1 , n2 , MRI_float ) ; flar = mri_data_pointer( flim ) ; for( ii=0 ; ii < npix ; ii++ ) flar[ii] = 0.0 ; /*-- actually project --*/ for( ss=jybot ; ss <= jytop ; ss++ ){ slim = FD_brick_to_mri( ss , ival , bcor ) ; if( slim->kind != MRI_float ){ pim = mri_to_float( slim ) ; mri_free( slim ) ; slim = pim ; } PR_one_slice( proj_code , slim , flim ) ; mri_free( slim ) ; } /*-- form output --*/ if( fimfac != 0.0 && fimfac != 1.0 ){ slim = mri_scale_to_float( 1.0/fimfac , flim ) ; mri_free(flim) ; flim = slim ; } scl = PR_type_scale( ityp , flim ) ; pim = mri_to_mri_scl( ityp , scl , flim ) ; mri_free( flim ) ; if( nsize ){ slim = mri_nsize( pim ) ; if( slim != NULL && slim != pim ) { mri_free(pim) ; pim = slim ; } } if( scl != 1.0 ) printf("Coronal projection pixels scaled by %g to avoid overflow!\n", scl ) ; fmax = mri_max(pim) ; fmin = mri_min(pim) ; printf("Coronal projection min = %g max = %g\n",fmin,fmax) ; if( mirror_code == MIRR_YES ){ slim = mri_flippo( MRI_ROT_0 , TRUE , pim ) ; mri_free(pim) ; pim = slim ; } strcpy(fname,root) ; strcat(fname,"cor") ; mri_write( fname, pim ) ; mri_free(pim) ; } /*--- project the z direction, if desired ---*/ if( zgood ){ int n1 = baxi->n1 , n2 = baxi->n2 ; int ss , npix ; float fmax , fmin , scl ; /*-- set up --*/ npix = n1*n2 ; flim = mri_new( n1 , n2 , MRI_float ) ; flar = mri_data_pointer( flim ) ; for( ii=0 ; ii < npix ; ii++ ) flar[ii] = 0.0 ; /*-- actually project --*/ for( ss=kzbot ; ss <= kztop ; ss++ ){ slim = FD_brick_to_mri( ss , ival , baxi ) ; if( slim->kind != MRI_float ){ pim = mri_to_float( slim ) ; mri_free( slim ) ; slim = pim ; } PR_one_slice( proj_code , slim , flim ) ; mri_free( slim ) ; } /*-- form output --*/ if( fimfac != 0.0 && fimfac != 1.0 ){ slim = mri_scale_to_float( 1.0/fimfac , flim ) ; mri_free(flim) ; flim = slim ; } scl = PR_type_scale( ityp , flim ) ; pim = mri_to_mri_scl( ityp , scl , flim ) ; mri_free( flim ) ; if( nsize ){ slim = mri_nsize( pim ) ; if( slim != NULL && slim != pim ) { mri_free(pim) ; pim = slim ; } } if( scl != 1.0 ) printf("Axial projection pixels scaled by %g to avoid overflow!\n", scl ) ; fmax = mri_max(pim) ; fmin = mri_min(pim) ; printf("Axial projection min = %g max = %g\n",fmin,fmax) ; if( mirror_code == MIRR_YES ){ slim = mri_flippo( MRI_ROT_0 , TRUE , pim ) ; mri_free(pim) ; pim = slim ; } strcpy(fname,root) ; strcat(fname,"axi") ; mri_write( fname, pim ) ; mri_free(pim) ; } exit(0) ; }
byte * THD_boxballmask( THD_3dim_dataset *dset , int boxball_num , float *boxball_dat ) { int nx,ny,nz , nxy,nxyz , ii,jj,kk ; byte *bmask ; int bb, ibot,itop, jbot,jtop, kbot,ktop , btyp ; float xbot,xtop, ybot,ytop, zbot,ztop ; float xcen,ycen,zcen , icen,jcen,kcen ; float xmin,xmax , ymin,ymax , zmin,zmax , rad,dist , xx,yy,zz ; THD_fvec3 dv,xv ; ENTRY("THD_boxballmask") ; if( !ISVALID_DSET(dset) || boxball_num <= 0 || boxball_dat == NULL ) RETURN(NULL) ; xmin=dset->daxes->xxmin ; xmax=dset->daxes->xxmax ; ymin=dset->daxes->yymin ; ymax=dset->daxes->yymax ; zmin=dset->daxes->zzmin ; zmax=dset->daxes->zzmax ; nx = DSET_NX(dset) ; ny = DSET_NY(dset) ; nxy = nx*ny ; nz = DSET_NZ(dset) ; nxyz = nxy*nz ; bmask = (byte *)calloc(sizeof(byte),nxyz) ; for( bb=0 ; bb < boxball_num ; bb++ ){ btyp = boxball_dat[0+BOXLEN*bb] ; if( btyp < BALL_XYZ ){ /*---- box ----*/ xbot = boxball_dat[1+BOXLEN*bb]; xtop = boxball_dat[2+BOXLEN*bb]; ybot = boxball_dat[3+BOXLEN*bb]; ytop = boxball_dat[4+BOXLEN*bb]; zbot = boxball_dat[5+BOXLEN*bb]; ztop = boxball_dat[6+BOXLEN*bb]; if( btyp != BOX_IJK ){ /* convert coords to indexes */ if( btyp == BOX_NEU ){ /* coords from Neuroscience to DICOM */ xbot = -xbot; xtop = -xtop; ybot = -ybot; ytop = -ytop; btyp = BOX_DIC; } if( btyp == BOX_DIC ){ /* coords from DICOM to dataset */ LOAD_FVEC3(dv,xbot,ybot,zbot) ; xv = THD_dicomm_to_3dmm( dset , dv ) ; UNLOAD_FVEC3(xv,xbot,ybot,zbot) ; LOAD_FVEC3(dv,xtop,ytop,ztop) ; xv = THD_dicomm_to_3dmm( dset , dv ) ; UNLOAD_FVEC3(xv,xtop,ytop,ztop) ; } if( xbot < xmin && xtop < xmin ) continue ; /* skip box if outside dataset */ if( xbot > xmax && xtop > xmax ) continue ; if( ybot < ymin && ytop < ymin ) continue ; if( ybot > ymax && ytop > ymax ) continue ; if( zbot < zmin && ztop < zmin ) continue ; if( zbot > zmax && ztop > zmax ) continue ; LOAD_FVEC3(dv,xbot,ybot,zbot) ; xv = THD_3dmm_to_3dfind( dset , dv ) ; /* coords from dataset to index */ UNLOAD_FVEC3(xv,xbot,ybot,zbot) ; LOAD_FVEC3(dv,xtop,ytop,ztop) ; xv = THD_3dmm_to_3dfind( dset , dv ) ; UNLOAD_FVEC3(xv,xtop,ytop,ztop) ; } ibot = rint(xbot) ; jbot = rint(ybot) ; kbot = rint(zbot) ; /* round */ itop = rint(xtop) ; jtop = rint(ytop) ; ktop = rint(ztop) ; if( ibot > itop ){ btyp = ibot; ibot = itop; itop = btyp; } /* flip? */ if( jbot > jtop ){ btyp = jbot; jbot = jtop; jtop = btyp; } if( kbot > ktop ){ btyp = kbot; kbot = ktop; ktop = btyp; } /* skip box if outside dataset */ if ( itop < 0 || ibot >= nx ) continue; if ( jtop < 0 || jbot >= ny ) continue; if ( ktop < 0 || kbot >= nz ) continue; /* constrain values to dataset dimensions */ if ( ibot < 0 ) ibot = 0; if ( itop >= nx ) itop = nx-1; if ( jbot < 0 ) jbot = 0; if ( jtop >= ny ) jtop = ny-1; if ( kbot < 0 ) kbot = 0; if ( ktop >= nz ) ktop = nz-1; for( kk=kbot ; kk <= ktop ; kk++ ) for( jj=jbot ; jj <= jtop ; jj++ ) for( ii=ibot ; ii <= itop ; ii++ ) bmask[ii+jj*nx+kk*nxy] = 1 ; } else { /*---- ball ----*/ xcen = boxball_dat[1+BOXLEN*bb] ; ycen = boxball_dat[2+BOXLEN*bb] ; zcen = boxball_dat[3+BOXLEN*bb] ; rad = boxball_dat[4+BOXLEN*bb] ; /* convert center coords to dataset indexes */ if( btyp == BALL_NEU ){ /* coords from Neuroscience to DICOM */ xcen = -xcen; ycen = -ycen; btyp = BALL_DIC; } if( btyp == BALL_DIC ){ /* coords from DICOM to dataset */ LOAD_FVEC3(dv,xcen,ycen,zcen) ; xv = THD_dicomm_to_3dmm( dset , dv ) ; UNLOAD_FVEC3(xv,xcen,ycen,zcen) ; } if( xcen < xmin || xcen > xmax ) continue ; /* skip ball if outside */ if( ycen < ymin || ycen > ymax ) continue ; if( zcen < zmin || zcen > zmax ) continue ; LOAD_FVEC3(dv,xcen,ycen,zcen) ; xv = THD_3dmm_to_3dfind( dset , dv ) ; /* coords from dataset to index */ UNLOAD_FVEC3(xv,icen,jcen,kcen) ; ibot = rint(icen-rad) ; itop = rint(icen+rad) ; /* box around ball */ jbot = rint(jcen-rad) ; jtop = rint(jcen+rad) ; kbot = rint(kcen-rad) ; ktop = rint(kcen+rad) ; rad = rad*rad ; for( kk=kbot ; kk <= ktop ; kk++ ){ for( jj=jbot ; jj <= jtop ; jj++ ){ for( ii=ibot ; ii <= itop ; ii++ ){ LOAD_FVEC3( dv , ii,jj,kk ) ; /* convert to xyz coords */ xv = THD_3dfind_to_3dmm( dset , dv ) ; /* then test distance^2 */ UNLOAD_FVEC3( xv , xx,yy,zz ) ; /* xyz of ball center. */ dist = SQR(xx-xcen) + SQR(yy-ycen) + SQR(zz-zcen) ; if( dist <= rad ) bmask[ii+jj*nx+kk*nxy] = 1 ; }}} } } /*----- end of loop over box/ball list -----*/ RETURN(bmask) ; }
void AFNI_lock_carryout( Three_D_View *im3d ) { Three_D_View *qq3d ; int ii,jj,kk , cc , glock ; THD_fvec3 old_fv , fv ; THD_ivec3 iv ; THD_dataxes *qaxes , *daxes ; static int busy = 0 ; /* !=0 if this routine is "busy" */ ENTRY("AFNI_lock_carryout") ; /* first, determine if there is anything to do */ glock = GLOBAL_library.controller_lock ; if( busy ) EXRETURN ; /* routine already busy */ if( glock == 0 ) EXRETURN ; /* nothing to do */ if( !IM3D_OPEN(im3d) ) EXRETURN ; /* bad input */ if( GLOBAL_library.ignore_lock ) EXRETURN ; /* ordered not to do anything */ ii = AFNI_controller_index(im3d) ; /* which one am I? */ if( ii < 0 ) EXRETURN ; /* nobody? bad input! */ if( ((1<<ii) & glock) == 0 ) EXRETURN ; /* input not locked */ /* something to do? */ busy = 1 ; /* don't let this routine be called recursively */ /* load Dicom location of current point of view in this controller */ LOAD_FVEC3( old_fv , im3d->vinfo->xi, im3d->vinfo->yj, im3d->vinfo->zk ) ; LOAD_ANAT_VIEW(im3d) ; /* prepare coordinates */ daxes = CURRENT_DAXES(im3d->anat_now) ; /* loop through other controllers: for those that ARE open, ARE NOT the current one, and ARE locked, transform the above vector to the controller's dataset, and then jump to that point */ for( cc=0 ; cc < MAX_CONTROLLERS ; cc++ ){ qq3d = GLOBAL_library.controllers[cc] ; /* controller */ if( IM3D_OPEN(qq3d) && qq3d != im3d && ((1<<cc) & glock) != 0 ){ LOAD_ANAT_VIEW(qq3d) ; /* prepare coordinates */ qaxes = CURRENT_DAXES(qq3d->anat_now) ; if( !GLOBAL_library.ijk_lock ){ /* xyz coord lock */ fv = AFNI_transform_vector( im3d->anat_now, old_fv, qq3d->anat_now ) ; fv = THD_dicomm_to_3dmm( qq3d->anat_now , fv ) ; iv = THD_3dmm_to_3dind ( qq3d->anat_now , fv ) ; ii = iv.ijk[0] ; jj = iv.ijk[1] ; kk = iv.ijk[2] ; } else { /* 11 Sep 2000: ijk index lock */ ii = im3d->vinfo->i1 * qaxes->nxx / daxes->nxx ; jj = im3d->vinfo->j2 * qaxes->nyy / daxes->nyy ; kk = im3d->vinfo->k3 * qaxes->nzz / daxes->nzz ; } /* if have good new ijk coords, jump to them */ if( ii >= 0 && ii < qaxes->nxx && jj >= 0 && jj < qaxes->nyy && kk >= 0 && kk < qaxes->nzz ){ SAVE_VPT(qq3d) ; AFNI_set_viewpoint( qq3d , ii,jj,kk , REDISPLAY_ALL ) ; /* jump */ } } } busy = 0 ; /* OK, let this routine be activated again */ EXRETURN ; }
int main( int argc , char * argv[] ) { int narg=1, do_automask=0 , iv , nxyz , do_set=0 , *rois=NULL, N_rois=0, all_rois = 0; THD_3dim_dataset *xset ; byte *mmm=NULL ; int nmask=0 , nvox_mask=0 ; THD_fvec3 cmv , setv ; /*-- read command line arguments --*/ if( argc < 2 || strncmp(argv[1],"-help",5) == 0 ){ printf("Usage: 3dCM [options] dset\n" "Output = center of mass of dataset, to stdout.\n" " -mask mset Means to use the dataset 'mset' as a mask:\n" " Only voxels with nonzero values in 'mset'\n" " will be averaged from 'dataset'. Note\n" " that the mask dataset and the input dataset\n" " must have the same number of voxels.\n" " -automask Generate the mask automatically.\n" " -set x y z After computing the CM of the dataset, set the\n" " origin fields in the header so that the CM\n" " will be at (x,y,z) in DICOM coords.\n" " -roi_vals v0 v1 v2 ... : Compute center of mass for each blob\n" " with voxel value of v0, v1, v2, etc.\n" " This option is handy for getting ROI \n" " centers of mass.\n" " -all_rois Don't bother listing the values of ROIs you want\n" " the program will find all of them and produce a \n" " full list.\n" " NOTE: Masking options are ignored with -roi_vals and -all_rois\n" ) ; PRINT_COMPILE_DATE ; exit(0) ; } LOAD_FVEC3(setv,0,0,0) ; /* ZSS: To quiet init. warnings */ narg = 1 ; while( narg < argc && argv[narg][0] == '-' ){ if( strcmp(argv[narg],"-set") == 0 ){ float xset,yset,zset ; if( narg+3 >= argc ){ fprintf(stderr,"*** -set need 3 args following!\n") ; exit(1) ; } xset = strtod( argv[++narg] , NULL ) ; yset = strtod( argv[++narg] , NULL ) ; zset = strtod( argv[++narg] , NULL ) ; LOAD_FVEC3(setv,xset,yset,zset) ; do_set = 1 ; THD_set_write_compression(COMPRESS_NONE); /* do not alter compression*/ narg++ ; continue ; } if( strncmp(argv[narg],"-mask",5) == 0 ){ THD_3dim_dataset *mask_dset ; if( mmm != NULL ){ fprintf(stderr,"*** Cannot have two -mask options!\n") ; exit(1) ; } if( do_automask ){ fprintf(stderr,"*** Can't have -mask and -automask!\n") ; exit(1) ; } if( narg+1 >= argc ){ fprintf(stderr,"*** -mask option requires a following argument!\n"); exit(1) ; } mask_dset = THD_open_dataset( argv[++narg] ) ; CHECK_OPEN_ERROR(mask_dset,argv[narg]) ; if( DSET_BRICK_TYPE(mask_dset,0) == MRI_complex ){ fprintf(stderr,"*** Cannot deal with complex-valued mask dataset!\n"); exit(1) ; } mmm = THD_makemask( mask_dset , 0 , 1.0,0.0 ) ; nvox_mask = DSET_NVOX(mask_dset) ; nmask = THD_countmask( nvox_mask , mmm ) ; if( mmm == NULL || nmask <= 0 ){ fprintf(stderr,"*** Can't make mask from dataset %s\n",argv[narg-1]); exit(1) ; } DSET_delete( mask_dset ) ; narg++ ; continue ; } if( strncmp(argv[narg],"-roi_vals",5) == 0 ){ if( narg+1 >= argc ){ fprintf(stderr,"*** -mask option requires a following argument(s)!\n"); exit(1) ; } rois = (int *)calloc(argc, sizeof(int)); N_rois = 0; ++narg; while (narg < argc-1 && argv[narg][0] != '-') { rois[N_rois++] = atoi(argv[narg]); ++narg; } continue ; } if( strncmp(argv[narg],"-all_rois",5) == 0 ){ all_rois = 1; narg++ ; continue ; } if( strcmp(argv[narg],"-automask") == 0 ){ if( mmm != NULL ){ fprintf(stderr,"*** Can't have -mask and -automask!\n") ; exit(1) ; } do_automask = 1 ; narg++ ; continue ; } fprintf(stderr,"*** Unknown option: %s\n",argv[narg]) ; exit(1) ; } /* should have at least 1 more argument */ if( argc <= narg ){ fprintf(stderr,"*** No input dataset!?\n") ; exit(1) ; } for( ; narg < argc ; narg++ ){ xset = THD_open_dataset( argv[narg] ) ; if( xset == NULL ){ fprintf(stderr,"+++ Can't open dataset %s -- skipping\n",argv[narg]); continue ; } DSET_load(xset) ; if( !DSET_LOADED(xset) ){ fprintf(stderr,"+++ Can't load dataset %s -- skipping\n",argv[narg]); DSET_delete(xset) ; continue ; } if( do_automask ){ if( mmm != NULL ){ free(mmm); mmm = NULL; } mmm = THD_automask(xset) ; nvox_mask = DSET_NVOX(xset) ; nmask = THD_countmask( nvox_mask , mmm ) ; if( mmm == NULL || nmask <= 0 ){ fprintf( stderr, "+++ Can't make automask from dataset %s " "-- skipping\n",argv[narg]) ; DSET_delete(xset) ; continue ; } } nxyz = DSET_NVOX(xset) ; if( mmm != NULL && nxyz != nvox_mask ){ fprintf(stderr,"+++ Mask/Dataset grid size mismatch at %s\n -- skipping\n",argv[narg]) ; DSET_delete(xset) ; continue ; } if (all_rois) { if (!(rois = THD_unique_vals(xset, 0, &N_rois, NULL)) || N_rois == 0) { ERROR_message("No rois or error in THD_unique_vals"); continue; } fprintf(stderr,"#%d distinct ROIs", N_rois); } if (!N_rois) { cmv = THD_cmass( xset , 0 , mmm ) ; printf("%g %g %g\n",cmv.xyz[0],cmv.xyz[1],cmv.xyz[2]) ; DSET_unload(xset) ; if( do_set ){ THD_fvec3 dv , ov ; if( DSET_IS_MASTERED(xset) ){ fprintf(stderr,"+++ Can't modify CM of dataset %s\n",argv[narg]) ; } else { /* lose obliquity */ /* recompute Tc(Cardinal transformation matrix for new grid output */ THD_make_cardinal(xset); LOAD_FVEC3(ov,DSET_XORG(xset),DSET_YORG(xset),DSET_ZORG(xset)) ; ov = THD_3dmm_to_dicomm( xset , ov ) ; dv = SUB_FVEC3(setv,cmv) ; ov = ADD_FVEC3(dv,ov) ; ov = THD_dicomm_to_3dmm( xset , ov ) ; xset->daxes->xxorg = ov.xyz[0] ; xset->daxes->yyorg = ov.xyz[1] ; xset->daxes->zzorg = ov.xyz[2] ; /* allow overwriting header for all types of output data */ putenv("AFNI_DECONFLICT=OVERWRITE") ; tross_Make_History( "3dCM" , argc,argv , xset );/* ZSS Dec. 09 08 */ if(DSET_IS_BRIK(xset)) { INFO_message("Rewriting header %s",DSET_HEADNAME(xset)) ; DSET_overwrite_header( xset ) ; } else { /* for other dataset types like NIFTI, rewrite whole dset */ DSET_load( xset ) ; DSET_overwrite(xset) ; INFO_message("Wrote new dataset: %s",DSET_BRIKNAME(xset)) ; } } } } else { float *xyz; if ((xyz = THD_roi_cmass(xset , 0 , rois, N_rois))) { printf("#Dset %s\n",DSET_BRIKNAME(xset)); for (iv=0; iv<N_rois; ++iv) { printf("#ROI %d\n", rois[iv]); printf("%g %g %g\n",xyz[3*iv],xyz[3*iv+1],xyz[3*iv+2]) ; } free(xyz); free(rois); } else { ERROR_message("Failed in THD_roi_cmass"); continue; } } DSET_delete(xset) ; } exit(0); }