Пример #1
0
def create_electrodes_points(
    subject, args
):  # bipolar=False, create_points_files=True, create_volume_file=False,
    # way_points=False, electrodes_pos_fname=''):
    if args.elecs_names is None:
        return
    groups = set(
        [utils.elec_group(name, args.bipolar) for name in args.elecs_names])
    freeview_command = 'freeview -v T1.mgz:opacity=0.3 aparc+aseg.mgz:opacity=0.05:colormap=lut ' + \
        ('-w ' if args.way_points else '-c ')
    for group in groups:
        postfix = 'label' if args.way_points else 'dat'
        freeview_command = freeview_command + group + postfix + ' '
        group_pos = np.array([
            pos for name, pos in zip(args.elecs_names, args.elecs_pos)
            if utils.elec_group(name, args.bipolar) == group
        ])
        file_name = '{}.{}'.format(group, postfix)
        with open(op.join(BLENDER_ROOT_DIR, subject, 'freeview', file_name),
                  'w') as fp:
            writer = csv.writer(fp, delimiter=' ')
            if args.way_points:
                writer.writerow(
                    ['#!ascii label  , from subject  vox2ras=Scanner'])
                writer.writerow([len(group_pos)])
                points = np.hstack((np.ones(
                    (len(group_pos), 1)) * -1, group_pos,
                                    np.ones((len(group_pos), 1))))
                writer.writerows(points)
            else:
                writer.writerows(group_pos)
                writer.writerow(['info'])
                writer.writerow(['numpoints', len(group_pos)])
                writer.writerow(['useRealRAS', '0'])

    if args.create_volume_file:
        import nibabel as nib
        from itertools import product
        sig = nib.load(op.join(BLENDER_ROOT_DIR, subject, 'freeview',
                               'T1.mgz'))
        sig_header = sig.get_header()
        data = np.zeros((256, 256, 256), dtype=np.int16)
        # positions_ras = np.array(utils.to_ras(electrodes_positions, round_coo=True))
        elecs_pos = np.array(args.elecs_pos, dtype=np.int16)
        for pos_ras in elecs_pos:
            for x, y, z in product(*([[d + i for i in range(-5, 6)]
                                      for d in pos_ras])):
                data[z, y, z] = 1
        img = nib.Nifti1Image(data, sig_header.get_affine(), sig_header)
        nib.save(
            img,
            op.join(BLENDER_ROOT_DIR, subject, 'freeview',
                    'electrodes.nii.gz'))
def read_csv_file(csv_fname, save_as_bipolar):
    csv_lines = np.genfromtxt(csv_fname,
                              dtype=str,
                              delimiter=',',
                              skip_header=1)
    electrodes = defaultdict(list)
    for line in csv_lines:
        subject = line[0].lower()
        elecs_names = [e.strip() for e in line[1:3].tolist()]
        elecs_groups = [utils.elec_group(e) for e in elecs_names]
        if elecs_groups[0] == elecs_groups[1]:
            elec_name = '{}-{}'.format(elecs_names[1], elecs_names[0])
        else:
            print('The electrodes has different groups! {}, {}'.format(
                elecs_groups[0], elecs_groups[1]))
            continue
        coords1 = line[3:6].astype(np.float)
        coords2 = line[6:9].astype(np.float)
        if save_as_bipolar:
            coords = (coords1 + (coords2 - coords1) / 2)
            electrodes[subject].append((elec_name, coords))
        else:
            electrodes[subject].append((elecs_names[0], coords1))
            electrodes[subject].append((elecs_names[1], coords2))
    return electrodes
Пример #3
0
def load_stim_file(subject, args):
    stim_fname = op.join(
        MMVT_DIR, subject, 'electrodes',
        '{}{}.npz'.format(args.file_frefix, args.stim_channel))
    stim = np.load(stim_fname)
    labels, psd, time, freqs = (stim[k]
                                for k in ['labels', 'psd', 'time', 'freqs'])
    bipolar = '-' in labels[0]
    data = None
    freqs_dim = psd.shape.index(len(freqs))
    labels_dim = psd.shape.index(len(labels))
    if time.ndim > 0:
        time_dim = psd.shape.index(len(time))
    else:
        time_dim = next(iter(set(range(3)) - set([freqs_dim, labels_dim])))
    T, L, F = psd.shape[time_dim], psd.shape[labels_dim], psd.shape[freqs_dim]
    if args.downsample > 1:
        time = utils.downsample(time, args.downsample)
    colors = None
    conditions = []
    for freq_ind, (freq_from, freq_to) in enumerate(freqs):
        if data is None:
            # initialize the data matrix (electrodes_num x T x freqs_num)
            data = np.zeros((L, T, F))
        psd_slice = get_psd_freq_slice(psd, freq_ind, freqs_dim, time_dim)
        if args.downsample > 1:
            psd_slice = utils.downsample(psd_slice, args.downsample)
        data[:, :, freq_ind] = psd_slice
        data_min, data_max = utils.calc_min_max(psd_slice,
                                                norm_percs=args.norm_percs)
        if colors is None:
            colors = np.zeros((*data.shape, 3))
        for elec_ind, elec_name in enumerate(labels):
            elec_group = utils.elec_group(elec_name, bipolar)
            # if elec_group in ['LVF', 'RMT']:
            #     colors[elec_ind, :, freq_ind] = utils.mat_to_colors(psd_slice[elec_ind], data_min, data_max, colorsMap='BuGn')
            # else:
            colors[elec_ind, :,
                   freq_ind] = utils.mat_to_colors(psd_slice[elec_ind],
                                                   data_min,
                                                   data_max,
                                                   colorsMap=args.colors_map)
        conditions.append('{}-{}Hz'.format(freq_from, freq_to))
    output_fname = op.join(
        MMVT_DIR, subject, 'electrodes',
        'stim_electrodes_{}{}_{}.npz'.format(args.file_frefix,
                                             'bipolar' if bipolar else '',
                                             args.stim_channel))
    print('Saving {}'.format(output_fname))
    np.savez(output_fname,
             data=data,
             names=labels,
             conditions=conditions,
             colors=colors)
    return dict(data=data, labels=labels, conditions=conditions, colors=colors)
Пример #4
0
def create_electrodes_points(subject, args): # bipolar=False, create_points_files=True, create_volume_file=False,
                             # way_points=False, electrodes_pos_fname=''):
    if args.elecs_names is None:
        return
    groups = set([utils.elec_group(name, args.bipolar) for name in args.elecs_names])
    freeview_command = 'freeview -v T1.mgz:opacity=0.3 aparc+aseg.mgz:opacity=0.05:colormap=lut ' + \
        ('-w ' if args.way_points else '-c ')
    for group in groups:
        postfix = 'label' if args.way_points else 'dat'
        freeview_command = freeview_command + group + postfix + ' '
        group_pos = np.array([pos for name, pos in zip(args.elecs_names, args.elecs_pos) if
                              utils.elec_group(name, args.bipolar) == group])
        file_name = '{}.{}'.format(group, postfix)
        with open(op.join(MMVT_DIR, subject, 'freeview', file_name), 'w') as fp:
            writer = csv.writer(fp, delimiter=' ')
            if args.way_points:
                writer.writerow(['#!ascii label  , from subject  vox2ras=Scanner'])
                writer.writerow([len(group_pos)])
                points = np.hstack((np.ones((len(group_pos), 1)) * -1, group_pos, np.ones((len(group_pos), 1))))
                writer.writerows(points)
            else:
                writer.writerows(group_pos)
                writer.writerow(['info'])
                writer.writerow(['numpoints', len(group_pos)])
                writer.writerow(['useRealRAS', '0'])

    if args.create_volume_file:
        import nibabel as nib
        from itertools import product
        sig = nib.load(op.join(MMVT_DIR, subject, 'freeview', 'T1.mgz'))
        sig_header = sig.get_header()
        data = np.zeros((256, 256, 256), dtype=np.int16)
        # positions_ras = np.array(utils.to_ras(electrodes_positions, round_coo=True))
        elecs_pos = np.array(args.elecs_pos, dtype=np.int16)
        for pos_ras in elecs_pos:
            for x, y, z in product(*([[d+i for i in range(-5,6)] for d in pos_ras])):
                data[z,y,z] = 1
        img = nib.Nifti1Image(data, sig_header.get_affine(), sig_header)
        nib.save(img, op.join(MMVT_DIR, subject, 'freeview', 'electrodes.nii.gz'))
Пример #5
0
def sort_groups(first_electrodes, transformed_first_pos, groups_hemi, bipolar):
    sorted_groups = {}
    for hemi in ['rh', 'lh']:
        # groups_pos = sorted([(pos[0], group) for (group, elc), pos in zip(
        #     first_electrodes.items(), transformed_first_pos) if groups_hemi[utils.elec_group(elc, bipolar)] == hemi])
        groups_pos = []
        for (group, elc), pos in zip(first_electrodes.items(), transformed_first_pos):
            group_hemi = groups_hemi[utils.elec_group(elc, bipolar)]
            if group_hemi == hemi:
                groups_pos.append((pos[0], group))
        groups_pos = sorted(groups_pos)
        sorted_groups[hemi] = [group_pos[1] for group_pos in groups_pos]
    return sorted_groups
Пример #6
0
def create_freeview_cmd(subject, args):#, atlas, bipolar, create_points_files=True, way_points=False):
    blender_freeview_fol = op.join(MMVT_DIR, subject, 'freeview')
    freeview_command = 'freeview -v T1.mgz:opacity=0.3 ' + \
        '{0}+aseg.mgz:opacity=0.05:colormap=lut:lut={0}ColorLUT.txt '.format(args.atlas)
    if args.elecs_names:
        groups = set([utils.elec_group(name, args.bipolar) for name in args.elecs_names])
        freeview_command += '-w ' if args.way_points else '-c '
        postfix = '.label' if args.way_points else '.dat'
        for group in groups:
            freeview_command += group + postfix + ' '
    utils.make_dir(blender_freeview_fol)
    with open(op.join(blender_freeview_fol, 'run_freeview.sh'), 'w') as sh_file:
        sh_file.write(freeview_command)
    print(freeview_command)
Пример #7
0
def find_first_electrode_per_group(electrodes, positions, bipolar=False):
    groups = OrderedDict()  # defaultdict(list)
    first_electrodes = OrderedDict()
    for elc, pos in zip(electrodes, positions):
        elc_group = utils.elec_group(elc, bipolar)
        if elc_group not in groups:
            groups[elc_group] = []
        groups[elc_group].append((elc, pos))
    first_pos = np.empty((len(groups), 3))
    for ind, (group, group_electrodes) in enumerate(groups.items()):
        first_electrode = sorted(group_electrodes)[0]
        first_pos[ind, :] = first_electrode[1]
        first_electrodes[group] = first_electrode[0]
    return first_electrodes, first_pos, groups
Пример #8
0
def create_freeview_cmd(subject, args):#, atlas, bipolar, create_points_files=True, way_points=False):
    blender_freeview_fol = op.join(MMVT_DIR, subject, 'freeview')
    freeview_command = 'freeview -v T1.mgz:opacity=0.3 ' + \
        '{0}+aseg.mgz:opacity=0.05:colormap=lut:lut={0}ColorLUT.txt '.format(args.atlas)
    if args.elecs_names:
        groups = set([utils.elec_group(name, args.bipolar) for name in args.elecs_names])
        freeview_command += '-w ' if args.way_points else '-c '
        postfix = '.label' if args.way_points else '.dat'
        for group in groups:
            freeview_command += group + postfix + ' '
    utils.make_dir(blender_freeview_fol)
    freeview_cmd_fname = op.join(blender_freeview_fol, 'run_freeview.sh')
    with open(freeview_cmd_fname, 'w') as sh_file:
        sh_file.write(freeview_command)
    print(freeview_command)
    return op.isfile(freeview_cmd_fname)
Пример #9
0
def create_electrodes_groups_coloring(subject, bipolar, coloring_fname='electrodes_groups_coloring.csv'):
    electrodes, groups = get_electrodes_groups(subject, bipolar)
    colors_rgb_and_names = cu.get_distinct_colors_and_names(len(groups) - 1, boynton=True)
    group_colors = dict()
    coloring_fname = op.join(MMVT_DIR, subject, 'coloring', coloring_fname)
    coloring_names_fname = op.join(MMVT_DIR, subject, 'coloring', 'electrodes_groups_coloring_names.csv')
    with open(coloring_names_fname, 'w') as colors_names_file:
        for group, (color_rgb, color_name) in zip(groups, colors_rgb_and_names):
            if 'ref' in group.lower():
                continue
            group_colors[group] = color_rgb
            colors_names_file.write('{},{}\n'.format(group, color_name))
    with open(coloring_fname, 'w') as colors_file:
        for elc in electrodes:
            if 'ref' in elc.lower():
                continue
            elc_group = utils.elec_group(elc, bipolar)
            colors_file.write('{},{},{},{}\n'.format(elc, *group_colors[elc_group]))
Пример #10
0
def load_stim_file(subject, args):
    stim_fname = op.join(MMVT_DIR, subject, 'electrodes', '{}{}.npz'.format(
        args.file_frefix, args.stim_channel))
    stim = np.load(stim_fname)
    labels, psd, time, freqs = (stim[k] for k in ['labels', 'psd', 'time', 'freqs'])
    bipolar = '-' in labels[0]
    data = None
    freqs_dim = psd.shape.index(len(freqs))
    labels_dim = psd.shape.index(len(labels))
    if time.ndim > 0:
        time_dim = psd.shape.index(len(time))
    else:
        time_dim = next(iter(set(range(3)) - set([freqs_dim, labels_dim])))
    T, L, F = psd.shape[time_dim], psd.shape[labels_dim], psd.shape[freqs_dim]
    if args.downsample > 1:
        time = utils.downsample(time, args.downsample)
    colors = None
    conditions = []
    for freq_ind, (freq_from, freq_to) in enumerate(freqs):
        if data is None:
            # initialize the data matrix (electrodes_num x T x freqs_num)
            data = np.zeros((L, T, F))
        psd_slice = get_psd_freq_slice(psd, freq_ind, freqs_dim, time_dim)
        if args.downsample > 1:
            psd_slice = utils.downsample(psd_slice, args.downsample)
        data[:, :, freq_ind] = psd_slice
        data_min, data_max = utils.calc_min_max(psd_slice, norm_percs=args.norm_percs)
        if colors is None:
            colors = np.zeros((*data.shape, 3))
        for elec_ind, elec_name in enumerate(labels):
            elec_group = utils.elec_group(elec_name, bipolar)
            # if elec_group in ['LVF', 'RMT']:
            #     colors[elec_ind, :, freq_ind] = utils.mat_to_colors(psd_slice[elec_ind], data_min, data_max, colorsMap='BuGn')
            # else:
            colors[elec_ind, :, freq_ind] = utils.mat_to_colors(psd_slice[elec_ind], data_min, data_max, colorsMap=args.colors_map)
        conditions.append('{}-{}Hz'.format(freq_from, freq_to))
    output_fname = op.join(MMVT_DIR, subject, 'electrodes', 'stim_electrodes_{}{}_{}.npz'.format(
            args.file_frefix, 'bipolar' if bipolar else '', args.stim_channel))
    print('Saving {}'.format(output_fname))
    np.savez(output_fname, data=data, names=labels, conditions=conditions, colors=colors)
    return dict(data=data, labels=labels, conditions=conditions, colors=colors)
def create_volume_with_electrodes(electrodes,
                                  subjects_dir,
                                  merge_to_pairs=True,
                                  overwrite=False):
    for subject in electrodes.keys():
        if not op.isfile(op.join(SUBJECTS_DIR, subject, 'mri', 'T1.mgz')):
            print(f'No T1 file for {subject}')
            continue
        t1_header = nib.load(op.join(SUBJECTS_DIR, subject, 'mri',
                                     'T1.mgz')).header
        fol = utils.make_dir(op.join(subjects_dir, subject, 'electrodes'))
        output_fname = op.join(fol, 'stim_electrodes.nii.gz')
        data = np.zeros((256, 256, 256), dtype=np.int16)
        if merge_to_pairs:
            groups = defaultdict(list)
            for elc_name, coords in electrodes[subject]:
                groups[utils.elec_group(elc_name)].append(elc_name, coords)
            for group in groups.keys():
                pair_data = np.zeros((256, 256, 256), dtype=np.int16)
                for elc_name, coords in groups[group]:
                    vox = tkreg_to_vox(t1_header, coords)
                    pair_data[tuple(vox)] = 1000
                pair_output_fname = op.join(fol, f'stim_{elc_name}.nii.gz')
                if not op.isfile(elc_output_fname) or overwrite:
                    pass
        else:
            for elc_name, coords in electrodes[subject]:
                vox = tkreg_to_vox(t1_header, coords)
                # data[tuple(vox)] = 1000
                elc_output_fname = op.join(fol, f'stim_{elc_name}.nii.gz')
                if not op.isfile(elc_output_fname) or overwrite:
                    elc_data = np.zeros((256, 256, 256), dtype=np.int16)
                    elc_data[tuple(vox)] = 1000
                    elc_img = nib.Nifti1Image(elc_data, t1_header.get_affine(),
                                              t1_header)
                    print(f'Saving {elc_output_fname}')
                    nib.save(elc_img, elc_output_fname)
Пример #12
0
def get_electrodes_groups(subject, bipolar):
    electrodes, _ = read_electrodes_file(subject, bipolar)
    groups = set()
    for elc in electrodes:
        groups.add(utils.elec_group(elc, bipolar))
    return electrodes, groups
Пример #13
0
def get_groups_pos(electrodes, positions, bipolar):
    groups = defaultdict(list)
    for elc, pos in zip(electrodes, positions):
        elc_group = utils.elec_group(elc, bipolar)
        groups[elc_group].append(pos)
    return groups