int main(int argc, char *argv[]) { char **av, fname[STRLEN], *cp ; int ac, nargs ; char *subject, *out_fname, *hemi, *ohemi ; int msec, minutes, seconds ; struct timeb start ; MRI *mri, *mri_features, *mri_ribbon, *mri_aseg, *mri_aparc ; MRI_SURFACE *mris, *mris_contra ; LABEL *cortex ; /* rkt: check for and handle version tag */ nargs = handle_version_option (argc, argv, "$Id: mri_extract_fcd_features.c,v 1.1 2016/06/15 17:51:09 fischl Exp $", "$Name: $"); 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 < 4) usage_exit(1) ; subject = argv[1] ; hemi = argv[2] ; if (strcmp(hemi, "lh") == 0) ohemi = "rh" ; else ohemi = "lh" ; out_fname = argv[3] ; printf("reading data for subject %s and writing output to %s\n", subject, out_fname) ; if (!strlen(sdir)) { cp = getenv("SUBJECTS_DIR") ; if (!cp) ErrorExit(ERROR_BADPARM, "%s: SUBJECTS_DIR not defined in environment.\n", Progname) ; strcpy(sdir, cp) ; } sprintf(fname, "%s/%s/surf/%s.%s", sdir, subject, hemi, white_name) ; printf("reading %s\n", fname) ; mris = MRISread(fname) ; if (mris == NULL) ErrorExit(ERROR_NOFILE, "%s: could not read surface from %s\n", Progname, fname) ; MRISsaveVertexPositions(mris, WHITE_VERTICES) ; sprintf(fname, "%s/%s/surf/%s.%s", sdir, subject, ohemi, white_name) ; printf("reading %s\n", fname) ; mris_contra = MRISread(fname) ; if (mris_contra == NULL) ErrorExit(ERROR_NOFILE, "%s: could not read surface from %s\n", Progname, fname) ; MRISsaveVertexPositions(mris_contra, WHITE_VERTICES) ; sprintf(fname, "%s/%s/mri/%s", sdir, subject, ribbon_name) ; printf("reading %s\n", fname) ; mri_ribbon = MRIread(fname) ; if (mri_ribbon == NULL) ErrorExit(ERROR_NOFILE, "%s: could not read ribbon from %s\n", Progname, fname) ; sprintf(fname, "%s/%s/mri/%s", sdir, subject, aparc_name) ; printf("reading %s\n", fname) ; mri_aparc = MRIread(fname) ; if (mri_aparc == NULL) ErrorExit(ERROR_NOFILE, "%s: could not read ribbon from %s\n", Progname, fname) ; sprintf(fname, "%s/%s/mri/%s", sdir, subject, aseg_name) ; printf("reading %s\n", fname) ; mri_aseg = MRIread(fname) ; if (mri_aseg == NULL) ErrorExit(ERROR_NOFILE, "%s: could not read aseg from %s\n", Progname, fname) ; sprintf(fname, "%s/%s/surf/%s.%s", sdir, subject, hemi, pial_name) ; if (MRISreadPialCoordinates(mris, fname) != NO_ERROR) ErrorExit(ERROR_NOFILE, "%s: could not read pial coordinates from %s\n", Progname, fname) ; sprintf(fname, "%s/%s/surf/%s.%s", sdir, subject, hemi, sphere_name) ; if (MRISreadCanonicalCoordinates(mris, fname) != NO_ERROR) ErrorExit(ERROR_NOFILE, "%s: could not read left/right spherical coordinates from %s\n", Progname, fname) ; sprintf(fname, "%s/%s/surf/%s.%s", sdir, subject, ohemi, pial_name) ; if (MRISreadPialCoordinates(mris_contra, fname) != NO_ERROR) ErrorExit(ERROR_NOFILE, "%s: could not read pial coordinates from %s\n", Progname, fname) ; sprintf(fname, "%s/%s/label/%s.%s", sdir, subject, hemi, cortex_label) ; cortex = LabelRead(NULL, fname) ; if (cortex == NULL) ErrorExit(ERROR_NOFILE, "%s: could not read cortical label from %s\n", Progname, fname) ; LabelRipRestOfSurface(cortex, mris) ; LabelFree(&cortex) ; sprintf(fname, "%s/%s/surf/%s.%s", sdir, subject, ohemi, sphere_name) ; if (MRISreadCanonicalCoordinates(mris_contra, fname) != NO_ERROR) ErrorExit(ERROR_NOFILE, "%s: could not read left/right spherical coordinates from %s\n", Progname, fname) ; sprintf(fname, "%s/%s/mri/%s", sdir, subject, vol_name) ; printf("reading %s\n", fname) ; mri = MRIread(fname) ; if (mri == NULL) ErrorExit(ERROR_NOFILE, "%s: could not read volume from %s\n", Progname, fname) ; if (0) mri_features = MRIcomputeSurfaceDistanceProbabilities(mris, mri_ribbon, mri, mri_aseg) ; else { MRI *mri_ohemi_features, *mri_ohemi_mapped_to_hemi_features ; mri_features = MRIcomputeSurfaceDistanceIntensities(mris, mri_ribbon, mri_aparc, mri, mri_aseg, whalf) ; mri_ohemi_features = MRIcomputeSurfaceDistanceIntensities(mris_contra, mri_ribbon, mri_aparc, mri, mri_aseg, whalf) ; mri_ohemi_mapped_to_hemi_features = MRISmapToSurface(mris_contra, mris, mri_ohemi_features, NULL) ; // map contra feature to this surface // MRIwrite(mri_ohemi_mapped_to_hemi_features, "test.mgz") ; MRIsubtract(mri_features, mri_ohemi_mapped_to_hemi_features, mri_features) ; } if (navgs > 0) { MRI *mri_tmp ; mri_tmp = MRISsmoothMRI(mris, mri_features, navgs, NULL, NULL); MRIfree(&mri_features) ; mri_features = mri_tmp ; } printf("writing output to %s\n", out_fname) ; if (Gdiag_no >= 0) printf("feature(%d) = %f\n", Gdiag_no, MRIgetVoxVal(mri_features, Gdiag_no, 0, 0, 0)) ; MRIwrite(mri_features, out_fname) ; msec = TimerStop(&start) ; seconds = nint((float)msec/1000.0f) ; minutes = seconds / 60 ; seconds = seconds % 60 ; fprintf(stderr, "feature extraction took %d minutes and %d seconds.\n", minutes, seconds) ; exit(0) ; return(0) ; }
FCD_DATA * FCDloadData(char *sdir, char *subject) { FCD_DATA *fcd ; char fname[STRLEN] ; MRI *mri_interior, *mri_dist, *mri_int_lh, *mri_int_rh, *mri_pvals ; fcd = (FCD_DATA *)calloc(1, sizeof(FCD_DATA)) ; sprintf(fname, "%s/%s/surf/lh.white", sdir, subject) ; fcd->mris_lh = MRISread(fname) ; if (fcd->mris_lh == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } MRISsaveVertexPositions(fcd->mris_lh, WHITE_VERTICES) ; if (MRISreadPialCoordinates(fcd->mris_lh, "pial") != NO_ERROR) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load lh pial vertices") ; } sprintf(fname, "%s/%s/surf/lh.pial", sdir, subject) ; fcd->mris_lh_pial = MRISread(fname) ; if (fcd->mris_lh_pial == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } sprintf(fname, "%s/%s/surf/lh.sphere.d1.left_right", sdir, subject) ; fcd->mris_lh_sphere_d1 = MRISread(fname) ; if (fcd->mris_lh_sphere_d1 == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } exec_progress_callback(1, 12, 0, 1) ; sprintf(fname, "%s/%s/surf/rh.white", sdir, subject) ; fcd->mris_rh = MRISread(fname) ; if (fcd->mris_rh == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } MRISsaveVertexPositions(fcd->mris_rh, WHITE_VERTICES) ; if (MRISreadPialCoordinates(fcd->mris_rh, "pial") != NO_ERROR) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load rh pial vertices") ; } sprintf(fname, "%s/%s/surf/rh.pial", sdir, subject) ; fcd->mris_rh_pial = MRISread(fname) ; if (fcd->mris_rh_pial == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } sprintf(fname, "%s/%s/surf/rh.sphere.d1.left_right", sdir, subject) ; fcd->mris_rh_sphere_d1 = MRISread(fname) ; if (fcd->mris_rh_sphere_d1 == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } exec_progress_callback(2, 12, 0, 1) ; sprintf(fname, "%s/%s/mri/aseg.mgz", sdir, subject) ; fcd->mri_aseg = MRIread(fname) ; if (fcd->mri_aseg == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } exec_progress_callback(3, 12, 0, 1) ; sprintf(fname, "%s/%s/mri/aparc+aseg.mgz", sdir, subject) ; fcd->mri_aparc = MRIread(fname) ; if (fcd->mri_aparc == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } exec_progress_callback(4, 12, 0, 1) ; fcd->mri_flair = NULL; sprintf(fname, "%s/%s/mri/flair.reg.norm.mgz", sdir, subject) ; if ( ! FileExists(fname)) { sprintf(fname, "%s/%s/mri/FLAIR.mgz", sdir, subject) ; if ( ! FileExists(fname)) { sprintf(fname, "%s/%s/mri/FLAIRax.mgz", sdir, subject) ; if ( ! FileExists(fname)) { sprintf(fname, "%s/%s/mri/FLAIRcor.mgz", sdir, subject) ; if ( ! FileExists(fname)) { sprintf(fname, " "); } } } } if (strlen(fname) > 1) { fcd->mri_flair = MRIread(fname) ; if (fcd->mri_flair == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load $s", fname) ; } } fcd->mri_t2 = NULL; sprintf(fname, "%s/%s/mri/T2.mgz", sdir, subject) ; if ( ! FileExists(fname)) { sprintf(fname, "%s/%s/mri/T2ax.mgz", sdir, subject) ; if ( ! FileExists(fname)) { sprintf(fname, "%s/%s/mri/T2cor.mgz", sdir, subject) ; if ( ! FileExists(fname)) { sprintf(fname, " "); } } } if (strlen(fname) > 1) { fcd->mri_t2 = MRIread(fname) ; if (fcd->mri_t2 == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load $s", fname) ; } } exec_progress_callback(5, 12, 0, 1) ; sprintf(fname, "%s/%s/mri/norm.mgz", sdir, subject) ; fcd->mri_norm = MRIread(fname) ; if (fcd->mri_norm == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } fcd->mri_thickness_increase = MRIcloneDifferentType(fcd->mri_aseg, MRI_FLOAT) ; fcd->mri_thickness_decrease = MRIcloneDifferentType(fcd->mri_aseg, MRI_FLOAT) ; fcd->mri_thickness_difference = MRIadd(fcd->mri_thickness_increase, fcd->mri_thickness_decrease, NULL); exec_progress_callback(6, 12, 0, 1) ; sprintf(fname, "%s/%s/surf/lh.rh.thickness.smooth0.mgz", sdir, subject) ; fcd->rh_thickness_on_lh = MRIread(fname) ; if (fcd->mri_aseg == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } exec_progress_callback(7, 12, 0, 1) ; sprintf(fname, "%s/%s/surf/rh.thickness.mgz", sdir, subject) ; fcd->rh_thickness_on_rh = MRIread(fname) ; if (fcd->rh_thickness_on_rh == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } exec_progress_callback(8, 12, 0, 1) ; sprintf(fname, "%s/%s/surf/lh.thickness.mgz", sdir, subject) ; fcd->lh_thickness_on_lh = MRIread(fname) ; if (fcd->lh_thickness_on_lh == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } exec_progress_callback(9, 12, 0, 1) ; sprintf(fname, "%s/%s/surf/rh.lh.thickness.smooth0.mgz", sdir, subject) ; if ( ! FileExists(fname)) { sprintf(fname, "%s/%s/surf/rh.lh.thickness.mgz", sdir, subject) ; if (fcd->lh_thickness_on_rh == NULL) { ErrorExit(ERROR_NOFILE, "FCDloadData: couldn't load %s", fname) ; } } fcd->lh_thickness_on_rh = MRIread(fname) ; exec_progress_callback(10, 12, 0, 1) ; mri_int_lh = MRIclone(fcd->mri_norm, NULL) ; mri_int_rh = MRIclone(fcd->mri_norm, NULL) ; mri_interior = MRIclone(fcd->mri_norm, NULL) ; mri_dist = MRIcloneDifferentType(mri_interior, MRI_FLOAT) ; MRISrestoreVertexPositions(fcd->mris_lh, PIAL_VERTICES) ; MRISrestoreVertexPositions(fcd->mris_rh, PIAL_VERTICES) ; MRISfillInterior(fcd->mris_lh, mri_interior->xsize, mri_int_lh) ; MRISfillInterior(fcd->mris_rh, mri_interior->xsize, mri_int_rh) ; exec_progress_callback(11, 12, 0, 1) ; MRIor(mri_int_lh, mri_int_rh, mri_interior, 0) ; MRIfree(&mri_int_lh) ; MRIfree(&mri_int_rh) ; MRIbinarize(mri_interior, mri_interior, 1, 0, 1) ; if (Gdiag & DIAG_WRITE) { MRIwrite(mri_interior, "int.mgz") ; } MRIdistanceTransform(mri_interior, mri_dist, 1, 2*MAX_DIST, DTRANS_MODE_SIGNED, NULL); if (Gdiag & DIAG_WRITE) { MRIwrite(mri_dist, "dist.mgz") ; } mri_pvals = build_distance_by_intensity_histo(fcd->mri_norm, mri_dist, fcd->mri_aseg, DIST_SPACING, MAX_DIST) ; exec_progress_callback(12, 12, 0, 1) ; augment_thicknesses(fcd, mri_pvals, 1.5, 5, 1) ; MRISrestoreVertexPositions(fcd->mris_lh, WHITE_VERTICES) ; MRISrestoreVertexPositions(fcd->mris_rh, WHITE_VERTICES) ; MRIfree(&mri_dist) ; MRIfree(&mri_interior) ; MRIfree(&mri_pvals) ; return(fcd) ; }