{ "cells": [ { "cell_type": "markdown", "metadata": { "input_collapsed": false }, "source": [ "# Exporting Burst Data\n", "\n", "*This notebook is part of a [tutorial series](https://github.com/tritemio/FRETBursts_notebooks) for the [FRETBursts](http://tritemio.github.io/FRETBursts/) burst analysis software.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> In this notebook, show a few example of how to export [FRETBursts](http://tritemio.github.io/FRETBursts/) \n", "> burst data to a file.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Please cite FRETBursts in publications or presentations!\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Loading the software" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We start by loading **`FRETBursts`**:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " - Optimized (cython) burst search loaded.\n", " - Optimized (cython) photon counting loaded.\n", "--------------------------------------------------------------\n", " You are running FRETBursts (version 0.6.4).\n", "\n", " If you use this software please cite the following paper:\n", "\n", " FRETBursts: An Open Source Toolkit for Analysis of Freely-Diffusing Single-Molecule FRET\n", " Ingargiola et al. (2016). http://dx.doi.org/10.1371/journal.pone.0160716 \n", "\n", "--------------------------------------------------------------\n" ] } ], "source": [ "from fretbursts import *" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "sns = init_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Downloading the data file" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The full list of smFRET measurements used in the [FRETBursts tutorials](https://github.com/tritemio/FRETBursts_notebooks) \n", "can be found on [Figshare](http://dx.doi.org/10.6084/m9.figshare.1456362).\n", "\n", "This is the file we will download:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "url = 'http://files.figshare.com/2182601/0023uLRpitc_NTP_20dT_0.5GndCl.hdf5'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "You can change the url variable above to download your own data file.\n", "This is useful if you are executing FRETBursts online and you want to use\n", "your own data file. See \n", "First Steps.\n", "
\n", "\n", "Here, we download the data file and put it in a folder named `data`, \n", "inside the notebook folder:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "URL: http://files.figshare.com/2182601/0023uLRpitc_NTP_20dT_0.5GndCl.hdf5\n", "File: 0023uLRpitc_NTP_20dT_0.5GndCl.hdf5\n", " \n", "File already on disk: /Users/anto/src/FRETBursts/notebooks/data/0023uLRpitc_NTP_20dT_0.5GndCl.hdf5 \n", "Delete it to re-download.\n" ] } ], "source": [ "download_file(url, save_dir='./data')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **NOTE**: If you modified the `url` variable providing an invalid URL\n", "> the previous command will fail. In this case, edit the cell containing \n", "> the `url` and re-try the download." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Loading the data file" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we can directly define the file name to be loaded:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'./data/0023uLRpitc_NTP_20dT_0.5GndCl.hdf5'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "filename = \"./data/0023uLRpitc_NTP_20dT_0.5GndCl.hdf5\"\n", "filename" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check that the file exists:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Perfect, file found!\n" ] } ], "source": [ "import os\n", "if os.path.isfile(filename):\n", " print(\"Perfect, file found!\")\n", "else:\n", " print(\"Sorry, file:\\n%s not found\" % filename)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "d = loader.photon_hdf5(filename)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# μs-ALEX parameters\n", "\n", "At this point, timestamps and detectors numbers are contained in the `ph_times_t` and `det_t` attributes of `d`. Let's print them:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([array([ 146847, 188045, 294124, ..., 47999863658,\n", " 47999877783, 47999955353])],\n", " [array([0, 1, 1, ..., 1, 1, 0], dtype=uint32)])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.ph_times_t, d.det_t" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to define some ALEX parameters: " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "d.add(det_donor_accept = (0, 1), \n", " alex_period = 4000,\n", " offset = 700,\n", " D_ON = (2180, 3900), \n", " A_ON = (200, 1800))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here the parameters are:\n", "\n", "- `det_donor_accept`: donor and acceptor channels\n", "- `alex_period`: length of excitation period (in timestamps units)\n", "- `D_ON` and `A_ON`: donor and acceptor excitation windows\n", "- `offset`: the offset between the start of alternation and start of timestamping \n", " (see also [Definition of alternation periods](http://photon-hdf5.readthedocs.org/en/latest/phdata.html#definition-of-alternation-periods)).\n", "\n", "To check that the above parameters are correct, we need to plot the histogram of timestamps (modulo the alternation period) and superimpose the two excitation period definitions to it:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n7MGDBw+wbt06rFu3zjB91KhRiIqKQkxMDKKjo+Hn5welUlnqw79arUZoaCh0Oh2Cg4MNH/6rQi6X\nIz4+HkuWLIGPjw8aNWqE0NBQjBo1qsLtlGxkyMzMhLu7u6GRoTokQllDeOsZc/tXAaAo6j1ILSSQ\nLNta5WUFnRbC7V85xuQ5JxTqIHFsD4ll1QeiFj8rZ1efxCotpy0qwC9/3YSltGGdWwDHmJSk0+vw\nctNXIC9j8GtmZCAkAOzXHjRr/VUZY8I7vz5x7tw5TJo0yeiDOtUcPsSPiIgqRaxBgZ4vfIgfERER\niQaDCRERURU8Pd6SahaDCREREYkGgwkRERGJBoMJERERiQaDCREREYkGgwkRERGJBoMJERERiQaD\nCREREYkGgwkRERGJBoMJERERiQaDCREREYkGgwkRERGJBoMJERERiQaDCREREYkGgwkRERGJBoMJ\nERERiQaDCREREYkGgwkRERGJBoMJERERiQaDCREREYkGgwkRERGJBoMJERERiQaDCREREYkGgwkR\nERGJBoMJERERiQaDCREREYkGgwkRERGJBoMJERERiQaDCREREYkGgwkRERGJBoMJERERiQaDCRER\nEYkGgwkRERGJBoMJERERiQaDCREREYkGgwkRERGJBoMJERERiQaDCREREYlGtYPJpk2b0KVLF7i6\nuhp+UlNTkZOTg8jISLi5uaF3795ISEgwLCMIAmJjY+Hl5QUPDw8sWrQIRUVFhvKkpCQEBATAxcUF\n4eHhUKvV1a0mERER1QPVDibXrl1DVFQULl26ZPhxd3fH3LlzoVQqcfr0aaxatQrLli3D5cuXAQDb\nt2/HiRMnsH//fhw8eBAXL17E5s2bAQA3btxAdHQ04uLicPbsWdjb22P27NnVrSYRERHVA9UOJtev\nX0enTp2MpuXm5uLo0aOYNGkSrKys0LVrVwQFBWHfvn0AgMTERIwePRotWrSAg4MDwsPDsXfvXgDA\ngQMHEBAQgG7dukGhUGDatGk4efIkW02IiIgagGoFE41GA5VKhS1btqBnz54YMGAA9uzZg9u3b0Mm\nk6Ft27aGeZ2cnJCWlgYASEtLQ/v27Y3KVCoVBEEoVWZnZwcbGxuoVKrqVJWIiIjqAVl1Flar1XBz\nc8Pf/vY3rFq1CleuXEFERATGjh0LhUJhNK9CoUB+fj6AJ4GmZLm1tTX0ej20Wm2psuJyjUZTbl3s\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "bpl.plot_alternation_hist(d)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If the previous alternation histogram looks correct, \n", "the corresponding definitions of the excitation periods can be applied to the data using the following command:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# Total photons (after ALEX selection): 2,259,522\n", "# D photons in D+A excitation periods: 721,537\n", "# A photons in D+A excitation periods: 1,537,985\n", "# D+A photons in D excitation period: 1,434,842\n", "# D+A photons in A excitation period: 824,680\n", "\n" ] } ], "source": [ "loader.alex_apply_period(d)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If the previous histogram does not look right, the parameters in the `d.add(...)` cell can be modified and checked by running the histogram plot cell until everything looks fine. Don't forget to apply the \n", "parameters with `loader.usalex_apply_period(d)` as a last step.\n", "\n", "> **NOTE:** After applying the ALEX parameters a new array of \n", "> timestamps containing only photons inside the excitation periods \n", "> is created (name `d.ph_times_m`). To save memory, by default, \n", "> the old timestamps array (`d.ph_times_t`) is deleted. Therefore, \n", "> in the following, when we talk about all-photon selection we always \n", "> refer to all photons inside both excitation periods." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Background and burst search" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " - Calculating BG rates ... " ] }, { "name": "stdout", "output_type": "stream", "text": [ "[DONE]\n" ] } ], "source": [ "d.calc_bg(bg.exp_fit, time_s=30, tail_min_us='auto', F_bg=1.7)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " - Performing burst search (verbose=False) ..." ] }, { "name": "stdout", "output_type": "stream", "text": [ "[DONE]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " - Calculating burst periods ..." ] }, { "name": "stdout", "output_type": "stream", "text": [ "[DONE]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " - Counting D and A ph and calculating FRET ... \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " - Applying background correction.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " [DONE Counting D/A]\n" ] } ], "source": [ "d.burst_search(L=10, m=10, F=6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we filter the bursts to avoid creating big files:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "ds = d.select_bursts(select_bursts.size, th1=60)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exporting Burst Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By burst-data we mean all the scalar burst parameters, e.g. size, duration, background, etc...\n", "\n", "We can easily get a table (a pandas DataFrame) with all the burst data as follows:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ESbg_aabg_adbg_dabg_ddbg_periodi_starti_stopnanaandndantsize_rawt_startt_stopwidth_msspot
00.3242230.5710041.7380862.9939760.2497761.79580605276542226.00602460.26191454.204194-0.249776140.4721311471.7324561.7355303.0740120
10.4208860.6484801.6309402.8094100.2343781.68510305961617356.19059072.36906077.3148970.765622205.8745472131.7929931.7958782.8845130
20.4518000.4670381.5786112.7192700.2268581.63103606757698647.280730119.42138957.368964-0.226858224.0710832302.0235452.0263372.7919620
30.1664620.9845951.3365862.3023650.1920771.3809730104031051517.6976351.66341488.619027-0.192077107.9800761133.1138803.1162442.3639130
40.1377020.9984091.8871503.2507500.2711971.949821010548106259.7492500.11285061.050179-0.27119770.912280783.1297073.1330443.3376500
\n", "
" ], "text/plain": [ " E S bg_aa bg_ad bg_da bg_dd bg_period \\\n", "0 0.324223 0.571004 1.738086 2.993976 0.249776 1.795806 0 \n", "1 0.420886 0.648480 1.630940 2.809410 0.234378 1.685103 0 \n", "2 0.451800 0.467038 1.578611 2.719270 0.226858 1.631036 0 \n", "3 0.166462 0.984595 1.336586 2.302365 0.192077 1.380973 0 \n", "4 0.137702 0.998409 1.887150 3.250750 0.271197 1.949821 0 \n", "\n", " i_start i_stop na naa nd nda nt \\\n", "0 5276 5422 26.006024 60.261914 54.204194 -0.249776 140.472131 \n", "1 5961 6173 56.190590 72.369060 77.314897 0.765622 205.874547 \n", "2 6757 6986 47.280730 119.421389 57.368964 -0.226858 224.071083 \n", "3 10403 10515 17.697635 1.663414 88.619027 -0.192077 107.980076 \n", "4 10548 10625 9.749250 0.112850 61.050179 -0.271197 70.912280 \n", "\n", " size_raw t_start t_stop width_ms spot \n", "0 147 1.732456 1.735530 3.074012 0 \n", "1 213 1.792993 1.795878 2.884513 0 \n", "2 230 2.023545 2.026337 2.791962 0 \n", "3 113 3.113880 3.116244 2.363913 0 \n", "4 78 3.129707 3.133044 3.337650 0 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bursts = bext.burst_data(ds, include_bg=True, include_ph_index=True)\n", "bursts.head(5) # display first 5 bursts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once we have the DataFrame, saving it to disk in CSV format is trivial:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "bursts.to_csv('%s_burst_data.csv' % filename.replace('.hdf5', ''))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exporting Bursts Timestamps\n", "\n", "Exporting timestamps and other photon-data for each bursts is a little trickier\n", "because the data is less uniform (i.e. each burst has a different number of photons).\n", "In the following example, we will save a `csv` file with variable-length columns.\n", "Each burst is represented by to lines: one line for timestamps and one line for the\n", "photon-stream (excitation/emission period) the timestamps belongs to.\n", "\n", "Let's start by creating an array of photon streams containing\n", "one of the values 0, 1, 2 or 3 for each timestamp.\n", "These values will correspond to the DexDem, DexAem, AexDem, AemAem\n", "photon streams respectively." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array([False, True, True, ..., False, True, False], dtype=bool)]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds.A_ex" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "#{0: DexDem, 1:DexAem, 2: AexDem, 3: AemAem}" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 3, 3, ..., 1, 3, 0], dtype=int8)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(ds.A_ex[0].view('int8') << 1) + ds.A_em[0].view('int8')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we define an header documenting the file format. Ww will also include the \n", "filename of the measurement. \n", "\n", "This is just an example including nanotimes:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# BPH2CSV: ./data/0023uLRpitc_NTP_20dT_0.5GndCl.hdf5\n", "# Lines per burst: 3\n", "# - timestamps (int64): in 12.5 ns units\n", "# - nanotimes (int16): in raw TCSPC unit (3.3ps)\n", "# - stream (uint8): the photon stream according to the mapping {0: DexDem, 1: DexAem, 2: AexDem, 3: AemAem}\n", "\n" ] } ], "source": [ "header = \"\"\"\\\n", "# BPH2CSV: %s\n", "# Lines per burst: 3\n", "# - timestamps (int64): in 12.5 ns units\n", "# - nanotimes (int16): in raw TCSPC unit (3.3ps)\n", "# - stream (uint8): the photon stream according to the mapping {0: DexDem, 1: DexAem, 2: AexDem, 3: AemAem}\n", "\"\"\" % filename\n", "print(header)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And this is header we are going to use:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# BPH2CSV: ./data/0023uLRpitc_NTP_20dT_0.5GndCl.hdf5\n", "# Lines per burst: 2\n", "# - timestamps (int64): in 12.5 ns units\n", "# - stream (uint8): the photon stream according to the mapping {0: DexDem, 1: DexAem, 2: AexDem, 3: AemAem}\n", "\n" ] } ], "source": [ "header = \"\"\"\\\n", "# BPH2CSV: %s\n", "# Lines per burst: 2\n", "# - timestamps (int64): in 12.5 ns units\n", "# - stream (uint8): the photon stream according to the mapping {0: DexDem, 1: DexAem, 2: AexDem, 3: AemAem}\n", "\"\"\" % filename\n", "print(header)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now save the data to disk:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "out_fname = '%s_burst_timestamps.csv' % filename.replace('.hdf5', '')\n", "dx = ds\n", "ich = 0\n", "\n", "bursts = dx.mburst[ich]\n", "timestamps = dx.ph_times_m[ich]\n", "stream = (dx.A_ex[ich].view('int8') << 1) + dx.A_em[ich].view('int8')\n", "with open(out_fname, 'wt') as f:\n", " f.write(header)\n", " for times, period in zip(bl.iter_bursts_ph(timestamps, bursts),\n", " bl.iter_bursts_ph(stream, bursts)):\n", " times.tofile(f, sep=',')\n", " f.write('\\n')\n", " period.tofile(f, sep=',')\n", " f.write('\\n')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Done!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Read the file back\n", "\n", "For consistency check, we can read back the data we just saved.\n", "As an exercise we will put the results in a pandas DataFrame\n", "which is more convenient than an array for holding this data." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We start reading the header and computing \n", "some file-specific constants. " ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# BPH2CSV: ./data/0023uLRpitc_NTP_20dT_0.5GndCl.hdf5\n", "# Lines per burst: 2\n", "# - timestamps (int64): in 12.5 ns units\n", "# - stream (uint8): the photon stream according to the mapping {0: DexDem, 1: DexAem, 2: AexDem, 3: AemAem}\n", "\n" ] } ], "source": [ "with open(out_fname) as f:\n", " lines = []\n", " lines.append(f.readline())\n", " while lines[-1].startswith('#'):\n", " lines.append(f.readline())\n", " header = ''.join(lines[:-1])\n", "print(header)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(4, 2)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stream_map = {0: 'DexDem', 1: 'DexAem', 2: 'AexDem', 3: 'AemAem'}\n", "nrows = int(header.split('\\n')[1].split(':')[1].strip())\n", "header_len = len(header.split('\\n')) - 1\n", "header_len, nrows" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As a test, we load the data for the first burst into a dataframe, converting the numerical column \"streams\"\n", "into photon-stream names (strings). The new column is of type categorical, so it will take very little space:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timestampstream
0138596500AemAem
1138622303DexDem
2138626950DexDem
3138641792AemAem
4138643022DexDem
.........
142138788833AemAem
143138790337DexDem
144138790703DexAem
145138790873DexAem
146138842421DexDem
\n", "

147 rows × 2 columns

\n", "
" ], "text/plain": [ " timestamp stream\n", "0 138596500 AemAem\n", "1 138622303 DexDem\n", "2 138626950 DexDem\n", "3 138641792 AemAem\n", "4 138643022 DexDem\n", ".. ... ...\n", "142 138788833 AemAem\n", "143 138790337 DexDem\n", "144 138790703 DexAem\n", "145 138790873 DexAem\n", "146 138842421 DexDem\n", "\n", "[147 rows x 2 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "burstph = (pd.read_csv(out_fname, skiprows=header_len, nrows=nrows, header=None).T\n", " .rename(columns={0: 'timestamp', 1: 'stream'}))\n", "burstph.stream = (burstph.stream\n", " .apply(lambda x: stream_map[pd.to_numeric(x)])\n", " .astype('category', categories=['DexDem', 'DexAem', 'AexDem', 'AemAem'], ordered=True))\n", "burstph" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For reading the whole file I use a different approach. First, I load the entire file \n", "in two lists of lists (one for timestamps and one for the stream). Next, I create\n", "a single DataFrame with a third column indicating the burst index." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timestampstreamiburst
0138596500AemAem0
1138622303DexDem0
2138626950DexDem0
3138641792AemAem0
4138643022DexDem0
............
23232747909435404DexAem987
23232847909438825DexAem987
23232947909451409DexDem987
23233047909458878DexAem987
23233147909462189DexDem987
\n", "

232332 rows × 3 columns

\n", "
" ], "text/plain": [ " timestamp stream iburst\n", "0 138596500 AemAem 0\n", "1 138622303 DexDem 0\n", "2 138626950 DexDem 0\n", "3 138641792 AemAem 0\n", "4 138643022 DexDem 0\n", "... ... ... ...\n", "232327 47909435404 DexAem 987\n", "232328 47909438825 DexAem 987\n", "232329 47909451409 DexDem 987\n", "232330 47909458878 DexAem 987\n", "232331 47909462189 DexDem 987\n", "\n", "[232332 rows x 3 columns]" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import csv\n", "from builtins import int # python 2 workaround, can be removed on python 3\n", "\n", "# Read data in two list of lists\n", "t_list, s_list = [], []\n", "with open(out_fname) as f:\n", " for i in range(header_len):\n", " f.readline()\n", " csvreader = csv.reader(f) \n", " for row in csvreader:\n", " t_list.append([int(v) for v in row])\n", " s_list.append([int(v) for v in next(csvreader)])\n", "\n", "# Turn the inner list into pandas.DataFrame\n", "d_list = []\n", "for ib, (t, s) in enumerate(zip(t_list, s_list)):\n", " d_list.append(\n", " pd.DataFrame({'timestamp': t, 'stream': s}, columns=['timestamp', 'stream'])\n", " .assign(iburst=ib)\n", " )\n", "\n", "# Concatenate dataframes\n", "burstph = pd.concat(d_list, ignore_index=True)\n", "\n", "# Convert stream column into categorical\n", "burstph.stream = (burstph.stream\n", " .apply(lambda x: stream_map[pd.to_numeric(x)])\n", " .astype('category', categories=['DexDem', 'DexAem', 'AexDem', 'AemAem'], ordered=True))\n", "burstph" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "timestamp int64\n", "stream category\n", "iburst int64\n", "dtype: object" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "burstph.dtypes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This was just an example. There are certainly more efficient ways \n", "to read the file into a DataFrame. Please feel free to contribute\n", "new methods to illustrate a different (more efficient or simpler)\n", "approach." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "**Executed:** Tue Jul 11 21:52:34 2017\n", "\n", "**Duration:** 9 seconds.\n", "\n", "**Autogenerated from:** [Example - Exporting Burst Data Including Timestamps.ipynb](out/Example - Exporting Burst Data Including Timestamps.ipynb)" ] } ], "metadata": { "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" }, "nav_menu": {}, "toc": { "colors": { "hover_highlight": "#DAA520", "running_highlight": "#FF0000", "selected_highlight": "#FFD700" }, "moveMenuLeft": true, "nav_menu": { "height": "174px", "width": "252px" }, "navigate_menu": true, "number_sections": false, "sideBar": true, "threshold": 4, "toc_cell": false, "toc_section_display": "block", "toc_window_display": true, "widenNotebook": false } }, "nbformat": 4, "nbformat_minor": 1 }