Source code for allensdk.brain_observatory.behavior.sync
"""
Created on Sunday July 15 2018
@author: marinag
"""
from .process_sync import filter_digital, calculate_delay # NOQA: E402
from allensdk.brain_observatory.sync_dataset import Dataset as SyncDataset # NOQA: E402
import numpy as np
import scipy.stats as sps
[docs]def get_sync_data(sync_path):
sync_dataset = SyncDataset(sync_path)
meta_data = sync_dataset.meta_data
sample_freq = meta_data['ni_daq']['counter_output_freq']
# use rising edge for Scientifica, falling edge for Nikon http://confluence.corp.alleninstitute.org/display/IT/Ophys+Time+Sync
# 2P vsyncs
vs2p_r = sync_dataset.get_rising_edges('2p_vsync')
vs2p_f = sync_dataset.get_falling_edges('2p_vsync') # new sync may be able to do units = 'sec', so conversion can be skipped
frames_2p = vs2p_r / sample_freq
vs2p_fsec = vs2p_f / sample_freq
stimulus_times_no_monitor_delay = sync_dataset.get_falling_edges('stim_vsync') / sample_freq
if 'lick_times' in meta_data['line_labels']:
lick_times = sync_dataset.get_rising_edges('lick_1') / sample_freq
elif 'lick_sensor' in meta_data['line_labels']:
lick_times = sync_dataset.get_rising_edges('lick_sensor') / sample_freq
else:
lick_times = None
if '2p_trigger' in meta_data['line_labels']:
trigger = sync_dataset.get_rising_edges('2p_trigger') / sample_freq
elif 'acq_trigger' in meta_data['line_labels']:
trigger = sync_dataset.get_rising_edges('acq_trigger') / sample_freq
if 'stim_photodiode' in meta_data['line_labels']:
a = sync_dataset.get_rising_edges('stim_photodiode') / sample_freq
b = sync_dataset.get_falling_edges('stim_photodiode') / sample_freq
stim_photodiode = sorted(list(a)+list(b))
elif 'photodiode' in meta_data['line_labels']:
a = sync_dataset.get_rising_edges('photodiode') / sample_freq
b = sync_dataset.get_falling_edges('photodiode') / sample_freq
stim_photodiode = sorted(list(a)+list(b))
if 'cam1_exposure' in meta_data['line_labels']:
eye_tracking = sync_dataset.get_rising_edges('cam1_exposure') / sample_freq
elif 'eye_tracking' in meta_data['line_labels']:
eye_tracking = sync_dataset.get_rising_edges('eye_tracking') / sample_freq
if 'cam2_exposure' in meta_data['line_labels']:
behavior_monitoring = sync_dataset.get_rising_edges('cam2_exposure') / sample_freq
elif 'behavior_monitoring' in meta_data['line_labels']:
behavior_monitoring = sync_dataset.get_rising_edges('behavior_monitoring') / sample_freq
sync_data = {'ophys_frames': frames_2p,
'lick_times': lick_times,
'ophys_trigger': trigger,
'eye_tracking': eye_tracking,
'behavior_monitoring': behavior_monitoring,
'stim_photodiode': stim_photodiode,
'stimulus_times_no_delay': stimulus_times_no_monitor_delay,
}
return sync_data
[docs]def get_stimulus_rebase_function(data, stimulus_timestamps_no_monitor_delay):
# Time rebasing: times in stimulus_timestamps_pickle and lick log will agree with times in event log
vsyncs = data["items"]["behavior"]['intervalsms']
stimulus_timestamps_pickle_pre = np.hstack((0, vsyncs)).cumsum() / 1000.0
assert len(stimulus_timestamps_pickle_pre) == len(stimulus_timestamps_no_monitor_delay)
first_trial = data["items"]["behavior"]["trial_log"][0]
first_trial_start_time, first_trial_start_frame = {(e[0], e[1]):(e[2], e[3]) for e in first_trial['events']}['trial_start','']
offset_time = first_trial_start_time-stimulus_timestamps_pickle_pre[first_trial_start_frame]
stimulus_timestamps_pickle = np.array([t+offset_time for t in stimulus_timestamps_pickle_pre])
# Rebase used to transform trial log times to sync times:
time_slope, time_intercept, _, _, _ = sps.linregress(stimulus_timestamps_pickle, stimulus_timestamps_no_monitor_delay)
def rebase(t):
return time_intercept+time_slope*t
return rebase