Пример #1
0
def calc_shifted_vox2tk_ras(region_fname, colin_T1_fname):
    region_vox2ras = tu.get_vox2ras(region_fname)
    zero_in_ras = utils.apply_trans(region_vox2ras, [[0, 0, 0]])
    zero_in_T1_voxels = utils.apply_trans(np.linalg.inv(tu.get_vox2ras(colin_T1_fname)), zero_in_ras)
    zero_in_T1_tk_ras = utils.apply_trans(tu.get_vox2ras_tkr(colin_T1_fname), zero_in_T1_voxels)
    voxels_sizes = [abs(v) for v in np.diag(region_vox2ras)[:-1]]
    shifted_vox2tk_ras = get_shifted_vox2tk_ras(zero_in_T1_tk_ras[0], voxels_sizes)
    return shifted_vox2tk_ras
Пример #2
0
def calc_shifted_vox2tk_ras(region_fname, colin_T1_fname):
    region_vox2ras = tu.get_vox2ras(region_fname)
    zero_in_ras = utils.apply_trans(region_vox2ras, [[0, 0, 0]])
    zero_in_T1_voxels = utils.apply_trans(np.linalg.inv(tu.get_vox2ras(colin_T1_fname)), zero_in_ras)
    zero_in_T1_tk_ras = utils.apply_trans(tu.get_vox2ras_tkr(colin_T1_fname), zero_in_T1_voxels)
    voxels_sizes = [abs(v) for v in np.diag(region_vox2ras)[:-1]]
    shifted_vox2tk_ras = get_shifted_vox2tk_ras(zero_in_T1_tk_ras[0], voxels_sizes)
    return shifted_vox2tk_ras
Пример #3
0
def convert_coordinates(subject, xyz, modality, coordinates_system):
    point = np.array(list(map(float, xyz.split(','))))
    trans = get_modality_trans_file(subject, modality)
    if trans is None:
        return None
    if coordinates_system == 'tk_ras':
        vox = utils.apply_trans(trans.ras_tkr2vox, point).astype(np.int)
        print('T1: {}'.format(vox))
    elif coordinates_system == 'vox':
        vox = point
    return vox
Пример #4
0
def get_t1_vertices_data(subject):
    trans_fname = op.join(MMVT_DIR, subject, 't1_trans.npz')
    trans_dict = utils.Bag(np.load(trans_fname))
    ras_tkr2vox = np.linalg.inv(trans_dict.vox2ras_tkr)
    pial_verts = utils.load_surf(subject, MMVT_DIR, SUBJECTS_DIR)
    t1_data, t1_header = anat.get_data_and_header(subject, 'brainmask.mgz')
    for hemi in utils.HEMIS:
        output_fname = op.join(MMVT_DIR, subject, 'surf', 'T1-{}.npy'.format(hemi))
        verts = pial_verts[hemi]
        t1_surf_hemi = np.zeros((len(verts)))
        hemi_pial_voxels = np.rint(utils.apply_trans(ras_tkr2vox, verts)).astype(int)
        for vert_ind, t1_vox in zip(range(len(verts)), hemi_pial_voxels):
            t1_surf_hemi[vert_ind] = t1_data[tuple(t1_vox)]
        np.save(output_fname, t1_surf_hemi)
def create_surf(subject, subcortical_code, subcortical_name):
    aseg = nib.load(op.join(SUBJECTS_DIR, subject, 'mri',
                            'aseg.mgz')).get_data()
    t1_header = nib.load(op.join(SUBJECTS_DIR, subject, 'mri',
                                 'T1.mgz')).header
    aseg[aseg != subcortical_code] = 255
    aseg[aseg == subcortical_code] = 10
    aseg = np.array(aseg, dtype=np.float)
    aseg_smooth = scipy.ndimage.gaussian_filter(aseg, sigma=1)
    verts_vox, faces, _, _ = measure.marching_cubes(aseg_smooth, 100)
    # Doesn't seem to fix the normals directions that should be out...
    faces = measure.correct_mesh_orientation(aseg_smooth, verts_vox, faces)
    verts = utils.apply_trans(t1_header.get_vox2ras_tkr(), verts_vox)
    fol = utils.make_dir(op.join(MMVT_DIR, subject, 'subcortical_test'))
    ply_file_name = op.join(fol, '{}.ply'.format(subcortical_name))
    utils.write_ply_file(verts, faces, ply_file_name, False)
Пример #6
0
def load():
    import sys
    # print(sys.argv)
    if len(sys.argv) == 6:
        mri_fname = sys.argv[1]
        x, y, z = map(float, sys.argv[2:5])
        print(x, y, z)
        if sys.argv[5] == 'load':
            open_slicer(mri_fname, x, y, z)
        elif sys.argv[5] == 'update':
            update_slicer(x, y, z)
    else:
        # open_slicer('/home/noam/mmvt/mg78/freeview/orig.mgz', 0.9862712 , -45.62893867,  12.2588706)
        # subject = 'nmr00979'
        # subject = '100307'
        subject = 'mg102'
        trans_fname = op.join(MMVT_DIR, subject, 't1_trans.npz')
        d = utils.Bag(np.load(trans_fname))
        ras_tkr2vox = np.linalg.inv(d.vox2ras_tkr)
        mri_fname = op.join(MMVT_DIR, subject, 'freeview', 'T1.mgz')
        ct_fname = op.join(MMVT_DIR, subject, 'freeview', 'ct.mgz')
        # ct_fname = op.join(MMVT_DIR, subject, 'freeview', 'ct_nas.nii.gz')
        # x, y, z = 0.9862712 , -45.62893867,  12.2588706
        # x, y, z = 125, 151, 68

        point = np.array([-2.3, 1.1, 2.2]) * 10
        x, y, z = utils.apply_trans(ras_tkr2vox, point).astype(np.int)
        # x, y, z = 151, 106, 139
        # x, y, z = 166, 118, 113
        p = [133, 122, 84]
        p = [112.29232267212728, 125, 63.956603631432188]
        open_slicer(ct_fname, *p)

        # ct_header = nib.load(ct_fname).get_header()
        # ct_vox2ras_tkr = ct_header.get_vox2ras_tkr()
        # ct_ras_tkr2vox = np.linalg.inv(ct_vox2ras_tkr)
        # ct_x, ct_y, ct_z = utils.apply_trans(ct_ras_tkr2vox, point).astype(np.int)

        # save_slices(subject, mri_fname, x, y, z, 'mri')
        # save_slices(subject, ct_fname, 128, 139, 110, 'ct')

        # print('Error! Should send the mri fname, x, y and z')
        print('asdf')
Пример #7
0
def calc_subcorticals_pos(subject, aseg_data, lut):
    output_fname = op.join(MMVT_DIR, subject, 'subcorticals_pos.npz')
    if op.isfile(output_fname):
        d = np.load(output_fname)
        return d['pos'], list(d['names'])
    subject_header = nib.load(op.join(SUBJECTS_DIR, subject, 'mri',
                                      'T1.mgz')).header
    # codes_file = op.join(MMVT_DIR, 'sub_cortical_codes.txt')
    # subcortical_lookup = np.genfromtxt(codes_file, dtype=str, delimiter=',')
    aseg_unique_vals = np.unique(aseg_data)
    subcortical_lookup = [(label, index)
                          for label, index in zip(lut['label'], lut['index'])
                          if index < 1000 and label not in WHITES
                          and label != 'Unknown' and index in aseg_unique_vals]
    subs_pos = np.zeros((len(subcortical_lookup), 3))
    for sub_ind, (sub_name, sub_code) in enumerate(subcortical_lookup):
        t1_inds = np.where(aseg_data == int(sub_code))
        center_vox = np.array(t1_inds).mean(axis=1)
        subs_pos[sub_ind] = utils.apply_trans(subject_header.get_vox2ras_tkr(),
                                              center_vox)
    names = [name for name, index in subcortical_lookup]
    np.savez(output_fname, pos=subs_pos, names=names)
    return subs_pos, names
Пример #8
0
def calc_elas(subject,
              template,
              specific_elecs_names=[],
              bipolar=False,
              atlas='aparc.DKTatlas',
              error_radius=3,
              elc_length=4,
              print_warnings=False,
              overwrite=False,
              n_jobs=1):
    fol = utils.make_dir(
        op.join(MMVT_DIR, subject, 'electrodes', 'ela_morphed'))
    elecs_names, elecs_pos, elecs_dists, elecs_types, elecs_oris, excludes = get_electrodes_info(
        subject, atlas, bipolar, n_jobs)
    specific_elecs_names = specific_elecs_names if len(
        specific_elecs_names) > 0 else elecs_names
    elecs_info = [(elec_name, elec_pos, elec_dist, elec_type, elec_ori) for
                  elec_name, elec_pos, elec_dist, elec_type, elec_ori in \
                  zip(elecs_names, elecs_pos, elecs_dists, elecs_types, elecs_oris)
                  if elec_name in specific_elecs_names]
    (labels_vertices, regions_center_of_mass, regions_names, aseg_data, lut,
     pia_verts) = init(subject, atlas, n_jobs)
    atlas = utils.fix_atlas_name(subject, atlas, SUBJECTS_DIR)
    if not utils.both_hemi_files_exist(
            op.join(SUBJECTS_DIR, template, 'label', '{}.{}.annot'.format(
                '{hemi}', atlas))):
        raise Exception('No {} atlas for {}!'.format(atlas, template))
    else:
        template_atlas = atlas

    (template_labels_vertices, template_regions_center_of_mass,
     template_regions_names, template_aseg_data, lut,
     template_pia_verts) = init(template, template_atlas, n_jobs)
    len_lh_pia = len(pia_verts['lh'])
    template_len_lh_pia = len(template_pia_verts['lh'])
    template_header = nib.load(op.join(SUBJECTS_DIR, template, 'mri',
                                       'T1.mgz')).header
    epsilon = 0
    max_run_num = 1000
    parallel = True

    for elec_name, elec_pos, elec_dist, elec_type, elec_ori in elecs_info:
        elec_output_fname = op.join(fol,
                                    '{}_ela_morphed.npz'.format(elec_name))
        if op.isfile(elec_output_fname) and not overwrite:
            d = np.load(elec_output_fname)
            print('{}: err: {}, new_pos={}'.format(elec_name, d['err'],
                                                   d['pos']))
            continue
        elec_labeling = calc_ela(subject, bipolar, elec_name, elec_pos,
                                 elec_type, elec_ori, elec_dist,
                                 labels_vertices, aseg_data, lut, pia_verts,
                                 len_lh_pia, excludes, error_radius,
                                 elc_length, print_warnings, overwrite, n_jobs)
        print('subject_ela:')
        print_ela(elec_labeling)

        elec_labeling_no_whites = calc_elec_labeling_no_white(elec_labeling)
        template_elec_pos = calc_prob_pos(elec_labeling_no_whites,
                                          template_regions_center_of_mass,
                                          template_regions_names)
        subject_prob_pos_in_template_space = template_elec_pos.copy()
        template_elec_vox = np.rint(
            utils.apply_trans(np.linalg.inv(template_header.get_vox2ras_tkr()),
                              template_elec_pos).astype(int))

        elec_labeling_template = calc_ela(
            template, bipolar, elec_name, template_elec_pos, elec_type,
            elec_ori, elec_dist, template_labels_vertices, template_aseg_data,
            lut, template_pia_verts, template_len_lh_pia, excludes,
            error_radius, elc_length, print_warnings, overwrite, n_jobs)
        err = comp_elecs_labeling(elec_labeling_template,
                                  template_regions_center_of_mass,
                                  template_regions_names,
                                  subject_prob_pos_in_template_space)
        run_num = 0
        stop_gradient = False
        print(err)
        while not stop_gradient and err > epsilon and run_num < max_run_num:
            dxyzs = [(1, 0, 0), (-1, 0, 0), (0, 1, 0), (0, -1, 0), (0, 0, 1),
                     (0, 0, -1)]
            if parallel:
                new_template_elec_pos_arr = [
                    utils.apply_trans(template_header.get_vox2ras_tkr(),
                                      template_elec_vox + dxyz)
                    for dxyz in dxyzs
                ]
                params = [
                    (template, bipolar, elec_name, new_template_elec_pos,
                     elec_type, elec_ori, elec_dist, template_labels_vertices,
                     template_aseg_data, lut, template_pia_verts,
                     template_len_lh_pia, elec_labeling_no_whites,
                     regions_center_of_mass, regions_names,
                     template_regions_center_of_mass, template_regions_names,
                     subject_prob_pos_in_template_space, excludes,
                     error_radius, elc_length, overwrite)
                    for new_template_elec_pos in new_template_elec_pos_arr
                ]
                results = utils.run_parallel(_parallel_calc_ela_err, params,
                                             len(dxyzs) if n_jobs > 1 else 1)
                errs = [res[1] for res in results]
                ind = np.argmin(errs)
                new_template_pos = new_template_elec_pos_arr[ind]
                best_ela = results[ind][0]
                regions, new_probs = norm_probs(
                    calc_elec_labeling_no_white(best_ela))
                print([
                    '{} ({}) '.format(r, p)
                    for r, p in zip(regions, new_probs)
                ])
                min_err = errs[ind]
                if min_err >= err:
                    stop_gradient = True
                else:
                    err = min_err
            else:
                for dxyz in dxyzs:
                    new_template_elec_pos = utils.apply_trans(
                        template_header.get_vox2ras_tkr(),
                        template_elec_vox + dxyz)
                    elec_labeling_template = calc_ela(
                        template, bipolar, elec_name, new_template_elec_pos,
                        elec_type, elec_ori, elec_dist,
                        template_labels_vertices, template_aseg_data, lut,
                        template_pia_verts, template_len_lh_pia, excludes,
                        error_radius, elc_length, print_warnings, overwrite,
                        n_jobs)
                    new_err = comp_elecs_labeling(
                        elec_labeling_template,
                        template_regions_center_of_mass,
                        template_regions_names,
                        subject_prob_pos_in_template_space)
                    if new_err < err:
                        new_template_pos = new_template_elec_pos
                        err = new_err
                        break
                else:
                    stop_gradient = True

            print('*** {}){} ***'.format(run_num + 1, err))
            print_ela(elec_labeling_template)
            run_num += 1
            template_elec_vox = np.rint(
                utils.apply_trans(
                    np.linalg.inv(template_header.get_vox2ras_tkr()),
                    new_template_pos).astype(int))
            if stop_gradient:
                print('Stop gradient!!!')
                print('subject_ela:')
                print_ela(elec_labeling)
                print('template ela:')
                print_ela(elec_labeling_template)
        print('Save output to {}'.format(elec_output_fname))
        np.savez(elec_output_fname,
                 pos=new_template_pos,
                 name=elec_name,
                 err=err)
Пример #9
0
    else:
        # open_slicer('/home/noam/mmvt/mg78/freeview/orig.mgz', 0.9862712 , -45.62893867,  12.2588706)
        # subject = 'nmr00979'
        # subject = '100307'
        subject = 'mg102'
        trans_fname = op.join(MMVT_DIR, subject, 't1_trans.npz')
        d = utils.Bag(np.load(trans_fname))
        ras_tkr2vox = np.linalg.inv(d.vox2ras_tkr)
        mri_fname = op.join(MMVT_DIR, subject, 'freeview', 'T1.mgz')
        ct_fname = op.join(MMVT_DIR, subject, 'freeview', 'ct.mgz')
        # ct_fname = op.join(MMVT_DIR, subject, 'freeview', 'ct_nas.nii.gz')
        # x, y, z = 0.9862712 , -45.62893867,  12.2588706
        # x, y, z = 125, 151, 68

        point = np.array([-2.3, 1.1, 2.2]) * 10
        x, y, z = utils.apply_trans(ras_tkr2vox, point).astype(np.int)
        # x, y, z = 151, 106, 139
        # x, y, z = 166, 118, 113
        p = [133, 122, 84]
        p = [112.29232267212728, 125, 63.956603631432188]
        open_slicer(ct_fname, *p)

        # ct_header = nib.load(ct_fname).get_header()
        # ct_vox2ras_tkr = ct_header.get_vox2ras_tkr()
        # ct_ras_tkr2vox = np.linalg.inv(ct_vox2ras_tkr)
        # ct_x, ct_y, ct_z = utils.apply_trans(ct_ras_tkr2vox, point).astype(np.int)

        # save_slices(subject, mri_fname, x, y, z, 'mri')
        # save_slices(subject, ct_fname, 128, 139, 110, 'ct')

        # print('Error! Should send the mri fname, x, y and z')