def test_density_scatter_plot2(self): import matplotlib.pyplot as plt pt.density_scatter_plot2(x=[3, 4], y=[5, 6], diffusion_constant=0.5, pixel_res=30, std_lim=3) plt.show() pt.density_scatter_plot2(x=[3, 4], y=[2, 50], diffusion_constant=0.5, pixel_res=31) plt.show()
def test_density_scatter_plot3(self): import numpy as np import matplotlib.pyplot as plt m1 = np.random.normal(size=1000) m2 = np.random.normal(scale=0.5, size=1000) x, y = m1 + m2, m1 - m2 pt.density_scatter_plot3(x=x, y=y, pixel_res=30) plt.show() pt.density_scatter_plot3(x=[3, 4], y=[5, 6], pixel_res=50, cmap='magma', bandwidth=0.1) plt.show()
mask_bin = np.zeros(mask.shape, dtype=np.uint8) mask_bin[mask > 0] = 1 mask_labeled, mask_num = ni.label(mask_bin) curr_mask_dict = ia.get_masks(labeled=mask_labeled, keyPrefix='caiman_mask_{:03d}'.format(i), labelLength=5) for roi_key, roi_mask in curr_mask_dict.items(): final_roi_dict.update({roi_key: ia.WeightedROI(roi_mask * mask)}) print('Total number of ROIs:', len(final_roi_dict)) f = plt.figure(figsize=(15, 8)) ax1 = f.add_subplot(121) ax1.imshow(bg, vmin=0, vmax=0.5, cmap='gray', interpolation='nearest') colors1 = pt.random_color(masks.shape[0]) for i, mask in enumerate(masks): pt.plot_mask_borders(mask, plotAxis=ax1, color=colors1[i]) ax1.set_title('original ROIs') ax1.set_axis_off() ax2 = f.add_subplot(122) ax2.imshow(ia.array_nor(bg), vmin=0, vmax=0.5, cmap='gray', interpolation='nearest') colors2 = pt.random_color(len(final_roi_dict)) i = 0 for roi in final_roi_dict.values(): pt.plot_mask_borders(roi.get_binary_mask(), plotAxis=ax2, color=colors2[i]) i = i + 1
def save_png(arr, save_path, figsize=(5, 5), **kwargs): f = plt.figure(figsize=figsize) ax = f.add_subplot(111) ax.imshow(arr, **kwargs) pt.save_figure_without_borders(f=f, savePath=save_path)
dff_traces, dff_trace_mean, dff_mean = get_dff( traces=curr_sta, t_axis=t_axis, response_span=response_span, baseline_span=baseline_span) curr_tf = grating_n[29:33] tf_i = np.where(tf_lst == curr_tf)[0][0] curr_sf = grating_n[22:26] sf_i = np.where(sf_lst == curr_sf)[0][0] curr_dire = grating_n[38:41] dire_i = np.where(dire_lst == curr_dire)[0][0] ax = plt.Subplot(f, gs_in_dict[tf_i][sf_i * len(dire_lst) + dire_i]) f_color = pt.value_2_rgb(value=(dff_mean - dff_mean_min) / (dff_mean_max - dff_mean_min), cmap=face_cmap) # f_color = pt.value_2_rgb(value=dff_mean / dff_mean_max, cmap=face_cmap) # print f_color ax.set_axis_bgcolor(f_color) ax.set_xticks([]) ax.set_yticks([]) for sp in ax.spines.values(): sp.set_visible(False) ax.axhline(y=0, ls='--', color='#888888', lw=1) ax.axvspan(response_span[0], response_span[1], alpha=0.5, color='#888888',
# cell1_mask.plot_binary_mask_border(plotAxis=ax, color='#ff0000', borderWidth=1) # cell2_mask.plot_binary_mask_border(plotAxis=ax, color='#0000ff', borderWidth=1) # ax.set_title('red:'+cell1_name+'; blue:'+cell2_name) # plt.show() break if is_remove == 0: retain_cells.append(cell1_name) print(cell1_name, ':', cell1_mask.get_binary_area(), ': retained') print('\ncells to be removed because of overlapping:') print('\n'.join(remove_cells)) print('\ntotal number of reatined cells:', len(retain_cells)) # plotting colors = pt.random_color(len(cells.keys())) bgImg = ia.array_nor(np.max(tf.imread(background_file_name), axis=0)) f = plt.figure(figsize=(10, 10)) ax = f.add_subplot(111) ax.imshow(ia.array_nor(bgImg), cmap='gray', vmin=0, vmax=0.5, interpolation='nearest') f2 = plt.figure(figsize=(10, 10)) ax2 = f2.add_subplot(111) ax2.imshow(np.zeros(bgImg.shape, dtype=np.uint8), vmin=0, vmax=1,
def run(): # pixels, masks with center location within this pixel region at the image border will be discarded center_margin = [ 10, 30, 35, 10 ] # [top margin, bottom margin, left margin, right margin] # area range, range of number of pixels of a valid roi area_range = [5, 500] # [10, 100] for bouton, [150, 1000] for soma # for the two masks that are overlapping, if the ratio between overlap and the area of the smaller mask is larger than # this value, the smaller mask will be discarded. overlap_thr = 0 # 0.2 save_folder = 'figures' data_file_name = 'cells.hdf5' save_file_name = 'cells_refined.hdf5' background_file_name = "corrected_mean_projections.tif" curr_folder = os.path.dirname(os.path.realpath(__file__)) os.chdir(curr_folder) if not os.path.isdir(save_folder): os.makedirs(save_folder) # read cells dfile = h5py.File(data_file_name, 'r') cells = {} for cellname in dfile.keys(): cells.update({cellname: ia.WeightedROI.from_h5_group(dfile[cellname])}) print('total number of cells:', len(cells)) # get the names of cells which are on the edge edge_cells = [] for cellname, cellmask in cells.items(): dimension = cellmask.dimension center = cellmask.get_center() if center[0] < center_margin[0] or \ center[0] > dimension[0] - center_margin[1] or \ center[1] < center_margin[2] or \ center[1] > dimension[1] - center_margin[3]: # cellmask.plot_binary_mask_border(color='#ff0000', borderWidth=1) # plt.title(cellname) # plt.show() edge_cells.append(cellname) print('\ncells to be removed because they are on the edges:') print('\n'.join(edge_cells)) # remove edge cells for edge_cell in edge_cells: _ = cells.pop(edge_cell) # get dictionary of cell areas cell_areas = {} for cellname, cellmask in cells.items(): cell_areas.update({cellname: cellmask.get_binary_area()}) # remove cellnames that have area outside of the area_range invalid_cell_ns = [] for cellname, cellarea in cell_areas.items(): if cellarea < area_range[0] or cellarea > area_range[1]: invalid_cell_ns.append(cellname) print("cells to be removed because they do not meet area criterion:") print("\n".join(invalid_cell_ns)) for invalid_cell_n in invalid_cell_ns: cell_areas.pop(invalid_cell_n) # sort cells with their binary area cell_areas_sorted = sorted(cell_areas.items(), key=operator.itemgetter(1)) cell_areas_sorted.reverse() cell_names_sorted = [c[0] for c in cell_areas_sorted] # print '\n'.join([str(c) for c in cell_areas_sorted]) # get the name of cells that needs to be removed because of overlapping retain_cells = [] remove_cells = [] for cell1_name in cell_names_sorted: cell1_mask = cells[cell1_name] is_remove = 0 cell1_area = cell1_mask.get_binary_area() for cell2_name in retain_cells: cell2_mask = cells[cell2_name] cell2_area = cell2_mask.get_binary_area() curr_overlap = cell1_mask.binary_overlap(cell2_mask) if float(curr_overlap) / cell1_area > overlap_thr: remove_cells.append(cell1_name) is_remove = 1 print(cell1_name, ':', cell1_mask.get_binary_area(), ': removed') # f = plt.figure(figsize=(10,10)) # ax = f.add_subplot(111) # cell1_mask.plot_binary_mask_border(plotAxis=ax, color='#ff0000', borderWidth=1) # cell2_mask.plot_binary_mask_border(plotAxis=ax, color='#0000ff', borderWidth=1) # ax.set_title('red:'+cell1_name+'; blue:'+cell2_name) # plt.show() break if is_remove == 0: retain_cells.append(cell1_name) print(cell1_name, ':', cell1_mask.get_binary_area(), ': retained') print('\ncells to be removed because of overlapping:') print('\n'.join(remove_cells)) print('\ntotal number of reatined cells:', len(retain_cells)) # plotting colors = pt.random_color(len(cells.keys())) bgImg = ia.array_nor(np.max(tf.imread(background_file_name), axis=0)) f = plt.figure(figsize=(10, 10)) ax = f.add_subplot(111) ax.imshow(ia.array_nor(bgImg), cmap='gray', vmin=0, vmax=0.5, interpolation='nearest') f2 = plt.figure(figsize=(10, 10)) ax2 = f2.add_subplot(111) ax2.imshow(np.zeros(bgImg.shape, dtype=np.uint8), vmin=0, vmax=1, cmap='gray', interpolation='nearest') i = 0 for retain_cell in retain_cells: cells[retain_cell].plot_binary_mask_border(plotAxis=ax, color=colors[i], borderWidth=1) cells[retain_cell].plot_binary_mask_border(plotAxis=ax2, color=colors[i], borderWidth=1) i += 1 # plt.show() # save figures pt.save_figure_without_borders(f, os.path.join( save_folder, '2P_refined_ROIs_with_background.png'), dpi=300) pt.save_figure_without_borders( f2, os.path.join(save_folder, '2P_refined_ROIs_without_background.png'), dpi=300) # save h5 file save_file = h5py.File(save_file_name, 'x') i = 0 for retain_cell in retain_cells: print(retain_cell, ':', cells[retain_cell].get_binary_area()) currGroup = save_file.create_group('cell' + ft.int2str(i, 4)) currGroup.attrs['name'] = retain_cell roiGroup = currGroup.create_group('roi') cells[retain_cell].to_h5_group(roiGroup) i += 1 for attr, value in dfile.attrs.items(): save_file.attrs[attr] = value save_file.close() dfile.close()
def run(): curr_folder = os.path.dirname(os.path.realpath(__file__)) os.chdir(curr_folder) print('getting total mask ...') cell_f = h5py.File('cells_refined.hdf5', 'r') h, w = cell_f['cell0000']['roi'].attrs['dimension'] total_mask = np.zeros((h, w), dtype=np.uint8) for cell_n, cell_grp in cell_f.items(): curr_roi = ia.WeightedROI.from_h5_group(cell_grp['roi']) curr_mask = curr_roi.get_binary_mask() total_mask = np.logical_or(total_mask, curr_mask) cell_f.close() total_mask = ni.binary_dilation(total_mask, iterations=1) # plt.imshow(total_mask) # plt.title('total_mask') # plt.show() nwb_folder = os.path.dirname(curr_folder) nwb_fn = [f for f in os.listdir(nwb_folder) if f[-4:] == '.nwb'][0] nwb_path = os.path.join(nwb_folder, nwb_fn) plane_n = os.path.split(curr_folder)[1] dset_path = 'processing/motion_correction/MotionCorrection/{}/corrected/data'.format( plane_n) print('downsampling movie ...') print('\tnwb_path: {}'.format(nwb_path)) print('\tdset_path: {}'.format(dset_path)) nwb_f = h5py.File(nwb_path, 'r') dset = nwb_f[dset_path] print('\ttotal shape: {}'.format(dset.shape)) nwb_f.close() mov_d = downsample_mov(nwb_path=nwb_path, dset_path=dset_path, dr=downsample_r) v_min = np.amin(mov_d) v_max = np.amax(mov_d) print('\tshape of downsampled movie: {}'.format(mov_d.shape)) print('\n\tgenerating avi ...') if cv2.__version__[0:3] == '3.1' or cv2.__version__[0] == '4': codex = 'XVID' fourcc = cv2.VideoWriter_fourcc(*codex) out = cv2.VideoWriter('marked_mov.avi', fourcc, 30, (frame_size * 100, frame_size * 100), isColor=True) elif cv2.__version__[0:6] == '2.4.11': out = cv2.VideoWriter('marked_mov.avi', -1, 30, (frame_size * 100, frame_size * 100), isColor=True) elif cv2.__version__[0:3] == '2.4': codex = 'XVID' fourcc = cv2.cv.CV_FOURCC(*codex) out = cv2.VideoWriter('marked_mov.avi', fourcc, 30, (frame_size * 100, frame_size * 100), isColor=True) else: raise EnvironmentError( 'Do not understand opencv cv2 version: {}.'.format( cv2.__version__)) f = plt.figure(figsize=(frame_size, frame_size)) for frame_i, frame in enumerate(mov_d): print('\tframe: {} / {}'.format(frame_i, mov_d.shape[0])) f.clear() ax = f.add_subplot(111) ax.imshow(frame, vmin=v_min, vmax=v_max * 0.5, cmap='gray', interpolation='nearest') pt.plot_mask_borders(total_mask, plotAxis=ax, color='#ff0000', zoom=1, borderWidth=1) ax.set_aspect('equal') # plt.show() buffer_ = io.BytesIO() pt.save_figure_without_borders(f, buffer_, dpi=100) buffer_.seek(0) image = PIL.Image.open(buffer_) curr_frame = np.asarray(image) r, g, b, a = np.rollaxis(curr_frame, axis=-1) curr_frame = (np.dstack((b, g, r))) # print(r.dtype) # print(curr_frame.shape) out.write(curr_frame) out.release() cv2.destroyAllWindows() print('\t.avi movie generated.')
def run(): isSave = True filter_sigma = 2. # 2. for soma, 1. for bouton thr_high = 0.0 thr_low = 0.1 bg_fn = "corrected_mean_projections.tif" save_folder = 'figures' curr_folder = os.path.dirname(os.path.realpath(__file__)) os.chdir(curr_folder) data_f = h5py.File('caiman_segmentation_results.hdf5', 'r') masks = data_f['masks'].value data_f.close() bg = ia.array_nor(np.max(tf.imread(bg_fn), axis=0)) final_roi_dict = {} roi_ind = 0 for i, mask in enumerate(masks): mask_dict = hl.threshold_mask_by_energy(mask, sigma=filter_sigma, thr_high=thr_high, thr_low=thr_low) for mask_roi in mask_dict.values(): final_roi_dict.update({'roi_{:04d}'.format(roi_ind): mask_roi}) roi_ind += 1 print('Total number of ROIs:', len(final_roi_dict)) f = plt.figure(figsize=(15, 8)) ax1 = f.add_subplot(121) ax1.imshow(bg, vmin=0, vmax=0.5, cmap='gray', interpolation='nearest') colors1 = pt.random_color(masks.shape[0]) for i, mask in enumerate(masks): pt.plot_mask_borders(mask, plotAxis=ax1, color=colors1[i]) ax1.set_title('original ROIs') ax1.set_axis_off() ax2 = f.add_subplot(122) ax2.imshow(ia.array_nor(bg), vmin=0, vmax=0.5, cmap='gray', interpolation='nearest') colors2 = pt.random_color(len(final_roi_dict)) i = 0 for roi in final_roi_dict.values(): pt.plot_mask_borders(roi.get_binary_mask(), plotAxis=ax2, color=colors2[i]) i = i + 1 ax2.set_title('filtered ROIs') ax2.set_axis_off() # plt.show() if isSave: if not os.path.isdir(save_folder): os.makedirs(save_folder) f.savefig(os.path.join(save_folder, 'caiman_segmentation_filtering.pdf'), dpi=300) cell_file = h5py.File('cells.hdf5', 'w') i = 0 for key, value in sorted(final_roi_dict.items()): curr_grp = cell_file.create_group('cell{:04d}'.format(i)) curr_grp.attrs['name'] = key value.to_h5_group(curr_grp) i += 1 cell_file.close()
def run(): data_file_name = 'cells_refined.hdf5' background_file_name = "corrected_mean_projections.tif" save_folder = 'figures' overlap_threshold = 0.9 surround_limit = [1, 8] curr_folder = os.path.dirname(os.path.realpath(__file__)) os.chdir(curr_folder) if not os.path.isdir(save_folder): os.makedirs(save_folder) print('reading cells file ...') data_f = h5py.File(data_file_name, 'r') cell_ns = data_f.keys() cell_ns.sort() binary_mask_array = [] weight_mask_array = [] for cell_n in cell_ns: curr_roi = ia.ROI.from_h5_group(data_f[cell_n]['roi']) binary_mask_array.append(curr_roi.get_binary_mask()) weight_mask_array.append(curr_roi.get_weighted_mask()) data_f.close() binary_mask_array = np.array(binary_mask_array) weight_mask_array = np.array(weight_mask_array) print('starting mask_array shape:', weight_mask_array.shape) print('getting total mask ...') total_mask = np.zeros((binary_mask_array.shape[1], binary_mask_array.shape[2]), dtype=np.uint8) for curr_mask in binary_mask_array: total_mask = np.logical_or(total_mask, curr_mask) total_mask = np.logical_not(total_mask) plt.imshow(total_mask, interpolation='nearest') plt.title('total_mask') # plt.show() print('getting and surround masks ...') binary_surround_array = [] for binary_center in binary_mask_array: curr_surround = np.logical_xor(ni.binary_dilation(binary_center, iterations=surround_limit[1]), ni.binary_dilation(binary_center, iterations=surround_limit[0])) curr_surround = np.logical_and(curr_surround, total_mask).astype(np.uint8) binary_surround_array.append(curr_surround) # plt.imshow(curr_surround) # plt.show() binary_surround_array = np.array(binary_surround_array) print("saving rois ...") center_areas = [] surround_areas = [] for mask_ind in range(binary_mask_array.shape[0]): center_areas.append(np.sum(binary_mask_array[mask_ind].flat)) surround_areas.append(np.sum(binary_surround_array[mask_ind].flat)) roi_f = h5py.File('rois_and_traces.hdf5') roi_f['masks_center'] = weight_mask_array roi_f['masks_surround'] = binary_surround_array roi_f.close() print('minimum surround area:', min(surround_areas), 'pixels.') f = plt.figure(figsize=(10, 10)) ax_center = f.add_subplot(211) ax_center.hist(center_areas, bins=30) ax_center.set_title('roi center area distribution') ax_surround = f.add_subplot(212) ax_surround.hist(surround_areas, bins=30) ax_surround.set_title('roi surround area distribution') # plt.show() print('plotting ...') colors = pt.random_color(weight_mask_array.shape[0]) bg = ia.array_nor(np.max(tf.imread(background_file_name), axis=0)) f_c_bg = plt.figure(figsize=(10, 10)) ax_c_bg = f_c_bg.add_subplot(111) ax_c_bg.imshow(bg, cmap='gray', vmin=0, vmax=0.5, interpolation='nearest') f_c_nbg = plt.figure(figsize=(10, 10)) ax_c_nbg = f_c_nbg.add_subplot(111) ax_c_nbg.imshow(np.zeros(bg.shape,dtype=np.uint8),vmin=0,vmax=1,cmap='gray',interpolation='nearest') f_s_nbg = plt.figure(figsize=(10, 10)) ax_s_nbg = f_s_nbg.add_subplot(111) ax_s_nbg.imshow(np.zeros(bg.shape,dtype=np.uint8),vmin=0,vmax=1,cmap='gray',interpolation='nearest') i = 0 for mask_ind in range(binary_mask_array.shape[0]): pt.plot_mask_borders(binary_mask_array[mask_ind], plotAxis=ax_c_bg, color=colors[i], borderWidth=1) pt.plot_mask_borders(binary_mask_array[mask_ind], plotAxis=ax_c_nbg, color=colors[i], borderWidth=1) pt.plot_mask_borders(binary_surround_array[mask_ind], plotAxis=ax_s_nbg, color=colors[i], borderWidth=1) i += 1 # plt.show() print('saving figures ...') pt.save_figure_without_borders(f_c_bg, os.path.join(save_folder, '2P_ROIs_with_background.png'), dpi=300) pt.save_figure_without_borders(f_c_nbg, os.path.join(save_folder, '2P_ROIs_without_background.png'), dpi=300) pt.save_figure_without_borders(f_s_nbg, os.path.join(save_folder, '2P_ROI_surrounds_background.png'), dpi=300) f.savefig(os.path.join(save_folder, 'roi_area_distribution.pdf'), dpi=300)