{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Aligning behavioral data to task events with the stimulus and trials tables\n",
"This notebook outlines the stimulus presentations table and the trials table and shows how you can use them to align behavioral data like running, licking and pupil info to task events. Please note that the VBN project used the same detection of change task as the Visual Behavior 2-Photon dataset. Users are encouraged to explore the [documentation](http://portal.brain-map.org/explore/circuits/visual-coding-2p) and [example notebooks](https://allensdk.readthedocs.io/en/latest/brain_observatory.html) for that project for additional context.\n",
"\n",
"Contents\n",
"-------------\n",
"* Introduction to the stimulus presentations table\n",
"* Introduction to the behavior trials table\n",
"* Calculating response latency\n",
"* Aligning Running, Licking and Pupil Data to task events"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\svc_ccg\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\requests\\__init__.py:91: RequestsDependencyWarning: urllib3 (1.26.9) or chardet (3.0.4) doesn't match a supported version!\n",
" RequestsDependencyWarning)\n"
]
}
],
"source": [
"import os\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from allensdk.brain_observatory.behavior.behavior_project_cache.\\\n",
" behavior_neuropixels_project_cache \\\n",
" import VisualBehaviorNeuropixelsProjectCache"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"ecephys_session_1069193611.nwb: 100%|████████████████████████████████████████████| 2.83G/2.83G [02:10<00:00, 21.6MMB/s]\n",
"C:\\Users\\svc_ccg\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\hdmf\\spec\\namespace.py:533: UserWarning: Ignoring cached namespace 'hdmf-common' version 1.5.1 because version 1.5.0 is already loaded.\n",
" % (ns['name'], ns['version'], self.__namespaces.get(ns['name'])['version']))\n",
"C:\\Users\\svc_ccg\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\hdmf\\spec\\namespace.py:533: UserWarning: Ignoring cached namespace 'core' version 2.4.0 because version 2.3.0 is already loaded.\n",
" % (ns['name'], ns['version'], self.__namespaces.get(ns['name'])['version']))\n",
"C:\\Users\\svc_ccg\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\hdmf\\spec\\namespace.py:533: UserWarning: Ignoring cached namespace 'hdmf-experimental' version 0.2.0 because version 0.1.0 is already loaded.\n",
" % (ns['name'], ns['version'], self.__namespaces.get(ns['name'])['version']))\n"
]
}
],
"source": [
"cache_dir = r\"C:\\Users\\svc_ccg\\Desktop\\Data\\vbn_cache\"\n",
"\n",
"cache = VisualBehaviorNeuropixelsProjectCache.from_s3_cache(\n",
" cache_dir=cache_dir)\n",
"\n",
"ecephys_sessions_table = cache.get_ecephys_session_table()[0]\n",
"\n",
"session_id = ecephys_sessions_table.index.values[50]\n",
"session = cache.get_ecephys_session(\n",
" ecephys_session_id=session_id)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction to the stimulus presentations table"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's grab a random session and look at the stimulus presentations dataframe."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"ecephys_session_1063010385.nwb: 100%|████████████████████████████████████████████| 2.39G/2.39G [02:04<00:00, 19.1MMB/s]\n",
"C:\\Users\\svc_ccg\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\hdmf\\spec\\namespace.py:533: UserWarning: Ignoring cached namespace 'hdmf-common' version 1.5.1 because version 1.5.0 is already loaded.\n",
" % (ns['name'], ns['version'], self.__namespaces.get(ns['name'])['version']))\n",
"C:\\Users\\svc_ccg\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\hdmf\\spec\\namespace.py:533: UserWarning: Ignoring cached namespace 'core' version 2.4.0 because version 2.3.0 is already loaded.\n",
" % (ns['name'], ns['version'], self.__namespaces.get(ns['name'])['version']))\n",
"C:\\Users\\svc_ccg\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\hdmf\\spec\\namespace.py:533: UserWarning: Ignoring cached namespace 'hdmf-experimental' version 0.2.0 because version 0.1.0 is already loaded.\n",
" % (ns['name'], ns['version'], self.__namespaces.get(ns['name'])['version']))\n"
]
}
],
"source": [
"session_id = ecephys_sessions_table.index.values[20]\n",
"session = cache.get_ecephys_session(\n",
" ecephys_session_id=session_id)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
active
\n",
"
color
\n",
"
contrast
\n",
"
duration
\n",
"
end_frame
\n",
"
flashes_since_change
\n",
"
image_name
\n",
"
is_change
\n",
"
omitted
\n",
"
orientation
\n",
"
...
\n",
"
position_y
\n",
"
rewarded
\n",
"
spatial_frequency
\n",
"
start_frame
\n",
"
start_time
\n",
"
stimulus_block
\n",
"
stimulus_index
\n",
"
stimulus_name
\n",
"
stop_time
\n",
"
temporal_frequency
\n",
"
\n",
"
\n",
"
stimulus_presentations_id
\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",
"
0
\n",
"
True
\n",
"
NaN
\n",
"
NaN
\n",
"
0.250214
\n",
"
75
\n",
"
0.0
\n",
"
im104_r
\n",
"
False
\n",
"
False
\n",
"
NaN
\n",
"
...
\n",
"
NaN
\n",
"
False
\n",
"
NaN
\n",
"
60
\n",
"
25.710908
\n",
"
0
\n",
"
NaN
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
25.961122
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1
\n",
"
True
\n",
"
NaN
\n",
"
NaN
\n",
"
0.250214
\n",
"
120
\n",
"
1.0
\n",
"
im104_r
\n",
"
False
\n",
"
False
\n",
"
NaN
\n",
"
...
\n",
"
NaN
\n",
"
False
\n",
"
NaN
\n",
"
105
\n",
"
26.461549
\n",
"
0
\n",
"
NaN
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
26.711763
\n",
"
NaN
\n",
"
\n",
"
\n",
"
2
\n",
"
True
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
165
\n",
"
1.0
\n",
"
omitted
\n",
"
False
\n",
"
True
\n",
"
NaN
\n",
"
...
\n",
"
NaN
\n",
"
False
\n",
"
NaN
\n",
"
150
\n",
"
27.212170
\n",
"
0
\n",
"
NaN
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
27.462374
\n",
"
NaN
\n",
"
\n",
"
\n",
"
3
\n",
"
True
\n",
"
NaN
\n",
"
NaN
\n",
"
0.250219
\n",
"
210
\n",
"
2.0
\n",
"
im104_r
\n",
"
False
\n",
"
False
\n",
"
NaN
\n",
"
...
\n",
"
NaN
\n",
"
False
\n",
"
NaN
\n",
"
195
\n",
"
27.962797
\n",
"
0
\n",
"
NaN
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
28.213015
\n",
"
NaN
\n",
"
\n",
"
\n",
"
4
\n",
"
True
\n",
"
NaN
\n",
"
NaN
\n",
"
0.250199
\n",
"
255
\n",
"
3.0
\n",
"
im104_r
\n",
"
False
\n",
"
False
\n",
"
NaN
\n",
"
...
\n",
"
NaN
\n",
"
False
\n",
"
NaN
\n",
"
240
\n",
"
28.713453
\n",
"
0
\n",
"
NaN
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
28.963652
\n",
"
NaN
\n",
"
\n",
" \n",
"
\n",
"
5 rows × 21 columns
\n",
"
"
],
"text/plain": [
" active color contrast duration end_frame \\\n",
"stimulus_presentations_id \n",
"0 True NaN NaN 0.250214 75 \n",
"1 True NaN NaN 0.250214 120 \n",
"2 True NaN NaN NaN 165 \n",
"3 True NaN NaN 0.250219 210 \n",
"4 True NaN NaN 0.250199 255 \n",
"\n",
" flashes_since_change image_name is_change omitted \\\n",
"stimulus_presentations_id \n",
"0 0.0 im104_r False False \n",
"1 1.0 im104_r False False \n",
"2 1.0 omitted False True \n",
"3 2.0 im104_r False False \n",
"4 3.0 im104_r False False \n",
"\n",
" orientation ... position_y rewarded \\\n",
"stimulus_presentations_id ... \n",
"0 NaN ... NaN False \n",
"1 NaN ... NaN False \n",
"2 NaN ... NaN False \n",
"3 NaN ... NaN False \n",
"4 NaN ... NaN False \n",
"\n",
" spatial_frequency start_frame start_time \\\n",
"stimulus_presentations_id \n",
"0 NaN 60 25.710908 \n",
"1 NaN 105 26.461549 \n",
"2 NaN 150 27.212170 \n",
"3 NaN 195 27.962797 \n",
"4 NaN 240 28.713453 \n",
"\n",
" stimulus_block stimulus_index \\\n",
"stimulus_presentations_id \n",
"0 0 NaN \n",
"1 0 NaN \n",
"2 0 NaN \n",
"3 0 NaN \n",
"4 0 NaN \n",
"\n",
" stimulus_name \\\n",
"stimulus_presentations_id \n",
"0 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"1 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"2 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"3 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"4 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"\n",
" stop_time temporal_frequency \n",
"stimulus_presentations_id \n",
"0 25.961122 NaN \n",
"1 26.711763 NaN \n",
"2 27.462374 NaN \n",
"3 28.213015 NaN \n",
"4 28.963652 NaN \n",
"\n",
"[5 rows x 21 columns]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stimulus_presentations = session.stimulus_presentations\n",
"stimulus_presentations.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This table is a record of every stimulus we presented to the mouse over the course of this experiment. The different stimuli are indexed by the 'stimulus_block' column. Let's group this dataframe by stimulus block and see what stimulus was shown for each block."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
stimulus_block
\n",
"
stimulus_name
\n",
"
active
\n",
"
duration
\n",
"
\n",
"
\n",
"
stimulus_presentations_id
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
True
\n",
"
0.250214
\n",
"
\n",
"
\n",
"
1
\n",
"
0
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
True
\n",
"
0.250214
\n",
"
\n",
"
\n",
"
2
\n",
"
0
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
True
\n",
"
NaN
\n",
"
\n",
"
\n",
"
3
\n",
"
0
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
True
\n",
"
0.250219
\n",
"
\n",
"
\n",
"
4
\n",
"
0
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
True
\n",
"
0.250199
\n",
"
\n",
"
\n",
"
4797
\n",
"
1
\n",
"
spontaneous
\n",
"
False
\n",
"
10.008370
\n",
"
\n",
"
\n",
"
4798
\n",
"
2
\n",
"
gabor_20_deg_250ms
\n",
"
False
\n",
"
0.250208
\n",
"
\n",
"
\n",
"
4799
\n",
"
2
\n",
"
gabor_20_deg_250ms
\n",
"
False
\n",
"
0.250208
\n",
"
\n",
"
\n",
"
4800
\n",
"
2
\n",
"
gabor_20_deg_250ms
\n",
"
False
\n",
"
0.250208
\n",
"
\n",
"
\n",
"
4801
\n",
"
2
\n",
"
gabor_20_deg_250ms
\n",
"
False
\n",
"
0.250208
\n",
"
\n",
"
\n",
"
4802
\n",
"
2
\n",
"
gabor_20_deg_250ms
\n",
"
False
\n",
"
0.250207
\n",
"
\n",
"
\n",
"
8443
\n",
"
3
\n",
"
spontaneous
\n",
"
False
\n",
"
288.991592
\n",
"
\n",
"
\n",
"
8444
\n",
"
4
\n",
"
flash_250ms
\n",
"
False
\n",
"
0.250203
\n",
"
\n",
"
\n",
"
8445
\n",
"
4
\n",
"
flash_250ms
\n",
"
False
\n",
"
0.250208
\n",
"
\n",
"
\n",
"
8446
\n",
"
4
\n",
"
flash_250ms
\n",
"
False
\n",
"
0.250216
\n",
"
\n",
"
\n",
"
8447
\n",
"
4
\n",
"
flash_250ms
\n",
"
False
\n",
"
0.250208
\n",
"
\n",
"
\n",
"
8448
\n",
"
4
\n",
"
flash_250ms
\n",
"
False
\n",
"
0.250211
\n",
"
\n",
"
\n",
"
8594
\n",
"
5
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
False
\n",
"
0.250208
\n",
"
\n",
"
\n",
"
8595
\n",
"
5
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
False
\n",
"
0.250208
\n",
"
\n",
"
\n",
"
8596
\n",
"
5
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
False
\n",
"
0.250212
\n",
"
\n",
"
\n",
"
8597
\n",
"
5
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
False
\n",
"
0.250203
\n",
"
\n",
"
\n",
"
8598
\n",
"
5
\n",
"
Natural_Images_Lum_Matched_set_ophys_H_2019
\n",
"
False
\n",
"
0.250212
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" stimulus_block \\\n",
"stimulus_presentations_id \n",
"0 0 \n",
"1 0 \n",
"2 0 \n",
"3 0 \n",
"4 0 \n",
"4797 1 \n",
"4798 2 \n",
"4799 2 \n",
"4800 2 \n",
"4801 2 \n",
"4802 2 \n",
"8443 3 \n",
"8444 4 \n",
"8445 4 \n",
"8446 4 \n",
"8447 4 \n",
"8448 4 \n",
"8594 5 \n",
"8595 5 \n",
"8596 5 \n",
"8597 5 \n",
"8598 5 \n",
"\n",
" stimulus_name \\\n",
"stimulus_presentations_id \n",
"0 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"1 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"2 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"3 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"4 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"4797 spontaneous \n",
"4798 gabor_20_deg_250ms \n",
"4799 gabor_20_deg_250ms \n",
"4800 gabor_20_deg_250ms \n",
"4801 gabor_20_deg_250ms \n",
"4802 gabor_20_deg_250ms \n",
"8443 spontaneous \n",
"8444 flash_250ms \n",
"8445 flash_250ms \n",
"8446 flash_250ms \n",
"8447 flash_250ms \n",
"8448 flash_250ms \n",
"8594 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"8595 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"8596 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"8597 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"8598 Natural_Images_Lum_Matched_set_ophys_H_2019 \n",
"\n",
" active duration \n",
"stimulus_presentations_id \n",
"0 True 0.250214 \n",
"1 True 0.250214 \n",
"2 True NaN \n",
"3 True 0.250219 \n",
"4 True 0.250199 \n",
"4797 False 10.008370 \n",
"4798 False 0.250208 \n",
"4799 False 0.250208 \n",
"4800 False 0.250208 \n",
"4801 False 0.250208 \n",
"4802 False 0.250207 \n",
"8443 False 288.991592 \n",
"8444 False 0.250203 \n",
"8445 False 0.250208 \n",
"8446 False 0.250216 \n",
"8447 False 0.250208 \n",
"8448 False 0.250211 \n",
"8594 False 0.250208 \n",
"8595 False 0.250208 \n",
"8596 False 0.250212 \n",
"8597 False 0.250203 \n",
"8598 False 0.250212 "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stimulus_presentations.groupby('stimulus_block')[['stimulus_block', 'stimulus_name', 'active', 'duration']].head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This shows us the structure of this experiment (and every experiment in this dataset). There are 5 stimuli as follows:\n",
"\n",
"**block 0**: Change detection task. Natural images are flashed repeatedly and the mouse is rewarded for licking when the identity of the image changes. You can find more info about this task [here](http://portal.brain-map.org/explore/circuits/visual-behavior-neuropixels?edit&language=en).\n",
"\n",
"**block 1**: Brief gray screen\n",
"\n",
"**block 2**: Receptive field mapping. Gabor stimuli used for receptive field mapping. For more details on this stimulus consult [this notebook](https://allensdk.readthedocs.io/en/latest/_static/examples/nb/ecephys_receptive_fields.html).\n",
"\n",
"**block 3**: Longer gray screen\n",
"\n",
"**block 4**: Full-field flashes, shown at 80% contrast. Flashes can be black (color = -1) or white (color = 1).\n",
"\n",
"**block 5**: Passive replay. Frame-for-frame replay of the stimulus shown during the change detection task (block 0), but now with the lick spout retracted so the animal can no longer engage in the task."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here's a quick explanation for each of the columns in this table:\n",
"\n",
"#### General\n",
"\n",
"*active*: Boolean indicating when the change detection task (with the lick spout available to the mouse) was run. This should only be TRUE for block 0.\n",
"\n",
"*stimulus_block*: Index of stimulus as described in cells above.\n",
"\n",
"*stimulus_name*: Indicates the stimulus category for this stimulus presentation. \n",
"\n",
"*contrast*: Stimulus contrast\n",
"\n",
"*duration*: Duration of stimulus in seconds\n",
"\n",
"*start_time*: Experiment time when this stimulus started. This value is corrected for display lag and therefore indicates when the stimulus actually appeared on the screen.\n",
"\n",
"*stop_time*: Experiment time when this stimulus ended, also corrected for display lag.\n",
"\n",
"*start_frame*: Stimulus frame index when this stimulus started. This can be used to sync this table to the behavior trials table, for which behavioral data is collected every frame.\n",
"\n",
"*end_frame*: Stimulus frame index when this stimulus ended.\n",
"\n",
"#### Change detection task and Passive replay (blocks 0 and 5)\n",
"\n",
"*flashes_since_change*: Relevant for the detection of change task (block 0) and the passive replay (block 5), this column indicates how many flashes of the same image have occurred since the last stimulus change.\n",
"\n",
"*image_name*: Indicates which natural image was flashed for this stimulus presentation. To see how to visualize this image, check out this tutorial [LINK TO DATA ACCESS NOTEBOOK]\n",
"\n",
"*is_change*: Indicates whether the image identity changed for this stimulus presentation. When both this value and 'active' are TRUE, the mouse was rewarded for licking within the response window.\n",
"\n",
"*omitted*: Indicates whether the image presentation was omitted for this flash. Most image flashes had a 5% probability of being omitted (producing a gray screen). Flashes immediately preceding a change or immediately following an omission could not be omitted.\n",
"\n",
"*rewarded*: Indicates whether a reward was given after this image presentation. During the passive replay block (5), this value indicates that a reward was issued for the corresponding image presenation during the active behavior block (0). No rewards were given during passive replay.\n",
"\n",
"#### Receptive field mapping gabor stimulus (block 2)\n",
"\n",
"*orientation*: Orientation of gabor. \n",
"\n",
"*position_x*: Position of the gabor along azimuth. The units are in degrees relative to the center of the screen (negative values are nasal).\n",
"\n",
"*position_y*: Position of the gabor along elevation. Negative values are lower elevation.\n",
"\n",
"*spatial_frequency*: Spatial frequency of gabor in cycles per degree.\n",
"\n",
"*temporal_frequency*: Temporal frequency of gabor in Hz.\n",
"\n",
"#### Full field flashes (block 4)\n",
"\n",
"*color*: Color of the full-field flash stimuli. \"1\" is white and \"-1\" is black.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's confirm that the active behavior block (0) and the passive replay block (5) match frame for frame:"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"active_image_presentations = stimulus_presentations[stimulus_presentations['stimulus_block']==0]\n",
"passive_image_presentations = stimulus_presentations[stimulus_presentations['stimulus_block']==5]\n",
"np.all(active_image_presentations['image_name'].values == passive_image_presentations['image_name'].values )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction to the behavior trials table"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's explore the behavior trials table. This table contains lots of useful information about every trial in the change detection task."
]
},
{
"cell_type": "code",
"execution_count": 170,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
start_time
\n",
"
stop_time
\n",
"
initial_image_name
\n",
"
change_image_name
\n",
"
stimulus_change
\n",
"
change_time
\n",
"
go
\n",
"
catch
\n",
"
lick_times
\n",
"
response_time
\n",
"
...
\n",
"
reward_volume
\n",
"
hit
\n",
"
false_alarm
\n",
"
miss
\n",
"
correct_reject
\n",
"
aborted
\n",
"
auto_rewarded
\n",
"
change_frame
\n",
"
trial_length
\n",
"
change_time_with_display_delay
\n",
"
\n",
"
\n",
"
trials_id
\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",
"
0
\n",
"
25.66618
\n",
"
26.98348
\n",
"
im104_r
\n",
"
im104_r
\n",
"
False
\n",
"
NaN
\n",
"
False
\n",
"
False
\n",
"
[26.36584, 26.51607, 26.61606, 26.98348]
\n",
"
NaN
\n",
"
...
\n",
"
0.0
\n",
"
False
\n",
"
False
\n",
"
False
\n",
"
False
\n",
"
True
\n",
"
False
\n",
"
NaN
\n",
"
1.31730
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1
\n",
"
27.16692
\n",
"
28.81836
\n",
"
im104_r
\n",
"
im104_r
\n",
"
False
\n",
"
NaN
\n",
"
False
\n",
"
False
\n",
"
[28.46755]
\n",
"
NaN
\n",
"
...
\n",
"
0.0
\n",
"
False
\n",
"
False
\n",
"
False
\n",
"
False
\n",
"
True
\n",
"
False
\n",
"
NaN
\n",
"
1.65144
\n",
"
NaN
\n",
"
\n",
"
\n",
"
2
\n",
"
29.41882
\n",
"
31.25379
\n",
"
im104_r
\n",
"
im104_r
\n",
"
False
\n",
"
NaN
\n",
"
False
\n",
"
False
\n",
"
[30.63653, 30.76949, 30.90293]
\n",
"
NaN
\n",
"
...
\n",
"
0.0
\n",
"
False
\n",
"
False
\n",
"
False
\n",
"
False
\n",
"
True
\n",
"
False
\n",
"
NaN
\n",
"
1.83497
\n",
"
NaN
\n",
"
\n",
"
\n",
"
3
\n",
"
31.67111
\n",
"
33.23862
\n",
"
im104_r
\n",
"
im104_r
\n",
"
False
\n",
"
NaN
\n",
"
False
\n",
"
False
\n",
"
[32.88816, 33.22146, 33.33829, 33.42177, 33.52...
\n",
"
NaN
\n",
"
...
\n",
"
0.0
\n",
"
False
\n",
"
False
\n",
"
False
\n",
"
False
\n",
"
True
\n",
"
False
\n",
"
NaN
\n",
"
1.56751
\n",
"
NaN
\n",
"
\n",
"
\n",
"
4
\n",
"
33.92263
\n",
"
36.45841
\n",
"
im104_r
\n",
"
im104_r
\n",
"
False
\n",
"
NaN
\n",
"
False
\n",
"
False
\n",
"
[35.87392, 36.02384, 36.10722]
\n",
"
NaN
\n",
"
...
\n",
"
0.0
\n",
"
False
\n",
"
False
\n",
"
False
\n",
"
False
\n",
"
True
\n",
"
False
\n",
"
NaN
\n",
"
2.53578
\n",
"
NaN
\n",
"
\n",
" \n",
"
\n",
"
5 rows × 22 columns
\n",
"
"
],
"text/plain": [
" start_time stop_time initial_image_name change_image_name \\\n",
"trials_id \n",
"0 25.66618 26.98348 im104_r im104_r \n",
"1 27.16692 28.81836 im104_r im104_r \n",
"2 29.41882 31.25379 im104_r im104_r \n",
"3 31.67111 33.23862 im104_r im104_r \n",
"4 33.92263 36.45841 im104_r im104_r \n",
"\n",
" stimulus_change change_time go catch \\\n",
"trials_id \n",
"0 False NaN False False \n",
"1 False NaN False False \n",
"2 False NaN False False \n",
"3 False NaN False False \n",
"4 False NaN False False \n",
"\n",
" lick_times response_time \\\n",
"trials_id \n",
"0 [26.36584, 26.51607, 26.61606, 26.98348] NaN \n",
"1 [28.46755] NaN \n",
"2 [30.63653, 30.76949, 30.90293] NaN \n",
"3 [32.88816, 33.22146, 33.33829, 33.42177, 33.52... NaN \n",
"4 [35.87392, 36.02384, 36.10722] NaN \n",
"\n",
" ... reward_volume hit false_alarm miss correct_reject \\\n",
"trials_id ... \n",
"0 ... 0.0 False False False False \n",
"1 ... 0.0 False False False False \n",
"2 ... 0.0 False False False False \n",
"3 ... 0.0 False False False False \n",
"4 ... 0.0 False False False False \n",
"\n",
" aborted auto_rewarded change_frame trial_length \\\n",
"trials_id \n",
"0 True False NaN 1.31730 \n",
"1 True False NaN 1.65144 \n",
"2 True False NaN 1.83497 \n",
"3 True False NaN 1.56751 \n",
"4 True False NaN 2.53578 \n",
"\n",
" change_time_with_display_delay \n",
"trials_id \n",
"0 NaN \n",
"1 NaN \n",
"2 NaN \n",
"3 NaN \n",
"4 NaN \n",
"\n",
"[5 rows x 22 columns]"
]
},
"execution_count": 170,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"trials = session.trials\n",
"trials.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here you can see that unlike the stimulus presentations table in which every row corresponded to a visual stimulus presentation, for the behavior trials table every row corresponds to one trial of the change detection task. Here is a quick summary of the columns:\n",
"\n",
"*start_time*: Experiment time when this trial began in seconds.\n",
"\n",
"*stop_time*: Experiment time when this trial ended.\n",
"\n",
"*initial_image_name*: Indicates which image was shown before the change (or sham change) for this trial\n",
"\n",
"*change_image_name*: Indicates which image was scheduled to be the change image for this trial. Note that if the trial is aborted, a new trial will begin before this change occurs.\n",
"\n",
"*stimulus_change*: Indicates whether an image change occurred for this trial. \n",
"\n",
"*change_time_no_display_delay*: Experiment time when the task-control computer commanded an image change. This change time is used to determine the response window during which a lick will trigger a reward. Note that due to display lag, this is not the time when the change image actually appears on the screen. To get this time, you need the stimulus_presentations table (more about this below).\n",
"\n",
"*go*: Indicates whether this trial was a 'go' trial. To qualify as a go trial, an image change must occur and the trial cannot be autorewarded.\n",
"\n",
"*catch*: Indicates whether this trial was a 'catch' trial. To qualify as a catch trial, a 'sham' change must occur during which the image identity does not change. These sham changes are drawn to match the timing distribution of real changes and can be used to calculate the false alarm rate.\n",
"\n",
"*lick_times*: A list indicating when the behavioral control software recognized a lick. Note that this is not identical to the lick times from the licks dataframe, which record when the licks were registered by the lick sensor. The licks dataframe should generally be used for analysis of the licking behavior rather than these times.\n",
"\n",
"*response_time*: Indicates the time when the first lick was registered by the task control software for trials that were not aborted (go or catch). NaN for aborted trials. For a more accurate measure of response time, the licks dataframe should be used.\n",
"\n",
"*reward_time*: Indicates when the reward command was triggered for hit trials. NaN for other trial types. \n",
"\n",
"*reward_volume*: Indicates the volume of water dispensed as reward for this trial. \n",
"\n",
"*hit*: Indicates whether this trial was a 'hit' trial. To qualify as a hit, the trial must be a go trial during which the stimulus changed and the mouse licked within the reward window (150-750 ms after the change time).\n",
"\n",
"*false_alarm*: Indicates whether this trial was a 'false alarm' trial. To qualify as a false alarm, the trial must be a catch trial during which a sham change occurred and the mouse licked during the reward window.\n",
"\n",
"*miss*: To qualify as a miss trial, the trial must be a go trial during which the stimulus changed but the mouse did not lick within the response window.\n",
"\n",
"*correct_reject*: To qualify as a correct reject trial, the trial must be a catch trial during which a sham change occurred and the mouse withheld licking.\n",
"\n",
"*aborted*: A trial is aborted when the mouse licks before the scheduled change or sham change.\n",
"\n",
"*auto_rewarded*: During autorewarded trials, the reward is automatically triggered after the change regardless of whether the mouse licked within the response window. These always come at the beginning of the session to help engage the mouse in behavior.\n",
"\n",
"*change_frame*: Indicates the stimulus frame index when the change occurred. This column can be used to link the trials table with the stimulus presentations table, as shown below.\n",
"\n",
"*trial_length*: Duration of the trial in seconds."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Calculating response latency"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's combine info from both of these tables to calculate response latency for this session. Note that the change time in the trials table is not corrected for display lag. This is the time that the task control computer uses to determine the response window. However, to calculate response latency, we want to use the display lag *corrected* change times from the stimulus presentations table. Below, we will grab these corrected times and add them to the trials table under the new column label 'change_time_with_display_delay'."
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [],
"source": [
"from functools import partial\n",
"\n",
"def get_change_time_from_stim_table(row, table):\n",
" '''\n",
" Given a particular row in the trials table,\n",
" find the corresponding change time in the \n",
" stimulus presentations table\n",
" '''\n",
" \n",
" change_frame = row['change_frame']\n",
" if np.isnan(change_frame):\n",
" return np.nan\n",
" \n",
" change_time = table[table.start_frame==change_frame]\\\n",
" ['start_time'].values[0]\n",
" \n",
" return change_time\n",
"\n",
"get_change_times = partial(get_change_time_from_stim_table, table=stimulus_presentations)\n",
"change_times = trials.apply(get_change_times, axis=1)\n",
"trials['change_time_with_display_delay'] = change_times"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can use this new column to calculate the response latency on 'hit' trials."
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Trial count')"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"hit_trials = trials[trials['hit']]\n",
"response_latencies = hit_trials['response_time'] - hit_trials['change_time_with_display_delay']\n",
"fig, ax = plt.subplots()\n",
"fig.suptitle('Response Latency Histogram for Hit trials')\n",
"ax.hist(response_latencies, bins=np.linspace(-0.1, 0.8, 50))\n",
"ax.set_xlabel('Time from change (s)')\n",
"ax.set_ylabel('Trial count')\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that there is one trial with a negative response latency. This happens when a lick immediately precedes the change, and the task control software doesn't have time to abort the trial. To restrict ourselves to only those licks that occur during the response window, we can do the following:"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Trial count')"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"response_window_lick_times = []\n",
"for it, trial in hit_trials.iterrows():\n",
" lick_times = trial['lick_times']\n",
" response_window_start = trial['change_time'] + 0.15\n",
" response_window_lick_time = lick_times[lick_times>response_window_start][0]\n",
" response_window_lick_times.append(response_window_lick_time)\n",
" \n",
"response_latencies = response_window_lick_times - hit_trials['change_time_with_display_delay'].values\n",
"fig, ax = plt.subplots()\n",
"fig.suptitle('Response Latency Histogram for Hit trials')\n",
"ax.hist(response_latencies, bins=np.linspace(-0.1, 0.8, 50))\n",
"ax.set_xlabel('Time from change (s)')\n",
"ax.set_ylabel('Trial count')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Aligning Running, Licking and Pupil data to task events"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's grab the licking, running and pupil tracking data for this session and align it to the behavior."
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
"eye_tracking = session.eye_tracking\n",
"running_speed = session.running_speed\n",
"licks = session.licks"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Eye tracking dataframe**: One entry containing ellipse fit parameters for the eye, pupil and corneal reflection for every frame of the eye tracking video stream."
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
timestamps
\n",
"
cr_area
\n",
"
eye_area
\n",
"
pupil_area
\n",
"
likely_blink
\n",
"
pupil_area_raw
\n",
"
cr_area_raw
\n",
"
eye_area_raw
\n",
"
cr_center_x
\n",
"
cr_center_y
\n",
"
...
\n",
"
eye_center_x
\n",
"
eye_center_y
\n",
"
eye_width
\n",
"
eye_height
\n",
"
eye_phi
\n",
"
pupil_center_x
\n",
"
pupil_center_y
\n",
"
pupil_width
\n",
"
pupil_height
\n",
"
pupil_phi
\n",
"
\n",
"
\n",
"
frame
\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",
"
0
\n",
"
1.34174
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
True
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1
\n",
"
1.35840
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
True
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
2
\n",
"
1.37507
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
True
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
3
\n",
"
1.39174
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
True
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
4
\n",
"
1.40840
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
True
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
" \n",
"
\n",
"
5 rows × 23 columns
\n",
"
"
],
"text/plain": [
" timestamps cr_area eye_area pupil_area likely_blink \\\n",
"frame \n",
"0 1.34174 NaN NaN NaN True \n",
"1 1.35840 NaN NaN NaN True \n",
"2 1.37507 NaN NaN NaN True \n",
"3 1.39174 NaN NaN NaN True \n",
"4 1.40840 NaN NaN NaN True \n",
"\n",
" pupil_area_raw cr_area_raw eye_area_raw cr_center_x cr_center_y \\\n",
"frame \n",
"0 NaN NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN \n",
"\n",
" ... eye_center_x eye_center_y eye_width eye_height eye_phi \\\n",
"frame ... \n",
"0 ... NaN NaN NaN NaN NaN \n",
"1 ... NaN NaN NaN NaN NaN \n",
"2 ... NaN NaN NaN NaN NaN \n",
"3 ... NaN NaN NaN NaN NaN \n",
"4 ... NaN NaN NaN NaN NaN \n",
"\n",
" pupil_center_x pupil_center_y pupil_width pupil_height pupil_phi \n",
"frame \n",
"0 NaN NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN \n",
"\n",
"[5 rows x 23 columns]"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eye_tracking.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There seem to be several rows for which there are no valid data. We can use the 'likely_blink' column to filter these out."
]
},
{
"cell_type": "code",
"execution_count": 167,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"