int main( int argc , char * argv[] ) { THD_dfvec3 *xx , *yy , dv ; int nvec=0 , ii,jj, iarg ; THD_dvecmat rt , rtinv ; THD_dmat33 pp,ppt , rr ; THD_dfvec3 tt ; THD_3dim_dataset *mset=NULL , *dset=NULL ; double *ww=NULL ; int nww=0 ; int keeptags=1 , wtval=0 , verb=0 , dummy=0 ; char * prefix = "tagalign" , *mfile=NULL ; float *fvol , cbot,ctop , dsum ; int nval , nvox , clipit , ival, RMETH=MRI_CUBIC; float matar[12] ; int use_3dWarp=1 , matrix_type=ROTATION ; mainENTRY("3dTagalign main"); /*--- help? ---*/ /*- scan args -*/ iarg = 1 ; RMETH=MRI_CUBIC; while( iarg < argc && argv[iarg][0] == '-' ){ /*-----*/ if( strcmp(argv[iarg],"-h") == 0 || strcmp(argv[iarg],"-help") == 0){ /* 22 Apr 2003 */ usage_3dTagalign(strlen(argv[iarg]) > 3 ? 2:1); exit(0); } /*-----*/ if( strcmp(argv[iarg],"-NN") == 0 ){ RMETH = MRI_NN ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-linear") == 0 ){ RMETH = MRI_LINEAR ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-cubic") == 0 ){ RMETH = MRI_CUBIC ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-quintic") == 0 ){ RMETH = MRI_QUINTIC ; iarg++ ; continue ; } /*-----*/ if( strcmp(argv[iarg],"-rotate") == 0 ){ /* 22 Apr 2003 */ matrix_type = ROTATION ; use_3dWarp = 1 ; iarg++ ; continue ; } /*-----*/ if( strcmp(argv[iarg],"-affine") == 0 ){ /* 21 Apr 2003 */ matrix_type = AFFINE ; use_3dWarp = 1 ; iarg++ ; continue ; } /*-----*/ if( strcmp(argv[iarg],"-rotscl") == 0 ){ /* 22 Apr 2003 */ matrix_type = ROTSCL ; use_3dWarp = 1 ; iarg++ ; continue ; } #if 0 /*-----*/ if( strcmp(argv[iarg],"-3dWarp") == 0 ){ /* 21 Apr 2003 */ use_3dWarp = 1 ; iarg++ ; continue ; } #endif /*-----*/ if( strcmp(argv[iarg],"-master") == 0 ){ if( mset != NULL ) ERREX("Can only have one -master option") ; if( ++iarg >= argc ) ERREX("Need an argument after -master") ; mset = THD_open_dataset( argv[iarg] ) ; if( mset == NULL ) ERREX("Can't open -master dataset") ; if( mset->tagset == NULL ) ERREX("No tags in -master dataset") ; if( TAGLIST_COUNT(mset->tagset) < 3 ) ERREX("Not enough tags in -master dataset") ; for( nvec=ii=0 ; ii < TAGLIST_COUNT(mset->tagset) ; ii++ ) if( TAG_SET(TAGLIST_SUBTAG(mset->tagset,ii)) ) nvec++ ; if( nvec < 3 ) ERREX("Not enough tags set in -master dataset") ; if( nvec < TAGLIST_COUNT(mset->tagset) ) fprintf(stderr,"++ WARNING: not all tags are set in -master dataset\n") ; if( verb ) fprintf(stderr,"++ Found %d tags in -master dataset\n",nvec) ; iarg++ ; continue ; } #if 0 /*-----*/ if( strcmp(argv[iarg],"-wtval") == 0 ){ if( ww != NULL ) ERREX("Can't have -wtval after -wt1D") ; wtval++ ; iarg++ ; continue ; } /*-----*/ if( strcmp(argv[iarg],"-wt1D") == 0 ){ MRI_IMAGE * wtim ; float * wtar ; if( wtval ) ERREX("Can't have -wt1D after -wtval") ; if( ww != NULL ) ERREX("Can't have two -wt1D options!") ; if( ++iarg >= argc ) ERREX("Need an argument after -wt1D") ; wtim = mri_read_1D( argv[iarg] ) ; if( wtim == NULL ) ERREX("Can't read -wtim file") ; if( wtim->ny > 1 ) ERREX("-wtim file has more than one columm") ; wtar = MRI_FLOAT_PTR(wtim) ; ww = (double *) malloc(sizeof(double)*wtim->nx) ; nww = wtim->nx ; for( ii=0 ; ii < nww ; ii++ ){ ww[ii] = (double) wtar[ii] ; if( ww[ii] < 0.0 ) ERREX("Negative value found in -wt1D file") ; } mri_free(wtim) ; iarg++ ; continue ; } #endif /*-----*/ if( strcmp(argv[iarg],"-nokeeptags") == 0 ){ keeptags = 0 ; iarg++ ; continue ; } /*-----*/ if( strncmp(argv[iarg],"-verb",5) == 0 ){ verb++ ; iarg++ ; continue ; } /*-----*/ if( strcmp(argv[iarg],"-dummy") == 0 ){ dummy++ ; iarg++ ; continue ; } /*-----*/ if( strcmp(argv[iarg],"-prefix") == 0 ){ if( ++iarg >= argc ) ERREX("Need an argument after -prefix") ; prefix = argv[iarg] ; if( !THD_filename_ok(prefix) ) ERREX("-prefix string is illegal") ; iarg++ ; continue ; } /*-----*/ if( strcmp(argv[iarg],"-matvec") == 0 ){ if( ++iarg >= argc ) ERREX("Need an argument after -matvec") ; mfile = argv[iarg] ; if( !THD_filename_ok(mfile) ) ERREX("-matvec string is illegal") ; iarg++ ; continue ; } /*-----*/ fprintf(stderr,"** Unknown option: %s\n",argv[iarg]) ; suggest_best_prog_option(argv[0], argv[iarg]); exit(1) ; } /* end of scanning command line for options */ if( argc < 2 ){ ERROR_message("Too few options"); usage_3dTagalign(0); exit(1) ; } if( mset == NULL ) ERREX("No -master option found on command line") ; #if 0 if( ww != NULL && nww < nvec ) ERREX("Not enough weights found in -wt1D file") ; /*-- if -wtval, setup weights from master tag values --*/ if( wtval ){ ww = (double *) malloc(sizeof(double)*nvec) ; nww = nvec ; for( ii=jj=0 ; ii < TAGLIST_COUNT(mset->tagset) ; ii++ ){ if( TAG_SET(TAGLIST_SUBTAG(mset->tagset,ii)) ){ ww[jj] = (double) TAG_VAL(TAGLIST_SUBTAG(mset->tagset,ii)) ; if( ww[jj] < 0.0 ) ERREX("Negative value found in -master tag values") ; jj++ ; } } } #endif /*-- read input dataset (to match to master dataset) --*/ if( iarg >= argc ) ERREX("No input dataset?") ; dset = THD_open_dataset( argv[iarg] ) ; if( dset == NULL ) ERREX("Can't open input dataset") ; if( dset->tagset == NULL ) ERREX("No tags in input dataset") ; if( TAGLIST_COUNT(dset->tagset) != TAGLIST_COUNT(mset->tagset) ) ERREX("Tag counts don't match in -master and input") ; /* check if set tags match exactly */ for( ii=0 ; ii < TAGLIST_COUNT(mset->tagset) ; ii++ ){ if( TAG_SET(TAGLIST_SUBTAG(mset->tagset,ii)) != TAG_SET(TAGLIST_SUBTAG(dset->tagset,ii)) ) ERREX("Set tags don't match in -master and input") ; } /*-- load vector lists: xx=master, yy=input --*/ xx = (THD_dfvec3 *) malloc( sizeof(THD_dfvec3) * nvec ) ; yy = (THD_dfvec3 *) malloc( sizeof(THD_dfvec3) * nvec ) ; dsum = 0.0 ; for( ii=jj=0 ; ii < nvec ; ii++ ){ if( TAG_SET(TAGLIST_SUBTAG(mset->tagset,ii)) ){ LOAD_DFVEC3( xx[jj] , /* N.B.: */ TAG_X( TAGLIST_SUBTAG(mset->tagset,ii) ) , /* these are */ TAG_Y( TAGLIST_SUBTAG(mset->tagset,ii) ) , /* in Dicom */ TAG_Z( TAGLIST_SUBTAG(mset->tagset,ii) ) ) ; /* order now */ LOAD_DFVEC3( yy[jj] , TAG_X( TAGLIST_SUBTAG(dset->tagset,ii) ) , TAG_Y( TAGLIST_SUBTAG(dset->tagset,ii) ) , TAG_Z( TAGLIST_SUBTAG(dset->tagset,ii) ) ) ; dv = SUB_DFVEC3( xx[jj] , yy[jj] ) ; dsum += dv.xyz[0]*dv.xyz[0] + dv.xyz[1]*dv.xyz[1] + dv.xyz[2]*dv.xyz[2] ; jj++ ; } } dsum = sqrt(dsum/nvec) ; fprintf(stderr,"++ RMS distance between tags before = %.2f mm\n" , dsum ) ; /*-- compute best transformation from mset to dset coords --*/ switch( matrix_type ){ default: case ROTATION: rt = DLSQ_rot_trans( nvec , yy , xx , ww ) ; /* in thd_rot3d.c */ break ; case AFFINE: rt = DLSQ_affine ( nvec , yy , xx ) ; /* 21 Apr 2003 */ break ; case ROTSCL: rt = DLSQ_rotscl ( nvec , yy , xx , (DSET_NZ(dset)==1) ? 2 : 3 ) ; break ; } rtinv = INV_DVECMAT(rt) ; /*-- check for floating point legality --*/ nval = 0 ; for( ii=0 ; ii < 3 ; ii++ ){ dsum = rt.vv.xyz[ii] ; nval += thd_floatscan(1,&dsum) ; for( jj=0 ; jj < 3 ; jj++ ){ dsum = rt.mm.mat[ii][jj] ; nval += thd_floatscan(1,&dsum) ; } } if( nval > 0 ){ fprintf(stderr,"** Floating point errors during calculation\n" "** of transform matrix and translation vector\n" ) ; exit(1) ; } /*-- check for rotation matrix legality --*/ dsum = DMAT_DET(rt.mm) ; if( dsum == 0.0 || (matrix_type == ROTATION && fabs(dsum-1.0) > 0.01) ){ fprintf(stderr,"** Invalid transform matrix computed: tags dependent?\n" "** computed [matrix] and [vector] follow:\n" ) ; for( ii=0 ; ii < 3 ; ii++ ) fprintf(stderr," [ %10.5f %10.5f %10.5f ] [ %10.5f ] \n", rt.mm.mat[ii][0],rt.mm.mat[ii][1],rt.mm.mat[ii][2],rt.vv.xyz[ii] ); exit(1) ; } /*-- print summary --*/ if( verb ){ fprintf(stderr,"++ Matrix & Vector [Dicom: x=R-L; y=A-P; z=I-S]\n") ; for( ii=0 ; ii < 3 ; ii++ ) fprintf(stderr," %10.5f %10.5f %10.5f %10.5f\n", rt.mm.mat[ii][0],rt.mm.mat[ii][1],rt.mm.mat[ii][2],rt.vv.xyz[ii] ); } if( matrix_type == ROTATION || matrix_type == ROTSCL ){ double theta, costheta , dist , fac=1.0 ; if( matrix_type == ROTSCL ){ fac = DMAT_DET(rt.mm); fac = fabs(fac); if( DSET_NZ(dset) == 1 ) fac = sqrt(fac) ; else fac = cbrt(fac) ; } costheta = 0.5 * sqrt(1.0 + DMAT_TRACE(rt.mm)/fac ) ; theta = 2.0 * acos(costheta) * 180/3.14159265 ; dist = SIZE_DFVEC3(rt.vv) ; fprintf(stderr,"++ Total rotation=%.2f degrees; translation=%.2f mm; scaling=%.2f\n", theta,dist,fac) ; } if( mfile ){ FILE * mp ; if( THD_is_file(mfile) ) fprintf(stderr,"++ Warning: -matvec will overwrite file %s\n",mfile) ; mp = fopen(mfile,"w") ; if( mp == NULL ){ fprintf(stderr,"** Can't write to -matvec %s\n",mfile) ; } else { for( ii=0 ; ii < 3 ; ii++ ) fprintf(mp," %10.5f %10.5f %10.5f %10.5f\n", rt.mm.mat[ii][0],rt.mm.mat[ii][1],rt.mm.mat[ii][2],rt.vv.xyz[ii] ); fclose(mp) ; if( verb ) fprintf(stderr,"++ Wrote matrix+vector to %s\n",mfile) ; } } if( dummy ){ fprintf(stderr,"++ This was a -dummy run: no output dataset\n") ; exit(0) ; } /*-- 21 Apr 2003: transformation can be done the old way (a la 3drotate), or the new way (a la 3dWarp). --*/ #if 0 if( !use_3dWarp ){ /**** the old way ****/ /*-- now must scramble the rotation matrix and translation vector from Dicom coordinate order to dataset brick order --*/ pp = DBLE_mat_to_dicomm( dset ) ; ppt = TRANSPOSE_DMAT(pp) ; rr = DMAT_MUL(ppt,rt.mm) ; rr = DMAT_MUL(rr,pp) ; tt = DMATVEC(ppt,rt.vv) ; /*-- now create the output dataset by screwing with the input dataset (this code is adapted from 3drotate.c) --*/ DSET_mallocize(dset) ; DSET_load( dset ) ; CHECK_LOAD_ERROR(dset) ; dset->idcode = MCW_new_idcode() ; dset->dblk->diskptr->storage_mode = STORAGE_BY_BRICK ; /* 14 Jan 2004 */ EDIT_dset_items( dset , ADN_prefix , prefix , ADN_label1 , prefix , ADN_none ) ; if( !THD_ok_overwrite() && (THD_deathcon() && THD_is_file(dset->dblk->diskptr->header_name) )){ fprintf(stderr, "** Output file %s already exists -- cannot continue!\n", dset->dblk->diskptr->header_name ) ; exit(1) ; } tross_Make_History( "3dTagalign" , argc,argv , dset ) ; /*-- if desired, keep old tagset --*/ if( keeptags ){ THD_dfvec3 rv ; dsum = 0.0 ; for( jj=ii=0 ; ii < TAGLIST_COUNT(dset->tagset) ; ii++ ){ if( TAG_SET(TAGLIST_SUBTAG(dset->tagset,ii)) ){ rv = DMATVEC( rt.mm , yy[jj] ) ; /* operating on */ rv = ADD_DFVEC3( rt.vv , rv ) ; /* Dicom order */ dv = SUB_DFVEC3( xx[jj] , rv ) ; dsum += dv.xyz[0]*dv.xyz[0] + dv.xyz[1]*dv.xyz[1] + dv.xyz[2]*dv.xyz[2] ; UNLOAD_DFVEC3( rv , TAG_X( TAGLIST_SUBTAG(dset->tagset,ii) ) , TAG_Y( TAGLIST_SUBTAG(dset->tagset,ii) ) , TAG_Z( TAGLIST_SUBTAG(dset->tagset,ii) ) ) ; jj++ ; } } dsum = sqrt(dsum/nvec) ; fprintf(stderr,"++ RMS distance between tags after = %.2f mm\n" , dsum ) ; } else { myXtFree(dset->tagset) ; /* send it to the dustbin */ } /*-- rotate sub-bricks --*/ if( verb ) fprintf(stderr,"++ computing output BRIK") ; nvox = DSET_NVOX(dset) ; nval = DSET_NVALS(dset) ; fvol = (float *) malloc( sizeof(float) * nvox ) ; THD_rota_method( MRI_HEPTIC ) ; clipit = 1 ; for( ival=0 ; ival < nval ; ival++ ){ /*- get sub-brick out of dataset -*/ EDIT_coerce_type( nvox , DSET_BRICK_TYPE(dset,ival),DSET_ARRAY(dset,ival) , MRI_float,fvol ) ; if( clipit ){ register int ii ; register float bb,tt ; bb = tt = fvol[0] ; for( ii=1 ; ii < nvox ; ii++ ){ if( fvol[ii] < bb ) bb = fvol[ii] ; else if( fvol[ii] > tt ) tt = fvol[ii] ; } cbot = bb ; ctop = tt ; } if( verb && nval < 5 ) fprintf(stderr,".") ; /*- rotate it -*/ THD_rota_vol_matvec( DSET_NX(dset) , DSET_NY(dset) , DSET_NZ(dset) , fabs(DSET_DX(dset)) , fabs(DSET_DY(dset)) , fabs(DSET_DZ(dset)) , fvol , rr , tt ) ; if( verb ) fprintf(stderr,".") ; if( clipit ){ register int ii ; register float bb,tt ; bb = cbot ; tt = ctop ; for( ii=0 ; ii < nvox ; ii++ ){ if( fvol[ii] < bb ) fvol[ii] = bb ; else if( fvol[ii] > tt ) fvol[ii] = tt ; } } if( verb && nval < 5 ) fprintf(stderr,".") ; /*- put it back into dataset -*/ EDIT_coerce_type( nvox, MRI_float,fvol , DSET_BRICK_TYPE(dset,ival),DSET_ARRAY(dset,ival) ); } /* end of loop over sub-brick index */ if( verb ) fprintf(stderr,":") ; /* save matrix+vector into dataset, too */ UNLOAD_DMAT(rt.mm,matar[0],matar[1],matar[2], matar[4],matar[5],matar[6], matar[8],matar[9],matar[10] ) ; UNLOAD_DFVEC3(rt.vv,matar[3],matar[7],matar[11]) ; THD_set_atr( dset->dblk, "TAGALIGN_MATVEC", ATR_FLOAT_TYPE, 12, matar ) ; /* write dataset to disk */ dset->dblk->master_nvals = 0 ; /* in case this was a mastered dataset */ DSET_write(dset) ; if( verb ) fprintf(stderr,"\n") ; } else #endif { /**** the new way: use 3dWarp type transformation ****/ THD_3dim_dataset *oset ; THD_vecmat tran ; #if 0 DFVEC3_TO_FVEC3( rt.vv , tran.vv ) ; DMAT_TO_MAT ( rt.mm , tran.mm ) ; #else DFVEC3_TO_FVEC3( rtinv.vv , tran.vv ) ; DMAT_TO_MAT ( rtinv.mm , tran.mm ) ; #endif mri_warp3D_method( RMETH ) ; oset = THD_warp3D_affine( dset, tran, mset, prefix, 0, WARP3D_NEWDSET ) ; if( oset == NULL ){ fprintf(stderr,"** ERROR: THD_warp3D() fails!\n"); exit(1); } tross_Copy_History( dset , oset ) ; tross_Make_History( "3dTagalign" , argc,argv , oset ) ; UNLOAD_DMAT(rt.mm,matar[0],matar[1],matar[2], matar[4],matar[5],matar[6], matar[8],matar[9],matar[10] ) ; UNLOAD_DFVEC3(rt.vv,matar[3],matar[7],matar[11]) ; THD_set_atr( oset->dblk, "TAGALIGN_MATVEC", ATR_FLOAT_TYPE, 12, matar ) ; /*-- if desired, keep old tagset --*/ if( keeptags ){ THD_dfvec3 rv ; oset->tagset = myXtNew(THD_usertaglist) ; *(oset->tagset) = *(dset->tagset) ; dsum = 0.0 ; for( jj=ii=0 ; ii < TAGLIST_COUNT(oset->tagset) ; ii++ ){ if( TAG_SET(TAGLIST_SUBTAG(oset->tagset,ii)) ){ rv = DMATVEC( rt.mm , yy[jj] ) ; rv = ADD_DFVEC3( rt.vv , rv ) ; dv = SUB_DFVEC3( xx[jj] , rv ) ; dsum += dv.xyz[0]*dv.xyz[0] + dv.xyz[1]*dv.xyz[1] + dv.xyz[2]*dv.xyz[2] ; UNLOAD_DFVEC3( rv , TAG_X( TAGLIST_SUBTAG(oset->tagset,ii) ) , TAG_Y( TAGLIST_SUBTAG(oset->tagset,ii) ) , TAG_Z( TAGLIST_SUBTAG(oset->tagset,ii) ) ) ; jj++ ; } } dsum = sqrt(dsum/nvec) ; fprintf(stderr,"++ RMS distance between tags after = %.2f mm\n" , dsum ) ; } DSET_write(oset) ; } /* end of 3dWarp-like work */ exit(0) ; }
int main( int argc , char *argv[] ) { NI_stream ns ; void *nini = NULL, *vel=NULL; NI_element *nel=NULL; char *strm=NULL, *attr=NULL; int nn, mode = NI_TEXT_MODE, shhh=0, exact=1; FILE *outf = stdout; char *aa=NULL, *select_attr=NULL, *select_attr_val=NULL; int dodup = 0, nodata=0, dostderr=1, isfile=0; int stat = 0, excl = 0; nn = 1; while (nn < argc && argv[nn][0] == '-') { if (!strcmp(argv[nn], "-help") || !strcmp(argv[nn], "-h")) { usage_niccc(strlen(argv[nn]) > 3 ? 2:1); exit(0); } if (!strcmp(argv[nn],"-dup")) { dodup = 1; ++nn; continue; } if (!strcmp(argv[nn],"-nodata")) { nodata = 0; ++nn; continue; } if (!strcmp(argv[nn],"-stdout")) { dostderr = 0; ++nn; continue; } if (!strcmp(argv[nn],"-#")) { mode = mode|NI_HEADERSHARP_FLAG; ++nn; continue; } if (!strcmp(argv[nn],"-quiet")) { shhh=1; ++nn; continue; } if (!strcmp(argv[nn],"-f")) { isfile=1; ++nn; continue; } if (!strcmp(argv[nn],"-s")) { isfile=2; ++nn; continue; } if (!strcmp(argv[nn],"-attribute")) { ++nn; if (nn >= argc) { fprintf(stderr,"Need attribute after -attribute\n"); exit(1); } attr=argv[nn]; ++nn; continue; } if (!strcmp(argv[nn],"-nel_from_string")) { ++nn; if (nn >= argc) { fprintf(stderr,"Need string after -nel_from_string\n"); exit(1); } nini = (NI_element *)NI_read_element_fromstring(argv[nn]); ++nn; continue; } if (!strcmp(argv[nn],"-skip_nel_with_attr") || !strcmp(argv[nn],"-find_nel_with_attr")) { if (strstr(argv[nn],"-find")) { excl=0; } else { excl=1; } ++nn; if (nn+1 >= argc) { fprintf(stderr, "Need attribute and value after -skip_nel_with_attr\n"); exit(1); } select_attr=argv[nn++]; select_attr_val = argv[nn]; ++nn; continue; } if (!strcmp(argv[nn],"-match")) { ++nn; if (nn >= argc) { fprintf(stderr,"Need parameter after -match\n"); exit(1); } if (!strcmp(argv[nn],"exact")) exact = 1; else if (!strcmp(argv[nn],"partial")) exact = 0; else { fprintf(stderr,"%s is not a valid value for -match. \n" "Use either exact or partial\n", argv[nn]); exit(1); } ++nn; continue; } ERROR_message("Bad option %s. See niccc -help for details.\n", argv[nn]); suggest_best_prog_option(argv[0], argv[nn]); exit(1); } if( argc < 2 ){ ERROR_exit("Too few options"); } if (nodata) mode = mode&NI_HEADERONLY_FLAG; if (nn >= argc) { fprintf(stderr,"Usage: niccc [-dup] streamspec\n");exit(1); } strm = (char *) realloc(strm, (strlen(argv[nn])+32)*sizeof(char)); if (isfile == 2) { sprintf(strm,"str:"); ns = NI_stream_open( strm , "r" ) ; NI_stream_setbuf( ns , argv[nn] ) ; } else { if (isfile == 1) { sprintf(strm,"file:%s",argv[nn]); } else { strcpy(strm, argv[nn]); } ns = NI_stream_open( strm, "r" ) ; if( ns == NULL ){ fprintf(stderr,"*** niccc: NI_stream_open fails for %s\n", strm) ; if (THD_is_file(strm)) { fprintf(stderr, " It looks like %s is a file.\n" " Make sure you use option -f before it\n", strm) ; } exit(1) ; } } /*** NI_stream_setbufsize( ns , 6666 ) ; ***/ while(1){ nn = NI_stream_goodcheck( ns , 1 ) ; if( nn < 0 ){ if (strncmp(strm,"file:",5) && strncmp(strm,"str:",4)) { fprintf(stderr,"\n*** niccc: Stream %s fails\n", strm); exit(1); } else { exit(stat); } } if( nn == 0 ){ NI_sleep(5); continue; } /* waiting for Godot */ if (dostderr) outf = stderr; if ( (nn = NI_stream_readcheck( ns , 1 ) ) > 0) { /* check for data */ if (!excl) { stat = 1; /* using -find, exit with status if not found */ } else { stat = 0; /* you got something, exit well */ } while( (nini = NI_read_element( ns , 2 )) ) { if (select_attr) { if ((aa = NI_get_attribute(nini, select_attr))) { if (!strcmp(aa,select_attr_val)) { /* match */ if (excl) goto NEXT; else stat = 0; /* found something */ } else if (!excl) goto NEXT; /* no match */ } } if (attr) { if (exact) { aa = NI_get_attribute(nini, attr); if (aa) { if (shhh) fprintf(outf,"%s\n", aa); else fprintf(outf,"%s: %s\n",attr, aa); exit(0); } else { if (!shhh) fprintf(stderr,"%s: Not found.\n", attr); exit(1); } } else { int tt=NI_element_type(nini) ; int nn, nfound=0; if( tt == NI_ELEMENT_TYPE ){ nel=(NI_element *)nini; for( nn=0 ; nn < nel->attr_num ; nn++ ) { if( strncmp(nel->attr_lhs[nn],attr, strlen(attr)) == 0 ) { if (shhh) fprintf(outf,"%s\n", nel->attr_rhs[nn]); else fprintf(outf,"%s: %s\n", nel->attr_lhs[nn], nel->attr_rhs[nn]); ++nfound; } } if (nfound) exit(0); else { if (!shhh) fprintf(stderr,"%s: Not found.\n", attr); exit(1); } } else { if (strncmp(strm,"file:",5)) { fprintf(stderr,"\n*** niccc: not ready for non elements\n"); exit(1); } else { exit(1); } } } } if (dodup) { if (!shhh) fprintf(stderr, "*** niccc: duplication returned element:\n"); vel = NI_duplicate(nini, 1); NI_free_element( nini ) ; nini=NULL; NIML_to_terminal( vel, mode, dostderr ) ; } else { if (!shhh) fprintf(stderr,"*** niccc: reading returned element:\n") ; NIML_to_terminal( nini, mode, dostderr ) ; } NEXT: if (nini) NI_free_element( nini ) ; nini=NULL; if (vel) NI_free_element( vel ); vel = NULL; } } } /* while stream is good */ }
int main( int argc , char *argv[] ) { THD_3dim_dataset *inset=NULL , *outset ; THD_3dim_dataset **insar=NULL ; int nsar=0 ; int iarg=1 , ii,kk , ids ; MCW_cluster *nbhd=NULL ; char *prefix="./localhistog" ; int ntype=0 ; float na=0.0f,nb=0.0f,nc=0.0f ; int verb=1 , do_prob=0 ; int nx=0,ny=0,nz=0,nvox=0, rbot,rtop ; char *labfile=NULL ; NI_element *labnel=NULL ; int nlab=0 , *labval=NULL ; char **lablab=NULL ; char buf[THD_MAX_SBLABEL] ; UINT32 *ohist , *mhist=NULL ; char *ohist_name=NULL ; int ohzadd=0 ; int *rlist , numval ; float mincount=0.0f ; int mcc ; int *exlist=NULL, numex=0 ; int do_excNONLAB=0 ; /*---- for the clueless who wish to become clued-in ----*/ if( argc == 1 ){ usage_3dLocalHistog(1); exit(0); } /* Bob's help shortcut */ /*---- official startup ---*/ #if defined(USING_MCW_MALLOC) && !defined(USE_OMP) enable_mcw_malloc() ; #endif PRINT_VERSION("3dLocalHistog"); mainENTRY("3dLocalHistog main"); machdep(); AFNI_logger("3dLocalHistog",argc,argv); if( getpid()%2 ) AUTHOR("Bilbo Baggins"); else AUTHOR("Thorin Oakenshield"); AFNI_SETUP_OMP(0) ; /* 24 Jun 2013 */ /*---- loop over options ----*/ while( iarg < argc && argv[iarg][0] == '-' ){ if( strcmp(argv[iarg],"-help") == 0 || strcmp(argv[iarg],"-h") == 0){ usage_3dLocalHistog(strlen(argv[iarg])>3 ? 2:1); exit(0); } if( strncmp(argv[iarg],"-qu",3) == 0 ){ verb = 0 ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-verb",5) == 0 ){ verb++ ; iarg++ ; continue ; } #ifdef ALLOW_PROB if( strncmp(argv[iarg],"-prob",5) == 0 ){ do_prob = 1 ; iarg++ ; continue ; } #endif if( strcmp(argv[iarg],"-exclude") == 0 ){ int ebot=-6666666,etop=-6666666 , ee ; if( ++iarg >= argc ) ERROR_exit("Need argument after '-exclude'") ; sscanf(argv[iarg],"%d..%d",&ebot,&etop) ; if( ebot >= -TWO15 && ebot <= TWO15 ){ if( etop < -TWO15 || etop > TWO15 || etop < ebot ) etop = ebot ; exlist = (int *)realloc(exlist,sizeof(int)*(etop-ebot+1+numex+1)) ; for( ee=ebot ; ee <= etop ; ee++ ){ if( ee != 0 ) exlist[numex++] = ee ; } } iarg++ ; continue ; } if( strcmp(argv[iarg],"-excNONLAB") == 0 ){ do_excNONLAB = 1 ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-prefix") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-prefix'") ; prefix = strdup(argv[iarg]) ; if( !THD_filename_ok(prefix) ) ERROR_exit("Bad -prefix!") ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-hsave") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-hsave'") ; ohist_name = strdup(argv[iarg]) ; if( !THD_filename_ok(ohist_name) ) ERROR_exit("Bad -hsave!") ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-mincount") == 0 ){ char *cpt ; if( ++iarg >= argc ) ERROR_exit("Need argument after '-mincount'") ; mincount = (float)strtod(argv[iarg],&cpt) ; #if 0 if( mincount > 0.0f && mincount < 50.0f && *cpt == '%' ) /* percentage */ mincount = -0.01f*mincount ; #endif iarg++ ; continue ; } if( strcmp(argv[iarg],"-nbhd") == 0 ){ char *cpt ; if( ntype > 0 ) ERROR_exit("Can't have 2 '-nbhd' options") ; if( ++iarg >= argc ) ERROR_exit("Need argument after '-nbhd'") ; cpt = argv[iarg] ; if( strncasecmp(cpt,"SPHERE",6) == 0 ){ sscanf( cpt+7 , "%f" , &na ) ; ntype = NTYPE_SPHERE ; } else if( strncasecmp(cpt,"RECT",4) == 0 ){ sscanf( cpt+5 , "%f,%f,%f" , &na,&nb,&nc ) ; if( na == 0.0f && nb == 0.0f && nc == 0.0f ) ERROR_exit("'RECT(0,0,0)' is not a legal neighborhood") ; ntype = NTYPE_RECT ; } else if( strncasecmp(cpt,"RHDD",4) == 0 ){ sscanf( cpt+5 , "%f" , &na ) ; if( na == 0.0f ) ERROR_exit("Can't have a RHDD of radius 0") ; ntype = NTYPE_RHDD ; } else if( strncasecmp(cpt,"TOHD",4) == 0 ){ sscanf( cpt+5 , "%f" , &na ) ; if( na == 0.0f ) ERROR_exit("Can't have a TOHD of radius 0") ; ntype = NTYPE_TOHD ; } else { ERROR_exit("Unknown -nbhd shape: '%s'",cpt) ; } iarg++ ; continue ; } if( strcmp(argv[iarg],"-lab_file") == 0 || strcmp(argv[iarg],"-labfile") == 0 ){ char **labnum ; int nbad=0 ; if( ++iarg >= argc ) ERROR_exit("Need argument after '%s'",argv[iarg-1]) ; if( labfile != NULL ) ERROR_exit("Can't use '%s' twice!",argv[iarg-1]) ; labfile = strdup(argv[iarg]) ; labnel = THD_string_table_read(labfile,0) ; if( labnel == NULL || labnel->vec_num < 2 ) ERROR_exit("Can't read label file '%s'",labfile) ; nlab = labnel->vec_len ; labnum = (char **)labnel->vec[0] ; lablab = (char **)labnel->vec[1] ; labval = (int *)calloc(sizeof(int),nlab) ; for( ii=0 ; ii < nlab ; ii++ ){ if( labnum[ii] != NULL ){ labval[ii] = (int)strtod(labnum[ii],NULL) ; if( labval[ii] < -TWO15 || labval[ii] > TWO15 ){ labval[ii] = 0; nbad++; } } } if( nbad > 0 ) ERROR_message("%d label values are outside the range %d..%d :-(" , nbad , -TWO15 , TWO15 ) ; iarg++ ; continue ; } ERROR_message("** 3dLocalHistog: Illegal option: '%s'",argv[iarg]) ; suggest_best_prog_option(argv[0], argv[iarg]); exit(1) ; } /*--- end of loop over options ---*/ /*---- check for stupid user inputs ----*/ if( iarg >= argc ) ERROR_exit("No datasets on command line?") ; if( ohist_name == NULL && strcmp(prefix,"NULL") == 0 ) ERROR_exit("-prefix NULL is only meaningful if you also use -hsave :-(") ; /*------------ scan input datasets, built overall histogram ------------*/ nsar = argc - iarg ; insar = (THD_3dim_dataset **)malloc(sizeof(THD_3dim_dataset *)*nsar) ; if( verb ) fprintf(stderr,"Scanning %d datasets ",nsar) ; ohist = (UINT32 *)calloc(sizeof(UINT32),TWO16) ; for( ids=iarg ; ids < argc ; ids++ ){ /* dataset loop */ insar[ids-iarg] = inset = THD_open_dataset(argv[ids]) ; CHECK_OPEN_ERROR(inset,argv[ids]) ; if( ids == iarg ){ nx = DSET_NX(inset); ny = DSET_NY(inset); nz = DSET_NZ(inset); nvox = nx*ny*nz; } else if( nx != DSET_NX(inset) || ny != DSET_NY(inset) || nz != DSET_NZ(inset) ){ ERROR_exit("Dataset %s grid doesn't match!",argv[ids]) ; } if( !THD_datum_constant(inset->dblk) ) ERROR_exit("Dataset %s doesn't have a fixed data type! :-(",argv[ids]) ; if( THD_need_brick_factor(inset) ) ERROR_exit("Dataset %s has scale factors! :-(",argv[ids]) ; if( DSET_BRICK_TYPE(inset,0) != MRI_byte && DSET_BRICK_TYPE(inset,0) != MRI_short && DSET_BRICK_TYPE(inset,0) != MRI_float ) ERROR_exit("Dataset %s is not byte- or short-valued! :-(",argv[ids]) ; DSET_load(inset) ; CHECK_LOAD_ERROR(inset) ; for( ii=0 ; ii < DSET_NVALS(inset) ; ii++ ){ /* add to overall histogram */ if( verb ) fprintf(stderr,".") ; switch( DSET_BRICK_TYPE(inset,ii) ){ case MRI_short:{ short *sar = (short *)DSET_BRICK_ARRAY(inset,ii) ; for( kk=0 ; kk < nvox ; kk++ ) ohist[ sar[kk]+TWO15 ]++ ; } break ; case MRI_byte:{ byte *bar = (byte *)DSET_BRICK_ARRAY(inset,ii) ; for( kk=0 ; kk < nvox ; kk++ ) ohist[ bar[kk]+TWO15 ]++ ; } break ; case MRI_float:{ float *far = (float *)DSET_BRICK_ARRAY(inset,ii) ; short ss ; for( kk=0 ; kk < nvox ; kk++ ){ ss = SHORTIZE(far[kk]); ohist[ss+TWO15]++; } } break ; } } /* end of sub-brick loop */ DSET_unload(inset) ; /* will re-load later, as needed */ } /* end of dataset loop */ if( verb ) fprintf(stderr,"\n") ; /*-------------- process overall histogram for fun and profit -------------*/ /* if we didn't actually find 0, put it in the histogram now */ if( ohist[0+TWO15] == 0 ){ ohist[0+TWO15] = 1 ; ohzadd = 1 ; } /* excNONLAB? */ if( nlab > 0 && do_excNONLAB ){ byte *klist = (byte *)calloc(sizeof(byte),TWO16) ; int nee ; for( ii=0 ; ii < nlab ; ii++ ){ if( labval[ii] != 0 ) klist[labval[ii]+TWO15] = 1 ; } for( nee=ii=0 ; ii < TWO16 ; ii++ ){ if( !klist[ii] ) nee++ ; } exlist = (int *)realloc(exlist,sizeof(int)*(numex+nee+1)) ; for( ii=0 ; ii < TWO16 ; ii++ ){ if( ii != TWO15 && !klist[ii] ) exlist[numex++] = ii-TWO15 ; } free(klist) ; } /* make a copy of ohist and edit it for mincount, etc */ mhist = (UINT32 *)malloc(sizeof(UINT32)*TWO16) ; memcpy(mhist,ohist,sizeof(UINT32)*TWO16) ; mcc = (mincount < 0.0f) ? (int)(-mincount*nvox) : (int)mincount ; if( mcc > 1 ){ for( ids=ii=0 ; ii < TWO16 ; ii++ ){ if( ii != TWO15 && mhist[ii] > 0 && mhist[ii] < mcc ){ mhist[ii] = 0; ids++; } } if( ids > 0 && verb ) INFO_message("Edited out %d values with overall histogram counts less than %d",ids,mcc) ; } if( numex > 0 ){ int ee ; for( ids=0,ii=0 ; ii < numex ; ii++ ){ ee = exlist[ii] ; if( mhist[ee+TWO15] > 0 ){ mhist[ee+TWO15] = 0; ids++; } } free(exlist) ; if( ids > 0 && verb ) INFO_message("Edited out %d values from the exclude list",ids) ; } /* count number of values with nonzero (edited) counts */ numval = 0 ; for( ii=0 ; ii < TWO16 ; ii++ ) if( mhist[ii] != 0 ) numval++ ; if( numval == 0 ) ERROR_exit("Nothing found! WTF?") ; /* should not happen */ /* make list of all values with nonzero (edited) count */ rlist = (int *)malloc(sizeof(int)*numval) ; if( verb > 1 ) fprintf(stderr,"++ Include list:") ; for( ii=kk=0 ; ii < TWO16 ; ii++ ){ if( mhist[ii] != 0 ){ rlist[kk++] = ii-TWO15 ; if( verb > 1 ) fprintf(stderr," %d[%u]",ii-TWO15,mhist[ii]) ; } } if( verb > 1 ) fprintf(stderr,"\n") ; rbot = rlist[0] ; rtop = rlist[numval-1] ; /* smallest and largest values found */ if( rbot == rtop ) ERROR_exit("Only one value (%d) found in all inputs!",rbot) ; /* if 0 isn't first in rlist, then put it in first place and move negative values up by one spot */ if( rbot < 0 ){ for( kk=0 ; kk < numval && rlist[kk] != 0 ; kk++ ) ; /*nada*/ if( kk < numval ){ /* should always be true */ for( ii=kk-1 ; ii >= 0 ; ii-- ) rlist[ii+1] = rlist[ii] ; rlist[0] = 0 ; } } if( verb ) INFO_message("Value range = %d..%d (%d distinct values)",rbot,rtop,numval ); /* save overall histogram? */ if( ohist_name != NULL ){ FILE *fp = fopen(ohist_name,"w") ; int nl=0 ; if( fp == NULL ) ERROR_exit("Can't open -hsave '%s' for output!",ohist_name) ; if( ohzadd ) ohist[0+TWO15] = 0 ; for( ii=0 ; ii < TWO16 ; ii++ ){ if( ohist[ii] != 0 ){ fprintf(fp,"%6d %u\n",ii-TWO15,ohist[ii]); nl++; } } fclose(fp) ; if( verb ) INFO_message("Wrote %d lines to -hsave file %s",nl,ohist_name) ; } free(ohist) ; free(mhist) ; mhist = ohist = NULL ; /* done with this */ if( strcmp(prefix,"NULL") == 0 ) exit(0) ; /* special case */ /*----------- build the neighborhood mask -----------*/ if( ntype <= 0 ){ /* default neighborhood */ ntype = NTYPE_SPHERE ; na = 0.0f ; if( verb ) INFO_message("Using default neighborhood = self") ; } switch( ntype ){ default: ERROR_exit("WTF? ntype=%d",ntype) ; /* should not happen */ case NTYPE_SPHERE:{ float dx , dy , dz ; if( na < 0.0f ){ dx = dy = dz = 1.0f ; na = -na ; } else { dx = fabsf(DSET_DX(insar[0])) ; dy = fabsf(DSET_DY(insar[0])) ; dz = fabsf(DSET_DZ(insar[0])) ; } nbhd = MCW_spheremask( dx,dy,dz , na ) ; } break ; case NTYPE_RECT:{ float dx , dy , dz ; if( na < 0.0f ){ dx = 1.0f; na = -na; } else dx = fabsf(DSET_DX(insar[0])); if( nb < 0.0f ){ dy = 1.0f; nb = -nb; } else dy = fabsf(DSET_DY(insar[0])); if( nc < 0.0f ){ dz = 1.0f; nc = -nc; } else dz = fabsf(DSET_DZ(insar[0])); nbhd = MCW_rectmask( dx,dy,dz , na,nb,nc ) ; } break ; case NTYPE_RHDD:{ float dx , dy , dz ; if( na < 0.0f ){ dx = dy = dz = 1.0f ; na = -na ; } else { dx = fabsf(DSET_DX(insar[0])) ; dy = fabsf(DSET_DY(insar[0])) ; dz = fabsf(DSET_DZ(insar[0])) ; } nbhd = MCW_rhddmask( dx,dy,dz , na ) ; } break ; case NTYPE_TOHD:{ float dx , dy , dz ; if( na < 0.0f ){ dx = dy = dz = 1.0f ; na = -na ; } else { dx = fabsf(DSET_DX(insar[0])) ; dy = fabsf(DSET_DY(insar[0])) ; dz = fabsf(DSET_DZ(insar[0])) ; } nbhd = MCW_tohdmask( dx,dy,dz , na ) ; } break ; } if( verb ) INFO_message("Neighborhood comprises %d voxels",nbhd->num_pt) ; /*------- actually do some work for a change (is it lunchtime yet?) -------*/ if( verb ) fprintf(stderr,"Voxel-wise histograms ") ; outset = THD_localhistog( nsar,insar , numval,rlist , nbhd , do_prob,verb ) ; if( outset == NULL ) ERROR_exit("Function THD_localhistog() fails?!") ; /*---- save resulting dataset ----*/ EDIT_dset_items( outset , ADN_prefix,prefix , ADN_none ) ; tross_Copy_History( insar[0] , outset ) ; tross_Make_History( "3dLocalHistog" , argc,argv , outset ) ; /* but first attach labels to sub-bricks */ EDIT_BRICK_LABEL(outset,0,"0:Other") ; for( kk=1 ; kk < numval ; kk++ ){ sprintf(buf,"%d:",rlist[kk]) ; for( ii=0 ; ii < nlab ; ii++ ){ if( labval[ii] == rlist[kk] && lablab[ii] != NULL ){ ids = strlen(buf) ; MCW_strncpy(buf+ids,lablab[ii],THD_MAX_SBLABEL-ids) ; break ; } } EDIT_BRICK_LABEL(outset,kk,buf) ; } DSET_write( outset ) ; if( verb ) WROTE_DSET( outset ) ; exit(0) ; }
int main( int argc , char *argv[] ) { MRI_IMAGE *imin, *imout , *imout_orig; THD_3dim_dataset *iset, *oset , *ooset; char *prefix = "SpatNorm", *bottom_cuts = NULL; int iarg , verb=0, OrigSpace = 0 , specie = HUMAN; float SpatNormDxyz= 0.0, iset_scaled=1.0; THD_ivec3 orixyz , nxyz ; THD_fvec3 dxyz , orgxyz, originRAIfv, fv2; mainENTRY("3dSpatNorm main") ; machdep() ; if (argc == 1) { usage_3dSpatNorm(1); exit(0); } /*--- options ---*/ iarg = 1 ; OrigSpace = 0; while( iarg < argc && argv[iarg][0] == '-' ){ if (strcmp(argv[iarg],"-h") == 0 || strcmp(argv[iarg],"-help") == 0 ) { usage_3dSpatNorm(strlen(argv[iarg]) > 3 ? 2:1); exit(0); } /* -prefix */ if( strcmp(argv[iarg],"-prefix") == 0 ){ if( ++iarg >= argc ){ fprintf(stderr,"**ERROR: -prefix requires another argument!\n") ; exit(1) ; } prefix = strdup(argv[iarg]) ; if( !THD_filename_ok(prefix) ){ fprintf(stderr,"**ERROR: -prefix value contains forbidden characters!\n") ; exit(1) ; } iarg++ ; continue ; } if( strcmp(argv[iarg],"-dxyz") == 0 ){ if( ++iarg >= argc ){ fprintf(stderr,"**ERROR: -dxyz requires another argument!\n") ; exit(1) ; } SpatNormDxyz = atof(argv[iarg]) ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-bottom_cuts") == 0 ){ if( ++iarg >= argc ){ fprintf(stderr,"**ERROR: -bottom_cuts requires another argument!\n") ; exit(1) ; } bottom_cuts = argv[iarg] ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-verb",5) == 0 ){ verb++ ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-human",5) == 0 ){ specie = HUMAN ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-monkey",5) == 0 ){ specie = MONKEY ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-marmoset",5) == 0 ){ specie = MARMOSET ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-rat",5) == 0 ){ specie = RAT ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-orig_space",10) == 0 ){ OrigSpace = 1 ; iarg++ ; continue ; } fprintf(stderr,"**ERROR: %s is unknown option!\n",argv[iarg]) ; suggest_best_prog_option(argv[0], argv[iarg]); exit(1) ; } if( iarg >= argc ){ fprintf(stderr,"**ERROR: no input dataset name on command line?!\n") ; exit(1) ; } /*--- read dataset ---*/ iset = THD_open_dataset( argv[iarg] ) ; if( !ISVALID_DSET(iset) ){ fprintf(stderr,"**ERROR: can't open dataset %s\n",argv[iarg]) ; exit(1) ; } /*--- get median brick --*/ if( verb ) fprintf(stderr,"++3dSpatNorm: loading dataset\n") ; if (specie == MARMOSET) { iset_scaled = 2.5; THD_volDXYZscale(iset->daxes, iset_scaled, 0); specie = MONKEY; } imin = THD_median_brick( iset ) ; if( imin == NULL ){ fprintf(stderr,"**ERROR: can't load dataset %s\n",argv[iarg]) ; exit(1) ; } imin->dx = fabs(iset->daxes->xxdel) ; imin->dy = fabs(iset->daxes->yydel) ; imin->dz = fabs(iset->daxes->zzdel) ; mri_speciebusiness(specie); mri_brain_normalize_cuts(bottom_cuts); if (SpatNormDxyz) { if (verb) fprintf(stderr,"Overriding default resampling\n"); mri_brainormalize_initialize(SpatNormDxyz, SpatNormDxyz, SpatNormDxyz); } else { float xxdel, yydel, zzdel, minres; if (specie == MONKEY) minres = 0.5; else if (specie == MARMOSET) minres = 0.2; else if (specie == RAT) minres = 0.1; else minres = 0.5; /* don't allow for too low a resolution, please */ if (imin->dx < minres) xxdel = minres; else xxdel = imin->dx; if (imin->dy < minres) yydel = minres; else yydel = imin->dy; if (imin->dz < minres) zzdel = minres; else zzdel = imin->dz; if (verb) { fprintf(stderr, "%s:\n" " Original resolution %f, %f, %f\n" " SpatNorm resolution %f, %f, %f\n", "3dSpatnorm", imin->dx, imin->dy, imin->dz, xxdel, yydel, zzdel); } mri_brainormalize_initialize(xxdel, yydel, zzdel); } /* To get around the #define for voxel counts and dimensions */ mri_brainormalize_initialize(imin->dz, imin->dy, imin->dz); /* me needs the origin of this dset in RAI world */ LOAD_FVEC3( originRAIfv , iset->daxes->xxorg , iset->daxes->yyorg , iset->daxes->zzorg) ; originRAIfv = THD_3dmm_to_dicomm( iset , originRAIfv ) ; LOAD_FVEC3(fv2, iset->daxes->xxorg + (iset->daxes->nxx-1)*iset->daxes->xxdel , iset->daxes->yyorg + (iset->daxes->nyy-1)*iset->daxes->yydel , iset->daxes->zzorg + (iset->daxes->nzz-1)*iset->daxes->zzdel); fv2 = THD_3dmm_to_dicomm( iset , fv2 ) ; if( originRAIfv.xyz[0] > fv2.xyz[0] ) { float tf; tf = originRAIfv.xyz[0]; originRAIfv.xyz[0] = fv2.xyz[0]; fv2.xyz[0] = tf; } if( originRAIfv.xyz[1] > fv2.xyz[1] ) { float tf; tf = originRAIfv.xyz[1]; originRAIfv.xyz[1] = fv2.xyz[1]; fv2.xyz[1] = tf; } if( originRAIfv.xyz[2] > fv2.xyz[2] ) { float tf; tf = originRAIfv.xyz[2]; originRAIfv.xyz[2] = fv2.xyz[2]; fv2.xyz[2] = tf; } if (verb) { fprintf(stderr,"++3dSpatNorm (ZSS): RAI origin info: %f %f %f\n", originRAIfv.xyz[0], originRAIfv.xyz[1], originRAIfv.xyz[2]); } DSET_unload( iset ) ; /* don't need this data no more */ /*-- convert image to shorts, if appropriate --*/ if( DSET_BRICK_TYPE(iset,0) == MRI_short || DSET_BRICK_TYPE(iset,0) == MRI_byte ){ imout = mri_to_short(0.0,imin) ; /* ZSS Oct 2012: Let function set scaling*/ mri_free(imin) ; imin = imout ; } /*--- normalize image spatially ---*/ mri_brainormalize_verbose( verb ) ; if (OrigSpace) { imout = mri_brainormalize( imin , iset->daxes->xxorient, iset->daxes->yyorient, iset->daxes->zzorient , &imout_orig, NULL) ; } else { imout = mri_brainormalize( imin , iset->daxes->xxorient, iset->daxes->yyorient, iset->daxes->zzorient , NULL, NULL) ; } mri_free( imin ) ; if( imout == NULL ){ fprintf(stderr,"**ERROR: normalization fails!?\n"); exit(1); } if (OrigSpace) { if( verb ) fprintf(stderr,"++3dSpatNorm: Output in Orignal space\n") ; mri_free( imout ) ; imout = imout_orig; imout->xo = originRAIfv.xyz[0]; imout->yo = originRAIfv.xyz[1]; imout->zo = originRAIfv.xyz[2]; imout_orig = NULL; } else { if( verb ) fprintf(stderr,"++3dSpatNorm: Output in SpatNorm space\n") ; } #if 0 if( AFNI_yesenv("WATERSHED") ){ imin = mri_watershedize( imout , 0.10 ) ; if( imin != NULL ){ mri_free(imout); imout = imin; } } #endif /*--- create output dataset ---*/ if( verb ) fprintf(stderr,"++3dSpatNorm: Creating output dset\n") ; oset = EDIT_empty_copy( NULL ) ; tross_Copy_History( iset , oset ) ; tross_Make_History( "3dSpatNorm" , argc,argv , oset ) ; LOAD_IVEC3( nxyz , imout->nx , imout->ny , imout->nz ) ; LOAD_FVEC3( dxyz , imout->dx , imout->dy , imout->dz ) ; LOAD_FVEC3( orgxyz , imout->xo , imout->yo , imout->zo ) ; LOAD_IVEC3( orixyz , ORI_R2L_TYPE , ORI_A2P_TYPE , ORI_I2S_TYPE ) ; if( verb ) fprintf(stderr,"++3dSpatNorm: EDIT_dset_items\n") ; EDIT_dset_items( oset , ADN_prefix , prefix , ADN_datum_all , imout->kind , ADN_nxyz , nxyz , ADN_xyzdel , dxyz , ADN_xyzorg , orgxyz , ADN_xyzorient , orixyz , ADN_malloc_type , DATABLOCK_MEM_MALLOC , ADN_view_type , VIEW_ORIGINAL_TYPE , ADN_type , HEAD_ANAT_TYPE , ADN_func_type , ANAT_BUCK_TYPE , ADN_none ) ; if( verb ) fprintf(stderr,"++3dSpatNorm: EDIT_substitute_brick\n") ; EDIT_substitute_brick( oset , 0 , imout->kind , mri_data_pointer(imout) ) ; if (OrigSpace) { if( verb ) fprintf(stderr,"++3dSpatNorm: Changing orientation from RAI\n") ; ooset = r_new_resam_dset ( oset, iset, 0, 0, 0, NULL, MRI_NN, NULL, 1, 0); if (!ooset) { fprintf(stderr,"**ERROR: Failed to reslice!?\n"); exit(1); } /* put prefix back, r_new_resam_dset puts dummy prefix */ EDIT_dset_items( ooset , ADN_prefix , prefix, ADN_none ) ; DSET_delete(oset); oset = ooset; ooset = NULL; } if (iset_scaled != 1.0f) THD_volDXYZscale(oset->daxes, 1/iset_scaled, 0); DSET_write(oset) ; if( verb ) fprintf(stderr,"++3dSpatNorm: wrote dataset %s\n",DSET_BRIKNAME(oset)) ; exit(0) ; }
int main( int argc , char *argv[] ) { int iarg=1 , ii , do_iwarp=0 ; char *prefix = "NwarpCat" ; mat44 wmat , smat , qmat ; THD_3dim_dataset *oset=NULL ; char *cwarp_all=NULL ; int ntot=0 ; AFNI_SETUP_OMP(0) ; /* 24 Jun 2013 */ if( argc < 2 || strcasecmp(argv[1],"-help") == 0 ) NWC_help() ; /*-- bureaucracy --*/ mainENTRY("3dNwarpCat"); machdep(); AFNI_logger("3dNwarpCat",argc,argv); PRINT_VERSION("3dNwarpCat"); AUTHOR("Zhark the Warper"); (void)COX_clock_time() ; putenv("AFNI_WSINC5_SILENT=YES") ; /*-- initialization --*/ CW_no_expad = 1 ; /* don't allow automatic padding of input warp */ Hverb = 0 ; /* don't be verbose inside mri_nwarp.c */ for( ii=0 ; ii < NWMAX ; ii++ ) cwarp[ii] = NULL ; /*-- scan args --*/ while( iarg < argc && argv[iarg][0] == '-' ){ /*---------------*/ if( strcasecmp(argv[iarg],"-iwarp") == 0 ){ do_iwarp = 1 ; iarg++ ; continue ; } /*---------------*/ if( strcasecmp(argv[iarg],"-space") == 0 ){ sname = strdup(argv[++iarg]) ; iarg++ ; continue ; } /*---------------*/ if( strcasecmp(argv[iarg],"-NN") == 0 || strncasecmp(argv[iarg],"-nearest",6) == 0 ){ WARNING_message("NN interpolation not legal here -- switched to linear") ; interp_code = MRI_LINEAR ; iarg++ ; continue ; } if( strncasecmp(argv[iarg],"-linear",4)==0 || strncasecmp(argv[iarg],"-trilinear",6)==0 ){ interp_code = MRI_LINEAR ; iarg++ ; continue ; } if( strncasecmp(argv[iarg],"-cubic",4)==0 || strncasecmp(argv[iarg],"-tricubic",6)==0 ){ WARNING_message("cubic interplation not legal here -- switched to quintic") ; interp_code = MRI_QUINTIC ; iarg++ ; continue ; } if( strncasecmp(argv[iarg],"-quintic",4)==0 || strncasecmp(argv[iarg],"-triquintic",6)==0 ){ interp_code = MRI_QUINTIC ; iarg++ ; continue ; } if( strncasecmp(argv[iarg],"-wsinc",5) == 0 ){ interp_code = MRI_WSINC5 ; iarg++ ; continue ; } /*---------------*/ if( strcasecmp(argv[iarg],"-expad") == 0 ){ int expad ; if( ++iarg >= argc ) ERROR_exit("no argument after '%s' :-(",argv[iarg-1]) ; expad = (int)strtod(argv[iarg],NULL) ; if( expad < 0 ){ WARNING_message("-expad %d is illegal and is set to zero",expad) ; expad = 0 ; } CW_extra_pad = expad ; /* this is how we force extra padding */ iarg++ ; continue ; } /*---------------*/ if( strncasecmp(argv[iarg],"-interp",5)==0 ){ char *inam ; if( ++iarg >= argc ) ERROR_exit("no argument after '%s' :-(",argv[iarg-1]) ; inam = argv[iarg] ; if( *inam == '-' ) inam++ ; if( strcasecmp(inam,"NN")==0 || strncasecmp(inam,"nearest",5)==0 ){ WARNING_message("NN interpolation not legal here -- changed to linear") ; interp_code = MRI_LINEAR ; } else if( strncasecmp(inam,"linear",3)==0 || strncasecmp(inam,"trilinear",5)==0 ){ interp_code = MRI_LINEAR ; } else if( strncasecmp(inam,"cubic",3)==0 || strncasecmp(inam,"tricubic",5)==0 ){ WARNING_message("cubic interplation not legal here -- changed to quintic") ; interp_code = MRI_QUINTIC ; } else if( strncasecmp(inam,"quintic",3)==0 || strncasecmp(inam,"triquintic",5)==0 ){ interp_code = MRI_QUINTIC ; } else if( strncasecmp(inam,"wsinc",4)==0 ){ interp_code = MRI_WSINC5 ; } else { ERROR_exit("Unknown code '%s' after '%s' :-(",argv[iarg],argv[iarg-1]) ; } iarg++ ; continue ; } /*---------------*/ if( strcasecmp(argv[iarg],"-verb") == 0 ){ verb++ ; NwarpCalcRPN_verb(verb) ; iarg++ ; continue ; } /*---------------*/ if( strcasecmp(argv[iarg],"-prefix") == 0 ){ if( ++iarg >= argc ) ERROR_exit("no argument after '%s' :-(",argv[iarg-1]) ; prefix = argv[iarg] ; if( !THD_filename_ok(prefix) ) ERROR_exit("Illegal name after '%s'",argv[iarg-1]) ; iarg++ ; continue ; } /*---------------*/ if( strncasecmp(argv[iarg],"-warp",5) == 0 ){ int nn ; if( iarg >= argc-1 ) ERROR_exit("no argument after '%s' :-(",argv[iarg]) ; if( !isdigit(argv[iarg][5]) ) ERROR_exit("illegal format for '%s' :-(",argv[iarg]) ; nn = (int)strtod(argv[iarg]+5,NULL) ; if( nn <= 0 || nn > NWMAX ) ERROR_exit("illegal warp index in '%s' :-(",argv[iarg]) ; if( cwarp[nn-1] != NULL ) ERROR_exit("'%s': you can't specify warp #%d more than once :-(",argv[iarg],nn) ; cwarp[nn-1] = strdup(argv[++iarg]) ; if( nn > nwtop ) nwtop = nn ; iarg++ ; continue ; } /*---------------*/ ERROR_message("Confusingly Unknown option '%s' :-(",argv[iarg]) ; suggest_best_prog_option(argv[0],argv[iarg]) ; exit(1) ; } /*-- load any warps left on the command line, after options --*/ for( ; iarg < argc && nwtop < NWMAX-1 ; iarg++ ) cwarp[nwtop++] = strdup(argv[iarg]) ; /*-- check if all warp strings are affine matrices --*/ #undef AFFINE_WARP_STRING #define AFFINE_WARP_STRING(ss) \ ( strstr((ss)," ") == NULL && \ ( strcasestr((ss),".1D") != NULL || strcasestr((ss),".txt") != NULL ) ) for( ntot=ii=0 ; ii < nwtop ; ii++ ){ if( cwarp[ii] == NULL ) continue ; ntot += strlen(cwarp[ii]) ; if( ! AFFINE_WARP_STRING(cwarp[ii]) ) break ; /* not affine */ } if( ntot == 0 ) ERROR_exit("No warps on command line?!") ; if( ii == nwtop ){ /* all are affine (this is for Ziad) */ char *fname = malloc(sizeof(char)*(strlen(prefix)+16)) ; FILE *fp ; float a11,a12,a13,a14,a21,a22,a23,a24,a31,a32,a33,a34 ; LOAD_IDENT_MAT44(wmat) ; for( ii=0 ; ii < nwtop ; ii++ ){ if( cwarp[ii] == NULL ) continue ; smat = CW_read_affine_warp_OLD(cwarp[ii]) ; qmat = MAT44_MUL(smat,wmat) ; wmat = qmat ; } if( strcmp(prefix,"-") == 0 || strncmp(prefix,"stdout",6) == 0 ){ fp = stdout ; strcpy(fname,"stdout") ; } else { strcpy(fname,prefix) ; if( strstr(fname,".1D") == NULL ) strcat(fname,".aff12.1D") ; fp = fopen(fname,"w") ; if( fp == NULL ) ERROR_exit("Can't open output matrix file %s",fname) ; } if( do_iwarp ){ qmat = MAT44_INV(wmat) ; wmat = qmat ; } UNLOAD_MAT44(wmat,a11,a12,a13,a14,a21,a22,a23,a24,a31,a32,a33,a34) ; fprintf(fp, " %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g\n", a11,a12,a13,a14,a21,a22,a23,a24,a31,a32,a33,a34 ) ; if( verb && fp != stdout ) INFO_message("Wrote matrix to %s",fname) ; if( fp != stdout ) fclose(fp) ; exit(0) ; } /*** at least one nonlinear warp ==> cat all strings, use library function to read ***/ cwarp_all = (char *)calloc(sizeof(char),(ntot+NWMAX)*2) ; for( ii=0 ; ii < nwtop ; ii++ ){ if( cwarp[ii] != NULL ){ strcat(cwarp_all,cwarp[ii]) ; strcat(cwarp_all," ") ; } } oset = IW3D_read_catenated_warp( cwarp_all ) ; /* process all of them at once */ if( do_iwarp ){ /* 18 Jul 2014 */ THD_3dim_dataset *qwarp ; if( verb ) fprintf(stderr,"Applying -iwarp option") ; qwarp = THD_nwarp_invert(oset) ; DSET_delete(oset) ; oset = qwarp ; if( verb ) fprintf(stderr,"\n") ; } tross_Make_History( "3dNwarpCat" , argc,argv , oset ) ; if( sname != NULL ) MCW_strncpy( oset->atlas_space , sname , THD_MAX_NAME ) ; EDIT_dset_items( oset , ADN_prefix,prefix , ADN_none ) ; DSET_write(oset) ; WROTE_DSET(oset) ; /*--- run away screaming into the night, never to be seen again ---*/ INFO_message("total CPU time = %.1f sec Elapsed = %.1f\n", COX_cpu_time() , COX_clock_time() ) ; exit(0) ; }
/*!\** File : SUMA.c \author : Ziad Saad Date : Thu Dec 27 16:21:01 EST 2001 Purpose : Input paramters : \param \param Usage : SUMA ( ) Returns : \return \return Support : \sa OpenGL prog. Guide 3rd edition \sa varray.c from book's sample code Side effects : ***/ int main (int argc,char *argv[]) {/* Main */ static char FuncName[]={"suma"}; int kar, i; SUMA_SFname *SF_name; SUMA_Boolean brk, SurfIn; char *NameParam, *AfniHostName = NULL, *s = NULL, *pdspec=NULL, *pdsv=NULL; char *specfilename[SUMA_MAX_N_GROUPS], *VolParName[SUMA_MAX_N_GROUPS]; byte InMem[SUMA_MAX_N_GROUPS]; SUMA_SurfSpecFile *Specp[SUMA_MAX_N_GROUPS]; SUMA_Axis *EyeAxis; SUMA_EngineData *ED= NULL; DList *list = NULL; DListElmt *Element= NULL; int iv15[15], N_iv15, ispec, nspec; struct stat stbuf; float fff=0.0; int Start_niml = 0; SUMA_Boolean Domemtrace = YUP; SUMA_GENERIC_ARGV_PARSE *ps=NULL; SUMA_Boolean LocalHead = NOPE; SUMA_STANDALONE_INIT; SUMA_mainENTRY; SUMAg_CF->isGraphical = YUP; ps = SUMA_Parse_IO_Args(argc, argv, "-i;-t;-dset;-do;"); /* initialize Volume Parent and AfniHostName to nothing */ for (ispec=0; ispec < SUMA_MAX_N_GROUPS; ++ispec) { specfilename[ispec] = NULL; VolParName[ispec] = NULL; Specp[ispec] = NULL; InMem[ispec] = 0; } AfniHostName = NULL; /* Allocate space for DO structure */ SUMAg_DOv = SUMA_Alloc_DisplayObject_Struct (SUMA_MAX_DISPLAYABLE_OBJECTS); /* call the function to parse the other surface mode inputs */ ispec = 0; if (LocalHead) SUMA_Show_IO_args(ps); if (ps->i_N_surfnames || ps->t_N_surfnames || ps->N_DO) { SUMA_LH("-i and/or -t surfaces on command line!"); Specp[ispec] = SUMA_IO_args_2_spec (ps, &nspec); if (Specp[ispec]) { ++ispec; if (nspec != 1) { SUMA_S_Errv("-spec is being parsed separately here, " "expecting one spec only from SUMA_IO_args_2_spec, \n" "got %d\n", nspec); exit (1); } } else { SUMA_S_Err("Failed to load -i/-t surfaces"); exit(1); } } /* Work the options */ kar = 1; brk = NOPE; SurfIn = NOPE; Domemtrace = YUP; while (kar < argc) { /* loop accross command ine options */ /*fprintf(stdout, "%s verbose: Parsing command line...\n", FuncName);*/ if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { SUMA_usage (ps, strlen(argv[kar]) > 3 ? 2:1); exit (0); /* return a good status on -help 12 Jul 2013 [rickr] */ } /* -list_ports list and quit */ if( strncmp(argv[kar],"-list_ports", 8) == 0) { show_ports_list(); exit(0); } /* -port_number and quit */ if( strncmp(argv[kar],"-port_number", 8) == 0) { int pp = 0; if( ++kar >= argc ) ERROR_exit("need an argument after -port_number!"); pp = get_port_named(argv[kar]); if (strcmp(argv[kar-1], "-port_number_quiet")) { fprintf(stdout, "\nPort %s: %d\n", argv[kar], pp); } else { fprintf(stdout, "%d\n", pp); } if (pp < 1) exit(1); else exit(0); } if (strcmp(argv[kar], "-visuals") == 0) { SUMA_ShowAllVisuals (); exit (0); } if (strcmp(argv[kar], "-brethren_windows") == 0) { Display *dd=NULL; Window ww; if (!(dd = XOpenDisplay(NULL))) { SUMA_S_Err("No display "); exit(1); } ww = XDefaultRootWindow(dd); SUMA_WindowsOnRootDisplay(dd, ww , 0); exit (0); } if (strcmp(argv[kar], "-version") == 0) { s = SUMA_New_Additions (0.0, 1); fprintf (SUMA_STDOUT,"%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-sources") == 0) { s = SUMA_sources_Info(); fprintf (SUMA_STDOUT,"%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-help_nido") == 0) { s = SUMA_NIDO_Info(); fprintf (SUMA_STDOUT,"%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-all_latest_news") == 0) { s = SUMA_New_Additions (-1.0, 0); fprintf (SUMA_STDOUT,"%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-help_sphinx_interactive") == 0) { FILE *fout = NULL; if( ++kar >= argc ) ERROR_exit("need a file name after -help_sphinx_interactive!"); fout = fopen(argv[kar],"w"); if (!fout) { SUMA_S_Err("Failed to open %s for writing", argv[kar]); exit(1); } SUMA_help_message(fout,SPX); fclose(fout); fout = NULL; exit (0); } if (strcmp(argv[kar], "-help_interactive") == 0) { FILE *fout = fopen("Mouse_Keyboard_Controls.txt","w"); if (!fout) { SUMA_S_Err("Failed to open Mouse_Keyboard_Controls.txt for writing"); exit(1); } SUMA_help_message(fout,TXT); fclose(fout); fout = NULL; exit (0); } if (strcmp(argv[kar], "-test_help_string_edit") == 0) { SUMA_Sphinx_String_Edit_Help(SUMA_STDOUT, 0); exit(0); } if (strcmp(argv[kar], "-test_help_string_edit_web") == 0) { SUMA_Sphinx_String_Edit_Help(SUMA_STDOUT, 1); exit(0); } if (strcmp(argv[kar], "-environment") == 0) { s = SUMA_env_list_help (0, TXT); fprintf (SUMA_STDOUT, "#SUMA ENVIRONMENT \n" "# If you do not have a ~/.sumarc file, cannot find a SUMA\n" "# environment variable that's been mentioned in documentation,\n" "# or fervently desire to update your current ~/.sumarc with \n" "# all the latest variables that SUMA uses, you should run: \n" "# \n" "# suma -update_env\n" "# \n" "# Unless you have setup SUMA environment variables outside of\n" "# your ~/.sumarc file, updating your ~/.sumarc file with \n" "# 'suma -update_env' WILL NOT ALTER changes you have already\n" "# made to the variables in your current ~/.sumarc. \n" "# For this reason consider running the update command after each \n" "# upgrade of your AFNI/SUMA binaries.\n" "***ENVIRONMENT\n" "%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-default_env") == 0) { s = SUMA_env_list_help (1, NO_FORMAT); fprintf (SUMA_STDOUT, "#SUMA DEFAULT ENVIRONMENT (user settings ignored)\n" "# see also suma -udate_env or suma -environment\n" "# \n" "***ENVIRONMENT\n" "%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-update_env") == 0) { if (system("suma -environment > ___sumarc")) { SUMA_S_Err("Failed to create env file."); exit(1); } if (SUMA_filexists("~/.sumarc")) { if (system("\\cp -f ~/.sumarc ~/.sumarc-bak")) { SUMA_S_Err("Failed to backup ~/.sumarc to ~/.sumarc-bak."); exit(1); } } if (system("\\mv ___sumarc ~/.sumarc")) { SUMA_S_Err("Failed to copy newrc (___sumarc) to ~/.sumarc"); exit(1); } SUMA_S_Note("Environment update done."); exit(0); } if (strcmp(argv[kar], "-latest_news") == 0) { s = SUMA_New_Additions (0.0, 0); fprintf (SUMA_STDOUT,"%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-progs") == 0) { s = SUMA_All_Programs(); fprintf (SUMA_STDOUT,"%s\n", s); SUMA_free(s); s = NULL; exit (0); } if (strcmp(argv[kar], "-motif_ver") == 0) { /* 9 Mar 2009 [rickr] */ show_motif_version_string(); exit (0); } if (!brk && (strcmp(argv[kar], "-iodbg") == 0)) { fprintf(SUMA_STDERR,"Error %s: Obsolete, use -trace\n", FuncName); exit (0); /* fprintf(SUMA_STDOUT, "Warning %s: SUMA running in in/out debug mode.\n", FuncName); SUMA_INOUT_NOTIFY_ON; brk = YUP; */ } SUMA_SKIP_COMMON_OPTIONS(brk, kar); #if SUMA_MEMTRACE_FLAG if (!brk && (strcmp(argv[kar], "-memdbg") == 0)) { fprintf(SUMA_STDOUT,"Error %s: -memdbg is obsolete, use -trace\n", FuncName); exit (0); fprintf( SUMA_STDOUT, "Warning %s: SUMA running in memory trace mode.\n", FuncName); SUMAg_CF->MemTrace = YUP; #ifdef USING_MCW_MALLOC #endif brk = YUP; } #endif if (!brk && (strcmp(argv[kar], "-dev") == 0)) { fprintf(SUMA_STDOUT, "Warning %s: SUMA running in developer mode, " "some options may malfunction.\n", FuncName); SUMAg_CF->Dev = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-fake_cmap") == 0)) { SUMA_S_Warn("-fake_cmap is for automatic selfies of the widgets.\n" "You should not use this option for any other reason\n"); SUMAg_CF->Fake_Cmap = YUP; brk = YUP; } if (!brk && SUMAg_CF->Dev && (strcmp(argv[kar], "-truth_table") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need expression after -truth_table \n"); exit (1); } SUMA_bool_eval_truth_table(argv[kar], 0); exit(0); brk = YUP; } if (!brk && (strcmp(argv[kar], "-niml") == 0)) { Start_niml = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-noniml") == 0)) { Start_niml = -1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-vp") == 0 || strcmp(argv[kar], "-sa") == 0 || strcmp(argv[kar], "-sv") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -vp|-sa|-sv \n"); exit (1); } if (ispec < 1) { fprintf (SUMA_STDERR, "a -spec option must precede the first -sv option\n"); exit (1); } if (!specfilename[ispec-1] && !Specp[ispec-1]) { fprintf (SUMA_STDERR, "a -spec option must precede each -sv option\n"); exit (1); } VolParName[ispec-1] = argv[kar]; if (LocalHead) { fprintf(SUMA_STDOUT, "Found: %s\n", VolParName[ispec]); } brk = YUP; } if (!brk && strcmp(argv[kar], "-drive_com") == 0) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -drive_com\n"); exit (1); } SUMAg_CF->dcom = (char **)SUMA_realloc(SUMAg_CF->dcom, (SUMAg_CF->N_dcom+1)*sizeof(char *)); SUMAg_CF->dcom[SUMAg_CF->N_dcom] = SUMA_copy_string(argv[kar]); ++SUMAg_CF->N_dcom; brk = YUP; } if (!brk && strcmp(argv[kar], "-ah") == 0) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -ah\n"); exit (1); } if (strcmp(argv[kar],"localhost") != 0) { AfniHostName = argv[kar]; }else { fprintf (SUMA_STDERR, "localhost is the default for -ah\n" "No need to specify it.\n"); } /*fprintf(SUMA_STDOUT, "Found: %s\n", AfniHostName);*/ brk = YUP; } if (!brk && strcmp(argv[kar], "-spec") == 0) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -spec \n"); exit (1); } if (ispec >= SUMA_MAX_N_GROUPS) { fprintf (SUMA_STDERR, "Cannot accept more than %d spec files.\n", SUMA_MAX_N_GROUPS); exit(1); } if (SUMA_is_predefined_SO_name(argv[kar], NULL, &pdspec, &pdsv, NULL) == 3) { specfilename[ispec] = pdspec; pdspec = NULL; /* Memory leak! */ VolParName[ispec] = pdsv; pdsv = NULL; /* Memory leak! */ } else { specfilename[ispec] = argv[kar]; } if (LocalHead) { fprintf(SUMA_STDOUT, "Found: %s\n", specfilename[ispec]); } ++ispec; brk = YUP; } if (!brk && !ps->arg_checked[kar]) { if ( !strcmp(argv[kar], "-i") || !strncmp(argv[kar], "-i_",3) ) { fprintf (SUMA_STDERR, "Error %s: Option %s not understood. \n" " Make sure parameter after -i or -i_ is the full name of a surface.\n" "%s", FuncName, argv[kar], strlen(argv[kar])==2 ? "For -i to work, SUMA needs to guess at the surface type from\n" " the filename extensions. If SUMA fails try the full -i_* option" " instead.\n" : "" ); } else { fprintf (SUMA_STDERR, "Error %s: Option %s not understood. Try -help for usage\n", FuncName, argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); } exit (1); } else { brk = NOPE; kar ++; } }/* loop accross command ine options */ /* -ah option now checked for in ps */ if (ps->cs->afni_host_name && !AfniHostName) { AfniHostName = SUMA_copy_string(ps->cs->afni_host_name); } #if 0 SUMA_S_Note("KILL ME"); { int i,j, nl; SUMA_TextBoxSize("Hello", &i,&j,&nl,NULL); SUMA_TextBoxSize("", &i,&j,&nl,GLUT_BITMAP_8_BY_13); SUMA_TextBoxSize("O", &i,&j,&nl,GLUT_BITMAP_8_BY_13); SUMA_TextBoxSize(NULL, &i,&j,&nl,GLUT_BITMAP_8_BY_13); } SUMA_ReadNIDO("/Users/ziad/SUMA_test_dirs/DO/TextDO/sample.niml.do", NULL); exit(1); #endif /* Make surface loading pacifying */ SetLoadPacify(1); #if 0 if (ps->N_DO) { /* Have DOs on command line */ if (Specp[0]) { /* Add to Specp[0] */ if (ps->N_DO + Specp[0]->N_DO > SUMA_MAX_DO_SPEC) { SUMA_S_Warn("Too many DOs, increase static limit.."); /* ignore extras for now */ ps->N_DO = SUMA_MAX_DO_SPEC - Specp[0]->N_DO; } for (i=0; i<ps->N_DO; ++i) { strcpy(Specp[0]->DO_name[Specp[0]->N_DO], ps->DO_name[i]); Specp[0]->DO_type[Specp[0]->N_DO] = ps->DO_type[i]; ++Specp[0]->N_DO; } } else { Specp[0] } } #endif /* any Specp to be found ?*/ if (specfilename[0] == NULL && Specp[0] == NULL) { SUMA_SurfaceObject **SOv=NULL; int N_SOv = 0; fprintf (SUMA_STDERR, "\n" "%s: \n" " No input specified, loading some toy surfaces...\n" " Use '.' and ',' to cycle between them.\n" " See suma -help for assistance.\n" "\n", FuncName); /* create your own surface and put it in a spec file */ SOv = SUMA_GimmeSomeSOs(&N_SOv); Specp[ispec] = SUMA_SOGroup_2_Spec (SOv, N_SOv); SUMA_free(SOv); SOv = NULL; InMem[ispec] = 1; ++ispec; } if(!SUMA_Assign_HostName (SUMAg_CF, AfniHostName, -1)) { fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_Assign_HostName\n", FuncName); exit (1); } #ifdef SUMA_DISASTER /* a function to test Memtracing */ { int *jnk; jnk = SUMA_disaster(); SUMA_free(jnk); /* without the -trace, you'll get a warning here if jnk is corrupted */ } #endif /* create an Eye Axis DO */ EyeAxis = SUMA_Alloc_Axis ("Eye Axis", AO_type); if (EyeAxis == NULL) { SUMA_error_message (FuncName,"Error Creating Eye Axis",1); exit(1); } /* Store it into SUMAg_DOv */ if (!SUMA_AddDO( SUMAg_DOv, &SUMAg_N_DOv, (void *)EyeAxis, AO_type, SUMA_SCREEN)) { SUMA_error_message (FuncName,"Error Adding DO", 1); exit(1); } /*fprintf (SUMA_STDERR, "SUMAg_N_DOv = %d created\n", SUMAg_N_DOv); SUMA_Show_DOv(SUMAg_DOv, SUMAg_N_DOv, NULL);*/ /* Allocate space (and initialize) Surface Viewer Structure */ SUMAg_SVv = SUMA_Alloc_SurfaceViewer_Struct (SUMA_MAX_SURF_VIEWERS); /* SUMAg_N_SVv gets updated in SUMA_X_SurfaceViewer_Create and reflects not the number of elements in SUMAg_SVv which is SUMA_MAX_SURF_VIEWERS, but the number of viewers that were realized by X */ /* Check on initialization */ /*SUMA_Show_SurfaceViewer_Struct (SUMAg_cSV, stdout);*/ /* Create the Surface Viewer Window */ if (!SUMA_X_SurfaceViewer_Create ()) { fprintf(stderr,"Error in SUMA_X_SurfaceViewer_Create. Exiting\n"); return 1; } for (i=0; i<ispec; ++i) { if (!list) list = SUMA_CreateList(); ED = SUMA_InitializeEngineListData (SE_Load_Group); if (!( Element = SUMA_RegisterEngineListCommand ( list, ED, SEF_cp, (void *)specfilename[i], SES_Suma, NULL, NOPE, SEI_Head, NULL ))) { fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName); exit (1); } if (!( Element = SUMA_RegisterEngineListCommand ( list, ED, SEF_ip, (void *)Specp[i], SES_Suma, NULL, NOPE, SEI_In, Element ))) { fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName); exit (1); } fff = (float) InMem[i]; if (!( Element = SUMA_RegisterEngineListCommand ( list, ED, SEF_f, (void *)&fff, SES_Suma, NULL, NOPE, SEI_In, Element ))) { fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName); exit (1); } if (!( Element = SUMA_RegisterEngineListCommand ( list, ED, SEF_vp, (void *)VolParName[i], SES_Suma, NULL, NOPE, SEI_In, Element ))) { fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName); exit (1); } N_iv15 = SUMA_MAX_SURF_VIEWERS; if (N_iv15 > 15) { fprintf( SUMA_STDERR, "Error %s: trying to register more than 15 viewers!\n", FuncName); exit(1); } for (kar=0; kar<N_iv15; ++kar) iv15[kar] = kar; if (!( Element = SUMA_RegisterEngineListCommand ( list, ED, SEF_iv15, (void *)iv15, SES_Suma, NULL, NOPE, SEI_In, Element ))) { fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName); exit (1); } if (!( Element = SUMA_RegisterEngineListCommand ( list, ED, SEF_i, (void *)&N_iv15, SES_Suma, NULL, NOPE, SEI_In, Element ))) { fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName); exit (1); } } if (ispec > 0 && !SUMA_Engine (&list)) { fprintf(SUMA_STDERR,"Error %s: Failed in SUMA_Engine\n", FuncName); exit (1); } /* For some reason, I had to add the glLightfv line below to force the lightflipping done in SUMA_SetupSVforDOs to take place in the A viewer when first opened. I don't know why that is, especially since other controllers would show up lit correctly without this glLightfv line below. To make matters worse, the A controller's light0_position is correctly flipped. It is just that the shading is done as if the position was never flipped. Actually, without the line below, the first time you hit the F key (to manually flip the light), nothing changes, that's because the light's position is unflipped, which is supposed to show the incorrect lighting. You'll have to hit F again to have the lighting correctly flipped and the shading reflecting it.... ZSS, Aug. 05 04 */ glLightfv(GL_LIGHT0, GL_POSITION, SUMAg_SVv[0].light0_position); if (Start_niml != -1 && (Start_niml == 1|| AFNI_yesenv("SUMA_START_NIML"))) { if (!list) list = SUMA_CreateList(); SUMA_REGISTER_HEAD_COMMAND_NO_DATA( list, SE_StartListening, SES_Suma, NULL); if (!SUMA_Engine (&list)) { fprintf(SUMA_STDERR, "Error %s: SUMA_Engine call failed.\n", FuncName); exit (1); } } /* load the datasets onto the first SO, if any, else hope that dset is some form of DO */ if (ps->N_dsetname>0) { SUMA_SurfaceObject *SO = SUMA_findanySOp_inDOv(SUMAg_DOv, SUMAg_N_DOv, NULL); if (!SO) { SUMA_LH("Could not find any SO, here is hoping dset is a DO"); } for (i=0; i<ps->N_dsetname; ++i) { if (!(SUMA_LoadDsetOntoSO_eng(ps->dsetname[i], SO, 1, 1, 1, NULL))) { SUMA_S_Errv("Failed to load %s onto %s\n", ps->dsetname[i], SO?SO->Label:"NULL"); } } } SUMA_FreeGenericArgParse(ps); ps = NULL; /* A Warning about no sumarc */ if (NoSumaRcFound()) { SUMA_S_Warn( "\n" " No sumarc file found. You should create one by running the following:\n" "\n" " suma -update_env\n" "\n" " I also recommend you run 'suma -update_env' whenever you update AFNI.\n" "\n" " See details for -environment and -update_env options in suma -help's output.\n" "\n"); } /*Main loop */ XtAppMainLoop(SUMAg_CF->X->App); /* Done, clean up time */ if (ispec) { int k=0; for (k=0; k<ispec; ++k) { if (!SUMA_FreeSpecFields((Specp[k]))) { SUMA_S_Err("Failed to free spec fields"); } Specp[k] = NULL; } } ispec = 0; if (!SUMA_Free_Displayable_Object_Vect (SUMAg_DOv, SUMAg_N_DOv)) SUMA_error_message(FuncName,"DO Cleanup Failed!",1); if (!SUMA_Free_SurfaceViewer_Struct_Vect (SUMAg_SVv, SUMA_MAX_SURF_VIEWERS)) SUMA_error_message(FuncName,"SUMAg_SVv Cleanup Failed!",1); if (!SUMA_Free_CommonFields(SUMAg_CF)) SUMA_error_message(FuncName,"SUMAg_CF Cleanup Failed!",1); SUMA_RETURN(0); /* ANSI C requires main to return int. */ }/* Main */
int main( int argc , char *argv[] ) { THD_3dim_dataset *dset=NULL; int iarg , verbose = -1 ; char *outbuf, *stmp=NULL; char *labelName = NULL; char *sbdelim = {"|"}; char *NAflag = {"NA"}; char *atrdelim = {"\t"}, *form=NULL; INFO_FIELDS sing[512]; int iis=0, N_sing = 0, isb=0, withhead = 0, itmp=0; int ip=0, needpair = 0, namelen=0, monog_pairs = 0; THD_3dim_dataset *tttdset=NULL, *dsetp=NULL; char *tempstr = NULL; int extinit = 0; float RL_AP_IS[6]; mainENTRY("3dinfo main") ; machdep() ; if( argc < 2) { Syntax(TXT,1) ; RETURN(0); } iarg = 1 ; while (iarg < argc && argv[iarg][0] == '-') { CHECK_HELP(argv[iarg],Syntax); if( strncmp(argv[iarg],"-verb" ,5) == 0 ){ verbose = 0; iarg++; continue; } else if( strncmp(argv[iarg],"-VERB" ,5) == 0 ){ verbose = 1; iarg++; continue; } else if( strncmp(argv[iarg],"-short",5) == 0 ){ verbose = -1; iarg++; continue; } else if( strcasecmp(argv[iarg],"-header_line") == 0 || strcasecmp(argv[iarg],"-hdr") == 0 ){ withhead = 1; iarg++; continue; } else if( strcasecmp(argv[iarg],"-monog_pairs") == 0 ){ monog_pairs = 1; iarg++; continue; } else if ( strncmp(argv[iarg],"-label2",7) == 0 ) { iarg++; if (iarg >= argc) ERROR_exit( "3dinfo needs an argument after -label2number\n"); labelName = malloc(sizeof(char) * 2048); strcpy(labelName, argv[iarg]); iarg++; continue; } else if( strcasecmp(argv[iarg],"-sb_delim") == 0) { iarg++; if (iarg >= argc) ERROR_exit( "3dinfo needs a string after -sb_delim\n"); sbdelim = argv[iarg]; iarg++; continue; } else if( strcasecmp(argv[iarg],"-NA_flag") == 0) { iarg++; if (iarg >= argc) ERROR_exit( "3dinfo needs a string after -NA_flag\n"); NAflag = argv[iarg]; iarg++; continue; } else if( strcasecmp(argv[iarg],"-atr_delim") == 0) { iarg++; if (iarg >= argc) ERROR_exit( "3dinfo needs a string after -atr_delim\n"); atrdelim = argv[iarg]; iarg++; continue; } else if( strcasecmp(argv[iarg],"-space") == 0) { sing[N_sing++] = DSET_SPACE; iarg++; continue; } else if( strcasecmp(argv[iarg],"-av_space") == 0) { sing[N_sing++] = AV_DSET_SPACE; iarg++; continue; } else if( strcasecmp(argv[iarg],"-gen_space") == 0) { sing[N_sing++] = DSET_GEN_SPACE; iarg++; continue; } else if( strcasecmp(argv[iarg],"-is_nifti") == 0) { sing[N_sing++] = IS_NIFTI; iarg++; continue; } else if( strcasecmp(argv[iarg],"-is_atlas") == 0) { sing[N_sing++] = IS_ATLAS; iarg++; continue; } else if( strcasecmp(argv[iarg],"-exists") == 0) { sing[N_sing++] = DSET_EXISTS; iarg++; continue; } else if( strcasecmp(argv[iarg],"-is_oblique") == 0) { sing[N_sing++] = IS_OBLIQUE; iarg++; continue; } else if( strcasecmp(argv[iarg],"-obliquity") == 0) { sing[N_sing++] = OBLIQUITY; iarg++; continue; } else if( strcasecmp(argv[iarg],"-handedness") == 0) { sing[N_sing++] = HANDEDNESS; iarg++; continue; } else if( strcasecmp(argv[iarg],"-prefix") == 0) { sing[N_sing++] = PREFIX; iarg++; continue; } else if( strcasecmp(argv[iarg],"-prefix_noext") == 0) { sing[N_sing++] = PREFIX_NOEXT; iarg++; continue; } else if( strcasecmp(argv[iarg],"-ni") == 0) { sing[N_sing++] = NI; iarg++; continue; } else if( strcasecmp(argv[iarg],"-nj") == 0) { sing[N_sing++] = NJ; iarg++; continue; } else if( strcasecmp(argv[iarg],"-nk") == 0) { sing[N_sing++] = NK; iarg++; continue; } else if( strcasecmp(argv[iarg],"-n4") == 0) { sing[N_sing++] = NI; sing[N_sing++] = NJ; sing[N_sing++] = NK; sing[N_sing++] = NV; iarg++; continue; } else if( strcasecmp(argv[iarg],"-Rextent") == 0) { sing[N_sing++] = EXTENT_R; iarg++; continue; } else if( strcasecmp(argv[iarg],"-Lextent") == 0) { sing[N_sing++] = EXTENT_L; iarg++; continue; } else if( strcasecmp(argv[iarg],"-Aextent") == 0) { sing[N_sing++] = EXTENT_A; iarg++; continue; } else if( strcasecmp(argv[iarg],"-Pextent") == 0) { sing[N_sing++] = EXTENT_P; iarg++; continue; } else if( strcasecmp(argv[iarg],"-Iextent") == 0) { sing[N_sing++] = EXTENT_I; iarg++; continue; } else if( strcasecmp(argv[iarg],"-Sextent") == 0) { sing[N_sing++] = EXTENT_S; iarg++; continue; } else if( strcasecmp(argv[iarg],"-extent") == 0) { sing[N_sing++] = EXTENT_R; sing[N_sing++] = EXTENT_L; sing[N_sing++] = EXTENT_A; sing[N_sing++] = EXTENT_P; sing[N_sing++] = EXTENT_I; sing[N_sing++] = EXTENT_S; iarg++; continue; } else if( strcasecmp(argv[iarg],"-di") == 0) { sing[N_sing++] = DI; iarg++; continue; } else if( strcasecmp(argv[iarg],"-dj") == 0) { sing[N_sing++] = DJ; iarg++; continue; } else if( strcasecmp(argv[iarg],"-dk") == 0) { sing[N_sing++] = DK; iarg++; continue; } else if( strcasecmp(argv[iarg],"-d3") == 0) { sing[N_sing++] = DI; sing[N_sing++] = DJ; sing[N_sing++] = DK; iarg++; continue; } else if( strcasecmp(argv[iarg],"-adi") == 0) { sing[N_sing++] = ADI; iarg++; continue; } else if( strcasecmp(argv[iarg],"-adj") == 0) { sing[N_sing++] = ADJ; iarg++; continue; } else if( strcasecmp(argv[iarg],"-adk") == 0) { sing[N_sing++] = ADK; iarg++; continue; } else if( strcasecmp(argv[iarg],"-ad3") == 0) { sing[N_sing++] = ADI; sing[N_sing++] = ADJ; sing[N_sing++] = ADK; iarg++; continue; } else if( strcasecmp(argv[iarg],"-voxvol") == 0) { sing[N_sing++] = VOXVOL; iarg++; continue; } else if( strcasecmp(argv[iarg],"-iname") == 0) { sing[N_sing++] = INAME; iarg++; continue; } else if( strcasecmp(argv[iarg],"-oi") == 0) { sing[N_sing++] = OI; iarg++; continue; } else if( strcasecmp(argv[iarg],"-oj") == 0) { sing[N_sing++] = OJ; iarg++; continue; } else if( strcasecmp(argv[iarg],"-ok") == 0) { sing[N_sing++] = OK; iarg++; continue; } else if( strcasecmp(argv[iarg],"-o3") == 0) { sing[N_sing++] = OI; sing[N_sing++] = OJ; sing[N_sing++] = OK; iarg++; continue; }else if( strcasecmp(argv[iarg],"-nt") == 0) { sing[N_sing++] = NT; iarg++; continue; } else if( strcasecmp(argv[iarg],"-nti") == 0) { sing[N_sing++] = NTI; iarg++; continue; } else if( strcasecmp(argv[iarg],"-nv") == 0) { sing[N_sing++] = NV; iarg++; continue; } else if( strcasecmp(argv[iarg],"-nvi") == 0) { sing[N_sing++] = NVI; iarg++; continue; } else if( strcasecmp(argv[iarg],"-ntimes") == 0) { sing[N_sing++] = NTIMES; iarg++; continue; } else if( strcasecmp(argv[iarg],"-max_node") == 0) { sing[N_sing++] = MAX_NODE; iarg++; continue; } else if( strcasecmp(argv[iarg],"-nijk") == 0) { sing[N_sing++] = NIJK; iarg++; continue; } else if( strcasecmp(argv[iarg],"-labeltable") == 0) { sing[N_sing++] = LTABLE; iarg++; continue; } else if( strcasecmp(argv[iarg],"-labeltable_as_atlas_points") == 0) { sing[N_sing++] = LTABLE_AS_ATLAS_POINT_LIST; iarg++; continue; } else if( strcasecmp(argv[iarg],"-atlas_points") == 0) { sing[N_sing++] = ATLAS_POINTS; iarg++; continue; } else if( strcasecmp(argv[iarg],"-fac") == 0) { sing[N_sing++] = FAC; iarg++; continue; } else if( strcasecmp(argv[iarg],"-datum") == 0) { sing[N_sing++] = DATUM; iarg++; continue; } else if( strcasecmp(argv[iarg],"-label") == 0) { sing[N_sing++] = LABEL; iarg++; continue; } else if( strcasecmp(argv[iarg],"-min") == 0) { sing[N_sing++] = MIN; iarg++; continue; } else if( strcasecmp(argv[iarg],"-max") == 0) { sing[N_sing++] = MAX; iarg++; continue; } else if( strcasecmp(argv[iarg],"-minus") == 0) { sing[N_sing++] = MINUS; iarg++; continue; } else if( strcasecmp(argv[iarg],"-maxus") == 0) { sing[N_sing++] = MAXUS; iarg++; continue; } else if( strcasecmp(argv[iarg],"-dmin") == 0) { sing[N_sing++] = DMIN; iarg++; continue; } else if( strcasecmp(argv[iarg],"-dmax") == 0) { sing[N_sing++] = DMAX; iarg++; continue; } else if( strcasecmp(argv[iarg],"-dminus") == 0) { sing[N_sing++] = DMINUS; iarg++; continue; } else if( strcasecmp(argv[iarg],"-dmaxus") == 0) { sing[N_sing++] = DMAXUS; iarg++; continue; } else if( strcasecmp(argv[iarg],"-TR") == 0) { sing[N_sing++] = TR; iarg++; continue; } else if( strcasecmp(argv[iarg],"-header_name") == 0) { sing[N_sing++] = HEADER_NAME; iarg++; continue; } else if( strcasecmp(argv[iarg],"-brick_name") == 0) { sing[N_sing++] = BRICK_NAME; iarg++; continue; } else if( strcasecmp(argv[iarg],"-history") == 0) { sing[N_sing++] = HISTORY; iarg++; continue; } else if( strcasecmp(argv[iarg],"-all_names") == 0) { sing[N_sing++] = ALL_NAMES; iarg++; continue; } else if( strcasecmp(argv[iarg],"-orient") == 0) { sing[N_sing++] = ORIENT; iarg++; continue; } else if( strcasecmp(argv[iarg],"-same_grid") == 0) { sing[N_sing++] = SAME_GRID; needpair = 1; iarg++; continue; } else if( strcasecmp(argv[iarg],"-same_dim") == 0) { sing[N_sing++] = SAME_DIM; needpair = 1; iarg++; continue; } else if( strcasecmp(argv[iarg],"-same_delta") == 0) { sing[N_sing++] = SAME_DELTA; needpair = 1; iarg++; continue; } else if( strcasecmp(argv[iarg],"-same_orient") == 0) { sing[N_sing++] = SAME_ORIENT; needpair = 1; iarg++; continue; } else if( strcasecmp(argv[iarg],"-same_center") == 0) { sing[N_sing++] = SAME_CENTER; needpair = 1; iarg++; continue; } else if( strcasecmp(argv[iarg],"-same_obl") == 0) { sing[N_sing++] = SAME_OBL; needpair = 1; iarg++; continue; } else if( strcasecmp(argv[iarg],"-slice_timing") == 0) { sing[N_sing++] = SLICE_TIMING; iarg++; continue; } else if( strcasecmp(argv[iarg],"-sval_diff") == 0) { sing[N_sing++] = SVAL_DIFF; needpair = 1; iarg++; continue; } else if( strcasecmp(argv[iarg],"-val_diff") == 0) { sing[N_sing++] = VAL_DIFF; needpair = 1; iarg++; continue; } else if( strcasecmp(argv[iarg],"-same_all_grid") == 0) { sing[N_sing++] = SAME_DIM; sing[N_sing++] = SAME_DELTA; sing[N_sing++] = SAME_ORIENT; sing[N_sing++] = SAME_CENTER; sing[N_sing++] = SAME_OBL; needpair = 1; iarg++; continue; } else if( strcasecmp(argv[iarg],"-id") == 0) { sing[N_sing++] = ID; iarg++; continue; } else if( strcasecmp(argv[iarg],"-smode") == 0) { sing[N_sing++] = SMODE; iarg++; continue; } else { ERROR_message("Option %s unknown", argv[iarg]); suggest_best_prog_option(argv[0], argv[iarg]); exit(1); } } if (N_sing == 0) { sing[N_sing++] = CLASSIC; } if (sing[iis] == CLASSIC) PRINT_VERSION("3dinfo") ; THD_allow_empty_dataset(1) ; /* 21 Mar 2007 */ if (iarg == argc) { ERROR_message("No dsets on command line? I have nothing to do.\n"); exit(1); } if (needpair && monog_pairs) needpair = 2; /* pair each couple separately */ if (needpair==2 && (argc-iarg) % 2) { ERROR_message("Using options requiring dset pairs but have odd number\n" "of dsets (%d) on command line.\n", (argc-iarg)); exit (1); } else if (needpair==1 && (argc-iarg) < 2) { ERROR_message("Using options requiring dset pairs but have less than\n" "two dsets (%d) on command line.\n", (argc-iarg)); exit (1); } ip = 0; for( ; iarg < argc ; iarg++ ){ if (ip == 0) { int kkk, nml; char *etr; namelen = 0; for (kkk=iarg; kkk<argc; ++kkk) { if ((etr = THD_trailname(argv[kkk],0))) { nml=strlen(etr); if (nml < 48 && nml > namelen) namelen = nml; } } if (namelen < 6) namelen = 6; if (withhead) { int havenew=0; for (iis = 0; iis < N_sing; ++iis) { if (sing[iis] != CLASSIC) { ++havenew; form = PrintForm(sing[iis], namelen, 1); /*fprintf(stderr,"ZSS: %d %s >%s<\n", sing[iis], Field_Names[sing[iis]], form);*/ fprintf(stdout, form, Field_Names[sing[iis]]); } if (havenew) { if (N_sing > 1 && iis < N_sing-1) fprintf(stdout,"%s",atrdelim); else fprintf(stdout,"\n"); } } } } if( argv[iarg][0] == '\0' ) continue ; /* bad filename */ set_obliquity_report(0); /* silence obliquity */ if (!needpair) { if (!(dset = load_3dinfo_dataset(argv[iarg]))) { /* exit(1); */ } } else { if (needpair == 2) { /* Crazy idea of comparing each pair separately */ if (ip % 2 == 0) { if (!(dset = load_3dinfo_dataset(argv[iarg] ))) { /* exit(1); */ } if (iarg+1==argc || argv[iarg+1][0] == '\0') { ERROR_message("Bad dset pair for %s\n", argv[iarg]); exit(1); } if (!(dsetp = load_3dinfo_dataset(argv[iarg+1] ))) { /* exit(1); */ } } else { /* swap the pair - this allows non pair requiring functions to work as before.*/ tttdset = dsetp; dsetp = dset; dset = tttdset; tttdset=NULL; } } else { /* always compare to very first dset */ if (ip==0) { if (!(dset = load_3dinfo_dataset(argv[iarg] ))) { /*exit(1);*/ } if (!(dsetp = load_3dinfo_dataset(argv[iarg+1] ))) { /*exit(1);*/ } } else if (ip==1) { /* switch order of first two */ tttdset = dsetp; dsetp = dset; /* now dsetp is the very first dset */ dset = tttdset; tttdset=NULL; } else { /* pair with very first, which is dsetp */ if (!(dset = load_3dinfo_dataset(argv[iarg] ))) { /*exit(1);*/ } } } } ++ip; if (0 && !dset) { /* allow for DSET_EXISTS option */ ERROR_exit("Should not get here"); } /* we should re-capture this per dataset 5 Feb 2019 [rickr] */ extinit = 0; for (iis = 0; iis < N_sing; ++iis) { if (!dset) { if (sing[iis] == CLASSIC) { if( dset == NULL ){ /* still not open? */ ERROR_exit("Can't open dataset %s\n", argv[iarg]) ; } } else if (sing[iis] != DSET_EXISTS && sing[iis] != INAME) { fprintf(stdout, "NO-DSET"); SPIT_DELIM(iis, N_sing, atrdelim); continue; } } switch (sing[iis]) { case CLASSIC: if (labelName == NULL ) /*** get and output info ***/ { outbuf = THD_dataset_info( dset , verbose ) ; if( outbuf != NULL ){ printf("\n") ; puts(outbuf) ; free(outbuf) ; outbuf = NULL ; } else { ERROR_exit("Can't get info for dataset %s",argv[iarg]) ; } } else /*** get and output label ***/ { int nval_per = dset->dblk->nvals; int foundLabel = 0; int ival=0; for (ival=0 ; ival < nval_per && !foundLabel; ival++ ) { if (strcmp(DSET_BRICK_LAB(dset,ival), labelName) == 0) { printf("%d\n", ival); foundLabel = 1; } } /* end of for (ival=0 ; ival < nval_per ; ival++ ) */ if (!foundLabel) printf("\n"); } THD_delete_3dim_dataset( dset , False ) ; free(labelName); break; case DSET_EXISTS: fprintf(stdout, "%d", dset ? 1:0); break; case DSET_SPACE: tempstr = THD_get_space(dset); if(tempstr==NULL) fprintf(stdout, "-----"); else fprintf(stdout, "%s", tempstr); break; case DSET_GEN_SPACE: tempstr = THD_get_generic_space(dset); if(tempstr==NULL) fprintf(stdout, "-----"); else fprintf(stdout, "%s", tempstr); break; case AV_DSET_SPACE: /* don't allow anything but the three AFNI views */ tempstr = THD_get_view_space(dset); if(tempstr==NULL) fprintf(stdout, "+orig"); else if (!strncasecmp(tempstr,"ORIG",4)) fprintf(stdout, "+orig"); else if (!strncasecmp(tempstr,"ACPC",4)) fprintf(stdout, "+acpc"); else if (!strncasecmp(tempstr,"TLRC",4)) fprintf(stdout, "+tlrc"); else /* shouldn't get here */ fprintf(stdout, "+orig"); break; case IS_NIFTI: if ( dset->dblk->diskptr && dset->dblk->diskptr->storage_mode == STORAGE_BY_NIFTI ) { fprintf(stdout,"1"); } else { fprintf(stdout,"0"); } break; case IS_ATLAS: if ( is_Dset_Atlasy(dset, NULL) ) { fprintf(stdout,"1"); } else { fprintf(stdout,"0"); } break; case IS_OBLIQUE: if (dset_obliquity(dset,NULL) > 0) { fprintf(stdout,"1"); } else { fprintf(stdout,"0"); } break; case HANDEDNESS: if (THD_handedness(dset) > 0) { fprintf(stdout,"R"); } else { fprintf(stdout,"L"); } break; case OBLIQUITY: fprintf(stdout,"%.3f", THD_compute_oblique_angle(dset->daxes->ijk_to_dicom_real, 0)); break; case PREFIX: form = PrintForm(sing[iis], namelen, 1); fprintf(stdout,form, DSET_PREFIX(dset)); break; case PREFIX_NOEXT: { form = PrintForm(sing[iis], namelen, 1); stmp=DSET_prefix_noext(dset); fprintf(stdout,form, stmp); free(stmp); stmp=NULL; } break; case HEADER_NAME: fprintf(stdout,"%s", dset->dblk->diskptr->header_name); break; case BRICK_NAME: fprintf(stdout,"%s", dset->dblk->diskptr->brick_name); break; case ALL_NAMES: THD_show_dataset_names(dset, "FOR_3DINFO", stdout); break; case HISTORY: stmp = tross_Get_History(dset); fprintf(stdout,"%s", stmp ? stmp:NAflag); if (stmp) free(stmp); stmp=NULL; break; case NI: fprintf(stdout,"%d", DSET_NX(dset)); break; case NJ: fprintf(stdout,"%d", DSET_NY(dset)); break; case NK: fprintf(stdout,"%d", DSET_NZ(dset)); break; case NIJK: fprintf(stdout,"%d", DSET_NVOX(dset)); break; case NTIMES: fprintf(stdout,"%d", DSET_NUM_TIMES(dset)); break; case MAX_NODE: DSET_MAX_NODE(dset,itmp); fprintf(stdout,"%d", itmp); break; case NT: case NV: fprintf(stdout,"%d", DSET_NVALS(dset)); break; case NTI: case NVI: fprintf(stdout,"%d", DSET_NVALS(dset)-1); break; case DI: fprintf(stdout,"%f", DSET_DX(dset)); break; case DJ: fprintf(stdout,"%f", DSET_DY(dset)); break; case DK: fprintf(stdout,"%f", DSET_DZ(dset)); break; case OI: fprintf(stdout,"%f", DSET_XORG(dset)); break; case OJ: fprintf(stdout,"%f", DSET_YORG(dset)); break; case OK: fprintf(stdout,"%f", DSET_ZORG(dset)); break; case ADI: fprintf(stdout,"%f", fabs(DSET_DX(dset))); break; case EXTENT_R: case EXTENT_L: case EXTENT_A: case EXTENT_P: case EXTENT_I: case EXTENT_S: { if (!extinit) { THD_dset_extent(dset, '-', RL_AP_IS); extinit = 1; } fprintf(stdout,"%f", RL_AP_IS[sing[iis]-EXTENT_R]); } break; case ADJ: fprintf(stdout,"%f", fabs(DSET_DY(dset))); break; case ADK: fprintf(stdout,"%f", fabs(DSET_DZ(dset))); break; case VOXVOL: fprintf(stdout,"%f", fabs(DSET_DX(dset))* fabs(DSET_DY(dset))*fabs(DSET_DZ(dset))); break; case INAME: fprintf(stdout,"%s", argv[iarg]); break; case LTABLE: { char *str; if ((str = Dtable_to_nimlstring(DSET_Label_Dtable(dset), "VALUE_LABEL_DTABLE"))) { fprintf(stdout,"%s", str); free(str); } else { fprintf(stdout,"NO_LABEL_TABLE"); } } break; case LTABLE_AS_ATLAS_POINT_LIST: { ATLAS_POINT_LIST *apl=NULL; if ((apl = label_table_to_atlas_point_list(DSET_Label_Dtable(dset)))) { atlas_list_to_niml(apl,NULL); free_atlas_point_list(apl); } else { fprintf(stdout,"NO_LABEL_TABLE"); } } break; case ATLAS_POINTS: { ATR_string *atr = THD_find_string_atr( dset->dblk, "ATLAS_LABEL_TABLE"); if (atr) { fprintf(stdout,"%s", atr->ch); } else { fprintf(stdout,"NO_APL"); } } break; case FAC: { for (isb=0; isb<DSET_NVALS(dset); ++isb) { fprintf(stdout,"%f%s", DSET_BRICK_FACTOR(dset,isb), (isb == (DSET_NVALS(dset)-1)) ? "" : sbdelim); } break; } case DATUM: { for (isb=0; isb<DSET_NVALS(dset); ++isb) { fprintf(stdout,"%s%s", MRI_TYPE_name[DSET_BRICK_TYPE(dset,isb)], (isb == (DSET_NVALS(dset)-1)) ? "" : sbdelim); } break; } case LABEL: { for (isb=0; isb<DSET_NVALS(dset); ++isb) { fprintf(stdout,"%s%s", DSET_BRICK_LABEL(dset,isb) ? DSET_BRICK_LABEL(dset,isb):NAflag, (isb == (DSET_NVALS(dset)-1)) ? "" : sbdelim); } break; } case MIN: case MINUS: case MAX: case MAXUS: { float vv=0.0, min, max; for (isb=0; isb<DSET_NVALS(dset); ++isb) { if (!THD_subbrick_minmax(dset, isb, (sing[iis] == MINUS || sing[iis] == MAXUS) ? 0:1, &min, &max)) { fprintf(stdout,"%s%s", NAflag, (isb == (DSET_NVALS(dset)-1)) ? "" : sbdelim); } else { if (sing[iis] == MINUS) vv = min; else if (sing[iis] == MAXUS) vv = max; else if (sing[iis] == MIN) vv = min; else if (sing[iis] == MAX) vv = max; fprintf(stdout,"%g%s", vv, (isb == (DSET_NVALS(dset)-1)) ? "" : sbdelim); } } break; } case DMIN: case DMINUS: case DMAX: case DMAXUS: { float vv=0.0, min, max; if (!THD_dset_minmax(dset, (sing[iis] == DMINUS || sing[iis] == DMAXUS) ? 0:1, &min, &max)) { fprintf(stdout,"%s%s", NAflag, (isb == (DSET_NVALS(dset)-1)) ? "" : sbdelim); } else { if (sing[iis] == DMINUS) vv = min; else if (sing[iis] == DMAXUS) vv = max; else if (sing[iis] == DMIN) vv = min; else if (sing[iis] == DMAX) vv = max; fprintf(stdout,"%g%s", vv, (isb == (DSET_NVALS(dset)-1)) ? "" : sbdelim); } break; } case TR: #if 0 fprintf(stdout,"%f", DSET_TR_SEC(dset)); #else fprintf(stdout,"%f", DSET_TR(dset)); #endif break; case ORIENT: { /* fprintf(stdout,"%c%c%c", * ORIENT_typestr[dset->daxes->xxorient][0], ... ); */ char ostr[4]; /* just to show 23 Jan 2013 [rickr] */ THD_fill_orient_str_3(dset->daxes, ostr); fprintf(stdout,"%3s", ostr); } break; case SAME_GRID: fprintf(stdout,"%d", !THD_dataset_mismatch( dset , dsetp )); break; case SAME_DIM: fprintf(stdout,"%d", !(THD_dataset_mismatch( dset , dsetp ) & MISMATCH_DIMEN)); break; case SAME_DELTA: fprintf(stdout,"%d", !(THD_dataset_mismatch( dset , dsetp ) & MISMATCH_DELTA)); break; case SAME_ORIENT: fprintf(stdout,"%d", !(THD_dataset_mismatch( dset , dsetp ) & MISMATCH_ORIENT)); break; case SAME_CENTER: fprintf(stdout,"%d", !(THD_dataset_mismatch( dset , dsetp ) & MISMATCH_CENTER)); break; case SAME_OBL: fprintf(stdout,"%d", !(THD_dataset_mismatch( dset , dsetp ) & MISMATCH_OBLIQ)); break; case SLICE_TIMING: /* 6 May 2013 [rickr] */ { if( DSET_HAS_SLICE_TIMING(dset) ) { DSET_UNMSEC(dset); /* make sure times are in seconds */ for (isb=0; isb<dset->taxis->nsl; ++isb) { fprintf(stdout,"%s%f", (isb > 0) ? sbdelim : "", dset->taxis->toff_sl[isb]); } } else { /* all slices times are at t=0.0 */ for (isb=0; isb<DSET_NZ(dset); ++isb) { fprintf(stdout,"%s%f", (isb > 0) ? sbdelim : "", 0.0); } } } break; case SVAL_DIFF: fprintf(stdout,"%f",THD_diff_vol_vals(dset, dsetp, 1)); break; case VAL_DIFF: fprintf(stdout,"%f",THD_diff_vol_vals(dset, dsetp, 0)); break; case ID: fprintf(stdout,"%s", DSET_IDCODE_STR(dset)); break; case SMODE: fprintf(stdout,"%s", DSET_STORAGE_MODE_STR(dset)); break; default: ERROR_message("Info field not set properly (%d)\n", sing[iis]); exit(1); } if (sing[iis] != CLASSIC) { SPIT_DELIM(iis, N_sing, atrdelim); } } } exit(0) ; }
int main( int argc , char * argv[] ) { THD_3dim_dataset *mask_dset=NULL, *iset=NULL, *sset=NULL, *xset=NULL, *vset=NULL; char *prefix="toy"; int iarg=1 , mcount, udatum = MRI_float; byte *maskvox=NULL; mainENTRY("3dToyProg main"); machdep(); AFNI_logger("3dToyProg",argc,argv); #ifdef USING_MCW_MALLOC enable_mcw_malloc() ; #endif /*-- options --*/ set_obliquity_report(0); /* silence obliquity */ while( iarg < argc && argv[iarg][0] == '-' ){ CHECK_HELP(argv[iarg], help_3dToyProg); if( strncmp(argv[iarg],"-mask",5) == 0 ){ if (iarg >= argc) ERROR_exit("Need dset after -mask"); mask_dset = THD_open_dataset( argv[++iarg] ) ; if( mask_dset == NULL ) ERROR_exit("Cannot open mask dataset!\n") ; if( DSET_BRICK_TYPE(mask_dset,0) == MRI_complex ) ERROR_exit("Cannot deal with complex-valued mask dataset!\n"); iarg++ ; continue ; } if( strcmp(argv[iarg],"-input") == 0) { if (iarg >= argc) ERROR_exit("Need dset after -mask"); if (!(iset = THD_open_dataset( argv[++iarg]))) { ERROR_exit("Cannot open input dataset %s!\n", argv[iarg]) ; } DSET_mallocize(iset); DSET_load(iset); /* load data part of dataset */ iarg++ ; continue ; } if( strncmp(argv[iarg],"-prefix",6) == 0) { if (iarg >= argc) ERROR_exit("Need name after -prefix"); prefix = argv[++iarg]; iarg++ ; continue ; continue ; } if( strcmp(argv[iarg],"-datum") == 0) { if (iarg >= argc) ERROR_exit("Need datum type after -datum"); ++iarg; if (!strcmp(argv[iarg],"float")) udatum = MRI_float; else if (!strcmp(argv[iarg],"short")) udatum = MRI_short; else { ERROR_exit( "For the purpose of this demo, only float and short are allowed"); } iarg++ ; continue ; continue ; } ERROR_message("ILLEGAL option: %s\n",argv[iarg]) ; suggest_best_prog_option(argv[0], argv[iarg]); exit(1); } if( argc < 2 ){ help_3dToyProg(TXT, 0); PRINT_COMPILE_DATE ; exit(0) ; } if( !iset ) ERROR_exit("No dataset on command line!?") ; if (mask_dset) { if (THD_dataset_mismatch(mask_dset, iset)) ERROR_exit("grid mismatch between input dset and mask dset"); maskvox = THD_makemask( mask_dset , 0 , 1.0, -1.0 ) ; mcount = THD_countmask( DSET_NVOX(mask_dset) , maskvox ) ; if( mcount <= 0 ) ERROR_exit("No voxels in the mask!\n") ; INFO_message("%d voxels in the mask dset %s\n", mcount, DSET_PREFIX(mask_dset)) ; DSET_delete(mask_dset) ; mask_dset=NULL; /* Done with the mask dset */ } /* An illustration of how volume navigation works */ Dataset_Navigation(iset); /* Let us create a dataset from scratch */ sset = New_Dataset_From_Scratch(prefix); /* Now for the output, add history, check for overwrite and write away */ tross_Copy_History( iset , sset );/* Copy the old history (not mandatory). */ tross_Make_History("3dToyProg", argc, argv ,sset) ; /* add the new */ if( !THD_ok_overwrite() && THD_is_ondisk(DSET_HEADNAME(sset)) ) { ERROR_message( "Output %s already exists, use -overwrite to do you know what", DSET_HEADNAME(sset)); } else DSET_write(sset); /* Now we'll do some voxelwise computations */ xset = Voxelwise_Operations(sset, maskvox, prefix); tross_Copy_History( iset , xset ) ; /* Copy the old */ tross_Make_History("3dToyProg", argc, argv ,xset) ; /* add the new */ if( !THD_ok_overwrite() && THD_is_ondisk(DSET_HEADNAME(xset)) ) { ERROR_message( "Output %s already exists, use -overwrite to do you know what", DSET_HEADNAME(xset)); } else DSET_write(xset); /* Or some volumewise operations */ vset = Volumewise_Operations(sset, prefix, udatum); tross_Copy_History( iset , vset ) ; /* Copy the old */ tross_Make_History("3dToyProg", argc, argv ,vset) ; /* add the new */ if( !THD_ok_overwrite() && THD_is_ondisk(DSET_HEADNAME(vset)) ) { ERROR_message( "Output %s already exists, use -overwrite to do you know what", DSET_HEADNAME(vset)); } else DSET_write(vset); /* cleanup */ DSET_delete(xset); xset = NULL; DSET_delete(vset); vset = NULL; DSET_delete(sset); sset = NULL; exit(0) ; }
/*! \brief parse the arguments for SurfQual program \param argv (char *) \param argc (int) \return Opt (SUMA_SURFQUAL_OPTIONS *) options structure. To free it, use SUMA_free(Opt->out_prefix); SUMA_free(Opt); */ SUMA_SURFQUAL_OPTIONS *SUMA_SurfQual_ParseInput (char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]= {"SUMA_SurfQual_ParseInput"}; SUMA_SURFQUAL_OPTIONS *Opt=NULL; int kar, i, ind; char *outprefix; SUMA_Boolean brk = NOPE; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = (SUMA_SURFQUAL_OPTIONS *)SUMA_malloc(sizeof(SUMA_SURFQUAL_OPTIONS)); kar = 1; Opt->out_prefix = NULL; Opt->surftype = NULL; Opt->self_intersect = 0; Opt->DoSum = 0; brk = NOPE; while (kar < argc) { /* loop accross command ine options */ /*fprintf(stdout, "%s verbose: Parsing command line...\n", FuncName);*/ if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { usage_SUMA_SurfQual(ps, strlen(argv[kar]) > 3 ? 2:1); exit (0); } /* skip the options parsed in SUMA_ParseInput_basics_s */ SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-sphere") == 0)) { if (Opt->surftype) { SUMA_S_Err( "Surface type already specified.\n" "Only one type allowed."); exit(1); } Opt->surftype = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-self_intersect") == 0)) { Opt->self_intersect = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-summary") == 0)) { Opt->DoSum = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -prefix \n"); exit (1); } Opt->out_prefix = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && !ps->arg_checked[kar]) { fprintf (SUMA_STDERR, "Error %s:\nOption %s not understood. Try -help for usage\n", FuncName, argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } #if 0 if (Spec->N_Surfs < 1) { SUMA_SL_Err("No surface specified."); exit(1); } #endif SUMA_RETURN (Opt); }
/*! \brief parse the arguments for SurfSmooth program \param argv (char *) \param argc (int) \return Opt (SUMA_GETPATCH_OPTIONS *) options structure. To free it, use SUMA_free(Opt->out_prefix); SUMA_free(Opt); */ SUMA_GETPATCH_OPTIONS *SUMA_GetPatch_ParseInput (char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_GetPatch_ParseInput"}; SUMA_GETPATCH_OPTIONS *Opt=NULL; int kar, i, ind; char *outprefix; SUMA_Boolean brk = NOPE; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = (SUMA_GETPATCH_OPTIONS *)SUMA_malloc(sizeof(SUMA_GETPATCH_OPTIONS)); kar = 1; Opt->iType = SUMA_FT_NOT_SPECIFIED; Opt->out_prefix = NULL; Opt->out_volprefix = NULL; Opt->in_name = NULL; Opt->minhits = 2; Opt->labelcol = -1; Opt->nodecol = -1; Opt->thislabel = -1; Opt->DoVol = 0; Opt->VolOnly = 0; Opt->coordgain = 0.0; Opt->Do_p2s = NOPE; Opt->FixBowTie = -1; Opt->adjust_contour = -1; Opt->oType = SUMA_FT_NOT_SPECIFIED; Opt->verb = 1; Opt->flip = 0; brk = NOPE; while (kar < argc) { /* loop accross command ine options */ /*fprintf(stdout, "%s verbose: Parsing command line...\n", FuncName);*/ if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { usage_SUMA_getPatch(ps, strlen(argv[kar]) > 3 ? 2:1); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-hits") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -hits \n"); exit (1); } Opt->minhits = atoi(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-coord_gain") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -coord_gain \n"); exit (1); } Opt->coordgain = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-masklabel") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -masklabel \n"); exit (1); } Opt->thislabel = atoi(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-patch2surf") == 0)) { Opt->Do_p2s = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-vol") == 0)) { Opt->DoVol = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-flip_orientation") == 0)) { Opt->flip = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-vol_only") == 0)) { Opt->DoVol = 1; Opt->VolOnly = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-adjust_contour") == 0)) { Opt->adjust_contour = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-do-not-adjust_contour") == 0)) { Opt->adjust_contour = 0; brk = YUP; } if (!brk && (strcmp(argv[kar], "-check_bowtie") == 0)) { Opt->FixBowTie = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-fix_bowtie") == 0)) { Opt->FixBowTie = 2; brk = YUP; } if (!brk && (strcmp(argv[kar], "-ok_bowtie") == 0)) { Opt->FixBowTie = 0; brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -prefix \n"); exit (1); } Opt->out_prefix = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-verb") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -verb \n"); exit (1); } Opt->verb = atoi(argv[kar]); if (Opt->verb < 0 || Opt->verb > 10) { SUMA_S_Errv("Something fishy with -verb value of %s\n" "Need integer from 0 to 2\n", argv[kar]); exit(1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-stiched_surface") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -stiched_surface \n"); exit (1); } Opt->out_volprefix = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-out_type") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -out_type \n"); exit (1); } Opt->oType = SUMA_guess_surftype_argv(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-input") == 0)) { kar ++; if (kar+2 >= argc) { fprintf (SUMA_STDERR, "need 3 arguments after -input \n"); exit (1); } Opt->in_name = argv[kar]; kar ++; Opt->nodecol = atoi(argv[kar]); kar ++; Opt->labelcol = atoi(argv[kar]); brk = YUP; } #if 0 if (!brk && (strcmp(argv[kar], "-spec") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -spec \n"); exit (1); } Opt->spec_file = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sv") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -sv \n"); exit (1); } Opt->sv_name = argv[kar]; brk = YUP; } if (!brk && (strncmp(argv[kar], "-surf_", 6) == 0)) { if (kar + 1>= argc) { fprintf (SUMA_STDERR, "need argument after -surf_X SURF_NAME \n"); exit (1); } ind = argv[kar][6] - 'A'; if (ind < 0 || ind >= SURFPATCH_MAX_SURF) { fprintf (SUMA_STDERR, "-surf_X SURF_NAME option is out of range.\n"); exit (1); } kar ++; Opt->surf_names[ind] = argv[kar]; Opt->N_surf = ind+1; brk = YUP; } #endif if (!brk && !ps->arg_checked[kar]) { fprintf (SUMA_STDERR, "Error %s:\nOption %s not understood. Try -help for usage\n", FuncName, argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } /* sanity checks */ if (Opt->FixBowTie < 0) { if (Opt->DoVol) Opt->FixBowTie = 1; /* important to check in this case */ else Opt->FixBowTie = 0; } if (Opt->adjust_contour < 0) { if (Opt->DoVol) Opt->adjust_contour = 0; else Opt->adjust_contour = 0; } if (!Opt->out_prefix) Opt->out_prefix = SUMA_copy_string("SurfPatch"); if (Opt->thislabel >= 0 && Opt->labelcol < 0) { SUMA_SL_Err("Cannot use -masklabel without specifying " "ilabel in -input option"); exit(1); } if (Opt->minhits < 1 || Opt->minhits > 3) { SUMA_SL_Err("minhits must be > 0 and < 3"); exit(1); } if (!Opt->in_name) { SUMA_SL_Err("No input specified."); exit(1); } SUMA_RETURN (Opt); }
int main( int argc , char *argv[] ) { int iarg , ii,jj,kk,mm , nvec , do_one=0 , nx=0,ny , ff, doterse = 0 ; MRI_IMAGE *tim ; MRI_IMARR *tar ; double sum , *eval , *amat , **tvec , *bmat , *svec ; float *far ; int demean=0 , docov=0 ; char *matname ; int okzero = 0; mainENTRY("1ddot main"); machdep(); /* options */ iarg = 1 ; nvec = 0 ; while( iarg < argc && argv[iarg][0] == '-' ){ if (strcmp(argv[iarg],"-help") == 0 || strcmp(argv[iarg],"-h") == 0){ usage_1ddot(strlen(argv[iarg])>3 ? 2:1); exit(0); } if( strcmp(argv[iarg],"-one") == 0 ){ demean = 0 ; do_one = 1 ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-okzero") == 0 ){ okzero = 1 ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-dem",4) == 0 ){ demean = 1 ; do_one = 0 ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-cov",4) == 0 ){ docov = 1 ; iarg++ ; continue ; } if( strncmp(argv[iarg],"-inn",4) == 0 ){ docov = 2 ; iarg++ ; continue ; } if( strcasecmp(argv[iarg],"-rank") == 0 || strcasecmp(argv[iarg],"-spearman") == 0 ){ do_one = 0; docov = 3; demean = 0; doterse = 1; iarg++; continue; } if( strncmp(argv[iarg],"-terse",4) == 0 ){ doterse = 1 ; iarg++ ; continue ; } fprintf(stderr,"** Unknown option: %s\n",argv[iarg]); suggest_best_prog_option(argv[0], argv[iarg]); exit(1); } if( argc < 2 ){ usage_1ddot(1); exit(0) ; } if( iarg == argc ) ERROR_exit("No 1D files on command line!?") ; /* input 1D files */ ff = iarg ; INIT_IMARR(tar) ; if( do_one ) nvec = 1 ; for( ; iarg < argc ; iarg++ ){ tim = mri_read_1D( argv[iarg] ) ; if( tim == NULL ){ fprintf(stderr,"** Can't read 1D file %s\n",argv[iarg]); exit(1); } if( nx == 0 ){ nx = tim->nx ; } else if( tim->nx != nx ){ fprintf(stderr,"** 1D file %s doesn't match first file in length!\n", argv[iarg]); exit(1); } nvec += tim->ny ; ADDTO_IMARR(tar,tim) ; } if (!doterse) { printf("\n") ; printf("++ 1ddot input vectors:\n") ; } jj = 0 ; if( do_one ){ if (!doterse) printf("00..00: all ones\n") ; jj = 1 ; } for( mm=0 ; mm < IMARR_COUNT(tar) ; mm++ ){ tim = IMARR_SUBIM(tar,mm) ; if (!doterse) printf("%02d..%02d: %s\n", jj,jj+tim->ny-1, argv[ff+mm] ) ; jj += tim->ny ; } /* create vectors from 1D files */ tvec = (double **) malloc( sizeof(double *)*nvec ) ; svec = (double * ) malloc( sizeof(double )*nvec ) ; for( jj=0 ; jj < nvec ; jj++ ) tvec[jj] = (double *) malloc( sizeof(double)*nx ) ; kk = 0 ; if( do_one ){ svec[0] = 1.0 / sqrt((double)nx) ; for( ii=0 ; ii < nx ; ii++ ) tvec[0][ii] = 1.0 ; kk = 1 ; } for( mm=0 ; mm < IMARR_COUNT(tar) ; mm++ ){ tim = IMARR_SUBIM(tar,mm) ; far = MRI_FLOAT_PTR(tim) ; for( jj=0 ; jj < tim->ny ; jj++,kk++ ){ for( ii=0 ; ii < nx ; ii++ ) tvec[kk][ii] = far[ii+jj*nx] ; if( demean ){ sum = 0.0 ; for( ii=0 ; ii < nx ; ii++ ) sum += tvec[kk][ii] ; sum /= nx ; for( ii=0 ; ii < nx ; ii++ ) tvec[kk][ii] -= sum ; } sum = 0.0 ; for( ii=0 ; ii < nx ; ii++ ) sum += tvec[kk][ii] * tvec[kk][ii] ; if( sum == 0.0 ) { if (okzero) svec[kk] = 0.0; else ERROR_exit("Input column %02d is all zero!",kk) ; } else { svec[kk] = 1.0 / sqrt(sum) ; } } } DESTROY_IMARR(tar) ; /* normalize vectors? (for ordinary correlation) */ if( !docov ){ for( kk=0 ; kk < nvec ; kk++ ){ sum = svec[kk] ; for( ii=0 ; ii < nx ; ii++ ) tvec[kk][ii] *= sum ; } } switch(docov){ default: case 3: matname = "Spearman" ; break ; case 2: matname = "InnerProduct" ; break ; case 1: matname = "Covariance" ; break ; case 0: matname = "Correlation" ; break ; } /* create matrix from dot product of vectors */ amat = (double *) calloc( sizeof(double) , nvec*nvec ) ; if( docov != 3 ){ for( kk=0 ; kk < nvec ; kk++ ){ for( jj=0 ; jj <= kk ; jj++ ){ sum = 0.0 ; for( ii=0 ; ii < nx ; ii++ ) sum += tvec[jj][ii] * tvec[kk][ii] ; amat[jj+nvec*kk] = sum ; if( jj < kk ) amat[kk+nvec*jj] = sum ; } } } else { /* Spearman */ for( kk=0 ; kk < nvec ; kk++ ){ for( jj=0 ; jj <= kk ; jj++ ){ amat[jj+nvec*kk] = THD_spearman_corr_dble( nx , tvec[jj] , tvec[kk] ) ; if( jj < kk ) amat[kk+nvec*jj] = amat[jj+nvec*kk] ; } } } /* normalize */ if (docov==1) { for( kk=0 ; kk < nvec ; kk++ ){ for( jj=0 ; jj <= kk ; jj++ ){ sum = amat[jj+nvec*kk] / (double) (nx-1); amat[jj+nvec*kk] = sum; if( jj < kk ) amat[kk+nvec*jj] = sum ; } } } /* print matrix out */ if (!doterse) { printf("\n" "++ %s Matrix:\n ",matname) ; for( jj=0 ; jj < nvec ; jj++ ) printf(" %02d ",jj) ; printf("\n ") ; for( jj=0 ; jj < nvec ; jj++ ) printf(" ---------") ; printf("\n") ; } for( kk=0 ; kk < nvec ; kk++ ){ if (!doterse) printf("%02d:",kk) ; for( jj=0 ; jj < nvec ; jj++ ) printf(" %9.5f",amat[jj+kk*nvec]) ; printf("\n") ; } if (doterse) exit(0) ; /* au revoir */ /* compute eigendecomposition */ eval = (double *) malloc( sizeof(double)*nvec ) ; symeig_double( nvec , amat , eval ) ; printf("\n" "++ Eigensolution of %s Matrix:\n " , matname ) ; for( jj=0 ; jj < nvec ; jj++ ) printf(" %9.5f",eval[jj]) ; printf("\n ") ; for( jj=0 ; jj < nvec ; jj++ ) printf(" ---------") ; printf("\n") ; for( kk=0 ; kk < nvec ; kk++ ){ printf("%02d:",kk) ; for( jj=0 ; jj < nvec ; jj++ ) printf(" %9.5f",amat[kk+jj*nvec]) ; printf("\n") ; } /* compute matrix inverse */ if ( eval[0]/eval[nvec-1] < 1.0e-10) { printf("\n" "-- WARNING: Matrix is near singular,\n" " rubbish likely for inverses ahead.\n"); } for( jj=0 ; jj < nvec ; jj++ ) eval[jj] = 1.0 / eval[jj] ; bmat = (double *) calloc( sizeof(double) , nvec*nvec ) ; for( ii=0 ; ii < nvec ; ii++ ){ for( jj=0 ; jj < nvec ; jj++ ){ sum = 0.0 ; for( kk=0 ; kk < nvec ; kk++ ) sum += amat[ii+kk*nvec] * amat[jj+kk*nvec] * eval[kk] ; bmat[ii+jj*nvec] = sum ; } } printf("\n") ; printf("++ %s Matrix Inverse:\n " , matname ) ; for( jj=0 ; jj < nvec ; jj++ ) printf(" %02d ",jj) ; printf("\n ") ; for( jj=0 ; jj < nvec ; jj++ ) printf(" ---------") ; printf("\n") ; for( kk=0 ; kk < nvec ; kk++ ){ printf("%02d:",kk) ; for( jj=0 ; jj < nvec ; jj++ ) printf(" %9.5f",bmat[jj+kk*nvec]) ; printf("\n") ; } /* square roots of diagonals of the above */ printf("\n") ; printf("++ %s sqrt(diagonal)\n ",matname) ; for( jj=0 ; jj < nvec ; jj++ ) printf(" %9.5f",sqrt(bmat[jj+jj*nvec])) ; printf("\n") ; /* normalize matrix inverse */ for( ii=0 ; ii < nvec ; ii++ ){ for( jj=0 ; jj < nvec ; jj++ ){ sum = bmat[ii+ii*nvec] * bmat[jj+jj*nvec] ; if( sum > 0.0 ) amat[ii+jj*nvec] = bmat[ii+jj*nvec] / sqrt(sum) ; else amat[ii+jj*nvec] = 0.0 ; } } printf("\n") ; printf("++ %s Matrix Inverse Normalized:\n " , matname ) ; for( jj=0 ; jj < nvec ; jj++ ) printf(" %02d ",jj) ; printf("\n ") ; for( jj=0 ; jj < nvec ; jj++ ) printf(" ---------") ; printf("\n") ; for( kk=0 ; kk < nvec ; kk++ ){ printf("%02d:",kk) ; for( jj=0 ; jj < nvec ; jj++ ) printf(" %9.5f",amat[jj+kk*nvec]) ; printf("\n") ; } /* done */ exit(0) ; }
int main( int argc , char *argv[] ) { int iarg=1 , verb=0 , interp_code=MRI_QUINTIC , ainterp_code=-666 ; char *expr ; int nexpr , narg ; THD_3dim_dataset *oset ; AFNI_SETUP_OMP(0) ; /* 24 Jun 2013 */ if( argc < 2 || strcasecmp(argv[1],"-help") == 0 ) NWC_help() ; mainENTRY("3dNwarpCalc"); machdep(); AFNI_logger("3dNwarpCalc",argc,argv); PRINT_VERSION("3dNwarpCalc"); AUTHOR("Bob the Warped"); (void)COX_clock_time() ; while( iarg < argc && argv[iarg][0] == '-' ){ if( strcasecmp(argv[iarg],"-NN") == 0 || strncasecmp(argv[iarg],"-nearest",6) == 0 ){ WARNING_message("NN interpolation not legal here -- switched to linear") ; interp_code = MRI_LINEAR ; iarg++ ; continue ; } if( strncasecmp(argv[iarg],"-linear",4)==0 || strncasecmp(argv[iarg],"-trilinear",6)==0 ){ interp_code = MRI_LINEAR ; iarg++ ; continue ; } if( strncasecmp(argv[iarg],"-cubic",4)==0 || strncasecmp(argv[iarg],"-tricubic",6)==0 ){ WARNING_message("cubic interplation not legal here -- switched to quintic") ; interp_code = MRI_QUINTIC ; iarg++ ; continue ; } if( strncasecmp(argv[iarg],"-quintic",4)==0 || strncasecmp(argv[iarg],"-triquintic",6)==0 ){ interp_code = MRI_QUINTIC ; iarg++ ; continue ; } if( strncasecmp(argv[iarg],"-wsinc",5) == 0 ){ interp_code = MRI_WSINC5 ; iarg++ ; continue ; } if( strncasecmp(argv[iarg],"-interp",5)==0 ){ char *inam ; if( ++iarg >= argc ) ERROR_exit("no argument after '%s' :-(",argv[iarg-1]) ; inam = argv[iarg] ; if( *inam == '-' ) inam++ ; if( strcasecmp(inam,"NN")==0 || strncasecmp(inam,"nearest",5)==0 ){ WARNING_message("NN interpolation not legal here -- changed to linear") ; interp_code = MRI_LINEAR ; } else if( strncasecmp(inam,"linear",3)==0 || strncasecmp(inam,"trilinear",5)==0 ){ interp_code = MRI_LINEAR ; } else if( strncasecmp(inam,"cubic",3)==0 || strncasecmp(inam,"tricubic",5)==0 ){ WARNING_message("cubic interplation not legal here -- changed to quintic") ; interp_code = MRI_QUINTIC ; } else if( strncasecmp(inam,"quintic",3)==0 || strncasecmp(inam,"triquintic",5)==0 ){ interp_code = MRI_QUINTIC ; } else if( strncasecmp(inam,"wsinc",4)==0 ){ interp_code = MRI_WSINC5 ; } else { ERROR_exit("Unknown code '%s' after '%s' :-(",argv[iarg],argv[iarg-1]) ; } iarg++ ; continue ; } /*---------------*/ if( strncasecmp(argv[iarg],"-ainterp",6)==0 ){ char *inam ; if( ++iarg >= argc ) ERROR_exit("no argument after '%s' :-(",argv[iarg-1]) ; inam = argv[iarg] ; if( *inam == '-' ) inam++ ; if( strcasecmp(inam,"NN")==0 || strncasecmp(inam,"nearest",5)==0 ){ ainterp_code = MRI_NN ; } else if( strncasecmp(inam,"linear",3)==0 || strncasecmp(inam,"trilinear",5)==0 ){ ainterp_code = MRI_LINEAR ; } else if( strncasecmp(inam,"cubic",3)==0 || strncasecmp(inam,"tricubic",5)==0 ){ ainterp_code = MRI_CUBIC ; } else if( strncasecmp(inam,"quintic",3)==0 || strncasecmp(inam,"triquintic",5)==0 ){ ainterp_code = MRI_QUINTIC ; } else if( strncasecmp(inam,"wsinc",4)==0 ){ ainterp_code = MRI_WSINC5 ; } else { ERROR_exit("Unknown code '%s' after '%s' :-(",argv[iarg],argv[iarg-1]) ; } iarg++ ; continue ; } /*---------------*/ if( strcasecmp(argv[iarg],"-verb") == 0 ){ verb++ ; iarg++ ; continue ; } /*---------------*/ ERROR_message("Bizarre and Unknown option '%s' :-(",argv[iarg]) ; suggest_best_prog_option(argv[0],argv[iarg]) ; exit(1) ; } if( iarg >= argc ) ERROR_exit("No command line expression :-(") ; /*--- Assemble all remaining args into the expression ---*/ expr = strdup(argv[iarg++]) ; for( ; iarg < argc ; iarg++ ){ nexpr = strlen(expr) ; narg = strlen(argv[iarg]) ; if( narg == 0 ) continue ; expr = (char *)realloc( expr , sizeof(char)*(nexpr+narg+4) ) ; strcat(expr," ") ; strcat(expr,argv[iarg]) ; } if( ainterp_code < 0 ) ainterp_code = interp_code ; /*--- All the work is done herein ---*/ NwarpCalcRPN_verb(verb) ; oset = NwarpCalcRPN( expr , NULL , interp_code , ainterp_code ) ; /*--- run away screaming into the night, never to be seen again ---*/ free(expr) ; if( oset != NULL ) DSET_delete(oset) ; INFO_message("total CPU time = %.1f sec Elapsed = %.1f\n", COX_cpu_time() , COX_clock_time() ) ; exit(0) ; }
int main(int argc, char *argv[]) { int i,j,k,m,n,mm; int iarg; THD_3dim_dataset *insetTIME = NULL; THD_3dim_dataset *MASK=NULL; THD_3dim_dataset *ROIS=NULL; char *prefix="NETCORR" ; char in_name[300]; char in_mask[300]; char in_rois[300]; char OUT_grid[300]; char OUT_indiv[300]; char OUT_indiv0[300]; // int *SELROI=NULL; // if selecting subset of ROIs // int HAVE_SELROI=0; int NIFTI_OUT = 0; byte ***mskd=NULL; // define mask of where time series are nonzero byte *mskd2=NULL; // not great, but another format of mask int HAVE_MASK=0; int HAVE_ROIS=0; int FISH_OUT=0; int PART_CORR=0; int TS_OUT=0; int TS_LABEL=0; int TS_INDIV=0; int TS_WBCORR_r=0; int TS_WBCORR_Z=0; int *NROI_REF=NULL,*INVROI_REF=NULL; int **ROI_LABELS_REF=NULL, **INV_LABELS_REF=NULL,**ROI_COUNT=NULL; int ***ROI_LISTS=NULL; double ***ROI_AVE_TS=NULL; // double because of GSL float ***Corr_Matr=NULL; float ***PCorr_Matr=NULL, ***PBCorr_Matr=NULL; int Nvox=-1; // tot number vox int *Dim=NULL; int *Nlist=NULL; Dtable *roi_dtable=NULL; char *LabTabStr=NULL; char ***ROI_STR_LABELS=NULL; // for niml.dset -> graph viewing in SUMA char ***gdset_roi_names=NULL; SUMA_DSET *gset=NULL; float ***flat_matr=NULL; float *xyz=NULL; char OUT_gdset[300]; NI_group *GDSET_netngrlink=NULL; char *NAME_gdset=NULL; int Noutmat = 1; // num of matr to output: start with CC for sure char **ParLab=NULL; int FM_ctr = 0; // for counting through flatmatr entries int OLD_LABEL=0; // ooollld style format of regions: Nnumber:Rnumber int IGNORE_LT=0; // ignore label table int idx = 0; int Nmask = 0; FILE *fout1,*fin,*fout2; AFNI_SETUP_OMP(0) ; /* 24 Jun 2013 */ mainENTRY("3dNetCorr"); machdep(); // **************************************************************** // **************************************************************** // load AFNI stuff // **************************************************************** // **************************************************************** // INFO_message("version: BETA"); /** scan args **/ if (argc == 1) { usage_NetCorr(1); exit(0); } iarg = 1; while( iarg < argc && argv[iarg][0] == '-' ){ if( strcmp(argv[iarg],"-help") == 0 || strcmp(argv[iarg],"-h") == 0 ) { usage_NetCorr(strlen(argv[iarg])>3 ? 2:1); exit(0); } if( strcmp(argv[iarg],"-prefix") == 0 ){ iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-prefix'"); prefix = strdup(argv[iarg]) ; if( !THD_filename_ok(prefix) ) ERROR_exit("Illegal name after '-prefix'"); iarg++ ; continue ; } if( strcmp(argv[iarg],"-inset") == 0 ){ iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-input'"); sprintf(in_name,"%s", argv[iarg]); insetTIME = THD_open_dataset(in_name) ; if( (insetTIME == NULL )) ERROR_exit("Can't open time series dataset '%s'.",in_name); // just 0th time point for output... Dim = (int *)calloc(4,sizeof(int)); DSET_load(insetTIME); CHECK_LOAD_ERROR(insetTIME); Nvox = DSET_NVOX(insetTIME) ; Dim[0] = DSET_NX(insetTIME); Dim[1] = DSET_NY(insetTIME); Dim[2] = DSET_NZ(insetTIME); Dim[3]= DSET_NVALS(insetTIME); iarg++ ; continue ; } if( strcmp(argv[iarg],"-mask") == 0 ){ iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-mask'"); HAVE_MASK= 1; sprintf(in_mask,"%s", argv[iarg]); MASK = THD_open_dataset(in_mask) ; if( (MASK == NULL )) ERROR_exit("Can't open time series dataset '%s'.",in_mask); DSET_load(MASK); CHECK_LOAD_ERROR(MASK); iarg++ ; continue ; } if( strcmp(argv[iarg],"-in_rois") == 0 ){ iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-in_rois'"); sprintf(in_rois,"%s", argv[iarg]); ROIS = THD_open_dataset(in_rois) ; if( (ROIS == NULL )) ERROR_exit("Can't open time series dataset '%s'.",in_rois); DSET_load(ROIS); CHECK_LOAD_ERROR(ROIS); HAVE_ROIS=DSET_NVALS(ROIS); //number of subbricks iarg++ ; continue ; } if( strcmp(argv[iarg],"-fish_z") == 0) { FISH_OUT=1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-nifti") == 0) { NIFTI_OUT=1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-part_corr") == 0) { PART_CORR=2; // because we calculate two matrices here iarg++ ; continue ; } if( strcmp(argv[iarg],"-ts_out") == 0) { TS_OUT=1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-ts_label") == 0) { TS_LABEL=1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-ts_indiv") == 0) { TS_INDIV=1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-ts_wb_corr") == 0) { TS_WBCORR_r=1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-ts_wb_Z") == 0) { TS_WBCORR_Z=1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-old_labels") == 0) { OLD_LABEL=1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-ignore_LT") == 0) { IGNORE_LT=1; iarg++ ; continue ; } /* if( strcmp(argv[iarg],"-sel_roi") == 0 ){ iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-in_rois'"); SELROI = (int *)calloc(MAX_SELROI,sizeof(int)); if( (fin = fopen(argv[iarg], "r")) == NULL) { fprintf(stderr, "Error opening file %s.",argv[iarg]); exit(1); } idx=0; while( !feof(fin) && (idx<MAX_SELROI-1) ){ fscanf(fin, "%d",&SELROI[idx]); fscanf(fin," "); idx++; } HAVE_SELROI=idx; printf("HAVE_SELROI=%d\n",HAVE_SELROI); if(HAVE_SELROI<=0) { ERROR_message("Error reading in `-sel_roi'-- appears to have no ROIs listed.\n"); exit(1); } iarg++ ; continue ; }*/ ERROR_message("Bad option '%s'\n",argv[iarg]) ; suggest_best_prog_option(argv[0], argv[iarg]); exit(1); } INFO_message("Reading in."); if( !TS_OUT && TS_LABEL) { ERROR_message("with '-ts_label', you also need '-ts_out'.\n"); exit(1); } if (iarg < 3) { ERROR_message("Too few options. Try -help for details.\n"); exit(1); } if(!HAVE_ROIS) { ERROR_message("Need to load ROIs with >=1 subbrick...\n"); exit(1); } if(Nvox != DSET_NVOX(ROIS)) { ERROR_message("Data sets of `-inset' and `in_rois' have " "different numbers of voxels per brik!\n"); exit(1); } if( (HAVE_MASK>0) && (Nvox != DSET_NVOX(MASK)) ) { ERROR_message("Data sets of `-inset' and `mask' have " "different numbers of voxels per brik!\n"); exit(1); } // **************************************************************** // **************************************************************** // make storage // **************************************************************** // **************************************************************** Nlist = (int *)calloc(1,sizeof(int)); mskd2 = (byte *)calloc(Nvox,sizeof(byte)); mskd = (byte ***) calloc( Dim[0], sizeof(byte **) ); for ( i = 0 ; i < Dim[0] ; i++ ) mskd[i] = (byte **) calloc( Dim[1], sizeof(byte *) ); for ( i = 0 ; i < Dim[0] ; i++ ) for ( j = 0 ; j < Dim[1] ; j++ ) mskd[i][j] = (byte *) calloc( Dim[2], sizeof(byte) ); if( (mskd == NULL) || (Nlist == NULL) || (mskd2 == NULL)) { fprintf(stderr, "\n\n MemAlloc failure (masks).\n\n"); exit(122); } // ************************************************************* // ************************************************************* // Beginning of main loops // ************************************************************* // ************************************************************* INFO_message("Allocating..."); // go through once: define data vox, and calc rank for each for( k=0 ; k<Dim[2] ; k++ ) for( j=0 ; j<Dim[1] ; j++ ) for( i=0 ; i<Dim[0] ; i++ ) { if( HAVE_MASK ) { if( THD_get_voxel(MASK,idx,0)>0 ) { mskd[i][j][k] = 1; mskd2[idx] = 1; Nmask++; } } else // simple automask attempt if( fabs(THD_get_voxel(insetTIME,idx,0))+ fabs(THD_get_voxel(insetTIME,idx,1))+ fabs(THD_get_voxel(insetTIME,idx,2))+ fabs(THD_get_voxel(insetTIME,idx,3))+ fabs(THD_get_voxel(insetTIME,idx,4)) > EPS_V) { mskd[i][j][k] = 1; mskd2[idx] = 1; Nmask++; } idx+= 1; // skip, and mskd and KW are both still 0 from calloc } if (HAVE_MASK) { DSET_delete(MASK); free(MASK); } // obviously, this should always be TRUE at this point... if(HAVE_ROIS>0) { NROI_REF = (int *)calloc(HAVE_ROIS, sizeof(int)); INVROI_REF = (int *)calloc(HAVE_ROIS, sizeof(int)); if( (NROI_REF == NULL) || (INVROI_REF == NULL) ) { fprintf(stderr, "\n\n MemAlloc failure.\n\n"); exit(122); } for( i=0 ; i<HAVE_ROIS ; i++) INVROI_REF[i] = (int) THD_subbrick_max(ROIS, i, 1); ROI_LABELS_REF = calloc( HAVE_ROIS,sizeof(ROI_LABELS_REF)); for(i=0 ; i<HAVE_ROIS ; i++) ROI_LABELS_REF[i] = calloc(INVROI_REF[i]+1,sizeof(int)); INV_LABELS_REF = calloc( HAVE_ROIS,sizeof(INV_LABELS_REF)); for(i=0 ; i<HAVE_ROIS ; i++) INV_LABELS_REF[i] = calloc(INVROI_REF[i]+1,sizeof(int)); if( (ROI_LABELS_REF == NULL) || (INV_LABELS_REF == NULL) ) { fprintf(stderr, "\n\n MemAlloc failure.\n\n"); exit(123); } INFO_message("Labelling regions internally."); // Step 3A-2: find out the labels in the ref, organize them // both backwards and forwards. i = ViveLeRoi(ROIS, ROI_LABELS_REF, // ordered list of ROILABEL ints, [1..M]; // maxval is N. INV_LABELS_REF, // ith values at the actual input locs; // maxval is M. NROI_REF, // M: # of ROIs per brik INVROI_REF); // N: max ROI label per brik if( i != 1) ERROR_exit("Problem loading/assigning ROI labels"); ROI_STR_LABELS = (char ***) calloc( HAVE_ROIS, sizeof(char **) ); for ( i=0 ; i<HAVE_ROIS ; i++ ) ROI_STR_LABELS[i] = (char **) calloc( NROI_REF[i]+1, sizeof(char *) ); for ( i=0 ; i<HAVE_ROIS ; i++ ) for ( j=0 ; j<NROI_REF[i]+1 ; j++ ) ROI_STR_LABELS[i][j] = (char *) calloc( 100 , sizeof(char) ); if( (ROI_STR_LABELS == NULL)) { fprintf(stderr, "\n\n MemAlloc failure.\n\n"); exit(123); } // Sept 2014: Labeltable stuff if( IGNORE_LT ) { INFO_message("Ignoring any '-in_rois' label table (if there is one)."); } else{ if ((ROIS->Label_Dtable = DSET_Label_Dtable(ROIS))) { if ((LabTabStr = Dtable_to_nimlstring( DSET_Label_Dtable(ROIS), "VALUE_LABEL_DTABLE"))) { //fprintf(stdout,"%s", LabTabStr); if (!(roi_dtable = Dtable_from_nimlstring(LabTabStr))) { ERROR_exit("Could not parse labeltable."); } } else { INFO_message("No label table from '-in_rois'."); } } } i = Make_ROI_Output_Labels( ROI_STR_LABELS, ROI_LABELS_REF, HAVE_ROIS, NROI_REF, roi_dtable, 1 );//!!!opts.DUMP_with_LABELS ROI_COUNT = calloc( HAVE_ROIS,sizeof(ROI_COUNT)); for(i=0 ; i<HAVE_ROIS ; i++) ROI_COUNT[i] = calloc(NROI_REF[i],sizeof(int)); if( (ROI_COUNT == NULL) ) { fprintf(stderr, "\n\n MemAlloc failure.\n\n"); exit(123); } // find num of vox per ROI for( m=0 ; m<HAVE_ROIS ; m++ ) { idx=0; for( k=0 ; k<Dim[2] ; k++ ) for( j=0 ; j<Dim[1] ; j++ ) for( i=0 ; i<Dim[0] ; i++ ) { if( (THD_get_voxel(ROIS,idx,m) > 0 ) && mskd[i][j][k] ) { ROI_COUNT[m][INV_LABELS_REF[m][(int) THD_get_voxel(ROIS,idx,m)]-1]++; } idx++; } } // make list of vox per ROI ROI_LISTS = (int ***) calloc( HAVE_ROIS, sizeof(int **) ); for ( i=0 ; i<HAVE_ROIS ; i++ ) ROI_LISTS[i] = (int **) calloc( NROI_REF[i], sizeof(int *) ); for ( i=0 ; i <HAVE_ROIS ; i++ ) for ( j=0 ; j<NROI_REF[i] ; j++ ) ROI_LISTS[i][j] = (int *) calloc( ROI_COUNT[i][j], sizeof(int) ); // make average time series per voxel ROI_AVE_TS = (double ***) calloc( HAVE_ROIS, sizeof(double **) ); for ( i=0 ; i<HAVE_ROIS ; i++ ) ROI_AVE_TS[i] = (double **) calloc( NROI_REF[i], sizeof(double *) ); for ( i=0 ; i <HAVE_ROIS ; i++ ) for ( j=0 ; j<NROI_REF[i] ; j++ ) ROI_AVE_TS[i][j] = (double *) calloc( Dim[3], sizeof(double) ); // store corr coefs Corr_Matr = (float ***) calloc( HAVE_ROIS, sizeof(float **) ); for ( i=0 ; i<HAVE_ROIS ; i++ ) Corr_Matr[i] = (float **) calloc( NROI_REF[i], sizeof(float *) ); for ( i=0 ; i <HAVE_ROIS ; i++ ) for ( j=0 ; j<NROI_REF[i] ; j++ ) Corr_Matr[i][j] = (float *) calloc( NROI_REF[i], sizeof(float) ); if( (ROI_LISTS == NULL) || (ROI_AVE_TS == NULL) || (Corr_Matr == NULL)) { fprintf(stderr, "\n\n MemAlloc failure.\n\n"); exit(123); } if(PART_CORR) { PCorr_Matr = (float ***) calloc( HAVE_ROIS, sizeof(float **) ); for ( i=0 ; i<HAVE_ROIS ; i++ ) PCorr_Matr[i] = (float **) calloc( NROI_REF[i], sizeof(float *) ); for ( i=0 ; i <HAVE_ROIS ; i++ ) for ( j=0 ; j<NROI_REF[i] ; j++ ) PCorr_Matr[i][j] = (float *) calloc( NROI_REF[i], sizeof(float)); PBCorr_Matr = (float ***) calloc( HAVE_ROIS, sizeof(float **) ); for ( i=0 ; i<HAVE_ROIS ; i++ ) PBCorr_Matr[i] = (float **) calloc( NROI_REF[i], sizeof(float *) ); for ( i=0 ; i <HAVE_ROIS ; i++ ) for ( j=0 ; j<NROI_REF[i] ; j++ ) PBCorr_Matr[i][j] = (float *) calloc( NROI_REF[i], sizeof(float)); if( (PCorr_Matr == NULL) || (PBCorr_Matr == NULL) ) { fprintf(stderr, "\n\n MemAlloc failure.\n\n"); exit(123); } } // reuse this to help place list indices for( i=0 ; i<HAVE_ROIS ; i++ ) for( j=0 ; j<NROI_REF[i] ; j++ ) ROI_COUNT[i][j] = 0; INFO_message("Getting volumes."); for( m=0 ; m<HAVE_ROIS ; m++ ) { idx=0; for( k=0 ; k<Dim[2] ; k++ ) for( j=0 ; j<Dim[1] ; j++ ) for( i=0 ; i<Dim[0] ; i++ ) { if( (THD_get_voxel(ROIS,idx,m) > 0) && mskd[i][j][k] ) { mm = INV_LABELS_REF[m][(int) THD_get_voxel(ROIS,idx,m)]-1; ROI_LISTS[m][mm][ROI_COUNT[m][mm]] = idx; ROI_COUNT[m][mm]++; } idx++; } } } // bit of freeing for( i=0 ; i<Dim[0] ; i++) for( j=0 ; j<Dim[1] ; j++) { free(mskd[i][j]); } for( i=0 ; i<Dim[0] ; i++) { free(mskd[i]); } free(mskd); INFO_message("Calculating average time series."); // ROI values for(i=0 ; i<HAVE_ROIS ; i++) for( j=0 ; j<NROI_REF[i] ; j++ ) { Nlist[0]=ROI_COUNT[i][j]; k = CalcAveRTS(ROI_LISTS[i][j], ROI_AVE_TS[i][j], insetTIME, Dim, Nlist); } INFO_message("Calculating correlation matrix."); if(PART_CORR) INFO_message("... and calculating partial correlation matrix."); for(i=0 ; i<HAVE_ROIS ; i++) { for( j=0 ; j<NROI_REF[i] ; j++ ) for( k=j ; k<NROI_REF[i] ; k++ ) { Corr_Matr[i][j][k] = Corr_Matr[i][k][j] = (float) CORR_FUN(ROI_AVE_TS[i][j], ROI_AVE_TS[i][k], Dim[3]); } if(PART_CORR) mm = CalcPartCorrMatr(PCorr_Matr[i], PBCorr_Matr[i], Corr_Matr[i], NROI_REF[i]); } // ************************************************************** // ************************************************************** // Store and output // ************************************************************** // ************************************************************** INFO_message("Writing output: %s ...", prefix); // - - - - - - - - NIML prep - - - - - - - - - - - - - - if(FISH_OUT) Noutmat++; if(PART_CORR) Noutmat+=2; ParLab = (char **)calloc(Noutmat, sizeof(char *)); for (j=0; j<Noutmat; ++j) ParLab[j] = (char *)calloc(32, sizeof(char)); if( (ParLab == NULL) ) { fprintf(stderr, "\n\n MemAlloc failure.\n\n"); exit(121); } // NIML output flat_matr = (float ***) calloc( HAVE_ROIS, sizeof(float **) ); for ( i = 0 ; i < HAVE_ROIS ; i++ ) flat_matr[i] = (float **) calloc( Noutmat, sizeof(float *) ); for ( i = 0 ; i < HAVE_ROIS ; i++ ) for ( j = 0 ; j < Noutmat ; j++ ) flat_matr[i][j] = (float *) calloc( NROI_REF[i]*NROI_REF[i], sizeof(float)); gdset_roi_names = (char ***)calloc(HAVE_ROIS, sizeof(char **)); for (i=0; i< HAVE_ROIS ; i++ ) { gdset_roi_names[i] = (char **)calloc(NROI_REF[i], sizeof(char *)); for (j=0; j<NROI_REF[i]; ++j) { gdset_roi_names[i][j] = (char *)calloc(32, sizeof(char)); if( OLD_LABEL ) snprintf(gdset_roi_names[i][j],31,"N%03d:R%d", i, ROI_LABELS_REF[i][j]); else{ snprintf(gdset_roi_names[i][j],31,"%s", ROI_STR_LABELS[i][j+1]); //fprintf(stderr," %s ", // ROI_STR_LABELS[i][j+1]); } } } if( (flat_matr == NULL) || ( gdset_roi_names == NULL) ) { fprintf(stderr, "\n\n MemAlloc failure.\n\n"); exit(14); } for( k=0 ; k<HAVE_ROIS ; k++) { // each netw gets own file sprintf(OUT_grid,"%s_%03d.netcc",prefix,k); // zero counting now if( (fout1 = fopen(OUT_grid, "w")) == NULL) { fprintf(stderr, "Error opening file %s.",OUT_grid); exit(19); } // same format as .grid files now fprintf(fout1,"# %d # Number of network ROIs\n",NROI_REF[k]); // NROIs fprintf(fout1,"# %d # Number of netcc matrices\n", FISH_OUT+PART_CORR+1); // Num of params // Sept 2014: label_table stuff // don't need labeltable to make them, can do anyways fprintf(fout1, "# WITH_ROI_LABELS\n"); for( i=1 ; i<NROI_REF[k] ; i++ ) fprintf(fout1," %10s \t",ROI_STR_LABELS[k][i]); fprintf(fout1," %10s\n",ROI_STR_LABELS[k][i]); // THIS IS FOR KNOWING WHICH MATR WE'RE AT // it's always zero for CC; they match one-to-one with later vars FM_ctr = 0; ParLab[FM_ctr] = strdup("CC"); for( i=1 ; i<NROI_REF[k] ; i++ ) // labels of ROIs fprintf(fout1," %10d \t",ROI_LABELS_REF[k][i]);// at =NROI, have '\n' fprintf(fout1," %10d\n# %s\n",ROI_LABELS_REF[k][i],"CC"); for( i=0 ; i<NROI_REF[k] ; i++ ) { for( j=0 ; j<NROI_REF[k]-1 ; j++ ) {// b/c we put '\n' after last one. fprintf(fout1,"%12.4f\t",Corr_Matr[k][i][j]); flat_matr[k][FM_ctr][i*NROI_REF[k]+j] = Corr_Matr[k][i][j]; } fprintf(fout1,"%12.4f\n",Corr_Matr[k][i][j]); flat_matr[k][FM_ctr][i*NROI_REF[k]+j] = Corr_Matr[k][i][j]; } if(FISH_OUT) { FM_ctr++; ParLab[FM_ctr] = strdup("FZ"); fprintf(fout1,"# %s\n", "FZ"); for( i=0 ; i<NROI_REF[k] ; i++ ) { for( j=0 ; j<NROI_REF[k]-1 ; j++ ) {// b/c we put '\n' after last fprintf(fout1,"%12.4f\t",BOBatanhf(Corr_Matr[k][i][j])); flat_matr[k][FM_ctr][i*NROI_REF[k]+j] = BOBatanhf(Corr_Matr[k][i][j]); /* fprintf(fout1,"%12.4f\t",FisherZ(Corr_Matr[k][i][j])); flat_matr[k][FM_ctr][i*NROI_REF[k]+j] = FisherZ(Corr_Matr[k][i][j]);*/ } fprintf(fout1,"%12.4f\n",BOBatanhf(Corr_Matr[k][i][j])); flat_matr[k][FM_ctr][i*NROI_REF[k]+j] = BOBatanhf(Corr_Matr[k][i][j]); /*fprintf(fout1,"%12.4f\n",FisherZ(Corr_Matr[k][i][j])); flat_matr[k][FM_ctr][i*NROI_REF[k]+j] = FisherZ(Corr_Matr[k][i][j]);*/ } } if(PART_CORR) { FM_ctr++; ParLab[FM_ctr] = strdup("PC"); fprintf(fout1,"# %s\n", "PC"); for( i=0 ; i<NROI_REF[k] ; i++ ) { for( j=0 ; j<NROI_REF[k]-1 ; j++ ) {// b/c we put '\n' after last fprintf(fout1,"%12.4f\t",PCorr_Matr[k][i][j]); flat_matr[k][FM_ctr][i*NROI_REF[k]+j] = PCorr_Matr[k][i][j]; } fprintf(fout1,"%12.4f\n",PCorr_Matr[k][i][j]); flat_matr[k][FM_ctr][i*NROI_REF[k]+j] = PCorr_Matr[k][i][j]; } FM_ctr++; ParLab[FM_ctr] = strdup("PCB"); fprintf(fout1,"# %s\n", "PCB"); for( i=0 ; i<NROI_REF[k] ; i++ ) { for( j=0 ; j<NROI_REF[k]-1 ; j++ ) {// b/c we put '\n' after last fprintf(fout1,"%12.4f\t",PBCorr_Matr[k][i][j]); flat_matr[k][FM_ctr][i*NROI_REF[k]+j] = PBCorr_Matr[k][i][j]; } fprintf(fout1,"%12.4f\n",PBCorr_Matr[k][i][j]); flat_matr[k][FM_ctr][i*NROI_REF[k]+j] = PBCorr_Matr[k][i][j]; } } fclose(fout1); // more nimling gset = SUMA_FloatVec_to_GDSET(flat_matr[k], Noutmat, NROI_REF[k]*NROI_REF[k], "full", ParLab, NULL, NULL, NULL); if( xyz = THD_roi_cmass(ROIS, k, ROI_LABELS_REF[k]+1, NROI_REF[k]) ) { if (!(SUMA_AddGDsetNodeListElement(gset, NULL, xyz, NULL, NULL, gdset_roi_names[k], NULL, NULL, NROI_REF[k]))) { ERROR_message("Failed to add node list"); exit(1); } free(xyz); } else { ERROR_message("Failed in THD_roi_cmass"); exit(1); } sprintf(OUT_gdset,"%s_%03d",prefix,k); GDSET_netngrlink = Network_link(SUMA_FnameGet( OUT_gdset, "f",NULL)); NI_add_to_group(gset->ngr, GDSET_netngrlink); NAME_gdset = SUMA_WriteDset_ns( OUT_gdset, gset, SUMA_ASCII_NIML, 1, 0); if (!NAME_gdset && !SUMA_IS_DSET_STDXXX_FORMAT(SUMA_ASCII_NIML)) { ERROR_message("Failed to write dataset."); exit(1); } else { if (NAME_gdset) SUMA_free(NAME_gdset); NAME_gdset = NULL; } SUMA_FreeDset(gset); gset=NULL; } if(TS_OUT) { for( k=0 ; k<HAVE_ROIS ; k++) { // each netw gets own file sprintf(OUT_grid,"%s_%03d.netts",prefix,k); if( (fout1 = fopen(OUT_grid, "w")) == NULL) { fprintf(stderr, "Error opening file %s.",OUT_grid); exit(19); } for( i=0 ; i<NROI_REF[k] ; i++ ) { if(TS_LABEL) fprintf(fout1,"%d\t",ROI_LABELS_REF[k][i+1]); // labels go 1...M for( j=0 ; j<Dim[3]-1 ; j++ ) // b/c we put '\n' after last one. fprintf(fout1,"%.3e\t",ROI_AVE_TS[k][i][j]); fprintf(fout1,"%.3e\n",ROI_AVE_TS[k][i][j]); } fclose(fout1); } } if( TS_INDIV ) { for( k=0 ; k<HAVE_ROIS ; k++) { // each netw gets own file sprintf(OUT_indiv0,"%s_%03d_INDIV", prefix, k); mkdir(OUT_indiv0, 0777); for( i=0 ; i<NROI_REF[k] ; i++ ) { sprintf(OUT_indiv,"%s/ROI_%03d.netts", OUT_indiv0,ROI_LABELS_REF[k][i+1]); if( (fout2 = fopen(OUT_indiv, "w")) == NULL) { fprintf(stderr, "\nError opening file '%s'.\n",OUT_indiv); exit(19); } for( j=0 ; j<Dim[3]-1 ; j++ ) // b/c we put '\n' after last one. fprintf(fout2,"%.3e\t",ROI_AVE_TS[k][i][j]); fprintf(fout2,"%.3e\n",ROI_AVE_TS[k][i][j]); fclose(fout2); } } } if( TS_WBCORR_r || TS_WBCORR_Z ) { INFO_message("Starting whole brain correlations."); i = WB_netw_corr( TS_WBCORR_r, TS_WBCORR_Z, HAVE_ROIS, prefix, NIFTI_OUT, NROI_REF, Dim, ROI_AVE_TS, ROI_LABELS_REF, insetTIME, mskd2, Nmask, argc, argv); } // ************************************************************ // ************************************************************ // Freeing // ************************************************************ // ************************************************************ DSET_delete(ROIS); free(ROIS); for ( i = 0 ; i < HAVE_ROIS ; i++ ) { for (j = 0; j < NROI_REF[i]; ++j) free(gdset_roi_names[i][j]); free(gdset_roi_names[i]); } free(gdset_roi_names); for ( i = 0 ; i < HAVE_ROIS ; i++ ) for ( j = 0 ; j < Noutmat ; j++ ) free(flat_matr[i][j]); for ( i = 0 ; i < HAVE_ROIS ; i++ ) free(flat_matr[i]); free(flat_matr); for( i=0 ; i<Noutmat ; i++) free(ParLab[i]); free(ParLab); if(LabTabStr) free(LabTabStr); if(roi_dtable) free(roi_dtable); for ( i=0 ; i<HAVE_ROIS ; i++ ) for ( j=0 ; j<NROI_REF[i]+1 ; j++ ) free(ROI_STR_LABELS[i][j]); for ( i=0 ; i<HAVE_ROIS ; i++ ) free(ROI_STR_LABELS[i]); free(ROI_STR_LABELS); DSET_delete(insetTIME); free(insetTIME); free(mskd2); free(Nlist); free(Dim); // need to free last because it's used for other arrays... free(prefix); // if(HAVE_SELROI) // free(SELROI); if(HAVE_ROIS >0) { for( i=0 ; i<HAVE_ROIS ; i++) { for( j=0 ; j<NROI_REF[i] ; j++) { free(ROI_LISTS[i][j]); free(ROI_AVE_TS[i][j]); free(Corr_Matr[i][j]); if(PART_CORR) { free(PCorr_Matr[i][j]); free(PBCorr_Matr[i][j]); } } free(ROI_LISTS[i]); free(ROI_AVE_TS[i]); free(Corr_Matr[i]); if(PART_CORR){ free(PCorr_Matr[i]); free(PBCorr_Matr[i]); } free(ROI_LABELS_REF[i]); free(INV_LABELS_REF[i]); free(ROI_COUNT[i]); } free(ROI_LISTS); free(ROI_AVE_TS); free(Corr_Matr); if(PART_CORR) { free(PCorr_Matr); free(PBCorr_Matr); } free(ROI_LABELS_REF); free(INV_LABELS_REF); free(ROI_COUNT); free(NROI_REF); free(INVROI_REF); } return 0; }
int main( int argc , char * argv[] ) { THD_3dim_dataset *dset, *outset=NULL; int iarg=1, npad = 0, extent=0; char *prefix=NULL, *iname=NULL; char *oijkext = NULL; FILE *fout_ijkext=NULL; int extent_ijk=0; int extent_ijk_midslice=0; int imid=0, jmid=0, kmid=0; int extent_xyz_midslice=0; float xmid=0, ymid=0, zmid=0; /*-- startup bureaucracy --*/ mainENTRY("3dAutobox main"); machdep(); AFNI_logger("3dAutobox",argc,argv); PRINT_VERSION("3dAutobox") ; /*-- read command line options --*/ iarg = 1 ; while( iarg < argc && argv[iarg][0] == '-' ){ if( strcmp(argv[iarg],"-help") == 0 || strcmp(argv[iarg],"-h") == 0){ help_autobox(); exit(0) ; } if( strcmp(argv[iarg],"-prefix") == 0 ){ prefix = argv[++iarg] ; if( !THD_filename_ok(prefix) ){ fprintf(stderr,"** 3dAutobox: Illegal string after -prefix!\n"); exit(1) ; } iarg++ ; continue ; } if( strcmp(argv[iarg],"-input") == 0 ){ iname = argv[++iarg] ; // This is a bad check, because it doesn't permit subbrick // selection! Will do check later. /*if( !THD_filename_ok(iname) ){ fprintf(stderr,"** 3dAutobox: Illegal string after -input!\n"); exit(1) ; }*/ iarg++ ; continue ; } if( strcmp(argv[iarg],"-noclust") == 0 ){ MRI_autobbox_clust(0) ; /* turn of clustering and clipping */ THD_autobbox_clip(0) ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-npad") == 0 ){ npad = (int)strtod(argv[++iarg],NULL) ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-extent_ijk") == 0 ){ extent_ijk = 1 ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-extent_ijk_to_file") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-extent_ijk_to_file'\n") ; oijkext = argv[iarg]; iarg++ ; continue ; } if( strcmp(argv[iarg],"-extent_ijk_midslice") == 0 ){ extent_ijk_midslice = 1 ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-extent_xyz_midslice") == 0 ){ extent_xyz_midslice = 1 ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-extent") == 0 ){ extent = 1 ; iarg++ ; continue ; } /*- washappenin, dood? -*/ ERROR_message("** 3dAutobox: %s makes no sense here.\n", argv[iarg]) ; suggest_best_prog_option(argv[0], argv[iarg]); exit(1); } if( argc < 2){ help_autobox(); exit(0); } /* got input ? */ if( iarg == argc-1 ) iname = argv[iarg] ; else if (iarg != argc) ERROR_exit("** 3dAutobox: %s is nonsense on the line \n" " I know you're John; stop pretending you have an accent!", argv[iarg]) ; if( !iname ) ERROR_exit("** 3dAutobox: Where is my input?") ; /*-- read data --*/ dset = THD_open_dataset(iname); // Check here instead of after -input. if( dset == NULL ) ERROR_exit("Can't open time series dataset '%s'.",iname); CHECK_OPEN_ERROR(dset,iname); if( DSET_BRICK_TYPE(dset,0) != MRI_short && DSET_BRICK_TYPE(dset,0) != MRI_byte && DSET_BRICK_TYPE(dset,0) != MRI_float ) ERROR_exit("** ILLEGAL dataset type: %s :-(", MRI_type_name[DSET_BRICK_TYPE(dset,0)]) ; DSET_load(dset) ; CHECK_LOAD_ERROR(dset) ; { int nx=DSET_NX(dset), ny=DSET_NY(dset), nz=DSET_NZ(dset), nxy=nx*ny ; int xm=-1,xp=-1,ym=-1,yp=-1,zm=-1,zp=-1; THD_autobbox( dset , &xm,&xp , &ym,&yp , &zm,&zp, NULL ) ; xm -= npad; ym -= npad; zm -= npad; /* for LRF */ xp += npad; yp += npad; zp += npad; INFO_message("Auto bbox: x=%d..%d y=%d..%d z=%d..%d\n", xm,xp,ym,yp,zm,zp ) ; // [PT: Oct 18, 2018] New output text file, if desired if( oijkext ) { if( (fout_ijkext = fopen(oijkext, "w")) == NULL ) { fprintf(stderr, "\n\nError opening file %s.\n", oijkext); exit(1); } fprintf( fout_ijkext, "%8d %8d %8d %8d %8d %8d\n", xm, xp, ym, yp, zm, zp ); fclose(fout_ijkext); INFO_message("Wrote ijk extents file: %s", oijkext); } if( extent_ijk ) printf( "%8d %8d %8d %8d %8d %8d\n", xm, xp, ym, yp, zm, zp ); if( extent_ijk_midslice ) { imid = (xm + xp) / 2; // integer division fine, b/c we need ints jmid = (ym + yp) / 2; kmid = (zm + zp) / 2; printf( "%8d %8d %8d\n", imid, jmid, kmid ); } if ( (extent && !prefix) || (extent_xyz_midslice && !prefix) ) prefix = "EXTENT_ONLY"; if( prefix ){ outset = THD_zeropad( dset , -xm, xp-nx+1, -ym, yp-ny+1, -zm, zp-nz+1, prefix , ZPAD_IJK ) ; if( THD_deathcon() && THD_is_file(DSET_HEADNAME(outset)) ) ERROR_exit("3dAutobox: output file %s already exists :-(", DSET_HEADNAME(outset) ) ; if( outset == NULL ) ERROR_exit("3dAutobox: Some error occurred in processing :-(") ; tross_Copy_History( dset , outset ) ; /* 31 Jan 2001 - RWCox */ tross_Make_History( "3dAutobox" , argc,argv , outset ) ; if (!strstr(prefix,"EXTENT_ONLY")) { DSET_write(outset) ; INFO_message("3dAutobox: output dataset = %s", DSET_BRIKNAME(outset)) ; } if (extent) { float RL_AP_IS[6]; THD_dset_extent(outset, '-', RL_AP_IS); printf("Extent auto bbox: R=%f L=%f A=%f P=%f I=%f S=%f\n", RL_AP_IS[0],RL_AP_IS[1], RL_AP_IS[2],RL_AP_IS[3], RL_AP_IS[4],RL_AP_IS[5] ) ; } if( extent_xyz_midslice ) { INFO_message("aaa" ); float RL_AP_IS2[6]; THD_dset_extent(outset, '-', RL_AP_IS2); xmid = (RL_AP_IS2[0] + RL_AP_IS2[1]) / 2.; ymid = (RL_AP_IS2[2] + RL_AP_IS2[3]) / 2.; zmid = (RL_AP_IS2[4] + RL_AP_IS2[5]) / 2.; printf( "%10.5f %10.5f %10.5f\n", xmid, ymid, zmid ); } } } exit(0) ; }
int main( int argc , char *argv[] ) { int iarg , ii,jj,kk,mm , nvec , nx=0,ny , ff , vlen=4 ; MRI_IMAGE *tim , *vsim=NULL ; MRI_IMARR *tar ; char **vecnam , *tnam ; float *far , **tvec , *vsig=NULL , xsig,ysig ; float_quad qcor ; float_pair pci ; float corst, cor025, cor500, cor975 ; char fmt[256] ; int cormeth=0 ; /* 0=Pearson, 1=Spearman, 2=Quadrant, 3=Kendall tau_b */ float (*corfun)(int,float *,float *) ; /*-- start the AFNI machinery --*/ mainENTRY("1dCorrelate main") ; machdep() ; /* check for options */ iarg = 1 ; nvec = 0 ; while( iarg < argc && argv[iarg][0] == '-' ){ /* I get by with a little help from my friends? */ if( strcmp(argv[iarg],"-help") == 0 || strcmp(argv[iarg],"-h") == 0){ usage_1dCorrelate(strlen(argv[iarg])>3 ? 2:1); exit(0) ; } /*--- methods ---*/ if( toupper(argv[iarg][1]) == 'P' ){ cormeth = 0 ; iarg++ ; continue ; } if( toupper(argv[iarg][1]) == 'S' ){ cormeth = 1 ; iarg++ ; continue ; } if( toupper(argv[iarg][1]) == 'Q' ){ cormeth = 2 ; iarg++ ; continue ; } if( toupper(argv[iarg][1]) == 'K' ){ cormeth = 3 ; iarg++ ; continue ; } if( toupper(argv[iarg][1]) == 'T' ){ cormeth = 4 ; iarg++ ; continue ; } if( toupper(argv[iarg][1]) == 'U' ){ cormeth = 5 ; iarg++ ; continue ; } /*--- set nboot ---*/ if( strcasecmp(argv[iarg],"-nboot") == 0 || strcasecmp(argv[iarg],"-num") == 0 ){ iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-nboot'") ; nboot = (int)strtod(argv[iarg],NULL) ; if( nboot < NBMIN ){ WARNING_message("Replacing -nboot %d with %d",nboot,NBMIN) ; nboot = NBMIN ; } iarg++ ; continue ; } /*--- set alpha ---*/ if( strcasecmp(argv[iarg],"-alpha") == 0 ){ iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-alpha'") ; alpha = (float)strtod(argv[iarg],NULL) ; if( alpha < 1.0f ){ WARNING_message("Replacing -alpha %.1f with 1",alpha) ; alpha = 0.01f ; } else if( alpha > 20.0f ){ WARNING_message("Replacing -alpha %.1f with 20",alpha) ; alpha = 0.20f ; } else { alpha *= 0.01f ; /* convert from percent to fraction */ } iarg++ ; continue ; } /*--- block resampling ---*/ if( strcasecmp(argv[iarg],"-blk") == 0 || strcasecmp(argv[iarg],"-block") == 0 ){ doblk = 1 ; iarg++ ; continue ; } if( strcasecmp(argv[iarg],"-vsig") == 0 ){ if( vsim != NULL ) ERROR_exit("Can't use -vsig twice!") ; if( ++iarg >= argc ) ERROR_exit("Need argument after -vsig") ; vsim = mri_read_1D(argv[iarg]) ; if( vsim == NULL ) ERROR_exit("Can't read -vsig file '%s'",argv[iarg]) ; iarg++ ; continue ; } /*--- user should be flogged ---*/ ERROR_message("Monstrously illegal option '%s'",argv[iarg]) ; suggest_best_prog_option(argv[0], argv[iarg]); exit(1); } /*--- user should be flogged twice ---*/ if( argc < 2 ){ usage_1dCorrelate(1) ; exit(0) ; } if( iarg == argc ) ERROR_exit("No 1D files on command line!?\n") ; /* the function to compute the correlation */ corfun = cor_func[cormeth] ; /* check and assemble list of input 1D files */ ff = iarg ; INIT_IMARR(tar) ; for( ; iarg < argc ; iarg++ ){ tim = mri_read_1D( argv[iarg] ) ; if( tim == NULL ) ERROR_exit("Can't read 1D file '%s'",argv[iarg]) ; if( nx == 0 ){ nx = tim->nx ; if( nx < 3 ) ERROR_exit("1D file '%.77s' length=%d is less than 3",argv[iarg],nx) ; else if( nx < 7 ) WARNING_message("1D file '%.77s' length=%d is less than 7",argv[iarg],nx) ; } else if( tim->nx != nx ){ ERROR_exit("Length of 1D file '%.77s' [%d] doesn't match first file [%d]", argv[iarg] , tim->nx , nx ); } nvec += tim->ny ; ADDTO_IMARR(tar,tim) ; } /* user is really an idiot -- flogging's too good for him */ if( nvec < 2 ) ERROR_exit("Must have at least 2 input columns!") ; if( nx < 20 && doblk ){ doblk = 0 ; WARNING_message("Column length %d < 20 ==> cannot use block resampling",nx) ; } if( vsim != NULL ){ if( vsim->nvox < nvec ) ERROR_exit("-vsig file only has %d entries, but needs at least %d",vsim->nvox,nvec) ; vsig = MRI_FLOAT_PTR(vsim) ; } /* create vectors from 1D files */ tvec = (float **)malloc( sizeof(float *)*nvec ) ; vecnam = (char **)malloc( sizeof(char *)*nvec ) ; for( jj=0 ; jj < nvec ; jj++ ){ tvec[jj] = (float *)malloc( sizeof(float)*nx ) ; vecnam[jj] = (char *)malloc(sizeof(char)*THD_MAX_NAME) ; } /* copy data into new space, create output labels, check for stoopiditees */ for( kk=mm=0 ; mm < IMARR_COUNT(tar) ; mm++ ){ tim = IMARR_SUBIM(tar,mm) ; far = MRI_FLOAT_PTR(tim) ; tnam = tim->name ; if( tnam == NULL ) tnam = "File" ; for( jj=0 ; jj < tim->ny ; jj++,kk++ ){ for( ii=0 ; ii < nx ; ii++ ) tvec[kk][ii] = far[ii+jj*nx] ; sprintf(vecnam[kk],"%s[%d]",THD_trailname(tnam,0),jj) ; /* vector name */ iarg = strlen(vecnam[kk]) ; vlen = MAX(vlen,iarg) ; if( THD_is_constant(nx,tvec[kk]) ) ERROR_exit("Column %s is constant!",vecnam[kk]) ; } } DESTROY_IMARR(tar) ; /*--- Print a beeyootiful header ---*/ printf("# %s correlation [n=%d #col=%d]\n",cor_name[cormeth],nx,nvec) ; sprintf(fmt,"# %%-%ds %%-%ds",vlen,vlen) ; printf(fmt,"Name","Name") ; printf(" Value BiasCorr %5.2f%% %5.2f%%",50.0f*alpha,100.0f-50.0f*alpha) ; if( cormeth == 0 ) /* Pearson */ printf(" N:%5.2f%% N:%5.2f%%",50.0f*alpha,100.0f-50.0f*alpha) ; printf("\n") ; printf("# ") ; for( ii=0 ; ii < vlen ; ii++ ) printf("-") ; printf(" ") ; for( ii=0 ; ii < vlen ; ii++ ) printf("-") ; printf(" ") ; printf(" --------") ; printf(" --------") ; printf(" --------") ; printf(" --------") ; if( cormeth == 0 ){ printf(" --------") ; printf(" --------") ; } printf("\n") ; if( cormeth != 0 ) /* non-Pearson */ sprintf(fmt," %%-%ds %%-%ds %%+8.5f %%+8.5f %%+8.5f %%+8.5f\n",vlen,vlen) ; else /* Pearson */ sprintf(fmt," %%-%ds %%-%ds %%+8.5f %%+8.5f %%+8.5f %%+8.5f %%+8.5f %%+8.5f\n",vlen,vlen) ; /*--- Do some actual work for a suprising change ---*/ for( jj=0 ; jj < nvec ; jj++ ){ /* loops over column pairs */ for( kk=jj+1 ; kk < nvec ; kk++ ){ if( vsig != NULL ){ xsig = vsig[jj]; ysig = vsig[kk]; } else { xsig = ysig = 0.0f; } qcor = Corrboot( nx, tvec[jj], tvec[kk], xsig, ysig, corfun ) ; /* outsourced */ corst = qcor.a ; cor025 = qcor.b ; cor500 = qcor.c ; cor975 = qcor.d ; if( cormeth == 0 ){ /* Pearson */ pci = PCorrCI( nx , corst , alpha ) ; printf(fmt, vecnam[jj], vecnam[kk], corst, cor500, cor025, cor975, pci.a,pci.b ) ; } else { /* all other methods */ printf(fmt, vecnam[jj], vecnam[kk], corst, cor500, cor025, cor975 ) ; } } } /* Finished -- go back to watching Star Trek reruns -- Tribbles ahoy, Cap'n! */ exit(0) ; }
int main(int argc, char *argv[]) { int i, k, ii; int iarg; char *prefix=NULL; char *maskname=NULL; char *gradsname=NULL; char *dtsname=NULL; THD_3dim_dataset *MASK=NULL; THD_3dim_dataset *DTS=NULL; MRI_IMAGE *GRADS=NULL, *GRADS_IN=NULL; int Ngrads=0, Nfull=0; int Nvox=-1; // tot number vox int Dim[3]={0,0,0}; // dim in each dir float NOISESCALE_DWI = -1.; float NOISESCALE_B0 = -1; float S0 = 1000.; float bval = 1.; int NOISE_IN_S0 = 0; byte *mskd2=NULL; // not great, but another format of mask float **dwi=NULL; THD_3dim_dataset *DWI_OUT=NULL; const gsl_rng_type * T; gsl_rng *r; long seed; srand(time(0)); seed = time(NULL) ; gsl_rng_env_setup(); T = gsl_rng_default; r = gsl_rng_alloc (T); gsl_rng_set (r, seed); // ################################################################### // ######################### load ################################## // ################################################################### mainENTRY("3dDTtoNoisyDWI"); machdep(); if (argc == 1) { usage_DTtoNoisyDWI(1); exit(0); } iarg = 1; while( iarg < argc && argv[iarg][0] == '-' ){ if( strcmp(argv[iarg],"-help") == 0 || strcmp(argv[iarg],"-h") == 0 ) { usage_DTtoNoisyDWI(strlen(argv[iarg])>3 ? 2:1); exit(0); } if( strcmp(argv[iarg],"-dt_in") == 0) { iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-eig_vecs'"); dtsname = strdup(argv[iarg]) ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-prefix") == 0 ){ iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-prefix'"); prefix = strdup(argv[iarg]) ; if( !THD_filename_ok(prefix) ) ERROR_exit("Illegal name after '-prefix'"); iarg++ ; continue ; } if( strcmp(argv[iarg],"-mask") == 0) { iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-mask'"); maskname = strdup(argv[iarg]) ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-grads") == 0) { iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-mask'"); gradsname = strdup(argv[iarg]) ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-noise_DWI") == 0) { if( ++iarg >= argc ) ERROR_exit("Need numerical argument after '-noise_DWI'"); NOISESCALE_DWI = atof(argv[iarg]); iarg++ ; continue ; } if( strcmp(argv[iarg],"-noise_B0") == 0) { if( ++iarg >= argc ) ERROR_exit("Need numerical argument after '-noise_B0'"); NOISESCALE_B0 = atof(argv[iarg]); iarg++ ; continue ; } if( strcmp(argv[iarg],"-S0") == 0) { if( ++iarg >= argc ) ERROR_exit("Need numerical argument after '-S0'"); S0 = atof(argv[iarg]); if(S0 <= 0 ) ERROR_exit("The '-S0' value must be >0."); iarg++ ; continue ; } if( strcmp(argv[iarg],"-bval") == 0) { if( ++iarg >= argc ) ERROR_exit("Need numerical argument after '-bval'"); bval = atof(argv[iarg]); if(bval <= 0 ) ERROR_exit("The '-bval' value must be >0."); iarg++ ; continue ; } ERROR_message("Bad option '%s'\n",argv[iarg]) ; suggest_best_prog_option(argv[0], argv[iarg]); exit(1); } // ################################################################### // #################### some checks ############################### // ################################################################### if(!prefix) ERROR_exit("Need to give a '-prefix'."); if(!dtsname) ERROR_exit("Need to input diffusion tensor file after '-dt_in'."); if(!gradsname) ERROR_exit("Need to input gradient file after '-grads'."); if( NOISESCALE_DWI<0 ) ERROR_exit("Fractional noise value after '-snr0' needs to be >0. " "It sets the noise scale of ref signal S0."); if(NOISESCALE_DWI > 0) INFO_message("You have chosen an SNR0 of approximately %.2f for DWIs", 1./NOISESCALE_DWI); else INFO_message("You have noiseless (i.e., infinite SNR) set of DWIs"); if( NOISESCALE_B0 < 0 ) NOISESCALE_B0 = NOISESCALE_DWI; if(NOISESCALE_B0 > 0) INFO_message("You have chosen an SNR0 of approximately %.2f for the B0", 1./NOISESCALE_B0); else INFO_message("You have noiseless (i.e., infinite SNR) reference B0."); // ################################################################### if(dtsname) { DTS = THD_open_dataset(dtsname); DSET_load(DTS); CHECK_LOAD_ERROR(DTS); if( 6 != DSET_NVALS(DTS) ) ERROR_exit("DT file '%s' must have 6 bricks-- " "it has %d bricks!", dtsname, DSET_NVALS(DTS)); } Nvox = DSET_NVOX(DTS); Dim[0] = DSET_NX(DTS); Dim[1] = DSET_NY(DTS); Dim[2] = DSET_NZ(DTS); if(Nvox<0) ERROR_exit("Error reading Nvox from eigenvalue file."); mskd2 = (byte *)calloc(Nvox,sizeof(byte)); if( (mskd2 == NULL)) { fprintf(stderr, "\n\n MemAlloc failure (masks).\n\n"); exit(122); } if(maskname) { MASK = THD_open_dataset(maskname); DSET_load(MASK); CHECK_LOAD_ERROR(MASK); if( 1 != DSET_NVALS(MASK) ) ERROR_exit("Mask file '%s' is not scalar-- " "it has %d bricks!", maskname, DSET_NVALS(MASK)); for( k=0 ; k<Nvox ; k++ ) if (THD_get_voxel(MASK, k, 0) > 0 ) mskd2[k] = 1; DSET_delete(MASK); free(MASK); free(maskname); } else { for( k=0 ; k<Nvox ; k++ ) if( fabs(THD_get_voxel(DTS,k,0) > EPS_V) ) mskd2[k] = 1; } GRADS_IN = mri_read_1D (gradsname); GRADS = mri_transpose(GRADS_IN); // get rid of autotranspose... if (GRADS == NULL) ERROR_exit("Error reading gradient vector file"); mri_free(GRADS_IN); Ngrads = GRADS->ny; if(Ngrads < 6) ERROR_exit("Too few grads (there appear to be only %d).",Ngrads); if(GRADS->nx !=3 ) ERROR_exit("Wrong number of columns in the grad file: " " am reading %d instead of 3.",GRADS->nx); Nfull = Ngrads+1; INFO_message("Have surmised there are %d total grads; " "output file will have %d bricks", Ngrads,Nfull); dwi = calloc(Nfull,sizeof(dwi)); for(i=0 ; i<Nfull ; i++) dwi[i] = calloc( Nvox,sizeof(float)); INFO_message("Calculating the DWIs."); i = RicianNoiseDWIs( dwi, Nvox, Ngrads, DTS, NOISESCALE_DWI, NOISESCALE_B0, GRADS, mskd2, S0, bval, r); INFO_message("Writing the DWIs."); DWI_OUT = EDIT_empty_copy( DTS ); EDIT_dset_items(DWI_OUT, ADN_nvals, Nfull, ADN_datum_all, MRI_float , ADN_prefix, prefix, ADN_none ); for( i=0; i<Nfull ; i++) { EDIT_substitute_brick(DWI_OUT, i, MRI_float, dwi[i]); dwi[i]=NULL; } THD_load_statistics( DWI_OUT ); if( !THD_ok_overwrite() && THD_is_ondisk(DSET_HEADNAME(DWI_OUT)) ) ERROR_exit("Can't overwrite existing dataset '%s'", DSET_HEADNAME(DWI_OUT)); tross_Make_History("3dDTtoNoisyDWI", argc, argv, DWI_OUT); THD_write_3dim_dataset(NULL, NULL, DWI_OUT, True); DSET_delete(DWI_OUT); free(DWI_OUT); // ################################################################# // ########################## free ############################### // ################################################################# DSET_delete(DTS); free(DTS); for( i=0 ; i<Nfull ; i++) free(dwi[i]); free(dwi); free(prefix); free(gradsname); free(dtsname); mri_free(GRADS); return 0; }
int main( int argc , char *argv[] ) { THD_3dim_dataset *old_dset , *new_dset ; /* input and output datasets */ THD_3dim_dataset *mask_dset=NULL ; float mask_bot=666.0 , mask_top=-666.0 ; byte *cmask=NULL ; int ncmask=0 ; byte *mmm = NULL ; int mcount=0, verb=0; int nopt, nbriks, ii ; int addBriks = 0 ; /* n-1 sub-bricks out */ int fullBriks = 0 ; /* n sub-bricks out */ int tsout = 0 ; /* flag to output a time series (not a stat bucket) */ int numMultBriks,methIndex,brikIndex; /*----- Help the pitiful user? -----*/ /* bureaucracy */ mainENTRY("3dTstat main"); machdep(); AFNI_logger("3dTstat",argc,argv); PRINT_VERSION("3dTstat"); AUTHOR("KR Hammett & RW Cox"); /*--- scan command line for options ---*/ if (argc == 1) { usage_3dTstat(1); exit(0); } /* Bob's help shortcut */ nopt = 1 ; nbriks = 0 ; nmeths = 0 ; verb = 0; while( nopt < argc && argv[nopt][0] == '-' ){ if (strcmp(argv[nopt], "-h") == 0 || strcmp(argv[nopt], "-help") == 0) { usage_3dTstat(strlen(argv[nopt]) > 3 ? 2:1); exit(0); } if( strcmp(argv[nopt],"-verb") == 0 ){ verb++ ; nopt++ ; continue ; } /*-- methods --*/ if( strcasecmp(argv[nopt],"-centromean") == 0 ){ /* 01 Nov 2010 */ meth[nmeths++] = METH_CENTROMEAN ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-bmv") == 0 ){ meth[nmeths++] = METH_BMV ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-median") == 0 ){ meth[nmeths++] = METH_MEDIAN ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-nzmedian") == 0 ){ meth[nmeths++] = METH_NZMEDIAN ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-DW") == 0 ){ meth[nmeths++] = METH_DW ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-zcount") == 0 ){ meth[nmeths++] = METH_ZCOUNT ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-nzcount") == 0 ){ meth[nmeths++] = METH_NZCOUNT ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-MAD") == 0 ){ meth[nmeths++] = METH_MAD ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-mean") == 0 ){ meth[nmeths++] = METH_MEAN ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-sum") == 0 ){ meth[nmeths++] = METH_SUM ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-sos") == 0 ){ meth[nmeths++] = METH_SUM_SQUARES ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-abssum") == 0 ){ meth[nmeths++] = METH_ABSSUM ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-slope") == 0 ){ meth[nmeths++] = METH_SLOPE ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-stdev") == 0 || strcasecmp(argv[nopt],"-sigma") == 0 ){ meth[nmeths++] = METH_SIGMA ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-cvar") == 0 ){ meth[nmeths++] = METH_CVAR ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-cvarinv") == 0 ){ meth[nmeths++] = METH_CVARINV ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-stdevNOD") == 0 || strcasecmp(argv[nopt],"-sigmaNOD") == 0 ){ /* 07 Dec 2001 */ meth[nmeths++] = METH_SIGMA_NOD ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-cvarNOD") == 0 ){ /* 07 Dec 2001 */ meth[nmeths++] = METH_CVAR_NOD ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-cvarinvNOD") == 0 ){ meth[nmeths++] = METH_CVARINVNOD ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-min") == 0 ){ meth[nmeths++] = METH_MIN ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-max") == 0 ){ meth[nmeths++] = METH_MAX ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-absmax") == 0 ){ meth[nmeths++] = METH_ABSMAX ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-signed_absmax") == 0 ){ meth[nmeths++] = METH_SIGNED_ABSMAX ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-argmin") == 0 ){ meth[nmeths++] = METH_ARGMIN ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-argmin1") == 0 ){ meth[nmeths++] = METH_ARGMIN1 ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-argmax") == 0 ){ meth[nmeths++] = METH_ARGMAX ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-argmax1") == 0 ){ meth[nmeths++] = METH_ARGMAX1 ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-argabsmax") == 0 ){ meth[nmeths++] = METH_ARGABSMAX ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-argabsmax1") == 0 ){ meth[nmeths++] = METH_ARGABSMAX1; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-duration") == 0 ){ meth[nmeths++] = METH_DURATION ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-onset") == 0 ){ meth[nmeths++] = METH_ONSET ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-offset") == 0 ){ meth[nmeths++] = METH_OFFSET ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-centroid") == 0 ){ meth[nmeths++] = METH_CENTROID ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-centduration") == 0 ){ meth[nmeths++] = METH_CENTDURATION ; nbriks++ ; nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-nzmean") == 0 ){ meth[nmeths++] = METH_NZMEAN ; nbriks++ ; nopt++ ; continue ; } if( strncmp(argv[nopt],"-mask",5) == 0 ){ if( mask_dset != NULL ) ERROR_exit("Cannot have two -mask options!\n") ; if( nopt+1 >= argc ) ERROR_exit("-mask option requires a following argument!\n"); mask_dset = THD_open_dataset( argv[++nopt] ) ; if( mask_dset == NULL ) ERROR_exit("Cannot open mask dataset!\n") ; if( DSET_BRICK_TYPE(mask_dset,0) == MRI_complex ) ERROR_exit("Cannot deal with complex-valued mask dataset!\n"); nopt++ ; continue ; } if( strncmp(argv[nopt],"-mrange",5) == 0 ){ if( nopt+2 >= argc ) ERROR_exit("-mrange option requires 2 following arguments!\n"); mask_bot = strtod( argv[++nopt] , NULL ) ; mask_top = strtod( argv[++nopt] , NULL ) ; if( mask_top < mask_top ) ERROR_exit("-mrange inputs are illegal!\n") ; nopt++ ; continue ; } if( strcmp(argv[nopt],"-cmask") == 0 ){ /* 16 Mar 2000 */ if( nopt+1 >= argc ) ERROR_exit("-cmask option requires a following argument!\n"); cmask = EDT_calcmask( argv[++nopt] , &ncmask, 0 ) ; if( cmask == NULL ) ERROR_exit("Can't compute -cmask!\n"); nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-autocorr") == 0 ){ meth[nmeths++] = METH_AUTOCORR ; if( ++nopt >= argc ) ERROR_exit("-autocorr needs an argument!\n"); meth[nmeths++] = atoi(argv[nopt++]); if (meth[nmeths - 1] == 0) { addBriks++; } else { nbriks+=meth[nmeths - 1] ; } continue ; } if( strcasecmp(argv[nopt],"-autoreg") == 0 ){ meth[nmeths++] = METH_AUTOREGP ; if( ++nopt >= argc ) ERROR_exit("-autoreg needs an argument!\n"); meth[nmeths++] = atoi(argv[nopt++]); if (meth[nmeths - 1] == 0) { addBriks++; } else { nbriks+=meth[nmeths - 1] ; } continue ; } if( strcasecmp(argv[nopt],"-accumulate") == 0 ){ /* 4 Mar 2008 [rickr] */ meth[nmeths++] = METH_ACCUMULATE ; meth[nmeths++] = -1; /* flag to add N (not N-1) output bricks */ fullBriks++; tsout = 1; /* flag to output a timeseries */ nopt++ ; continue ; } if( strcasecmp(argv[nopt],"-l2norm") == 0 ){ /* 07 Jan 2013 [rickr] */ meth[nmeths++] = METH_L2_NORM ; nbriks++ ; nopt++ ; continue ; } /*-- prefix --*/ if( strcasecmp(argv[nopt],"-prefix") == 0 ){ if( ++nopt >= argc ) ERROR_exit("-prefix needs an argument!\n"); MCW_strncpy(prefix,argv[nopt],THD_MAX_PREFIX) ; if( !THD_filename_ok(prefix) ) ERROR_exit("%s is not a valid prefix!\n",prefix); nopt++ ; continue ; } /*-- tdiff --*/ if( strcasecmp(argv[nopt],"-tdiff") == 0 ){ /* 25 May 2011 */ do_tdiff = 1 ; nopt++ ; continue ; } /*-- nscale --*/ if( strcasecmp(argv[nopt],"-nscale") == 0 ){ /* 25 May 2011 */ nscale = 1 ; nopt++ ; continue ; } /*-- datum --*/ if( strcasecmp(argv[nopt],"-datum") == 0 ){ if( ++nopt >= argc ) ERROR_exit("-datum needs an argument!\n"); if( strcasecmp(argv[nopt],"short") == 0 ){ datum = MRI_short ; } else if( strcasecmp(argv[nopt],"float") == 0 ){ datum = MRI_float ; } else if( strcasecmp(argv[nopt],"byte") == 0 ){ datum = MRI_byte ; } else { ERROR_exit("-datum of type '%s' is not supported!\n", argv[nopt] ) ; } nopt++ ; continue ; } /* base percentage for duration calcs */ if (strcasecmp (argv[nopt], "-basepercent") == 0) { if( ++nopt >= argc ) ERROR_exit("-basepercent needs an argument!\n"); basepercent = strtod(argv[nopt], NULL); if(basepercent>1) basepercent /= 100.0; /* assume integer percent if >1*/ nopt++; continue; } /*-- Quien sabe'? --*/ ERROR_message("Unknown option: %s\n",argv[nopt]) ; suggest_best_prog_option(argv[0], argv[nopt]); exit(1); } if (argc < 2) { ERROR_message("Too few options, use -help for details"); exit(1); } /*--- If no options selected, default to single stat MEAN -- KRH ---*/ if (nmeths == 0) nmeths = 1; if (nbriks == 0 && addBriks == 0 && fullBriks == 0) nbriks = 1; /*----- read input dataset -----*/ if( nopt >= argc ) ERROR_exit(" No input dataset!?") ; old_dset = THD_open_dataset( argv[nopt] ) ; if( !ISVALID_DSET(old_dset) ) ERROR_exit("Can't open dataset %s\n",argv[nopt]); nopt++ ; if( nopt < argc ) WARNING_message("Trailing datasets on command line ignored: %s ...",argv[nopt]) ; if( DSET_NVALS(old_dset) == 1 ){ WARNING_message("Input dataset has 1 sub-brick ==> -tdiff is turned off") ; do_tdiff = 0 ; } /* no input volumes is bad, 1 volume applies to only certain methods */ /* 2 Nov 2010 [rickr] */ if( DSET_NVALS(old_dset) == 0 ) { ERROR_exit("Time series is of length 0?\n") ; } else if( DSET_NVALS(old_dset) == 1 || (do_tdiff && DSET_NVALS(old_dset)==2) ) { int methOK, OK = 1; /* see if each method is valid for nvals == 1 */ for( methIndex = 0; methIndex < nmeths; methIndex++ ) { methOK = 0; for( ii = 0; ii < NUM_1_INPUT_METHODS; ii++ ) { if( meth[methIndex] == valid_1_input_methods[ii] ) { methOK = 1; break; } } if( ! methOK ) ERROR_exit("Can't use dataset with %d values per voxel!" , DSET_NVALS(old_dset) ) ; } /* tell the library function that this case is okay */ g_thd_maker_allow_1brick = 1; } if( DSET_NUM_TIMES(old_dset) < 2 ){ WARNING_message("Input dataset is not 3D+time; assuming TR=1.0") ; EDIT_dset_items( old_dset , ADN_ntt , DSET_NVALS(old_dset) , ADN_ttorg , 0.0 , ADN_ttdel , 1.0 , ADN_tunits , UNITS_SEC_TYPE , NULL ) ; } /* If one or more of the -autocorr/-autoreg options was called with */ /* an argument of 0, then I'll now add extra BRIKs for the N-1 data */ /* output points for each. */ nbriks += ((DSET_NVALS(old_dset)-1) * addBriks); nbriks += ((DSET_NVALS(old_dset) ) * fullBriks); /* ------------- Mask business -----------------*/ if( mask_dset == NULL ){ mmm = NULL ; if( verb ) INFO_message("%d voxels in the entire dataset (no mask)\n", DSET_NVOX(old_dset)) ; } else { if( DSET_NVOX(mask_dset) != DSET_NVOX(old_dset) ) ERROR_exit("Input and mask datasets are not same dimensions!\n"); mmm = THD_makemask( mask_dset , 0 , mask_bot, mask_top ) ; mcount = THD_countmask( DSET_NVOX(old_dset) , mmm ) ; if( mcount <= 0 ) ERROR_exit("No voxels in the mask!\n") ; if( verb ) INFO_message("%d voxels in the mask\n",mcount) ; DSET_delete(mask_dset) ; } if( cmask != NULL ){ if( ncmask != DSET_NVOX(old_dset) ) ERROR_exit("Input and cmask datasets are not same dimensions!\n"); if( mmm != NULL ){ for( ii=0 ; ii < DSET_NVOX(old_dset) ; ii++ ) mmm[ii] = (mmm[ii] && cmask[ii]) ; free(cmask) ; mcount = THD_countmask( DSET_NVOX(old_dset) , mmm ) ; if( mcount <= 0 ) ERROR_exit("No voxels in the mask+cmask!\n") ; if( verb ) INFO_message("%d voxels in the mask+cmask\n",mcount) ; } else { mmm = cmask ; mcount = THD_countmask( DSET_NVOX(old_dset) , mmm ) ; if( mcount <= 0 ) ERROR_exit("No voxels in the cmask!\n") ; if( verb ) INFO_message("%d voxels in the cmask\n",mcount) ; } } /*------------- ready to compute new dataset -----------*/ new_dset = MAKER_4D_to_typed_fbuc( old_dset , /* input dataset */ prefix , /* output prefix */ datum , /* output datum */ 0 , /* ignore count */ 0 , /* can't detrend in maker function KRH 12/02*/ nbriks , /* number of briks */ STATS_tsfunc , /* timeseries processor */ NULL, /* data for tsfunc */ mmm, nscale ) ; if( new_dset != NULL ){ tross_Copy_History( old_dset , new_dset ) ; tross_Make_History( "3dTstat" , argc,argv , new_dset ) ; for (methIndex = 0,brikIndex = 0; methIndex < nmeths; methIndex++, brikIndex++) { if ((meth[methIndex] == METH_AUTOCORR) || (meth[methIndex] == METH_ACCUMULATE) || (meth[methIndex] == METH_AUTOREGP)) { numMultBriks = meth[methIndex+1]; /* note: this looks like it should be NV-1 4 Mar 2008 [rickr] */ if (numMultBriks == 0) numMultBriks = DSET_NVALS(old_dset)-1; /* new flag for NVALS [rickr] */ if (numMultBriks == -1) numMultBriks = DSET_NVALS(old_dset); for (ii = 1; ii <= numMultBriks; ii++) { char tmpstr[25]; if (meth[methIndex] == METH_AUTOREGP) { sprintf(tmpstr,"%s[%d](%d)",meth_names[meth[methIndex]], numMultBriks,ii); } else { sprintf(tmpstr,"%s(%d)",meth_names[meth[methIndex]],ii); } EDIT_BRICK_LABEL(new_dset, (brikIndex + ii - 1), tmpstr) ; } methIndex++; brikIndex += numMultBriks - 1; } else { EDIT_BRICK_LABEL(new_dset, brikIndex, meth_names[meth[methIndex]]) ; } } if( tsout ) /* then change output to a time series */ EDIT_dset_items( new_dset , ADN_ntt , brikIndex , ADN_ttorg , DSET_TIMEORIGIN(old_dset) , ADN_ttdel , DSET_TIMESTEP(old_dset) , ADN_tunits , DSET_TIMEUNITS(old_dset) , NULL ) ; DSET_write( new_dset ) ; WROTE_DSET( new_dset ) ; } else { ERROR_exit("Unable to compute output dataset!\n") ; } exit(0) ; }
/*! compute the overall minimum and maximum voxel values for a dataset */ int main( int argc , char * argv[] ) { THD_3dim_dataset * old_dset , * new_dset ; /* input and output datasets */ int nopt, nbriks; int slow_flag, quick_flag, min_flag, max_flag, mean_flag, automask,count_flag, sum_flag, var_flag, absolute_flag; int positive_flag, negative_flag, zero_flag, nan_flag, perc_flag, vol_flag; byte * mmm=NULL ; int mmvox=0 ; int nxyz, i; float *dvec = NULL, mmin=0.0, mmax=0.0; int N_mp; double *mpv=NULL, *perc = NULL; double mp =0.0f, mp0 = 0.0f, mps = 0.0f, mp1 = 0.0f, di =0.0f ; byte *mmf = NULL; MRI_IMAGE *anat_im = NULL; char *mask_dset_name=NULL; /*----- Read command line -----*/ mainENTRY("3dBrickStat main"); machdep(); AFNI_logger("3dBrickStat",argc,argv); nopt = 1 ; min_flag = 0; max_flag = -1; mean_flag = 0; sum_flag = 0; var_flag = 0; slow_flag = 0; quick_flag = -1; automask = 0; count_flag = 0; vol_flag = 0; positive_flag = -1; negative_flag = -1; absolute_flag = 0; zero_flag = -1; nan_flag = -1; perc_flag = 0; mmin = 1.0; mmax = -1.0; mask_dset_name = NULL; datum = MRI_float; while( nopt < argc && argv[nopt][0] == '-' ){ if( strcmp(argv[nopt],"-help") == 0 || strcmp(argv[nopt],"-h") == 0){ usage_3dBrickStat(strlen(argv[nopt])> 3 ? 2:1); exit(0); } if( strcmp(argv[nopt],"-ver") == 0 ){ PRINT_VERSION("3dBrickStat"); AUTHOR("Daniel Glen"); nopt++; continue; } if( strcmp(argv[nopt],"-quick") == 0 ){ quick_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-percentile") == 0 ){ perc_flag = 1; ++nopt; if (nopt + 2 >= argc) { ERROR_exit( "** Error: Need 3 parameter after -percentile\n"); } mp0 = atof(argv[nopt])/100.0f; ++nopt; mps = atof(argv[nopt])/100.0f; ++nopt; mp1 = atof(argv[nopt])/100.0f; if (mps == 0.0f) { ERROR_exit( "** Error: step cannot be 0" ); } if (mp0 < 0 || mp0 > 100 || mp1 < 0 || mp1 > 100) { ERROR_exit( "** Error: p0 and p1 must be >=0 and <= 100" ); } nopt++; continue; } if( strcmp(argv[nopt],"-median") == 0 ){ perc_flag = 1; mp0 = 0.50f; mps = 0.01f; mp1 = 0.50f; nopt++; continue; } if( strcmp(argv[nopt],"-slow") == 0 ){ slow_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-min") == 0 ){ min_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-max") == 0 ){ max_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-sum") == 0 ){ sum_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-mean") == 0 ){ mean_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-var") == 0 ){ if (var_flag) { ERROR_message("Looks like -stdev is already used.\n" "-var and -stdev are mutually exclusive"); exit (1); } var_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-stdev") == 0 ){ if (var_flag) { ERROR_message("Looks like -var is already used.\n" "-var and -stdev are mutually exclusive"); exit (1); } var_flag = 2; nopt++; continue; } if( strcmp(argv[nopt],"-count") == 0 ){ count_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-volume") == 0 ){ vol_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-positive") == 0 ){ if(positive_flag!=-1) { ERROR_exit( "Can not use multiple +/-/0 options"); } positive_flag = 1; negative_flag = 0; zero_flag = 0; nopt++; continue; } if( strcmp(argv[nopt],"-negative") == 0 ){ if(positive_flag!=-1) { ERROR_exit( "Can not use multiple +/-/0 options"); } positive_flag = 0; negative_flag = 1; zero_flag = 0; nopt++; continue; } if( strcmp(argv[nopt],"-zero") == 0 ){ if(positive_flag!=-1) { ERROR_exit( "Can not use multiple +/-/0 options"); } positive_flag = 0; negative_flag = 0; zero_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-non-positive") == 0 ){ if(positive_flag!=-1) { ERROR_exit( "Can not use multiple +/-/0 options"); } positive_flag = 0; negative_flag = 1; zero_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-non-negative") == 0 ){ if(positive_flag!=-1) { ERROR_exit( "Can not use multiple +/-/0 options"); } positive_flag = 1; negative_flag = 0; zero_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-non-zero") == 0 ){ if(positive_flag!=-1) { ERROR_exit( "Can not use multiple +/-/0 options"); } positive_flag = 1; negative_flag = 1; zero_flag = 0; nopt++; continue; } if( strcmp(argv[nopt],"-absolute") == 0 ){ absolute_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-nan") == 0 ){ if(nan_flag!=-1) { ERROR_exit( "Can not use both -nan -nonan options"); } nan_flag = 1; nopt++; continue; } if( strcmp(argv[nopt],"-nonan") == 0 ){ if(nan_flag!=-1) { ERROR_exit( "Can not use both -nan -nonan options"); } nan_flag = 0; nopt++; continue; } if( strcmp(argv[nopt],"-autoclip") == 0 || strcmp(argv[nopt],"-automask") == 0 ){ if( mmm != NULL ){ ERROR_exit(" ERROR: can't use -autoclip/mask with -mask!"); } automask = 1 ; nopt++ ; continue ; } if( strcmp(argv[nopt],"-mrange") == 0 ){ if (nopt+2 >= argc) { ERROR_exit(" ERROR: Need two values after -mrange"); } mmin = atof(argv[++nopt]); mmax = atof(argv[++nopt]); if (mmax < mmin) { ERROR_exit( "1st value in -mrange %s %s should be the smallest one", argv[nopt-1], argv[nopt]); } nopt++ ; continue ; } if( strcmp(argv[nopt],"-mvalue") == 0 ){ if (nopt+1 >= argc) { ERROR_exit(" ERROR: Need 1 value after -mvalue"); } mmin = atof(argv[++nopt]); mmax = mmin ; nopt++ ; continue ; } if( strcmp(argv[nopt],"-mask") == 0 ){ if( mask_dset_name != NULL ) ERROR_exit(" ERROR: can't have 2 -mask options!"); mask_dset_name = argv[++nopt]; nopt++ ; continue ; } ERROR_message( " Error - unknown option %s", argv[nopt]); suggest_best_prog_option(argv[0], argv[nopt]); exit(1); } if( argc < 2 || strcmp(argv[1],"-help") == 0 ){ ERROR_message("Too few options"); usage_3dBrickStat(0); exit(1) ; } if (mask_dset_name) { int ninmask = 0; THD_3dim_dataset * mask_dset ; if( automask ){ ERROR_exit(" ERROR: can't use -mask with -automask!"); } mask_dset = THD_open_dataset(mask_dset_name) ; CHECK_OPEN_ERROR(mask_dset,mask_dset_name) ; mmm = THD_makemask( mask_dset , 0 , mmin, mmax ) ; mmvox = DSET_NVOX( mask_dset ) ; ninmask = THD_countmask (mmvox, mmm); if (!ninmask) { ERROR_exit(" No voxels in mask !"); } /* text output program, so avoid extras 26 Dec 2013 [rickr] */ /* INFO_message("%d voxels in mask\n", ninmask); */ DSET_delete(mask_dset) ; } if(((mmm!=NULL) && (quick_flag))||(automask &&quick_flag)) { if(quick_flag==1) WARNING_message( "+++ Warning - can't have quick option with mask"); quick_flag = 0; slow_flag = 1; } /* if max_flag is not set by user, check if other user options set */ if(max_flag==-1) { if(min_flag || mean_flag || count_flag || vol_flag || sum_flag || perc_flag || var_flag) max_flag = 0; else max_flag = 1; /* otherwise check only for max */ } if((var_flag==1)||(mean_flag==1)||(count_flag==1)|| (vol_flag==1)||(absolute_flag==1) || (positive_flag!=-1)||(nan_flag!=-1)|| (sum_flag == 1)||(perc_flag == 1) || (var_flag==2)) { /* mean flag or count_flag implies slow */ slow_flag = 1; } /* check slow and quick options */ if((slow_flag)&&(quick_flag!=1)) /* if user asked for slow give it to him */ quick_flag = 0; else quick_flag = 1; if((max_flag==0)&&(min_flag==0)) /* if the user only asked for mean */ quick_flag = 0; /* no need to do quick way */ if((quick_flag) && ((absolute_flag==1)||(positive_flag==1)||(negative_flag==1)||(zero_flag==1))) WARNING_message( " Warning - ignoring +/-/0/abs flags for quick computations"); if(positive_flag==-1) { /* if no +/-/0 options set, allow all voxels */ positive_flag = 1; negative_flag = 1; zero_flag = 1; } /*----- read input dataset -----*/ if( nopt >= argc ){ ERROR_exit(" No input dataset!?"); } old_dset = THD_open_dataset( argv[nopt] ) ; CHECK_OPEN_ERROR(old_dset,argv[nopt]) ; nxyz = DSET_NVOX(old_dset) ; if( mmm != NULL && mmvox != nxyz ){ ERROR_exit(" Mask and input datasets not the same size!") ; } if(automask && mmm == NULL ){ mmm = THD_automask( old_dset ) ; for(i=0;i<nxyz;i++) { if(mmm[i]!=0) ++mmvox; } } if(quick_flag) Print_Header_MinMax(min_flag, max_flag, old_dset); if(slow_flag!=1) exit(0); /* ZSS do some diddlyiddly sorting - DO not affect Daniel's function later on*/ if (perc_flag == 1) { DSET_mallocize (old_dset); DSET_load (old_dset); if (DSET_NVALS(old_dset) != 1) { ERROR_exit( "-percentile can only be used on one sub-brick only.\n" "Use sub-brick selectors '[.]' to specify sub-brick of interest.\n"); } /* prep for input and output of percentiles */ if (mp0 > mp1) { N_mp = 1; } else { /* allocate one above ceiling to prevent truncation error (and crash), N_mp is recomputed anyway 16 Mar 2009 [rickr] */ N_mp = (int)((double)(mp1-mp0)/(double)mps) + 2; } mpv = (double *)malloc(sizeof(double)*N_mp); perc = (double *)malloc(sizeof(double)*N_mp); if (!mpv || !perc) { ERROR_message("Failed to allocate for mpv or perc"); exit(1); } N_mp = 0; mp = mp0; do { mpv[N_mp] = mp; ++N_mp; mp += mps; } while (mp <= mp1+.00000001); if (!Percentate (DSET_ARRAY(old_dset, 0), mmm, nxyz, DSET_BRICK_TYPE(old_dset,0), mpv, N_mp, 0, perc, zero_flag, positive_flag, negative_flag )) { ERROR_message("Failed to compute percentiles."); exit(1); } /* take care of brick factor */ if (DSET_BRICK_FACTOR(old_dset,0)) { for (i=0; i<N_mp; ++i) { perc[i] = perc[i]*DSET_BRICK_FACTOR(old_dset,0); } } for (i=0; i<N_mp; ++i) { fprintf(stdout,"%.1f %f ", mpv[i]*100.0f, perc[i]); } free(mpv); mpv = NULL; free(perc); perc = NULL; } Max_func(min_flag, max_flag, mean_flag,count_flag, positive_flag, negative_flag, zero_flag, absolute_flag, nan_flag, sum_flag, var_flag, vol_flag,old_dset, mmm, mmvox); if(mmm!=NULL) free(mmm); exit(0); /* unused code time series method for extracting data */ #if 0 EDIT_dset_items( old_dset , ADN_ntt , DSET_NVALS(old_dset) , ADN_ttorg , 0.0 , ADN_ttdel , 1.0 , ADN_tunits , UNITS_SEC_TYPE , NULL ) ; nbriks = 1; /*------------- ready to compute new min, max -----------*/ new_dset = MAKER_4D_to_typed_fbuc( old_dset , /* input dataset */ "temp" , /* output prefix */ datum , /* output datum */ 0 , /* ignore count */ 0 , /* can't detrend in maker function KRH 12/02*/ nbriks , /* number of briks */ Max_tsfunc , /* timeseries processor */ NULL, /* data for tsfunc */ NULL, /* mask */ 0 /* Allow auto scaling of output */ ) ; if(min_flag) printf("%-13.6g ", minvalue); if(max_flag) printf("%-13.6g", maxvalue); printf("\n"); exit(0) ; #endif }
int AFNI_prefilter_args( int *argc , char **argv ) { int narg=*argc , ii,jj , nused , ttt ; char *used , *eee ; if( narg <= 1 || argv == NULL ) return(0) ; used = (char *)calloc((size_t)narg,sizeof(char)) ; eee = getenv("AFNI_TRACE") ; ttt = YESSISH(eee) ; if( ttt ) fprintf( stderr, "++ AFNI_prefilter_args() processing argv[1..%d]\n",narg-1) ; /*--- scan thru argv[]; see if any should be processed now and marked as 'used up' ---*/ for( ii=1 ; ii < narg ; ii++ ){ /*** empty argument (should never happen in Unix) ***/ if( argv[ii] == NULL ){ if( ttt ) fprintf(stderr,"++ argv[%d] is NULL\n",ii) ; used[ii] = 1 ; continue ; } /*** -Dname=val to set environment variable ***/ if( strncmp(argv[ii],"-D",2) == 0 && strchr(argv[ii],'=') != NULL ){ if( ttt ) fprintf(stderr,"++ argv[%d] does setenv %s\n",ii,argv[ii]) ; (void)AFNI_setenv(argv[ii]+2) ; used[ii] = 1 ; continue ; } /*** -Vname to get environment variable ***/ if( strncmp(argv[ii],"-V",2) == 0 && strchr(argv[ii],'=') != NULL ){ if( ttt ) fprintf(stderr,"++ argv[%d] does getenv %s\n",ii,argv[ii]) ; fprintf(stdout,"%s\n", (eee = my_getenv(argv[ii]+2)) ? eee:"") ; used[ii] = 1 ; exit(0) ; } /*** -overwrite to set AFNI_DECONFLICT ***/ if( strcmp(argv[ii],"-overwrite") == 0 ){ if( ttt ) fprintf(stderr,"++ argv[%d] is -overwrite\n",ii) ; AFNI_setenv("AFNI_DECONFLICT=OVERWRITE") ; THD_set_quiet_overwrite(1); /* no need to kvetch */ used[ii] = 1 ; continue ; } /*** echo command ***/ if( strcmp(argv[ii],"-echo_edu") == 0 ){ if( ttt ) fprintf(stderr,"++ argv[%d] is -echo_edu\n",ii) ; { int jjj=0; fprintf(stdout,"\n+++ Command Echo:\n "); for (jjj=0; jjj<narg; ++jjj) { if (jjj != ii) { fprintf(stdout,"%s ", argv[jjj]); } } fprintf(stdout,"\n\n"); used[ii] = 1 ; continue ; } } if( strcmp(argv[ii],"-all_opts") == 0 ){ if( ttt ) fprintf(stderr,"++ argv[%d] is -all_opts\n",ii) ; print_prog_options(argv[0]); used[ii] = 1 ; exit(0); /* better exit, otherwise output get burried by program's own -help */ } if( strcmp(argv[ii],"-h_find") == 0 ){ if( ttt ) fprintf(stderr,"++ argv[%d] is -h_find\n",ii) ; if (ii+1 >= narg) { fprintf(stderr,"** -h_find needs a string.\n"); exit(1); } used[ii] = 1 ; ii++; suggest_best_prog_option(argv[0], argv[ii]); used[ii] = 1 ; exit(0); /* better exit, otherwise output get burried by program's own -help */ } if( strcmp(argv[ii],"-h_aspx") == 0 && ii == 1){ char *s=NULL; if( ttt ) fprintf(stderr,"++ argv[%d] is -h_apsx\n",ii) ; if (!(s = sphinxize_prog_help(argv[0], 0))) { fprintf(stderr,"** Failed to get auto-sphinxized string\n"); exit(1); } fprintf(stdout,"%s", s); free(s); used[ii] = 1 ; exit(0); } if( strcmp(argv[ii],"-h_view") == 0 ){ if( ttt ) fprintf(stderr,"++ argv[%d] is -h_view\n",ii) ; view_prog_help(argv[0]); used[ii] = 1 ; exit(0); /* better exit, otherwise output get burried by program's own -help */ } if( strcmp(argv[ii],"-h_web") == 0 ){ if( ttt ) fprintf(stderr,"++ argv[%d] is -h_web\n",ii) ; web_prog_help(argv[0],0); used[ii] = 1 ; exit(0); /* better exit, otherwise output get burried by program's own -help */ } /*** -ok_1D_text to set AFNI_1D_ZERO_TEXT ZSS Dec 09 ***/ if( strcmp(argv[ii],"-ok_1D_text") == 0 ){ if( ttt ) fprintf(stderr,"++ argv[%d] is -ok_1D_text\n",ii) ; AFNI_setenv("AFNI_1D_ZERO_TEXT=YES") ; used[ii] = 1 ; continue ; } /*** -skip_afnirc to avoid .afnirc file ***/ if( strcmp(argv[ii],"-skip_afnirc") == 0 ){ if( ttt ) fprintf(stderr,"++ argv[%d] is -skip_afnirc\n",ii) ; AFNI_mark_environ_done() ; used[ii] = 1 ; continue ; } /*** -pad_to_node to force sparse data to a particular size ***/ if( strcmp(argv[ii],"-pad_to_node") == 0 ){ if( ttt ) fprintf(stderr,"++ argv[%d] is -pad_to_node\n",ii) ; if (ii+1 >= narg) { fprintf(stderr,"** -pad_to_node needs a positive integer,\n" " or standard mesh description such as ld120\n"); exit(1); } used[ii] = 1 ; ii++; if (!strncasecmp(argv[ii],"ld",2)) { if (strlen(argv[ii]) < 3) { fprintf(stderr,"** need a number right after ld (like ld120)\n"); exit(1); } MRILIB_DomainMaxNodeIndex = SUMA_IcoNums(atoi(argv[ii]+2), 0, 'n')-1; if( ttt ) fprintf(stderr, "ld pad_to_node %d\n", MRILIB_DomainMaxNodeIndex); } else if (!strncasecmp(argv[ii],"rd",2)) { if (strlen(argv[ii]) < 3) { fprintf(stderr,"** need a number right after rd (like rd6)\n"); exit(1); } MRILIB_DomainMaxNodeIndex = SUMA_IcoNums(atoi(argv[ii]+2), 1, 'n')-1; if( ttt ) fprintf(stderr, "rd pad_to_node %d\n", MRILIB_DomainMaxNodeIndex); } else if (!strncasecmp(argv[ii],"d:",2)) { THD_3dim_dataset *dset=NULL; if (strlen(argv[ii]) < 3) { fprintf(stderr, "** need a dataset right after d: (like d:hello.niml.dset)\n"); exit(1); } dset = THD_open_dataset(argv[ii]+2); if (dset) { DSET_MAX_NODE(dset, MRILIB_DomainMaxNodeIndex); DSET_delete(dset); dset = NULL; if( ttt ) fprintf(stderr, "d: pad_to_node %d\n", MRILIB_DomainMaxNodeIndex); } else { fprintf(stderr,"** Could not load dset %s to determine padding\n", argv[ii]+2); } } else { MRILIB_DomainMaxNodeIndex = atoi(argv[ii]); if( ttt ) fprintf(stderr, "pad_to_node %d\n", MRILIB_DomainMaxNodeIndex); } if (MRILIB_DomainMaxNodeIndex < 0) { fprintf(stderr,"** parameter for -pad_to_node (%d) is negative!\n", MRILIB_DomainMaxNodeIndex); exit(1); }else if (MRILIB_DomainMaxNodeIndex > 500000) { fprintf(stderr, "** parameter for -pad_to_node (%d) is suspiciously large.\n" " I hope you know what you're doing.\n", MRILIB_DomainMaxNodeIndex ); } used[ii] = 1; continue ; } if( strcmp(argv[ii],"-np") == 0 || strcmp(argv[ii],"-npq") == 0 ){ /* ZSS, June 2011 */ if( ttt ) fprintf(stderr,"++ argv[%d] is -np\n",ii) ; if (ii+1 >= narg) { fprintf(stderr, "** -np needs an integer NP such that 1024 <= NP <= 65500\n"); exit(1); } used[ii] = 1 ; ii++; if (set_user_np(atoi(argv[ii]))<1) { if (strcmp(argv[ii-1],"-npq")) { /* not quiet mode? */ fprintf(stderr, "** -np is not an integer such that 1024 <= NP <= 65500\n" " -np was ignored\n"); } } else { if (strcmp(argv[ii-1],"-npq")) fprintf(stderr,"++ -np set to %d\n", get_user_np()); } used[ii] = 1; continue ; } if( strcmp(argv[ii],"-npb") == 0 ){ /* ZSS, June 2011 */ if( ttt ) fprintf(stderr,"++ argv[%d] is -npb\n",ii) ; if (ii+1 >= narg) { fprintf(stderr, "** -npb needs an integer NPB such that 0 <= NPB <= %d\n", get_max_port_bloc()); exit(1); } used[ii] = 1 ; ii++; if (set_user_np_bloc(atoi(argv[ii]))<1) { fprintf(stderr, "** -npb is not an integer such that 0 <= NPB <= %d\n" " -npb was ignored\n", get_max_port_bloc()); } used[ii] = 1; continue ; } if( strcmp(argv[ii],"-pif") == 0 ){ /* ZSS, June 2011 */ if( ttt ) fprintf(stderr,"++ argv[%d] is -pif\n",ii) ; if (ii+1 >= narg) { fprintf(stderr, "** -pif needs a string value\n"); exit(1); } used[ii] = 1 ; ii++; set_user_pif(argv[ii]); used[ii] = 1; continue ; } /* -max_port_bloc number and quit */ if( strncmp(argv[ii],"-max_port_bloc", 8) == 0) { int pp = 0; pp = get_max_port_bloc(); if (strcmp(argv[ii-1], "-max_port_bloc_quiet")) { fprintf(stdout, "Maximum port bloc number: %d\n", pp); } else { fprintf(stdout, "%d\n", pp); } exit(0); } /* -num_assigned port number and quit */ if( strncmp(argv[ii],"-num_assigned_ports", 8) == 0) { int pp = 0; pp = get_max_port_bloc(); if (strcmp(argv[ii-1], "-num_assigned_ports_quiet")) { fprintf(stdout, "Number of assigned ports: %d\n", pp); } else { fprintf(stdout, "%d\n", pp); } exit(0); } /*** if get to here, argv[ii] is nothing special ***/ } /* end of loop over argv[] */ /*--- compress out used up argv[] entries ---*/ for( nused=0,ii=narg-1 ; ii >= 1 ; ii-- ){ if( !used[ii] ) continue ; for( jj=ii+1 ; jj < narg ; jj++ ) argv[jj-1] = argv[jj] ; argv[narg-1] = NULL ; narg-- ; nused++ ; } if( ttt && nused > 0 ) fprintf(stderr,"++ 'used up' %d argv[] entries, leaving %d\n",nused,narg) ; free((void *)used) ; *argc = narg ; return(nused); }
SEG_OPTS *GenFeatureDist_ParseInput (SEG_OPTS *Opt, char *argv[], int argc) { static char FuncName[]={"GenFeatureDist_ParseInput"}; int kar, i, ind, exists; char *outname, cview[10], *sbuf=NULL; int brk = 0; SUMA_GENERIC_ARGV_PARSE *ps=NULL; SUMA_ENTRY; brk = 0; kar = 1; while (kar < argc) { /* loop accross command ine options */ /*fprintf(stdout, "%s verbose: Parsing command line...\n", FuncName);*/ if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { Opt->helpfunc(0); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); #ifdef USE_TRACING if( strncmp(argv[kar],"-trace",5) == 0 ){ DBG_trace = 1 ; brk = 1 ; } if( strncmp(argv[kar],"-TRACE",5) == 0 ){ DBG_trace = 2 ; brk = 1 ; } #endif if (!brk && (strcmp(argv[kar], "-debug") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -debug \n"); exit (1); } Opt->debug = atoi(argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-talk_afni") == 0)) { Opt->ps->cs->talk_suma = 1; brk = 1; } if (!brk && (strcmp(argv[kar], "-openmp") == 0)) { Opt->openmp = 1; brk = 1; } if (!brk && (strcmp(argv[kar], "-no_openmp") == 0)) { Opt->openmp = 0; brk = 1; } if (!brk && (strcmp(argv[kar], "-vox_debug") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need 1D vox index after -vox_debug \n"); exit (1); } if (kar+2<argc) { /* see if we have ijk */ int iii, jjj, kkk; if (argv[kar][0]!='-' && argv[kar][1]!='-' && argv[kar][2]!='-' && (iii = atoi(argv[kar ])) >= 0 && (jjj = atoi(argv[kar+1])) >= 0 && (kkk = atoi(argv[kar+2])) >= 0 ) { Opt->VoxDbg3[0]=iii; Opt->VoxDbg3[1]=jjj; Opt->VoxDbg3[2]=kkk; ++kar; ++kar; } } if (Opt->VoxDbg3[0] < 0) { Opt->VoxDbg = atoi(argv[kar]); } brk = 1; } if (!brk && (strcmp(argv[kar], "-vox_debug_file") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need filename after -vox_debug_file \n"); exit (1); } if (!strcmp(argv[kar],"-")) { Opt->VoxDbgOut = stdout; } else if (!strcmp(argv[kar],"+")) { Opt->VoxDbgOut = stderr; } else { Opt->VoxDbgOut = fopen(argv[kar],"w"); } brk = 1; } if (!brk && (strcmp(argv[kar], "-cmask") == 0)) { kar ++; if (kar >= argc) { ERROR_exit("-cmask option requires a following argument!\n"); } Opt->cmask = EDT_calcmask( argv[kar] , &(Opt->dimcmask), 0 ) ; if( Opt->cmask == NULL ) ERROR_exit("Can't compute -cmask!\n"); brk = 1; } if (!brk && (strcmp(argv[kar], "-mask") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -mask \n"); exit (1); } Opt->mset_name = argv[kar]; brk = 1; } if( !brk && (strncmp(argv[kar],"-mrange",5) == 0) ){ if( kar+2 >= argc ) ERROR_exit("-mrange option requires 2 following arguments!\n"); Opt->mask_bot = strtod( argv[++kar] , NULL ) ; Opt->mask_top = strtod( argv[++kar] , NULL ) ; if( Opt->mask_top < Opt->mask_bot ) ERROR_exit("-mrange inputs are illegal!\n") ; brk = 1; } if (!brk && (strcmp(argv[kar], "-anat") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -anat \n"); exit (1); } Opt->aset_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-sig") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -sig \n"); exit (1); } while (kar < argc && argv[kar][0] != '-') { sbuf = SUMA_append_replace_string(sbuf, argv[kar], " ", 1); ++kar; } if (kar < argc && argv[kar][0] == '-') --kar; /* unwind */ Opt->sig_names = SUMA_NI_str_array(Opt->sig_names, sbuf, "add"); SUMA_free(sbuf); sbuf = NULL; brk = 1; } if (!brk && (strcmp(argv[kar], "-samp") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -samp \n"); exit (1); } while (kar < argc && argv[kar][0] != '-') { sbuf = SUMA_append_replace_string(sbuf, argv[kar], " ", 1); ++kar; } if (kar < argc && argv[kar][0] == '-') --kar; /* unwind */ Opt->samp_names = SUMA_NI_str_array(Opt->samp_names, sbuf, "add"); SUMA_free(sbuf); sbuf = NULL; brk = 1; } if (!brk && (strcmp(argv[kar], "-hspec") == 0)) { kar ++; if (kar+3 >= argc) { fprintf (stderr, "need 4 arguments after -hspec \n"); exit (1); } Opt->hspec = (SUMA_HIST **) SUMA_realloc(Opt->hspec, (Opt->N_hspec+1)*sizeof(SUMA_HIST *)); Opt->hspec[Opt->N_hspec] = (SUMA_HIST*)SUMA_calloc(1,sizeof(SUMA_HIST)); Opt->hspec[Opt->N_hspec]->label = SUMA_copy_string(argv[kar++]); Opt->hspec[Opt->N_hspec]->min = (float)strtod(argv[kar++],NULL); Opt->hspec[Opt->N_hspec]->max = (float)strtod(argv[kar++],NULL); Opt->hspec[Opt->N_hspec]->K = (float)strtod(argv[kar],NULL); ++Opt->N_hspec; brk = 1; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -prefix \n"); exit (1); } Opt->smode = storage_mode_from_filename(argv[kar]); Opt->proot = argv[kar]; Opt->prefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->crefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->pgrefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->cgrefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->frefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); Opt->xrefix = (char*)calloc(strlen(argv[kar])+20, sizeof(char)); sprintf(Opt->prefix,"%s.p", argv[kar]); sprintf(Opt->pgrefix,"%s.pg", argv[kar]); sprintf(Opt->crefix,"%s.c", argv[kar]); sprintf(Opt->cgrefix,"%s.cg", argv[kar]); sprintf(Opt->frefix,"%s.f", argv[kar]); sprintf(Opt->xrefix,"%s.x", argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-classes") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -classes \n"); exit (1); } Opt->clss = NI_strict_decode_string_list(argv[kar] ,";, "); brk = 1; } if (!brk && (strcmp(argv[kar], "-features") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -features \n"); exit (1); } Opt->feats = NI_strict_decode_string_list(argv[kar] ,";, "); brk = 1; } if (!brk && (strcmp(argv[kar], "-keys") == 0)) { NI_str_array *nstr=NULL; int ii; kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -keys \n"); exit (1); } if (!(nstr = NI_strict_decode_string_list(argv[kar] ,";, "))){ ERROR_exit("Bad option %s after -keys", argv[kar]); } Opt->keys = (int *)calloc(nstr->num, sizeof(int)); for (ii=0;ii<nstr->num; ++ii) Opt->keys[ii] = strtol(nstr->str[ii],NULL,10); NI_delete_str_array(nstr);nstr=NULL; brk = 1; } if (!brk && (strcmp(argv[kar], "-labeltable") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -labeltable \n"); exit (1); } Opt->labeltable_name = argv[kar]; brk = 1; } if (!brk && (strcmp(argv[kar], "-uid") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -uid \n"); exit (1); } snprintf(Opt->uid,128,"%s",argv[kar]); brk = 1; } if (!brk && (strcmp(argv[kar], "-ShowTheseHists") == 0)) { kar ++; if (kar >= argc) { fprintf (stderr, "need argument after -ShowTheseHists \n"); exit (1); } { NI_str_array *hisnames=NULL; SUMA_HIST *hh=NULL; int ii=0; hisnames = NI_strict_decode_string_list(argv[kar],";, "); for (ii=0; ii<hisnames->num; ++ii) { if ((hh = SUMA_read_hist(hisnames->str[ii]))) { SUMA_Show_hist(hh, 1, NULL); hh = SUMA_Free_hist(hh); } else { SUMA_S_Errv("Hist %s not found.\n", hisnames->str[ii]); exit(1); } } hisnames = SUMA_free_NI_str_array(hisnames); } exit(0); brk = 1; } if (!brk) { fprintf (stderr,"Option #%d %s not understood. \n" "Try -help for usage\n", kar, argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = 0; kar ++; } } if (!Opt->prefix) Opt->prefix = strdup("./GenFeatureDistOut.p"); if (!Opt->frefix) Opt->frefix = strdup("./GenFeatureDistOut.f"); if (!Opt->xrefix) Opt->xrefix = strdup("./GenFeatureDistOut.x"); if (!Opt->crefix) Opt->crefix = strdup("./GenFeatureDistOut.c"); if (Opt->uid[0]=='\0') UNIQ_idcode_fill(Opt->uid); if (Opt->VoxDbg > -1 && !Opt->VoxDbgOut) { char stmp[256]; sprintf(stmp,"%d.GFD.dbg", Opt->VoxDbg); Opt->VoxDbgOut = fopen(stmp,"w"); } SUMA_RETURN(Opt); }
SUMA_GENERIC_PROG_OPTIONS_STRUCT * SUMA_SurfMatch_ParseInput( char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_SurfMatch_ParseInput"}; SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt=NULL; int kar; SUMA_Boolean brk; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = SUMA_Alloc_Generic_Prog_Options_Struct(); Opt->s=NULL; Opt->flt1 = 1.0; Opt->b1 = 0; Opt->efrac = 0.0; kar = 1; brk = NOPE; while (kar < argc) { /* loop accross command ine options */ /*fprintf(stdout, "%s verbose: Parsing command line...\n", FuncName);*/ if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { usage_SurfMatch(ps, strlen(argv[kar])>3?1:0); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-warp") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a string after -warp \n"); exit (1); } ++kar; if (!strcmp(argv[kar],"shift_only") || !strcmp(argv[kar],"sho")) { Opt->s = SUMA_copy_string("shft"); } else if (!strcmp(argv[kar],"shift_rotate") || !strcmp(argv[kar],"sro")) { Opt->s = SUMA_copy_string("shft+rot"); } else if (!strcmp(argv[kar],"shift_rotate_scale") || !strcmp(argv[kar],"srs")) { Opt->s = SUMA_copy_string("shft+rot+scl"); } else if (!strcmp(argv[kar],"affine_general") || !strcmp(argv[kar],"aff")) { Opt->s = SUMA_copy_string("shft+rot+scl+shr"); } else { SUMA_S_Errv("Bad -warp parameter of %s\n" "Choose from sho, sro, srs, or aff\n", argv[kar]); exit(1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-city") == 0)) { Opt->b1 = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -prefix \n"); exit (1); } Opt->out_prefix = SUMA_copy_string(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-depthlimit") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -depthlimit \n"); exit (1); } Opt->flt1 = atof(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-reduce_ref") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -reduce_ref \n"); exit (1); } Opt->efrac = atof(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-debug") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -debug \n"); exit (1); } Opt->debug = atoi(argv[++kar]); brk = YUP; } if (!brk && !ps->arg_checked[kar]) { fprintf (SUMA_STDERR, "Error SurfMatch: Option %s not understood\n", argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } if (!Opt->out_prefix) { Opt->out_prefix = SUMA_copy_string("SurfMatch.gii"); THD_force_ok_overwrite(1) ; } if (!Opt->s) { Opt->s = SUMA_copy_string("shft"); } SUMA_RETURN(Opt); }
void BUCK_read_opts( int argc , char * argv[] ) { int nopt = 1 , ii ; char dname[THD_MAX_NAME] ; char subv[THD_MAX_NAME] ; char *cpt ; THD_3dim_dataset *dset , *fset=NULL ; int *svar ; char *str; int ok, ilen, nlen; INIT_3DARR(BUCK_dsar) ; INIT_XTARR(BUCK_subv) ; while( nopt < argc ){ if( strcmp(argv[nopt],"-help") == 0 || strcmp(argv[nopt],"-h") == 0) { BUCK_Syntax(strlen(argv[nopt])>3?2:1) ; exit(0); } /**** -prefix prefix ****/ if( strncmp(argv[nopt],"-prefix",6) == 0 || strncmp(argv[nopt],"-output",6) == 0 ){ if (BUCK_glue){ fprintf(stderr,"-prefix and -glueto options are not compatible\n"); exit(1) ; } nopt++ ; if( nopt >= argc ){ fprintf(stderr,"need argument after -prefix!\n") ; exit(1) ; } MCW_strncpy( BUCK_output_prefix , argv[nopt++] , THD_MAX_PREFIX ) ; continue ; } /**** -session directory ****/ if( strncmp(argv[nopt],"-session",6) == 0 ){ if (BUCK_glue){ fprintf(stderr, "-session and -glueto options are not compatible\n"); exit(1) ; } nopt++ ; if( nopt >= argc ){ fprintf(stderr,"need argument after -session!\n") ; exit(1) ; } MCW_strncpy( BUCK_session , argv[nopt++] , THD_MAX_NAME ) ; continue ; } if( strncmp(argv[nopt],"-dry",3) == 0 ){ BUCK_dry = BUCK_verb = 1 ; nopt++ ; continue ; } if( strncmp(argv[nopt],"-fbuc",4) == 0 ){ BUCK_type = HEAD_FUNC_TYPE ; nopt++ ; continue ; } if( strncmp(argv[nopt],"-abuc",4) == 0 ){ BUCK_type = HEAD_ANAT_TYPE ; nopt++ ; continue ; } if( strncmp(argv[nopt],"-verb",5) == 0 ){ BUCK_verb = 1 ; nopt++ ; continue ; } if( strncmp(argv[nopt],"-glueto",5) == 0 || strncmp(argv[nopt],"-aglueto",5) == 0){ /* ZSS April 16 2010 */ if( strncmp(BUCK_output_prefix, "buck", 5) != 0 ){ fprintf(stderr, "-prefix, -glueto, and -aglueto options are not compatible\n"); exit(1) ; } if( strncmp(BUCK_session, "./", 5) != 0 ){ fprintf(stderr, "-session, -glueto, and -aglueto options are not compatible\n"); exit(1) ; } nopt++ ; if( nopt >= argc ){ fprintf(stderr,"need argument after -glueto or -aglueto!\n") ; exit(1) ; } if (strncmp(argv[nopt-1],"-aglueto",5) == 0) { /* ZSS April 16 2010 */ THD_3dim_dataset *ddd = THD_open_dataset( argv[nopt] ); if( !ISVALID_DSET(ddd) ){ /* treat as -prefix */ MCW_strncpy( BUCK_output_prefix , argv[nopt++] , THD_MAX_PREFIX ) ; continue ; } else { /* go on as standard -glueto option */ } } BUCK_glue = 1 ; /*----- Verify that file name ends in View Type -----*/ ok = 1; nlen = strlen(argv[nopt]); if (nlen <= 5) ok = 0; if (ok) { #if 0 /* old code - scan from end, instead */ for (ilen = 0; ilen < nlen; ilen++) { str = argv[nopt] + ilen; if (str[0] == '+') break; } if (ilen == nlen) ok = 0; #endif /* scan from end for view type extension, require one char */ /* 30 Oct 2003 [rickr] */ for (ilen = nlen - 1; ilen > 0; ilen--) { str = argv[nopt] + ilen; if (str[0] == '+') break; } if (ilen == 0) ok = 0; } if (ok) { str = argv[nopt] + ilen + 1; for (ii=FIRST_VIEW_TYPE ; ii <= LAST_VIEW_TYPE ; ii++) if (! strncmp(str,VIEW_codestr[ii],4)) break ; if( ii > LAST_VIEW_TYPE ) ok = 0; } if (! ok) { fprintf(stderr, "File name must end in +orig, +acpc, or +tlrc after -glueto\n" "(consider: 3dbucket -prefix dsetA -overwrite dsetA dsetB ...)\n"); exit(1); } /*----- Remove View Type from string to make output prefix -----*/ MCW_strncpy( BUCK_output_prefix , argv[nopt] , ilen+1) ; /*----- Note: no "continue" statement here. File name will now be processed as an input dataset -----*/ } if( strncmp(argv[nopt],"-aglueto",5) == 0 ){ if( strncmp(BUCK_output_prefix, "buck", 5) != 0 ){ fprintf(stderr,"-prefix and -aglueto options are not compatible.\n" "Make sure you do not have two -agluto options on command.\n"); exit(1) ; } if( strncmp(BUCK_session, "./", 5) != 0 ){ fprintf(stderr, "-session and -aglueto options are not compatible\n"); exit(1) ; } BUCK_glue = 1 ; nopt++ ; if( nopt >= argc ){ fprintf(stderr,"need argument after -glueto!\n") ; exit(1) ; } /*----- Verify that file name ends in View Type -----*/ ok = 1; nlen = strlen(argv[nopt]); if (nlen <= 5) ok = 0; if (ok) { #if 0 /* old code - scan from end, instead */ for (ilen = 0; ilen < nlen; ilen++) { str = argv[nopt] + ilen; if (str[0] == '+') break; } if (ilen == nlen) ok = 0; #endif /* scan from end for view type extension, require one char */ /* 30 Oct 2003 [rickr] */ for (ilen = nlen - 1; ilen > 0; ilen--) { str = argv[nopt] + ilen; if (str[0] == '+') break; } if (ilen == 0) ok = 0; } if (ok) { str = argv[nopt] + ilen + 1; for (ii=FIRST_VIEW_TYPE ; ii <= LAST_VIEW_TYPE ; ii++) if (! strncmp(str,VIEW_codestr[ii],4)) break ; if( ii > LAST_VIEW_TYPE ) ok = 0; } if (! ok) { fprintf(stderr, "File name must end in +orig, +acpc, or +tlrc after -glueto\n" "(consider: 3dbucket -prefix dsetA -overwrite dsetA dsetB ...)\n"); exit(1); } /*----- Remove View Type from string to make output prefix -----*/ MCW_strncpy( BUCK_output_prefix , argv[nopt] , ilen+1) ; /*----- Note: no "continue" statement here. File name will now be processed as an input dataset -----*/ } if( argv[nopt][0] == '-' ){ fprintf(stderr,"Unknown option: %s\n",argv[nopt]) ; suggest_best_prog_option(argv[0], argv[nopt]); exit(1) ; } /**** read dataset ****/ cpt = strstr(argv[nopt],"[") ; if( cpt == NULL ){ if (strlen(argv[nopt]) > THD_MAX_NAME-1) { ERROR_exit( "Too long a filename for '%s'\n" "Maximum limit is %d\n", argv[nopt], THD_MAX_NAME-1); } strcpy(dname,argv[nopt]) ; subv[0] = '\0' ; /* make sure subv is reset ZSS Nov. 2010*/ } else if( cpt == argv[nopt] ){ fprintf(stderr,"illegal dataset specifier: %s\n",argv[nopt]) ; exit(1) ; } else { ii = cpt - argv[nopt] ; if (ii > THD_MAX_NAME-1) { ERROR_exit( "Too long a filename for '%s'\n" "Maximum character limit is %d, have %d\\n", argv[nopt], THD_MAX_NAME-1, ii); } if (strlen(argv[nopt])-ii > THD_MAX_NAME-1) { ERROR_exit( "Too long a sub-brick selection for '%s'\n" "Maximum limit is %d, have %d\n" "Consider using '[1dcat FF.1D]' or '[count ...]' methods\n" "for sub-brick selection. See 3dTcat -help for details.\n", argv[nopt], THD_MAX_NAME-1, strlen(argv[nopt])-ii); } memcpy(dname,argv[nopt],ii) ; dname[ii] = '\0' ; strcpy(subv,cpt) ; } nopt++ ; dset = THD_open_one_dataset( dname ) ; if( dset == NULL ){ fprintf(stderr,"can't open dataset %s\n",dname) ; exit(1) ; } THD_force_malloc_type( dset->dblk , DATABLOCK_MEM_MALLOC ) ; if( BUCK_type < 0 ) BUCK_type = dset->type ; BUCK_ccode = COMPRESS_filecode(dset->dblk->diskptr->brick_name) ; /* 16 Mar 2010 */ ii = dset->daxes->nxx * dset->daxes->nyy * dset->daxes->nzz ; if( BUCK_nvox < 0 ){ BUCK_nvox = ii ; fset = dset ; } else if( ii != BUCK_nvox ){ ERROR_exit("Dataset %s differs in size from first one",dname); } else if( !EQUIV_GRIDS(dset,fset) ){ WARNING_message("Dataset %s grid differs from first one",dname) ; } ADDTO_3DARR(BUCK_dsar,dset) ; if (subv == NULL || subv[0] == '\0') { /* lazy way for 3dbucket special */ svar = BUCK_get_subv( DSET_NVALS(dset) , subv ) ; /* ZSS Dec 09 */ } else { svar = MCW_get_thd_intlist (dset, subv); /* ZSS Dec 09 */ } if( svar == NULL || svar[0] <= 0 ){ fprintf(stderr,"can't decipher index codes from %s%s\n",dname,subv) ; exit(1) ; } ADDTO_XTARR(BUCK_subv,svar) ; } /* end of loop over command line arguments */ if( argc < 2) { ERROR_message("Too few options"); BUCK_Syntax(0) ; exit(1); } return ; }
int main( int argc , char *argv[] ) { int vstep=0 , ii,nvox , ntin , ntout , do_one=0 , nup=-1 ; THD_3dim_dataset *inset=NULL , *outset ; char *prefix="Upsam", *dsetname=NULL ; int verb=0 , iarg=1, datum = MRI_float; float *ivec , *ovec , trin , trout, *fac=NULL, *ofac=NULL, top=0.0, maxtop=0.0; /*------- help the pitifully ignorant user? -------*/ if( argc < 2 || strcmp(argv[1],"-help") == 0 ){ printf( "Usage: 3dUpsample [options] n dataset\n" "\n" "* Upsamples a 3D+time dataset, in the time direction,\n" " by a factor of 'n'.\n" "* The value of 'n' must be between 2 and 320 (inclusive).\n" "* The output dataset is in float format by default.\n" "\n" "Options:\n" "--------\n" " -1 or -one = Use linear interpolation. Otherwise,\n" " or -linear 7th order polynomial interpolation is used.\n" "\n" " -prefix pp = Define the prefix name of the output dataset.\n" " [default prefix is 'Upsam']\n" "\n" " -verb = Be eloquently and mellifluosly verbose.\n" "\n" " -n n = An alternate way to specify n\n" " -input dataset = An alternate way to specify dataset\n" "\n" " -datum ddd = Use datatype ddd at output. Choose from\n" " float (default), short, byte.\n" "Example:\n" "--------\n" " 3dUpsample -prefix LongFred 5 Fred+orig\n" "\n" "Nota Bene:\n" "----------\n" "* You should not use this for files that were 3dTcat-ed across\n" " imaging run boundaries, since that will result in interpolating\n" " between non-contiguous time samples!\n" "* If the input has M time points, the output will have n*M time\n" " points. The last n-1 of them will be past the end of the original\n" " time series.\n" "* This program gobbles up memory and diskspace as a function of n.\n" " You can reduce output file size with -datum option.\n" "\n" "--- RW Cox - April 2008\n" ) ; PRINT_COMPILE_DATE ; exit(0) ; } mainENTRY("3dUpsample"); machdep(); PRINT_VERSION("3dUpsample"); AUTHOR("RWCox") ; AFNI_logger("3dUpsample",argc,argv); /*------- read command line args -------*/ datum = MRI_float; iarg = 1 ; while( iarg < argc && argv[iarg][0] == '-' ){ if( strncasecmp(argv[iarg],"-prefix",5) == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '%s'",argv[iarg-1]); prefix = argv[iarg] ; if( !THD_filename_ok(prefix) ) ERROR_exit("Illegal string after -prefix: '%s'",prefix) ; iarg++ ; continue ; } if( strncasecmp(argv[iarg],"-one",4) == 0 || strcmp (argv[iarg],"-1" ) == 0 || strncasecmp(argv[iarg],"-lin",4) == 0 ){ do_one = 1 ; iarg++ ; continue ; } if( strncasecmp(argv[iarg],"-verb",3) == 0 ){ verb = 1 ; iarg++ ; continue ; } if( strcasecmp(argv[iarg],"-n") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '%s'",argv[iarg-1]); nup = (int)strtod(argv[iarg],NULL) ; if( nup < 2 || nup > 320 ) ERROR_exit("3dUpsample rate '%d' is outside range 2..320",nup) ; iarg++ ; continue ; } if( strcasecmp(argv[iarg],"-input") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '%s'",argv[iarg-1]); dsetname = argv[iarg]; iarg++ ; continue ; } if( strcasecmp(argv[iarg],"-datum") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '%s'",argv[iarg-1]); if( strcmp(argv[iarg],"short") == 0 ){ datum = MRI_short ; } else if( strcmp(argv[iarg],"float") == 0 ){ datum = MRI_float ; } else if( strcmp(argv[iarg],"byte") == 0 ){ datum = MRI_byte ; } else { ERROR_message("-datum of type '%s' not supported in 3dUpsample!\n", argv[iarg] ) ; exit(1) ; } iarg++ ; continue ; } ERROR_message("Unknown argument on command line: '%s'",argv[iarg]) ; suggest_best_prog_option(argv[0], argv[iarg]); exit (1); } /*------- check options for completeness and consistency -----*/ if (nup == -1) { if( iarg+1 >= argc ) ERROR_exit("need 'n' and 'dataset' on command line!") ; nup = (int)strtod(argv[iarg++],NULL) ; if( nup < 2 || nup > 320 ) ERROR_exit("3dUpsample rate '%d' is outside range 2..320",nup) ; } if (!dsetname) { if( iarg >= argc ) ERROR_exit("need 'dataset' on command line!") ; dsetname = argv[iarg]; } inset = THD_open_dataset(dsetname) ; if( !ISVALID_DSET(inset) ) ERROR_exit("3dUpsample can't open dataset '%s'", dsetname) ; ntin = DSET_NVALS(inset) ; trin = DSET_TR(inset) ; if( ntin < 2 ) ERROR_exit("dataset '%s' has only 1 value per voxel?!",dsetname) ; nvox = DSET_NVOX(inset) ; if( verb ) INFO_message("loading input dataset into memory") ; DSET_load(inset) ; CHECK_LOAD_ERROR(inset) ; /*------ create output dataset ------*/ ntout = ntin * nup ; trout = trin / nup ; /* scaling factor for output */ fac = NULL; maxtop = 0.0; if (MRI_IS_INT_TYPE(datum)) { fac = (float *)calloc(DSET_NVALS(inset), sizeof(float)); ofac = (float *)calloc(ntout, sizeof(float)); for (ii=0; ii<DSET_NVALS(inset); ++ii) { top = MCW_vol_amax( DSET_NVOX(inset),1,1 , DSET_BRICK_TYPE(inset,ii), DSET_BRICK_ARRAY(inset,ii) ) ; if (DSET_BRICK_FACTOR(inset, ii)) top = top * DSET_BRICK_FACTOR(inset,ii); fac[ii] = (top > MRI_TYPE_maxval[datum]) ? top/MRI_TYPE_maxval[datum] : 0.0 ; if (top > maxtop) maxtop = top; } if (storage_mode_from_filename(prefix) != STORAGE_BY_BRICK) { fac[0] = (maxtop > MRI_TYPE_maxval[datum]) ? maxtop/MRI_TYPE_maxval[datum] : 0.0 ; for (ii=0; ii<ntout; ++ii) ofac[ii] = fac[0]; if (verb) INFO_message("Forcing global scaling, Max = %f, fac = %f\n", maxtop, fac[0]); } else { if (verb) INFO_message("Reusing scaling factors of input dset\n"); upsample_1( nup, DSET_NVALS(inset), fac, ofac); } } free(fac); fac = NULL; outset = EDIT_empty_copy(inset) ; EDIT_dset_items( outset , ADN_nvals , ntout , ADN_ntt , DSET_NUM_TIMES(inset) > 1 ? ntout : 0 , ADN_datum_all , datum , ADN_brick_fac , ofac , ADN_prefix , prefix , ADN_none ) ; tross_Copy_History( inset , outset ) ; tross_Make_History( "3dUpsample" , argc,argv , outset ) ; free(ofac); ofac = NULL; if( outset->taxis != NULL ){ outset->taxis->ttdel /= nup ; outset->taxis->ttdur /= nup ; if( outset->taxis->toff_sl != NULL ){ for( ii=0 ; ii < outset->taxis->nsl ; ii++ ) outset->taxis->toff_sl[ii] /= nup ; } } for( ii=0 ; ii < ntout ; ii++ ){ /* create empty bricks to be filled below */ EDIT_substitute_brick( outset , ii , datum , NULL ) ; } /*------- loop over voxels and process them one at a time ---------*/ if( verb ) INFO_message("Upsampling time series from %d to %d: %s interpolation", ntin , ntout , (do_one) ? "linear" : "heptic" ) ; if( verb && nvox > 499 ) vstep = nvox / 50 ; if( vstep > 0 ) fprintf(stderr,"++ voxel loop: ") ; ivec = (float *)malloc(sizeof(float)*ntin) ; ovec = (float *)malloc(sizeof(float)*ntout) ; for( ii=0 ; ii < nvox ; ii++ ){ if( vstep > 0 && ii%vstep==vstep-1 ) vstep_print() ; THD_extract_array( ii , inset , 0 , ivec ) ; if( do_one ) upsample_1( nup , ntin , ivec , ovec ) ; else upsample_7( nup , ntin , ivec , ovec ) ; THD_insert_series( ii , outset , ntout , MRI_float , ovec , datum==MRI_float ? 1:0 ) ; } /* end of loop over voxels */ if( vstep > 0 ) fprintf(stderr," Done!\n") ; /*----- clean up and go away -----*/ DSET_write(outset) ; if( verb ) WROTE_DSET(outset) ; if( verb ) INFO_message("Total CPU time = %.1f s",COX_cpu_time()) ; exit(0); }
/*! \brief parse the arguments for SurfSmooth program \param argv (char *) \param argc (int) \return Opt (SUMA_SURFCLUST_OPTIONS *) options structure. To free it, use SUMA_free(Opt->out_name); SUMA_free(Opt); */ SUMA_SURFCLUST_OPTIONS *SUMA_SurfClust_ParseInput (char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_SurfClust_ParseInput"}; SUMA_SURFCLUST_OPTIONS *Opt=NULL; int kar, i, ind; char *outname; SUMA_Boolean brk = NOPE; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = SUMA_create_SurfClust_Opt("SurfClust"); kar = 1; outname = NULL; BuildMethod = SUMA_OFFSETS2_NO_REC; brk = NOPE; while (kar < argc) { /* loop accross command ine options */ /*fprintf(stdout, "%s verbose: Parsing command line...\n", FuncName);*/ if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { usage_SUMA_SurfClust(strlen(argv[kar]) > 3 ? 2:1); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-no_cent") == 0)) { Opt->DoCentrality = 0; brk = YUP; } if (!brk && (strcmp(argv[kar], "-cent") == 0)) { Opt->DoCentrality = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-O2") == 0)) { BuildMethod = SUMA_OFFSETS2; brk = YUP; } if (!brk && (strcmp(argv[kar], "-O2_NR") == 0)) { BuildMethod = SUMA_OFFSETS2_NO_REC; brk = YUP; } if (!brk && (strcmp(argv[kar], "-Oll") == 0)) { BuildMethod = SUMA_OFFSETS_LL; brk = YUP; } if (!brk && (strcmp(argv[kar], "-update") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -update \n"); exit (1); } Opt->update = atof(argv[kar]); if (Opt->update < 1 || Opt->update > 100) { fprintf (SUMA_STDERR, "-update needs a parameter between " "1 and 50 (I have %.1f)\n", Opt->update); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -prefix \n"); exit (1); } Opt->oform = SUMA_GuessFormatFromExtension(argv[kar], NULL); if (Opt->oform == SUMA_NO_DSET_FORMAT) Opt->oform = SUMA_ASCII_NIML; Opt->out_prefix = SUMA_RemoveDsetExtension_s(argv[kar], Opt->oform); Opt->WriteFile = YUP; brk = YUP; } #if 0 if (!brk && (strcmp(argv[kar], "-spec") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -spec \n"); exit (1); } Opt->spec_file = argv[kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sv") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -sv \n"); exit (1); } Opt->sv_name = argv[kar]; brk = YUP; } if (!brk && (strncmp(argv[kar], "-surf_", 6) == 0)) { if (kar + 1>= argc) { fprintf (SUMA_STDERR, "need argument after -surf_X SURF_NAME \n"); exit (1); } ind = argv[kar][6] - 'A'; if (ind < 0 || ind >= SURFCLUST_MAX_SURF) { fprintf (SUMA_STDERR, "-surf_X SURF_NAME option is out of range.\n" "Only %d surfaces are allowed. \n" "Must start with surf_A for first surface.\n", SURFCLUST_MAX_SURF); exit (1); } kar ++; Opt->surf_names[ind] = argv[kar]; Opt->N_surf = ind+1; brk = YUP; } #endif if (!brk && (strcmp(argv[kar], "-input") == 0)) { kar ++; if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need 2 arguments after -input \n"); exit (1); } Opt->in_name = argv[kar]; kar ++; /* no need for that one Opt->nodecol = atoi(argv[kar]); kar ++; */ Opt->labelcol = atoi(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-rmm") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -rmm \n"); exit (1); } Opt->DistLim = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-in_range") == 0)) { kar ++; if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need two arguments after -in_range \n"); exit (1); } Opt->DoThreshold = SUMA_THRESH_INSIDE_RANGE; Opt->ThreshR[0] = atof(argv[kar]); ++kar; Opt->ThreshR[1] = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-ex_range") == 0)) { kar ++; if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need two arguments after -ex_range \n"); exit (1); } Opt->DoThreshold = SUMA_THRESH_OUTSIDE_RANGE; Opt->ThreshR[0] = atof(argv[kar]); ++kar; Opt->ThreshR[1] = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-thresh") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -thresh \n"); exit (1); } Opt->DoThreshold = SUMA_LESS_THAN; Opt->ThreshR[0] = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-athresh") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -athresh \n"); exit (1); } Opt->DoThreshold = SUMA_ABS_LESS_THAN; Opt->ThreshR[0] = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-thresh_col") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -thresh_col \n"); exit (1); } Opt->tind = atoi(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-amm2") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -amm2 \n"); exit (1); } Opt->AreaLim = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-n") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -n \n"); exit (1); } Opt->NodeLim = atoi(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-out_roidset") == 0)) { Opt->OutROI = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-prepend_node_index") == 0)) { Opt->prepend_node_index = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-out_clusterdset") == 0)) { Opt->OutClustDset = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-out_fulllist") == 0)) { Opt->FullROIList = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sort_none") == 0)) { Opt->SortMode = SUMA_SORT_CLUST_NO_SORT; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sort_n_nodes") == 0)) { Opt->SortMode = SUMA_SORT_CLUST_BY_NUMBER_NODES; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sort_area") == 0)) { Opt->SortMode = SUMA_SORT_CLUST_BY_AREA; brk = YUP; } if (!brk && !ps->arg_checked[kar]) { SUMA_S_Errv("Option %s not understood.\n" "Try -help for usage\n", argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } /* sanitorium */ if (Opt->DistLim == -1.5f) { fprintf (SUMA_STDERR, "must use option -rmm \n"); exit(1); } if (!Opt->out_prefix) { Opt->out_prefix = SUMA_RemoveDsetExtension_s(Opt->in_name, SUMA_NO_DSET_FORMAT); } if (Opt->SortMode == SUMA_SORT_CLUST_NOT_SET) { Opt->SortMode = SUMA_SORT_CLUST_BY_AREA; } if (BuildMethod == SUMA_OFFSETS2) { SUMA_S_Note("Using Offsets2"); } else if (BuildMethod == SUMA_OFFSETS_LL) { SUMA_S_Note("Using Offsets_ll"); } else if (BuildMethod == SUMA_OFFSETS2_NO_REC) { if (LocalHead) SUMA_S_Note("Using no recursion"); } else { SUMA_SL_Err("Bad BuildMethod"); exit(1); } SUMA_SurfClust_Set_Method(BuildMethod); if (Opt->FullROIList && !(Opt->OutROI || Opt->OutClustDset)) { SUMA_SL_Err("-out_fulllist must be used in conjunction " "with -out_ROIdset or -out_clusterdset"); exit(1); } SUMA_RETURN(Opt); }
int main(int argc, char *argv[]) { int i,j,k,m,n,aa,ii,jj,kk,mm,rr; int iarg; int nmask1=0; int nmask2=0; THD_3dim_dataset *insetFA = NULL, *insetV1 = NULL, *insetMD = NULL, *insetL1 = NULL; THD_3dim_dataset *insetEXTRA=NULL; THD_3dim_dataset *mset2=NULL; THD_3dim_dataset *mset1=NULL; THD_3dim_dataset *outsetMAP=NULL, *outsetMASK=NULL; char *prefix="tracky"; int LOG_TYPE=0; char in_FA[300]; char in_V1[300]; char in_MD[300]; char in_L1[300]; int EXTRAFILE=0; // switch for whether other file is input as WM map char OUT_bin[300]; char OUT_tracstat[300]; char prefix_mask[300]; char prefix_map[300]; // FACT algopts FILE *fout0; float MinFA=0.2,MaxAngDeg=45,MinL=20.0; float MaxAng; int SeedPerV[3]={2,2,2}; int ArrMax=0; float tempvmagn; int Nvox=-1; // tot number vox int Dim[3]={0,0,0}; // dim in each dir int Nseed=0,M=30,bval=1000; int DimSeed[3]; // number of seeds there will be float Ledge[3]; // voxel edge lengths int *ROI1, *ROI2; short int *temp_arr; char *temp_byte; int **Tforw, **Tback; int **Ttot; float **flTforw, **flTback; float ****coorded; int ****INDEX; int len_forw, len_back; // int count of num of squares through float phys_forw[1], phys_back[1]; int idx; float ave_tract_len, ave_tract_len_phys; int inroi1, inroi2, KEEPIT; // switches for detecting int in[3]; // to pass to trackit float physin[3]; // also for trackit, physical loc, int totlen; float totlen_phys; int Numtract; int READS_in; float READS_fl; int end[2][3]; int test_ind[2][3]; int roi3_ct=0, id=0; float roi3_mu_MD = 0.,roi3_mu_RD = 0.,roi3_mu_L1 = 0.,roi3_mu_FA = 0.; float roi3_sd_MD = 0.,roi3_sd_RD = 0.,roi3_sd_L1 = 0.,roi3_sd_FA = 0.; float tempMD,tempFA,tempRD,tempL1; char dset_or[4] = "RAI"; THD_3dim_dataset *dsetn; int TV_switch[3] = {0,0,0}; TAYLOR_BUNDLE *tb=NULL; TAYLOR_TRACT *tt=NULL; char *mode = "NI_fast_binary"; NI_element *nel=NULL; int dump_opts=0; tv_io_header header1 = {.id_string = "TRACK\0", .origin = {0,0,0}, .n_scalars = 3, .scal_n[0] = "FA", .scal_n[1] = "MD", .scal_n[2] = "L1", .n_properties = 0, .vox_to_ras = {{0.,0.,0.,0.},{0.,0.,0.,0.}, {0.,0.,0.,0.},{0.,0.,0.,0.}}, // reset this later based on actual data set .voxel_order = "RAI\0", .invert_x = 0, .invert_y = 0, .invert_z = 0, .swap_xy = 0, .swap_yz = 0, .swap_zx = 0, .n_count = 0, .version = 2, .hdr_size = 1000}; // for testing names... char *postfix[4]={"+orig.HEAD\0",".nii.gz\0",".nii\0","+tlrc.HEAD\0"}; int FOUND =-1; int RECORD_ORIG = 0; float Orig[3] = {0.0,0.0,0.0}; mainENTRY("3dTrackID"); machdep(); // **************************************************************** // **************************************************************** // load AFNI stuff // **************************************************************** // **************************************************************** INFO_message("version: MU"); /** scan args **/ if (argc == 1) { usage_TrackID(1); exit(0); } iarg = 1; while( iarg < argc && argv[iarg][0] == '-' ){ if( strcmp(argv[iarg],"-help") == 0 || strcmp(argv[iarg],"-h") == 0 ) { usage_TrackID(strlen(argv[iarg])>3 ? 2:1); exit(0); } if( strcmp(argv[iarg],"-verb") == 0) { if( ++iarg >= argc ) ERROR_exit("Need argument after '-verb'") ; set_tract_verb(atoi(argv[iarg])); iarg++ ; continue ; } if( strcmp(argv[iarg],"-write_opts") == 0) { dump_opts=1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-rec_orig") == 0) { RECORD_ORIG=1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-tract_out_mode") == 0) { if( ++iarg >= argc ) ERROR_exit("Need argument after '-tract_out_mode'") ; if (strcmp(argv[iarg], "NI_fast_binary") && strcmp(argv[iarg], "NI_fast_text") && strcmp(argv[iarg], "NI_slow_binary") && strcmp(argv[iarg], "NI_slow_text") ) { ERROR_message("Bad value (%s) for -tract_out_mode",argv[iarg]); exit(1); } mode = argv[iarg]; iarg++ ; continue ; } if( strcmp(argv[iarg],"-mask1") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-mask1'") ; mset1 = THD_open_dataset( argv[iarg] ) ; if( mset1 == NULL ) ERROR_exit("Can't open mask1 dataset '%s'", argv[iarg]) ; DSET_load(mset1) ; CHECK_LOAD_ERROR(mset1) ; nmask1 = DSET_NVOX(mset1) ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-mask2") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-mask2'") ; mset2 = THD_open_dataset( argv[iarg] ) ; if( mset2 == NULL ) ERROR_exit("Can't open mask2 dataset '%s'", argv[iarg]) ; DSET_load(mset2) ; CHECK_LOAD_ERROR(mset2) ; nmask2 = DSET_NVOX(mset2) ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-prefix") == 0 ){ iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-prefix'"); prefix = strdup(argv[iarg]) ; if( !THD_filename_ok(prefix) ) ERROR_exit("Illegal name after '-prefix'"); iarg++ ; continue ; } if( strcmp(argv[iarg],"-input") == 0 ){ iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-input'"); for( i=0 ; i<4 ; i++) { sprintf(in_FA,"%s_FA%s", argv[iarg],postfix[i]); if(THD_is_ondisk(in_FA)) { FOUND = i; break; } } insetFA = THD_open_dataset(in_FA) ; if( (insetFA == NULL ) || (FOUND==-1)) ERROR_exit("Can't open dataset '%s': for FA.",in_FA); DSET_load(insetFA) ; CHECK_LOAD_ERROR(insetFA) ; Nvox = DSET_NVOX(insetFA) ; Dim[0] = DSET_NX(insetFA); Dim[1] = DSET_NY(insetFA); Dim[2] = DSET_NZ(insetFA); Ledge[0] = fabs(DSET_DX(insetFA)); Ledge[1] = fabs(DSET_DY(insetFA)); Ledge[2] = fabs(DSET_DZ(insetFA)); Orig[0] = DSET_XORG(insetFA); Orig[1] = DSET_YORG(insetFA); Orig[2] = DSET_ZORG(insetFA); // check tot num vox match (as proxy for dims...) if( (Nvox != nmask1) || (Nvox != nmask2) ) ERROR_exit("Input dataset does not match both mask volumes!"); // this stores the original data file orientation for later use, // as well since we convert everything to RAI temporarily, as // described below header1.voxel_order[0]=ORIENT_typestr[insetFA->daxes->xxorient][0]; header1.voxel_order[1]=ORIENT_typestr[insetFA->daxes->yyorient][0]; header1.voxel_order[2]=ORIENT_typestr[insetFA->daxes->zzorient][0]; for( i=0 ; i<3 ; i++) { header1.dim[i] = Dim[i]; header1.voxel_size[i] = Ledge[i]; // will want this when outputting file later for TrackVis. TV_switch[i] = !(dset_or[i]==header1.voxel_order[i]); } dset_or[3]='\0'; FOUND = -1; for( i=0 ; i<4 ; i++) { sprintf(in_V1,"%s_V1%s", argv[iarg],postfix[i]); if(THD_is_ondisk(in_V1)) { FOUND = i; break; } } insetV1 = THD_open_dataset(in_V1); if( insetV1 == NULL ) ERROR_exit("Can't open dataset '%s':V1",in_V1); DSET_load(insetV1) ; CHECK_LOAD_ERROR(insetV1) ; FOUND = -1; for( i=0 ; i<4 ; i++) { sprintf(in_L1,"%s_L1%s", argv[iarg],postfix[i]); if(THD_is_ondisk(in_L1)) { FOUND = i; break; } } insetL1 = THD_open_dataset(in_L1); if( insetL1 == NULL ) ERROR_exit("Can't open dataset '%s':L1",in_L1); DSET_load(insetL1) ; CHECK_LOAD_ERROR(insetL1) ; FOUND = -1; for( i=0 ; i<4 ; i++) { sprintf(in_MD,"%s_MD%s", argv[iarg],postfix[i]); if(THD_is_ondisk(in_MD)) { FOUND = i; break; } } insetMD = THD_open_dataset(in_MD); if( insetMD == NULL ) ERROR_exit("Can't open dataset '%s':MD",in_MD); DSET_load(insetMD) ; CHECK_LOAD_ERROR(insetMD) ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-algopt") == 0 ){ iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-algopt'"); if (!(nel = ReadTractAlgOpts(argv[iarg]))) { ERROR_message("Failed to read options in %s\n", argv[iarg]); exit(19); } if (NI_getTractAlgOpts(nel, &MinFA, &MaxAngDeg, &MinL, SeedPerV, &M, &bval)) { ERROR_message("Failed to get options"); exit(1); } NI_free_element(nel); nel=NULL; iarg++ ; continue ; } if( strcmp(argv[iarg],"-logic") == 0 ){ iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-logic'"); INFO_message("ROI logic type is: %s",argv[iarg]); if( strcmp(argv[iarg],"AND") == 0 ) LOG_TYPE = 1; else if( strcmp(argv[iarg],"OR") == 0 ) LOG_TYPE = 0; else if( strcmp(argv[iarg],"ALL") == 0 ) LOG_TYPE = -1; else ERROR_exit("Illegal after '-logic': need 'OR' or 'AND'"); iarg++ ; continue ; } //@@ if( strcmp(argv[iarg],"-extra_set") == 0) { if( ++iarg >= argc ) ERROR_exit("Need argument after '-extra_set'"); EXTRAFILE = 1; // switch on insetEXTRA = THD_open_dataset(argv[iarg]); if( (insetEXTRA == NULL ) ) ERROR_exit("Can't open dataset '%s': for extra set.",argv[iarg]); DSET_load(insetEXTRA) ; CHECK_LOAD_ERROR(insetEXTRA) ; if( !((Dim[0] == DSET_NX(insetEXTRA)) && (Dim[1] == DSET_NY(insetEXTRA)) && (Dim[2] == DSET_NZ(insetEXTRA)))) ERROR_exit("Dimensions of extra set '%s' don't match those of the DTI prop ones ('%s', etc.).",argv[iarg], in_FA); iarg++ ; continue ; } ERROR_message("Bad option '%s'\n",argv[iarg]) ; suggest_best_prog_option(argv[0], argv[iarg]); exit(1); } if (iarg < 4) { ERROR_message("Too few options. Try -help for details.\n"); exit(1); } if (dump_opts) { nel = NI_setTractAlgOpts(NULL, &MinFA, &MaxAngDeg, &MinL, SeedPerV, &M, &bval); WriteTractAlgOpts(prefix, nel); NI_free_element(nel); nel=NULL; } // Process the options a little for( i=0 ; i<3 ; i++) DimSeed[i] = Dim[i]*SeedPerV[i]; Nseed = Nvox*SeedPerV[0]*SeedPerV[1]*SeedPerV[2]; // convert to cos of rad value for comparisons, instead of using acos() MaxAng = cos(CONV*MaxAngDeg); // switch to add header-- option for now, added Sept. 2012 // for use with map_TrackID to map tracks to different space if(RECORD_ORIG) { for( i=0 ; i<3 ; i++) header1.origin[i] = Orig[i]; } // at some point, we will have to convert indices into // pseudo-locations; being forced into this choice means that // different data set orientations would be represented differently // and incorrectly in some instances... so, for now, we'll resample // everything to RAI, and then resample back later. guess this will // just slow things down slightly. // have all be RAI for processing here if(TV_switch[0] || TV_switch[1] || TV_switch[2]) { dsetn = r_new_resam_dset(insetFA, NULL, 0.0, 0.0, 0.0, dset_or, RESAM_NN_TYPE, NULL, 1, 0); DSET_delete(insetFA); insetFA=dsetn; dsetn=NULL; dsetn = r_new_resam_dset(insetMD, NULL, 0.0, 0.0, 0.0, dset_or, RESAM_NN_TYPE, NULL, 1, 0); DSET_delete(insetMD); insetMD=dsetn; dsetn=NULL; dsetn = r_new_resam_dset(insetV1, NULL, 0.0, 0.0, 0.0, dset_or, RESAM_NN_TYPE, NULL, 1, 0); DSET_delete(insetV1); insetV1=dsetn; dsetn=NULL; dsetn = r_new_resam_dset(insetL1, NULL, 0.0, 0.0, 0.0, dset_or, RESAM_NN_TYPE, NULL, 1, 0); DSET_delete(insetL1); insetL1=dsetn; dsetn=NULL; dsetn = r_new_resam_dset(mset1, NULL, 0.0, 0.0, 0.0, dset_or, RESAM_NN_TYPE, NULL, 1, 0); DSET_delete(mset1); mset1=dsetn; dsetn=NULL; dsetn = r_new_resam_dset(mset2, NULL, 0.0, 0.0, 0.0, dset_or, RESAM_NN_TYPE, NULL, 1, 0); DSET_delete(mset2); mset2=dsetn; dsetn=NULL; if(EXTRAFILE) { dsetn = r_new_resam_dset(insetEXTRA, NULL, 0.0, 0.0, 0.0, dset_or, RESAM_NN_TYPE, NULL, 1, 0); DSET_delete(insetEXTRA); insetEXTRA=dsetn; dsetn=NULL; } } // **************************************************************** // **************************************************************** // make arrays for tracking // **************************************************************** // **************************************************************** // for temp storage array, just a multiple of longest dimension! if(Dim[0] > Dim[1]) ArrMax = Dim[0] * 4; else ArrMax = Dim[1] * 4; if(4*Dim[2] > ArrMax) ArrMax = Dim[2] * 4; ROI1 = (int *)calloc(Nvox, sizeof(int)); ROI2 = (int *)calloc(Nvox, sizeof(int)); temp_arr = (short int *)calloc(Nvox, sizeof(short int)); temp_byte = (char *)calloc(Nvox, sizeof(char)); // temp storage whilst tracking Tforw = calloc(ArrMax, sizeof(Tforw)); for(i=0 ; i<ArrMax ; i++) Tforw[i] = calloc(3, sizeof(int)); Ttot = calloc(2*ArrMax , sizeof(Ttot)); for(i=0 ; i<2*ArrMax ; i++) Ttot[i] = calloc(3, sizeof(int)); Tback = calloc(ArrMax, sizeof(Tback)); for(i=0 ; i<ArrMax ; i++) Tback[i] = calloc(3, sizeof(int)); // temp storage whilst tracking, physical loc flTforw = calloc(ArrMax, sizeof(flTforw)); for(i=0 ; i<ArrMax ; i++) flTforw[i] = calloc(3, sizeof(int)); flTback = calloc(ArrMax,sizeof(flTback)); for(i=0 ; i<ArrMax ; i++) flTback[i] = calloc(3, sizeof(int)); if( (ROI1 == NULL) || (ROI2 == NULL) || (temp_arr == NULL) || (Tforw == NULL) || (Tback == NULL) || (flTforw == NULL) || (flTback == NULL) || (Ttot == NULL)) { fprintf(stderr, "\n\n MemAlloc failure.\n\n"); exit(12); } coorded = (float ****) calloc( Dim[0], sizeof(float ***) ); for ( i = 0 ; i < Dim[0] ; i++ ) coorded[i] = (float ***) calloc( Dim[1], sizeof(float **) ); for ( i = 0 ; i < Dim[0] ; i++ ) for ( j = 0 ; j < Dim[1] ; j++ ) coorded[i][j] = (float **) calloc( Dim[2], sizeof(float *) ); for ( i=0 ; i<Dim[0] ; i++ ) for ( j=0 ; j<Dim[1] ; j++ ) for ( k= 0 ; k<Dim[2] ; k++ ) //3 comp of V1 and FA coorded[i][j][k] = (float *) calloc( 4, sizeof(float) ); INDEX = (int ****) calloc( Dim[0], sizeof(int ***) ); for ( i = 0 ; i < Dim[0] ; i++ ) INDEX[i] = (int ***) calloc( Dim[1], sizeof(int **) ); for ( i = 0 ; i < Dim[0] ; i++ ) for ( j = 0 ; j < Dim[1] ; j++ ) INDEX[i][j] = (int **) calloc( Dim[2], sizeof(int *) ); for ( i=0 ; i<Dim[0] ; i++ ) for ( j=0 ; j<Dim[1] ; j++ ) for ( k= 0 ; k<Dim[2] ; k++ ) INDEX[i][j][k] = (int *) calloc( 4, sizeof(int) ); // this statement will never be executed if allocation fails above if( (INDEX == NULL) || (coorded == NULL) ) { fprintf(stderr, "\n\n MemAlloc failure.\n\n"); exit(122); } for(i=0 ; i<Nvox ; i++) { if(THD_get_voxel( mset1, i, 0) >0.5){ ROI1[i] = 1; } if(THD_get_voxel( mset2, i, 0) >0.5) ROI2[i] = 1; } // set up eigvecs in 3D coord sys, // mark off where ROIs are and keep index handy idx=0; for( k=0 ; k<Dim[2] ; k++ ) for( j=0 ; j<Dim[1] ; j++ ) for( i=0 ; i<Dim[0] ; i++ ) { for( m=0 ; m<3 ; m++ ) coorded[i][j][k][m] = THD_get_voxel(insetV1, idx, m); if(EXTRAFILE) coorded[i][j][k][3] = THD_get_voxel(insetEXTRA, idx, 0); else coorded[i][j][k][3] = THD_get_voxel(insetFA, idx, 0); // make sure that |V1| == 1 for all eigenvects, otherwise it's /// a problem in the tractography; currently, some from // 3dDWItoDT do not have this property... tempvmagn = sqrt(coorded[i][j][k][0]*coorded[i][j][k][0]+ coorded[i][j][k][1]*coorded[i][j][k][1]+ coorded[i][j][k][2]*coorded[i][j][k][2]); if( tempvmagn<0.99 ) for( m=0 ; m<3 ; m++ ) coorded[i][j][k][m]/= tempvmagn; INDEX[i][j][k][0] =idx; // first value is the index itself if( ROI1[idx]==1 ) INDEX[i][j][k][1]=1; // second value identifies ROI1 mask else INDEX[i][j][k][1]=0; if( ROI2[idx]==1 ) INDEX[i][j][k][2]=1; // third value identifies ROI2 mask else INDEX[i][j][k][2]=0; // fourth value will be counter for number of kept tracks // passing through INDEX[i][j][k][3] = 0; idx+= 1; } // ************************************************************* // ************************************************************* // Beginning of main loop // ************************************************************* // ************************************************************* Numtract = 0; ave_tract_len = 0.; ave_tract_len_phys = 0.; sprintf(OUT_bin,"%s.trk",prefix); if( (fout0 = fopen(OUT_bin, "w")) == NULL) { fprintf(stderr, "Error opening file %s.",OUT_bin); exit(16); } fwrite(&header1,sizeof(tv_io_header),1,fout0); if (get_tract_verb()) { INFO_message("Begin tracking..."); } tb = AppCreateBundle(NULL, 0, NULL, insetFA); // start bundle id = 0; for( k=0 ; k<Dim[2] ; k++ ) for( j=0 ; j<Dim[1] ; j++ ) for( i=0 ; i<Dim[0] ; i++ ) if(coorded[i][j][k][3] >= MinFA) { for( ii=0 ; ii<SeedPerV[0] ; ii++ ) for( jj=0 ; jj<SeedPerV[1] ; jj++ ) for( kk=0 ; kk<SeedPerV[2] ; kk++ ) { in[0] = i; in[1] = j; in[2] = k; physin[0] = ((float) in[0] + (0.5 + (float) ii)/SeedPerV[0])*Ledge[0]; physin[1] = ((float) in[1] + (0.5 + (float) jj)/SeedPerV[1])*Ledge[1]; physin[2] = ((float) in[2] + (0.5 + (float) kk)/SeedPerV[2])*Ledge[2]; len_forw = TrackIt(coorded, in, physin, Ledge, Dim, MinFA, MaxAng, ArrMax, Tforw, flTforw, 1, phys_forw); // reset, because it's changed in TrackIt func in[0] = i; in[1] = j; in[2] = k; physin[0] = ((float) in[0] + (0.5 + (float) ii)/SeedPerV[0])*Ledge[0]; physin[1] = ((float) in[1] + (0.5 + (float) jj)/SeedPerV[1])*Ledge[1]; physin[2] = ((float) in[2] + (0.5 + (float) kk)/SeedPerV[2])*Ledge[2]; len_back = TrackIt(coorded, in, physin, Ledge, Dim, MinFA, MaxAng, ArrMax, Tback, flTback, -1, phys_back); KEEPIT = 0; // a simple switch totlen = len_forw+len_back-1; // NB: overlap of starts totlen_phys = phys_forw[0] + phys_back[0]; if( totlen_phys >= MinL ) { // glue together for simpler notation later for( n=0 ; n<len_back ; n++) { // all of this rr = len_back-n-1; // read in backward for(m=0;m<3;m++) Ttot[rr][m] = Tback[n][m]; } for( n=1 ; n<len_forw ; n++){// skip first->overlap rr = n+len_back-1; // put after for(m=0;m<3;m++) Ttot[rr][m] = Tforw[n][m]; } // <<So close and orthogonal condition>>: // test projecting ends, to see if they abut ROI. for(m=0;m<3;m++) { //actual projected ends end[1][m] = 2*Ttot[totlen-1][m]-Ttot[totlen-2][m]; end[0][m] = 2*Ttot[0][m]-Ttot[1][m]; // default choice, just retest known ends // as default test_ind[1][m] = test_ind[0][m] = Ttot[0][m]; } tt = Create_Tract(len_back, flTback, len_forw, flTforw, id, insetFA); ++id; if (LOG_TYPE == -1) { KEEPIT = 1; } else { inroi1 = 0; // check forw for( n=0 ; n<len_forw ; n++) { if(INDEX[Tforw[n][0]][Tforw[n][1]][Tforw[n][2]][1]==1){ inroi1 = 1; break; } else continue; } if( inroi1==0 ){// after 1st half, check 2nd half for( m=0 ; m<len_back ; m++) { if(INDEX[Tback[m][0]][Tback[m][1]][Tback[m][2]][1]==1){ inroi1 = 1; break; } else continue; } } // after 1st&2nd halves, check bound/neigh if( inroi1==0 ) { if(INDEX[test_ind[1][0]][test_ind[1][1]][test_ind[1][2]][1]==1) inroi1 = 1; if(INDEX[test_ind[0][0]][test_ind[0][1]][test_ind[0][2]][1]==1) inroi1 = 1; } if( ((LOG_TYPE ==0) && (inroi1 ==0)) || ((LOG_TYPE ==1) && (inroi1 ==1))) { // have to check in ROI2 inroi2 = 0; // check forw for( n=0 ; n<len_forw ; n++) { if(INDEX[Tforw[n][0]][Tforw[n][1]][Tforw[n][2]][2]==1){ inroi2 = 1; break; } else continue; } //after 1st half, check 2nd half if( inroi2==0 ) { for( m=0 ; m<len_back ; m++) { if(INDEX[Tback[m][0]][Tback[m][1]][Tback[m][2]][2]==1){ inroi2 = 1; break; } else continue; } } // after 1st&2nd halves, check bound/neigh if( inroi2==0 ) { if(INDEX[test_ind[1][0]][test_ind[1][1]][test_ind[1][2]][2]==1) inroi2 = 1; if(INDEX[test_ind[0][0]][test_ind[0][1]][test_ind[0][2]][2]==1) inroi2 = 1; } // for both cases, need to see it here to keep if( inroi2 ==1 ) KEEPIT = 1; // otherwise, it's gone } else if((LOG_TYPE ==0) && (inroi1 ==1)) KEEPIT = 1; } } // by now, we *know* if we're keeping this or not. if( KEEPIT == 1 ) { tb = AppCreateBundle(tb, 1, tt, NULL); tt = Free_Tracts(tt, 1); READS_in = totlen; fwrite(&READS_in,sizeof(READS_in),1,fout0); for( n=0 ; n<len_back ; n++) { //put this one in backwords, to make it connect m = len_back - 1 - n; for(aa=0 ; aa<3 ; aa++) { // recenter phys loc for trackvis, if nec... // just works this way (where they define // origin) READS_fl = flTback[m][aa]; if(!TV_switch[aa]) READS_fl = Ledge[aa]*Dim[aa]-READS_fl; fwrite(&READS_fl,sizeof(READS_fl),1,fout0); } mm = INDEX[Tback[m][0]][Tback[m][1]][Tback[m][2]][0]; READS_fl =THD_get_voxel(insetFA, mm, 0); // FA fwrite(&READS_fl,sizeof(READS_fl),1,fout0); READS_fl =THD_get_voxel(insetMD, mm, 0); // MD fwrite(&READS_fl,sizeof(READS_fl),1,fout0); READS_fl =THD_get_voxel(insetL1, mm, 0); // L1 fwrite(&READS_fl,sizeof(READS_fl),1,fout0); // count this voxel for having a tract INDEX[Tback[m][0]][Tback[m][1]][Tback[m][2]][3]+= 1; } for( m=1 ; m<len_forw ; m++) { for(aa=0 ; aa<3 ; aa++) { // recenter phys loc for trackvis, if nec... READS_fl = flTforw[m][aa]; if(!TV_switch[aa]) READS_fl = Ledge[aa]*Dim[aa]-READS_fl; fwrite(&READS_fl,sizeof(READS_fl),1,fout0); } mm = INDEX[Tforw[m][0]][Tforw[m][1]][Tforw[m][2]][0]; READS_fl =THD_get_voxel(insetFA, mm, 0); // FA fwrite(&READS_fl,sizeof(READS_fl),1,fout0); READS_fl =THD_get_voxel(insetMD, mm, 0); // MD fwrite(&READS_fl,sizeof(READS_fl),1,fout0); READS_fl =THD_get_voxel(insetL1, mm, 0); // L1 fwrite(&READS_fl,sizeof(READS_fl),1,fout0); // count this voxel for having a tract INDEX[Tforw[m][0]][Tforw[m][1]][Tforw[m][2]][3]+= 1; } ave_tract_len+= totlen; ave_tract_len_phys+= totlen_phys; Numtract+=1; } } } fclose(fout0); if (get_tract_verb()) { INFO_message("Done tracking, have %d tracks.", tb->N_tracts); Show_Taylor_Bundle(tb, NULL, 3); } if (!Write_Bundle(tb,prefix,mode)) { ERROR_message("Failed to write the bundle"); } // ************************************************************** // ************************************************************** // Some simple stats on ROIs and outputs // ************************************************************** // ************************************************************** for( k=0 ; k<Dim[2] ; k++ ) for( j=0 ; j<Dim[1] ; j++ ) for( i=0 ; i<Dim[0] ; i++ ) { if( INDEX[i][j][k][3]>=1 ) { tempMD = THD_get_voxel(insetMD,INDEX[i][j][k][0],0); tempFA = THD_get_voxel(insetFA,INDEX[i][j][k][0],0); tempL1 = THD_get_voxel(insetL1,INDEX[i][j][k][0],0); tempRD = 0.5*(3*tempMD-tempL1); roi3_mu_MD+= tempMD; roi3_mu_FA+= tempFA; roi3_mu_L1+= tempL1; roi3_mu_RD+= tempRD; roi3_sd_MD+= tempMD*tempMD; roi3_sd_FA+= tempFA*tempFA; roi3_sd_L1+= tempL1*tempL1; roi3_sd_RD+= tempRD*tempRD; roi3_ct+= 1; } } if(roi3_ct > 0 ) { // !!!! make into afni file roi3_mu_MD/= (float) roi3_ct; roi3_mu_FA/= (float) roi3_ct; roi3_mu_L1/= (float) roi3_ct; roi3_mu_RD/= (float) roi3_ct; roi3_sd_MD-= roi3_ct*roi3_mu_MD*roi3_mu_MD; roi3_sd_FA-= roi3_ct*roi3_mu_FA*roi3_mu_FA; roi3_sd_L1-= roi3_ct*roi3_mu_L1*roi3_mu_L1; roi3_sd_RD-= roi3_ct*roi3_mu_RD*roi3_mu_RD; roi3_sd_MD/= (float) roi3_ct-1; roi3_sd_FA/= (float) roi3_ct-1; roi3_sd_L1/= (float) roi3_ct-1; roi3_sd_RD/= (float) roi3_ct-1; roi3_sd_MD = sqrt(roi3_sd_MD); roi3_sd_FA = sqrt(roi3_sd_FA); roi3_sd_L1 = sqrt(roi3_sd_L1); roi3_sd_RD = sqrt(roi3_sd_RD); sprintf(OUT_tracstat,"%s.stats",prefix); if( (fout0 = fopen(OUT_tracstat, "w")) == NULL) { fprintf(stderr, "Error opening file %s.",OUT_tracstat); exit(19); } fprintf(fout0,"%d\t%d\n",Numtract,roi3_ct); fprintf(fout0,"%.3f\t%.3f\n",ave_tract_len/Numtract, ave_tract_len_phys/Numtract); // as usual, these next values would have to be divided by the // bval to get their actual value in standard phys units fprintf(fout0,"%.4f\t%.4f\n",roi3_mu_FA,roi3_sd_FA); fprintf(fout0,"%.4f\t%.4f\n",roi3_mu_MD,roi3_sd_MD); fprintf(fout0,"%.4f\t%.4f\n",roi3_mu_RD,roi3_sd_RD); fprintf(fout0,"%.4f\t%.4f\n",roi3_mu_L1,roi3_sd_L1); fclose(fout0); sprintf(prefix_map,"%s_MAP",prefix); sprintf(prefix_mask,"%s_MASK",prefix); outsetMAP = EDIT_empty_copy( mset1 ) ; EDIT_dset_items( outsetMAP , ADN_datum_all , MRI_short , ADN_prefix , prefix_map , ADN_none ) ; if( !THD_ok_overwrite() && THD_is_ondisk(DSET_HEADNAME(outsetMAP)) ) ERROR_exit("Can't overwrite existing dataset '%s'", DSET_HEADNAME(outsetMAP)); outsetMASK = EDIT_empty_copy( mset1 ) ; EDIT_dset_items( outsetMASK , ADN_datum_all , MRI_byte , ADN_prefix , prefix_mask , ADN_none ) ; if(!THD_ok_overwrite() && THD_is_ondisk(DSET_HEADNAME(outsetMASK)) ) ERROR_exit("Can't overwrite existing dataset '%s'", DSET_HEADNAME(outsetMASK)); m=0; for( k=0 ; k<Dim[2] ; k++ ) for( j=0 ; j<Dim[1] ; j++ ) for( i=0 ; i<Dim[0] ; i++ ) { temp_arr[m]=INDEX[i][j][k][3]; if(temp_arr[m]>0.5) temp_byte[m]=1; else temp_byte[m]=0; m++; } // re-orient the data as original inputs // (this function copies the pointer) EDIT_substitute_brick(outsetMAP, 0, MRI_short, temp_arr); temp_arr=NULL; if(TV_switch[0] || TV_switch[1] || TV_switch[2]) { dsetn = r_new_resam_dset(outsetMAP, NULL, 0.0, 0.0, 0.0, header1.voxel_order, RESAM_NN_TYPE, NULL, 1, 0); DSET_delete(outsetMAP); outsetMAP=dsetn; dsetn=NULL; } EDIT_dset_items( outsetMAP , ADN_prefix , prefix_map , ADN_none ) ; THD_load_statistics(outsetMAP ); if( !THD_ok_overwrite() && THD_is_ondisk(DSET_HEADNAME(outsetMAP)) ) ERROR_exit("Can't overwrite existing dataset '%s'", DSET_HEADNAME(outsetMAP)); tross_Make_History( "3dTrackID" , argc , argv , outsetMAP) ; THD_write_3dim_dataset(NULL, NULL, outsetMAP, True); // re-orient the data as original inputs EDIT_substitute_brick(outsetMASK, 0, MRI_byte, temp_byte); temp_byte=NULL; if(TV_switch[0] || TV_switch[1] || TV_switch[2]) { dsetn = r_new_resam_dset(outsetMASK, NULL, 0.0, 0.0, 0.0, header1.voxel_order, RESAM_NN_TYPE, NULL, 1, 0); DSET_delete(outsetMASK); outsetMASK=dsetn; dsetn=NULL; } EDIT_dset_items( outsetMASK , ADN_prefix , prefix_mask , ADN_none ) ; THD_load_statistics(outsetMASK); if(!THD_ok_overwrite() && THD_is_ondisk(DSET_HEADNAME(outsetMASK)) ) ERROR_exit("Can't overwrite existing dataset '%s'", DSET_HEADNAME(outsetMASK)); tross_Make_History( "3dTrackID" , argc , argv , outsetMASK) ; THD_write_3dim_dataset(NULL, NULL, outsetMASK, True); INFO_message("Number of tracts found = %d",Numtract) ; } else INFO_message("\n No Tracts Found!!!\n"); // ************************************************************ // ************************************************************ // Freeing // ************************************************************ // ************************************************************ // !!! need to free afni-sets? DSET_delete(insetFA); DSET_delete(insetMD); DSET_delete(insetL1); DSET_delete(insetV1); DSET_delete(insetEXTRA); //DSET_delete(outsetMAP); //DSET_delete(outsetMASK); DSET_delete(mset2); DSET_delete(mset1); free(prefix); free(insetV1); free(insetFA); free(mset1); free(mset2); free(insetEXTRA); free(ROI1); free(ROI2); free(temp_byte); for( i=0 ; i<ArrMax ; i++) { free(Tforw[i]); free(Tback[i]); free(flTforw[i]); free(flTback[i]); } free(Tforw); free(Tback); free(flTforw); free(flTback); for( i=0 ; i<Dim[0] ; i++) for( j=0 ; j<Dim[1] ; j++) for( k=0 ; k<Dim[2] ; k++) free(coorded[i][j][k]); for( i=0 ; i<Dim[0] ; i++) for( j=0 ; j<Dim[1] ; j++) free(coorded[i][j]); for( i=0 ; i<Dim[0] ; i++) free(coorded[i]); free(coorded); for( i=0 ; i<Dim[0] ; i++) for( j=0 ; j<Dim[1] ; j++) for( k=0 ; k<Dim[2] ; k++) free(INDEX[i][j][k]); for( i=0 ; i<Dim[0] ; i++) for( j=0 ; j<Dim[1] ; j++) free(INDEX[i][j]); for( i=0 ; i<Dim[0] ; i++) free(INDEX[i]); free(INDEX); free(temp_arr); // need to free for( i=0 ; i<2*ArrMax ; i++) free(Ttot[i]); free(Ttot); //free(mode); return 0; }
int main( int argc , char *argv[] ) { int iarg , nerr=0 , nvals,nvox , nx,ny,nz , ii,jj,kk ; char *prefix="LSSout" , *save1D=NULL , nbuf[256] ; THD_3dim_dataset *inset=NULL , *outset ; MRI_vectim *inset_mrv=NULL ; byte *mask=NULL ; int mask_nx=0,mask_ny=0,mask_nz=0, automask=0, nmask=0 ; NI_element *nelmat=NULL ; char *matname=NULL ; char *cgl ; int Ngoodlist,*goodlist=NULL , nfull , ncmat,ntime ; NI_int_array *giar ; NI_str_array *gsar ; NI_float_array *gfar ; MRI_IMAGE *imX, *imA, *imC, *imS ; float *Xar, *Sar ; MRI_IMARR *imar ; int nS ; float *ss , *oo , *fv , sum ; int nvec , iv ; int nbstim , nst=0 , jst_bot,jst_top ; char *stlab="LSS" ; int nodata=1 ; /*--- help me if you can ---*/ if( argc < 2 || strcasecmp(argv[1],"-HELP") == 0 ) LSS_help() ; /*--- bureaucratic startup ---*/ PRINT_VERSION("3dLSS"); mainENTRY("3dLSS main"); machdep(); AFNI_logger("3dLSS",argc,argv); AUTHOR("RWCox"); (void)COX_clock_time() ; /**------- scan command line --------**/ iarg = 1 ; while( iarg < argc ){ if( strcmp(argv[iarg],"-verb") == 0 ){ verb++ ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-VERB") == 0 ){ verb+=2 ; iarg++ ; continue ; } /**========== -mask ==========**/ if( strcasecmp(argv[iarg],"-mask") == 0 ){ THD_3dim_dataset *mset ; if( ++iarg >= argc ) ERROR_exit("Need argument after '-mask'") ; if( mask != NULL || automask ) ERROR_exit("Can't have two mask inputs") ; mset = THD_open_dataset( argv[iarg] ) ; CHECK_OPEN_ERROR(mset,argv[iarg]) ; DSET_load(mset) ; CHECK_LOAD_ERROR(mset) ; mask_nx = DSET_NX(mset); mask_ny = DSET_NY(mset); mask_nz = DSET_NZ(mset); mask = THD_makemask( mset , 0 , 0.5f, 0.0f ) ; DSET_delete(mset) ; if( mask == NULL ) ERROR_exit("Can't make mask from dataset '%.33s'",argv[iarg]) ; nmask = THD_countmask( mask_nx*mask_ny*mask_nz , mask ) ; if( verb || nmask < 1 ) INFO_message("Number of voxels in mask = %d",nmask) ; if( nmask < 1 ) ERROR_exit("Mask is too small to process") ; iarg++ ; continue ; } if( strcasecmp(argv[iarg],"-automask") == 0 ){ if( mask != NULL ) ERROR_exit("Can't have -automask and -mask") ; automask = 1 ; iarg++ ; continue ; } /**========== -matrix ==========**/ if( strcasecmp(argv[iarg],"-matrix") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '%s'",argv[iarg-1]) ; if( nelmat != NULL ) ERROR_exit("More than 1 -matrix option!?"); nelmat = NI_read_element_fromfile( argv[iarg] ) ; /* read NIML file */ matname = argv[iarg]; if( nelmat == NULL || nelmat->type != NI_ELEMENT_TYPE ) ERROR_exit("Can't process -matrix file '%s'!?",matname) ; iarg++ ; continue ; } /**========== -nodata ===========**/ if( strcasecmp(argv[iarg],"-nodata") == 0 ){ nodata = 1 ; iarg++ ; continue ; } /**========== -input ==========**/ if( strcasecmp(argv[iarg],"-input") == 0 ){ if( inset != NULL ) ERROR_exit("Can't have two -input options!?") ; if( ++iarg >= argc ) ERROR_exit("Need argument after '%s'",argv[iarg-1]) ; inset = THD_open_dataset( argv[iarg] ) ; CHECK_OPEN_ERROR(inset,argv[iarg]) ; nodata = 0 ; iarg++ ; continue ; } /**========== -prefix =========**/ if( strcasecmp(argv[iarg],"-prefix") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '%s'",argv[iarg-1]) ; prefix = strdup(argv[iarg]) ; if( !THD_filename_ok(prefix) ) ERROR_exit("Illegal string after %s",argv[iarg-1]) ; if( verb && strcmp(prefix,"NULL") == 0 ) INFO_message("-prefix NULL ==> no dataset will be written") ; iarg++ ; continue ; } /**========== -save1D =========**/ if( strcasecmp(argv[iarg],"-save1D") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '%s'",argv[iarg-1]) ; save1D = strdup(argv[iarg]) ; if( !THD_filename_ok(save1D) ) ERROR_exit("Illegal string after %s",argv[iarg-1]) ; iarg++ ; continue ; } /***** Loser User *****/ ERROR_message("Unknown option: %s",argv[iarg]) ; suggest_best_prog_option(argv[0], argv[iarg]); exit(1); } /* end of loop over options */ /*----- check for errors -----*/ if( nelmat == NULL ){ ERROR_message("No -matrix option!?") ; nerr++ ; } if( nerr > 0 ) ERROR_exit("Can't continue without these inputs!") ; if( inset != NULL ){ nvals = DSET_NVALS(inset) ; nvox = DSET_NVOX(inset) ; nx = DSET_NX(inset) ; ny = DSET_NY(inset) ; nz = DSET_NZ(inset) ; } else { automask = nvals = 0 ; nvox = nx = ny = nz = nodata = 1 ; /* nodata */ mask = NULL ; } /*----- masque -----*/ if( mask != NULL ){ /* check -mask option for compatibility */ if( mask_nx != nx || mask_ny != ny || mask_nz != nz ) ERROR_exit("-mask dataset grid doesn't match input dataset :-(") ; } else if( automask ){ /* create a mask from input dataset */ mask = THD_automask( inset ) ; if( mask == NULL ) ERROR_message("Can't create -automask from input dataset :-(") ; nmask = THD_countmask( nvox , mask ) ; if( verb || nmask < 1 ) INFO_message("Number of voxels in automask = %d (out of %d = %.1f%%)", nmask, nvox, (100.0f*nmask)/nvox ) ; if( nmask < 1 ) ERROR_exit("Automask is too small to process") ; } else if( !nodata ) { /* create a 'mask' for all voxels */ if( verb ) INFO_message("No mask ==> computing for all %d voxels",nvox) ; mask = (byte *)malloc(sizeof(byte)*nvox) ; nmask = nvox ; memset( mask , 1 , sizeof(byte)*nvox ) ; } /*----- get matrix info from the NIML element -----*/ if( verb ) INFO_message("extracting matrix info") ; ncmat = nelmat->vec_num ; /* number of columns */ ntime = nelmat->vec_len ; /* number of rows */ if( ntime < ncmat+2 ) ERROR_exit("Matrix has too many columns (%d) for number of rows (%d)",ncmat,ntime) ; /*--- number of rows in the full matrix (without censoring) ---*/ cgl = NI_get_attribute( nelmat , "NRowFull" ) ; if( cgl == NULL ) ERROR_exit("Matrix is missing 'NRowFull' attribute!") ; nfull = (int)strtod(cgl,NULL) ; if( nodata ){ nvals = nfull ; } else if( nvals != nfull ){ ERROR_exit("-input dataset has %d time points, but matrix indicates %d", nvals , nfull ) ; } /*--- the goodlist = mapping from matrix row index to time index (which allows for possible time point censoring) ---*/ cgl = NI_get_attribute( nelmat , "GoodList" ) ; if( cgl == NULL ) ERROR_exit("Matrix is missing 'GoodList' attribute!") ; giar = NI_decode_int_list( cgl , ";," ) ; if( giar == NULL || giar->num < ntime ) ERROR_exit("Matrix 'GoodList' badly formatted?!") ; Ngoodlist = giar->num ; goodlist = giar->ar ; if( Ngoodlist != ntime ) ERROR_exit("Matrix 'GoodList' incorrect length?!") ; else if( verb > 1 && Ngoodlist < nfull ) ININFO_message("censoring reduces time series length from %d to %d",nfull,Ngoodlist) ; /*--- extract the matrix from the NIML element ---*/ imX = mri_new( ntime , ncmat , MRI_float ) ; Xar = MRI_FLOAT_PTR(imX) ; if( nelmat->vec_typ[0] == NI_FLOAT ){ /* from 3dDeconvolve_f */ float *cd ; for( jj=0 ; jj < ncmat ; jj++ ){ cd = (float *)nelmat->vec[jj] ; for( ii=0 ; ii < ntime ; ii++ ) Xar[ii+jj*ntime] = cd[ii] ; } } else if( nelmat->vec_typ[0] == NI_DOUBLE ){ /* from 3dDeconvolve */ double *cd ; for( jj=0 ; jj < ncmat ; jj++ ){ cd = (double *)nelmat->vec[jj] ; for( ii=0 ; ii < ntime ; ii++ ) Xar[ii+jj*ntime] = cd[ii] ; } } else { ERROR_exit("Matrix file stored with illegal data type!?") ; } /*--- find the stim_times_IM option ---*/ cgl = NI_get_attribute( nelmat , "BasisNstim") ; if( cgl == NULL ) ERROR_exit("Matrix doesn't have 'BasisNstim' attribute!") ; nbstim = (int)strtod(cgl,NULL) ; if( nbstim <= 0 ) ERROR_exit("Matrix 'BasisNstim' attribute is %d",nbstim) ; for( jj=1 ; jj <= nbstim ; jj++ ){ sprintf(nbuf,"BasisOption_%06d",jj) ; cgl = NI_get_attribute( nelmat , nbuf ) ; if( cgl == NULL || strcmp(cgl,"-stim_times_IM") != 0 ) continue ; if( nst > 0 ) ERROR_exit("More than one -stim_times_IM option was found in the matrix") ; nst = jj ; sprintf(nbuf,"BasisColumns_%06d",jj) ; cgl = NI_get_attribute( nelmat , nbuf ) ; if( cgl == NULL ) ERROR_exit("Matrix doesn't have %s attribute!",nbuf) ; jst_bot = jst_top = -1 ; sscanf(cgl,"%d:%d",&jst_bot,&jst_top) ; if( jst_bot < 0 || jst_top < 0 ) ERROR_exit("Can't decode matrix attribute %s",nbuf) ; if( jst_bot == jst_top ) ERROR_exit("Matrix attribute %s shows only 1 column for -stim_time_IM:\n" " -->> 3dLSS is meant to be used when more than one stimulus\n" " time was given, and then it computes the response beta\n" " for each stim time separately. If you have only one\n" " stim time with -stim_times_IM, you can use the output\n" " dataset from 3dDeconvolve (or 3dREMLfit) to get that\n" " single beta directly.\n" , nbuf ) ; if( jst_bot >= jst_top || jst_top >= ncmat ) ERROR_exit("Matrix attribute %s has illegal value: %d:%d (ncmat=%d)",nbuf,jst_bot,jst_top,ncmat) ; sprintf(nbuf,"BasisName_%06d",jj) ; cgl = NI_get_attribute( nelmat , nbuf ) ; if( cgl != NULL ) stlab = strdup(cgl) ; if( verb > 1 ) ININFO_message("-stim_times_IM at stim #%d; cols %d..%d",jj,jst_bot,jst_top) ; } if( nst == 0 ) ERROR_exit("Matrix doesn't have any -stim_times_IM options inside :-(") ; /*--- mangle matrix to segregate IM regressors from the rest ---*/ if( verb ) INFO_message("setting up LSS vectors") ; imar = LSS_mangle_matrix( imX , jst_bot , jst_top ) ; if( imar == NULL ) ERROR_exit("Can't compute LSS 'mangled' matrix :-(") ; /*--- setup for LSS computations ---*/ imA = IMARR_SUBIM(imar,0) ; imC = IMARR_SUBIM(imar,1) ; imS = LSS_setup( imA , imC ) ; DESTROY_IMARR(imar) ; if( imS == NULL ) ERROR_exit("Can't complete LSS setup :-((") ; nS = imS->ny ; Sar = MRI_FLOAT_PTR(imS) ; if( save1D != NULL ){ mri_write_1D( save1D , imS ) ; if( verb ) ININFO_message("saved LSS vectors into file %s",save1D) ; } else if( nodata ){ WARNING_message("-nodata used but -save1D not used ==> you get no output!") ; } if( nodata || strcmp(prefix,"NULL") == 0 ){ INFO_message("3dLSS ends since prefix is 'NULL' or -nodata was used") ; exit(0) ; } /*----- create output dataset -----*/ if( verb ) INFO_message("creating output datset in memory") ; outset = EDIT_empty_copy(inset) ; EDIT_dset_items( outset , ADN_prefix , prefix , ADN_datum_all , MRI_float , ADN_brick_fac , NULL , ADN_nvals , nS , ADN_ntt , nS , ADN_none ) ; tross_Copy_History( inset , outset ) ; tross_Make_History( "3dLSS" , argc,argv , outset ) ; for( kk=0 ; kk < nS ; kk++ ){ EDIT_substitute_brick( outset , kk , MRI_float , NULL ) ; sprintf(nbuf,"%s#%03d",stlab,kk) ; EDIT_BRICK_LABEL( outset , kk , nbuf ) ; } /*----- convert input dataset to vectim -----*/ if( verb ) INFO_message("loading input dataset into memory") ; DSET_load(inset) ; CHECK_LOAD_ERROR(inset) ; inset_mrv = THD_dset_to_vectim( inset , mask , 0 ) ; DSET_unload(inset) ; /*----- compute dot products, store results -----*/ if( verb ) INFO_message("computing away, me buckos!") ; nvec = inset_mrv->nvec ; for( kk=0 ; kk < nS ; kk++ ){ ss = Sar + kk*ntime ; oo = DSET_ARRAY(outset,kk) ; for( iv=0 ; iv < nvec ; iv++ ){ fv = VECTIM_PTR(inset_mrv,iv) ; for( sum=0.0f,ii=0 ; ii < ntime ; ii++ ) sum += ss[ii] * fv[goodlist[ii]] ; oo[inset_mrv->ivec[iv]] = sum ; } } DSET_write(outset) ; WROTE_DSET(outset) ; /*-------- Hasta la vista, baby --------*/ if( verb ) INFO_message("3dLSS finished: total CPU=%.2f Elapsed=%.2f", COX_cpu_time() , COX_clock_time() ) ; exit(0) ; }
/*! \brief parse the arguments for SurfSmooth program \param argv (char *) \param argc (int) \return Opt (SUMA_GETPATCH_OPTIONS *) options structure. To free it, use SUMA_free(Opt->outfile); SUMA_free(Opt->histnote); SUMA_free(Opt); */ SUMA_KUBATEST_OPTIONS *SUMA_SampBias_ParseInput( char *argv[], int argc, SUMA_KUBATEST_OPTIONS* Opt, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_SampBias_ParseInput"}; int kar, i, ind; char *outprefix; SUMA_Boolean brk = NOPE; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; kar = 1; brk = NOPE; Opt->debug = 0; Opt->plimit = 50; Opt->dlimit = 1000; Opt->outfile = NULL; Opt->prefix = NULL; Opt->segdo = NULL; Opt->ps=ps; while (kar < argc) { /* loop accross command ine options */ /*fprintf(stdout, "%s verbose: Parsing command line...\n", FuncName);*/ if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { ps->hverb = strlen(argv[kar])>3?2:1; usage_SUMA_SampBias(ps); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-plimit") == 0)) { kar++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -plimit \n"); exit (1); } Opt->plimit = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-dlimit") == 0)) { kar++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -dlimit \n"); exit (1); } Opt->dlimit = atof(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-out") == 0)) { kar++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -out \n"); exit (1); } Opt->outfile = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-segdo") == 0)) { kar++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -segdo \n"); exit (1); } Opt->segdo = SUMA_Extension(argv[kar], ".1D.do", NOPE); brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { kar++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -prefix \n"); exit (1); } Opt->prefix = SUMA_copy_string(argv[kar]); brk = YUP; } if (!brk && !ps->arg_checked[kar]) { SUMA_S_Errv("Option %s not understood. Try -help for usage\n", argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } /* sanity checks */ if (Opt->outfile == NULL && Opt->prefix == NULL) { SUMA_SL_Err("No outfile, or prefix specified."); exit(1); } if (Opt->outfile) { if (!THD_ok_overwrite() && SUMA_filexists(Opt->outfile)) { SUMA_S_Errv("Outfile %s already exists\n", Opt->outfile); exit(1); } } if (Opt->prefix) { SUMA_DSET_NAME_CHECK(Opt->prefix); } Opt->histnote = SUMA_HistString (NULL, argc, argv, NULL); SUMA_RETURN (Opt); }
SUMA_GENERIC_PROG_OPTIONS_STRUCT *SUMA_SurfToSurf_ParseInput( char *argv[], int argc, SUMA_GENERIC_ARGV_PARSE *ps) { static char FuncName[]={"SUMA_BrainWrap_ParseInput"}; SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt=NULL; int kar; SUMA_Boolean brk, accepting_out; SUMA_Boolean LocalHead = NOPE; SUMA_ENTRY; Opt = SUMA_Alloc_Generic_Prog_Options_Struct(); kar = 1; brk = NOPE; Opt->in_1D = NULL; Opt->NodeDbg = -1; Opt->debug = 0; Opt->NearestNode = 0; Opt->NearestTriangle = 0; Opt->DistanceToMesh = 0; Opt->ProjectionOnMesh = 0; Opt->NearestNodeCoords = 0; Opt->Data = 0; Opt->in_name = NULL; Opt->out_prefix = NULL; Opt->fix_winding = 0; Opt->iopt = 0; Opt->oform = SUMA_NO_DSET_FORMAT; accepting_out = NOPE; while (kar < argc) { /* loop accross command ine options */ /*fprintf(stdout, "%s verbose: Parsing command line...\n", FuncName);*/ if (!brk && accepting_out) { /* make sure you have not begun with new options */ if (*(argv[kar]) == '-') accepting_out = NOPE; } if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { usage_SurfToSurf(ps, strlen(argv[kar]) > 3 ? 2:1); exit (0); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-debug") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -debug \n"); exit (1); } Opt->debug = atoi(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-node_debug") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -node_debug \n"); exit (1); } Opt->NodeDbg = atoi(argv[++kar]); brk = YUP; } if (!brk && (strcmp(argv[kar], "-node_indices") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a parameter after -node_indices \n"); exit (1); } Opt->in_nodeindices = argv[++kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-closest_possible") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a number after -closest_possible \n"); exit (1); } Opt->iopt = atoi(argv[++kar]); if (Opt->iopt != 0 && Opt->iopt != 1 && Opt->iopt != 2 && Opt->iopt != 3) { SUMA_S_Errv("Must choose from 0, 1, 2, or 3 for -closest_possible." " Have %d\n", Opt->iopt); exit (1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-output_params") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need at least one parameter after output_params \n"); exit (1); } accepting_out = YUP; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "NearestNode") == 0)) { if (Opt->NearestNode < 1) Opt->NearestNode = 1; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "NearestTriangleNodes") == 0)) { if (Opt->NearestNode < 3) Opt->NearestNode = 3; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "NearestTriangle") == 0)) { if (Opt->NearestTriangle < 1) Opt->NearestTriangle = 1; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "DistanceToSurf") == 0)) { Opt->DistanceToMesh = 1; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "ProjectionOnSurf") == 0)) { Opt->ProjectionOnMesh = 1; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "NearestNodeCoords") == 0)) { Opt->NearestNodeCoords = 1; brk = YUP; } if (!brk && accepting_out && (strcmp(argv[kar], "Data") == 0)) { if (Opt->Data < 0) { fprintf (SUMA_STDERR, "Cannot mix parameter Data with -dset option \n"); exit (1); } Opt->Data = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-data") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -data \n"); exit (1); } ++kar; if (strcmp(argv[kar],"_XYZ_") == 0) { /* default Opt->in_name = NULL*/ if (Opt->in_name) { SUMA_SL_Err("Input already specified." "Do not mix -data and -dset"); exit (1); } } else { Opt->in_name = SUMA_copy_string(argv[kar]); } Opt->Data = 1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-dset") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -dset \n"); exit (1); } ++kar; if (strcmp(argv[kar],"_XYZ_") == 0 || Opt->Data > 0) { /* default Opt->in_name = NULL*/ if (Opt->in_name || Opt->Data > 0) { SUMA_SL_Err("Input already specified." "Do not mix -data and -dset." "Or use parameter DATA with -dset"); exit (1); } } else { Opt->in_name = SUMA_copy_string(argv[kar]); } Opt->Data = -1; brk = YUP; } if (!brk && (strcmp(argv[kar], "-prefix") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -prefix \n"); exit (1); } Opt->out_prefix = SUMA_RemoveDsetExtension_eng(argv[++kar], &(Opt->oform)); brk = YUP; } if (!brk && (strcmp(argv[kar], "-mapfile") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -mapfile \n"); exit (1); } Opt->s = SUMA_Extension(argv[++kar],".niml.M2M", NOPE); if (!SUMA_filexists(Opt->s)) { SUMA_S_Errv("File %s not found\n" , Opt->s); exit(1); } brk = YUP; } if (!brk && (strcmp(argv[kar], "-proj_dir") == 0)) { if (kar+1 >= argc) { fprintf (SUMA_STDERR, "need a name after -proj_dir \n"); exit (1); } Opt->in_1D = argv[++kar]; brk = YUP; } if (!brk && (strcmp(argv[kar], "-make_consistent") == 0)) { Opt->fix_winding = 1; brk = YUP; } if (!brk && !ps->arg_checked[kar]) { fprintf (SUMA_STDERR, "Error %s:\n" "Option %s not understood. Try -help for usage\n", FuncName, argv[kar]); suggest_best_prog_option(argv[0], argv[kar]); exit (1); } else { brk = NOPE; kar ++; } } /* set default for NearestNode if nothing has been set */ if (Opt->NearestNode < 1) Opt->NearestNode = 3; if (!Opt->out_prefix) Opt->out_prefix = SUMA_copy_string("SurfToSurf"); if (Opt->in_1D && Opt->s) { SUMA_S_Err("Cannot use -proj_dir along with -mapfile"); exit(1); } SUMA_RETURN(Opt); }
int main( int argc , char *argv[] ) { MRI_shindss *shd ; int ids , nopt , kk ; char *prefix = "EIC" ; char *fname=NULL , *buf ; MRI_vectim *mv ; THD_3dim_dataset *dset ; /*--- official AFNI startup stuff ---*/ mainENTRY("3dExtractGroupInCorr"); machdep(); AFNI_logger("3dExtractGroupInCorr",argc,argv); PRINT_VERSION("3dExtractGroupInCorr"); AUTHOR("RW Cox"); /*-- process options --*/ nopt = 1 ; while( nopt < argc && argv[nopt][0] == '-' ){ if( strcasecmp(argv[nopt],"-prefix") == 0 ){ nopt++ ; if( strcasecmp(argv[nopt],"NULL") == 0 ) prefix = NULL ; else prefix = strdup(argv[nopt]) ; nopt++ ; continue ; } ERROR_message("Unknown option: '%s'",argv[nopt]) ; suggest_best_prog_option(argv[0], argv[nopt]); exit(1); } if( argc < 2 ){ usage_3dExtractGroupInCorr(2) ; exit(0) ; } /* check for errors */ if( nopt >= argc ) ERROR_exit("No input filename on command line?!") ; /*-- read input file --*/ fname = strdup(argv[nopt]) ; if( STRING_HAS_SUFFIX(fname,".data") ){ strcpy(fname+strlen(fname)-5,".niml") ; WARNING_message("EIC: Replaced '.data' with '.niml' in filename") ; } else if( STRING_HAS_SUFFIX(fname,".grpincorr") ){ fname = (char *)realloc(fname,strlen(fname)+16) ; strcat(fname,".niml") ; INFO_message("EIC: Added '.niml' to end of filename") ; } else if( STRING_HAS_SUFFIX(fname,".grpincorr.") ){ fname = (char *)realloc(fname,strlen(fname)+16) ; strcat(fname,"niml") ; INFO_message("EIC: Added 'niml' to end of filename") ; } shd = GRINCOR_read_input( fname ) ; if( shd == NULL ) ERROR_exit("EIC: Cannot continue after input error") ; INFO_message("EIC: file opened, contains %d datasets, %d time series, %s bytes", shd->ndset , shd->nvec , commaized_integer_string(shd->nbytes) ) ; /*-- process input file --*/ fprintf(stderr,"++ %d datasets: ",shd->ndset) ; for( ids=0 ; ids < shd->ndset ; ids++ ){ fprintf(stderr,"%d",ids+1) ; dset = GRINCOR_extract_dataset( shd, ids, prefix ) ; fprintf(stderr,".") ; DSET_write(dset) ; DSET_delete(dset) ; } fprintf(stderr,"\n") ; exit(0) ; }
int main(int argc, char *argv[]) { int CHECK = 0; int iarg; char *Fname_input = NULL; char *Fname_output = NULL; char *Fname_outputBV = NULL; char *Fname_bval = NULL; int opt; FILE *fin=NULL, *fout=NULL, *finbv=NULL, *foutBV=NULL; int i,j,k; int BZER=0,idx=0,idx2=0; MRI_IMAGE *flim=NULL; MRI_IMAGE *preREADIN=NULL; MRI_IMAGE *preREADBVAL=NULL; float *READIN=NULL; float *READBVAL=NULL; float OUT_MATR[MAXGRADS][7]; // b- or g-matrix float OUT_GRAD[MAXGRADS][4]; // b- or g-matrix int INV[3] = {1,1,1}; // if needing to switch int FLAG[MAXGRADS]; float temp; int YES_B = 0; int EXTRA_ZEROS=0; int HAVE_BVAL = 0; int BVAL_OUT = 0; int BVAL_OUT_SEP = 0; float BMAX_REF = 1; // i.e., essentially zero int IN_FORM = 0; // 0 for row, 1 for col int OUT_FORM = 1; // 1 for col, 2 for bmatr int HAVE_BMAX_REF=0 ; // referring to user input value int count_in=0, count_out=0; THD_3dim_dataset *dwset=NULL, *dwout=NULL; int Nbrik = 0; char *prefix=NULL ; float **temp_arr=NULL, **temp_grad=NULL; int Ndwi = 0, dwi=0, Ndwout = 0, Ndwi_final = 0, Ndwout_final = 0; int Nvox = 0; int DWI_COMP_FAC = 0; int ct_dwi = 0; float MaxDP = 0; mainENTRY("1dDW_Grad_o_Mat"); machdep(); if (argc == 1) { usage_1dDW_Grad_o_Mat(1); exit(0); } iarg = 1; while( iarg < argc && argv[iarg][0] == '-' ){ if( strcmp(argv[iarg],"-help") == 0 || strcmp(argv[iarg],"-h") == 0 ) { usage_1dDW_Grad_o_Mat(strlen(argv[iarg])>3 ? 2:1); exit(0); } if( strcmp(argv[iarg],"-flip_x") == 0) { INV[0] = -1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-flip_y") == 0) { INV[1] = -1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-flip_z") == 0) { INV[2] = -1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-keep_b0s") == 0) { YES_B = 1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-put_zeros_top") == 0) { EXTRA_ZEROS = 1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-in_grad_rows") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-in_grad_rows'\n") ; Fname_input = argv[iarg]; count_in++; iarg++ ; continue ; } if( strcmp(argv[iarg],"-in_grad_cols") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-in_grad_cols'\n") ; Fname_input = argv[iarg]; count_in++; IN_FORM = 1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-in_gmatT_cols") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-in_matT_cols'\n") ; Fname_input = argv[iarg]; count_in++; IN_FORM = 2; iarg++ ; continue ; } if( strcmp(argv[iarg],"-in_gmatA_cols") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-in_matA_cols'\n") ; Fname_input = argv[iarg]; count_in++; IN_FORM = 3; iarg++ ; continue ; } if( strcmp(argv[iarg],"-in_bmatT_cols") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-in_matT_cols'\n") ; Fname_input = argv[iarg]; count_in++; IN_FORM = 4; iarg++ ; continue ; } if( strcmp(argv[iarg],"-in_bmatA_cols") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-in_matA_cols'\n") ; Fname_input = argv[iarg]; count_in++; IN_FORM = 5; iarg++ ; continue ; } if( strcmp(argv[iarg],"-out_grad_rows") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-out_grad_cols'\n") ; Fname_output = argv[iarg]; count_out++; OUT_FORM = 0; iarg++ ; continue ; } if( strcmp(argv[iarg],"-out_grad_cols") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-out_grad_cols'\n") ; Fname_output = argv[iarg]; count_out++; OUT_FORM = 1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-out_gmatT_cols") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-out_gmatT_cols'\n") ; Fname_output = argv[iarg]; count_out++; OUT_FORM = 2; iarg++ ; continue ; } if( strcmp(argv[iarg],"-out_gmatA_cols") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-out_gmatA_cols'\n") ; Fname_output = argv[iarg]; count_out++; OUT_FORM = 3; iarg++ ; continue ; } if( strcmp(argv[iarg],"-out_bmatT_cols") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-out_bmatT_cols'\n") ; Fname_output = argv[iarg]; count_out++; OUT_FORM = 4; iarg++ ; continue ; } if( strcmp(argv[iarg],"-out_bmatA_cols") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-out_bmatA_cols'\n") ; Fname_output = argv[iarg]; count_out++; OUT_FORM = 5; iarg++ ; continue ; } if( strcmp(argv[iarg],"-in_bvals") == 0 ){ if( ++iarg >= argc ) ERROR_exit("Need argument after '-in_bvals'\n") ; Fname_bval = argv[iarg]; HAVE_BVAL = 1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-bmax_ref") == 0) { iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-bmax_ref'\n"); BMAX_REF = atof(argv[iarg]); HAVE_BMAX_REF = 1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-out_bval_col") == 0) { BVAL_OUT = 1; iarg++ ; continue ; } // May,2015 if( strcmp(argv[iarg],"-out_bval_row_sep") == 0) { if( ++iarg >= argc ) ERROR_exit("Need argument after '-out_bval_row_sep'\n") ; Fname_outputBV = argv[iarg]; BVAL_OUT_SEP = 1; iarg++ ; continue ; } if( strcmp(argv[iarg],"-proc_dset") == 0 ){ // in DWIs if( ++iarg >= argc ) ERROR_exit("Need argument after '-proc_dset'") ; dwset = THD_open_dataset( argv[iarg] ) ; if( dwset == NULL ) ERROR_exit("Can't open DWI dataset '%s'", argv[iarg]) ; DSET_load(dwset) ; CHECK_LOAD_ERROR(dwset) ; iarg++ ; continue ; } if( strcmp(argv[iarg],"-pref_dset") == 0 ){ // will be output iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-pref_dset'"); prefix = strdup(argv[iarg]) ; if( !THD_filename_ok(prefix) ) ERROR_exit("Illegal name after '-pref_dset'"); iarg++ ; continue ; } if( strcmp(argv[iarg],"-dwi_comp_fac") == 0) { iarg++ ; if( iarg >= argc ) ERROR_exit("Need argument after '-dwi_comp_fac'\n"); DWI_COMP_FAC = atoi(argv[iarg]); if (DWI_COMP_FAC <=1) ERROR_exit("The compression factor after '-dwi_comp_fac'" "must be >1!"); iarg++ ; continue ; } ERROR_message("Bad option '%s'\n",argv[iarg]) ; suggest_best_prog_option(argv[0], argv[iarg]); exit(1); } // * * * * * * * * * * * * * * * * * * * * * * * * * * * if( (Fname_input == NULL) ) { fprintf(stderr, "\n\tBad Command-lining! Option '-in_*' requires argument.\n"); exit(1); } if( (Fname_output == NULL) ) { fprintf(stderr, "\n\tBad Command-lining! Option '-out_*' requires arg.\n"); exit(2); } if( count_in > 1 ) { fprintf(stderr, "\n\tBad Command-lining! Can't have >1 vec file input.\n"); exit(3); } if( count_out > 1 ) { fprintf(stderr, "\n\tBad Command-lining! Can't have >1 output file opt.\n"); exit(4); } if(YES_B && dwset) { fprintf(stderr, "\n** Bad Command-lining! " "Can't have '-keep_b0s' and '-proc_dset' together.\n"); exit(5); } if( !prefix && dwset) { fprintf(stderr, "\n** Bad Command-lining! " "Need an output '-pref_dset' when using '-proc_dset'.\n"); exit(6); } if(YES_B && DWI_COMP_FAC) { fprintf(stderr, "\n** Bad Command-lining! " "Can't have '-keep_b0s' and '-dwi_comp_fac' together.\n"); exit(7); } if(!HAVE_BVAL && (BVAL_OUT || BVAL_OUT_SEP)) { fprintf(stderr, "\n** Bad Command-lining! " "Can't have ask for outputting bvals with no '-in_bvals FILE'.\n"); exit(8); } // ******************************************************************** // ************************* start reading **************************** // ******************************************************************** flim = mri_read_1D (Fname_input); if (flim == NULL) { ERROR_exit("Error reading gradient vector file"); } if( IN_FORM ) preREADIN = mri_transpose(flim); // effectively *undoes* autotranspose else preREADIN = mri_copy(flim); mri_free(flim); idx = preREADIN->ny; if( HAVE_BVAL ) { flim = mri_read_1D (Fname_bval); if (flim == NULL) { ERROR_exit("Error reading b-value file"); } if( flim->ny == 1) preREADBVAL = mri_transpose(flim); // effectively *undoes* autotransp else preREADBVAL = mri_copy(flim); mri_free(flim); idx2 = preREADBVAL->ny; } if(idx>= MAXGRADS ) { printf("Error, too many input grads.\n"); mri_free (preREADIN); if( HAVE_BVAL ) mri_free (preREADBVAL); exit(4); } if( ( (preREADIN->nx != 3 ) && (preREADIN->ny != 3 )) && (preREADIN->nx != 6 ) ) printf("Probably an error, " "because there aren't 3 or 6 numbers in columns!\n"); if( HAVE_BVAL && ( idx != idx2 ) ) { printf("Error, because the number of bvecs (%d)\n" "and bvals (%d) don't appear to match!\n", idx, idx2); mri_free (preREADIN); mri_free (preREADBVAL); exit(3); } if(dwset) { Nbrik = DSET_NVALS(dwset); if( idx != Nbrik ) { fprintf(stderr, "\n** ERROR: the number of bvecs (%d) does not match the " "number of briks in '-proc_dset' (%d).\n", idx, Nbrik); exit(4); } } READIN = MRI_FLOAT_PTR( preREADIN ); if( HAVE_BVAL ) READBVAL = MRI_FLOAT_PTR( preREADBVAL ); // 0 is grad row; // 1 is grad col; // 2 is gmatrRow col T; // 3 is gmatrDiag col A; // 4 is bmatrRow col T; // 5 is bmatrDiag col A; //if( IN_FORM == 0 ) // grad rows, no binfo // for( i=0; i<idx ; i++ ) // for ( j=0; j<3 ; j++ ) // OUT_GRAD[i][j+1] = *(READIN +j*idx +i) ; //else if ( IN_FORM <= 1 ) // grad cols, no binfo for( i=0; i<idx ; i++ ) for ( j=0; j<3 ; j++ ) OUT_GRAD[i][j+1] = *(READIN + 3*i+j); // A/row/3dDWItoDT: Bxx, Byy, Bzz, Bxy, Bxz, Byz // T/diag/TORTOISE: b_xx 2b_xy 2b_xz b_yy 2b_yz b_zz else if ( (IN_FORM == 3) || (IN_FORM ==5 ) ) { // diag matr for( i=0; i<idx ; i++ ) { for( j=0; j<3 ; j++ ) { OUT_MATR[i][j+1] = *(READIN+6*i+j); OUT_MATR[i][3+j+1] = *(READIN+6*i+3+j); } for( j=0; j<3 ; j++ ) if(OUT_MATR[i][j] < 0 ) CHECK++; } if(CHECK > 0) INFO_message("Warning: you *said* you input a mat'T'," " but the matr diagonals don't appear to be uniformly" " positive. If input cols 0, 3 and 5 are positive," " then you might have meant mat'A'?"); } else if ( (IN_FORM ==2 ) || (IN_FORM ==4 ) ) { // row matr CHECK = 0; for( i=0; i<idx ; i++ ) { OUT_MATR[i][1] = *(READIN +6*i); OUT_MATR[i][2] = *(READIN +6*i+3); OUT_MATR[i][3] = *(READIN +6*i+5); OUT_MATR[i][4] = *(READIN +6*i+1)/2.; OUT_MATR[i][5] = *(READIN +6*i+2)/2.; OUT_MATR[i][6] = *(READIN +6*i+4)/2.; } for( i=0; i<idx ; i++ ) for( j=0; j<3 ; j++ ) if(OUT_MATR[i][j] < 0 ) CHECK++; if(CHECK > 0) INFO_message("Warning: you *said* you input a mat'A'," " but the matr diagonals don't appear to be uniformly" " positive. If input cols 0, 1 and 2 are positive," " then you might have meant mat'T'?"); } else{ fprintf(stderr, "Coding error with format number (%d), not allowed.\n", IN_FORM); exit(2); } // get bval info if( ( (IN_FORM ==4 ) || (IN_FORM ==5 ) ) ) { //bval for( i=0; i<idx ; i++ ) { OUT_MATR[i][0] = OUT_GRAD[i][0] = OUT_MATR[i][1] + OUT_MATR[i][2] + OUT_MATR[i][3]; if( OUT_MATR[i][0] > 0.000001) for( j=1 ; j<7 ; j++ ) OUT_MATR[i][j]/= OUT_MATR[i][0]; } } else if ( HAVE_BVAL ) for( i=0; i<idx ; i++ ) { OUT_MATR[i][0] = OUT_GRAD[i][0] = *(READBVAL + i); } else if ( OUT_FORM > 3 || BVAL_OUT || BVAL_OUT_SEP || HAVE_BMAX_REF ) { fprintf(stderr, "ERROR: you asked for b-value dependent output, " "but gave me no bvals to work with.\n"); exit(2); } // * * * ** * * * * * * * * ** ** * * ** * * ** * ** * ** * * * // at this point, all IN_FORM >1 cases which need bval have led to: // + grad[0] has bval // + matr[0] has bval // + matr file normalized and in diagonal form // * * * ** * * * * * * * * ** ** * * ** * * ** * ** * ** * * * for( i=0; i<idx ; i++ ) if( IN_FORM > 1) j = GradConv_Gsign_from_BmatA( OUT_GRAD[i]+1, OUT_MATR[i]+1); else j = GradConv_BmatA_from_Gsign( OUT_MATR[i]+1, OUT_GRAD[i]+1); // flip if necessary for( i=0 ; i<idx ; i++) { for( j=0 ; j<3 ; j++) OUT_GRAD[i][j+1]*= INV[j]; OUT_MATR[i][4]*= INV[0]*INV[1]; OUT_MATR[i][5]*= INV[0]*INV[2]; OUT_MATR[i][6]*= INV[1]*INV[2]; } BZER=0; for( i=0 ; i<idx ; i++) { if( HAVE_BVAL || (IN_FORM ==4) || (IN_FORM ==5) ) if( OUT_GRAD[i][0] >= BMAX_REF ) FLAG[i] = 1; else{ if( YES_B ) FLAG[i] = 1; BZER++; } else { temp = 0.; for( j=1 ; j<4 ; j++) temp+= pow(OUT_GRAD[i][j],2); if( temp > 0.1 ) FLAG[i] = 1; else{ if( YES_B ) FLAG[i] = 1; BZER++; } } } if(YES_B) { printf("\tChose to *keep* %d b0s,\tas well as \t%d grads\n", BZER,idx-BZER); BZER=0; } else { printf("\tGetting rid of %d b0s,\tleaving the %d grads\n", BZER,idx-BZER); Ndwi = idx-BZER; } Ndwi_final = idx-BZER; // default: all DWIs if( DWI_COMP_FAC ) { if( Ndwi % DWI_COMP_FAC != 0 ) { fprintf(stderr, "\n** ERROR can't compress: " "Ndwi=%d, and %d/%d has a nonzero remainder (=%d).\n", Ndwi,Ndwi,DWI_COMP_FAC, Ndwi % DWI_COMP_FAC ); exit(1); } else { Ndwi_final = Ndwi/DWI_COMP_FAC; INFO_message("You have chosen a compression factor of %d, " "with %d DWIs,\n" "\tso that afterward there will be %d DWIs.", DWI_COMP_FAC, Ndwi, Ndwi_final); } } if(BVAL_OUT_SEP) if( (foutBV = fopen(Fname_outputBV, "w")) == NULL) { fprintf(stderr, "\n\nError opening file %s.\n",Fname_outputBV); exit(1); } if( (fout = fopen(Fname_output, "w")) == NULL) { fprintf(stderr, "\n\nError opening file %s.\n",Fname_output); exit(1); } // 0 is grad row; // 1 is grad col; // 2 is gmatrRow col T; // 3 is gmatrDiag col A; // 4 is bmatrRow col T; // 5 is bmatrDiag col A; if( OUT_FORM>0) { if( EXTRA_ZEROS ) { if( BVAL_OUT ) fprintf(fout,"%8d ", 0); if( BVAL_OUT_SEP ) fprintf(foutBV,"%8d ", 0); if( OUT_FORM == 1 ) for( k=1 ; k<4 ; k++ ) fprintf(fout,"%11.5f ", 0.0); else if ( OUT_FORM > 1 ) // bit superfluous at this point for( k=1 ; k<7 ; k++ ) fprintf(fout,"%11.5f ", 0.0); fprintf(fout,"\n"); } ct_dwi = 0; for(i=0 ; i<idx ; i++){ if(FLAG[i]) { if( BVAL_OUT ) fprintf(fout,"%8d ", (int) OUT_GRAD[i][0]); if( BVAL_OUT_SEP ) fprintf(foutBV,"%8d ", (int) OUT_GRAD[i][0]); if( (OUT_FORM == 4) || (OUT_FORM ==5) ) for( k=1 ; k<7 ; k++ ) OUT_MATR[i][k]*= OUT_MATR[i][0]; if( OUT_FORM == 1 ) // grad col for( k=1 ; k<4 ; k++ ) fprintf(fout,"%11.5f ", OUT_GRAD[i][k]); else if( (OUT_FORM == 3) || (OUT_FORM == 5) ) { // gmat for( k=1 ; k<6 ; k++ ) fprintf(fout,"%11.5f ", OUT_MATR[i][k]); fprintf(fout,"%11.5f", OUT_MATR[i][k]); } else if ( (OUT_FORM == 2 ) || (OUT_FORM ==4)) { // bmat fprintf(fout,"%11.5f ", OUT_MATR[i][1]); fprintf(fout,"%11.5f ", 2*OUT_MATR[i][4]); fprintf(fout,"%11.5f ", 2*OUT_MATR[i][5]); fprintf(fout,"%11.5f ", OUT_MATR[i][2]); fprintf(fout,"%11.5f ", 2*OUT_MATR[i][6]); fprintf(fout,"%11.5f", OUT_MATR[i][3]); } fprintf(fout,"\n"); ct_dwi++; } if( (ct_dwi == Ndwi_final) && DWI_COMP_FAC ) { INFO_message("Reached compression level: DWI number %d", Ndwi_final); break; } } } else if(OUT_FORM ==0) { if(BVAL_OUT) WARNING_message("Ignoring '-out_bval_col' option, since " " you are outputting in rows."); for( k=1 ; k<4 ; k++ ) { if(EXTRA_ZEROS){ fprintf(fout,"% -11.5f ", 0.0); if( (k==1) && BVAL_OUT_SEP ) // only output 1 zeroin bval file fprintf(foutBV,"%8d ", 0); } ct_dwi = 0; for(i=0 ; i<idx ; i++) { if(FLAG[i]) { fprintf(fout,"% -11.5f ", OUT_GRAD[i][k]); if( (k==1) && BVAL_OUT_SEP )// only output 1 zeroin bval file fprintf(foutBV,"%8d ", (int) OUT_GRAD[i][0]); ct_dwi++; } if( (ct_dwi == Ndwi_final) && DWI_COMP_FAC ) { INFO_message("Reached compression level: DWI number %d", Ndwi_final); break; } } fprintf(fout,"\n"); } } fclose(fout); if( BVAL_OUT_SEP ) { fprintf(foutBV,"\n"); fclose(foutBV); } if(dwset) { INFO_message("Processing the B0+DWI file now."); if(!BZER) { fprintf(stderr, "\n** Error in processing data set: " "no b=0 values from bvecs/bval info!\n"); exit(5); } // FLAG marks where DWIs are if not using '-keep_b0s'! Nvox = DSET_NVOX(dwset); Ndwout = Ndwi+1; temp_arr = calloc( Ndwout,sizeof(temp_arr)); for( i=0 ; i<Ndwout ; i++) temp_arr[i] = calloc( Nvox,sizeof(float)); temp_grad = calloc( Ndwi,sizeof(temp_grad)); for( i=0 ; i<Ndwi ; i++) temp_grad[i] = calloc( 3,sizeof(float)); if( (temp_arr == NULL) || (temp_grad == NULL) ) { fprintf(stderr, "\n\n MemAlloc failure.\n\n"); exit(123); } dwi = 0; // keep track of DWI contraction for( i=0 ; i<Nbrik ; i++) if( !FLAG[i] ) // b=0 for( j=0 ; j<Nvox ; j++) temp_arr[0][j]+= THD_get_voxel(dwset,j,i); else { for( j=0 ; j<3 ; j++) temp_grad[dwi][j]= OUT_GRAD[i][j+1]; dwi++; for( j=0 ; j<Nvox ; j++) temp_arr[dwi][j]+= THD_get_voxel(dwset,j,i); } if( dwi != Ndwi ) { fprintf(stderr, "\n** Mismatch in internal DWI counting!\n"); exit(6); } // average the values for( j=0 ; j<Nvox ; j++) temp_arr[0][j]/= BZER; // can't be zero here. if( DWI_COMP_FAC ) { INFO_message("Compressing DWI file"); for( k=1 ; k<DWI_COMP_FAC ; k++) for( i=0 ; i<Ndwi_final ; i++) for( j=0 ; j<Nvox ; j++) temp_arr[1+i][j]+= temp_arr[1+k*Ndwi_final+i][j]; for( i=0 ; i<Ndwi_final ; i++) for( j=0 ; j<Nvox ; j++) temp_arr[1+i][j]/= DWI_COMP_FAC; INFO_message("Checking closeness of compressed gradient values"); MaxDP = GradCloseness(temp_grad, Ndwi, DWI_COMP_FAC); INFO_message("The max angular difference between matched/compressed\n" "\tgradients is: %f", MaxDP); if( MaxDP > 2) WARNING_message("The max angular difference seem kinda big-- you\n" " sure about the compression factor?"); } Ndwout_final = Ndwi_final + 1; INFO_message("Writing the processed data set."); dwout = EDIT_empty_copy( dwset ); EDIT_dset_items(dwout, ADN_nvals, Ndwout_final, ADN_ntt, 0, ADN_datum_all, MRI_float , ADN_prefix, prefix, ADN_none ); for( i=0; i<Ndwout_final ; i++) { EDIT_substitute_brick(dwout, i, MRI_float, temp_arr[i]); temp_arr[i]=NULL; } // if necessary for( i=Ndwout_final ; i<Ndwout ; i++) temp_arr[i]=NULL; THD_load_statistics( dwout ); if( !THD_ok_overwrite() && THD_is_ondisk(DSET_HEADNAME(dwout)) ) ERROR_exit("Can't overwrite existing dataset '%s'", DSET_HEADNAME(dwout)); tross_Make_History("1dDW_Grad_o_Mat", argc, argv, dwout); THD_write_3dim_dataset(NULL, NULL, dwout, True); DSET_delete(dwout); free(dwout); DSET_delete(dwset); free(dwset); for( i=0 ; i<Ndwout_final ; i++) free(temp_arr[i]); free(temp_arr); } mri_free(preREADIN); if( HAVE_BVAL ) mri_free(preREADBVAL); if(prefix) free(prefix); printf("\n\tDone. Check output file '%s' for results",Fname_output); if(dwset) { printf("\n\t-> as well as the data_set '%s'",DSET_FILECODE(dwout)); } if(BVAL_OUT_SEP) printf("\n\t-> and even the b-value rows '%s'",Fname_outputBV); printf("\n\n"); exit(0); }