Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 17 additions & 24 deletions brainbox/io/one.py
Original file line number Diff line number Diff line change
Expand Up @@ -1280,16 +1280,12 @@ def load_pose(self, likelihood_thr=0.9, views=['left', 'right', 'body']):
# empty the dictionary so that if one loads only one view, after having loaded several, the others don't linger
self.pose = {}
for view in views:
try:
pose_raw = self.one.load_object(self.eid, f'{view}Camera', attribute=['dlc', 'times'])
# Double check if video timestamps are correct length or can be fixed
times_fixed, dlc = self._check_video_timestamps(view, pose_raw['times'], pose_raw['dlc'])
self.pose[f'{view}Camera'] = likelihood_threshold(dlc, likelihood_thr)
self.pose[f'{view}Camera'].insert(0, 'times', times_fixed)
self.data_info.loc[self.data_info['name'] == 'pose', 'is_loaded'] = True
except BaseException as e:
_logger.warning(f'Could not load pose data for {view}Camera. Skipping camera.')
_logger.debug(e)
pose_raw = self.one.load_object(self.eid, f'{view}Camera', attribute=['dlc', 'times'])
# Double check if video timestamps are correct length or can be fixed
times_fixed, dlc = self._check_video_timestamps(view, pose_raw['times'], pose_raw['dlc'])
self.pose[f'{view}Camera'] = likelihood_threshold(dlc, likelihood_thr)
self.pose[f'{view}Camera'].insert(0, 'times', times_fixed)
self.data_info.loc[self.data_info['name'] == 'pose', 'is_loaded'] = True

def load_motion_energy(self, views=['left', 'right', 'body']):
"""
Expand All @@ -1311,17 +1307,13 @@ def load_motion_energy(self, views=['left', 'right', 'body']):
# empty the dictionary so that if one loads only one view, after having loaded several, the others don't linger
self.motion_energy = {}
for view in views:
try:
me_raw = self.one.load_object(self.eid, f'{view}Camera', attribute=['ROIMotionEnergy', 'times'])
# Double check if video timestamps are correct length or can be fixed
times_fixed, motion_energy = self._check_video_timestamps(
view, me_raw['times'], me_raw['ROIMotionEnergy'])
self.motion_energy[f'{view}Camera'] = pd.DataFrame(columns=[names[view]], data=motion_energy)
self.motion_energy[f'{view}Camera'].insert(0, 'times', times_fixed)
self.data_info.loc[self.data_info['name'] == 'motion_energy', 'is_loaded'] = True
except BaseException as e:
_logger.warning(f'Could not load motion energy data for {view}Camera. Skipping camera.')
_logger.debug(e)
me_raw = self.one.load_object(self.eid, f'{view}Camera', attribute=['ROIMotionEnergy', 'times'])
# Double check if video timestamps are correct length or can be fixed
times_fixed, motion_energy = self._check_video_timestamps(
view, me_raw['times'], me_raw['ROIMotionEnergy'])
self.motion_energy[f'{view}Camera'] = pd.DataFrame(columns=[names[view]], data=motion_energy)
self.motion_energy[f'{view}Camera'].insert(0, 'times', times_fixed)
self.data_info.loc[self.data_info['name'] == 'motion_energy', 'is_loaded'] = True

def load_licks(self):
"""
Expand All @@ -1342,7 +1334,7 @@ def load_pupil(self, snr_thresh=5.):
# Try to load from features
feat_raw = self.one.load_object(self.eid, 'leftCamera', attribute=['times', 'features'])
if 'features' in feat_raw.keys():
times_fixed, feats = self._check_video_timestamps(feat_raw['times'], feat_raw['features'])
times_fixed, feats = self._check_video_timestamps('left', feat_raw['times'], feat_raw['features'])
self.pupil = feats.copy()
self.pupil.insert(0, 'times', times_fixed)

Expand All @@ -1364,7 +1356,8 @@ def load_pupil(self, snr_thresh=5.):
try:
self.pupil['pupilDiameter_smooth'] = get_smooth_pupil_diameter(self.pupil['pupilDiameter_raw'], 'left')
except BaseException as e:
_logger.error("Computing smooth pupil diameter failed, saving all NaNs.")
_logger.error("Loaded raw pupil diameter but computing smooth pupil diameter failed. "
"Saving all NaNs for pupilDiameter_smooth.")
_logger.debug(e)
self.pupil['pupilDiameter_smooth'] = np.nan

Expand All @@ -1375,7 +1368,7 @@ def load_pupil(self, snr_thresh=5.):
(np.var(self.pupil['pupilDiameter_smooth'][good_idxs] - self.pupil['pupilDiameter_raw'][good_idxs])))
if snr < snr_thresh:
self.pupil = pd.DataFrame()
_logger.error(f'Pupil diameter SNR ({snr:.2f}) below threshold SNR ({snr_thresh}), removing data.')
raise ValueError(f'Pupil diameter SNR ({snr:.2f}) below threshold SNR ({snr_thresh}), removing data.')

def _check_video_timestamps(self, view, video_timestamps, video_data):
"""
Expand Down
3 changes: 3 additions & 0 deletions release_notes.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
## Release Notes 2.15
### Release Notes NOT YET RELEASED
- SessionLoader error handling and bug fix

### Release Notes 2.15.2 - 2022-09-22
- extraction pipeline: fix unpacking of empty arguments field from alyx dict that prevents running task

Expand Down