---
title: "Preparing and auditing pupil time courses"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Preparing and auditing pupil time courses}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 7,
  fig.height = 4.5
)
library(gp3bayes)
```

## Preparation is not preprocessing automation

`prepare_pupil_timecourse()` validates declared columns and records only
transformations explicitly requested by the analyst. It does not detect or
repair blinks, interpolate missing values, smooth traces, select an eye, or
choose a baseline window.

```{r prep-example}
sim <- simulate_pupil_timecourse(
  n_participants = 5,
  trials_per_participant = 4,
  sampling_frequency = 20,
  time_window = c(-0.5, 1.5),
  seed = 14
)
contract <- create_pupil_contract(
  outcome_col = "pupil_mm",
  participant_col = "participant_id",
  trial_col = "trial_id",
  item_col = "item_id",
  condition_col = "condition",
  time_col = "event_time",
  pupil_unit = "millimetres",
  sampling_frequency = 20,
  eye = "combined",
  blink_col = "blink",
  interpolation_col = "interpolated",
  gaze_x_col = "gaze_x",
  gaze_y_col = "gaze_y",
  luminance_col = "luminance",
  baseline_window = c(-0.5, 0),
  baseline_method = "none",
  preprocessing_provenance = "deterministic synthetic example"
)
prepared <- prepare_pupil_timecourse(sim$data, contract)
prepared
```

## Explicit baseline transformation

A baseline operation is performed only when requested, and the declared
baseline window must be available. Data already declared as baseline-adjusted
cannot be baseline-adjusted a second time.

```{r prep-baseline}
baseline_prepared <- prepare_pupil_timecourse(
  sim$data,
  contract,
  baseline_operation = "subtract",
  baseline_window = c(-0.5, 0)
)
head(baseline_prepared$transformation_log)
```

The raw declared pupil value remains linked to the model value in the
prepared object.

## Readiness evidence

```{r readiness}
readiness <- audit_pupil_readiness(prepared)
pupil_readiness_table(readiness, "summary")
head(pupil_readiness_table(readiness, "participant"))
head(pupil_readiness_table(readiness, "trial"))
```

The audit reports sample support, sampling intervals, missingness, baseline
coverage, indicators, gaze/luminance availability, and related measurement
context. It does not remove observations.

## Measurement-context audit

```{r measurement}
measurement <- audit_pupil_measurement_context(prepared)
pupil_measurement_audit_table(measurement)
```

PFE status is carried from the contract. Gaze coordinates are evidence about
measurement context and can be declared as nuisance covariates or used in
sensitivity scenarios, but this foundation does not implement a universal PFE
correction.
