Аппаратная синхронизация для научного эксперимента

Я новичок в Python, а также научных экспериментальных установок. Моя экспериментальная установка включает в себя то, что субъектам будут показаны некоторые визуальные стимулы, которые запрограммированы на Python. Пока субъекты смотрят на эти зрительные стимулы, данные их глаз будут записываться с использованием трекера глаз ( Pupil Labs). Pupil Labs является платформой с открытым исходным кодом, она также предоставляет эту возможность для передачи данных (например, взглядов или движений глаз) на сервер с использованием сокета TCP.

Теперь я планирую регистрировать все данные, например, когда отображаются определенные стимулы, а также регистрировать данные движения глаз, полученные от сервера. Проблема состоит в том, чтобы синхронизировать эти две вещи, например, в определенное время были показаны некоторые "xyz" стимулы, и я хочу записать, какие именно данные глаза были в это конкретное время.

Я пишу код на Python, так что пока что есть основная программа, которая показывает стимулы с использованием библиотеки психопии. В этой основной программе есть поток, который получает данные с сервера.

Я хочу знать, как я могу синхронизировать эту задачу. Я новичок в этой задаче, и я не уверен, что искать через Интернет. Буду благодарен за вашу помощь.

1 ответ

Решение

Глядя на документы, у событий отслеживания глаз Pupil Labs есть метка времени, установленная системными часами на вашем компьютере, относительно некоторого времени эпохи (1 января 1970 года в системах Unix). Точно так же вы можете найти метки времени для событий в pychopy, которые будут отображаться в ваших журналах экспериментов.

После того как вы собрали свои данные, прочитайте данные о ваших учениках и преобразуйте их в массивы (pupil_time, pupil_x и pupil_y). Следующая загрузка в ваши данные pyschopy. Временные метки в pyschopy могут быть сохранены относительно начала вашего эксперимента, и в этом случае вам придется добавить время начала эксперимента к времени представления стимула (время начала должно быть доступно где-то в сохраненных данных).

Учитывая массивы pupil_time, pupil_x, pupil_y, вы можете построить график движения зрачка во время эксперимента:

import matplotlib.pyplot as plt
import numpy as np

# time since stimulus presentation, in seconds
t = np.linspace(0, 4, 400)  

# time since stimulus presentation, relative to pupil data time
abs_t = t + stimulus_presentation_timestamp

# plot interpolated eye position from pupil data
px, py = np.interp(abs_t, pupil_time, pupil_x), np.interp(abs_t, pupil_time, pupil_y)
plt.plot(px, py)
plt.show()

Вы можете не захотеть интерполировать данные. Если программное обеспечение Pupil Labs записывает местоположение только после каждой саккады, то с помощью searchsorted найти последнее записанное местоположение зрачка до времени t может быть более подходящим.


Обновление 2016-05-23: используйте t_abs для интерполяции положения глаза

Другие вопросы по тегам