Open In Colab

Installing requirements¶

The cell below installs every Python package needed to run this notebook, at fully pinned versions, using uv for fast resolution. In Colab the cell is collapsed by default — click the ▶ button to run it.

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 [ ]: