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
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_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'))
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
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)
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
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)
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]))
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)
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
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