Exemple #1
0
    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()
Exemple #2
0
    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
Exemple #4
0
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,
Exemple #7
0
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.')
Exemple #9
0
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)