Skip to content

Instantly share code, notes, and snippets.

@jmxpearson
Last active February 7, 2023 09:28
Show Gist options
  • Save jmxpearson/bbe560d6c9e153c80f2808530d41b91e to your computer and use it in GitHub Desktop.
Save jmxpearson/bbe560d6c9e153c80f2808530d41b91e to your computer and use it in GitHub Desktop.
Reading Plexon data with Neo
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import neo\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"fname = 'data/DBS_patient 001.plx'"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"reader = neo.PlexonIO(fname)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/pearsonlab/projects/python-neo/neo/io/plexonio.py:190: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n",
" sigarrays[chan] = np.zeros(nb_samples[chan])\n",
"/home/pearsonlab/projects/python-neo/neo/io/plexonio.py:254: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n",
" sample_positions[chan]+data.size] = data\n"
]
}
],
"source": [
"blks = reader.read()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Get first (and only) data segment"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"seg = blks[0].segments[0]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(AnalogSignal with 1 channels of length 698324; units V; datatype float64 \n",
" annotations: {'channel_index': 0, 'channel_name': 'ContinuousChannel005'}\n",
" sampling rate: 48000.0 Hz\n",
" time: 0.0 s to 14.548416666666666 s,\n",
" AnalogSignal with 1 channels of length 7335; units V; datatype float64 \n",
" annotations: {'channel_index': 1, 'channel_name': 'Aux11Input1Channel1'}\n",
" sampling rate: 500.0 Hz\n",
" time: 0.0 s to 14.67 s,\n",
" AnalogSignal with 1 channels of length 7335; units V; datatype float64 \n",
" annotations: {'channel_index': 2, 'channel_name': 'Aux11Input2Channel2'}\n",
" sampling rate: 500.0 Hz\n",
" time: 0.0 s to 14.67 s,\n",
" Event annotations: {'channel_index': 1, 'channel_name': 'EvtContChannel005'},\n",
" Event annotations: {'channel_index': 2, 'channel_name': 'EvtAuxChannel011'},\n",
" Event annotations: {'channel_index': 3, 'channel_name': 'EvtAuxChannel000'},\n",
" Event annotations: {'channel_index': 4, 'channel_name': 'EvtStimChannel005'},\n",
" Event\n",
" annotations: {'channel_index': 257, 'channel_name': 'StrobedSerialData'},\n",
" Event annotations: {'channel_index': 258, 'channel_name': 'StartdSerialData'},\n",
" Event annotations: {'channel_index': 259, 'channel_name': 'StopdSerialData'})"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"seg.data_children"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Get first (and only) analog signal"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"sig = seg.analogsignals[0]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"AnalogSignal with 1 channels of length 698324; units V; datatype float64 \n",
"annotations: {'channel_index': 0, 'channel_name': 'ContinuousChannel005'}\n",
"sampling rate: 48000.0 Hz\n",
"time: 0.0 s to 14.548416666666666 s"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sig"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"48000.0 Hz\n"
]
}
],
"source": [
"sr = sig.sampling_rate\n",
"print(sr)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Extract data and timestamps"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"dat = sig.data\n",
"t_axis = sig.times"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f18fcf410f0>]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f18fcc6e048>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"slc = slice(0, 10000)\n",
"plt.plot(t_axis[slc], dat[slc])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Get events"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[Event annotations: {'channel_index': 1, 'channel_name': 'EvtContChannel005'},\n",
" Event annotations: {'channel_index': 2, 'channel_name': 'EvtAuxChannel011'},\n",
" Event annotations: {'channel_index': 3, 'channel_name': 'EvtAuxChannel000'},\n",
" Event annotations: {'channel_index': 4, 'channel_name': 'EvtStimChannel005'},\n",
" Event\n",
" annotations: {'channel_index': 257, 'channel_name': 'StrobedSerialData'},\n",
" Event annotations: {'channel_index': 258, 'channel_name': 'StartdSerialData'},\n",
" Event annotations: {'channel_index': 259, 'channel_name': 'StopdSerialData'}]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"seg.events"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[array([ 0. , 14.54837513], dtype=float32) * s,\n",
" array([ 0. , 14.54800034], dtype=float32) * s,\n",
" array([], dtype=float32) * s,\n",
" array([], dtype=float32) * s,\n",
" array([], dtype=float32) * s,\n",
" array([], dtype=float32) * s,\n",
" array([], dtype=float32) * s]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[e.times for e in seg.events]"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"# Prepare to save data\n",
"\n",
"The file format for input to klusta is detailed [here](https://github.com/kwikteam/klusta/blob/b06776551c5329bd547592d6d65eb56b1a9fbef1/docs/sorting.md#raw-data). Basically, we need flat bytes stored from numpy in an array of `(n_samples, n_channels)`. The number of channels, sampling rate, and data type are given in the `.prm` file described [here](https://github.com/kwikteam/klusta/blob/b06776551c5329bd547592d6d65eb56b1a9fbef1/docs/sorting.md#parameters-file)."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(698324, 1)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dat.shape # one column per channel"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"with open('data/dots_001.dat', 'wb') as output:\n",
" output.write(dat)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test file write\n",
"\n",
"Can we read back in the `.dat` file?"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"dat_check = np.fromfile('data/dots_001.dat')"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f18fce89160>]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f18fcf88a20>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(dat_check[slc])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Write clustering configuration files"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Probe definition (electrode configuration)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting fhc.prb\n"
]
}
],
"source": [
"%%file fhc.prb\n",
"\n",
"channel_groups = {\n",
" 0: {\n",
" 'channels': [0],\n",
" 'graph': []\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Parameters file"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting fhc.prm\n"
]
}
],
"source": [
"%%file fhc.prm\n",
"\n",
"experiment_name = 'dots'\n",
"prb_file = 'fhc.prb'\n",
"\n",
"traces = dict(\n",
" raw_data_files=['data/dots_001.dat', ], # path to your .dat file(s)\n",
" sample_rate=48000, # sampling rate in Hz\n",
" n_channels=1, # number of channels in the .dat files\n",
" dtype='float64', # the data type used in the .dat files\n",
")\n",
"\n",
"# Parameters for the spike detection process.\n",
"spikedetekt = dict(\n",
" threshold_strong_std_factor = 4.0,\n",
" detect_spikes = 'positive',\n",
" extract_s_before = 10,\n",
" extract_s_after = 10,\n",
")\n",
"\n",
"# Parameters for the automatic clustering process.\n",
"klustakwik2 = dict(\n",
" num_starting_clusters=10,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Klusta!"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# need to:\n",
"# source activate klusta"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"15:22:54 [I] creator:446 Using kwik file `/home/pearsonlab/projects/dots_analysis/dots.kwik`.\n",
"15:22:54 [I] launch:206 Starting spike detection.\n",
"15:22:54 [I] launch:53 SpikeDetekt parameters:\n",
"15:22:54 [I] launch:55 n_features_per_channel = 3\n",
"15:22:54 [I] launch:55 extract_s_before = 10\n",
"15:22:54 [I] launch:55 chunk_size_seconds = 1.0\n",
"15:22:54 [I] launch:55 experiment_name = dots.kwik\n",
"15:22:54 [I] launch:55 connected_component_join_size = 1\n",
"15:22:54 [I] launch:55 excerpt_size_seconds = 1.0\n",
"15:22:54 [I] launch:55 chunk_overlap_seconds = 0.015\n",
"15:22:54 [I] launch:55 pca_n_waveforms_max = 10000\n",
"15:22:54 [I] launch:55 filter_butter_order = 3\n",
"15:22:54 [I] launch:55 filter_low = 500.0\n",
"15:22:54 [I] launch:55 n_channels = 1\n",
"15:22:54 [I] launch:55 use_single_threshold = 1\n",
"15:22:54 [I] launch:55 extract_s_after = 10\n",
"15:22:54 [I] launch:55 detect_spikes = positive\n",
"15:22:54 [I] launch:55 n_excerpts = 50\n",
"15:22:54 [I] launch:55 filter_high_factor = 0.475\n",
"15:22:54 [I] launch:55 prb_file = fhc.prb\n",
"15:22:54 [I] launch:55 raw_data_files = data/dots_001.dat\n",
"15:22:54 [I] launch:55 threshold_strong_std_factor = 4.0\n",
"15:22:54 [I] launch:55 dtype = float64\n",
"15:22:54 [I] launch:55 sample_rate = 48000\n",
"15:22:54 [I] launch:55 threshold_weak_std_factor = 2.0\n",
"15:22:54 [I] launch:55 weight_power = 2\n",
"15:22:54 [I] spikedetekt:212 Found 1 live channels in group 0.\n",
"15:22:54 [I] spikedetekt:285 Finding the thresholds...\n",
"Detecting spikes : 100%|█████████████████| 15/15 [00:00<00:00, 36.46it/s]\n",
"Extracting waveforms : 100%|█████████████████| 15/15 [00:01<00:00, 7.06it/s]\n",
"Performing PCA : 100%|██████████████████| 1/1 [00:00<00:00, 908.64it/s]\n",
"Computing features : 100%|█████████████████| 15/15 [00:01<00:00, 8.81it/s]\n",
"15:22:58 [I] launch:218 Spike detection done! 775 spikes found in shank 0\n",
"15:22:58 [I] launch:249 Starting clustering on shank 0/1.\n",
"15:22:58 [I] launch:252 Clustering group 0 (775 spikes).\n",
"15:22:58 [I] launch:123 Starting KK...\n",
"15:22:58 [I] klustakwik KlustaKwik2 version 0.2.6\n",
"15:22:58 [I] klustakwik.initial_parameters penalty_k_log_n = 1.0\n",
"15:22:58 [I] klustakwik.initial_parameters full_step_every = 1\n",
"15:22:58 [I] klustakwik.initial_parameters num_changed_threshold = 0.05\n",
"15:22:58 [I] klustakwik.initial_parameters fast_split = False\n",
"15:22:58 [I] klustakwik.initial_parameters points_for_cluster_mask = 100\n",
"15:22:58 [I] klustakwik.initial_parameters max_iterations = 1000\n",
"15:22:58 [I] klustakwik.initial_parameters penalty_k = 0.0\n",
"15:22:58 [I] klustakwik.initial_parameters max_quick_step_candidates_fraction = 0.4\n",
"15:22:58 [I] klustakwik.initial_parameters mua_point = 2\n",
"15:22:58 [I] klustakwik.initial_parameters break_fraction = 0.0\n",
"15:22:58 [I] klustakwik.initial_parameters max_quick_step_candidates = 100000000\n",
"15:22:58 [I] klustakwik.initial_parameters subset_break_fraction = 0.01\n",
"15:22:58 [I] klustakwik.initial_parameters prior_point = 1\n",
"15:22:58 [I] klustakwik.initial_parameters max_possible_clusters = 1000\n",
"15:22:58 [I] klustakwik.initial_parameters num_cpus = None\n",
"15:22:58 [I] klustakwik.initial_parameters split_first = 20\n",
"15:22:58 [I] klustakwik.initial_parameters noise_point = 1\n",
"15:22:58 [I] klustakwik.initial_parameters use_mua_cluster = True\n",
"15:22:58 [I] klustakwik.initial_parameters use_noise_cluster = True\n",
"15:22:58 [I] klustakwik.initial_parameters dist_thresh = 9.21034037198\n",
"15:22:58 [I] klustakwik.initial_parameters split_every = 40\n",
"15:22:58 [I] klustakwik.initial_parameters always_split_bimodal = False\n",
"15:22:58 [I] klustakwik.initial_parameters consider_cluster_deletion = True\n",
"15:22:58 [I] klustakwik.initial_parameters max_split_iterations = None\n",
"15:22:58 [I] klustakwik.initial_parameters num_starting_clusters = 10\n",
"15:22:58 [I] klustakwik Using mask starts with 10 clusters, data has 1 unique masks\n",
"15:22:58 [W] klustakwik Not enough masks (1) for specified number of starting clusters (10)\n",
"15:22:58 [I] klustakwik Clustering data set of 775 points, 3 features\n",
"15:22:58 [I] klustakwik Starting iteration 0 with 3 clusters\n",
"15:22:58 [I] klustakwik Iteration 1F: 3 clusters, 7 changed, score=-1724.292027\n",
"15:22:58 [I] klustakwik Iteration 2F: 3 clusters, 1 changed, score=-1740.820940 (decreased by 16.528914)\n",
"15:22:58 [I] klustakwik Iteration 3F: 3 clusters, 0 changed, score=-1740.929134 (decreased by 0.108194)\n",
"15:22:58 [I] klustakwik No points changed and last step was full, so trying to split.\n",
"15:22:58 [I] klustakwik Trying to split clusters\n",
"15:22:58 [I] klustakwik No points changed, previous step was full and did not split, so finishing.\n",
"15:22:58 [I] launch:131 The automatic clustering process has finished.\n",
"15:22:58 [I] launch:268 Save the clustering to `dots.kwik`.\n",
"15:22:58 [I] model:1085 Save the Kwik file at `/home/pearsonlab/projects/dots_analysis/dots.kwik`.\n",
"15:22:58 [I] launch:290 Clustering done!\n"
]
}
],
"source": [
"!klusta fhc.prm --overwrite"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GLib-GIO-\u001b[1;32mMessage\u001b[0m: Using the 'memory' GSettings backend. Your settings will not be saved or shared with other applications.\n",
"/home/pearsonlab/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n",
" warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n",
"/home/pearsonlab/.local/lib/python3.5/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n",
" warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n"
]
}
],
"source": [
"!phy kwik-gui dots.kwik"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Read in Klusta output"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"kfname = 'dots.kwik'"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import h5py"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"spkfile = h5py.File(kfname, 'r')"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"channel = '0'\n",
"spktimes = spkfile['channel_groups'][channel]['spikes']['time_samples'].value\n",
"clusters = spkfile['channel_groups'][channel]['spikes']['clusters']['main'].value"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [Root]",
"language": "python",
"name": "Python [Root]"
},
"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"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment