Table of Contents

Reading and writing data with the fileio module

FieldTrip has a flexible way of supporting dataformats. It uses three wrapper functions that provide a common interface to all file formats: ft_read_header, ft_read_data and ft_read_event. There are also still the old read_fcdc_xxx functions, but these are merely wrappers around the new functions and are only supplied for backward compatibility support.

These ft_read_xxx functions automatically detect the file format and subsequently will call the appropriate low-level function for each file format. Some of the low-level functions are written by ourselves, some are supplied by the manufacturers and some are obtained from other open source toolboxes.

The objective of supplying the low-level EEG and MEG reading functions as a seperate module/toolbox are to

  1. facilitate the reuse of the ft_read_xxx functions in other open-source projects (e.g. EEGLAB, SPM)
  2. facilitate the implementation and support for new data formats, esp. for external users/contributors
  3. facilitate the implementation of advanced features (e.g. real-time acquisition)

A list of the data formats that are supported is given here. The low-level reading functions are combined in the fileio module, which is released together with FieldTrip but can also be downloaded here as a separate and fully self-contained MATLAB toolbox.

Module layout

The fileio module contains high-level functions that are publicly available for the end-user. The functionality of the functions within this module depends on low-level functions for reading particular data formats from varying aquisition systems and are not available for the end-user and combined in a private directory.

Features

The following features are implemented in the fileio module



Other options that have been suggested, but that are not implemented yet are

Definition of the function-calls (API)

The API allows for reading header information, event information, and blocks of data. The API consists of two parts: a clearly defined function call, and a clearly defined output of that function call.

hdr    = ft_read_header(filename), this returns a structure with the header information
event  = ft_read_event(filename), this returns a structure with the event information, (i.e. the triggers) 
dat    = ft_read_data(filename, ...), this returns a 2-D or 3-D array with the data

The data-reading function has additional variable input arguments for selecting segments and channels.

The motivation for separating the reading into header/event/data is (among others) inspired by the CTF and by the BrainVision data formats. Based on the header, you want to decide how to approach reading the data, i.e. read everything for an average ERP, read an epoch for trial-based data, read a segment for continuous data. Based on the events (triggers and such), you want to decide which segments of data to read, i.e. read a pre/post-stimulus data segment around each trigger. These decisions are part of the FieldTrip/SPM/EEGLAB/enduser code.

Header format

In order to make the API transparent to the final application, the header structure by default only contains those elements that are common to all file types

Additional header information that is present for only specific file formats is stored in a substructure (“orig”). An example header for a CTF MEG dataset looks like this

hdr = 
           Fs: 600                 % sampling rate in Hz
       nChans: 218                 % number of channels, in this case 151 channel MEG with some additional EEG 
     nSamples: 6000                % number of samples per trial, in this case each trial is 10 seconds long
  nSamplesPre: 0                   % baseline period in each trial
      nTrials: 49                  % number of trials
        label: {218x1 cell}        % channel labels 
         grad: [1x1 struct]        % structure with details on the position and orientation of the MEG sensors 
         orig: [1x1 struct]        % the original CTF header structure

Event format

The event structure allows for various events, that can be coded as numbers (trigger values) or as strings (annotations and trial classifications). Events have a location in the file (sample number) and may have a duration. In the end-user application, it should be easy to search for events of a particular type. Selected events should be used to fetch the data of interest from the file.

An example event structure for a CTF MEG dataset looks like this

>> event
event = 
1x577 struct array with fields:
    type
    sample
    value
    offset
    duration

>> event(1)   
ans = 
        type: 'trial'
      sample: 1
       value: []
      offset: 0
    duration: 6000

>> event(2)
ans = 
        type: 'backpanel trigger'
      sample: 1451
       value: 4
      offset: []
    duration: []

In case of events with duration that define trials event.sample is the first sample of a trial and event.offset is the offset of the trigger with respect to the trial. An offset of 0 means that the first sample of the trial corresponds to the trigger. A positive offset indicates that the first sample is later than the trigger, a negative offset indicates that the trial begins before the trigger.

Data format

The data is returned as a Nchans X Nsamples matrix (for continuous data), or a Nchans X Nsamples X Ntrials matrix (for trial based data).

Example use of the read_xxx functions

The following piece of code will read each trial in an trial-based dataset that has a trigger with value “1”

hdr   = ft_read_header(filename);
event = ft_read_event(filename);
trig1 = find(cell2mat({event.value})==1);
for i=1:length(trig1)
  dat(i,:,:) = ft_read_data(filename, 'trial', trig1(i));
end

The following piece of code will read all trial with trigger value “1” all at once

hdr   = ft_read_header(filename);
event = ft_read_event(filename);
trig1 = find(cell2mat({event.value})==1);
dat   = ft_read_data(filename, 'trial', trig1);

The following piece of code will read the first 10 seconds data from a continuous file

hdr = ft_read_header(filename);
dat = ft_read_data(filename, 'begsample', 1, 'endsample', 10*hdr.fsample);

The following piece of code will read a one-second segment of data from a continuous dataset around the first trigger with value “4”

hdr   = ft_read_header(filename);
event = ft_read_event(filename);
sel   = [];
for i=1:length(event)
  % test each event, we are looking for a trigger with value 4
  if isequal(event(i).type, 'trigger') && isequal(event(i).value, 4)
    sel = [sel; i];
  end
end
sel       = sel(1);                             % select only the first trigger that was found
begsample = event(sel(1)).sample - 0.3*hdr.Fs;  % select 300ms before the sample of the trigger
endsample = event(sel(1)).sample + 0.7*hdr.Fs;  % select 700ms after the sample of the trigger
dat       = ft_read_data(filename, 'begsample', begsample, 'endsample', endsample);

Guidelines for adding support for other file formats

The ft_read_data, ft_read_header and ft_read_event functions strongly depend on the ft_filetype helper function. That function automatically determines the format of the file, for example by looking at the extension, by looking at the first few bytes of the file or any other caracteristic feature. So adding support for a new file format also requires that new fileformat to be added to the filetype function.

The filetype function is often called like this (e.g. in ft_read_data):

var = ft_filetype(filename)
if strcmp(var, something)
  % do something
elseif strcmp(var, something_else)
  % do something else
...

The reason for this is that ft_filetype does the checks in one long if-elseif-elseif ladder, which makes it relatively slow. Therefore it is called only once to speed up ft_read_data, and the type of the file is remembered in a variable. However, that does make it order sensitive: the first match in ft_filetype will be the one returned. So for common file extensions like “*.dat” it can be problematic. The solution for identical file extensions is to have the most stringent check first (e.g. “extension is *.dat and header contains a few magic bytes”) followed by the less stringent check (“extension is *.dat”).

Note furthermore that you can use context, i.e. the simultaneous presence of multiple files. That is used for example in BrainAnalyzer, which usually has a set of three files (an ascii *.vhdr, another ascii *.vmrk and one binary file with extension dat, eeg or seg). The *.dat file in then easy to recognize because it is always accompanied by the others.

Recent changes to the code

2012-02-10 13:01  jorhor

	* [r5275] private/ft_checkdata.m: automatically synchronized identical files to revision
	  5274

2012-02-10 09:36  jansch

	* [r5271] private/ft_datatype_sens.m, private/ft_hastoolbox.m: automatically synchronized
	  identical files to revision 5270

2012-02-09 14:42  jorhor

	* [r5266] private/ft_checkdata.m: automatically synchronized identical files to revision
	  5265

2012-02-08 13:19  roboos

	* [r5261] private/ft_hastoolbox.m: automatically synchronized identical files to revision
	  5260

2012-02-08 13:19  roboos

	* [r5260] ft_read_data.m, ft_read_event.m, ft_read_header.m, ft_write_data.m,
	  ft_write_event.m: enhancement - added automatic detection of mysql toolbox, see
	  http://bugzilla.fcdonders.nl/show_bug.cgi?id=1208

2012-02-07 13:10  jansch

	* [r5254] ft_read_headshape.m, private/read_ctf_pos.m: enhancement - built-in support for
	  polhemus-pos files generated with ctf digitizer softward

2012-02-06 15:53  jansch

	* [r5249] ft_read_headshape.m: enhancement - built-in some intelligence when dealing with
	  inflated cortical meshes generated by freesurfer

2012-02-06 08:51  jansch

	* [r5245] ft_read_header.m: enhancement - included call to ft_datatype_sens at the bottom of
	  the function to ensure the sensor representation to be up-to-date

2012-02-04 09:08  roboos

	* [r5235] private/ft_hastoolbox.m: automatically synchronized identical files to revision
	  5234

2012-02-03 09:02  jansch

	* [r5232] private/headcoordinates.m: automatically synchronized identical files to revision
	  5231

2012-02-01 16:27  borreu

	* [r5223] ft_read_event.m: bugfix - implemented fix suggested by Andrei in bug 1152.

2012-02-01 15:52  roevdmei

	* [r5219] private/data2raw.m, private/ft_datatype_raw.m: changed fsample computation into
	  1/mean(diff(data.time{1}))

2012-02-01 15:10  jansch

	* [r5214] private/ft_checkdata.m: automatically synchronized identical files to revision
	  5213

2012-02-01 12:29  giopia

	* [r5193] private/read_micromed_event.m: prevent function from crashing if there are no
	  triggers

2012-02-01 08:06  jansch

	* [r5191] ft_read_header.m: bugfix - fixed typo in line 124

2012-01-31 21:09  roboos

	* [r5189] ft_read_header.m: bugfix - reinserted the support for gtec_mat that droped out of
	  the code due to a faulty svn merge, see http://bugzilla.fcdonders.nl/show_bug.cgi?id=1299

2012-01-31 08:42  jansch

	* [r5187] ft_filetype.m, ft_read_mri.m, ft_write_mri.m: enhancement - built in checks and
	  errors when people want to read in .mgz files on a PC, which is not possible

2012-01-30 11:41  jansch

	* [r5184] ft_read_mri.m: enhancement - use freesurfer to read in dicom-files. This deals
	  with an issue related to the handedness of the volumes.

2012-01-24 10:47  jansch

	* [r5167] ft_read_headshape.m: enhancement - also read the functional data from a gifti if
	  present

2012-01-20 10:18  roboos

	* [r5155] private/db_close.m, private/db_insert.m, private/db_insert_blob.m,
	  private/db_open.m, private/db_select.m, private/db_select_blob.m: bugfix - moved the
	  missing db_xxx functions for fcdc_mysql from the old CVS to the present SVN repository.
	  This does not yet fully resolve the bug, because there are also some corresponding mex
	  files that I still have to look into.

2012-01-20 09:33  roevdmei

	* [r5154] ft_filetype.m: filetype now saves the 'unknown' as type if the file/dir already
	  exist

2012-01-17 12:37  borreu

	* [r5145] private/ft_convert_units.m: automatically synchronized identical files to revision
	  5144

2012-01-12 16:36  giopia

	* [r5135] ft_read_sens.m: besa_sfp now includes elecpos, is recognized as eeg

2012-01-11 14:40  jansch

	* [r5129] private/nanmean.m: automatically synchronized identical files to revision 5128

2012-01-11 09:56  arjsto

	* [r5121] private/nanmean.m: automatically synchronized identical files to revision 5120

2012-01-11 07:53  roboos

	* [r5112] private/ft_hastoolbox.m: automatically synchronized identical files to revision
	  5111

2012-01-09 14:52  roboos

	* [r5104] private/pthreadGC2-w64.dll, private/pthreadGC2.dll, private/pthreadVC2.dll:
	  enhancement - cleaned up the properties on all mex files, as per
	  http://bugzilla.fcdonders.nl/show_bug.cgi?id=1237#c14

2012-01-06 15:41  jansch

	* [r5097] ft_read_sens.m: enhancement - changing sens.pnt into sens.chanpos on line 145 gets
	  rid of yokogawa related warning (bug 1177)

2012-01-05 09:05  eelspa

	* [r5096] @uint64/abs.mexa64, @uint64/abs.mexmaci, @uint64/abs.mexmaci64,
	  @uint64/abs.mexw32, @uint64/abs.mexw64, @uint64/max.mexa64, @uint64/max.mexglx,
	  @uint64/max.mexmac, @uint64/max.mexmaci, @uint64/max.mexmaci64, @uint64/max.mexw32,
	  @uint64/max.mexw64, @uint64/min.mexa64, @uint64/min.mexglx, @uint64/min.mexmac,
	  @uint64/min.mexmaci, @uint64/min.mexmaci64, @uint64/min.mexw32, @uint64/min.mexw64,
	  @uint64/minus.mexa64, @uint64/minus.mexglx, @uint64/minus.mexmac, @uint64/minus.mexmaci,
	  @uint64/minus.mexmaci64, @uint64/minus.mexw32, @uint64/minus.mexw64, @uint64/plus.mexa64,
	  @uint64/plus.mexglx, @uint64/plus.mexmac, @uint64/plus.mexmaci, @uint64/plus.mexmaci64,
	  @uint64/plus.mexw32, @uint64/plus.mexw64, @uint64/rdivide.mexa64, @uint64/rdivide.mexglx,
	  @uint64/rdivide.mexmac, @uint64/rdivide.mexmaci, @uint64/rdivide.mexmaci64,
	  @uint64/rdivide.mexw32, @uint64/rdivide.mexw64, @uint64/times.mexa64,
	  @uint64/times.mexglx, @uint64/times.mexmac, @uint64/times.mexmaci,
	  @uint64/times.mexmaci64, @uint64/times.mexw32, @uint64/times.mexw64,
	  private/buffer.mexa64, private/buffer.mexglx, private/buffer.mexmac,
	  private/buffer.mexmaci, private/buffer.mexmaci64, private/buffer.mexw32,
	  private/buffer.mexw64, private/ft_getopt.mexa64, private/ft_getopt.mexglx,
	  private/ft_getopt.mexmaci, private/ft_getopt.mexmaci64, private/ft_getopt.mexw32,
	  private/ft_getopt.mexw64, private/mxDeserialize.mexa64, private/mxDeserialize.mexglx,
	  private/mxDeserialize.mexmac, private/mxDeserialize.mexmaci,
	  private/mxDeserialize.mexmaci64, private/mxDeserialize.mexw32,
	  private/mxDeserialize.mexw64, private/mxSerialize.mexa64, private/mxSerialize.mexglx,
	  private/mxSerialize.mexmac, private/mxSerialize.mexmaci, private/mxSerialize.mexmaci64,
	  private/mxSerialize.mexw32, private/mxSerialize.mexw64, private/nanmean.mexa64,
	  private/nanmean.mexmaci, private/nanmean.mexmaci64, private/nanmean.mexw32,
	  private/nanmean.mexw64, private/nanstd.mexa64, private/nanstd.mexmaci,
	  private/nanstd.mexmaci64, private/nanstd.mexw32, private/nanstd.mexw64,
	  private/nansum.mexa64, private/nansum.mexmaci, private/nansum.mexmaci64,
	  private/nansum.mexw32, private/nansum.mexw64, private/nanvar.mexa64,
	  private/nanvar.mexmaci, private/nanvar.mexmaci64, private/nanvar.mexw32,
	  private/nanvar.mexw64, private/read_16bit.mexa64, private/read_16bit.mexglx,
	  private/read_16bit.mexmaci, private/read_16bit.mexmaci64, private/read_16bit.mexw32,
	  private/read_16bit.mexw64, private/read_24bit.mexa64, private/read_24bit.mexglx,
	  private/read_24bit.mexmac, private/read_24bit.mexmaci, private/read_24bit.mexmaci64,
	  private/read_24bit.mexw32, private/read_24bit.mexw64, private/read_ctf_shm.mexglx,
	  private/rfbevent.mexa64, private/rfbevent.mexglx, private/rfbevent.mexmac,
	  private/rfbevent.mexmaci, private/rfbevent.mexmaci64, private/sap2matlab.mexa64,
	  private/sap2matlab.mexglx, private/sap2matlab.mexmaci, private/sap2matlab.mexmaci64,
	  private/sap2matlab.mexw32, private/sap2matlab.mexw64, private/solid_angle.mexa64,
	  private/write_ctf_shm.mexglx: setting svn:executable property on all MEX files, properly
	  this time I hope

2012-01-02 15:52  jansch

	* [r5086] private/read_bucn_nirsdata.m: enhancement - made reading of nirs data more
	  efficient in the case of multiple trials

2012-01-02 08:40  jansch

	* [r5085] private/read_bucn_nirshdr.m: enhancement - increased robustness of dealing with
	  ascii-formatted nirs-data, the field delimiter could be space or tab, interfering with
	  correct interpretation of the labels

2012-01-02 08:16  jansch

	* [r5084] ft_filetype.m: enhancement - implemented recognition of bucn_nirs filetype, based
	  currently on the substrings _nrs_ and .txt in a filename.

2011-12-31 13:50  jansch

	* [r5083] ft_read_data.m, ft_read_event.m, ft_read_header.m, private/read_bucn_nirsdata.m,
	  private/read_bucn_nirsevent.m, private/read_bucn_nirshdr.m: enhancement - added support
	  for the ascii-formatted birkbeck-ucl nirs machine

2011-12-23 14:55  borreu

	* [r5082] private/mxSerialize.mexw64, private/nanstd.mexw32, private/read_16bit.mexw32,
	  private/read_16bit.mexw64, private/read_24bit.mexw32, private/read_24bit.mexw64:
	  automatically synchronized identical files to revision 5081

2011-12-22 17:04  roboos

	* [r5079] private/ft_hastoolbox.m, private/ft_senslabel.m, private/ft_senstype.m:
	  automatically synchronized identical files to revision 5078

2011-12-22 17:04  roboos

	* [r5078] ft_read_header.m: enhancement - improved support for the 9-channel small animal
	  Yokogawa MEG system at UCL, see http://bugzilla.fcdonders.nl/show_bug.cgi?id=1225

2011-12-22 13:40  borreu

	* [r5076] private/ft_getopt.m: automatically synchronized identical files to revision 5075

2011-12-22 09:06  roboos

	* [r5074] ft_chantype.m, ft_chanunit.m: documentation - small cleanup in documentation to
	  make the example more consistent

2011-12-22 08:58  roboos

	* [r5072] ft_chantype.m, ft_chanunit.m, ft_read_header.m, private/ft_senstype.m:
	  documentation - improved the documentation and explicitely mention chantype and chanunit.
	  small bugfix in handling of desired in ft_chanunit.

2011-12-22 08:23  roboos

	* [r5071] private/ft_datatype_raw.m: automatically synchronized identical files to revision
	  5070

2011-12-22 08:18  roboos

	* [r5069] private/ft_datatype_raw.m: automatically synchronized identical files to revision
	  5068

2011-12-21 13:58  roboos

	* [r5065] private/ft_getopt.m, private/ft_getopt.mexglx: automatically synchronized
	  identical files to revision 5064

2011-12-21 09:57  jansch

	* [r5061] ft_write_mri.m: bugfix - permute the volume prior to writing to nifti using
	  Freesurfer, otherwise the relation between voxel space and the transformation matrix will
	  be messed up. See Freesurfer's MRIread for more info

2011-12-20 14:03  jansch

	* [r5058] private/ft_getopt.mexmaci, private/ft_getopt.mexmaci64,
	  private/mxDeserialize.mexmaci64, private/mxSerialize.mexmaci64,
	  private/read_16bit.mexmaci, private/read_24bit.mexmaci, private/rfbevent.mexmaci64:
	  automatically synchronized identical files to revision 5057

2011-12-20 13:48  eelspa

	* [r5056] private/ft_getopt.m, private/ft_getopt.mexa64, private/ft_getopt.mexw32,
	  private/ft_getopt.mexw64: automatically synchronized identical files to revision 5055

2011-12-15 09:15  jorhor

	* [r5049] private/read_eeglabdata.m: bugfix - changed hdr to header - thx Gregor

2011-12-14 11:21  jansch

	* [r5041] private/nanstd.mexw64, private/nanvar.mexw64: automatically synchronized identical
	  files to revision 5040

2011-12-14 11:01  roboos

	* [r5038] private/read_16bit.mexmaci64, private/read_24bit.mexmaci64: automatically
	  synchronized identical files to revision 5037

2011-12-14 10:47  roboos

	* [r5035] ft_read_data.m, ft_read_sens.m, private/ama2vol.m, private/bti2grad.m,
	  private/ft_apply_montage.m, private/read_biosemi_bdf.m, private/read_brainvision_eeg.m,
	  private/read_edf.m, private/read_shm_data.m, private/undobalancing.m,
	  private/yokogawa2grad.m, private/yokogawa2grad_new.m: bugfix - use a consistent handling
	  of the sparse multiplication for claibrating data after reading and for computing channel
	  leadfields from the coils. See http://bugzilla.fcdonders.nl/show_bug.cgi?id=1169#c7

2011-12-14 10:46  roboos

	* [r5034] private/ft_checkdata.m: automatically synchronized identical files to revision
	  5033

2011-12-14 10:29  roboos

	* [r5032] private/ft_datatype_sts.m: restructuring, removed obsolete ft_datatype_sts
	  function from fileio/private

2011-12-14 10:28  roboos

	* [r5031] private/ft_datatype_spikeraw.m: restructuring - removed obsolete
	  ft_datatype_spikeraw function from fileio/private

2011-12-14 09:50  roboos

	* [r5030] ft_read_data.m: bugfix - select the desired channels for neuroprax, see
	  http://bugzilla.fcdonders.nl/show_bug.cgi?id=1170

2011-12-13 08:57  roboos

	* [r5025] private/read_stl.m: enhancement - added support for reading binary STL files,
	  preallocate memory to speedup reading of ascii STL files

2011-12-13 08:51  jansch

	* [r5024] private/volumewrite_spm.m: enhancement - implemented test script for bug 1227

2011-12-13 08:35  jansch

	* [r5023] private/ft_checkdata.m: automatically synchronized identical files to revision
	  5022

2011-12-13 08:34  jansch

	* [r5022] ft_read_mri.m, ft_write_headshape.m, ft_write_mri.m: enhancement - support for
	  reading (improved) and writing (enabled) of 4d nifti files. ft_read_mri and ft_write_mri
	  now use freesurfer code for reading and writing 4d nifti files. improved ft_sourcewrite to
	  support writing to gifti and nifti

2011-12-12 14:33  jansch

	* [r5017] ft_write_mri.m, ft_write_volume.m: enhancement - renamed ft_write_volume into
	  ft_write_mri for consistency

2011-12-12 09:40  jansch

	* [r5012] private/nanvar.mexa64: automatically synchronized identical files to revision 5011

2011-12-12 09:39  jansch

	* [r5010] private/nanstd.mexmaci, private/nanvar.mexmaci, private/nanvar.mexmaci64:
	  automatically synchronized identical files to revision 5009

2011-12-10 16:41  marvin

	* [r5005] private/ft_datatype_spike.m: automatically synchronized identical files to
	  revision 5004

2011-12-10 11:18  marvin

	* [r4998] private/read_mclust_t.m: adding readout for mclust t files

2011-12-10 11:06  marvin

	* [r4997] private/read_neuralynx_nse.m: made waveform dimension consistentof spike readout

2011-12-10 11:06  marvin

	* [r4996] ft_read_spike.m: made waveform dimension consistentof spike readout

2011-12-10 10:53  marvin

	* [r4994] private/read_neuralynx_ntt.m: corrected a bug in read_neuralynx.ntt

2011-12-10 10:50  marvin

	* [r4993] private/read_neuralynx_ntt.m: corrected a bug in read_neuralynx.ntt

2011-12-10 09:46  marvin

	* [r4989] private/ft_datatype_spike.m: automatically synchronized identical files to
	  revision 4988

2011-12-10 09:35  marvin

	* [r4985] private/ft_datatype.m: automatically synchronized identical files to revision 4984

2011-12-10 09:32  marvin

	* [r4983] private/ft_datatype.m: automatically synchronized identical files to revision 4982

2011-12-09 19:48  jansch

	* [r4980] private/nanvar.mexa64: automatically synchronized identical files to revision 4979

2011-12-09 16:07  jansch

	* [r4978] private/nanstd.mexmaci64: automatically synchronized identical files to revision
	  4977

2011-12-09 16:02  jansch

	* [r4976] private/nanstd.mexa64: automatically synchronized identical files to revision 4975

2011-12-09 15:33  roboos

	* [r4973] private/ft_convert_units.m, private/ft_estimate_units.m: automatically
	  synchronized identical files to revision 4972

2011-12-09 14:34  tilsan

	* [r4970] ft_read_event.m: Sequential checking for old and new Yokogawa input toolbox
	  enabled.

2011-12-09 14:32  tilsan

	* [r4969] ft_read_data.m: Duplicate line removed.

2011-12-09 14:30  tilsan

	* [r4967] private/ft_senstype.m: Give warning "could be Yokogawa system" only once.

2011-12-09 14:28  tilsan

	* [r4966] private/yokogawa2grad_new.m: Add reference channels with valid position info to
	  grad structure.

2011-12-08 16:02  roboos

	* [r4958] ft_read_data.m, private/read_brainvision_eeg.m: enhancement - implemented channel
	  selection while reading multiplexed binary brainvision eeg data formats, see
	  http://bugzilla.fcdonders.nl/show_bug.cgi?id=1169

2011-12-05 08:59  jansch

	* [r4934] private/ft_hastoolbox.m: automatically synchronized identical files to revision
	  4933

2011-12-03 23:17  sashae

	* [r4930] ft_read_event.m, ft_read_header.m: enhancement - improved read functions for
	  reading cerebus .nev data

2011-12-03 23:01  sashae

	* [r4929] private/read_neuroshare.m: improvement of the read_neuroshare function in order to
	  read cerebus .nev files

2011-12-02 19:35  roboos

	* [r4928] private/ft_datatype_spike.m: automatically synchronized identical files to
	  revision 4927

2011-12-02 19:35  roboos

	* [r4927] ft_read_spike.m: enhancement - improved the documentation of ft_daaype_spike,
	  include the recent 2011 changes. Add the supported file formats to the help of
	  ft_read_spike

2011-12-01 21:29  roboos

	* [r4924] private/ft_datatype_sens.m: automatically synchronized identical files to revision
	  4923

2011-12-01 21:29  roboos

	* [r4923] ft_read_data.m, ft_read_event.m, ft_read_header.m, ft_read_headshape.m,
	  ft_read_sens.m, private/netmeg2grad.m: enhancement - first implementation to read in the
	  NetMEG data format (header, data, sensor, headshape).
	  The reading of events is not yet implemented, for that I'll have to look at another
	  example file.
	  This commit includes some small changes to ft_datatype_sens and ft_plot_sens for style and
	  efficicency.

2011-12-01 20:26  roboos

	* [r4922] ft_chantype.m: enhancement - made two changes to ft_chantype to speed it up, the
	  most significant is to check on senstype=unknown and then skip over all other checks

2011-12-01 17:03  roboos

	* [r4921] private/ft_hastoolbox.m: automatically synchronized identical files to revision
	  4920

2011-12-01 17:03  roboos

	* [r4920] ft_filetype.m: enhancement - added netMEG to the ft_filetype detection and added
	  matlabcentral/fileexchange/netcdf toolbox detection to ft_hastoolbox

2011-12-01 15:14  marvin

	* [r4914] private/ft_checkdata.m, private/ft_datatype.m, private/ft_datatype_spike.m:
	  automatically synchronized identical files to revision 4913

2011-12-01 11:28  roboos

	* [r4912] ft_read_header.m: bugfix - solved a problem due to chantype and chanunit on
	  real-time fMRI data from the buffer (reported by Paul). The real-time fMRI data is
	  represented as one channel per voxel, which means that there is a huge amount of channels.
	  The helper functions at the end of ft_read_header were too slow to deal with that.

2011-11-30 16:03  roboos

	* [r4894] ft_chanunit.m, ft_read_header.m: enhancement - see bug 953, added a helper
	  function to determine channel units and added hdr.chanunit and hdr.chantype to the output
	  of ft_read_header

2011-11-28 13:55  marvin

	* [r4872] private/ft_checkdata.m: automatically synchronized identical files to revision
	  4871

2011-11-28 09:29  marvin

	* [r4869] private/ft_datatype_sts.m: ft_datatype_sts added to fileio/private

2011-11-28 09:27  marvin

	* [r4868] private/ft_datatype.m: automatically synchronized identical files to revision 4867

2011-11-27 20:10  marvin

	* [r4858] private/ft_datatype_spikeraw.m: added test functions for several spike plotting
	  funcs

2011-11-27 19:06  marvin

	* [r4853] private/ft_checkdata.m, private/ft_datatype.m: automatically synchronized
	  identical files to revision 4852

2011-11-27 18:20  marvin

	* [r4848] private/ft_datatype_spikeraw.m: added ft_datatype_spikeraw to fileio/private

2011-11-27 18:17  marvin

	* [r4847] private/ft_checkdata.m: automatically synchronized identical files to revision
	  4846

2011-11-27 18:17  marvin

	* [r4845] private/ft_datatype.m: automatically synchronized identical files to revision 4844

2011-11-27 18:16  marvin

	* [r4843] private/ft_datatype_spike.m: automatically synchronized identical files to
	  revision 4842

Related documentation


Related projects on electrophysiology (EEG, MEG) data I/O are


Lists of EEG and MEG file formats can be found here: