The neural processes of illusory occlusion in object recognition.
The 5 matches
- [1] § Methods › EEG recording and preprocessing ↔ eeg/data/functions.py, lines 30–175 · score 0.96 · low pass filter, 100–800 ms, raw EEG, MNE, stimulus onset, BioSemi
- [2] § Methods › EEG decoding analyses ↔ eeg/data/functions.py, lines 183–307 · score 0.66 · cross validation, linear discriminant, classifier, sequences, EEG, decoding
- [3] § Methods › Online behavioral experiments ↔ online/experiment1/experiment.js, lines 68–146 · score 0.54 · Western Sydney University, online, consent, behavioral experiments, Pavlovia, SONA
- [4] § Methods › EEG experiment ↔ online/experiment1/experiment.js, lines 68–146 · score 0.50 · Western Sydney University, consent, behavioral experiments, epilepsy, history, SONA
- [5] § Methods › EEG experiment ↔ online/experiment2/experiment.js, lines 123–178 · score 0.50 · Western Sydney University, consent, behavioral experiments, epilepsy, history, SONA
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 · 400 lines · 15 KB · no license · 2 matches
- import os
- import pandas as pd
- import numpy as np
- import matplotlib.pyplot as plt
- from tqdm import tqdm
- from sklearn.pipeline import make_pipeline
- from sklearn.preprocessing import StandardScaler
- from sklearn.linear_model import LogisticRegression,Ridge,LinearRegression
- from sklearn.model_selection import GroupKFold,LeaveOneGroupOut
- from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
- from sklearn.svm import LinearSVR,LinearSVC
- import mne
- from mne.decoding import (
- SlidingEstimator,
- GeneralizingEstimator,
- Scaler,
- cross_val_multiscore,
- LinearModel,
- get_coef,
- Vectorizer,
- CSP,
- )
- datapath = os.path.expanduser('~/illusory-occlusion/eeg/data')
- #%% -------------------------------------------- PREPROCESSING --------------------------------------------
- def run_preprocess(subjectnr,overwrite=0):
- '''
- Preprocess the EEG data of a single subject
- This function loads the raw EEG data, preprocesses it, and saves the preprocessed data to a new file.
- Parameters
- ----------
- subjectnr : str
- Subject number
- overwrite : bool
- Overwrite existing files. 0 does not overwrite, 1 overwrites
- Returns
- -------
- Processed EEG data and behavioural data in BIDS format
- Notes
- -----
- high-pass filter: 0.1 Hz
- low-pass filter: 100 Hz
- resample: 1000 Hz
- epoch: -0.1 to 0.8 s relative to stimulus onset
- baseline: -0.1 to 0 s
- '''
- # subject to run
- print(f'preprocessing sub-{subjectnr}')
- os.makedirs(f'{datapath}\derivatives\mne', exist_ok=True)
- outfn = f'{datapath}\derivatives\mne\sub-{subjectnr}_mne_epo.fif'
- behavfn = f'{datapath}\sub-{subjectnr}\eeg\sub-{subjectnr}_task-detection_events.tsv'
- source_behavfn = f'{datapath}\sourcedata\sub-{subjectnr}_task-detection_events.csv'
- source_filename = f'{datapath}\sourcedata\sub-{subjectnr}_task-detection_eeg.bdf'
- raw_filename = f'{datapath}\sub-{subjectnr}\eeg\sub-{subjectnr}_task-detection_eeg.bdf'
- if os.path.exists(outfn) and not overwrite:
- print('file exists:',outfn)
- return
- if not os.path.exists(source_behavfn):
- print('file does not exists:',source_behavfn)
- return
- if not (os.path.exists(source_filename) or os.path.exists(raw_filename)):
- print('file does not exists:',source_filename)
- return
- if not os.path.exists(raw_filename):
- os.makedirs(os.path.dirname(raw_filename), exist_ok=True)
- os.rename(source_filename, raw_filename)
- # Load EEG file
- raw = mne.io.read_raw_bdf(raw_filename, preload=True)
- sfreq = raw.info['sfreq']
- # Read events
- T = pd.read_csv(source_behavfn)
- # Find the STATUS channel and read the values from it
- stim_channel = raw.ch_names.index('Status')
- stim_data = raw.get_data(picks=stim_channel)
- # %matplotlib qt
- # raw.plot();
- triggertimes = [x for x in 1+np.where((np.diff(stim_data)[0]!=0))[0]]
- triggervalues = stim_data[0][triggertimes]
- a,b = np.unique(triggervalues,return_counts=1)
- for x,y in zip(a,b):print('%d %d'%(x,y))
- stim_onset_sample = [x for x,y in zip(triggertimes,triggervalues) if y==40708]
- seq_onset_sample = [x for x,y in zip(triggertimes,triggervalues) if y==34564]
- if subjectnr == '22':
- stim_onset_sample = [x for x,y in zip(triggertimes, triggervalues) if y == 40708] #sub 22 - technical error, excluded from sample
- elif subjectnr=='26':
- stim_onset_sample = [x for x,y in zip(triggertimes,triggervalues) if y==40708] #didn't get preprocessed without doing this
- #stim_offset_sample = [x for x,y in zip(triggertimes,triggervalues) if y==40704]
- #[(x-y)/sfreq for x,y in list(zip(stim_offset_sample,stim_onset_sample))[:20]]
- # fix missing triggers
- missingtriggers = len(T)-len(stim_onset_sample)
- if missingtriggers>0:
- print('reconstructing %i triggers'%(missingtriggers))
- print('triggers: %i'%len(stim_onset_sample),'expected: %i'%len(T))
- assert missingtriggers<100, 'too many missing triggers'
- a=[int(x)/sfreq for x in stim_onset_sample]
- b=[x for x in T['time_stimon']]
- for j in range(1,len(a)):
- da = a[j]-a[j-1]
- db = b[j]-b[j-1]
- if da-db > .11:
- print('inserting pos:%i +%.3fs'%(j,a[j-1]+db),'data:%.3fs_diff(%.3fs,%.3fs])'%(da,a[j-1],a[j]),
- 'expected:%.3fs_diff(%.3fs,%.3fs])'%(db,b[j-1],b[j]))
- a.insert(j,a[j-1]+db)
- stim_onset_sample.insert(j,int(round(sfreq*(a[j-1]+db))))
- if len(stim_onset_sample) > len(T):
- print('found not enough events!',len(stim_onset_sample), len(T))
- assert len(stim_onset_sample) <= len(T), 'found too many events!'
- assert len(stim_onset_sample) >= len(T), 'found not enough events!'
- stim_onset_sample = np.array(stim_onset_sample)
- events = np.transpose(np.vstack((stim_onset_sample,0*stim_onset_sample,range(0,len(stim_onset_sample)))));
- # Behaviour
- T2 = pd.DataFrame({
- 'onset': [int(x)/sfreq for x in stim_onset_sample],
- 'duration': 0.20,
- 'onsetsample': [int(x) for x in stim_onset_sample],
- 'eventnumber': range(0, len(stim_onset_sample)),
- 'subjectnr': int(subjectnr)
- })
- T2 = pd.concat((T2,T),axis=1)
- assert all(np.diff(T2['onset']) - np.diff(T2['time_stimon']) < 0.11), 'event times do not seem to match'
- T2.to_csv(behavfn, sep='\t', index=False)
- T2.to_csv(behavfn.replace('.tsv','.csv'), sep=',', index=False)
- # layout = mne.channels.read_layout('biosemi')
- # raw.set_montage()
- print(raw)
- raw.pick('eeg')
- if subjectnr=='26':
- raw.pick(range(64)) #recorded external electrodes without info, only taking the 64 non-external
- montage = mne.channels.make_standard_montage("biosemi64")
- #raw.info.ch_names = montage.ch_names
- # rename A1 A2 etc to Fp1 AF7 etc
- mne.rename_channels(raw.info,dict(zip(raw.info.ch_names,montage.ch_names)))
- print(raw.info.ch_names)
- raw.set_montage(montage)
- raw.set_eeg_reference()
- raw.filter(l_freq=0.1, h_freq=100)
- epochs = mne.Epochs(raw, events, tmin=-0.1, tmax=0.8, baseline=(-0.1, 0), detrend=0, proj=False, preload=True)
- # Resample
- epochs.resample(1000)
- print(epochs)
- epochs.save(outfn,overwrite=1)
- print('Done')
- #%% -------------------------------------------- DECODING --------------------------------------------
- #%%Control decoding
- def run_control_decoding(subjectnr, decode, overwrite=0):
- """
- Run decoding analysis on a single subject
- This function loads the preprocessed data and the behavioural data and runs a decoding analysis using a linear discriminant analysis.
- Parameters
- ----------
- subjectnr : str
- Subject number
- decode : str
- Decoding type (position, validity, empty_illusion)
- overwrite : bool
- Overwrite existing files. 0 does not overwrite, 1 overwrites
- Returns
- -------
- scores : array
- The decoding scores
- Notes
- -----
- y : array
- The target variable. In this case it is determined by the decoding type (decode parameter)
- groups : array
- The groups variable. In this case it is the block sequence number.
- cv : cross-validation generator
- scoring : str
- n_jobs : int
- verbose : int
- """
- infn = f'{datapath}/derivatives/mne/sub-{subjectnr}_mne_epo.fif'
- behavfn = f'{datapath}/sub-{subjectnr}/eeg/sub-{subjectnr}_task-detection_events.tsv'
- outfn = f'{datapath}/derivatives/results_control/sub-{subjectnr}_control_{decode}.csv'
- fig1fn = f'{datapath}/derivatives/results_control/figures/sub-{subjectnr}_control_{decode}.png'
- fig2fn = f'{datapath}/derivatives/results_control/figures/sub-{subjectnr}_control_{decode}_plot.png'
- if os.path.exists(infn) and os.path.exists(behavfn):
- if os.path.exists(outfn) and not overwrite:
- print('file exists:',outfn)
- return
- else:
- epochs = mne.read_epochs(infn)
- avg = epochs.average()
- p=avg.plot_joint(show=0)
- p.savefig(fig1fn)
- T_all = pd.read_csv(behavfn,delimiter='\t')
- #idx = ['_invalid_' in x for x in T['stimpath']]
- idx = [not x for x in T_all['istarget']]
- T = T_all[idx]
- X = epochs.get_data()[idx,:,:]
- Y = pd.DataFrame({'time':epochs.times})
- # applying the decoding
- #c,y = np.unique(T['category_name'],return_inverse=True)
- if decode == 'position':
- y = ['_behind_' in x for x in T['stimpath']]
- decode_label = 'behind vs infront'
- elif decode == 'validity':
- y = ['_valid_' in x for x in T['stimpath']]
- decode_label = 'valid vs invalid'
- elif decode == 'shape':
- y = ['_triangle' in x for x in T['stimpath']]
- decode_label = 'triangle vs square'
- if decode == 'illusion':
- idx = [x == 1 for x in T_all['istarget']] #index of the targets
- T = T_all[idx] # T dataframe with only the targets
- y = ['invalid_' in x for x in T['stimpath']]
- if len(y) == 0:
- print('no targets found')
- return
- decode_label = 'illusion vs no illusion'
- groups = np.array(T['blocksequencenumber'])
- unique_groups = np.unique(groups)
- #print(unique_groups)
- if len(unique_groups) < 2:
- #in case there are not enough unique groups
- print("Not enough unique groups for LeaveOneGroupOut cross-validation.")
- else:
- groups = T['sequencenumber']
- unique_groups = np.unique(groups)
- clf = make_pipeline(LinearDiscriminantAnalysis(priors=(1+0*np.unique(y))/len(np.unique(y))))
- #clf = make_pipeline(StandardScaler(),LinearModel(LinearSVC(dual="auto")))
- time_decod = SlidingEstimator(clf, n_jobs=-1, scoring="balanced_accuracy", verbose=0)
- scores = cross_val_multiscore(time_decod, X, y, groups=groups, cv=LeaveOneGroupOut(), n_jobs=-1)
- Y[f'{decode}_decoding'] = np.mean(scores, axis=0)
- # plot decoding per subject
- #overall_y_min = float('inf')
- #overall_y_max = float('-inf')
- ##for subject_data in range(50):
- ### Calculate the y-axis limits for the current subject
- #subject_y_min = min(Y[f'{decode}_decoding'].min())
- #subject_y_max = max(Y[f'{decode}_decoding'].max())
- ### Update the overall minimum and maximum values
- #overall_y_min = min(overall_y_min, subject_y_min)
- #overall_y_max = max(overall_y_max, subject_y_max)
- fig, ax = plt.subplots()
- ax.plot(epochs.times, Y[f'{decode}_decoding'], label=decode_label)
- ax.axhline(1/len(np.unique(y)), color="k", linestyle="--", label="chance")
- ax.set_xlabel("Time (s) relative to stimulus onset")
- ax.set_ylabel("Accuracy")
- ax.legend()
- ax.axvline(0.0, color="k", linestyle="-")
- ax.set_title(f"{decode} decoding")
- #ax.set_ylim(overall_y_min, overall_y_max)
- ax.set_xlim(-0.1, 0.8)
- fig.savefig(fig2fn)
- Y.to_csv(outfn)
- print(f'Control decoding participant {subjectnr} done')
- #%% Main decoding
- def run_main_decoding(subjectnr,overwrite=0):
- """
- Run decoding analysis on a single subject
- This function loads the preprocessed data and the behavioural data and runs a decoding analysis using a linear discriminant analysis.
- Parameters
- ----------
- subjectnr : str
- Subject number
- overwrite : bool
- Overwrite existing files. 0 does not overwrite, 1 overwrites
- """
- os.makedirs(f'{datapath}/derivatives/results_main', exist_ok=True)
- infn = f'{datapath}/derivatives/mne/sub-{subjectnr}_mne_epo.fif'
- behavfn = f'{datapath}/sub-{subjectnr}/eeg/sub-{subjectnr}_task-detection_events.tsv'
- fig1fn = f'{datapath}/derivatives/results_main/figures/sub-{subjectnr}_epochs.png'
- posval_codes = {'_front_valid_': 'frval', '_front_invalid_': 'frinval',
- '_behind_valid_': 'behval', '_behind_invalid_': 'behinval'}
- cat_codes = {'supraordinate': 'sup', 'category': 'cat',
- 'object': 'obj', 'image': 'im'}
- if os.path.exists(infn) and os.path.exists(behavfn) and not overwrite:
- epochs = mne.read_epochs(infn)
- avg = epochs.average()
- p=avg.plot_joint(show=0)
- p.savefig(fig1fn)
- TT = pd.read_csv(behavfn,delimiter='\t')
- for c in posval_codes:
- outfn = f'{datapath}/derivatives/results_main/sub-{subjectnr}_results_{posval_codes[c]}.csv'
- if not os.path.exists(outfn):
- idx = [c in x for x in TT['stimpath']]
- T = TT[idx]
- X = epochs.get_data()[idx,:,:]
- Y = pd.DataFrame({'time':epochs.times})
- for l in cat_codes:
- print(f'decoding participant {subjectnr} condition {c} category {l}')
- # decoding category
- #j,y = np.unique([x[5:9] for x in T['stimpath']],return_inverse=True)
- #y = ['_triangle' in x for x in T['stimpath']]
- supraordinate_y = [int(x[5]) for x in T['stimpath'] if l == list(cat_codes)[0]] #supraordinate
- category_y = [int(x[5:7]) for x in T['stimpath'] if l == list(cat_codes)[1]] #category
- object_y = [int(x[5:8]) for x in T['stimpath'] if l == list(cat_codes)[2]] #object
- image_y = [int(x[5:9]) for x in T['stimpath'] if l == list(cat_codes)[3]] #image
- groups = np.array(T['blocksequencenumber'])
- if l == list(cat_codes)[0]:
- y = supraordinate_y
- elif l == list(cat_codes)[1]:
- y = category_y
- elif l == list(cat_codes)[2]:
- y = object_y
- elif l == list(cat_codes)[3]:
- y = image_y
- clf = make_pipeline(LinearDiscriminantAnalysis(priors=(1+0*np.unique(y))/len(np.unique(y))))
- #clf = make_pipeline(StandardScaler(),LinearModel(LinearSVC(dual="auto")))
- time_decod = SlidingEstimator(clf, n_jobs=-1, scoring="balanced_accuracy", verbose=0)
- scores = cross_val_multiscore(time_decod, X, y, groups=groups, cv=LeaveOneGroupOut(), n_jobs=-1)
- # Mean scores across cross-validation splits
- Y[l] = np.mean(scores, axis=0)
- # Plot
- fig, ax = plt.subplots()
- ax.plot(epochs.times, Y[l], label="score")
- ax.axhline(1/len(np.unique(y)), color="k", linestyle="--", label="chance")
- ax.set_xlabel("Times")
- ax.set_ylabel("Accuracy")
- ax.legend()
- ax.axvline(0.0, color="k", linestyle="-")
- ax.set_title("Category decoding")
- fig.savefig(fig1fn.replace('_epochs',f'_decoding-{l}'))
- Y.to_csv(outfn)
- print('Done')
functions.py, no license · at the source
Overview
- The MARCS Institute for Brain, Behaviour and Development, Western Sydney University, Sydney, Australia
- School of Psychology, Western Sydney University, Sydney, Australia
- School of Computer, Data and Mathematical Sciences, Western Sydney University, Sydney, Australia
Abstract
Fast and accurate object recognition is crucial for effective behavior in dynamic visual environments. In some cases, the visual system must overcome ambiguity in visual input during object recognition, such as when an object is partially hidden behind another. Recurrent processing between higher- and lower-order areas is thought to play a role in resolving such ambiguity, enabling the filling in of missing visual information. Here we examined this claim using a novel paradigm in which partial object images appear “occluded” by an illusory Kanizsa figure, perception of which also depends on recurrent processing by the grouping of Pacmen inducers. If both recognizing the partial object and perceiving the illusory shape depend on recurrent processing, object recognition should vary as a function of the presence of illusory shape. Across two behavioral experiments and a separate electroencephalography decoding study, we found no evidence of an interaction between illusion perception and object recognition, as well as different neural time courses for the illusory figures alone compared with partial objects, which were decoded earlier. Ultimately, our study highlights the robustness of the visual system to solve the identity of the ambiguous object, independently of the processing of different ambiguities occurring at the same time, providing new insights into the mechanisms of recurrence in the early and late stages of information processing and its application to ambiguous object recognition.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 5 matches between paragraphs and lines of code.
OSF x6fv9
Availability: 1 check, the latest on 26 September 2026: the link answers (HTTP 200)
- 26 September 2026: the link answers (HTTP 200)
13 files
- eeg/
data/ , Python, 400 lines, 2 matchesfunctions.py - eeg/
data/ , R, 446 linesstatistics.R - eeg/
data/ , Jupyter, 1,022 linessteps.ipynb - eeg/
definitions.py , Python, 88 lines - eeg/
main_experiment.py , Python, 345 lines - online/
experiment1/ , R, 296 linesdata/ analysis_bf_cat.R - online/
experiment1/ , Jupyter, 460 linesdata/ analysis_cat.ipynb - online/
experiment1/ , JavaScript, 284 lines, 2 matchesexperiment.js - online/
experiment1/ , JavaScript, 593 linesjspsych-pavlovia-2020.4. js - online/
experiment1/ , JavaScript, 360 linesstimuli.js - online/
experiment2/ , JavaScript, 425 lines, 1 matchexperiment.js - online/
experiment2/ , JavaScript, 593 linesjspsych-pavlovia-2020.4. js - online/
experiment2/ , JavaScript, 5,750 linesstimuli.js
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:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 13 scripts, each with its path and the digest of its content;
- 5 matches 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.
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 3, 28 September 2026
- Authors: added Almudena Ramírez-Haro (0009-0005-5659-9694); Denise Moerel (0000-0001-9677-0170); Genevieve L Quek (0000-0002-5905-8405); Manuel Varlet (0000-0001-5772-2061); Tijl Grootswagers (0000-0002-7961-5002); removed Almudena Ramírez-Haro; Denise Moerel; Genevieve L Quek; Manuel Varlet; Tijl Grootswagers
- Funding: added Australian Government: doi.org/10.82133/C42F-K220, https://doi.org/10.82133/C42F-K220, /10.82133/C42F-K220
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 5 authors, 3 keywords, 10 MeSH terms, 74 references.
Cite
This paper
Ramírez-Haro, A., Moerel, D., Quek, G. L., Varlet, M., & Grootswagers, T. (2026). The neural processes of illusory occlusion in object recognition. Journal of vision, 26(8), 4. https://
BibTeX
@article{ramirezharo2026
author = {Ramírez-Haro, Almudena and Moerel, Denise and Quek, Genevieve L and Varlet, Manuel and Grootswagers, Tijl},
title = {{The neural processes of illusory occlusion in object recognition}},
journal = {Journal of vision},
year = {2026},
month = aug,
volume = {26},
number = {8},
pages = {4},
publisher = {Association for Research in Vision and Ophthalmology},
issn = {1534-7362},
doi = {10.1167/
url = {https://
pmid = {42615796},
pmcid = {PMC13505799}
}
RIS
TY - JOUR
AU - Ramírez-Haro, Almudena
AU - Moerel, Denise
AU - Quek, Genevieve L
AU - Varlet, Manuel
AU - Grootswagers, Tijl
TI - The neural processes of illusory occlusion in object recognition
T2 - Journal of vision
J2 - J Vis
PY - 2026
DA - 2026/
VL - 26
IS - 8
SP - 4
SN - 1534-7362
PB - Association for Research in Vision and Ophthalmology
DO - 10.1167/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1167/
"type": "article-journal",
"title": "The neural processes of illusory occlusion in object recognition",
"container-title": "Journal of vision",
"author": [
{
"family": "Ramírez-Haro",
"given": "Almudena"
},
{
"family": "Moerel",
"given": "Denise"
},
{
"family": "Quek",
"given": "Genevieve L"
},
{
"family": "Varlet",
"given": "Manuel"
},
{
"family": "Grootswagers",
"given": "Tijl"
}
],
"container-title-short":
"volume": "26",
"issue": "8",
"page": "4",
"DOI": "10.1167/
"PMID": "42615796",
"PMCID": "PMC13505799",
"ISSN": "1534-7362",
"publisher": "Association for Research in Vision and Ophthalmology",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
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.1371/journal.pone.0347992 [code]
- Rotation-tolerant representations elucidate the time-course of high-level object processing.Journal: PloS oneIn common: PsychoPy, pandas, NumPy, EEG, cognitive, 15 references, author Denise Moerel
- [2] doi:10.1167/jov.26.8.2 [code]
- Disentangling objects' contextual associations from perceptual and conceptual attributes using time-resolved neural decoding.Journal: Journal of visionIn common: seaborn, pandas, SciPy, 2 other tools, EEG, cognitive, 7 references, 2 authors
- [3] doi:10.1162/imag.a.1207 [code]
- Investigating the temporal dynamics and modeling of mid-level feature representations in humans.Journal: Imaging neuroscience (Cambridge, Mass.)In common: MNE-Python, seaborn, scikit-learn, 4 other tools, EEG, cognitive, 8 references
- [4] doi:10.1523/eneuro.0344-25.2026 [code]
- Long-Term Variability in Visual Processing versus Perceptual Stability.Journal: eNeuroIn common: MNE-Python, seaborn, scikit-learn, 4 other tools, cognitive, 5 references
- [5] doi:10.1093/nc/niag029 [code]
- A data-driven approach to identifying and evaluating connectivity-based neural correlates of conscious visual perception.Journal: Neuroscience of consciousnessIn common: BayesFactor, MNE-Python, ggplot2, 7 other tools, cognitive, 2 references
- [6] doi:10.1038/s41597-026-07377-y [code]
- An open-access multi-site fMRI dataset for investigating conscious visual perception.Journal: Scientific dataIn common: BayesFactor, MNE-Python, ggplot2, 7 other tools, 2 references
- [7] doi:10.1038/s41597-026-07350-9 [code]
- An open multi-center MEG-EEG dataset for studying conscious visual perception.Journal: Scientific dataIn common: BayesFactor, MNE-Python, ggplot2, 7 other tools, EEG, 1 reference
- [8] doi:10.3390/s26103131 [code]
- Neuromagnetism "On the Cheap": Evaluating a Combined Cylindrical Shield and Partial-Coverage OPM-MEG System for Detecting Sensorimotor Responses in Humans.Journal: Sensors (Basel, Switzerland)In common: BayesFactor, MNE-Python, ggplot2, 6 other tools, 2 references
- [9] doi:10.34133/csbj.0042 [code]
- Using Steady-State Visual Evoked Potentials to Characterize Wide-Ranging Retinopathy Linked to &
lt;i& gt;CRB1& lt;/ i& gt;: Implications for Clinical Trials. Journal: Computational and structural biotechnology journalIn common: PsychoPy, MNE-Python, ggplot2, 7 other tools, EEG, 1 reference - [10] doi:10.1016/j.isci.2026.117285 [code]
- Working memory demands modulate memory brain state engagement.Journal: iScienceIn common: BayesFactor, PsychoPy, MNE-Python, 6 other tools, EEG, cognitive
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.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 13 scripts, and 5 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:7f2f92b837f9f671…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[.
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.
