Skip to content

read_raw_eyelink() fails to find and drop status column #13567

@qian-chu

Description

@qian-chu

Description of the problem

mne.io.read_raw_eyelink() returns error when reading .asc format eye-tracking data (see below). Error message points to a potential column parsing error.

From what I notice, the data is a bit special in two ways:

  • It has two recording segments, the first one only spanning 12 samples
  • The second segment starts with a bunch of null data

Steps to reproduce

from mne.io import read_raw_eyelink
raw = read_raw_eyelink("my_data.asc")

Link to data

https://drive.google.com/file/d/1Opc_EDcaOgsx11VsDW4Ul-kP4548tRXq/view?usp=sharing

or to view the starting segment:

** CONVERTED FROM fname.edf using edfapi 4.2.762.0 Windows   standalone Jul 20 2023 on Sat Dec 27 13:33:11 2025
** DATE: Fri Nov 28 14:28:25 2025
** TYPE: EDF_FILE BINARY EVENT SAMPLE TAGGED
** VERSION: EYELINK II 1
** SOURCE: EYELINK CL
** EYELINK II CL v6.10.01 Apr 13 2017 (EyeLink Portable Duo)
** CAMERA: EyeLink USBCAM Version 1.01
** SERIAL NUMBER: CLU-DAB12
** CAMERA_CONFIG: DAB12200.SCD
** REPARSED BY EDF Reparser using XXXX\edf_reparser_1.ini on Sat Dec 27 13:32:32 2025
**

MSG	814482 DISPLAY_COORDS 0 0 1919 1079
MSG	854216 !CAL 
>>>>>>> CALIBRATION (HV13,P-CR) FOR RIGHT: <<<<<<<<<
MSG	854216 !CAL Calibration points:  
MSG	854216 !CAL  6.3, -20.8      1902,   5137   
MSG	854216 !CAL  5.4, -30.6      2090,   8027   
MSG	854216 !CAL  7.3, -10.0      1736,   2608   
MSG	854216 !CAL -14.7, -20.1     -1653,   5232   
MSG	854216 !CAL  26.9, -19.8      5627,   5033   
MSG	854217 !CAL -15.4, -30.0     -1717,   8061   
MSG	854217 !CAL  26.0, -29.4      6100,   7998   
MSG	854217 !CAL -14.3, -10.5     -1599,   2756   
MSG	854217 !CAL  26.6, -9.7      5225,   2457   
MSG	854217 !CAL -5.4, -25.7       132,   6565   
MSG	854217 !CAL  15.7, -25.3      3896,   6493   
MSG	854217 !CAL -3.3, -15.0        76,   3896   
MSG	854217 !CAL  16.9, -14.7      3597,   3768   
MSG	854217 !CAL  0.0,  0.0         0,      0   
MSG	854217 !CAL eye check box: (L,R,T,B)
	  -20    31   -34     3
MSG	854217 !CAL href cal range: (L,R,T,B)
	-3672  8054 -2015  10076
MSG	854217 !CAL Cal coeff:(X=a+bx+cy+dxx+eyy,Y=f+gx+goaly+ixx+jyy)
   1390.2  161.17  166.04  0.80193  9.8325 
  -309.93  11.066 -368.28 -0.37089 -9.0911
MSG	854217 !CAL Gains: cx:173.631 lx:142.706 rx:195.646
MSG	854217 !CAL Gains: cy:228.075 ty:418.147 by:494.680
MSG	854217 !CAL Resolution (upd) at screen center: X=1.5, Y=1.2
MSG	854217 !CAL Gain Change Proportion: X: 0.371 Y: 0.183
MSG	854217 !CAL Gain Ratio (Gy/Gx) = 1.314
MSG	854217 !CAL Cross-Gain Ratios: X=0.555, Y=0.033 
MSG	854217 !CAL PCR gain ratio(x,y) = 2.500, 2.500
MSG	854217 !CAL CR gain match(x,y) = 1.000, 1.000
MSG	854217 !CAL Slip rotation correction OFF
MSG	854217 !CAL CALIBRATION HV13 R RIGHT   GOOD 
MSG	883460 !CAL VALIDATION HV13 R RIGHT GOOD ERROR 0.41 avg. 0.92 max  OFFSET 0.15 deg. 5.5,-4.9 pix.
MSG	883460 VALIDATE R 4POINT 0 RIGHT  at 960,540  OFFSET 0.23 deg.  -0.9,-9.5 pix.
MSG	883460 VALIDATE R 4POINT 1 RIGHT  at 960,168  OFFSET 0.46 deg.  18.4,13.2 pix.
MSG	883460 VALIDATE R 4POINT 2 RIGHT  at 960,911  OFFSET 0.47 deg.  -23.0,8.5 pix.
MSG	883460 VALIDATE R 4POINT 3 RIGHT  at 259,540  OFFSET 0.88 deg.  40.4,-20.4 pix.
MSG	883460 VALIDATE R 4POINT 4 RIGHT  at 1660,540  OFFSET 0.22 deg.  4.4,8.4 pix.
MSG	883460 VALIDATE R 4POINT 5 RIGHT  at 343,212  OFFSET 0.79 deg.  39.1,14.0 pix.
MSG	883460 VALIDATE R 4POINT 6 RIGHT  at 1576,212  OFFSET 0.20 deg.  -5.2,-7.4 pix.
MSG	883460 VALIDATE R 4POINT 7 RIGHT  at 343,867  OFFSET 0.88 deg.  -48.2,-4.4 pix.
MSG	883460 VALIDATE R 4POINT 8 RIGHT  at 1576,867  OFFSET 0.21 deg.  6.4,7.1 pix.
MSG	883460 VALIDATE R 4POINT 9 RIGHT  at 609,354  OFFSET 0.55 deg.  22.7,14.8 pix.
MSG	883460 VALIDATE R 4POINT 10 RIGHT  at 1310,354  OFFSET 0.30 deg.  16.7,-0.4 pix.
MSG	883460 VALIDATE R 4POINT 11 RIGHT  at 609,725  OFFSET 0.92 deg.  -50.6,-4.2 pix.
MSG	883460 VALIDATE R 4POINT 12 RIGHT  at 1310,725  OFFSET 0.20 deg.  -10.2,3.4 pix.
MSG	888976 RECCFG CR 1000 2 1 R
MSG	888976 ELCLCFG RBTABLER
MSG	888976 GAZE_COORDS 0.00 0.00 1919.00 1079.00
MSG	888976 THRESHOLDS R 77 210
MSG	888976 ELCL_WINDOW_SIZES 176 176 208 208
MSG	888976 CAMERA_LENS_FOCAL_LENGTH 27.00 
MSG	888976 PUPIL_DATA_TYPE RAW_AUTOSLIP
MSG	888976 ELCL_PROC ELLIPSE  (5)
MSG	888976 ELCL_EFIT_PARAMS 1.01 4.00  0.15 0.05  0.65 0.65  0.00 0.00 0.30
START	888977 	RIGHT	SAMPLES	EVENTS
PRESCALER	1
VPRESCALER	1
PUPIL	AREA
EVENTS	GAZE	RIGHT	RATE	1000.00	TRACKING	CR	FILTER	2
SAMPLES	GAZE	RIGHT	RATE	1000.00	TRACKING	CR	FILTER	2
MSG	888977 !MODE RECORD CR 1000 2 1 R
888977	  961.0	  600.1	  757.0	...
888978	  960.8	  600.3	  758.0	...
888979	  960.8	  600.6	  759.0	...
888980	  960.8	  601.0	  760.0	...
888981	  960.8	  601.4	  762.0	...
888982	  960.9	  601.8	  763.0	...
888983	  960.9	  602.1	  763.0	...
888984	  961.0	  602.3	  764.0	...
888985	  961.1	  602.5	  764.0	...
888986	  961.2	  602.6	  764.0	...
888987	  961.2	  602.7	  765.0	...
888988	  961.3	  602.8	  764.0	...
MSG	888989 RECCFG CR 1000 2 1 R
MSG	888989 ELCLCFG RBTABLER
MSG	888989 GAZE_COORDS 0.00 0.00 1919.00 1079.00
MSG	888989 THRESHOLDS R 76 210
MSG	888989 ELCL_WINDOW_SIZES 176 176 208 208
MSG	888989 CAMERA_LENS_FOCAL_LENGTH 27.00 
MSG	888989 PUPIL_DATA_TYPE RAW_AUTOSLIP
MSG	888989 ELCL_PROC ELLIPSE  (5)
MSG	888989 ELCL_EFIT_PARAMS 1.01 4.00  0.15 0.05  0.65 0.65  0.00 0.00 0.30
888989	  961.5	  602.8	  764.0	...
MSG	888990 !MODE RECORD CR 1000 2 1 R
888990	  961.8	  602.9	  764.0	...
888991	  962.2	  602.9	  764.0	...
END	888991 	SAMPLES	EVENTS	RES	  54.10	  40.70
START	888991 	RIGHT	SAMPLES	EVENTS
PRESCALER	1
VPRESCALER	1
PUPIL	AREA
EVENTS	GAZE	RIGHT	RATE	1000.00	TRACKING	CR	FILTER	2
SAMPLES	GAZE	RIGHT	RATE	1000.00	TRACKING	CR	FILTER	2
888993	   .	   .	    0.0
888994	   .	   .	    0.0
888995	   .	   .	    0.0
888996	   .	   .	    0.0
888997	   .	   .	    0.0
SFIX R   888998
888998	   .	   .	    0.0
<same null data, dropped for display on GitHub>
889500	   .	   .	    0.0
889501	   .	   .	    0.0
889502	   .	   .	    0.0
889503	   .	   .	    0.0
889504	  916.5	  575.5	  655.0	...
889505	  916.3	  575.2	  655.0	...
889506	  916.0	  574.7	  655.0	...
889507	  916.0	  574.1	  655.0	...
889508	  915.9	  573.6	  655.0	...
889509	  915.9	  573.0	  655.0	...

Expected results

Data successfully read into as a Raw instance.

Actual results

Loading C:\Users\qian.chu\Downloads\my_data.asc
Pixel coordinate data detected.Pass `scalings=dict(eyegaze=1e3)` when using plot method to make traces more legible.
Pupil-size area detected.
No button events found in this file.
Traceback (most recent call last):
  File "c:\Users\qian.chu\Downloads\read.py", line 2, in <module>
    raw = read_raw_eyelink("my_data.asc")
  File "C:\Users\qian.chu\Documents\GitHub\mne-python\mne\io\eyelink\eyelink.py", line 59, in read_raw_eyelink
    raw_eyelink = RawEyelink(
        fname,
    ...<4 lines>...
        verbose=verbose,
    )
  File "<decorator-gen-206>", line 12, in __init__
  File "C:\Users\qian.chu\Documents\GitHub\mne-python\mne\io\eyelink\eyelink.py", line 104, in __init__
    eye_ch_data, info, raw_extras = _parse_eyelink_ascii(
                                    ~~~~~~~~~~~~~~~~~~~~^
        fname, find_overlaps, overlap_threshold, apply_offsets
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Users\qian.chu\Documents\GitHub\mne-python\mne\io\eyelink\_utils.py", line 56, in _parse_eyelink_ascii
    processed_blocks = _create_dataframes(data_blocks, apply_offsets)
  File "C:\Users\qian.chu\Documents\GitHub\mne-python\mne\io\eyelink\_utils.py", line 336, in _create_dataframes
    block_dfs = _create_dataframes_for_block(block, apply_offsets)
  File "C:\Users\qian.chu\Documents\GitHub\mne-python\mne\io\eyelink\_utils.py", line 370, in _create_dataframes_for_block
    df_dict["samples"] = _drop_status_col(df_dict["samples"])  # drop STATUS col
                         ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\qian.chu\Documents\GitHub\mne-python\mne\io\eyelink\_utils.py", line 562, in _drop_status_col
    if samples_df[col][0][0].isnumeric():
       ~~~~~~~~~~~~~~~~~~^^^
TypeError: 'NoneType' object is not subscriptable

Additional information

Platform             Windows-11-10.0.26100-SP0
Python               3.13.7 | packaged by conda-forge | (main, Sep  3 2025, 14:18:04) [MSC v.1944 64 bit (AMD64)]
Executable           <directory omitted>l\miniforge3\envs\ieeg\python.exe
CPU                  Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz (8 cores)
Memory               15.9 GiB

Core
 X mne               1.11.0.dev64+g3e29187ce (outdated, release 1.11.0 is available!)
 + numpy             2.3.3 (OpenBLAS 0.3.30 with 8 threads)
 + scipy             1.16.2
 + matplotlib        3.10.6 (backend=qtagg)

Numerical (optional)
 + sklearn           1.7.2
 + numba             0.62.0
 + nibabel           5.3.2
 + nilearn           0.12.1
 + dipy              1.11.0
 + openmeeg          2.5.15
 + pandas            2.3.2
 + h5io              0.2.5
 + h5py              3.14.0
 - unavailable       cupy

Visualization (optional)
 + pyvista           0.46.3 (OpenGL 4.5.0 - Build 31.0.101.2135 via Intel(R) UHD Graphics 620)
 + pyvistaqt         0.11.3
 + vtk               9.5.2
 + qtpy              2.4.3 (PyQt6=6.9.0)
 + ipympl            0.9.7
 + pyqtgraph         0.13.7
 + mne-qt-browser    0.7.2
 + ipywidgets        8.1.7
 + trame_client      3.10.4
 + trame_server      3.6.1
 + trame_vtk         2.9.1
 + trame_vuetify     3.1.0

Ecosystem (optional)
 + mne-bids          0.17.0
 + neo               0.14.2
 + eeglabio          0.1.2
 + edfio             0.4.9
 + mffpy             0.10.0
 + pybv              0.7.6
 + antio             0.6.1
 + defusedxml        0.7.1
 - unavailable       mne-nirs, mne-features, mne-connectivity, mne-icalabel, mne-bids-pipeline, curryreader

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions