In [1]:
# install cell skipped during CI (deps preinstalled into system Python)
⚠️ Restart runtime after install
The install may upgrade packages already loaded in the kernel. Go to Runtime → Restart session, then Run all cells below (skip this install cell on re-run).
Fiber Photometry Example Session¶
In [2]:
from stream_nwbfile import stream_nwbfile
import numpy as np
import matplotlib.pyplot as plt
This notebook showcases one example session from the 000971 dataset containing operant behavior and concurrent fiber photometry recordings.
In [3]:
DANDISET_ID = '000971'
DANDISET_VERSION = "0.261013.1707"
file_path = 'sub-112-283/sub-112-283_ses-FP-PS-2019-06-20T09-32-04_behavior.nwb'
nwbfile, io = stream_nwbfile(DANDISET_ID, file_path, DANDISET_VERSION)
display(nwbfile)
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[3], line 4 1 DANDISET_ID = '000971' 2 DANDISET_VERSION = "0.261013.1707" 3 file_path = 'sub-112-283/sub-112-283_ses-FP-PS-2019-06-20T09-32-04_behavior.nwb' ----> 4 nwbfile, io = stream_nwbfile(DANDISET_ID, file_path, DANDISET_VERSION) 5 display(nwbfile) TypeError: stream_nwbfile() takes 2 positional arguments but 3 were given
Retrieve Photometry and Behavioral Data
In [4]:
# Photometry
fiber_photometry_responses = nwbfile.acquisition['fiber_photometry_response_series'].data[:]
dms_calcium_signal = fiber_photometry_responses[:, 0]
dms_isosbestic_control = fiber_photometry_responses[:, 1]
dls_calcium_signal = fiber_photometry_responses[:, 2]
dls_isosbestic_control = fiber_photometry_responses[:, 3]
fs = nwbfile.acquisition['fiber_photometry_response_series'].rate
timestamps = np.arange(0, len(dms_calcium_signal) / fs, 1/fs)
# Behavior
left_nose_poke_times = nwbfile.processing['behavior'].data_interfaces['left_nose_poke_times'].timestamps[:]
left_reward_times = nwbfile.processing['behavior'].data_interfaces['left_reward_times'].timestamps[:]
reward_port_intervals = nwbfile.processing['behavior'].data_interfaces['behavioral_epochs'].interval_series['reward_port_intervals']
reward_port_interval_data = reward_port_intervals.data[:]
reward_port_interval_times = reward_port_intervals.timestamps[:]
reward_port_entry_times = reward_port_interval_times[reward_port_interval_data==1]
reward_port_exit_times = reward_port_interval_times[reward_port_interval_data==-1]
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[4], line 2 1 # Photometry ----> 2 fiber_photometry_responses = nwbfile.acquisition['fiber_photometry_response_series'].data[:] 3 dms_calcium_signal = fiber_photometry_responses[:, 0] 4 dms_isosbestic_control = fiber_photometry_responses[:, 1] 5 dls_calcium_signal = fiber_photometry_responses[:, 2] NameError: name 'nwbfile' is not defined
Plot
In [5]:
t_start = 2000
t_end = 2100
photometry_slice = slice(int(t_start * fs), int(t_end * fs))
left_nose_poke_mask = np.logical_and(left_nose_poke_times >= t_start, left_nose_poke_times < t_end)
left_reward_mask = np.logical_and(left_reward_times >= t_start, left_reward_times < t_end)
reward_port_interval_mask = np.logical_and(reward_port_entry_times >= t_start, reward_port_entry_times < t_end)
lineoffsets = 200
linelengths = 50
y = np.arange(170, 180, 0.1)
alpha = 0.3
ylim = [165, 235]
fix, ax = plt.subplots(2, 1, figsize=(10, 10), sharex=True)
ax[0].plot(timestamps[photometry_slice], dms_calcium_signal[photometry_slice], label='Calcium Signal')
ax[0].plot(timestamps[photometry_slice], dms_isosbestic_control[photometry_slice], label='Isosbestic Control')
ax[0].eventplot(left_nose_poke_times[left_nose_poke_mask], lineoffsets=lineoffsets, linelengths=linelengths, color='r', label='Left Nose Poke')
ax[0].eventplot(left_reward_times[left_reward_mask], lineoffsets=lineoffsets, linelengths=linelengths, color='g', label='Left Reward')
for i, (reward_port_entry_time, reward_port_exit_time) in enumerate(zip(reward_port_entry_times[reward_port_interval_mask], reward_port_exit_times[reward_port_interval_mask])):
x1 = reward_port_entry_time*np.ones(len(y))
x2 = reward_port_exit_time*np.ones(len(y))
if i == 0:
ax[0].fill_betweenx(y, x1, x2, color='b', alpha=alpha, label='In Reward Port')
else:
ax[0].fill_betweenx(y, x1, x2, color='b', alpha=alpha)
ax[0].set_ylim(ylim)
ax[0].set_title('DMS')
ax[0].legend()
ax[0].set_ylabel('Fluorescence (a.u.)')
ax[1].plot(timestamps[photometry_slice], dls_calcium_signal[photometry_slice], label='Calcium Signal')
ax[1].plot(timestamps[photometry_slice], dls_isosbestic_control[photometry_slice], label='Isosbestic Control')
ax[1].eventplot(left_nose_poke_times[left_nose_poke_mask], lineoffsets=lineoffsets, linelengths=linelengths, color='r', label='Left Nose Poke')
ax[1].eventplot(left_reward_times[left_reward_mask], lineoffsets=lineoffsets, linelengths=linelengths, color='g', label='Left Reward')
for i, (reward_port_entry_time, reward_port_exit_time) in enumerate(zip(reward_port_entry_times[reward_port_interval_mask], reward_port_exit_times[reward_port_interval_mask])):
x1 = reward_port_entry_time*np.ones(len(y))
x2 = reward_port_exit_time*np.ones(len(y))
if i == 0:
ax[1].fill_betweenx(y, x1, x2, color='b', alpha=alpha, label='In Reward Port')
else:
ax[1].fill_betweenx(y, x1, x2, color='b', alpha=alpha)
ax[1].set_ylim(ylim)
ax[1].set_title('DLS')
ax[1].legend()
ax[1].set_xlabel('Time (s)')
_ = ax[1].set_ylabel('Fluorescence (a.u.)')
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[5], line 3 1 t_start = 2000 2 t_end = 2100 ----> 3 photometry_slice = slice(int(t_start * fs), int(t_end * fs)) 4 left_nose_poke_mask = np.logical_and(left_nose_poke_times >= t_start, left_nose_poke_times < t_end) 5 left_reward_mask = np.logical_and(left_reward_times >= t_start, left_reward_times < t_end) 6 reward_port_interval_mask = np.logical_and(reward_port_entry_times >= t_start, reward_port_entry_times < t_end) NameError: name 'fs' is not defined
Zoom in for more detail
In [6]:
t_start = 2000
t_end = 2020
photometry_slice = slice(int(t_start * fs), int(t_end * fs))
left_nose_poke_mask = np.logical_and(left_nose_poke_times >= t_start, left_nose_poke_times < t_end)
left_reward_mask = np.logical_and(left_reward_times >= t_start, left_reward_times < t_end)
reward_port_interval_mask = np.logical_and(reward_port_entry_times >= t_start, reward_port_entry_times < t_end)
lineoffsets = 200
linelengths = 50
y = np.arange(170, 180, 0.1)
alpha = 0.3
ylim = [165, 235]
fix, ax = plt.subplots(2, 1, figsize=(10, 10), sharex=True)
ax[0].plot(timestamps[photometry_slice], dms_calcium_signal[photometry_slice], label='Calcium Signal')
ax[0].plot(timestamps[photometry_slice], dms_isosbestic_control[photometry_slice], label='Isosbestic Control')
ax[0].eventplot(left_nose_poke_times[left_nose_poke_mask], lineoffsets=lineoffsets, linelengths=linelengths, color='r', label='Left Nose Poke')
ax[0].eventplot(left_reward_times[left_reward_mask], lineoffsets=lineoffsets, linelengths=linelengths, color='g', label='Left Reward')
for i, (reward_port_entry_time, reward_port_exit_time) in enumerate(zip(reward_port_entry_times[reward_port_interval_mask], reward_port_exit_times[reward_port_interval_mask])):
x1 = reward_port_entry_time*np.ones(len(y))
x2 = reward_port_exit_time*np.ones(len(y))
if i == 0:
ax[0].fill_betweenx(y, x1, x2, color='b', alpha=alpha, label='In Reward Port')
else:
ax[0].fill_betweenx(y, x1, x2, color='b', alpha=alpha)
ax[0].set_ylim(ylim)
ax[0].set_title('DMS')
ax[0].legend()
ax[0].set_ylabel('Fluorescence (a.u.)')
ax[1].plot(timestamps[photometry_slice], dls_calcium_signal[photometry_slice], label='Calcium Signal')
ax[1].plot(timestamps[photometry_slice], dls_isosbestic_control[photometry_slice], label='Isosbestic Control')
ax[1].eventplot(left_nose_poke_times[left_nose_poke_mask], lineoffsets=lineoffsets, linelengths=linelengths, color='r', label='Left Nose Poke')
ax[1].eventplot(left_reward_times[left_reward_mask], lineoffsets=lineoffsets, linelengths=linelengths, color='g', label='Left Reward')
for i, (reward_port_entry_time, reward_port_exit_time) in enumerate(zip(reward_port_entry_times[reward_port_interval_mask], reward_port_exit_times[reward_port_interval_mask])):
x1 = reward_port_entry_time*np.ones(len(y))
x2 = reward_port_exit_time*np.ones(len(y))
if i == 0:
ax[1].fill_betweenx(y, x1, x2, color='b', alpha=alpha, label='In Reward Port')
else:
ax[1].fill_betweenx(y, x1, x2, color='b', alpha=alpha)
ax[1].set_ylim(ylim)
ax[1].set_title('DLS')
ax[1].legend()
ax[1].set_xlabel('Time (s)')
_ = ax[1].set_ylabel('Fluorescence (a.u.)')
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[6], line 3 1 t_start = 2000 2 t_end = 2020 ----> 3 photometry_slice = slice(int(t_start * fs), int(t_end * fs)) 4 left_nose_poke_mask = np.logical_and(left_nose_poke_times >= t_start, left_nose_poke_times < t_end) 5 left_reward_mask = np.logical_and(left_reward_times >= t_start, left_reward_times < t_end) 6 reward_port_interval_mask = np.logical_and(reward_port_entry_times >= t_start, reward_port_entry_times < t_end) NameError: name 'fs' is not defined
In [ ]: