NeuroAnalyzer tutorials: Importing/exporting data

Import

The following data formats are supported:

  • EDF (.edf)
  • EDF+ (.edf)
  • Alice4 EDF (.edf)
  • BDF (.bdf)
  • BDF+ (.bdf)
  • GDF (.gdf)
  • DigiTrack (.ascii)
  • BrainVision (.vhdr)
  • CSV (.csv): channels × time or time × channels data tables are recognized automatically
  • EEGLAB (.set): preliminary support
  • FieldTrip (.mat): EEG, MEG, NIRS, events – preliminary support
  • FIFF (.fif|.fiff): preliminary support
  • Neuroscan continuous signal (.cnt)
  • Neuralinx Continuously Sampled Channels (CSC) (.ncs)
  • Neurodata Without Borders (.nwb)
  • Extensible Data Format (.xdf)
  • NIRS (.nirs)
  • SNIRF (.snirf)
  • NIRX (.nirx)
  • DuoMAG MEP (.ascii|.m)

Load recording file – proper importer is recognized based on file extension:

using NeuroAnalyzer
eeg = import_recording("files/eeg.edf")
[ Info: Imported: EEG (24 × 308480 × 1; 1205.0 s)
NeuroAnalyzer.NEURO(NeuroAnalyzer.HEADER(Dict{Symbol, Any}(:weight => -1, :id => "", :middle_name => "", :height => -1, :head_circumference => -1, :handedness => "", :last_name => "528004  SIT 52, 20220831-122227-{d589f756-53fc-4f1b-915d-6e3b8c1560ad}", :first_name => ""), Dict{Symbol, Any}(:epoch_id => "", :channel_type => ["eeg", "eeg", "eeg", "eeg", "eeg", "eeg", "eeg", "eeg", "eeg", "eeg"  …  "eeg", "eeg", "ref", "ref", "eeg", "eeg", "eeg", "eog", "eog", "ecg"], :label => ["Fp1", "Fp2", "F3", "F4", "C3", "C4", "P3", "P4", "O1", "O2"  …  "T5", "T6", "A1", "A2", "Fz", "Cz", "Pz", "EOG1", "EOG2", "ECG"], :prefiltering => ["HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz"  …  "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz"], :gain => [0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218  …  0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218, 0.17935713740749218], :data_type => "eeg", :recording_notes => "", :recording_date => "31.08.22", :sampling_rate => 256, :file_type => "EDF"…), Dict(:name => "", :design => "", :notes => "")), [0.0, 0.004, 0.008, 0.012, 0.016, 0.02, 0.023, 0.027, 0.031, 0.035  …  1204.961, 1204.965, 1204.969, 1204.973, 1204.977, 1204.98, 1204.984, 1204.988, 1204.992, 1204.996], [0.0, 0.004, 0.008, 0.012, 0.016, 0.02, 0.023, 0.027, 0.031, 0.035  …  1204.961, 1204.965, 1204.969, 1204.973, 1204.977, 1204.98, 1204.984, 1204.988, 1204.992, 1204.996], [741.6417631799801 923.6892576485848 … 0.0 0.0; 1620.8504507515067 1541.5745960173954 … 0.0 0.0; … ; -354.230346379797 -69.76992645151445 … 0.0 0.0; -1115.0633232623788 -8.071071183337148 … 0.0 0.0;;;], Dict{Any, Any}(), 0×5 DataFrame
 Row  id      start    length   value   channel  String  Float64  Float64  String  Int64   
─────┴───────────────────────────────────────────, 23×9 DataFrame
 Row  label   loc_radius  loc_theta  loc_x    loc_y    loc_z    loc_radius_sp ⋯
     │ String  Float64     Float64    Float64  Float64  Float64  Float64       ⋯
─────┼──────────────────────────────────────────────────────────────────────────
   1 │ Fp1            0.0        0.0      0.0      0.0      0.0             0. ⋯
   2 │ Fp2            0.0        0.0      0.0      0.0      0.0             0.
   3 │ F3             0.0        0.0      0.0      0.0      0.0             0.
   4 │ F4             0.0        0.0      0.0      0.0      0.0             0.
   5 │ C3             0.0        0.0      0.0      0.0      0.0             0. ⋯
   6 │ C4             0.0        0.0      0.0      0.0      0.0             0.
   7 │ P3             0.0        0.0      0.0      0.0      0.0             0.
   8 │ P4             0.0        0.0      0.0      0.0      0.0             0.
   9 │ O1             0.0        0.0      0.0      0.0      0.0             0. ⋯
  10 │ O2             0.0        0.0      0.0      0.0      0.0             0.
  11 │ F7             0.0        0.0      0.0      0.0      0.0             0.
  ⋮  │   ⋮         ⋮           ⋮         ⋮        ⋮        ⋮           ⋮       ⋱
  14 │ T4             0.0        0.0      0.0      0.0      0.0             0.
  15 │ T5             0.0        0.0      0.0      0.0      0.0             0. ⋯
  16 │ T6             0.0        0.0      0.0      0.0      0.0             0.
  17 │ Fz             0.0        0.0      0.0      0.0      0.0             0.
  18 │ Cz             0.0        0.0      0.0      0.0      0.0             0.
  19 │ Pz             0.0        0.0      0.0      0.0      0.0             0. ⋯
  20 │ EOG1           0.0        0.0      0.0      0.0      0.0             0.
  21 │ EOG2           0.0        0.0      0.0      0.0      0.0             0.
  22 │ A1             0.0        0.0      0.0      0.0      0.0             0.
  23 │ A2             0.0        0.0      0.0      0.0      0.0             0. ⋯
                                                    3 columns and 2 rows omitted, String[])

By default, channel types (EEG, ECG, EOG, etc.) are recognized automatically based on channel labels. This may not work for some recordings with incorrect channel names. Channel type detection can be disabled using detect_type::Bool parameter:

eeg = import_recording("files/eeg.edf")
eeg.header.recording[:channel_type]
m[ Info: Imported: EEG (24 × 308480 × 1; 1205.0 s)
24-element Vector{String}:
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "ref"
 "ref"
 "eeg"
 "eeg"
 "eeg"
 "eog"
 "eog"
 "ecg"
eeg = import_recording("files/eeg.edf", detect_type=false)
eeg.header.recording[:channel_type]
m[ Info: Imported: EEG (24 × 308480 × 1; 1205.0 s)
24-element Vector{String}:
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"
 "eeg"

Load EDF/EDF+:

eeg = import_edf("files/eeg-test-edf.edf")
eeg = import_edf("files/eeg-test-edfplus.edf")

Load Alice4 EDF:

eeg = import_alice4("files/eeg-test-alice4.edf")

Load BDF/BDF+:

eeg = import_recording("files/eeg-test-bdf.bdf")
eeg = import_recording("files/eeg-test-bdfplus.bdf")

Load GDF:

eeg = import_recording("files/eeg-test-gdf_1.25.gdf")
eeg = import_recording("files/eeg-test-gdf_2.20.gdf")

Load DigiTrack:

eeg = import_digitrack("files/eeg-test-digitrack.txt")

Load BrainVision (at least two files must be available: .vhdr/.ahdr and .eeg):

eeg = import_recording("files/eeg-test-bv.vhdr")
eeg = import_recording("files/eeg-test-bv.ahdr")

(!) BrainVision .eeg and .vmrk (markers, optional) files will be loaded using file names provided in .vhdr/.ahdr. All three files must be located in the same folder.

Load CSV:

eeg = import_csv("files/eeg-test_chxt.csv.gz")
eeg = import_csv("files/eeg-test_txch.csv.gz")

Load SET:

eeg = import_set("files/eeg-test-eeglab.set")

Export

Object may be exported to CSV files:

export_csv(eeg, file_name="files/eeg.csv")

(!) By default, only signals are exported.

To export header meta-data, markers, components and locs:

export_csv(eeg, file_name="files/eeg.csv", header=true, components=true, markers=true, locs=true)

Save

NeuroAnalyzer NEURO objects are saved as HDF5 file.

To save the object:

save(eeg, file_name="files/eeg.hdf")

To overwrite, set overwrite=true:

save(eeg, file_name="files/eeg.hdf", overwrite=true)

(!) Filename extension must be .hdf

Load

Loading NeuroAnalyzer object from HDF5:

eeg = load("files/eeg.hdf")
m[ Info: Loaded: EEG (24 × 308480 × 1; 1204.996 s)
NeuroAnalyzer.NEURO(NeuroAnalyzer.HEADER(Dict{Symbol, Any}(:weight => -1, :id => "", :middle_name => "", :height => -1, :head_circumference => -1, :handedness => "", :last_name => "528004  SIT 52, 20220831-122227-{d589f756-53fc-4f1b-915d-6e3b8c1560ad}", :first_name => ""), Dict{Symbol, Any}(:recording => "EEGDigiTrack EEG-1042 (42-channel EEG Amplifier) V0.5 Rev. 41", :epoch_id => "", :channel_order => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10  …  15, 16, 19, 20, 21, 17, 18, 22, 23, 24], :channel_type => ["eeg", "eeg", "eeg", "eeg", "eeg", "eeg", "eeg", "eeg", "eeg", "eeg"  …  "eeg", "eeg", "ref", "ref", "eeg", "eeg", "eeg", "eog", "eog", "ecg"], :unit => ["μV", "μV", "μV", "μV", "μV", "μV", "μV", "μV", "μV", "μV"  …  "μV", "μV", "μV", "μV", "μV", "μV", "μV", "μV", "μV", "mV"], :file_size_mb => 62685.32, :recording_time => "12:32:53", :label => ["Fp1", "Fp2", "F3", "F4", "C3", "C4", "P3", "P4", "O1", "O2"  …  "T5", "T6", "A1", "A2", "Fz", "Cz", "Pz", "EOG1", "EOG2", "ECG"], :prefiltering => ["HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz"  …  "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz", "HP:0,18Hz LP:104,0Hz"], :line_frequency => 50…), Dict(:name => "", :design => "", :notes => "")), [0.0, 0.004, 0.008, 0.012, 0.016, 0.02, 0.023, 0.027, 0.031, 0.035  …  1204.961, 1204.965, 1204.969, 1204.973, 1204.977, 1204.98, 1204.984, 1204.988, 1204.992, 1204.996], [0.0, 0.004, 0.008, 0.012, 0.016, 0.02, 0.023, 0.027, 0.031, 0.035  …  1204.961, 1204.965, 1204.969, 1204.973, 1204.977, 1204.98, 1204.984, 1204.988, 1204.992, 1204.996], [0.06299352498755795 98.63512726760528 … -3.1830986460670267 0.0006574697346035663; 0.11655563660927726 -53.828853350413745 … 2.690060794085174 0.0004150149321296981; … ; -0.022184604323419066 127.03733086748798 … -0.6385598239986807 0.0008236881401195717; -0.055585528301492104 530.00037195304 … -8.80813398237423 0.0018241535887852933;;;], Dict{Any, Any}(), 0×5 DataFrame
 Row  id      start    length   description  channel  String  Float64  Float64  String       Int64   
─────┴────────────────────────────────────────────────, 23×9 DataFrame
 Row  label   loc_radius  loc_theta  loc_x    loc_y    loc_z    loc_radius_sp ⋯
     │ String  Float64     Float64    Float64  Float64  Float64  Float64       ⋯
─────┼──────────────────────────────────────────────────────────────────────────
   1 │ Fp1           1.0       108.0    -0.31     0.95    -0.03            1.0 ⋯
   2 │ Fp2           1.0        72.0     0.31     0.95    -0.03            1.0
   3 │ F7            1.0       144.0    -0.81     0.59    -0.03            1.0
   4 │ F3            0.65      129.0    -0.55     0.67     0.5             1.0
   5 │ Fz            0.51       90.0     0.0      0.72     0.7             1.0 ⋯
   6 │ F4            0.65       51.0     0.55     0.67     0.5             1.0
   7 │ F8            1.0        36.0     0.81     0.59    -0.03            1.0
   8 │ T3            1.0       180.0    -1.0      0.0     -0.03            1.0
   9 │ C3            0.51      180.0    -0.72     0.0      0.7             1.0 ⋯
  10 │ Cz            0.0         0.0     0.0      0.0      1.0             1.0
  11 │ C4            0.51        0.0     0.72     0.0      0.7             1.0
  ⋮  │   ⋮         ⋮           ⋮         ⋮        ⋮        ⋮           ⋮       ⋱
  14 │ P3            0.65      231.0    -0.55    -0.67     0.5             1.0
  15 │ Pz            0.51      270.0     0.0     -0.72     0.7             1.0 ⋯
  16 │ P4            0.65      309.0     0.55    -0.67     0.5             1.0
  17 │ T6            1.0       324.0     0.81    -0.59    -0.03            1.0
  18 │ O1            1.0       252.0    -0.31    -0.95    -0.03            1.0
  19 │ O2            1.0       288.0     0.31    -0.95    -0.03            1.0 ⋯
  20 │ A1            1.0       192.0    -0.92    -0.23    -0.55            1.1
  21 │ A2            1.0       -12.0     0.92    -0.23    -0.55            1.1
  22 │ EOG1          1.01      149.0    -0.87     0.51    -0.37            1.0
  23 │ EOG2          1.01       31.0     0.87     0.51    -0.37            1.0 ⋯
                                                    3 columns and 2 rows omitted, ["reset_components(OBJ)", "filter(OBJ, ch=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24], fprototype=iirnotch, ftype=nothing, cutoff=50, order=8, rp=-1, rs=-1, dir=twopass, w=nothing)", "reset_components(OBJ)", "filter(OBJ, ch=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24], fprototype=fir, ftype=hp, cutoff=0.1, order=8, rp=-1, rs=-1, dir=twopass, w=nothing)"])