OSCR

No Unique Magnocellular Facilitation in Parafoveal Processing: A Combined EEG and Eye Tracking Study.

Code ↔ Paper

2 matches 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 2 matches
  1. [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. [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

  1. #### 0. Choose your working directory ####
  2. #In this folder you need to have Fixation report, Interest Area report and Saccade report in .csv format.
  3. #The reports were obtained with DataViewer (SR Research), after having performed the 4 stages cleaning procedure (stage 4: 50, 800ms)
  4. #and having set up 2 Messages.
  5. #library()
  6. library(stringr)
  7. getwd()
  8. setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output")
  9. #### 1. Load Fixation Report ####
  10. FixRep = read.csv("fix_report.csv", sep = ",")
  11. head(FixRep)
  12. str(FixRep)
  13. 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)
  14. 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")
  15. FixRep$CURRENT_FIX_INTEREST_AREA_ID
  16. 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.
  17. FixRep$ID2
  18. ### Consider only the EXPERIMENTAL trials ###
  19. FixRep <- FixRep[!grepl("res",FixRep$preview_stim),]
  20. levels(droplevels(as.factor(FixRep$preview_stim)))
  21. write.table(FixRep, file = "FixRep.xls", row.names=FALSE)
  22. #### 2. CONSECUTIVE FIXATIONS ####
  23. FixRepMod <- FixRep
  24. FixRepMod$PREVIOUS_FIX_INTEREST_AREA_ID <- as.numeric(as.character(FixRepMod$PREVIOUS_FIX_INTEREST_AREA_ID))
  25. FixRepMod$CURRENT_FIX_INTEREST_AREA_ID <- as.numeric(as.character(FixRepMod$CURRENT_FIX_INTEREST_AREA_ID))
  26. FixRepMod$NEXT_FIX_INTEREST_AREA_ID <- as.numeric(as.character(FixRepMod$NEXT_FIX_INTEREST_AREA_ID))
  27. # #If you want to double check the new column we have created, run the following line of code:
  28. write.table(FixRepMod, file = "FixRepMod.xls", row.names=FALSE)
  29. #### 3. Consider only pre-target and target words (FixRep) ####
  30. FixRepMod2 <- FixRepMod[grepl("target_small",FixRepMod$CURRENT_FIX_INTEREST_AREA_LABEL),]
  31. #### 4. Load Interest Area Report ####
  32. IARep = read.csv("IA_report.csv", sep = ",")
  33. head(IARep)
  34. str(IARep)
  35. 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)
  36. 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)
  37. IARep$IA_ID
  38. 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.
  39. IARep$ID2
  40. ### Consider only the EXPERIMENTAL trials ###
  41. #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.
  42. IARep <- IARep[!grepl("target",IARep$preview_stim),]
  43. #levels(droplevels(IARep$preview_stim))
  44. levels(droplevels(as.factor(IARep$preview_stim)))
  45. #### 5. Consider only pre-target and target words (IARep) ####
  46. IARep2 <- IARep[grepl("target_small",IARep$IA_LABEL),]
  47. #### 6. Merge the fixation report and the interest area report based on the common ID2 but keeping all the rows from the fixation report ####
  48. RepMod <- merge(FixRepMod2, IARep2, all.x=TRUE)
  49. RepMod <- RepMod[order(RepMod$RECORDING_SESSION_LABEL, RepMod$trial.no, RepMod$CURRENT_FIX_INDEX),]
  50. #write.table(RepMod, file = "RepMod.xls", row.names=FALSE)
  51. #### 7. BLINKS ####
  52. #Identify those sequences wehere there was a BLINK in any of the areas of the pair during first pass reading.
  53. RepMod$BlinksRemove <- ifelse(RepMod$CURRENT_FIX_BLINK_AROUND!="NONE" & RepMod$CURRENT_FIX_INTEREST_AREA_RUN_ID ==1, 1, 0)
  54. #### 8. WORD SKIPPING ####
  55. #Identify SKIPS in any of the areas of the pair during first pass reading.
  56. RepMod$Skip <- ifelse(RepMod$IA_SKIP == 1 & RepMod$CURRENT_FIX_INTEREST_AREA_RUN_ID ==1, 1, 0)
  57. RepModified<-RepMod
  58. #### 11. SELECTION OF INTERESTING FIXATIONS (part 1) ####
  59. #CLEAN the data from all the fixations that we cannot keep based on the previous code and criteria.
  60. RepClean <-RepModified
  61. #First we extract only the pretarget and target words for the first pair.
  62. RepCleanFirst <- RepClean
  63. RepCleanFirst <- RepCleanFirst[grepl("target_small",RepCleanFirst$CURRENT_FIX_INTEREST_AREA_LABEL),]
  64. #Then we select to keep only those observations where there was not a skip (i.e., with value of zero).
  65. RepCleanFirst <-RepCleanFirst[(RepCleanFirst$Skip==0),]
  66. RepCleanFirst <-RepCleanFirst[(RepCleanFirst$IA_FIRST_FIX_PROGRESSIVE==1),]
  67. #If you want to check the file
  68. write.table(RepCleanFirst, file = "RepCleanFirst.xls", row.names=FALSE)
  69. #Now merge pretarget and target words for first and second pairs.
  70. RepClean2 <-RepCleanFirst
  71. #And order by participant, presentation order of the trials and fixation index.
  72. RepClean2 <- RepClean2[with(RepClean2, order(RECORDING_SESSION_LABEL, CURRENT_FIX_INDEX)),]
  73. #Save the file
  74. #write.table(RepClean2, file = "RepClean2.xls", row.names=FALSE)
  75. #Keep only first-pass reading
  76. RepClean3 <-RepClean2[grepl("1",RepClean2$CURRENT_FIX_INTEREST_AREA_RUN_ID),]
  77. RepClean3<-RepClean3[grepl("1",RepClean3$CURRENT_FIX_RUN_INDEX),]
  78. #write.table(RepClean3, file = "RepClean3.xls", row.names=FALSE)
  79. #Select unique IA_LABEL per participant per trial. So, only one pretarget and one target per pair.
  80. RepClean4<-RepClean3
  81. results_target <-RepClean4[grepl("target_small",RepClean4$IA_LABEL),]
  82. #Save the file
  83. write.table(results_target, file = "EMdata_target.xls", row.names=FALSE)
  84. #You can check how many trials per participant per condition.
  85. B <-as.data.frame.matrix(table(results_target$RECORDING_SESSION_LABEL, results_target$targte_trigger))
  86. colMeans(B) #mean of each condition
  87. rowMeans(B) #mean of each participant
  88. mean(as.matrix(B)) #mean of the whole data frame (all participants, all conditions).
  89. #Save the file
  90. write.table(B, file = "ObservationsPerPptCond.xls", row.names=TRUE)
  91. ####################################################################################################################################################
  92. #### #### 11. SELECTION OF INTERESTING FIXATIONS (part 2) ####
  93. #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
  94. #in the EEG recording (NeuroScan 4.5).
  95. #Create files where instead of the TTL/condition, we have the exact code that represents nitem/trial + condition.
  96. #### 11.0. Set your working directory ####
  97. setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output")
  98. #### 11.1. Open the Message report as extracted wih DataViewer ####
  99. MsgRep = read.csv("msg_report.csv", sep = ",")
  100. ### Consider only the EXPERIMENTAL trials ###
  101. #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.
  102. MsgRep <- MsgRep[!grepl( "res" , MsgRep$preview_trigger ), ]
  103. levels(droplevels(as.factor(MsgRep$preview_stim)))
  104. head(MsgRep)
  105. str(MsgRep)
  106. #### 11.2. Keep only the rows of the Message report that recorded the sending of TTLs ####
  107. #This will be important for the merging with the event file from the EEG recording.
  108. 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 ), ]
  109. #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).
  110. write.table(MsgRep, "MsgRep_keyword.csv",sep=",")
  111. #### 11.3. Open EvF for each participant and create one big new EvF of all participants ####
  112. setwd("S:/GRF_magno/preview/data/eeg/sf/out/event") #only store the relevant files in this folder
  113. files <- list.files(pattern = ".csv")
  114. library(data.table)
  115. data_list <- list() #this should be equal to the number of participants being analysed.
  116. for(i in 1:length(files)){
  117. file_name <- files[i]
  118. d = fread(file_name, sep=",")
  119. #Change columns names
  120. colnames(d) <- c("number","latency","type","duration","order")
  121. #Split the string by "_"
  122. filenames_vec <- strsplit(file_name, split = "_")[[1]]
  123. #Create new column to store the information
  124. d$RECORDING_SESSION_LABEL <- filenames_vec[1]
  125. data_list[[i]] <- d
  126. }
  127. EvF_all_data <- rbindlist(data_list)
  128. fwrite(EvF_all_data, "S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output/EvF_all_data.csv")
  129. #### 11.4. Set back the working directory for synchronization and open Event file ####
  130. setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output")
  131. EvF_col = read.csv("EvF_all_data.csv", sep = ",")
  132. head(EvF_col)
  133. str(EvF_col)
  134. #The column 'Presentation' refers to the time in the EEG recording when a TTL was recorded.
  135. ### Keep in the Event file only the experimental trials ###
  136. EvF_col <- EvF_col[EvF_col$type != "200",]
  137. head(EvF_col)
  138. write.table(EvF_col, "EvF_col.xls",sep="\t", row.names=FALSE)
  139. #### 11.5. Consider only the TTLon in the EvF ####
  140. #So only the values 1,2,3,4,5,6. No, the TTLoff 101,102,103,104,105,106.
  141. setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output")
  142. MsgRep = read.csv("MsgRep_keyword.csv", sep = ",")
  143. # 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.
  144. # MsgRep$CURRENT_MSG_TEXT#the number of observations here should be equal to Number of participants participants by Number of experimental trials.
  145. 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.
  146. MsgRep$CURRENT_MSG_TEXT#the number of observations here should be equal to Number of participants participants by Number of experimental trials.
  147. setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output")
  148. EvF_col = read.csv("EvF_all_data.csv", sep = ",")
  149. head(EvF_col)
  150. ### Create an Identifier for both files
  151. EvF_col$trials_run <- as.numeric(as.character(EvF_col$order))
  152. EvF_col$trials_run<- sprintf("%03d", EvF_col$order)
  153. EvF_col$Identifier <- paste(EvF_col$RECORDING_SESSION_LABEL, EvF_col$trials_run, sep="")
  154. head(EvF_col)
  155. head(EvF_col$Identifier)
  156. names(MsgRep)
  157. MsgRep$trial.no<- as.numeric(as.character(MsgRep$trial.no))
  158. MsgRep$trial.no<- sprintf("%03d", MsgRep$trial.no)
  159. MsgRep$Identifier <- paste(MsgRep$RECORDING_SESSION_LABEL,MsgRep$trial.no, sep="")
  160. head(MsgRep)
  161. head(MsgRep$Identifier)
  162. MsgRep <- MsgRep[!grepl( "res" , MsgRep$preview_stim ), ]
  163. levels(droplevels(as.factor(MsgRep$preview_stim)))
  164. #### 11.6. Merge Message report with the EvF, keeping all the columns ####
  165. MSGmergeEvF <- merge(EvF_col, MsgRep, by= "Identifier", all.y=TRUE)
  166. head(MSGmergeEvF$Identifier)
  167. MSGmergeEvF2 <- MSGmergeEvF
  168. 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.
  169. ### Save the new file.
  170. write.table(MSGmergeEvF2, "MSGmergeEvF2.txt",sep="\t", row.names=FALSE)
  171. #### 11.7. Load the files obtained from the preprocessing of EM data ####
  172. #Please note that here you need to manually save the files "EMdata_pretarget.xls" and "EMdata_target.xls" as .csv files.
  173. setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output")
  174. Rep_target = read.csv("EMdata_target.csv", sep = ",")
  175. Rep_target$trial.no<- as.numeric(as.character(Rep_target$trial.no))
  176. Rep_target$trial.no<- sprintf("%03d", Rep_target$trial.no)
  177. Rep_target$Identifier <- paste(Rep_target$RECORDING_SESSION_LABEL, Rep_target$trial.no, sep="")
  178. Rep_target$Identifier
  179. Rep_target$ID3 <- paste(Rep_target$RECORDING_SESSION_LABEL, sep="")
  180. Rep_target$ID3
  181. write.table(Rep_target, "Rep_target.csv",sep=",")
  182. #### 11.8. Merge the files from EM preprocessing with messageReport/Evf ####
  183. ###Merge each of these files with the MSGmergeEvF, in order to have only the trials needed.
  184. #It will give all the columns from Rep_XXXtarget, but only the specified columns from MSGmergeEvF.
  185. #Only the rows in common (with same ID3 in the 2 files) will be included.
  186. 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")]
  187. Rep_target_code <- merge(Rep_target, MSGmergeEvF2, by="Identifier", all.x=TRUE)
  188. Rep_target_code <- Rep_target_code[order(Rep_target_code$RECORDING_SESSION_LABEL,Rep_target_code$latency),]
  189. write.table(Rep_target_code, "Rep_target_code.txt",sep="\t", row.names=FALSE)
  190. #### 11.9. Create three new columns (first saccade onset, first fixation onset, first fixation duration) for each IA file ####
  191. #Divide the values by 1000, in order to transform the values into seconds, then multiply by your sampling rate (in our case 1000 Hz).
  192. #This is important to see these values in the EEG epochs of 1 second. (NOTE: The column Presentation, in the
  193. #EEG event file is in datapoints, so we need to transform the EMs measures into the same unit - in our case milliseconds.)
  194. #2)first fixation onset
  195. Rep_target_code$IA_FIRST_FIXATION_TIME <- as.numeric(as.character(Rep_target_code$IA_FIRST_FIXATION_TIME))
  196. Rep_target_code$first_fixation_onset <- (Rep_target_code$IA_FIRST_FIXATION_TIME - Rep_target_code$CURRENT_MSG_TIME)
  197. head(Rep_target_code$first_fixation_onset)
  198. #3)first fixation duration - We have it already
  199. head(Rep_target_code$IA_FIRST_FIXATION_DURATION)
  200. write.table(Rep_target_code, "Rep_target_code2.txt",sep="\t", row.names=FALSE)
  201. #### 11.10. Create a new file only with the columns needed. ####
  202. 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",
  203. "CURRENT_FIX_INTEREST_AREA_RUN_ID","IA_LEGAL", "IA_FIRST_FIX_PROGRESSIVE", "IA_FIRST_FIXATION_DURATION",
  204. "IA_FIRST_RUN_DWELL_TIME","IA_FIXATION_COUNT","preview_stim.x")]
  205. head(Rep_target_complete)
  206. write.table(Rep_target_complete, file = "Rep_target_complete.txt",sep="\t",row.names=FALSE)
  207. #### 11.11. Now we need one file with saccade and fixation onset based on original Presentation time ####
  208. #Create event files for each IA, with Fixation onset as Presentation and Fixation duration as Latency.
  209. #It works with the correct order of TTL
  210. Rep_target <- Rep_target_complete
  211. colnames(Rep_target)
  212. colnames(Rep_target)[6] <- "urPresentation" #original Presentation time of TTLon
  213. #Rep_target$urPresentation<- as.numeric(as.character(Rep_target$urPresentation))
  214. #Rep_target$first_fixation_onset<- as.numeric(as.character(Rep_target$first_fixation_onset))
  215. Rep_target$TimeLockFixOnset <-Rep_target$urPresentation + Rep_target$first_fixation_onset
  216. head(Rep_target)
  217. write.table(Rep_target, file = "Rep_target.txt",sep="\t",row.names=FALSE)
  218. #### 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 ####
  219. ###Save in separate files according to participant's number
  220. setwd("S:/GRF_magno/preview/data/eye data/formal/sf/out/sf/Output/event_syn")
  221. for (ppt in unique(Rep_target$RECORDING_SESSION_LABEL)) {
  222. write.csv(Rep_target[Rep_target$RECORDING_SESSION_LABEL == ppt,], file = paste0("EvF_target_", ppt, ".csv"),row.names=FALSE)
  223. }
  224. #### 11.13. FINAL EvF TO IMPORT IN MATLAB ####
  225. #Combine pretarget and target files in a format that can be used for Baseline Correction of EEG signal
  226. colnames(Rep_target)
  227. #the names of the columns need to be exactly the same, as well as their class
  228. class(Rep_target$IA_SPILLOVER)
  229. head(Rep_target$IA_SPILLOVER)
  230. Rep_target$IA_SPILLOVER <- as.integer(as.character(Rep_target$IA_SPILLOVER))
  231. head(Rep_target$IA_SPILLOVER)
  232. newEvF_preT <- Rep_target
  233. head(newEvF_preT)
  234. #Order by TimeLockFixOnset
  235. newEvF_preT <- newEvF_preT[order(newEvF_preT$RECORDING_SESSION_LABEL,newEvF_preT$TRIAL_INDEX,newEvF_preT$TimeLockFixOnset),] #
  236. head(newEvF_preT)
  237. #Create new Column BaseLineOnset with prefonset and tfonset
  238. newEvF_preT$BaseLineOnset <-ifelse(grepl("KEYWORD 111",newEvF_preT$CURRENT_MSG_TEXT), "unnonrep",
  239. ifelse(grepl("KEYWORD 112",newEvF_preT$CURRENT_MSG_TEXT), "unrep",
  240. ifelse(grepl("KEYWORD 113",newEvF_preT$CURRENT_MSG_TEXT), "pnonrep",
  241. ifelse(grepl("KEYWORD 114",newEvF_preT$CURRENT_MSG_TEXT), "prep",
  242. ifelse(grepl("KEYWORD 115",newEvF_preT$CURRENT_MSG_TEXT), "mnonrep",
  243. ifelse(grepl("KEYWORD 116",newEvF_preT$CURRENT_MSG_TEXT), "mrep",NA))))))
  244. newEvF_preT <- newEvF_preT[grepl("KEYWORD 111|KEYWORD 112|KEYWORD 113|KEYWORD 114|KEYWORD 115|KEYWORD 116",newEvF_preT$CURRENT_MSG_TEXT), ]
  245. head(newEvF_preT)
  246. write.table(newEvF_preT, file = "newEvF_preT_complete.txt",sep="\t",row.names=FALSE)
  247. ###Save in separate files according to participant's number
  248. for (ppt in unique(newEvF_preT$RECORDING_SESSION_LABEL)) {
  249. write.csv(newEvF_preT[newEvF_preT$RECORDING_SESSION_LABEL == ppt,], file = paste0("newEvF_preT_", ppt, ".csv"),row.names=FALSE)
  250. }
  251. #### The format of the EvF in NeuroScan ####
  252. #The EvF in Neuroscan has a particular format and contains 6 columns:
  253. #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.
  254. #2nd: actual event code. Thus you can specify multiple codes in the file. So, it can be TTL, condition, CODE, etc.
  255. #3rd: The next 3 columns can be used to associate response information with the event; this column is the code of the response itself.
  256. #4th: This column can be used to show the accuracy of the response (1=correct response; 0=incorrect response; -1=incorrect rejection to respond).
  257. #5th: This column can be used to indicate the latency of said response to the stimulus, in seconds.
  258. #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
  259. #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.
  260. #No column names should appear.

preprocessing_EMdata_sf_OSF.R, no license · at the source

Overview

  1. School of Psychology, Nanjing Normal University, Nanjing, China
  2. Department of Psychology, The Chinese University of Hong Kong, Hong Kong, China
  3. BCBL, Basque Center on Brain, Language and Cognition, Donostia–San Sebastián, Spain
  4. Department of Psychology, Humboldt-Universität zu Berlin, Berlin, Germany
  5. Department of Physics and Life Science Imaging Center, Hong Kong Baptist University, Hong Kong, China
  6. Department of Psychology, Zhejiang Normal University, Jin Hua, China
  7. Faculty of Education, National University of Malaysia, Kuala Lumpur, Malaysia
  8. Department of Experimental Psychology, University of Groningen, Groningen, The Netherlands
  9. Brain and Mind Institute, The Chinese University of Hong Kong, Hong Kong, China
Journal: Neurobiology of language (Cambridge, Mass.), volume 7, article NOL.a.223
Dates: received 4 March 2025; accepted 6 November 2025; published online 16 March 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1162/nol.a.223 · PMID 41918575 · PMCID PMC13035401 · OpenAlex W7105601244
Open access: gold, a free copy (OpenAlex)
Preprint: osf.io/abrpc
Status: code verified
Categories: EEG (modality)
Methods: Spectral & time-frequency, Smoothing, state filtering, decompositions, Statistics, fMRI & imaging, Physiology & signal measures
Keywords: combined EEG and eye tracking, luminance contrast, magnocellular, parvocellular, spatial frequency, visual word recognition
Topic: Neural and Behavioral Psychology Studies (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Funding: Hong Kong Government (RGC-GRF 14616418)
Citations: not cited yet (Europe PMC); 119 references in the paper

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

License: none: the authors keep all their rights
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Languages: MATLAB (2), R (2)
Size: 8 files, 4 scripts
Software Heritage: not checked
Found in: “Data and Code Availability Statements”
Holds: 2 notebooks
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: data.table (2 files), tidyverse (2 files)
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
  • 30 September 2026: the link answers (HTTP 200)
4 files
At the source: osf.io/abrpc/

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://osf.io/abrpc/.

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://doi.org/10.1162/nol.a.223

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/nol.a.223},
url = {https://doi.org/10.1162/nol.a.223},
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/03/16
VL - 7
SP - NOL.a.223
SN - 2641-4368
PB - MIT Press
DO - 10.1162/nol.a.223
UR - https://doi.org/10.1162/nol.a.223
LA - en
ER -

CSL-JSON

{
"id": "10.1162/nol.a.223",
"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": "Neurobiol Lang (Camb)",
"volume": "7",
"page": "NOL.a.223",
"DOI": "10.1162/nol.a.223",
"PMID": "41918575",
"PMCID": "PMC13035401",
"ISSN": "2641-4368",
"publisher": "MIT Press",
"URL": "https://doi.org/10.1162/nol.a.223",
"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 methods
In 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 one
In common: tidyverse, EEG, 4 references
[4] doi:10.1111/psyp.70362 [code]
Pupil Constriction Causes Activity in the Human Retina and Visual System.
Journal: Psychophysiology
In 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 science
In 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 behaviour
In 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 psychology
In common: tidyverse, EEG, 3 references
[10] doi:10.1111/psyp.70285 [code]
Spontaneous Modulation of Alpha Power During a Neurofeedback Session Without Instructions.
Journal: Psychophysiology
In 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.

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.