Пример #1
0
static int
most_frequent_label(MRI *mri_seg, MRI_SEGMENT *mseg)
{
  int  label_counts[MAX_CMA_LABELS], i, max_count, max_label, label ;

  memset(label_counts, 0, sizeof(label_counts)) ;
  for (i = max_count = max_label = 0 ; i < mseg->nvoxels ; i++)
  {
    label = MRIgetVoxVal(mri_seg, 
                         mseg->voxels[i].x, 
                         mseg->voxels[i].y, 
                         mseg->voxels[i].z, 0) ;
    if (IS_WM(label) == 0 && IS_UNKNOWN(label) == 0)
    {
      label_counts[label]++ ;
    }
  }
  for (i = max_count = max_label = 0 ; i < MAX_CMA_LABELS ; i++)
  {
    if (label_counts[i] > max_count)
    {
      max_count = label_counts[i] ;
      max_label = i ;
    }
  }
  return(max_label) ;
}
Пример #2
0
/**
 * gst_video_colorimetry_to_string:
 * @cinfo: a #GstVideoColorimetry
 *
 * Make a string representation of @cinfo.
 *
 * Returns: a string representation of @cinfo.
 */
gchar *
gst_video_colorimetry_to_string (GstVideoColorimetry * cinfo)
{
  gint i;

  for (i = 0; colorimetry[i].name; i++) {
    if (IS_EQUAL (&colorimetry[i], cinfo)) {
      return g_strdup (colorimetry[i].name);
    }
  }
  if (!IS_UNKNOWN (cinfo)) {
    return g_strdup_printf ("%d:%d:%d:%d", cinfo->range, cinfo->matrix,
        cinfo->transfer, cinfo->primaries);
  }
  return NULL;
}
Пример #3
0
inline_static int setup_all_presets(struct wininfo *hwinfo)
{
  int pnum, s;
  char note[100];

  if (IS_UNKNOWN(hwinfo))
    {
      fprintf(stderr,"PAPI doesn't support this chipset?\n");
      abort();
    }

  if (IS_AMDATHLON(hwinfo) || IS_AMDDURON(hwinfo))
    _papi_hwd_preset_map = k7_preset_map;
  else if (IS_P4(hwinfo))
  {
      fprintf(stderr,"PAPI doesn't support the P4 yet...\n");
      abort();
  }
  else 
    _papi_hwd_preset_map = p6_preset_map;

  for (pnum = 0; pnum < PAPI_MAX_PRESET_EVENTS; pnum++)
    {
      if ((s = _papi_hwd_preset_map[pnum].selector))
	{
	  if (_papi_hwi_system_info.num_cntrs == 2)
	    {
	      sprintf(note,"0x%x,0x%x",
		      _papi_hwd_preset_map[pnum].counter_cmd.evntsel[0],
		      _papi_hwd_preset_map[pnum].counter_cmd.evntsel[1]);
	      strcat(_papi_hwd_preset_map[pnum].note,note);
	    }
	  else if (_papi_hwi_system_info.num_cntrs == 4)
	    {
	      sprintf(note,"0x%x,0x%x,0x%x,0x%x",
		      _papi_hwd_preset_map[pnum].counter_cmd.evntsel[0],
		      _papi_hwd_preset_map[pnum].counter_cmd.evntsel[1],
		      _papi_hwd_preset_map[pnum].counter_cmd.evntsel[2],
		      _papi_hwd_preset_map[pnum].counter_cmd.evntsel[3]);
	      strcat(_papi_hwd_preset_map[pnum].note,note);
	    }
	  else
	    abort();
	}
    }
  return(PAPI_OK);
}
Пример #4
0
int
main(int argc, char *argv[]) {
    char         **av, fname[STRLEN], *out_fname, *subject_name, *cp ;
    int          ac, nargs, i, n, noint = 0, options ;
    int          msec, minutes, seconds, nsubjects, input ;
    struct timeb start ;
    GCA          *gca ;
    MRI          *mri_seg, *mri_tmp, *mri_inputs ;
    TRANSFORM    *transform ;
    LTA          *lta;
    GCA_BOUNDARY *gcab ;

    Progname = argv[0] ;

    ErrorInit(NULL, NULL, NULL) ;
    DiagInit(NULL, NULL, NULL) ;

    TimerStart(&start) ;

    parms.use_gradient = 0 ;
    spacing = 8 ;

    /* rkt: check for and handle version tag */
    nargs = handle_version_option
            (argc, argv,
             "$Id: mri_gcab_train.c,v 1.4 2011/03/16 20:23:33 fischl Exp $",
             "$Name:  $");
    if (nargs && argc - nargs == 1)
        exit (0);
    argc -= nargs;

    // parse command line args
    ac = argc ;
    av = argv ;
    for ( ; argc > 1 && ISOPTION(*argv[1]) ; argc--, argv++) {
        nargs = get_option(argc, argv) ;
        argc -= nargs ;
        argv += nargs ;
    }

    printf("reading gca from %s\n", argv[1]) ;
    gca = GCAread(argv[1]) ;
    if (!gca)
        exit(Gerror) ;

    if (!strlen(subjects_dir)) /* hasn't been set on command line */
    {
        cp = getenv("SUBJECTS_DIR") ;
        if (!cp)
            ErrorExit(ERROR_BADPARM, "%s: SUBJECTS_DIR not defined in environment",
                      Progname);
        strcpy(subjects_dir, cp) ;
        if (argc < 4)
            usage_exit(1) ;
    }

    // options parsed.   subjects and gca name remaining
    out_fname = argv[argc-1] ;
    nsubjects = argc-3 ;
    for (options = i = 0 ; i < nsubjects ; i++) {
        if (argv[i+1][0] == '-') {
            nsubjects-- ;
            options++ ;
        }
    }

    printf("training on %d subject and writing results to %s\n",
           nsubjects, out_fname) ;

    n = 0 ;

    gcab = GCABalloc(gca, 8, 0, 30, 10, target_label);
    strcpy(gcab->gca_fname, argv[1]) ;
    // going through the subject one at a time
    for (nargs = i = 0 ; i < nsubjects+options ; i++) {
        subject_name = argv[i+2] ;
        //////////////////////////////////////////////////////////////
        printf("***************************************"
               "************************************\n");
        printf("processing subject %s, %d of %d...\n", subject_name,i+1-nargs,
               nsubjects);

        if (stricmp(subject_name, "-NOINT") == 0) {
            printf("not using intensity information for subsequent subjects...\n");
            noint = 1 ;
            nargs++ ;
            continue ;
        } else if (stricmp(subject_name, "-INT") == 0) {
            printf("using intensity information for subsequent subjects...\n");
            noint = 0 ;
            nargs++ ;
            continue ;
        }
        // reading this subject segmentation
        sprintf(fname, "%s/%s/mri/%s", subjects_dir, subject_name, seg_dir) ;
        if (Gdiag & DIAG_SHOW && DIAG_VERBOSE_ON)
            fprintf(stderr, "Reading segmentation from %s...\n", fname) ;
        mri_seg = MRIread(fname) ;
        if (!mri_seg)
            ErrorExit(ERROR_NOFILE, "%s: could not read segmentation file %s",
                      Progname, fname) ;
        if ((mri_seg->type != MRI_UCHAR) && (mri_seg->type != MRI_FLOAT)) {
            ErrorExit
            (ERROR_NOFILE,
             "%s: segmentation file %s is not type UCHAR or FLOAT",
             Progname, fname) ;
        }

        if (binarize) {
            int j ;
            for (j = 0 ; j < 256 ; j++) {
                if (j == binarize_in)
                    MRIreplaceValues(mri_seg, mri_seg, j, binarize_out) ;
                else
                    MRIreplaceValues(mri_seg, mri_seg, j, 0) ;
            }
        }
        if (insert_fname) {
            MRI *mri_insert ;

            sprintf(fname, "%s/%s/mri/%s",
                    subjects_dir, subject_name, insert_fname) ;
            mri_insert = MRIread(fname) ;
            if (mri_insert == NULL)
                ErrorExit(ERROR_NOFILE,
                          "%s: could not read volume from %s for insertion",
                          Progname, insert_fname) ;

            MRIbinarize(mri_insert, mri_insert, 1, 0, insert_label) ;
            MRIcopyLabel(mri_insert, mri_seg, insert_label) ;
            MRIfree(&mri_insert) ;
        }

        replaceLabels(mri_seg) ;
        MRIeraseBorderPlanes(mri_seg, 1) ;

        for (input = 0 ; input < gca->ninputs ; input++) {
            //////////// set the gca type //////////////////////////////
            // is this T1/PD training?
            // how can we allow flash data training ???????
            // currently checks the TE, TR, FA to be the same for all inputs
            // thus we cannot allow flash data training.
            ////////////////////////////////////////////////////////////

            sprintf(fname, "%s/%s/mri/%s",
                    subjects_dir, subject_name,input_names[input]);
            if (DIAG_VERBOSE_ON)
                printf("reading co-registered input from %s...\n", fname) ;
            fprintf(stderr, "   reading input %d: %s\n", input, fname);
            mri_tmp = MRIread(fname) ;
            if (!mri_tmp)
                ErrorExit
                (ERROR_NOFILE,
                 "%s: could not read image from file %s", Progname, fname) ;
            // input check 1
            if (getSliceDirection(mri_tmp) != MRI_CORONAL) {
                ErrorExit
                (ERROR_BADPARM,
                 "%s: must be in coronal direction, but it is not\n",
                 fname);
            }
            // input check 2
            if (mri_tmp->xsize != 1 || mri_tmp->ysize != 1 || mri_tmp->zsize != 1) {
                ErrorExit
                (ERROR_BADPARM,
                 "%s: must have 1mm voxel size, but have (%f, %f, %f)\n",
                 fname, mri_tmp->xsize, mri_tmp->ysize, mri_tmp->ysize);
            }
            // input check 3 is removed.  now we can handle c_(ras) != 0 case
            // input check 4
            if (i == 0) {
                TRs[input] = mri_tmp->tr ;
                FAs[input] = mri_tmp->flip_angle ;
                TEs[input] = mri_tmp->te ;
            } else if (!FEQUAL(TRs[input],mri_tmp->tr) ||
                       !FEQUAL(FAs[input],mri_tmp->flip_angle) ||
                       !FEQUAL(TEs[input], mri_tmp->te))
                ErrorExit
                (ERROR_BADPARM,
                 "%s: subject %s input volume %s: sequence parameters "
                 "(%2.1f, %2.1f, %2.1f)"
                 "don't match other inputs (%2.1f, %2.1f, %2.1f)",
                 Progname, subject_name, fname,
                 mri_tmp->tr, DEGREES(mri_tmp->flip_angle), mri_tmp->te,
                 TRs[input], DEGREES(FAs[input]), TEs[input]) ;
            // first time do the following
            if (input == 0) {
                int nframes = gca->ninputs ;

                ///////////////////////////////////////////////////////////
                mri_inputs =
                    MRIallocSequence(mri_tmp->width, mri_tmp->height, mri_tmp->depth,
                                     mri_tmp->type, nframes) ;
                if (!mri_inputs)
                    ErrorExit
                    (ERROR_NOMEMORY,
                     "%s: could not allocate input volume %dx%dx%dx%d",
                     mri_tmp->width, mri_tmp->height, mri_tmp->depth,nframes) ;
                MRIcopyHeader(mri_tmp, mri_inputs) ;
            }
            // -mask option ////////////////////////////////////////////
            if (mask_fname)
            {
                MRI *mri_mask ;

                sprintf(fname, "%s/%s/mri/%s",
                        subjects_dir, subject_name, mask_fname);
                printf("reading volume %s for masking...\n", fname) ;
                mri_mask = MRIread(fname) ;
                if (!mri_mask)
                    ErrorExit(ERROR_NOFILE, "%s: could not open mask volume %s.\n",
                              Progname, fname) ;

                MRImask(mri_tmp, mri_mask, mri_tmp, 0, 0) ;
                MRIfree(&mri_mask) ;
            }
            MRIcopyFrame(mri_tmp, mri_inputs, 0, input) ;
            MRIfree(&mri_tmp) ;
        }// end of inputs per subject


        /////////////////////////////////////////////////////////
        // xform_name is given, then we can use the consistent c_(r,a,s) for gca
        /////////////////////////////////////////////////////////
        if (xform_name)
        {
            // we read talairach.xfm which is a RAS-to-RAS
            sprintf(fname, "%s/%s/mri/transforms/%s",
                    subjects_dir, subject_name, xform_name) ;
            if (Gdiag & DIAG_SHOW && DIAG_VERBOSE_ON)
                printf("INFO: reading transform file %s...\n", fname);
            if (!FileExists(fname))
            {
                fprintf(stderr,"ERROR: cannot find transform file %s\n",fname);
                exit(1);
            }
            transform = TransformRead(fname);
            if (!transform)
                ErrorExit(ERROR_NOFILE, "%s: could not read transform from file %s",
                          Progname, fname);

            modify_transform(transform, mri_inputs, gca);
            // Here we do 2 things
            // 1. modify gca direction cosines to
            // that of the transform destination (both linear and non-linear)
            // 2. if ras-to-ras transform,
            // then change it to vox-to-vox transform (linear case)

            // modify transform to store inverse also
            TransformInvert(transform, mri_inputs) ;
            // verify inverse
            lta = (LTA *) transform->xform;
        }
        else
        {
            GCAreinit(mri_inputs, gca);
            // just use the input value, since dst = src volume
            transform = TransformAlloc(LINEAR_VOXEL_TO_VOXEL, NULL) ;
        }


        ////////////////////////////////////////////////////////////////////
        // train gca
        ////////////////////////////////////////////////////////////////////
        // segmentation is seg volume
        // inputs       is the volumes of all inputs
        // transform    is for this subject
        // noint        is whether to use intensity information or not
        GCABtrain(gcab, mri_inputs, mri_seg, transform, target_label) ;
        MRIfree(&mri_seg) ;
        MRIfree(&mri_inputs) ;
        TransformFree(&transform) ;
    }
    GCABcompleteTraining(gcab) ;

    if (smooth > 0) {
        printf("regularizing conditional densities with smooth=%2.2f\n", smooth) ;
        GCAregularizeConditionalDensities(gca, smooth) ;
    }
    if (navgs) {
        printf("applying mean filter %d times to conditional densities\n", navgs) ;
        GCAmeanFilterConditionalDensities(gca, navgs) ;
    }

    printf("writing trained GCAB to %s...\n", out_fname) ;
    if (GCABwrite(gcab, out_fname) != NO_ERROR)
        ErrorExit
        (ERROR_BADFILE, "%s: could not write gca to %s", Progname, out_fname) ;

    if (Gdiag & DIAG_WRITE && DIAG_VERBOSE_ON)
    {
        MRI *mri ;

        mri = GCAbuildMostLikelyVolume(gca, NULL) ;
        MRIwrite(mri, "m.mgz") ;
        MRIfree(&mri) ;
    }

    if (histo_fname) {
        FILE *fp ;
        int   histo_counts[10000], xn, yn, zn, max_count ;
        GCA_NODE  *gcan ;

        memset(histo_counts, 0, sizeof(histo_counts)) ;
        fp = fopen(histo_fname, "w") ;
        if (!fp)
            ErrorExit(ERROR_BADFILE, "%s: could not open histo file %s",
                      Progname, histo_fname) ;

        max_count = 0 ;
        for (xn = 0 ; xn < gca->node_width;  xn++) {
            for (yn = 0 ; yn < gca->node_height ; yn++) {
                for (zn = 0 ; zn < gca->node_depth ; zn++) {
                    gcan = &gca->nodes[xn][yn][zn] ;
                    if (gcan->nlabels < 1)
                        continue ;
                    if (gcan->nlabels == 1 && IS_UNKNOWN(gcan->labels[0]))
                        continue ;
                    histo_counts[gcan->nlabels]++ ;
                    if (gcan->nlabels > max_count)
                        max_count = gcan->nlabels ;
                }
            }
        }
        max_count = 20 ;
        for (xn = 1 ; xn < max_count ;  xn++)
            fprintf(fp, "%d %d\n", xn, histo_counts[xn]) ;
        fclose(fp) ;
    }

    GCAfree(&gca) ;
    msec = TimerStop(&start) ;
    seconds = nint((float)msec/1000.0f) ;
    minutes = seconds / 60 ;
    seconds = seconds % 60 ;
    printf("classifier array training took %d minutes"
           " and %d seconds.\n", minutes, seconds) ;
    exit(0) ;
    return(0) ;
}
Пример #5
0
int mps_librarydb_traverse_directory(char *directoryName, sqlite3 *db,
				     long caller_file_path_id) 
{
  DIR *directoryStreamPointer;
  struct dirent *directoryElementPointer;
  struct stat statStructure;
  char filePathCopy[MPS_MAX_LIBRARY_PATH_LENGTH];
  char fullFilePath[MPS_MAX_LIBRARY_PATH_LENGTH];
  char escapedFileName[MPS_MAX_LIBRARY_PATH_LENGTH];
  char escapedTitle[MPS_MAX_TRACK_INFO_FIELD_LENGTH];
  char escapedArtist[MPS_MAX_TRACK_INFO_FIELD_LENGTH];
  char escapedAlbum[MPS_MAX_TRACK_INFO_FIELD_LENGTH];
  char escapedGenre[MPS_MAX_TRACK_INFO_FIELD_LENGTH];
  char escapedDname[NAME_MAX+1];
  char *zErrMsg = 0;
  int i, sqlite_rc, gti_rc, rv = MPS_LIBRARYDBD_SUCCESS;
  int updated_track_count, updated_file_path_count;
  int tempErrno;
  long artistId, albumId, filePathId;
  char sqlStatement[MAX_SQL_STATEMENT_LENGTH];
  char whereClause[MAX_SQL_STATEMENT_LENGTH];
  mps_library_track_info_t track_info;

  MPS_DBG_PRINT("Entering %s(%s, 0x%08x, %d)\n", __func__, 
		directoryName, (unsigned)db, caller_file_path_id);

  if ((directoryStreamPointer = opendir(directoryName))
      == NULL) {
    MPS_LOG("Error: Couldn't open \"%s\"\n", directoryName);
    goto OUT;
  }
                  
  while (1) {
    errno = 0;
    if ((directoryElementPointer = readdir(directoryStreamPointer))
        == NULL) {
      tempErrno=errno;
      if (tempErrno ==0) {
        break;
      }
      else {
        MPS_LOG("readdir() returned NULL with errno==%d\n", tempErrno);
        sleep(10);
        continue;
      }
    }
    MPS_DBG_PRINT("Top of while() loop. d_name=\"%s\"\n", 
		  directoryElementPointer->d_name);

    /* zero the track_info structure */
    memset(&track_info, 0, sizeof(mps_library_track_info_t));

    //Construct full path name in source directory 
    // could I just use realpath()?
    strcpy(fullFilePath, directoryName);
    strcat(fullFilePath, "/");
    strcat(fullFilePath, directoryElementPointer->d_name);
    
    track_info.parent_path_id = caller_file_path_id;
    strncpy(track_info.file_name, directoryElementPointer->d_name,
	    MPS_MAX_TRACK_INFO_FIELD_LENGTH);

    // escape the ' characters for sqlite's benefit
    copy_and_sqlite_escape(escapedFileName, 
                           track_info.file_name, 
                           MPS_MAX_LIBRARY_PATH_LENGTH); 
    
    stat(fullFilePath, &statStructure);
    
    if (S_ISREG(statStructure.st_mode)
	&& *(directoryElementPointer->d_name) != '.') {
      MPS_DBG_PRINT("Is a regular file\n");
      
      track_info.file_type = mps_get_file_type(directoryElementPointer->d_name);

      if (track_info.file_type == MPS_LIBRARY_UNKNOWN) {
	MPS_DBG_PRINT("\"%s\" has an unrecognized file type\n", 
		      directoryElementPointer->d_name);
	continue;
      }

      track_info.file_length = statStructure.st_size;
      track_info.file_last_modification = statStructure.st_mtime;

      if (*state == LIBRARYDBD_STATE_UPDATINGDB) {
	
	snprintf(sqlStatement, MAX_SQL_STATEMENT_LENGTH, 
		 "UPDATE mps_library_titles SET db_version=%ld "
		 "WHERE file_length=%ld AND file_last_modification=%ld "
		 "AND parent_path_id=%ld AND file_name='%s'; ",
		 /* "LIMIT 1; ", -- this might work if I build from 
		    non-"amalgamation" source */
		 dbVersion, track_info.file_length, 
		 track_info.file_last_modification,  
		 caller_file_path_id, escapedFileName);

	MPS_DBG_PRINT("Calling sqlite3_exec on \"%s\"\n", sqlStatement);
	sqlite_rc = sqlite3_exec(db, sqlStatement, NULL, 0, &zErrMsg);
	
	if( sqlite_rc != SQLITE_OK ){
	  MPS_LOG("SQL error: %s\n", zErrMsg);
	  sqlite3_free(zErrMsg);
	  return MPS_LIBRARYDBD_FAILURE;
	}
	else {
	  updated_track_count = sqlite3_changes(db);
	}

	if (updated_track_count > 0) {
	  MPS_DBG_PRINT("File \"%s\" doesn't appear to have changed, updated scan_counter = %d\n", 
			fullFilePath, dbVersion);
	}
      }

      if (*state == LIBRARYDBD_STATE_CREATINGDB ||
	  (*state == LIBRARYDBD_STATE_UPDATINGDB && updated_track_count == 0)){
	
	gti_rc = get_track_info(fullFilePath, &track_info);
	if (gti_rc != MPS_LIBRARYDBD_SUCCESS) {
	  MPS_DBG_PRINT("get_track_info() returned MPS_LIBRARYDBD_FAILURE\n");
	  // Don't continue and add entry if get_track_info failed.
	  continue; 
	}

	MPS_DBG_PRINT("Adding file \"%s\"\n", fullFilePath);
	highestTitleId++;

        sanitize_and_copy (escapedTitle, 
                           track_info.title, 
                           MPS_MAX_TRACK_INFO_FIELD_LENGTH);
        if (IS_UNKNOWN(escapedTitle)) {
          sprintf(escapedTitle, "Unknown Title (%s)", escapedFileName);
        }

        sanitize_and_copy (escapedAlbum, 
                           track_info.album, 
                           MPS_MAX_TRACK_INFO_FIELD_LENGTH);
        if (IS_UNKNOWN(escapedAlbum)) {
          strcpy(escapedAlbum, "Unknown Album");
        }

        sanitize_and_copy (escapedArtist, 
                           track_info.artist, 
                           MPS_MAX_TRACK_INFO_FIELD_LENGTH); 
        if (IS_UNKNOWN(escapedArtist)) {
          strcpy(escapedArtist, "Unknown Artist");
        }

	copy_and_sqlite_escape(escapedGenre, 
                               track_info.genre, 
                               MPS_MAX_TRACK_INFO_FIELD_LENGTH); 
		
	/* update artist table */
	artistId = update_artist_table(escapedArtist, db);
	
	/* update albums table */
	albumId = update_album_table(escapedAlbum, artistId, db);

	snprintf(sqlStatement, MAX_SQL_STATEMENT_LENGTH, 
		 "insert into mps_library_titles "
		 "values("
		 "%ld, "   // title_id int64
		 "%ld, "   // db_version int64
		 "%ld, "   // file_length int64
		 "%ld, "   // file_last_modification int64
		 "%ld, "   // parent_path_id int64
		 "'%s', "  // file_name text
		 "%d, "    // file_type int
		 "'%s', "  // title text
		 "%ld, "   // album_id int64
		 "%ld, "   // artist_id int64
		 "%d, "    // year int
		 "'%s', "  // genre text
		 "%d, "    // time_length int
		 "%d, "    // play_count int
		 "%ld, "   // last_played int64
		 "%d, "    // ordinal_track_number int
		 "%d, "    // bitrate int
		 "%d, "    // sampling_rate int
		 "%d, "    // channel_mode int
		 "%d, "    // vbr_mode int
		 "%ld "    // filesystem_id int64
		 "); ",
		 highestTitleId, dbVersion,
		 track_info.file_length, track_info.file_last_modification,
		 caller_file_path_id, escapedFileName, track_info.file_type,
		 escapedTitle, albumId, artistId,
		 track_info.year, escapedGenre, track_info.time_length, 
		 track_info.play_count, track_info.last_played, 
		 track_info.ordinal_track_number, track_info.bitrate,
		 track_info.sampling_rate, track_info.channel_mode, 
		 track_info.vbr_mode, 0L /*fs_id hardcoded */);

	MPS_DBG_PRINT("Calling sqlite3_exec on \"%s\"\n", sqlStatement);	
	sqlite_rc = sqlite3_exec(db, sqlStatement, NULL, 0, &zErrMsg);
	
	if( sqlite_rc != SQLITE_OK ){
	  MPS_LOG("SQL error: %s\n", zErrMsg);
	  sqlite3_free(zErrMsg);
	  highestTitleId--;
	  return MPS_LIBRARYDBD_FAILURE;
	}
	else {
	  numberTitlesAdded++;
	}
      }
    }
    else if (S_ISDIR(statStructure.st_mode)) {
      MPS_DBG_PRINT("Is a directory\n");

      copy_and_sqlite_escape(escapedDname, 
                             directoryElementPointer->d_name, 
                             MPS_MAX_LIBRARY_PATH_LENGTH); 	  
      
      if (strcmp(directoryElementPointer->d_name, ".") &&
	  strcmp(directoryElementPointer->d_name, "..")) {	  

	if (*state == LIBRARYDBD_STATE_UPDATINGDB) {	  
	  snprintf(sqlStatement, MAX_SQL_STATEMENT_LENGTH,
		   "update mps_library_file_path set db_version=%ld "
		   "where parent_id=%ld and name='%s'",
		   dbVersion, caller_file_path_id, escapedDname);
	  
	  MPS_DBG_PRINT("Calling sqlite3_exec on \"%s\"\n", sqlStatement);
	  sqlite_rc = sqlite3_exec(db, sqlStatement, NULL, 0, &zErrMsg);

	  if( sqlite_rc != SQLITE_OK ){
	    MPS_LOG("SQL error: %s\n", zErrMsg);
	    sqlite3_free(zErrMsg);
	    return MPS_LIBRARYDBD_FAILURE;
	  }
	  else {
	    updated_file_path_count = sqlite3_changes(db);
	  }
	  if (updated_file_path_count > 0) {
	    snprintf(whereClause, MAX_SQL_STATEMENT_LENGTH,
		     "parent_id=%ld and name='%s'",
		     caller_file_path_id, escapedDname);
	    rv = mps_librarydb_get_long(db, "mps_library_file_path", "id",
					 whereClause, &filePathId);
	    if (rv < MPS_LIBRARYDBD_SUCCESS) {
	      goto OUT;
	    }
	  }
	}
	if (*state == LIBRARYDBD_STATE_CREATINGDB ||
	    (*state == LIBRARYDBD_STATE_UPDATINGDB && 
	     updated_file_path_count == 0)){
	  filePathId = ++highestFilePathId;
	  snprintf(sqlStatement, MAX_SQL_STATEMENT_LENGTH, 
		   "insert into mps_library_file_path "
		   "values("
		   "%ld, "   // id int64
		   "%ld, "   // parent_id int64
		   "'%s', "  // name text
		   "%ld, "   // db_version int64
		   "%ld "    // filesystem_id int64
		   "); ",
		   highestFilePathId, caller_file_path_id,
		   escapedDname, dbVersion, 0L /* fs_id hard coded */);

	  MPS_DBG_PRINT("Calling sqlite3_exec on \"%s\"\n", sqlStatement);	
	  sqlite_rc = sqlite3_exec(db, sqlStatement, NULL, 0, &zErrMsg);
	  if( sqlite_rc != SQLITE_OK ){
	    MPS_LOG("SQL error: %s\n", zErrMsg);
	    sqlite3_free(zErrMsg);
	    highestFilePathId--;
	    rv = MPS_LIBRARYDBD_FAILURE;
	    goto CLOSE_OUT;
	  }
	  else {
	    numberFilePathsAdded++;
	  }
	}
	MPS_DBG_PRINT("Adding directory \"%s\"\n", fullFilePath); 
	mps_librarydb_traverse_directory(fullFilePath, db, filePathId);
      }
    }
  }

 CLOSE_OUT:  
  closedir(directoryStreamPointer);    
 OUT:
  MPS_DBG_PRINT("Leaving %s() - return value %d\n", __func__, rv);
  return rv;
}
Пример #6
0
static MRI *
edit_ventricular_unknowns(MRI *mri_in_labeled, MRI *mri_T1, MRI *mri_out_labeled) {
  int     label, x, y, z, xm1, xp1, ym1, yp1, zm1, zp1, lxp1, lxm1, lyp1, lym1, lzp1, lzm1, nchanged,
  l1 = 0, l2 = 0, change, i, total_changed, dwm, dhypo, dven, left ;
  MRI     *mri_in ;

  mri_in = MRIcopy(mri_in_labeled, NULL) ;
  mri_out_labeled = MRIcopy(mri_in_labeled, mri_out_labeled) ;

  total_changed = 0 ;

  /* first change unknowns near hypointensities to wm or hypo */
  do {
    nchanged = 0 ;
    for (x = 0 ; x < mri_T1->width ; x++) {
      for (y = 0 ; y < mri_T1->height ; y++) {
        for (z = 0 ; z < mri_T1->depth ; z++) {
          if (x == Gx && y == Gy && z == Gz)
            DiagBreak() ;
          change = 0 ;
          left = 0 ;
          label = MRIvox(mri_in, x, y, z) ;
          if ((IS_GM(label) == 0) && (IS_UNKNOWN(label) == 0))
            continue ;

          dhypo = distance_to_label(mri_in, WM_hypointensities, x, y, z, 0, 1, 0, 2) ; /* look inferior */
          if (dhypo > 2)
            dhypo = distance_to_label(mri_in, WM_hypointensities, x, y, z, 0, 0, -1, 2) ;  /* look inferior */
          if (dhypo > 2)
            dhypo = distance_to_label(mri_in, WM_hypointensities, x, y, z, 0, 0, 1, 2) ;  /* look anterior */
          if (dhypo > 2)
            dhypo = distance_to_label(mri_in, WM_hypointensities, x, y, z, 0, 0, -1, 2) ;  /* look inferior */
          if (dhypo > 2)
            continue ;

#define WM_DIST   4

          dwm = distance_to_label(mri_in, Left_Cerebral_White_Matter, x, y, z, 0, -1, 0, WM_DIST) ; /* superior */
          if (dwm > WM_DIST) {
            dwm = distance_to_label(mri_in, Right_Cerebral_White_Matter, x, y, z, 0, -1, 0, WM_DIST) ;
          } else
            left = 1 ;

          if (dwm > WM_DIST) /* not superior, look anterior */
          {
            dwm = distance_to_label(mri_in, Right_Cerebral_White_Matter, x, y, z, 0, 0, 1, WM_DIST) ;
            if (dwm > WM_DIST) {
              dwm = distance_to_label(mri_in, Left_Cerebral_White_Matter, x, y, z, 0, 0, 1, WM_DIST) ;
              if (dwm <= WM_DIST)
                left = 1 ;
            }
          }

          if (dwm > WM_DIST) /* not superior, or anterior look posterior */
          {
            dwm = distance_to_label(mri_in, Right_Cerebral_White_Matter, x, y, z, 0, 0, -1, WM_DIST) ;
            if (dwm > WM_DIST) {
              dwm = distance_to_label(mri_in, Left_Cerebral_White_Matter, x, y, z, 0, 0, -1, WM_DIST) ;
              if (dwm <= WM_DIST)
                left = 1 ;
            }
          }

          if (dwm > WM_DIST)    /* couldn't find wm anywhere (didn't look inferior), check for region of hypos */
          {
            dwm = distance_to_label(mri_in, WM_hypointensities, x, y, z, 0, -1, 0, WM_DIST) ;
            if (distance_to_label(mri_in, Left_Cerebral_White_Matter, x, y, z, 0, -1, 0, 30)  <= 30)
              left = 1 ;
          }
          if (dwm > WM_DIST)
            continue ;
          dven = distance_to_label(mri_in, left ? Left_Lateral_Ventricle : Right_Lateral_Ventricle, x, y, z, 0, 1, 0, 15) ;
          if (dven > 15) {
            dven = distance_to_label(mri_in, left ? Left_Lateral_Ventricle : Right_Lateral_Ventricle, x, y, z, 0, 0, -1, 3) ;
            if (dven > 3)
              distance_to_label(mri_in, left ? Left_Lateral_Ventricle : Right_Lateral_Ventricle, x, y, z, 0, 0, 1, 3) ;
            if (dven > 3)
              continue ;
          }

          nchanged++ ;
          mle_label(mri_T1, mri_out_labeled, x, y, z, 15, left ? Left_Cerebral_White_Matter : Right_Cerebral_White_Matter,
                    WM_hypointensities) ;
        }
      }
    }

    total_changed += nchanged ;
    MRIcopy(mri_out_labeled, mri_in) ;
  } while (nchanged > 0) ;

  for (i = 0 ; i < 2 ; i++) {
    for ( nchanged = x = 0 ; x < mri_T1->width ; x++) {
      for (y = 0 ; y < mri_T1->height ; y++) {
        for (z = 0 ; z < mri_T1->depth ; z++) {
          if (x == Gx && y == Gy && z == Gz)
            DiagBreak() ;
          change = 0 ;
          label = MRIvox(mri_in, x, y, z) ;
          if (IS_UNKNOWN(label) == 0)
            continue ;
          xm1 = mri_T1->xi[x-1] ;
          xp1 = mri_T1->xi[x+1] ;
          ym1 = mri_T1->yi[y-1] ;
          yp1 = mri_T1->yi[y+1] ;
          zm1 = mri_T1->zi[z-1] ;
          zp1 = mri_T1->zi[z+1] ;
          lxp1 = MRIvox(mri_in, xp1, y, z) ;
          lxm1 = MRIvox(mri_in, xm1, y, z) ;
          lyp1 = MRIvox(mri_in, x, yp1, z) ;
          lym1 = MRIvox(mri_in, x, ym1, z) ;
          lzp1 = MRIvox(mri_in, x, y, zp1) ;
          lzm1 = MRIvox(mri_in, x, y, zm1) ;
          /* if it has ventricle on one side and wm on the other, change it to wm or ventricle
            these are caused by slight discrepencies between the FreeSurfer ribbon and the
            CMA subcortical segs.
          */
          if ((IS_WMH(lxm1) && IS_LAT_VENT(lxp1)) ||
              (IS_WMH(lxp1) && IS_LAT_VENT(lxm1))) {
            change = 1 ;
            l1 = lxm1 ;
            l2 = lxp1 ;
          }
          if ((IS_WMH(lym1) && IS_LAT_VENT(lyp1)) ||
              (IS_WMH(lyp1) && IS_LAT_VENT(lym1))) {
            change = 1 ;
            l1 = lym1 ;
            l2 = lyp1 ;
          }
          if ((IS_WMH(lzm1) && IS_LAT_VENT(lzp1)) ||
              (IS_WMH(lzp1) && IS_LAT_VENT(lzm1))) {
            change = 1 ;
            l1 = lzm1 ;
            l2 = lzp1 ;
          }
          if (change) {
            nchanged++ ;
            mle_label(mri_T1, mri_out_labeled, x, y, z, 15, l1, l2) ;
          } else /* could be two unknowns in a row */
          {
            int yi, olabel, wm, un, ven ;
#define WLEN 4
            ven = un = wm = 0 ;
            change = 0 ;
            for (yi = y-1 ; yi >= MAX(0,y-WLEN) ; yi--) {
              olabel = MRIvox(mri_in, x, yi, z) ;
              /* should be only white matter and unkowns above it */
              if (IS_WMH(olabel)) {
                if (IS_WM(olabel))
                  l1 = olabel ;
                wm++ ;
              } else if (IS_UNKNOWN(olabel))
                un++ ;
              else
                change = -1 ;  /* something else there - don't change */
            }
            /* if there is some wm above and no other labels */
            if ((wm >= WLEN/2) && ((wm+un) >= (WLEN-1)) && change >= 0) {
              un = 0 ;
              for (yi = y+1 ; yi <= MIN(mri_in->height-1,y+WLEN) ; yi++) {
                olabel = MRIvox(mri_in, x, yi, z) ;
                /* should be only ventricle and unkowns below it */
                if (IS_LAT_VENT(olabel)) {
                  ven++ ;
                  l2 = olabel ;
                } else if (IS_UNKNOWN(olabel))
                  un++ ;
                else
                  change = -1 ;
              }
              if (change >= 0 && ((ven+un) >= WLEN) && (ven >= WLEN/2))
                change = 1 ;
              if (change > 0) {
                nchanged++ ;
                mle_label(mri_T1, mri_out_labeled, x, y, z, 15, l1, l2) ;
              }
            }
            if (change <= 0)  /* look in posterior/anterior direction. If everthing is wm and ven change it */
            {
              int zi ;

              change = wm = ven = un = 0 ;
              for (zi = z-WLEN ; zi <= z+WLEN ; zi++) {
                if (zi < 0 || zi >= mri_in->depth)
                  continue ;
                olabel = MRIvox(mri_in, x, y, zi) ;
                /* should be only white matter and unkowns above it */
                if (IS_WMH(olabel)) {
                  if (IS_WM(olabel))
                    l1 = olabel ;
                  wm++ ;
                } else if (IS_UNKNOWN(olabel))
                  un++ ;
                else if (IS_LAT_VENT(olabel))
                  ven++ ;
                else
                  change = -1 ;  /* something else there - don't change */
              }
              if (change >= 0 && ((ven+wm) >= WLEN) && (ven >= WLEN/2) && (wm >= WLEN/2))
                change = 1 ;
              if (change > 0) {
                nchanged++ ;
                mle_label(mri_T1, mri_out_labeled, x, y, z, 15, l1, l2) ;
              }
            }
            if (change <= 0)  /* look in medial/lateral direction. If everthing is wm and ven change it */
            {
              int xi ;

              change = wm = ven = un = 0 ;
              for (xi = x-WLEN ; xi <= x+WLEN ; xi++) {
                if (xi < 0 || xi >= mri_in->width)
                  continue ;
                olabel = MRIvox(mri_in, xi, y, z) ;
                /* should be only white matter and unkowns above it */
                if (IS_WMH(olabel)) {
                  if (IS_WM(olabel))
                    l1 = olabel ;
                  wm++ ;
                } else if (IS_UNKNOWN(olabel))
                  un++ ;
                else if (IS_LAT_VENT(olabel)) {
                  ven++ ;
                  l2 = olabel ;
                } else
                  change = -1 ;  /* something else there - don't change */
              }
              if (change >= 0 && ((ven+wm) >= WLEN) && (ven >= WLEN/2) && (wm >= WLEN/2))
                change = 1 ;
              if (change > 0) {
                nchanged++ ;
                mle_label(mri_T1, mri_out_labeled, x, y, z, 15, l1, l2) ;
              }
            }
          }
        }
      }
    }

    /* now relabel cortex that is between WM and hypointensity */
    for (x = 0 ; x < mri_T1->width ; x++) {
      for (y = 0 ; y < mri_T1->height ; y++) {
        for (z = 0 ; z < mri_T1->depth ; z++) {
          if (x == Gx && y == Gy && z == Gz)
            DiagBreak() ;
          change = 0 ;
          label = MRIvox(mri_in, x, y, z) ;
          if (IS_GM(label) == 0 && (IS_UNKNOWN(label) == 0))
            continue ;
          xm1 = mri_T1->xi[x-1] ;
          xp1 = mri_T1->xi[x+1] ;
          ym1 = mri_T1->yi[y-1] ;
          yp1 = mri_T1->yi[y+1] ;
          zm1 = mri_T1->zi[z-1] ;
          zp1 = mri_T1->zi[z+1] ;
          lxp1 = MRIvox(mri_in, xp1, y, z) ;
          lxm1 = MRIvox(mri_in, xm1, y, z) ;
          lyp1 = MRIvox(mri_in, x, yp1, z) ;
          lym1 = MRIvox(mri_in, x, ym1, z) ;
          lzp1 = MRIvox(mri_in, x, y, zp1) ;
          lzm1 = MRIvox(mri_in, x, y, zm1) ;
          if ((IS_WM(lxm1) && IS_HYPO(lxp1)) ||
              (IS_WM(lxp1) && IS_HYPO(lxm1))) {
            change = 1 ;
            l1 = lxm1 ;
            l2 = lxp1 ;
          }
          if ((IS_WM(lym1) && IS_HYPO(lyp1)) ||
              (IS_WM(lyp1) && IS_HYPO(lym1))) {
            change = 1 ;
            l1 = lym1 ;
            l2 = lyp1 ;
          }
          if ((IS_WM(lzm1) && IS_HYPO(lzp1)) ||
              (IS_WM(lzp1) && IS_HYPO(lzm1))) {
            change = 1 ;
            l1 = lzm1 ;
            l2 = lzp1 ;
          }


          if ((IS_HYPO(lxm1) && IS_HYPO(lxp1)) ||
              (IS_HYPO(lxp1) && IS_HYPO(lxm1))) {
            change = 1 ;
            l1 = lxm1 ;
            l2 = lxp1 ;
          }
          if ((IS_HYPO(lym1) && IS_HYPO(lyp1)) ||
              (IS_HYPO(lyp1) && IS_HYPO(lym1))) {
            change = 1 ;
            l1 = lym1 ;
            l2 = lyp1 ;
          }
          if ((IS_HYPO(lzm1) && IS_HYPO(lzp1)) ||
              (IS_HYPO(lzp1) && IS_HYPO(lzm1))) {
            change = 1 ;
            l1 = lzm1 ;
            l2 = lzp1 ;
          }
          if (change) {
            nchanged++ ;
            mle_label(mri_T1, mri_out_labeled, x, y, z, 15, l1, l2) ;
          }
        }
      }
    }
    MRIcopy(mri_out_labeled, mri_in) ;
    total_changed += nchanged ;
  }


  printf("%d unknown voxels changed to wm or ventricle\n", total_changed) ;
  MRIfree(&mri_in) ;
  return(mri_out_labeled) ;
}
Пример #7
0
static MRI *
edit_lateral_ventricles(MRI *mri_in_labeled, MRI *mri_T1, MRI *mri_out_labeled) {
  int   width, height, depth, x, y, z, nchanged, label, total_changed,
  left, niter, change, dvent, dwhite, olabel ;
  MRI   *mri_tmp ;

  mri_out_labeled = MRIcopy(mri_in_labeled, mri_out_labeled) ;
  mri_tmp = MRIcopy(mri_out_labeled, NULL) ;

  width = mri_T1->width ;
  height = mri_T1->height ;
  depth = mri_T1->depth ;

  niter = total_changed = 0 ;
  do {
    nchanged = 0 ;

    /* change gray to wm if near amygdala */
    for (z = 0 ; z < depth ; z++) {
      for (y = 0 ; y < height ; y++) {
        for (x = 0 ; x < width ; x++) {
          if (x == Gx && y == Gy && z == Gz)
            DiagBreak() ;
          label = MRIvox(mri_tmp, x, y, z) ;

          change = left = 0 ;
          switch (label) {
          case Left_Inf_Lat_Vent:
            left = 1 ;
          case Right_Inf_Lat_Vent:
            dwhite = distance_to_label(mri_out_labeled,
                                       left ? Left_Cerebral_White_Matter :
                                       Right_Cerebral_White_Matter,
                                       x,y,z,0,1,0,3);
            dvent = distance_to_label(mri_out_labeled,
                                      left ? Left_Inf_Lat_Vent :
                                      Right_Inf_Lat_Vent,
                                      x,y,z,0,-1,0,3);
            if (dvent <= 1 && dwhite <= 1)  /* borders ventricle superior and wm inferior */
            {
              mle_label(mri_T1, mri_tmp, x, y, z, 9,
                        left ? Left_Inf_Lat_Vent : Right_Inf_Lat_Vent,
                        left ? Left_Cerebral_White_Matter : Right_Cerebral_White_Matter) ;
            }
            break ;
          case Unknown:
            if (neighborLabel(mri_tmp, x, y, z, 1, Left_Lateral_Ventricle) &&
                neighborLabel(mri_tmp, x, y, z,1,Left_Cerebral_White_Matter))
              change = left = 1 ;
            if (neighborLabel(mri_tmp, x, y, z, 1, Right_Lateral_Ventricle) &&
                neighborLabel(mri_tmp, x, y, z,1,Right_Cerebral_White_Matter))
              change = 1 ;

            if (change) {
#if 0
              label = left ?
                      Left_Cerebral_White_Matter : Right_Cerebral_White_Matter;
              /*              MRIvox(mri_tmp, x, y, z) = label ;*/
#else
              mle_label(mri_T1, mri_tmp, x, y, z, 9,
                        left ? Left_Lateral_Ventricle : Right_Lateral_Ventricle,
                        left ? Left_Cerebral_White_Matter : Right_Cerebral_White_Matter) ;
#endif
              nchanged++ ;
              continue ;
            }
          default:
            break ;
          }
        }
      }
    }
    MRIcopy(mri_tmp, mri_out_labeled) ;
    total_changed += nchanged ;
  } while ((nchanged > 0) && (++niter < 1)) ;

  /* change all gm within 2 mm of ventricle to wm */
  for (z = 0 ; z < depth ; z++) {
    for (y = 0 ; y < height ; y++) {
      for (x = 0 ; x < width ; x++) {
        if (x == Gx && y == Gy && z == Gz)
          DiagBreak() ;
        label = MRIvox(mri_out_labeled, x, y, z) ;
        if (IS_GM(label) == 0)
          continue ;
        left = label == Left_Cerebral_Cortex ;
        olabel = left ? Left_Lateral_Ventricle : Right_Lateral_Ventricle;
        if (MRIneighborsInWindow(mri_out_labeled, x, y, z, 5, olabel) >= 1) {
          total_changed++ ;
          MRIvox(mri_out_labeled, x, y, z) = left ? Left_Cerebral_White_Matter : Right_Cerebral_White_Matter;
        }
      }
    }
  }

#if 0
  /* change all unknown within 1 mm of ventricle and 1mm of  wm  to one of them */
  for (z = 0 ; z < depth ; z++) {
    for (y = 0 ; y < height ; y++) {
      for (x = 0 ; x < width ; x++) {
        if (x == Gx && y == Gy && z == Gz)
          DiagBreak() ;
        label = MRIvox(mri_out_labeled, x, y, z) ;
        if (IS_UNKNOWN(label) == 0)
          continue ;
        left = label == Left_Cerebral_Cortex ;
        olabel = left ? Left_Lateral_Ventricle : Right_Lateral_Ventricle;
        if (MRIneighborsInWindow(mri_out_labeled, x, y, z, 5, olabel) >= 1) {
          total_changed++ ;
          MRIvox(mri_out_labeled, x, y, z) = left ? Left_Cerebral_White_Matter : Right_Cerebral_White_Matter;
        }
      }
    }
  }
#endif


  MRIfree(&mri_tmp) ;
  printf("%d unknown voxels bordering ventricles changed to wm.\n",
         total_changed) ;
  return(mri_out_labeled) ;
}
Пример #8
0
static MRI *
edit_border_voxels(MRI *mri_in_labeled, MRI *mri_T1, MRI *mri_out_labeled) {
  int     label, x, y, z, xm1, xp1, ym1, yp1, zm1, zp1, lxp1, lxm1, lyp1, lym1, lzp1, lzm1, nchanged,
  change, olabel ;
  float   means[MAX_CMA_LABELS], xp1d, xm1d, yp1d, ym1d, zp1d, zm1d, val, ld ;
  MRI     *mri_tmp ;

  if (mri_in_labeled == mri_out_labeled) {
    mri_tmp = MRIcopy(mri_in_labeled, NULL) ;
    mri_in_labeled = mri_tmp;
  } else
    mri_tmp = NULL ;

  mri_out_labeled = MRIcopy(mri_in_labeled, mri_out_labeled) ;
  for (nchanged = x = 0 ; x < mri_T1->width ; x++) {
    for (y = 0 ; y < mri_T1->height ; y++) {
      for (z = 0 ; z < mri_T1->depth ; z++) {
        if (x == Gx && y == Gy && z == Gz)
          DiagBreak() ;
        change = 0 ;
        olabel = label = MRIvox(mri_in_labeled, x, y, z) ;
        if (IS_UNKNOWN(label))
          continue ;
        xm1 = mri_T1->xi[x-1] ;
        xp1 = mri_T1->xi[x+1] ;
        ym1 = mri_T1->yi[y-1] ;
        yp1 = mri_T1->yi[y+1] ;
        zm1 = mri_T1->zi[z-1] ;
        zp1 = mri_T1->zi[z+1] ;
        lxp1 = MRIvox(mri_in_labeled, xp1, y, z) ;
        lxm1 = MRIvox(mri_in_labeled, xm1, y, z) ;
        lyp1 = MRIvox(mri_in_labeled, x, yp1, z) ;
        lym1 = MRIvox(mri_in_labeled, x, ym1, z) ;
        lzp1 = MRIvox(mri_in_labeled, x, y, zp1) ;
        lzm1 = MRIvox(mri_in_labeled, x, y, zm1) ;
        if (label == lxm1 &&
            label == lxp1 &&
            label == lym1 &&
            label == lyp1 &&
            label == lzm1 &&
            label == lzp1)
          continue ;  /* it's not a border label */
        if (!(IS_WM(label) || IS_HIPPO(label) || IS_GM(label) || IS_UNKNOWN(label) || IS_LAT_VENT(label)))
          continue ;


        val = MRIgetVoxVal(mri_T1, x, y, z, 0) ;
        means[label] = label_mean(mri_T1, mri_in_labeled, x, y, z, 15, label) ;
        ld = fabs(means[label] - val) ;

        if (ld/means[label] < 0.1)
          continue ;

        ld *= 0.5 ;  /* bias towards keeping same label */


        if (lxm1 != label)
          means[lxm1] = label_mean(mri_T1, mri_in_labeled, x, y, z, 15, lxm1) ;
        if (lxp1 != label)
          means[lxp1] = label_mean(mri_T1, mri_in_labeled, x, y, z, 15, lxp1) ;
        if (lym1 != label)
          means[lym1] = label_mean(mri_T1, mri_in_labeled, x, y, z, 15, lym1) ;
        if (lyp1 != label)
          means[lyp1] = label_mean(mri_T1, mri_in_labeled, x, y, z, 15, lyp1) ;
        if (lzm1 != label)
          means[lzm1] = label_mean(mri_T1, mri_in_labeled, x, y, z, 15, lzm1) ;
        if (lzp1 != label)
          means[lzp1] = label_mean(mri_T1, mri_in_labeled, x, y, z, 15, lzp1) ;
        xp1d = fabs(means[lxp1] - val) ;
        if (xp1d < ld) {
          ld = xp1d ;
          olabel = lxp1 ;
        }
        xm1d = fabs(means[lxm1] - val) ;
        if (xm1d < ld) {
          ld = xm1d ;
          olabel = lxm1 ;
        }
        yp1d = fabs(means[lyp1] - val) ;
        if (yp1d < ld) {
          olabel = lyp1 ;
          ld = yp1d ;
        }
        ym1d = fabs(means[lym1] - val) ;
        if (ym1d < ld) {
          olabel = lym1 ;
          ld = ym1d ;
        }
        zp1d = fabs(means[lzp1] - val) ;
        if (zp1d < ld) {
          olabel = lzp1 ;
          ld = zp1d ;
        }
        zm1d = fabs(means[lzm1] - val) ;
        if (zp1d < ld) {
          olabel = lzp1 ;
          ld = zp1d ;
        }

        /* only let certain labels change */
        if (!(IS_WM(olabel) || IS_HIPPO(olabel) || IS_GM(olabel) || IS_UNKNOWN(olabel) || IS_LAT_VENT(olabel)))
          continue ;
        if ((IS_GM(label) && IS_HIPPO(olabel)) ||
            (IS_GM(olabel) && IS_HIPPO(label)))
          continue ;  /* don't change hippo to gm based on intensity - too similar */
        if ((label != olabel) && MRIneighborsInWindow(mri_in_labeled, x, y, z, 3, olabel) > 5) {
          nchanged++ ;
          MRIvox(mri_out_labeled, x, y, z) = olabel ;
        }
      }
    }
  }

  if (mri_tmp)
    MRIfree(&mri_tmp) ;
  printf("%d border voxels changed\n", nchanged) ;
  return(mri_out_labeled) ;
}