No Unique Magnocellular Facilitation in Parafoveal Processing: A Combined EEG and Eye Tracking Study.
The 2 matches
- [1] § MATERIALS AND METHODS › EEG Preprocessing ↔ Codes/Eye/preprocessing_EMdata_sf_OSF.R, lines 323–377 · score 0.56 · baseline corrected, EEG signals, MATLAB, onset, preprocessing, EYE
- [2] § MATERIALS AND METHODS › EEG Preprocessing ↔ Codes/Eye/preprocessing_EMdata_color_OSF.R, lines 344–390 · score 0.56 · baseline corrected, EEG signals, MATLAB, onset, preprocessing, EYE
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
R · 378 lines · 19 KB · no license · 1 match
- #### 0. Choose your working directory ####
- #In this folder you need to have Fixation report, Interest Area report and Saccade report in .csv format.
- #The reports were obtained with DataViewer (SR Research), after having performed the 4 stages cleaning procedure (stage 4: 50, 800ms)
- #and having set up 2 Messages.
- #library()
- library(stringr)
- getwd()
- setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output")
- #### 1. Load Fixation Report ####
- FixRep = read.csv("fix_report.csv", sep = ",")
- head(FixRep)
- str(FixRep)
- b <-FixRep$CURRENT_FIX_INTEREST_AREA_ID #at the moment the values in CURRENT_FIX_INTEREST_AREA_ID vary in length. They could be comprised of 0, 1 or 2 digits (e.g., ., 3, 11)
- FixRep$CURRENT_FIX_INTEREST_AREA_ID<- sprintf("%02s", b) #with this command, the values in CURRENT_FIX_INTEREST_AREA_ID will all be comprised of 2 digits (e.g., " .", " 3", "11")
- FixRep$CURRENT_FIX_INTEREST_AREA_ID
- FixRep$ID2 <- paste(FixRep$RECORDING_SESSION_LABEL, FixRep$CURRENT_FIX_INTEREST_AREA_ID, sep="") #with this command we create a unique idenifier for participant item and interest area.
- FixRep$ID2
- ### Consider only the EXPERIMENTAL trials ###
- FixRep <- FixRep[!grepl("res",FixRep$preview_stim),]
- levels(droplevels(as.factor(FixRep$preview_stim)))
- write.table(FixRep, file = "FixRep.xls", row.names=FALSE)
- #### 2. CONSECUTIVE FIXATIONS ####
- FixRepMod <- FixRep
- FixRepMod$PREVIOUS_FIX_INTEREST_AREA_ID <- as.numeric(as.character(FixRepMod$PREVIOUS_FIX_INTEREST_AREA_ID))
- FixRepMod$CURRENT_FIX_INTEREST_AREA_ID <- as.numeric(as.character(FixRepMod$CURRENT_FIX_INTEREST_AREA_ID))
- FixRepMod$NEXT_FIX_INTEREST_AREA_ID <- as.numeric(as.character(FixRepMod$NEXT_FIX_INTEREST_AREA_ID))
- # #If you want to double check the new column we have created, run the following line of code:
- write.table(FixRepMod, file = "FixRepMod.xls", row.names=FALSE)
- #### 3. Consider only pre-target and target words (FixRep) ####
- FixRepMod2 <- FixRepMod[grepl("target_small",FixRepMod$CURRENT_FIX_INTEREST_AREA_LABEL),]
- #### 4. Load Interest Area Report ####
- IARep = read.csv("IA_report.csv", sep = ",")
- head(IARep)
- str(IARep)
- d <-IARep$IA_ID #at the moment the values in IA_ID vary in length. They could be comprised of 1 or 2 digits (e.g., 1, 12)
- IARep$IA_ID<- sprintf("%02s", d) #with this command, the values in IA_ID will all be comprised of 2 digits (e.g., 01, 12)
- IARep$IA_ID
- IARep$ID2 <- paste(IARep$RECORDING_SESSION_LABEL, IARep$IA_ID, sep="") #with this command we create a unique idenifier for participant item and interest area.
- IARep$ID2
- ### Consider only the EXPERIMENTAL trials ###
- #Note: the column 'trial_aborted' different from zero means that the fixation on the initial cross on the left side of the screen could not be registered by the Eyelink, so the trial was presented again.
- IARep <- IARep[!grepl("target",IARep$preview_stim),]
- #levels(droplevels(IARep$preview_stim))
- levels(droplevels(as.factor(IARep$preview_stim)))
- #### 5. Consider only pre-target and target words (IARep) ####
- IARep2 <- IARep[grepl("target_small",IARep$IA_LABEL),]
- #### 6. Merge the fixation report and the interest area report based on the common ID2 but keeping all the rows from the fixation report ####
- RepMod <- merge(FixRepMod2, IARep2, all.x=TRUE)
- RepMod <- RepMod[order(RepMod$RECORDING_SESSION_LABEL, RepMod$trial.no, RepMod$CURRENT_FIX_INDEX),]
- #write.table(RepMod, file = "RepMod.xls", row.names=FALSE)
- #### 7. BLINKS ####
- #Identify those sequences wehere there was a BLINK in any of the areas of the pair during first pass reading.
- RepMod$BlinksRemove <- ifelse(RepMod$CURRENT_FIX_BLINK_AROUND!="NONE" & RepMod$CURRENT_FIX_INTEREST_AREA_RUN_ID ==1, 1, 0)
- #### 8. WORD SKIPPING ####
- #Identify SKIPS in any of the areas of the pair during first pass reading.
- RepMod$Skip <- ifelse(RepMod$IA_SKIP == 1 & RepMod$CURRENT_FIX_INTEREST_AREA_RUN_ID ==1, 1, 0)
- RepModified<-RepMod
- #### 11. SELECTION OF INTERESTING FIXATIONS (part 1) ####
- #CLEAN the data from all the fixations that we cannot keep based on the previous code and criteria.
- RepClean <-RepModified
- #First we extract only the pretarget and target words for the first pair.
- RepCleanFirst <- RepClean
- RepCleanFirst <- RepCleanFirst[grepl("target_small",RepCleanFirst$CURRENT_FIX_INTEREST_AREA_LABEL),]
- #Then we select to keep only those observations where there was not a skip (i.e., with value of zero).
- RepCleanFirst <-RepCleanFirst[(RepCleanFirst$Skip==0),]
- RepCleanFirst <-RepCleanFirst[(RepCleanFirst$IA_FIRST_FIX_PROGRESSIVE==1),]
- #If you want to check the file
- write.table(RepCleanFirst, file = "RepCleanFirst.xls", row.names=FALSE)
- #Now merge pretarget and target words for first and second pairs.
- RepClean2 <-RepCleanFirst
- #And order by participant, presentation order of the trials and fixation index.
- RepClean2 <- RepClean2[with(RepClean2, order(RECORDING_SESSION_LABEL, CURRENT_FIX_INDEX)),]
- #Save the file
- #write.table(RepClean2, file = "RepClean2.xls", row.names=FALSE)
- #Keep only first-pass reading
- RepClean3 <-RepClean2[grepl("1",RepClean2$CURRENT_FIX_INTEREST_AREA_RUN_ID),]
- RepClean3<-RepClean3[grepl("1",RepClean3$CURRENT_FIX_RUN_INDEX),]
- #write.table(RepClean3, file = "RepClean3.xls", row.names=FALSE)
- #Select unique IA_LABEL per participant per trial. So, only one pretarget and one target per pair.
- RepClean4<-RepClean3
- results_target <-RepClean4[grepl("target_small",RepClean4$IA_LABEL),]
- #Save the file
- write.table(results_target, file = "EMdata_target.xls", row.names=FALSE)
- #You can check how many trials per participant per condition.
- B <-as.data.frame.matrix(table(results_target$RECORDING_SESSION_LABEL, results_target$targte_trigger))
- colMeans(B) #mean of each condition
- rowMeans(B) #mean of each participant
- mean(as.matrix(B)) #mean of the whole data frame (all participants, all conditions).
- #Save the file
- write.table(B, file = "ObservationsPerPptCond.xls", row.names=TRUE)
- ####################################################################################################################################################
- #### #### 11. SELECTION OF INTERESTING FIXATIONS (part 2) ####
- #After the cleaning of the data, follow this script in order to synchronize the events as recorded in the eye-tracking system (Eyelink 1000) and
- #in the EEG recording (NeuroScan 4.5).
- #Create files where instead of the TTL/condition, we have the exact code that represents nitem/trial + condition.
- #### 11.0. Set your working directory ####
- setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output")
- #### 11.1. Open the Message report as extracted wih DataViewer ####
- MsgRep = read.csv("msg_report.csv", sep = ",")
- ### Consider only the EXPERIMENTAL trials ###
- #Note: the column 'trial_aborted' different from zero means that the fixation on the initial cross on the left side of the screen could not be registered by the Eyelink, so the trial was presented again.
- MsgRep <- MsgRep[!grepl( "res" , MsgRep$preview_trigger ), ]
- levels(droplevels(as.factor(MsgRep$preview_stim)))
- head(MsgRep)
- str(MsgRep)
- #### 11.2. Keep only the rows of the Message report that recorded the sending of TTLs ####
- #This will be important for the merging with the event file from the EEG recording.
- MsgRep <- MsgRep[grepl( "TRIAL_PREVIEW|KEYWORD 10|KEYWORD 99|KEYWORD 101|KEYWORD 102|KEYWORD 103|KEYWORD 104|KEYWORD 105|KEYWORD 106|KEYWORD 111|KEYWORD 112|KEYWORD 113|KEYWORD 114|KEYWORD 115|KEYWORD 116|KEYWORD 200|CROSSED|CHANGED" , MsgRep$CURRENT_MSG_TEXT ), ]
- #Note: the number of observations to be correct needs to be equal to the Number of participants x Number of experimental trials x Number TTLon/off (2).
- write.table(MsgRep, "MsgRep_keyword.csv",sep=",")
- #### 11.3. Open EvF for each participant and create one big new EvF of all participants ####
- setwd("S:/GRF_magno/preview/data/eeg/sf/out/event") #only store the relevant files in this folder
- files <- list.files(pattern = ".csv")
- library(data.table)
- data_list <- list() #this should be equal to the number of participants being analysed.
- for(i in 1:length(files)){
- file_name <- files[i]
- d = fread(file_name, sep=",")
- #Change columns names
- colnames(d) <- c("number","latency","type","duration","order")
- #Split the string by "_"
- filenames_vec <- strsplit(file_name, split = "_")[[1]]
- #Create new column to store the information
- d$RECORDING_SESSION_LABEL <- filenames_vec[1]
- data_list[[i]] <- d
- }
- EvF_all_data <- rbindlist(data_list)
- fwrite(EvF_all_data, "S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output/EvF_all_data.csv")
- #### 11.4. Set back the working directory for synchronization and open Event file ####
- setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output")
- EvF_col = read.csv("EvF_all_data.csv", sep = ",")
- head(EvF_col)
- str(EvF_col)
- #The column 'Presentation' refers to the time in the EEG recording when a TTL was recorded.
- ### Keep in the Event file only the experimental trials ###
- EvF_col <- EvF_col[EvF_col$type != "200",]
- head(EvF_col)
- write.table(EvF_col, "EvF_col.xls",sep="\t", row.names=FALSE)
- #### 11.5. Consider only the TTLon in the EvF ####
- #So only the values 1,2,3,4,5,6. No, the TTLoff 101,102,103,104,105,106.
- setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output")
- MsgRep = read.csv("MsgRep_keyword.csv", sep = ",")
- # MsgRep <- MsgRep [grepl( "KEYWORD 111", MsgRep$CURRENT_MSG_TEXT )|grepl( "KEYWORD 222", MsgRep$CURRENT_MSG_TEXT ), ] #the number of observations here should be equal to Number of participants participants by Number of experimental trials.
- # MsgRep$CURRENT_MSG_TEXT#the number of observations here should be equal to Number of participants participants by Number of experimental trials.
- MsgRep <- MsgRep [grepl( "KEYWORD 111|KEYWORD 112|KEYWORD 113|KEYWORD 114|KEYWORD 115|KEYWORD 116", MsgRep$CURRENT_MSG_TEXT ), ] #the number of observations here should be equal to Number of participants participants by Number of experimental trials.
- MsgRep$CURRENT_MSG_TEXT#the number of observations here should be equal to Number of participants participants by Number of experimental trials.
- setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output")
- EvF_col = read.csv("EvF_all_data.csv", sep = ",")
- head(EvF_col)
- ### Create an Identifier for both files
- EvF_col$trials_run <- as.numeric(as.character(EvF_col$order))
- EvF_col$trials_run<- sprintf("%03d", EvF_col$order)
- EvF_col$Identifier <- paste(EvF_col$RECORDING_SESSION_LABEL, EvF_col$trials_run, sep="")
- head(EvF_col)
- head(EvF_col$Identifier)
- names(MsgRep)
- MsgRep$trial.no<- as.numeric(as.character(MsgRep$trial.no))
- MsgRep$trial.no<- sprintf("%03d", MsgRep$trial.no)
- MsgRep$Identifier <- paste(MsgRep$RECORDING_SESSION_LABEL,MsgRep$trial.no, sep="")
- head(MsgRep)
- head(MsgRep$Identifier)
- MsgRep <- MsgRep[!grepl( "res" , MsgRep$preview_stim ), ]
- levels(droplevels(as.factor(MsgRep$preview_stim)))
- #### 11.6. Merge Message report with the EvF, keeping all the columns ####
- MSGmergeEvF <- merge(EvF_col, MsgRep, by= "Identifier", all.y=TRUE)
- head(MSGmergeEvF$Identifier)
- MSGmergeEvF2 <- MSGmergeEvF
- MSGmergeEvF2 <- MSGmergeEvF2[grepl( "111|112|113|114|115|116", MSGmergeEvF2$type ), ] #the number of observations here should be equal to Number of participants participants by Number of experimental trials.
- ### Save the new file.
- write.table(MSGmergeEvF2, "MSGmergeEvF2.txt",sep="\t", row.names=FALSE)
- #### 11.7. Load the files obtained from the preprocessing of EM data ####
- #Please note that here you need to manually save the files "EMdata_pretarget.xls" and "EMdata_target.xls" as .csv files.
- setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output")
- Rep_target = read.csv("EMdata_target.csv", sep = ",")
- Rep_target$trial.no<- as.numeric(as.character(Rep_target$trial.no))
- Rep_target$trial.no<- sprintf("%03d", Rep_target$trial.no)
- Rep_target$Identifier <- paste(Rep_target$RECORDING_SESSION_LABEL, Rep_target$trial.no, sep="")
- Rep_target$Identifier
- Rep_target$ID3 <- paste(Rep_target$RECORDING_SESSION_LABEL, sep="")
- Rep_target$ID3
- write.table(Rep_target, "Rep_target.csv",sep=",")
- #### 11.8. Merge the files from EM preprocessing with messageReport/Evf ####
- ###Merge each of these files with the MSGmergeEvF, in order to have only the trials needed.
- #It will give all the columns from Rep_XXXtarget, but only the specified columns from MSGmergeEvF.
- #Only the rows in common (with same ID3 in the 2 files) will be included.
- MSGmergeEvF3 <-MSGmergeEvF2[,c("trials_run","order","latency", "type","duration","Identifier","CURRENT_MSG_BLINK_DURATION","CURRENT_MSG_BLINK_END","CURRENT_MSG_BLINK_INDEX","CURRENT_MSG_BLINK_START","CURRENT_MSG_FIX_DURATION","CURRENT_MSG_FIX_END","CURRENT_MSG_FIX_INDEX", "CURRENT_MSG_FIX_START","CURRENT_MSG_FIX_X","CURRENT_MSG_FIX_Y","CURRENT_MSG_INDEX","CURRENT_MSG_INTEREST_AREAS","CURRENT_MSG_INTEREST_AREA_INDEX","CURRENT_MSG_INTEREST_AREA_LABEL","CURRENT_MSG_IS_RT_END","CURRENT_MSG_IS_RT_START","CURRENT_MSG_LABEL","CURRENT_MSG_SAC_AMPLITUDE","CURRENT_MSG_SAC_AVG_VELOCITY","CURRENT_MSG_SAC_DURATION","CURRENT_MSG_SAC_END_TIME","CURRENT_MSG_SAC_END_X","CURRENT_MSG_SAC_END_Y","CURRENT_MSG_SAC_INDEX","CURRENT_MSG_SAC_PEAK_VELOCITY","CURRENT_MSG_SAC_START_TIME","CURRENT_MSG_SAC_START_X","CURRENT_MSG_SAC_START_Y","CURRENT_MSG_TEXT","CURRENT_MSG_TIME","CURRENT_MSG_X_POSITION","CURRENT_MSG_Y_POSITION","preview_stim")]
- Rep_target_code <- merge(Rep_target, MSGmergeEvF2, by="Identifier", all.x=TRUE)
- Rep_target_code <- Rep_target_code[order(Rep_target_code$RECORDING_SESSION_LABEL,Rep_target_code$latency),]
- write.table(Rep_target_code, "Rep_target_code.txt",sep="\t", row.names=FALSE)
- #### 11.9. Create three new columns (first saccade onset, first fixation onset, first fixation duration) for each IA file ####
- #Divide the values by 1000, in order to transform the values into seconds, then multiply by your sampling rate (in our case 1000 Hz).
- #This is important to see these values in the EEG epochs of 1 second. (NOTE: The column Presentation, in the
- #EEG event file is in datapoints, so we need to transform the EMs measures into the same unit - in our case milliseconds.)
- #2)first fixation onset
- Rep_target_code$IA_FIRST_FIXATION_TIME <- as.numeric(as.character(Rep_target_code$IA_FIRST_FIXATION_TIME))
- Rep_target_code$first_fixation_onset <- (Rep_target_code$IA_FIRST_FIXATION_TIME - Rep_target_code$CURRENT_MSG_TIME)
- head(Rep_target_code$first_fixation_onset)
- #3)first fixation duration - We have it already
- head(Rep_target_code$IA_FIRST_FIXATION_DURATION)
- write.table(Rep_target_code, "Rep_target_code2.txt",sep="\t", row.names=FALSE)
- #### 11.10. Create a new file only with the columns needed. ####
- Rep_target_complete <- Rep_target_code[,c("RECORDING_SESSION_LABEL","trial.no.x", "targte_trigger.x","order", "CURRENT_MSG_TEXT","latency","first_fixation_onset", "IA_LABEL","IA_ID",
- "CURRENT_FIX_INTEREST_AREA_RUN_ID","IA_LEGAL", "IA_FIRST_FIX_PROGRESSIVE", "IA_FIRST_FIXATION_DURATION",
- "IA_FIRST_RUN_DWELL_TIME","IA_FIXATION_COUNT","preview_stim.x")]
- head(Rep_target_complete)
- write.table(Rep_target_complete, file = "Rep_target_complete.txt",sep="\t",row.names=FALSE)
- #### 11.11. Now we need one file with saccade and fixation onset based on original Presentation time ####
- #Create event files for each IA, with Fixation onset as Presentation and Fixation duration as Latency.
- #It works with the correct order of TTL
- Rep_target <- Rep_target_complete
- colnames(Rep_target)
- colnames(Rep_target)[6] <- "urPresentation" #original Presentation time of TTLon
- #Rep_target$urPresentation<- as.numeric(as.character(Rep_target$urPresentation))
- #Rep_target$first_fixation_onset<- as.numeric(as.character(Rep_target$first_fixation_onset))
- Rep_target$TimeLockFixOnset <-Rep_target$urPresentation + Rep_target$first_fixation_onset
- head(Rep_target)
- write.table(Rep_target, file = "Rep_target.txt",sep="\t",row.names=FALSE)
- #### 13.12. Now we need one EvF for each participant, as we will need to load it separately for each participant in the EEG data ####
- ###Save in separate files according to participant's number
- setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output/event_syn")
- for (ppt in unique(Rep_target$RECORDING_SESSION_LABEL)) {
- write.csv(Rep_target[Rep_target$RECORDING_SESSION_LABEL == ppt,], file = paste0("EvF_target_", ppt, ".csv"),row.names=FALSE)
- }
- #### 11.13. FINAL EvF TO IMPORT IN MATLAB ####
- #Combine pretarget and target files in a format that can be used for Baseline Correction of EEG signal
- colnames(Rep_target)
- #the names of the columns need to be exactly the same, as well as their class
- class(Rep_target$IA_SPILLOVER)
- head(Rep_target$IA_SPILLOVER)
- Rep_target$IA_SPILLOVER <- as.integer(as.character(Rep_target$IA_SPILLOVER))
- head(Rep_target$IA_SPILLOVER)
- newEvF_preT <- Rep_target
- head(newEvF_preT)
- #Order by TimeLockFixOnset
- newEvF_preT <- newEvF_preT[order(newEvF_preT$RECORDING_SESSION_LABEL,newEvF_preT$TRIAL_INDEX,newEvF_preT$TimeLockFixOnset),] #
- head(newEvF_preT)
- #Create new Column BaseLineOnset with prefonset and tfonset
- newEvF_preT$BaseLineOnset <-ifelse(grepl("KEYWORD 111",newEvF_preT$CURRENT_MSG_TEXT), "unnonrep",
- ifelse(grepl("KEYWORD 112",newEvF_preT$CURRENT_MSG_TEXT), "unrep",
- ifelse(grepl("KEYWORD 113",newEvF_preT$CURRENT_MSG_TEXT), "pnonrep",
- ifelse(grepl("KEYWORD 114",newEvF_preT$CURRENT_MSG_TEXT), "prep",
- ifelse(grepl("KEYWORD 115",newEvF_preT$CURRENT_MSG_TEXT), "mnonrep",
- ifelse(grepl("KEYWORD 116",newEvF_preT$CURRENT_MSG_TEXT), "mrep",NA))))))
- newEvF_preT <- newEvF_preT[grepl("KEYWORD 111|KEYWORD 112|KEYWORD 113|KEYWORD 114|KEYWORD 115|KEYWORD 116",newEvF_preT$CURRENT_MSG_TEXT), ]
- head(newEvF_preT)
- write.table(newEvF_preT, file = "newEvF_preT_complete.txt",sep="\t",row.names=FALSE)
- ###Save in separate files according to participant's number
- for (ppt in unique(newEvF_preT$RECORDING_SESSION_LABEL)) {
- write.csv(newEvF_preT[newEvF_preT$RECORDING_SESSION_LABEL == ppt,], file = paste0("newEvF_preT_", ppt, ".csv"),row.names=FALSE)
- }
- #### The format of the EvF in NeuroScan ####
- #The EvF in Neuroscan has a particular format and contains 6 columns:
- #1st: ordinal number of the event (1st event =1, 2nd event =2, etc.). NOTE: It has to start with 1 and have all the sequence of numbers.
- #2nd: actual event code. Thus you can specify multiple codes in the file. So, it can be TTL, condition, CODE, etc.
- #3rd: The next 3 columns can be used to associate response information with the event; this column is the code of the response itself.
- #4th: This column can be used to show the accuracy of the response (1=correct response; 0=incorrect response; -1=incorrect rejection to respond).
- #5th: This column can be used to indicate the latency of said response to the stimulus, in seconds.
- #6th: The most important - this lists the actual location of the event. This is in data points, and indicates the EXACT onset of the event from the beginning of the data. This means that
- #depending on your sampling rate you need to calculate the exact time and transform these numbers. If your EEG sampling rate is 1000 Hz, this column coincides with milliseconds.
- #No column names should appear.
preprocessing_EMdata_sf_OSF.R, no license · at the source
Overview
- School of Psychology, Nanjing Normal University, Nanjing, China
- Department of Psychology, The Chinese University of Hong Kong, Hong Kong, China
- BCBL, Basque Center on Brain, Language and Cognition, Donostia–San Sebastián, Spain
- Department of Psychology, Humboldt-Universität zu Berlin, Berlin, Germany
- Department of Physics and Life Science Imaging Center, Hong Kong Baptist University, Hong Kong, China
- Department of Psychology, Zhejiang Normal University, Jin Hua, China
- Faculty of Education, National University of Malaysia, Kuala Lumpur, Malaysia
- Department of Experimental Psychology, University of Groningen, Groningen, The Netherlands
- Brain and Mind Institute, The Chinese University of Hong Kong, Hong Kong, China
Abstract
Rapidly processed magnocellular (M) information may facilitate visual object recognition but its role in reading is unclear. A previous study with Chinese characters and masked foveal primes did not find a unique role of the M system as compared to the parvocellular (P) system in mediating repetition effects. As M cells are better represented in the parafoveal visual field, the present study tested whether the M and P systems contribute differentially to parafoveal processing during reading. We combined EEG recordings and eye tracking to measure parafoveal preview effects in fixation-related potentials, using the boundary paradigm. In two experiments, we contrasted high versus low spatial frequency previews and luminance versus color contrast previews and also included standard previews as a manipulation check. As expected, the N250 component was diminished after valid as compared to invalid normal previews, especially over the left hemisphere. We also obtained left-lateralized preview effects for the N250 component for both M- and P-biased previews in both experiments. In the experiment involving a spatial frequency manipulation, P-biased preview effects tended to be larger than M-biased preview effects over the left hemisphere, but not over the right hemisphere. No interactions with preview validity were found for the luminance contrast manipulation. This null effect was supported by a Bayesian analysis. Taken together, these results indicate that the M pathway does not exclusively mediate the preview effect, even for stimuli presented in the parafovea. Instead, both M- and P-based information appear to contribute to early, left-lateralized neural processes underlying visual word 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 2 matches between paragraphs and lines of code.
OSF abrpc
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
4 files
- Codes/
EEG/ , MATLAB, not shown heremagno_preview_color_2.ml x - Codes/
EEG/ , MATLAB, not shown heremagno_preview_sf.mlx - Codes/
Eye/ , R, 391 lines, 1 matchpreprocessing_EMdata_col or_OSF.R - Codes/
Eye/ , R, 378 lines, 1 matchpreprocessing_EMdata_sf_ OSF.R
The paper's code and data availability statement is in the Data section.
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;
- 4 scripts, each with its path and the digest of its content;
- 2 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.
Data and Code Availability Statements
All data and code are publicly available via the Open Science Framework at https://
Reproduced under the paper's license (CC BY), 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 1, 30 September 2026: the first record
Recorded: type, language, journal, volume, pages, dates, 5 authors, 6 keywords, 1 funder, 108 references.
Cite
This paper
Huang, X., Wong, B. W. L., Sommer, W., Dimigen, O., & Maurer, U. (2026). No Unique Magnocellular Facilitation in Parafoveal Processing: A Combined EEG and Eye Tracking Study. Neurobiology of language (Cambridge, Mass.), 7, NOL.a.223. https://
BibTeX
@article{huang2026no,
author = {Huang, Xin and Wong, Brian W L and Sommer, Werner and Dimigen, Olaf and Maurer, Urs},
title = {{No Unique Magnocellular Facilitation in Parafoveal Processing: A Combined EEG and Eye Tracking Study}},
journal = {Neurobiology of language (Cambridge, Mass.)},
year = {2026},
month = mar,
volume = {7},
pages = {NOL.a.223},
publisher = {MIT Press},
issn = {2641-4368},
doi = {10.1162/
url = {https://
pmid = {41918575},
pmcid = {PMC13035401}
}
RIS
TY - JOUR
AU - Huang, Xin
AU - Wong, Brian W L
AU - Sommer, Werner
AU - Dimigen, Olaf
AU - Maurer, Urs
TI - No Unique Magnocellular Facilitation in Parafoveal Processing: A Combined EEG and Eye Tracking Study
T2 - Neurobiology of language (Cambridge, Mass.)
J2 - Neurobiol Lang (Camb)
PY - 2026
DA - 2026/
VL - 7
SP - NOL.a.223
SN - 2641-4368
PB - MIT Press
DO - 10.1162/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1162/
"type": "article-journal",
"title": "No Unique Magnocellular Facilitation in Parafoveal Processing: A Combined EEG and Eye Tracking Study",
"container-title": "Neurobiology of language (Cambridge, Mass.)",
"author": [
{
"family": "Huang",
"given": "Xin"
},
{
"family": "Wong",
"given": "Brian W L"
},
{
"family": "Sommer",
"given": "Werner"
},
{
"family": "Dimigen",
"given": "Olaf"
},
{
"family": "Maurer",
"given": "Urs"
}
],
"container-title-short":
"volume": "7",
"page": "NOL.a.223",
"DOI": "10.1162/
"PMID": "41918575",
"PMCID": "PMC13035401",
"ISSN": "2641-4368",
"publisher": "MIT Press",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
16
]
]
}
}
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.3758/s13428-026-03034-9 [code]
- Advantages and artifacts of high-speed OLED monitors for vision, eye-tracking, and EEG research.Journal: Behavior research methodsIn common: EEG, 4 references, author Olaf Dimigen
- [2] doi:10.1162/nol.a.255 [code]
- Lexical Representations of the Native and Second Languages During L2 Word Reading in Chinese-English Bilinguals.Journal: Neurobiology of language (Cambridge, Mass.)In common: EEG, 4 references
- [3] doi:10.1371/journal.pone.0353990 [code]
- Positive mood enhances accessibility of unrelated concepts in the first language but not in the foreign language.Journal: PloS oneIn common: tidyverse, EEG, 4 references
- [4] doi:10.1111/psyp.70362 [code]
- Pupil Constriction Causes Activity in the Human Retina and Visual System.Journal: PsychophysiologyIn common: EEG, author Olaf Dimigen
- [5] doi:10.1162/opmi.a.372 [code]
- Broadening the Agent Preference Hypothesis Through Experiencers: Eye-Tracking and EEG Evidence of Proto-Agents and Proto-Patients.Journal: Open mind : discoveries in cognitive scienceIn common: data.table, tidyverse, EEG, 2 references
- [6] doi:10.1038/s41537-026-00761-y [code]
- The role of fear learning in the development of psychosis: an EEG study utilizing a differential fear conditioning paradigm in people with psychotic vulnerability.Journal: Schizophrenia (Heidelberg, Germany)In common: data.table, tidyverse, EEG, 2 references
- [7] doi:10.1038/s41562-026-02533-1 [code]
- Fluctuations in arousal reflect latent state transitions that facilitate behavioural optimization.Journal: Nature human behaviourIn common: EEG, 3 references
- [8] doi:10.1162/imag.a.1258 [code]
- Non-specific increase in alpha power during a neurofeedback session targeting its downregulation.Journal: Imaging neuroscience (Cambridge, Mass.)In common: tidyverse, EEG, 3 references
- [9] doi:10.1038/s44271-026-00431-w [code]
- Alpha power increases spontaneously during a neurofeedback session.Journal: Communications psychologyIn common: tidyverse, EEG, 3 references
- [10] doi:10.1111/psyp.70285 [code]
- Spontaneous Modulation of Alpha Power During a Neurofeedback Session Without Instructions.Journal: PsychophysiologyIn common: tidyverse, EEG, 3 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.
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, 4 scripts, and 2 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:ce3a5452fe92f16e…
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.
