Browse Source

upload_eye_tracking_files

David Schaeffer 3 years ago
parent
commit
7c2183a6c6
3 changed files with 82 additions and 0 deletions
  1. 1 0
      Data.h5
  2. 26 0
      get_fixations_and_saccades.py
  3. 55 0
      plots.py

+ 1 - 0
Data.h5

@@ -0,0 +1 @@
+/annex/objects/MD5-s111308973--6ec856b4d44c06fd2c4ee084ddfde95e

+ 26 - 0
get_fixations_and_saccades.py

@@ -0,0 +1,26 @@
+import simianpy as simi #pip install git+https://github.com/jselvan/simianpy.git@0.1.4
+
+import matplotlib.pyplot as plt 
+import pandas as pd 
+
+hdf_path = 'Data.h5'
+hdf_kwargs = dict(path_or_buf=hdf_path, complib='blosc:lz4', complevel=9)
+eye_data_block = pd.read_hdf(hdf_path, 'ContinuousEyeDataVideo')
+eye_data_block_fix = pd.read_hdf(hdf_path, 'ContinuousEyeDataFixationSlide')
+
+detect_saccades_kwargs = dict(velocity_threshold=30,duration_threshold=pd.offsets.Milli(10))
+detect_fixations_kwargs = dict(velocity_threshold=10,duration_threshold=pd.offsets.Milli(50),Filter=simi.signal.Smooth(11,'hamming'))
+video_keys = ['monkey','injection','condition','front','scrambled','treatment','video_file','block']
+fixslide_keys = ['monkey','injection','treatment','fixation_slide','block']
+
+saccade_data = pd.concat({idx: simi.analysis.DetectSaccades(data.reset_index().set_index('time').loc[:, ['eyeh','eyev']],**detect_saccades_kwargs) for idx, data in eye_data_block.groupby(video_keys)},names=video_keys)
+saccade_data = saccade_data.query('peak_radial_velocity<1500')
+saccade_data.to_hdf(key='saccade_data', **hdf_kwargs)
+fixslide_saccade_data = pd.concat({idx: simi.analysis.DetectSaccades(data.reset_index().set_index('time').loc[:, ['eyeh','eyev']],**detect_saccades_kwargs) for idx, data in eye_data_block_fix.groupby(fixslide_keys)},names=fixslide_keys)
+fixslide_saccade_data = fixslide_saccade_data.query('peak_radial_velocity<1500')
+fixslide_saccade_data.to_hdf(key='fixslide_saccade_data', **hdf_kwargs)
+
+fixation_data = pd.concat({idx: simi.analysis.DetectFixations(data.reset_index().set_index('time').loc[:, ['eyeh','eyev']],**detect_fixations_kwargs) for idx, data in eye_data_block.groupby(video_keys)},names=video_keys)
+fixation_data.to_hdf(key='fixation_data', **hdf_kwargs)
+fixslide_fixation_data = pd.concat({idx: simi.analysis.DetectFixations(data.reset_index().set_index('time').loc[:, ['eyeh','eyev']],**detect_fixations_kwargs) for idx, data in eye_data_block_fix.groupby(fixslide_keys)},names=fixslide_keys)
+fixslide_fixation_data.to_hdf(key='fixslide_fixation_data', **hdf_kwargs)

+ 55 - 0
plots.py

@@ -0,0 +1,55 @@
+import pandas as pd 
+import numpy as np 
+import matplotlib.pyplot as plt
+
+hdf_path = 'Data.h5'
+fixation_data = pd.read_hdf(hdf_path, 'fixation_data')
+fixslide_fixation_data = pd.read_hdf(hdf_path, 'fixslide_fixation_data')
+saccade_data = pd.read_hdf(hdf_path, 'saccade_data')
+fixslide_saccade_data = pd.read_hdf(hdf_path, 'fixslide_saccade_data')
+
+monkeys = ['Ned','Apu','Marge','Lenny','Walter']
+monkey_color_map=dict(zip(monkeys, 'gbcmk'))
+
+fixations = {
+    'front': fixation_data.reset_index().query('front and not scrambled'),
+    'side': fixation_data.reset_index().query('not front and not scrambled'),
+    'scrambled': fixation_data.reset_index().query('scrambled'),
+    'fix_slide': fixslide_fixation_data
+}
+saccades = {
+    'front': saccade_data.reset_index().query('front and not scrambled'),
+    'side': saccade_data.reset_index().query('not front and not scrambled'),
+    'scrambled': saccade_data.reset_index().query('scrambled'),
+    'fix_slide': fixslide_saccade_data
+}
+
+fig, axes = plt.subplots(4, 1, figsize=(3,7), sharex=True, sharey=True)
+conditions = ['fix_slide', 'scrambled', 'front', 'side']
+for condition, ax in zip(conditions, axes):
+    for monkey, data in fixations[condition].groupby('monkey').duration:
+        weights = np.ones_like(data) / data.size
+        counts, bin_edges = np.histogram(data, bins=15, range=(0,600), weights=weights)
+        x = np.mean([bin_edges[:-1], bin_edges[1:]], axis=0)
+        ax.plot(x, counts, c=monkey_color_map[monkey], marker='o', markersize=2.5)
+    ax.axvline(fixations[condition].groupby('monkey').duration.median().mean(), color='red')
+    ax.set_title(condition)
+    ax.set_ylabel('Proportion')
+    ax.spines['right'].set_visible(False)
+    ax.spines['top'].set_visible(False)
+fig.savefig(f'FixationDuration.png')
+
+fig, axes = plt.subplots(4, 1, figsize=(3,7), sharex=True, sharey=True)
+conditions = ['fix_slide', 'scrambled', 'front', 'side']
+for condition, ax in zip(conditions, axes):
+    for monkey, data in saccades[condition].groupby('monkey').amplitude:
+        weights = np.ones_like(data) / data.size
+        counts, bin_edges = np.histogram(data, bins=8, range=(0,16), weights=weights)
+        x = np.mean([bin_edges[:-1], bin_edges[1:]], axis=0)
+        ax.plot(x, counts, c=monkey_color_map[monkey], marker='o', markersize=2.5)
+    ax.axvline(saccades[condition].groupby('monkey').amplitude.median().mean(), color='red')
+    ax.set_title(condition)
+    ax.set_ylabel('Proportion')
+    ax.spines['right'].set_visible(False)
+    ax.spines['top'].set_visible(False)
+fig.savefig(f'SaccadeAmplitude.png')