Ejemplo n.º 1
0
    def UpdateColorbarPP(stuff):
        v_min = np.int(textbox_pp_min.text)
        v_max = np.int(textbox_pp_max.text)
        my_gamma = np.double(textbox_pp_g.text)

        print("\n v_min = ", v_min)
        print("v_max = ", v_max)
        print("gamma = ", my_gamma)

        pp_image.set_norm(colors.PowerNorm(gamma=my_gamma))
        pp_image.set_clim([v_min, v_max])

        cb_pp = Colorbar(ax=c_ax_pp,
                         mappable=pp_image,
                         orientation='horizontal',
                         ticklocation='top')
        cb_pp.locator = ticker.MaxNLocator(nbins=3)
        cb_pp.update_ticks()
Ejemplo n.º 2
0
def AnimateDiameterAndRawData_Big2(rawframes, static_background, rawframes_pre,
                                   sizes_df_lin, traj, ParameterJsonFile):
    from matplotlib.gridspec import GridSpec

    settings = nd.handle_data.ReadJson(ParameterJsonFile)

    fps = settings["Exp"]["fps"]

    my_gamma = settings["Animation"]["gamma"]
    microns_per_pixel = settings["Exp"]["Microns_per_pixel"]
    frames_tot = settings["Animation"]["frames_tot"]
    num_points_pdf = 100

    # Diameter plot
    histogramm_min = settings["Plot"]["Histogramm_min"]
    histogramm_max = settings["Plot"]["Histogramm_max"]

    diam_grid = np.linspace(histogramm_min, histogramm_max, 1000)
    diam_grid_inv = 1 / diam_grid

    # here comes the font sizes
    global my_font_size
    my_font_size = 16
    my_font_size_title = 22

    global prob_inv_diam_sum
    prob_inv_diam_sum = np.zeros(num_points_pdf)

    # get min and max particle id
    part_id_min = np.min(traj.particle)
    part_id_max = np.max(traj.particle)

    # get min and max diameter
    diam_max = np.round(np.max(sizes_df_lin.diameter) + 5, -1)
    diam_min = np.round(np.min(sizes_df_lin.diameter) - 5, -1)

    # get particle id of TRAJECTORIES in the roi
    #    particle_id_traj = traj[(traj.x > 800) & (traj.x < 1800)].particle.unique()
    particle_id_traj = traj.particle.unique()

    #get traj in ROI
    traj_roi = traj[np.isin(traj.particle, particle_id_traj)]

    frame = 0
    # get trajectory of particles in current frame
    traj_roi_history = GetTrajHistory(frame, traj_roi)

    # get position and diameter of evaluated particles
    pos_roi, sizes_df_lin_frame = GetPosEvaluated(frame, traj_roi,
                                                  sizes_df_lin)

    # design the subplot
    fig = plt.figure(figsize=[25, 13], constrained_layout=True)

    #    gs = GridSpec(6, 3, figure=fig, width_ratios = [0.5,0.5,0.2])
    gs = GridSpec(12,
                  5,
                  figure=fig,
                  width_ratios=[1] * 2 + [0.15] * 3,
                  height_ratios=[1 / 2] * (2 * 3) + [1] * 2 + [1.5] +
                  [0.5] * 3)

    ax_raw = fig.add_subplot(gs[0:2, 0:2], aspect="equal")  # raw image
    ax_bg = fig.add_subplot(gs[2:4, 0:2],
                            aspect="equal",
                            sharex=ax_raw,
                            sharey=ax_raw)  # background
    ax_pp = fig.add_subplot(gs[4:6, 0:2],
                            aspect="equal",
                            sharex=ax_raw,
                            sharey=ax_raw)  # post-processed image
    ax_traj = fig.add_subplot(gs[6, 0:2],
                              aspect="equal",
                              sharex=ax_raw,
                              sharey=ax_raw)  # trajectories
    ax_eval = fig.add_subplot(gs[7, 0:2],
                              aspect="equal",
                              sharex=ax_raw,
                              sharey=ax_raw)  # particles colour in diameter

    ax_hist = fig.add_subplot(gs[8, 0])  # histogram of current frame
    ax_hist_cum = fig.add_subplot(gs[8, 1], sharex=ax_hist,
                                  sharey=ax_hist)  # summed histogram

    # axis for the colorbars / legends
    c_ax_raw = plt.subplot(gs[0, 2:5])
    c_ax_bg = plt.subplot(gs[2, 2:5])
    c_ax_pp = plt.subplot(gs[4, 2:5])
    c_ax_traj = plt.subplot(gs[6, 2:5])
    c_ax_eval = plt.subplot(gs[7, 2:5])

    # axis for min, max and gamma values
    ax_raw_min = plt.subplot(gs[1, 2])
    ax_raw_max = plt.subplot(gs[1, 3])
    ax_raw_g = plt.subplot(gs[1, 4])

    ax_bg_min = plt.subplot(gs[3, 2])
    ax_bg_max = plt.subplot(gs[3, 3])
    ax_bg_g = plt.subplot(gs[3, 4])

    ax_pp_min = plt.subplot(gs[5, 2])
    ax_pp_max = plt.subplot(gs[5, 3])
    ax_pp_g = plt.subplot(gs[5, 4])

    #here come the sliders
    slider_frame_ax = plt.subplot(gs[9, 0:2])
    slider_x_min_ax = plt.subplot(gs[10, 0])
    slider_x_max_ax = plt.subplot(gs[11, 0])
    slider_y_min_ax = plt.subplot(gs[10, 1])
    slider_y_max_ax = plt.subplot(gs[11, 1])

    # plot the stuff
    import matplotlib.colors as colors
    raw_image = ax_raw.imshow(rawframes[0, :, :],
                              cmap='gray',
                              norm=colors.PowerNorm(gamma=my_gamma),
                              animated=True,
                              vmin=0,
                              vmax=np.max(rawframes))

    bg_image = ax_bg.imshow(static_background,
                            cmap='gray',
                            norm=colors.PowerNorm(gamma=my_gamma),
                            animated=True,
                            vmin=0,
                            vmax=np.max(static_background))

    pp_image = ax_pp.imshow(rawframes_pre[0, :, :],
                            cmap='gray',
                            norm=colors.PowerNorm(gamma=my_gamma),
                            animated=True,
                            vmin=np.min(rawframes_pre),
                            vmax=np.max(rawframes_pre))

    ax_scatter_traj = ax_traj.scatter(traj_roi_history.x,
                                      traj_roi_history.y,
                                      s=3,
                                      c=traj_roi_history.particle,
                                      cmap='gist_ncar',
                                      alpha=1,
                                      vmin=0,
                                      vmax=part_id_max)

    #    ax_scatter_traj = ax_traj.scatter(traj_roi_history.x, traj_roi_history.y, s = 3, c = traj_roi_history.particle, cmap = 'gist_ncar', alpha = 1, vmin=part_id_min, vmax=part_id_max)

    ax_scatter_diam = ax_eval.scatter(pos_roi.x,
                                      pos_roi.y,
                                      c=sizes_df_lin_frame.diameter,
                                      cmap='gist_ncar',
                                      vmin=diam_min,
                                      vmax=diam_max)

    # add titles and labels
    ax_raw.set_title('raw-data', fontsize=my_font_size_title)
    ax_raw.set_ylabel('y-Position [px]', fontsize=my_font_size)

    ax_bg.set_title('Background and stationary particles',
                    fontsize=my_font_size_title)
    ax_bg.set_ylabel('y-Position [px]', fontsize=my_font_size)

    ax_pp.set_title('Processed image', fontsize=my_font_size_title)
    ax_pp.set_ylabel('y-Position [px]', fontsize=my_font_size)

    ax_traj.set_title('trajectory', fontsize=my_font_size_title)
    ax_traj.set_ylabel('y-Position [px]', fontsize=my_font_size)

    ax_eval.set_title('Diameter of each particle', fontsize=my_font_size_title)
    ax_eval.set_ylabel('y-Position [px]', fontsize=my_font_size)
    ax_eval.set_xlabel('x-Position [px]', fontsize=my_font_size)

    # COLORBARS
    from matplotlib.colorbar import Colorbar

    cb_raw = Colorbar(ax=c_ax_raw,
                      mappable=raw_image,
                      orientation='horizontal',
                      ticklocation='top')
    cb_raw.set_label("Brightness", fontsize=my_font_size)

    cb_bg = Colorbar(ax=c_ax_bg,
                     mappable=bg_image,
                     orientation='horizontal',
                     ticklocation='top')
    cb_bg.set_label("Brightness", fontsize=my_font_size)

    cb_pp = Colorbar(ax=c_ax_pp,
                     mappable=pp_image,
                     orientation='horizontal',
                     ticklocation='top')
    cb_pp.set_label("Brightness", fontsize=my_font_size)

    cb_traj = Colorbar(ax=c_ax_traj,
                       mappable=ax_scatter_traj,
                       orientation='horizontal',
                       ticklocation='top')
    cb_traj.set_label("Particle ID", fontsize=my_font_size)

    cb_eval = Colorbar(ax=c_ax_eval,
                       mappable=ax_scatter_diam,
                       orientation='horizontal',
                       ticklocation='top')
    cb_eval.set_label("Diameter [nm]", fontsize=my_font_size)

    from matplotlib import ticker
    cb_raw.locator = ticker.MaxNLocator(nbins=3)
    cb_raw.update_ticks()

    cb_bg.locator = ticker.MaxNLocator(nbins=3)
    cb_bg.update_ticks()

    cb_pp.locator = ticker.MaxNLocator(nbins=3)
    cb_pp.update_ticks()

    cb_traj.locator = ticker.MaxNLocator(nbins=5)
    cb_traj.update_ticks()

    cb_eval.locator = ticker.MaxNLocator(nbins=5)
    cb_eval.update_ticks()

    # Here come the two histograms
    line_diam_frame, = ax_hist.plot(diam_grid, np.zeros_like(diam_grid))
    line_diam_sum, = ax_hist_cum.plot(diam_grid, np.zeros_like(diam_grid))

    # label and title
    ax_hist.set_xlabel('Diameter [nm]', fontsize=my_font_size)
    ax_hist.set_ylabel('Occurance', fontsize=my_font_size)
    ax_hist.set_title("Live Histogram", fontsize=my_font_size_title)

    ax_hist_cum.set_xlabel('Diameter [nm]', fontsize=my_font_size)
    ax_hist_cum.set_ylabel('Occurance', fontsize=my_font_size)
    ax_hist_cum.set_title("Cummulated Histogram", fontsize=my_font_size_title)

    # limits
    ax_hist.set_xlim([histogramm_min, histogramm_max])
    ax_hist.set_ylim([0, 1.1])
    ax_hist.set_yticks([])
    ax_hist.tick_params(direction='out')

    # Global PDF
    inv_diam, inv_diam_std = nd.CalcDiameter.InvDiameter(
        sizes_df_lin, settings)

    prob_inv_diam = np.zeros_like(diam_grid_inv)

    for index, (loop_mean, loop_std, weight) in enumerate(
            zip(inv_diam, inv_diam_std, sizes_df_lin["traj length"])):
        #loop through all evaluated partices in that roi and frame

        #calc probability density function (PDF)
        my_pdf = scipy.stats.norm(loop_mean, loop_std).pdf(diam_grid_inv)

        # normalized nad weight
        my_pdf = my_pdf / np.sum(my_pdf) * weight

        #add up all PDFs
        prob_inv_diam = prob_inv_diam + my_pdf

    #normalized to 1
    prob_inv_diam_show = prob_inv_diam / np.max(prob_inv_diam)

    line_diam_sum.set_ydata(prob_inv_diam_show)

    def animate(frame, x_min, x_max, y_min, y_max, UpdateFrame):
        global ColorbarDone
        print("\nframe", frame)
        print("x_min", x_min)
        print("x_max", x_max)
        print("y_min", y_min)
        print("y_max", y_max)
        print("Update Frame", UpdateFrame)

        # select new frame if required
        if UpdateFrame == True:
            rawframes_frame = rawframes[frame, :, :]
            rawframes_pp_frame = rawframes_pre[frame, :, :]

            raw_image.set_data(rawframes_frame)
            bg_image.set_data(static_background)
            pp_image.set_data(rawframes_pp_frame)

        # SET AXES
        ax_raw.set_xlim([x_min, x_max])
        ax_raw.set_ylim([y_min, y_max])

        ax_raw.tick_params(direction='out')

        # make the labels in um
        num_x_ticks = 5
        num_y_ticks = 3

        x_ticks_px = np.round(
            np.linspace(x_min, x_max, num_x_ticks, dtype='int'), -2)
        y_ticks_px = np.round(
            np.linspace(y_min, y_max, num_y_ticks, dtype='int'), -1)

        ax_raw.set_xticks(x_ticks_px)
        ax_raw.set_xticklabels(x_ticks_px)

        ax_raw.set_yticks(y_ticks_px)
        ax_raw.set_yticklabels(y_ticks_px)

        # get particle id of TRAJECTORIES in the roi
        particle_id_traj = traj[(traj.x > x_min)
                                & (traj.x < x_max)].particle.unique()

        #get traj in ROI
        traj_roi = traj[traj.particle.isin(particle_id_traj)]

        # get trajectory of particles in current frame
        traj_roi_history = GetTrajHistory(frame, traj_roi)

        # get position and diameter of evaluated particles
        pos_roi, sizes_df_lin_roi_frame = GetPosEvaluated(
            frame, traj_roi, sizes_df_lin)

        #update figure
        time_ms = frame * (1 / fps) * 1000
        time_ms = np.round(time_ms, 1)

        fig.suptitle('frame: ' + str(frame) + '; time: ' + str(time_ms) +
                     ' ms',
                     fontsize=my_font_size_title)

        ax_scatter_traj.set_offsets(
            np.transpose(
                np.asarray(
                    [traj_roi_history.x.values, traj_roi_history.y.values])))
        ax_scatter_traj.set_array(traj_roi_history.particle)

        ax_scatter_diam.set_offsets(
            np.transpose(np.asarray([pos_roi.x.values, pos_roi.y.values])))
        ax_scatter_diam.set_array(sizes_df_lin_roi_frame.diameter)

        ## DIAMETER PDF FROM PREVIOUS POINTS
        sizes_df_lin_roi_frame = sizes_df_lin_roi_frame.sort_index()

        # get inverse diameter which is normal distributed (proportional to the diffusion)
        inv_diam, inv_diam_std = nd.CalcDiameter.InvDiameter(
            sizes_df_lin_roi_frame, settings)

        # probability of inverse diameter
        prob_inv_diam = np.zeros_like(diam_grid_inv)

        for index, (loop_mean,
                    loop_std) in enumerate(zip(inv_diam, inv_diam_std)):
            #loop through all evaluated partices in that roi and frame

            #calc probability density function (PDF)
            my_pdf = scipy.stats.norm(loop_mean, loop_std).pdf(diam_grid_inv)

            # normalized
            my_pdf = my_pdf / np.sum(my_pdf)

            #add up all PDFs
            prob_inv_diam = prob_inv_diam + my_pdf

        #normalized to 1
        if np.max(prob_inv_diam) > 0:
            prob_inv_diam_show = prob_inv_diam / np.max(prob_inv_diam)
        else:
            prob_inv_diam_show = prob_inv_diam

        line_diam_frame.set_ydata(prob_inv_diam_show)

        #
        #
        #
        #        ## ACCUMULATED DIAMETER PDF
        #        #normalized to 1
        #        prob_inv_diam_sum_show = prob_inv_diam_sum / np.max(prob_inv_diam_sum)
        #
        #        line_diam_sum.set_ydata(prob_inv_diam_sum_show)

        print("Animation updated")

        return raw_image

    # Functions for Update the ROI and brightness
    def UpdateFrame(val):
        UpdateFrame = True
        UpdateAnimation(UpdateFrame, val)

    def UpdateROI(val):
        UpdateFrame = False
        UpdateAnimation(UpdateFrame, val)

    def UpdateAnimation(UpdateROI, val):
        frame = int(slider_frame.val)
        x_min = int(slider_x_min.val)
        x_max = int(slider_x_max.val)
        y_min = int(slider_y_min.val)
        y_max = int(slider_y_max.val)

        animate(frame, x_min, x_max, y_min, y_max, UpdateROI)
        plt.draw()

    def UpdateColorbarRawimage(stuff):
        v_min = np.int(textbox_raw_min.text)
        v_max = np.int(textbox_raw_max.text)
        my_gamma = np.double(textbox_raw_g.text)

        print("\n v_min = ", v_min)
        print("v_max = ", v_max)
        print("gamma = ", my_gamma)

        raw_image.set_norm(colors.PowerNorm(gamma=my_gamma))
        raw_image.set_clim([v_min, v_max])

        cb_raw = Colorbar(ax=c_ax_raw,
                          mappable=raw_image,
                          orientation='horizontal',
                          ticklocation='top')
        cb_raw.locator = ticker.MaxNLocator(nbins=3)
        cb_raw.update_ticks()

    def UpdateColorbarBg(stuff):
        v_min = np.int(textbox_bg_min.text)
        v_max = np.int(textbox_bg_max.text)
        my_gamma = np.double(textbox_bg_g.text)

        print("\n v_min = ", v_min)
        print("v_max = ", v_max)
        print("gamma = ", my_gamma)

        bg_image.set_norm(colors.PowerNorm(gamma=my_gamma))
        bg_image.set_clim([v_min, v_max])

        cb_bg = Colorbar(ax=c_ax_bg,
                         mappable=bg_image,
                         orientation='horizontal',
                         ticklocation='top')
        cb_bg.locator = ticker.MaxNLocator(nbins=3)
        cb_bg.update_ticks()

    def UpdateColorbarPP(stuff):
        v_min = np.int(textbox_pp_min.text)
        v_max = np.int(textbox_pp_max.text)
        my_gamma = np.double(textbox_pp_g.text)

        print("\n v_min = ", v_min)
        print("v_max = ", v_max)
        print("gamma = ", my_gamma)

        pp_image.set_norm(colors.PowerNorm(gamma=my_gamma))
        pp_image.set_clim([v_min, v_max])

        cb_pp = Colorbar(ax=c_ax_pp,
                         mappable=pp_image,
                         orientation='horizontal',
                         ticklocation='top')
        cb_pp.locator = ticker.MaxNLocator(nbins=3)
        cb_pp.update_ticks()


#    anim = animation.FuncAnimation(fig, animate, init_func=init, frames = 100, interval=100, blit=True, repeat=False)

#    anim = animation.FuncAnimation(fig, animate, frames = 1000, interval = 10, repeat = False)

    min_frame = int(traj_roi.frame.min())
    max_frame = int(traj_roi.frame.max())
    show_frames = np.linspace(min_frame, max_frame, frames_tot, dtype='int')

    Do_Save = True

    # HERE COME THE TEXTBOXES AND SLIDERS
    from matplotlib.widgets import Slider, Button, TextBox
    #raw image
    textbox_raw_min = TextBox(ax_raw_min,
                              "min: ",
                              initial=str(np.min(rawframes[0, :, :])),
                              hovercolor="y")
    textbox_raw_min.on_submit(UpdateColorbarRawimage)

    textbox_raw_max = TextBox(ax_raw_max,
                              "max: ",
                              initial=str(np.max(rawframes[0, :, :])),
                              hovercolor="y")
    textbox_raw_max.on_submit(UpdateColorbarRawimage)

    textbox_raw_g = TextBox(ax_raw_g,
                            "gamma: ",
                            initial=str(my_gamma),
                            hovercolor="y")
    textbox_raw_g.on_submit(UpdateColorbarRawimage)

    #bg
    textbox_bg_min = TextBox(ax_bg_min,
                             "min: ",
                             initial=str(np.int(np.min(static_background))),
                             hovercolor="y")
    textbox_bg_min.on_submit(UpdateColorbarBg)

    textbox_bg_max = TextBox(ax_bg_max,
                             "max: ",
                             initial=str(np.int(np.max(static_background))),
                             hovercolor="y")
    textbox_bg_max.on_submit(UpdateColorbarBg)

    textbox_bg_g = TextBox(ax_bg_g,
                           "gamma: ",
                           initial=str(my_gamma),
                           hovercolor="y")
    textbox_bg_g.on_submit(UpdateColorbarBg)

    #preproccesd (pp)
    textbox_pp_min = TextBox(ax_pp_min,
                             "min: ",
                             initial=str(np.int(np.min(
                                 rawframes_pre[0, :, :]))),
                             hovercolor="y")
    textbox_pp_min.on_submit(UpdateColorbarPP)

    textbox_pp_max = TextBox(ax_pp_max,
                             "max: ",
                             initial=str(np.int(np.max(
                                 rawframes_pre[0, :, :]))),
                             hovercolor="y")
    textbox_pp_max.on_submit(UpdateColorbarPP)

    textbox_pp_g = TextBox(ax_pp_g,
                           "gamma: ",
                           initial=str(my_gamma),
                           hovercolor="y")
    textbox_pp_g.on_submit(UpdateColorbarPP)

    # sliders
    frame_max = rawframes.shape[0] - 1
    x_max_max = rawframes.shape[2] - 1
    y_max_max = rawframes.shape[1] - 1

    slider_frame = Slider(slider_frame_ax,
                          "Frame: ",
                          valmin=0,
                          valmax=frame_max,
                          valinit=0,
                          valstep=1)
    slider_x_min = Slider(slider_x_min_ax,
                          "x_min: ",
                          valmin=0,
                          valmax=x_max_max,
                          valinit=0,
                          valstep=1)
    slider_x_max = Slider(slider_x_max_ax,
                          "x_max: ",
                          valmin=0,
                          valmax=x_max_max,
                          valinit=x_max_max,
                          valstep=1,
                          slidermin=slider_x_min)
    slider_y_min = Slider(slider_y_min_ax,
                          "y_min: ",
                          valmin=0,
                          valmax=y_max_max,
                          valinit=0,
                          valstep=1)
    slider_y_max = Slider(slider_y_max_ax,
                          "y_max: ",
                          valmin=0,
                          valmax=y_max_max,
                          valinit=y_max_max,
                          valstep=1,
                          slidermin=slider_y_min)

    slider_frame.on_changed(UpdateFrame)
    slider_x_min.on_changed(UpdateROI)
    slider_x_max.on_changed(UpdateROI)
    slider_y_min.on_changed(UpdateROI)
    slider_y_max.on_changed(UpdateROI)

    plt.show()

    #    if Do_Save == True:
    #        anim = animation.FuncAnimation(fig, animate, frames = show_frames, init_func=init, interval = 0, repeat = False)
    #        anim.save('200204_2.html', writer = 'html', fps=1)
    #
    #    else:
    #        anim = animation.FuncAnimation(fig, animate, frames = show_frames, init_func=init, interval = 5, repeat = True)

    #    return anim

    return