This notebook is part of a tutorial series for the FRETBursts burst analysis software.
For a step-by-step introduction to FRETBursts usage please refer to [us-ALEX smFRET burst analysis](FRETBursts - us-ALEX smFRET burst analysis.ipynb).
In this notebook we present a typical FRETBursts workflow for ns-ALEX smFRET burst analysis.
While FRETBursts does not specifically includes functions for fitting TCSPC fluorescence decays, a fitting with exponential decays and IRF deconvolution can be easily performed using standard python libraries. For an example and a brief discussion see the notebook Lifetime decay fit.
from fretbursts import *
- Optimized (cython) burst search loaded. - Optimized (cython) photon counting loaded. -------------------------------------------------------------- You are running FRETBursts (version 0.7+46.ge31fadb.dirty). If you use this software please cite the following paper: FRETBursts: An Open Source Toolkit for Analysis of Freely-Diffusing Single-Molecule FRET Ingargiola et al. (2016). http://dx.doi.org/10.1371/journal.pone.0160716 --------------------------------------------------------------
sns = init_notebook()
The full list of smFRET measurements used in the FRETBursts tutorials can be found on Figshare.
Here we download the ns-ALEX data-file and put it in a folder
named data
, inside the notebook folder.
For this purpose we use the download_file
function provided
by FRETBursts:
url = 'http://files.figshare.com/2182602/dsdna_d7_d17_50_50_1.hdf5'
download_file(url, save_dir='./data')
URL: http://files.figshare.com/2182602/dsdna_d7_d17_50_50_1.hdf5 File: dsdna_d7_d17_50_50_1.hdf5 File already on disk: /home/paul/Disk/Python/OpenSMFS/FRETBursts_notebooks/notebooks/data/dsdna_d7_d17_50_50_1.hdf5 Delete it to re-download.
filename = './data/dsdna_d7_d17_50_50_1.hdf5'
filename
'./data/dsdna_d7_d17_50_50_1.hdf5'
Alternatively you can use an open-file dialog in order to select a data file:
# filename = OpenFileDialog()
# filename
import os
if os.path.isfile(filename):
print("Perfect, I found the file!")
else:
print("Sorry, I can't find the file:\n%s" % filename)
Perfect, I found the file!
Here we load the file and we set the alternation parameters:
d = loader.photon_hdf5(filename)
#d = loader.nsalex(fname)
d.time_max
2268.2743759426116
d.det_t
[array([6, 6, 4, ..., 6, 6, 6], dtype=uint8)]
print("Detector Counts")
print("-------- --------")
for det, count in zip(*np.unique(d.det_t, return_counts=True)):
print("%8d %8d" % (det, count))
Detector Counts -------- -------- 0 1 1 1 4 3345380 6 6371466
#d.add(A_ON=(200, 1500), D_ON=(1750, 3200), det_donor_accept=(4, 6))
d.nanotimes_t
[array([ 372, 579, 1926, ..., 2553, 1182, 316], dtype=uint16)]
bpl.plot_alternation_hist(d)
Execute the previous 2 cells until you get a satisfying selection for the excitation periods. Then run the following to apply the parameters:
loader.alex_apply_period(d)
# Total photons (after ALEX selection): 8,862,749 # D photons in D+A excitation periods: 2,866,446 # A photons in D+A excitation periods: 5,996,303 # D+A photons in D excitation period: 4,093,146 # D+A photons in A excitation period: 4,769,603
d.calc_bg(fun=bg.exp_fit, time_s=30, tail_min_us='auto', F_bg=1.7)
- Calculating BG rates ... Channel 0 [DONE]
dplot(d, timetrace_bg)
<AxesSubplot:title={'center':'data_dsdna_d7_d17_50_50_1'}, xlabel='Time (s)', ylabel='BG rate (kcps)'>
dplot(d, timetrace)
xlim(1, 2)
ylim(-50, 50)
(-50.0, 50.0)
d.burst_search()
- Performing burst search (verbose=False) ...[DONE] - Calculating burst periods ...[DONE] - Counting D and A ph and calculating FRET ... - Applying background correction. [DONE Counting D/A]
ds = d.select_bursts(select_bursts.size, th1=30)
alex_jointplot(ds);
<class 'matplotlib.figure.Figure'>
ds.leakage = 0.05
- Applying background correction. - Applying leakage correction.
alex_jointplot(ds);
<class 'matplotlib.figure.Figure'>
dplot(ds, hist_fret, show_kde=True)
<AxesSubplot:title={'center':'data_dsdna_d7_d17_50_50_1, T=753μs, #bu=3912'}, xlabel='E', ylabel='PDF'>
The nanotimes for the measurement is saved in the .nanotimes
attribute of the Data()
object (here either d
or ds
).
As an example here we get the array of nanotimes for all photons, donor emission and acceptor emission:
d.nanotimes
[array([ 372, 579, 1926, ..., 2553, 1182, 316], dtype=uint16)]
nanotimes = d.nanotimes[0]
nanotimes_d = nanotimes[d.get_D_em()]
nanotimes_a = nanotimes[d.get_A_em()]
We can plot the histogram for this 3 nanotimes:
hist_params = dict(bins=range(4096), histtype='step', alpha=0.6, lw=1.5)
hist(nanotimes, color='k', label='Total ph.', **hist_params)
hist(nanotimes_d, color='g', label='D. em. ph.', **hist_params)
hist(nanotimes_a, color='r', label='A. em. ph.', **hist_params)
plt.legend()
plt.yscale('log')
We can also select only nanotimes of photons inside bursts.
Here, as an example, we will use the ds
variable that
contains a selection of bursts.
First we compute a selection mask (a boolean array) for photons inside bursts:
ph_in_bursts_mask = d.ph_in_bursts_mask_ich()
Then we apply this selection to the nanotimes array.
To get the donor- and acceptor-emission nanotimes we combine
the in-bursts selection mask (ph_in_bursts_mask
) with
the donor or acceptor emission mask (that we get with
.get_D_em()
and .get_D_em()
):
bursts_nanotimes_t = nanotimes[ph_in_bursts_mask]
bursts_nanotimes_d = nanotimes[ph_in_bursts_mask * d.get_D_em()]
bursts_nanotimes_a = nanotimes[ph_in_bursts_mask * d.get_A_em()]
And, as before, we can histogram the nanotimes:
hist_params = dict(bins=range(4096), histtype='step', alpha=0.6, lw=1.5)
hist(bursts_nanotimes_t, color='k', label='Total ph.', **hist_params)
hist(bursts_nanotimes_d, color='g', label='D. em. ph.', **hist_params)
hist(bursts_nanotimes_a, color='r', label='A. em. ph.', **hist_params)
plt.legend()
plt.yscale('log')
Saving some of all these arrays to file is straightforward.
nanotimes.tofile('nanotimes_t.csv', sep=',\n') # save in CSV txt format
To save a set of arrays in MATLAB format we can use the
scipy.io.savemat
function.
Here we save 3 arrays bursts_nanotimes_t
, bursts_nanotimes_d
and bursts_nanotimes_a
to a file called bursts_nanotimes.mat:
from scipy.io import savemat
savemat('bursts_nanotimes.mat',
dict(bn_t=bursts_nanotimes_t,
bn_d=bursts_nanotimes_d,
bn_a=bursts_nanotimes_a,))
When loaded in MATLAB the arrays will be named bn_t
, bn_d
and bn_a
.