/*---------------------------------------------------------------------- Parameters: Description: ----------------------------------------------------------------------*/ static double MRISannotArea(MRI_SURFACE *mris, int label) { int vno, annotation ; VERTEX *v ; double area ; annotation = index_to_annotation(label) ; for (area = 0.0, vno = 0 ; vno < mris->nvertices ; vno++) { v = &mris->vertices[vno] ; if (v->ripflag) continue ; if (v->annotation == annotation) area += v->area ; } return(area) ; }
static int translate_indices_to_annotations(MRI_SURFACE *mris, char *translation_fname) { int vno ; VERTEX *v ; read_named_annotation_table(translation_fname) ; for (vno = 0 ; vno < mris->nvertices ; vno++) { v = &mris->vertices[vno] ; if (v->ripflag) continue ; v->annotation = index_to_annotation((int)v->val) ; if (v->annotation == -1) v->annotation = (unknown_label > 0) ? unknown_label : 0 ; } return(NO_ERROR) ; }
/*---------------------------------------------------------------------- Parameters: Description: ----------------------------------------------------------------------*/ int main(int argc, char *argv[]) { char **av, *subject_name, *cp, *hemi, *surf_name, *annot_name, fname[STRLEN], *name ; int ac, nargs, msec, minutes, label, seconds, i ; double area, total_area ; struct timeb start ; MRIS *mris ; FILE *log_fp ; /* rkt: check for and handle version tag */ nargs = handle_version_option (argc, argv, "$Id: mris_compute_overlap.c,v 1.6 2011/03/02 00:04:30 nicks Exp $", "$Name: stable5 $"); if (nargs && argc - nargs == 1) exit (0); argc -= nargs; Progname = argv[0] ; ErrorInit(NULL, NULL, NULL) ; DiagInit(NULL, NULL, NULL) ; TimerStart(&start) ; ac = argc ; av = argv ; for ( ; argc > 1 && ISOPTION(*argv[1]) ; argc--, argv++) { nargs = get_option(argc, argv) ; argc -= nargs ; argv += nargs ; } if (argc < 3) usage_exit(1) ; subject_name = argv[1] ; hemi = argv[2] ; surf_name = argv[3] ; annot_name = argv[4] ; if (strlen(sdir) == 0) { cp = getenv("SUBJECTS_DIR") ; if (!cp) ErrorExit (ERROR_BADPARM, "%s: SUBJECTS_DIR not defined in env or cmd line", Progname) ; strcpy(sdir, cp) ; } sprintf(fname, "%s/%s/surf/%s.%s", sdir, subject_name, hemi, surf_name) ; mris = MRISread(fname) ; if (!mris) ErrorExit (ERROR_NOFILE, "%s: could not read surface from %s", Progname,fname) ; MRIScomputeMetricProperties(mris) ; #if 0 if (in_label >= 0) MRIreplaceValues(mri, mri, in_label, out_label) ; #endif if (compute_pct) total_area = mris->total_area ; else total_area = 1 ; if (MRISreadAnnotation(mris, annot_name) != NO_ERROR) ErrorExit (ERROR_NOFILE, "%s: could not read annot file %s", Progname, annot_name) ; for (i = 5 ; i < argc ; i++) { label = atoi(argv[i]) ; name = annotation_to_name(index_to_annotation(label), NULL) ; printf("processing label %s (%d)...\n", name, label) ; area = MRISannotArea(mris, label) ; if (log_fname) { char fname[STRLEN] ; sprintf(fname, log_fname, label) ; printf("logging to %s...\n", fname) ; log_fp = fopen(fname, "a+") ; if (!log_fp) ErrorExit(ERROR_BADFILE, "%s: could not open %s for writing", Progname, fname) ; } else log_fp = NULL ; if (compute_pct) { printf("%2.3f mm^2 in label %d (%s), " "%%%2.6f of total cortical area (%2.2f)\n", area, label, name, 100.0*(float)area/(float)total_area, total_area) ; if (log_fp) { fprintf(log_fp,"%2.6f\n", 100.0*area/(float)total_area) ; fclose(log_fp) ; } } else { printf("%2.0f mm^2 in label %s (%d)\n", area, name, label) ; if (log_fp) { fprintf(log_fp,"%f\n", area) ; fclose(log_fp) ; } } } msec = TimerStop(&start) ; seconds = nint((float)msec/1000.0f) ; minutes = seconds / 60 ; seconds = seconds % 60 ; if (DIAG_VERBOSE_ON) printf("area calculation took %d minutes and %d seconds.\n", minutes, seconds) ; exit(0) ; return(0) ; }
/*---------------------------------------------------------------*/ int main(int argc, char *argv[]) { int nargs, nthlabel, n, vtxno, ano, index, nunhit; nargs = handle_version_option (argc, argv, vcid, "$Name: stable5 $"); if (nargs && argc - nargs == 1) exit (0); argc -= nargs; cmdline = argv2cmdline(argc,argv); uname(&uts); getcwd(cwd,2000); Progname = argv[0] ; argc --; argv++; ErrorInit(NULL, NULL, NULL) ; DiagInit(NULL, NULL, NULL) ; if (argc == 0) usage_exit(); parse_commandline(argc, argv); check_options(); if (checkoptsonly) return(0); dump_options(stdout); // Make sure subject exists sprintf(tmpstr,"%s/%s",SUBJECTS_DIR,subject); if (!fio_IsDirectory(tmpstr)) { printf("ERROR: cannot find %s\n",tmpstr); exit(1); } if(AnnotPath == NULL){ // Get path to annot, make sure it does not exist sprintf(tmpstr,"%s/%s/label/%s.%s.annot", SUBJECTS_DIR,subject,hemi,AnnotName); if (fio_FileExistsReadable(tmpstr)) { printf("ERROR: %s already exists\n",tmpstr); exit(1); } AnnotPath = strcpyalloc(tmpstr); } // Read the surf sprintf(tmpstr,"%s/%s/surf/%s.orig",SUBJECTS_DIR,subject,hemi); printf("Loading %s\n",tmpstr); mris = MRISread(tmpstr); if (mris == NULL) exit(1); // Set up color table set_atable_from_ctable(ctab); mris->ct = ctab; // Set up something to keep track of nhits nhits = MRIalloc(mris->nvertices,1,1,MRI_INT); // Set up something to keep track of max stat for that vertex if (maxstatwinner) maxstat = MRIalloc(mris->nvertices,1,1,MRI_FLOAT); // Go thru each label for (nthlabel = 0; nthlabel < nlabels; nthlabel ++) { label = LabelRead(subject,LabelFiles[nthlabel]); if (label == NULL) { printf("ERROR: reading %s\n",LabelFiles[nthlabel]); exit(1); } index = nthlabel; if (MapUnhitToUnknown) index ++; ano = index_to_annotation(index); printf("%2d %2d %s\n",index,ano,index_to_name(index)); for (n = 0; n < label->n_points; n++) { vtxno = label->lv[n].vno; if (vtxno < 0 || vtxno > mris->nvertices) { printf("ERROR: %s, n=%d, vertex %d out of range\n", LabelFiles[nthlabel],n,vtxno); exit(1); } if(DoLabelThresh && label->lv[n].stat < LabelThresh) continue; if (maxstatwinner) { float stat = MRIgetVoxVal(maxstat,vtxno,0,0,0); if (label->lv[n].stat < stat) { if (verbose) { printf("Keeping prior label for vtxno %d " "(old_stat=%f > this_stat=%f)\n", vtxno,stat,label->lv[n].stat); } continue; } MRIsetVoxVal(maxstat,vtxno,0,0,0,label->lv[n].stat); } if (verbose) { if (MRIgetVoxVal(nhits,vtxno,0,0,0) > 0) { printf ("WARNING: vertex %d maps to multiple labels! (overwriting)\n", vtxno); } } MRIsetVoxVal(nhits,vtxno,0,0,0,MRIgetVoxVal(nhits,vtxno,0,0,0)+1); mris->vertices[vtxno].annotation = ano; //printf("%5d %2d %2d %s\n",vtxno,segid,ano,index_to_name(segid)); } // label ponts LabelFree(&label); }// Label nunhit = 0; if (MapUnhitToUnknown) { printf("Mapping unhit to unknown\n"); for (vtxno = 0; vtxno < mris->nvertices; vtxno++) { if (MRIgetVoxVal(nhits,vtxno,0,0,0) == 0) { ano = index_to_annotation(0); mris->vertices[vtxno].annotation = ano; nunhit ++; } } printf("Found %d unhit vertices\n",nunhit); } if (dilate_label_name) { dilate_label_into_unknown(mris, dilate_label_annot) ; } printf("Writing annot to %s\n",AnnotPath); MRISwriteAnnotation(mris, AnnotPath); if (NHitsFile != NULL) MRIwrite(nhits,NHitsFile); return 0; }