Source code for cell_analysis_tools.flim.estimate_and_shift_irf

# Dependencies
import matplotlib.pylab as plt
import numpy as np
import pandas as pd
import pylab
import tifffile
from scipy.signal import convolve

from cell_analysis_tools.image_processing import normalize
from cell_analysis_tools.io import read_asc


# SHIFT IRF
[docs] def estimate_and_shift_irf(decay, irf_decay, debug=False): """ Estimates shift given a decay and an IRF. Parameters ----------- decay : ndarray 1D array containing decay curve irf_decay : ndarray 1D array containing IRF debug : bool Optional flag to display intermediate calculations Returns ------- irf_decay_shifted : ndarray Shifted IRF as a 1d array shift : int value IRF was shifted by Note ---- IRF and decay should NOT have low SNR or gradient function will produce incorrect alignment .. image:: ./resources/flim_estimate_and_shift_irf.png :width: 800 :alt: Image of the estimated placement of IRF for a decay """ # TODO: smooth signals # TODO: center IRF on middle of rising decay gradient or a little before # peak should be near the middle of decay rise or closer to the left side # account for offset of decay vertically num_timebins = len(decay) # SDT DECAY decay_grad = np.gradient(decay) decay_rising = decay_grad.copy() decay_rising[decay_grad < 0] = 0 # take all positive gradient if debug: plt.title("Decay Gradient") plt.plot(decay) plt.plot(decay_grad) plt.plot(decay_rising) plt.legend(["decay", "gradient", "positive gradient"]) plt.show() # IRF --> Extract peak of rising irf_decay_grad = np.gradient(irf_decay) irf_rising = irf_decay_grad.copy() irf_rising[irf_rising < 0] = 0 if debug: plt.title("IRF Gradient") plt.plot(irf_decay) plt.plot(irf_decay_grad) plt.plot(irf_rising) plt.legend(["decay", "gradient", "positive gradient"]) plt.show() # compute shift correlated = np.correlate(decay_rising, irf_rising, mode="full") peak_correlated = np.argmax(correlated) shift = peak_correlated - len( decay_rising ) # because length is (len_d1 + len_d2 - 1) irf_decay_shifted = np.roll(irf_decay, shift) # if debug: #visualize shifted correlation # plt.plot(normalize(decay_rising)) # plt.plot(normalize(irf_rising)) # plt.plot(normalize(correlated)) # plt.plot(np.roll(normalize(correlated), -np.argmax(correlated) )) # plt.legend(["decay rising gradient","irf rising gradient","correlated signal"]) # plt.show() if debug: # visualize plt.title(f"Shift estimation \n{shift} ps") plt.xlabel("Time(ps)") plt.ylabel("Counts") plt.plot(normalize(decay)) plt.plot(normalize(irf_decay)) plt.plot(normalize(irf_decay_shifted)) plt.legend(["decay", "irf", "shifted irf"]) plt.show() return irf_decay_shifted, shift
if __name__ == "__main__": pass from cell_analysis_tools.io import load_sdt_file # load irf irf_decay = np.loadtxt("irf.csv") plt.plot(irf_decay[:,0],irf_decay[:,1]) # load image sdt = load_sdt_file("./resources/test_image.sdt") im_nadh = sdt[1,...] # plt.imshow(im_nadh.sum(axis=2)) # plt.show() decay = im_nadh.sum(axis=(0,1)) decay = np.roll(decay,10) # plt.plot(decay) # plt.show() # visualize and plot IRF irf_decay_shifted, shift = estimate_and_shift_irf(decay, irf_decay[:,1], debug=True)