OSCR

The Absent P3a. Performance Monitoring ERPs Differentiate Trust in Humans and Autonomous Systems.

Code ↔ Paper

1 match between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 1 match
  1. [1] § Methods › EEG Recording and Preprocessing ↔ philistine/mne/_base.py, lines 374–409 · score 0.65 · EEG channels, rejected, voltage, MNE, Epochs, EOG

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 481 lines · 18 KB · BSD-3-Clause · 1 match

  1. # -*- coding: utf-8 -*-
  2. # Copyright (C) 2017-2023 Phillip Alday <[email hidden]>
  3. # License: BSD (3-clause)
  4. """MNE-based functionality not further categorized."""
  5. from collections import namedtuple # noqa: I100
  6. import matplotlib.pyplot as plt
  7. import mne # noqa: F401
  8. import numpy as np
  9. import pandas as pd
  10. from scipy import stats
  11. from scipy.ndimage import center_of_mass
  12. from scipy.signal import argrelmin, savgol_filter
  13. IafEst = namedtuple('IAFEstimate',
  14. ['PeakAlphaFrequency', 'CenterOfGravity', 'AlphaBand'])
  15. def savgol_iaf(raw, picks=None, # noqa: C901
  16. fmin=None, fmax=None,
  17. resolution=0.25,
  18. average=True,
  19. ax=None,
  20. window_length=11, polyorder=5,
  21. pink_max_r2=0.9):
  22. """Estimate individual alpha frequency (IAF).
  23. Parameters
  24. ----------
  25. raw : instance of Raw
  26. The raw data to do these estimations on.
  27. picks : array-like of int | None
  28. List of channels to use.
  29. fmin : int | None
  30. Lower bound of alpha frequency band. If None, it will be
  31. empirically estimated using a polynomial fitting method to
  32. determine the edges of the central parabolic peak density,
  33. with assumed center of 10 Hz.
  34. fmax : int | None
  35. Upper bound of alpha frequency band. If None, it will be
  36. empirically estimated using a polynomial fitting method to
  37. determine the edges of the central parabolic peak density,
  38. with assumed center of 10 Hz.
  39. resolution : float
  40. The resolution in the frequency domain for calculating the PSD.
  41. average : bool
  42. Whether to average the PSD estimates across channels or provide
  43. a separate estimate for each channel. Currently, only True is
  44. supported.
  45. ax : instance of matplotlib Axes | None | False
  46. Axes to plot PSD analysis into. If None, axes will be created
  47. (and plot not shown by default). If False, no plotting will be done.
  48. window_length : int
  49. Window length in samples to use for Savitzky-Golay smoothing of
  50. PSD when estimating IAF.
  51. polyorder : int
  52. Polynomial order to use for Savitzky-Golay smoothing of
  53. PSD when estimating IAF.
  54. pink_max_r2 : float
  55. Maximum R^2 allowed when comparing the PSD distribution to the
  56. pink noise 1/f distribution on the range 1 to 30 Hz.
  57. If this threshold is exceeded, then IAF is assumed unclear and
  58. None is returned for both PAF and CoG.
  59. Returns
  60. -------
  61. IafEst : instance of ``collections.namedtuple`` called IAFEstimate
  62. Named tuple with fields for the peak alpha frequency (PAF),
  63. alpha center of gravity (CoG), and the bounds of the alpha band
  64. (as a tuple).
  65. Notes
  66. -----
  67. Based on method developed by
  68. `Andrew Corcoran <https://zenodo.org/badge/latestdoi/80904585>`_.
  69. In addition to appropriate software citation (Zenodo DOI or
  70. git commit), please cite:
  71. Corcoran, A. W., Alday, P. M., Schlesewsky, M., &
  72. Bornkessel-Schlesewsky, I. (2018). Toward a reliable, automated method
  73. of individual alpha frequency (IAF) quantification. Psychophysiology,
  74. e13064. doi:10.1111/psyp.13064
  75. """
  76. n_fft = int(raw.info['sfreq'] / resolution)
  77. spectrum = raw.compute_psd(method="welch", picks=picks, n_fft=n_fft,
  78. fmin=1., fmax=30.)
  79. psd = spectrum.get_data()
  80. freqs = spectrum.freqs
  81. if ax is None:
  82. fig = plt.figure() # noqa: F841
  83. ax = plt.gca()
  84. if average:
  85. psd = np.mean(psd, axis=0)
  86. if fmin is None or fmax is None:
  87. if fmin is None:
  88. fmin_bound = 5
  89. else:
  90. fmin_bound = fmin
  91. if fmax is None:
  92. fmax_bound = 15
  93. else:
  94. fmax_bound = fmax
  95. alpha_search = np.logical_and(freqs >= fmin_bound,
  96. freqs <= fmax_bound)
  97. freqs_search = freqs[alpha_search]
  98. psd_search = savgol_filter(psd[alpha_search],
  99. window_length=psd[alpha_search].shape[0],
  100. polyorder=10)
  101. # argrel min returns a tuple, so we flatten that with [0]
  102. # then we get the last element of the resulting array with [-1]
  103. # which is the minimum closest to the 'median' alpha of 10 Hz
  104. if fmin is None:
  105. try:
  106. left_min = argrelmin(psd_search[freqs_search < 10])[0][-1]
  107. fmin = freqs_search[freqs_search < 10][left_min]
  108. except IndexError:
  109. raise ValueError("Unable to automatically determine lower end of alpha band.") # noqa: 501
  110. if fmax is None:
  111. # here we want the first element of the array which is closest to
  112. # the 'median' alpha of 10 Hz
  113. try:
  114. right_min = argrelmin(psd_search[freqs_search > 10])[0][0]
  115. fmax = freqs_search[freqs_search > 10][right_min]
  116. except IndexError:
  117. raise ValueError("Unable to automatically determine upper end of alpha band.") # noqa: 501
  118. psd_smooth = savgol_filter(psd,
  119. window_length=window_length,
  120. polyorder=polyorder)
  121. alpha_band = np.logical_and(freqs >= fmin, freqs <= fmax)
  122. slope, intercept, r, p, se = stats.linregress(np.log(freqs),
  123. np.log(psd_smooth))
  124. if r**2 > pink_max_r2:
  125. paf = None
  126. cog = None
  127. else:
  128. paf_idx = np.argmax(psd_smooth[alpha_band])
  129. paf = freqs[alpha_band][paf_idx]
  130. cog_idx = center_of_mass(psd_smooth[alpha_band])
  131. try:
  132. cog_idx = int(np.round(cog_idx[0]))
  133. cog = freqs[alpha_band][cog_idx]
  134. except ValueError:
  135. cog = None
  136. # set PAF to None as well, because this is a pathological case
  137. paf = None
  138. if ax:
  139. plt_psd, = ax.plot(freqs, psd, label="Raw PSD")
  140. plt_smooth, = ax.plot(freqs, psd_smooth, label="Smoothed PSD")
  141. plt_pink, = ax.plot(freqs,
  142. np.exp(slope * np.log(freqs) + intercept),
  143. label='$1/f$ fit ($R^2={:0.2}$)'.format(r**2))
  144. try:
  145. plt_search, = ax.plot(freqs_search, psd_search,
  146. label='Alpha-band Search Parabola')
  147. ax.legend(handles=[plt_psd, plt_smooth, plt_search, plt_pink])
  148. except UnboundLocalError:
  149. # this happens when the user fully specified an alpha band
  150. ax.legend(handles=[plt_psd, plt_smooth, plt_pink])
  151. ax.set_ylabel("PSD")
  152. ax.set_xlabel("Hz")
  153. return IafEst(paf, cog, (fmin, fmax))
  154. def attenuation_iaf(raws, picks=None, # noqa: C901
  155. fmin=None, fmax=None,
  156. resolution=0.25,
  157. average=True,
  158. ax=None,
  159. savgol=False,
  160. window_length=11, polyorder=5,
  161. flat_max_r=0.98):
  162. """Estimate individual alpha frequency (IAF).
  163. Parameters
  164. ----------
  165. raws : list-like of Raw
  166. Two Raws to calculate IAF from difference (attenuation) in PSD from.
  167. picks : array-like of int | None
  168. List of channels to use.
  169. fmin : int | None
  170. Lower bound of alpha frequency band. If None, it will be
  171. empirically estimated using a polynomial fitting method to
  172. determine the edges of the central parabolic peak density,
  173. with assumed center of 10 Hz.
  174. fmax : int | None
  175. Upper bound of alpha frequency band. If None, it will be
  176. empirically estimated using a polynomial fitting method to
  177. determine the edges of the central parabolic peak density,
  178. with assumed center of 10 Hz.
  179. resolution : float
  180. The resolution in the frequency domain for calculating the PSD.
  181. average : bool
  182. Whether to average the PSD estimates across channels or provide
  183. a separate estimate for each channel. Currently, only True is
  184. supported.
  185. ax : instance of matplotlib Axes | None | False
  186. Axes to plot PSD analysis into. If None, axes will be created
  187. (and plot not shown by default). If False, no plotting will be done.
  188. savgol : False | 'each' | 'diff'
  189. Use Savitzky-Golay filtering to smooth PSD estimates -- either applied
  190. to either each PSD estimate or to the difference (i.e. the attenuation
  191. estimate).
  192. window_length : int
  193. Window length in samples to use for Savitzky-Golay smoothing of
  194. PSD when estimating IAF.
  195. polyorder : int
  196. Polynomial order to use for Savitzky-Golay smoothing of
  197. PSD when estimating IAF.
  198. flat_max_r: float
  199. Maximum (Pearson) correlation allowed when comparing the raw PSD
  200. distributions to each other in the range 1 to 30 Hz.
  201. If this threshold is exceeded, then IAF is assumed unclear and
  202. None is returned for both PAF and CoG. Note that the sign of the
  203. coefficient is ignored.
  204. Returns
  205. -------
  206. IafEst : instance of ``collections.namedtuple`` called IAFEstimate
  207. Named tuple with fields for the peak alpha frequency (PAF),
  208. alpha center of gravity (CoG), and the bounds of the alpha band
  209. (as a tuple).
  210. Notes
  211. -----
  212. Based on method developed by
  213. `Andrew Corcoran <https://zenodo.org/badge/latestdoi/80904585>`_.
  214. In addition to appropriate software citation (Zenodo DOI or
  215. git commit), please cite:
  216. Corcoran, A. W., Alday, P. M., Schlesewsky, M., &
  217. Bornkessel-Schlesewsky, I. (2018). Toward a reliable, automated method
  218. of individual alpha frequency (IAF) quantification. Psychophysiology,
  219. e13064. doi:10.1111/psyp.13064
  220. """
  221. # TODO: check value of savgol parameter
  222. def psd_est(r):
  223. n_fft = int(r.info['sfreq'] / resolution)
  224. spectrum = r.compute_psd(method="welch", picks=picks, n_fft=n_fft,
  225. fmin=1., fmax=30.)
  226. psd = spectrum.get_data()
  227. freqs = spectrum.freqs
  228. return psd, freqs
  229. psd, freqs = zip(*[psd_est(r) for r in raws])
  230. assert np.allclose(*freqs)
  231. if savgol == 'each':
  232. psd = [savgol_filter(p,
  233. window_length=window_length,
  234. polyorder=polyorder) for p in psd]
  235. att_psd = psd[1] - psd[0]
  236. if average:
  237. att_psd = np.mean(att_psd, axis=0)
  238. psd = [np.mean(p, axis=0) for p in psd]
  239. att_psd = np.abs(att_psd)
  240. att_freqs = freqs[0]
  241. if ax is None:
  242. fig = plt.figure() # noqa: F841
  243. ax = plt.gca()
  244. if fmin is None or fmax is None:
  245. if fmin is None:
  246. fmin_bound = 5
  247. else:
  248. fmin_bound = fmin
  249. if fmax is None:
  250. fmax_bound = 15
  251. else:
  252. fmax_bound = fmax
  253. alpha_search = np.logical_and(att_freqs >= fmin_bound,
  254. att_freqs <= fmax_bound)
  255. freqs_search = att_freqs[alpha_search]
  256. # set the window to the entire interval
  257. # don't use the name window_length because that's used as a
  258. # parameter for the function as a whole
  259. wlen = att_psd[alpha_search].shape[0]
  260. psd_search = savgol_filter(att_psd[alpha_search],
  261. window_length=wlen,
  262. polyorder=10)
  263. # argrel min returns a tuple, so we flatten that with [0]
  264. # then we get the last element of the resulting array with [-1]
  265. # which is the minimum closest to the 'median' alpha of 10 Hz
  266. if fmin is None:
  267. try:
  268. left_min = argrelmin(psd_search[freqs_search < 10])[0][-1]
  269. fmin = freqs_search[freqs_search < 10][left_min]
  270. except IndexError:
  271. raise ValueError("Unable to automatically determine lower end of alpha band.") # noqa: 501
  272. if fmax is None:
  273. # here we want the first element of the array which is closest to
  274. # the 'median' alpha of 10 Hz
  275. try:
  276. right_min = argrelmin(psd_search[freqs_search > 10])[0][0]
  277. fmax = freqs_search[freqs_search > 10][right_min]
  278. except IndexError:
  279. raise ValueError("Unable to automatically determine upper end of alpha band.") # noqa: 501
  280. if savgol == 'diff':
  281. att_psd = savgol_filter(att_psd,
  282. window_length=window_length,
  283. polyorder=polyorder)
  284. alpha_band = np.logical_and(att_freqs >= fmin, att_freqs <= fmax)
  285. r, p = stats.pearsonr(psd[0], psd[1])
  286. if np.abs(r) > np.abs(flat_max_r):
  287. paf = None
  288. cog = None
  289. else:
  290. paf_idx = np.argmax(att_psd[alpha_band])
  291. # print(att_psd[alpha_band])
  292. # print(paf_idx)
  293. # print(att_freqs[alpha_band])
  294. paf = att_freqs[alpha_band][paf_idx]
  295. cog_idx = center_of_mass(att_psd[alpha_band])
  296. cog_idx = int(np.round(cog_idx[0]))
  297. cog = att_freqs[alpha_band][cog_idx]
  298. if ax:
  299. sgnote = '(with SG-Smoothing)' if savgol == 'each' else ''
  300. plt_psd1, = ax.plot(freqs[0], psd[0],
  301. label="Raw PSD #1 {}".format(sgnote))
  302. plt_psd2, = ax.plot(freqs[1], psd[1],
  303. label="Raw PSD #2 {}".format(sgnote))
  304. sgnote = '(with SG-Smoothing)' if savgol == 'diff' else ''
  305. plt_att_psd, = ax.plot(att_freqs, att_psd,
  306. label="Attenuated PSD {}".format(sgnote))
  307. # plt_pink, = ax.plot(att_freqs,
  308. # np.exp(slope * np.log(att_freqs) + intercept),
  309. # label='$1/f$ fit ($R^2={:0.2}$)'.format(r**2))
  310. ax.text(np.max(att_freqs) * 0.5, np.max(att_psd) * 0.67,
  311. 'Raw PSD Pearson $r={:0.2}$'.format(r))
  312. try:
  313. plt_search, = ax.plot(freqs_search, psd_search,
  314. label='Alpha-band Search Parabola')
  315. ax.legend(handles=[plt_psd1, plt_psd2, plt_att_psd, plt_search])
  316. except UnboundLocalError:
  317. # this happens when the user fully specified an alpha band
  318. ax.legend(handles=[plt_psd1, plt_psd2, plt_att_psd])
  319. ax.set_ylabel("PSD")
  320. ax.set_xlabel("Hz")
  321. return IafEst(paf, cog, (fmin, fmax))
  322. def abs_threshold(epochs, threshold,
  323. eeg=True, eog=False, misc=False, stim=False):
  324. """Compute mask for dropping epochs based on absolute voltage threshold.
  325. Parameters
  326. ----------
  327. epochs : instance of Epochs
  328. The epoched data to do threshold rejection on.
  329. threshold : float
  330. The absolute threshold (in *volts*) to reject at.
  331. eeg : bool
  332. If True include EEG channels in thresholding procedure.
  333. eog : bool
  334. If True include EOG channels in thresholding procedure.
  335. misc : bool
  336. If True include miscellaneous channels in thresholding procedure.
  337. stim : bool
  338. If True include stimulus channels in thresholding procedure.
  339. Returns
  340. -------
  341. rej : instance of ndarray
  342. Boolean mask for whether or not the epochs exceeded the rejection
  343. threshold at any time point for any channel.
  344. Notes
  345. -----
  346. More precise selection of channels can be performed by passing a
  347. 'reduced' Epochs instance from the various ``picks`` methods.
  348. """
  349. data = epochs.pick_types(eeg=eeg, misc=misc, stim=stim).get_data()
  350. # channels and times are last two dimension in MNE ndarrays,
  351. # and we collapse across them to get a (n_epochs,) shaped array
  352. rej = np.any( np.abs(data) > threshold, axis=(-1, -2) ) # noqa: E201, E202
  353. return rej
  354. def retrieve(epochs, windows, items=None,
  355. summary_fnc=dict(mean=np.mean), **kwargs):
  356. """Retrieve summarized epoch data for further statistical analysis.
  357. Parameters
  358. ----------
  359. epochs : instance of Epochs
  360. The epoched data to extract windowed summary statistics from.
  361. windows : dict of tuples
  362. Named tuples defining time windows for extraction (relative to
  363. epoch-locking event). Units are dependent on the keyword argument
  364. scale_time. Default is milliseconds.
  365. summary_fnc : dict of functions
  366. Functions to apply to generate summary statistics in each time
  367. window. The keys serve as column names.
  368. items : ndarray | None
  369. Items corresponding to the individual epoch / trials (for
  370. e.g. repeated measure designs). Shape should be (n_epochs,). If
  371. None (default), then item numbers will not be included in the
  372. generated data frame.
  373. kwargs :
  374. Keyword arguments to pass to Epochs.to_data_frame. Particularly
  375. relevant are ``scalings`` and ``scale_time``.
  376. Returns
  377. -------
  378. dat : instance of pandas.DataFrame
  379. Long-format data frame of summarized data
  380. """
  381. df = epochs.to_data_frame(index=['epoch', 'time'], **kwargs)
  382. chs = [c for c in df.columns if c not in ('condition')]
  383. # the order is important here!
  384. # otherwise the shortcut with items later won't work
  385. factors = ['epoch', 'condition']
  386. sel = factors + chs
  387. df = df.reset_index()
  388. id_vars = ['epoch', 'condition', 'win', 'wname']
  389. if items is not None:
  390. id_vars += ['item']
  391. dat = pd.DataFrame(columns=id_vars)
  392. for fnc_name, fnc in summary_fnc.items():
  393. d = []
  394. for w in windows:
  395. temp = df[ df.time >= windows[w][0] ] # noqa: E201, E202
  396. dfw = temp[ temp.time <= windows[w][1] ] # noqa: E201, E202
  397. dfw_summary = dfw[sel].groupby(factors).apply(fnc)
  398. if items is not None:
  399. dfw_summary["item"] = items
  400. dfw_summary["win"] = "{}..{}".format(*windows[w])
  401. dfw_summary["wname"] = w
  402. d.append(dfw_summary)
  403. d = pd.concat(d)
  404. # get rid of epoch and condition if they're already columns
  405. # before we can move them from the index to columns
  406. d.drop('epoch', axis=1, inplace=True, errors='ignore')
  407. d.drop('condition', axis=1, inplace=True, errors='ignore')
  408. d.reset_index(inplace=True)
  409. d = pd.melt(d,
  410. id_vars=id_vars,
  411. value_vars=chs,
  412. var_name="channel",
  413. value_name=fnc_name)
  414. dat = pd.merge(dat, d, how='outer')
  415. return dat

_base.py at commit 1f4613b, under BSD-3-Clause · at the source

Overview

Authors: Daniel A Rogers1, Kirsty J Brooks2, Anthony Finn3, Matthias Schlesewsky4, Markus Ullsperger5,6, Ina Bornkessel‐Schlesewsky1
ORCID iDs: Daniel A Rogers
  1. School of Psychology, Adelaide University, Adelaide, Australia
  2. Department of Experimental Psychology, Ludwig Maximilian University of Munich, Munich, Germany
  3. School of Electrical and Mechanical Engineering, Adelaide University, Adelaide, Australia
  4. Australian Research Center for Interactive and Virtual Environments, University of South Australia, Adelaide, Australia
  5. Institute of Psychology, Otto von Guericke University Magdeburg, Magdeburg, Germany
  6. Center for Behavioral Brain Sciences Magdeburg, Magdeburg, Germany
Journal: Psychophysiology, volume 63, issue 7, article e70354
Dates: received 10 June 2025; accepted 23 June 2026; published online 10 July 2026; in print July 2026
Type: Research article · Language: English
License: CC BY-NC
Identifiers: DOI 10.1111/psyp.70354 · PMID 42429322 · PMCID PMC13353041 · OpenAlex W7167899374
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: EEG (modality), human (organism), cognitive (subfield)
Methods: Spectral & time-frequency, Smoothing, state filtering, decompositions, Preprocessing, Evoked potentials, Statistics
Keywords: automation complacency, feedback‐related negativity, P3, P3a, performance monitoring, social neuroscience, trust in automation
MeSH: Brain*, Event-Related Potentials, P300*, Psychomotor Performance*, Trust*, Adult, Electroencephalography, Feedback, Sensory, Female, Humans, Male, Young Adult (* major topic)
Topic: Human-Automation Interaction and Safety (Social Psychology, Psychology), according to OpenAlex
Funding: Australian Government Research Training Program
Citations: not cited yet (Europe PMC); 65 references in the paper

Abstract

To address suggestions that human brain responses to autonomous system errors may be used as brain‐based measures of trust in automation, the present study asked participants to monitor the performance of either a virtual human or an autonomous system partner performing a novel, complex, real‐world image classification task. We predicted visual feedback of partner errors would elicit the feedback‐related negativity and P3 ERP components, and that these components would differ between the human and system groups. Behavioral results showed that while participants calibrated their trust in their partner according to our intended manipulation of error rates, no group differences were found. The ERP data, however, revealed FRN and P3 effects for both groups, modulated by accuracy and error rate. An unexpected finding was that the P3 topography differed between groups, with both a frontal P3a and posterior P3b component seen for the human condition, while for the system condition only the posterior P3b was observed and the P3a was completely absent. We suggest that this selective absence of the P3a may reflect reduced frontal attention during system monitoring in passive task conditions potentially resulting from reduced social and emotional processing for the system partner. This study demonstrates the potential for EEG‐based measures of trust in automation to surpass the sensitivity of traditional measures of trust while additionally uncovering a potential neural signature of automation complacency in the absent P3a. This identifies potential boundary conditions under which the application of human correlates of performance monitoring may not apply to the monitoring of an automated system.

Reproduced under the paper's license (CC BY-NC), from the paper cited above.

Repositories

Its files are read in the Code ↔ Paper reader above, with 1 match between paragraphs and lines of code.

Zenodo 7535495

License: other-open
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Size: 1 file
Software Heritage: not checked
Found in: the references
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: MNE-Python (6 files), NumPy (6 files), pandas (2 files), Matplotlib (1 file), SciPy (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)
15 files
At the source:

palday/philistine

License: BSD-3-Clause
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 1f4613b9a15e1e0910056644a2a6bb8b0a1ab2c7, 13 January 2023
Languages: Python (13)
Size: 27 files, 13 scripts
Software Heritage: archived
Found in: the Zenodo archive record
Holds: README, license file, environment (requirements.txt, setup.cfg, setup.py), tests, continuous integration, documentation
Not found: CITATION.cff
Tools: MNE-Python (6 files), NumPy (6 files), pandas (2 files), Matplotlib (1 file), SciPy (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
15 files

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 26 scripts, each with its path and the digest of its content;
  • 1 match between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

No dataset and no data link were found in the paper.

Data Availability Statement

The data that support the findings of this study are available from the corresponding author upon reasonable request.

Reproduced under the paper's license (CC BY-NC), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 2, 28 September 2026

  • Publisher: — → Wiley

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 6 authors, 7 keywords, 11 MeSH terms, 1 funder, 53 references.

Cite

This paper

Rogers, D. A., Brooks, K. J., Finn, A., Schlesewsky, M., Ullsperger, M., & Bornkessel‐Schlesewsky, I. (2026). The Absent P3a. Performance Monitoring ERPs Differentiate Trust in Humans and Autonomous Systems. Psychophysiology, 63(7), e70354. https://doi.org/10.1111/psyp.70354

BibTeX

@article{rogers2026absent,
author = {Rogers, Daniel A and Brooks, Kirsty J and Finn, Anthony and Schlesewsky, Matthias and Ullsperger, Markus and Bornkessel‐Schlesewsky, Ina},
title = {{The Absent P3a. Performance Monitoring ERPs Differentiate Trust in Humans and Autonomous Systems}},
journal = {Psychophysiology},
year = {2026},
month = jul,
volume = {63},
number = {7},
pages = {e70354},
publisher = {Wiley},
issn = {0048-5772},
doi = {10.1111/psyp.70354},
url = {https://doi.org/10.1111/psyp.70354},
pmid = {42429322},
pmcid = {PMC13353041}
}

RIS

TY - JOUR
AU - Rogers, Daniel A
AU - Brooks, Kirsty J
AU - Finn, Anthony
AU - Schlesewsky, Matthias
AU - Ullsperger, Markus
AU - Bornkessel‐Schlesewsky, Ina
TI - The Absent P3a. Performance Monitoring ERPs Differentiate Trust in Humans and Autonomous Systems
T2 - Psychophysiology
J2 - Psychophysiology
PY - 2026
DA - 2026/07/01
VL - 63
IS - 7
SP - e70354
SN - 0048-5772
PB - Wiley
DO - 10.1111/psyp.70354
UR - https://doi.org/10.1111/psyp.70354
LA - en
ER -

CSL-JSON

{
"id": "10.1111/psyp.70354",
"type": "article-journal",
"title": "The Absent P3a. Performance Monitoring ERPs Differentiate Trust in Humans and Autonomous Systems",
"container-title": "Psychophysiology",
"author": [
{
"family": "Rogers",
"given": "Daniel A"
},
{
"family": "Brooks",
"given": "Kirsty J"
},
{
"family": "Finn",
"given": "Anthony"
},
{
"family": "Schlesewsky",
"given": "Matthias"
},
{
"family": "Ullsperger",
"given": "Markus"
},
{
"family": "Bornkessel‐Schlesewsky",
"given": "Ina"
}
],
"container-title-short": "Psychophysiology",
"volume": "63",
"issue": "7",
"page": "e70354",
"DOI": "10.1111/psyp.70354",
"PMID": "42429322",
"PMCID": "PMC13353041",
"ISSN": "0048-5772",
"publisher": "Wiley",
"URL": "https://doi.org/10.1111/psyp.70354",
"language": "en",
"issued": {
"date-parts": [
[
2026,
7,
1
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1162/imag.a.1321 [code]
Phase similarity between similar objects indicates representational merging across retrieval training but not sleep.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: MNE-Python, pandas, SciPy, 2 other tools, EEG, cognitive, 2 references
[2] doi:10.1167/jov.26.8.4 [code]
The neural processes of illusory occlusion in object recognition.
Journal: Journal of vision
In common: MNE-Python, pandas, SciPy, 2 other tools, EEG, cognitive, 1 reference
[3] doi:10.1097/j.pain.0000000000004044 [code]
No effect of rhythmic visual stimulation on experimental pain perception.
Journal: Pain
In common: MNE-Python, pandas, SciPy, 2 other tools, EEG, cognitive, 1 reference
[4] doi:10.1371/journal.pone.0350140 [code]
Signal combination in flutter vibration perception.
Journal: PloS one
In common: MNE-Python, pandas, SciPy, 2 other tools, EEG, cognitive, 1 reference
[5] doi:10.1038/s42003-026-10394-7 [code]
Cognitive load weakens neural speech tracking without altering response timing.
Journal: Communications biology
In common: MNE-Python, pandas, SciPy, 2 other tools, EEG, cognitive, 1 reference
[6] doi:10.1186/s11689-026-09706-z [code]
Neural oscillatory dynamics reveal altered top-down and integrative mechanisms during face processing in autistic children and unaffected siblings of autistic children.
Journal: Journal of neurodevelopmental disorders
In common: MNE-Python, pandas, SciPy, 2 other tools, EEG, cognitive, 1 reference
[7] doi:10.1111/ejn.70538 [code]
Neural Tracking of Sustained Attention, Attention Switching, and Natural Conversation in Audiovisual Environments Using Wearable EEG.
Journal: The European journal of neuroscience
In common: MNE-Python, pandas, SciPy, 2 other tools, EEG, cognitive, 1 reference
[8] doi:10.1162/imag.a.105 [code]
Right posterior theta reflects human parahippocampal phase resetting by salient cues during goal-directed navigation
Journal: —
In common: MNE-Python, pandas, SciPy, 2 other tools, EEG, cognitive, 1 reference
[9] doi:10.3389/fnhum.2026.1869918 [code]
Single-subject auditory ERP-BCI performance enhancement in ALS via an AI coding assistant prompt.
Journal: Frontiers in human neuroscience
In common: MNE-Python, pandas, SciPy, 2 other tools, EEG, 1 reference
[10] doi:10.1162/nol.a.247 [code]
Same Sentences, Different Grammars, Different Brain Responses?: An MEG Study on Case and Agreement Encoding in Hindi and Nepali Split-Ergative Structures.
Journal: Neurobiology of language (Cambridge, Mass.)
In common: MNE-Python, pandas, SciPy, 2 other tools, 2 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.