inst/doc/epoching.R

## ----results="hide", message=FALSE--------------------------------------------
# Import libraries required for the vignette
library(eyelinker)
library(dplyr)
library(stringr)
library(tidyr)
library(ggplot2)

## ----results="hide", message=FALSE--------------------------------------------
# Read in example data
fpath <- system.file("extdata/mono250.asc.gz", package = "eyelinker")
asc <- read_asc(fpath)

## -----------------------------------------------------------------------------
asc$msg

## -----------------------------------------------------------------------------
trial_phases <- asc$msg %>%
  mutate(
    phase = case_when(
      str_detect(text, "Initial_display") ~ "onset",
      str_detect(text, "Target_display") ~ "target_on",
      str_detect(text, "End_trial") ~ "trial_end"
    )
  ) %>%
  subset(!is.na(phase)) %>%
  select(-c(text)) %>%
  mutate(
    phase = as.factor(phase)
  )

## -----------------------------------------------------------------------------
trial_phases

## -----------------------------------------------------------------------------
sync_timestamps <- function(df, raw) {

  # Get tracker sample rate and block onset timestamps from raw pupil data
  ms_per_sample <- median(lead(raw$time)[1:10] - raw$time[1:10])
  block_onsets <- raw %>%
    group_by(block) %>%
    summarize(onset = time[1])

  # Adjust df so that its timestamps map onto the nearest sample timestamp
  df <- df %>%
    left_join(block_onsets, by = "block") %>%
    group_by(block) %>%
    mutate(
      time = round((time - onset) / ms_per_sample) * ms_per_sample + onset
    ) %>%
    select(-c(onset))

  df
}

trial_phases <- sync_timestamps(trial_phases, asc$raw)

## -----------------------------------------------------------------------------
rawdat <- asc$raw %>%
  left_join(trial_phases, by = c("block", "time")) %>%
  group_by(block) %>%
  fill(phase, .direction = "down")

## -----------------------------------------------------------------------------
rawdat <- rawdat %>%
  subset(!is.na(phase)) %>%
  group_by(block) %>%
  mutate(
    trialtime = time - time[1]
  )

## -----------------------------------------------------------------------------
rawdat

## ----fig.width=6, fig.height=4------------------------------------------------
# Plot pupil size across the first 4 trials, color-coding by phase
ggplot(subset(rawdat, block < 5), aes(x = trialtime, y = ps, color = phase)) +
  geom_line() +
  facet_wrap(~ block) +
  labs(color = "Phase") +
  ylab("Pupil Size") +
  xlab("Trial Time (ms)")

## -----------------------------------------------------------------------------
get_epochs <- function(msg, start, end = NULL, pad = c(0, 0)) {
  end <- ifelse(is.null(end), start, end)
  epochs <- msg %>%
    group_by(block) %>%
    # Select start/end event messages for each trial
    filter(grepl(start, text) | grepl(end, text)) %>%
    # If start != end and trial has no end event, discard trial
    filter(n() >= ifelse(start == end, 1, 2)) %>%
    # Get start and end timestamps for each trial, adding padding
    summarize(
      start = time[grepl(start, text)] - pad[1],
      end = time[grepl(end, text)] + pad[2],
    )
  epochs
}

within_epoch <- function(time, epochs) {
  time %within% cbind(epochs$start, epochs$end)
}

## -----------------------------------------------------------------------------
# Get the window of data between the trial start and end events for each trial
trial_windows <- get_epochs(asc$msg, start = "Initial", end = "End")

# Get the window of data 100 ms pre-target to 200 ms post-target for each trial
target_windows <- get_epochs(asc$msg, start = "Target", pad = c(100, 200))

## -----------------------------------------------------------------------------
raw_trial <- asc$raw %>%
  filter(within_epoch(time, trial_windows))

raw_target <- asc$raw %>%
  filter(within_epoch(time, target_windows))

## -----------------------------------------------------------------------------
raw_target %>%
  group_by(block) %>%
  summarize(duration = max(time) - min(time))

## -----------------------------------------------------------------------------
post_target <- get_epochs(asc$msg, start = "Target", end = "End")

asc$sacc %>%
  filter(within_epoch(stime, post_target))

Try the eyelinker package in your browser

Any scripts or data that you put into this service are public.

eyelinker documentation built on Feb. 24, 2026, 1:06 a.m.