---
title: "Advanced pupillometry representations and confound control"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Advanced pupillometry representations and confound control}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>", eval = FALSE)
library(eyeprocess)
```

## Frequency/activity features

```{r}
freq <- pupil_frequency_features(
  samples,
  by = c("person_id", "trial_id"),
  time = "time_ms", pupil = "pupil_gaze_corrected_bc",
  sampling_rate_hz = 60
)
plot(freq)
```

`pupil_activity_index()` exposes transparent velocity, low/high-frequency contrast, and RIPA-style proxy representations. The package deliberately avoids presenting these as pure cognitive-load measures.

## Event-related pupil deconvolution

```{r}
deconv <- fit_pupil_event_deconvolution(
  samples,
  by = c("person_id", "trial_id"),
  time = "time_ms", pupil = "pupil_gaze_corrected_bc",
  events = list(stimulus = 0, information = "information_onset_ms", action = "response_time_ms")
)

pupil_event_effects(deconv)
plot(deconv, type = "observed_fitted")
plot(deconv, type = "effects")
compare_pupil_kernels(samples, tmax_values = c(512, 930),
                      by = c("person_id", "trial_id"),
                      time = "time_ms", pupil = "pupil_gaze_corrected_bc",
                      events = list(stimulus = 0))
```

## Luminance and trial-order adjustment

```{r}
conf <- fit_pupil_confound_model(
  trial_data,
  pupil = "pupil_peak",
  luminance = "screen_luminance",
  trial_order = "trial_sequence",
  theta = "theta_hat",
  person = "person_id", item = "item_id"
)

adjust_pupil_confounds(conf)
pupil_confound_effects(conf)
compare_raw_adjusted_pupil(conf)
plot(conf, type = "raw_adjusted")
plot(conf, type = "theta_luminance_surface")
```

Adjusted values remain model-dependent and should be described as luminance/fatigue-adjusted, not as cognition isolated from all confounding.

## Robust filtering

```{r}
f <- filter_pupil_signal(raw_pupil, width = 9)
audit_signal_filter(f)
plot(f)
compare_signal_filters(raw_pupil)
```
