% BIOSIG2EEGLABEVENT - convert biosig events to EEGLAB event structure
%
% Usage:
% >> eeglabevent = biosig2eeglabevent( biosigevent, interval)
%
% Inputs:
% biosigevent - BioSig event structure
% interval - Period to extract events for, in frames.
% Default [] is all.
%
% Outputs:
% eeglabevent - EEGLAB event structure
%
% Author: Arnaud Delorme, SCCN, INC, UCSD, 2006-
% Copyright (C) 13 2006- Arnaud Delorme, Salk Institute, arno@salk.edu
%
% This file is part of EEGLAB, see http://www.eeglab.org
% for the documentation and details.
%
% Redistribution and use in source and binary forms, with or without
% modification, are permitted provided that the following conditions are met:
%
% 1. Redistributions of source code must retain the above copyright notice,
% this list of conditions and the following disclaimer.
%
% 2. Redistributions in binary form must reproduce the above copyright notice,
% this list of conditions and the following disclaimer in the documentation
% and/or other materials provided with the distribution.
%
% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
% THE POSSIBILITY OF SUCH DAMAGE.
function event = biosig2eeglabevent(EVENT, interval, importEDFplus)
if nargin < 2
interval = [];
end
if nargin < 3
importEDFplus = false;
end
event = [];
disp('Importing data events...');
EVT=sopen('eventcodes.txt');sclose(EVT);
% If the interval variable is empty, import all events.
eeglab_options;
if isempty(interval)
if isfield(EVENT, 'Teeg')
event = EVENT.Teeg;
end
if isfield(EVENT, 'TYP')
for index = 1:length( EVENT.TYP )
eType = EVENT.TYP(index);
% use file in
% https://sccn.ucsd.edu/bugzilla/show_bug.cgi?id=1387 to test
% for boundary events
if eType < 256 && importEDFplus && isfield(EVENT,'CodeDesc') && eType < length(EVENT.CodeDesc)
event(index).type = EVENT.CodeDesc{eType};
event(index).edftype = eType;
elseif isfield(EVT, 'EVENT') && isfield(EVT.EVENT,'CodeIndex') && isfield(EVT.EVENT,'CodeDesc') && importEDFplus
try
event(index).type = EVT.EVENT.CodeDesc{EVT.EVENT.CodeIndex==eType};
event(index).edftype = eType;
catch
event(index).type = eType;
end
if eType == 32766 || eType == 32767
event(index).edfplustype = event(index).type;
event(index).type = eeg_boundarytype(event);
end
else
event(index).type = eType;
end
end
end
if isfield(EVENT, 'POS')
for index = 1:length( EVENT.POS )
event(index).latency = EVENT.POS(index);
end
end
if isfield(EVENT, 'DUR')
if any( [ EVENT.DUR ] )
for index = 1:length( EVENT.DUR )
event(index).duration = EVENT.DUR(index);
end
end
end
if isfield(EVENT, 'CHN')
if any( [ EVENT.CHN ] )
for index = 1:length( EVENT.CHN )
event(index).chanindex = EVENT.CHN(index);
end
end
end
% If a subinterval was specified, select only events that fall in that range, and
% edit duration field if it exceeds that range.
elseif isfield(EVENT,'POS')
count = 1;
for index = 1:length(EVENT.POS)
pos_tmp = EVENT.POS(index) - interval(1) + 1;
if pos_tmp > 0 && EVENT.POS(index) <= interval(2)
event(count).latency = pos_tmp;
if isfield(EVENT, 'TYP')
eType = EVENT.TYP(index);
if isfield(EVENT, 'CodeDesc')
if eType < 256 && importEDFplus && eType < length(EVENT.CodeDesc)
event(index).type = EVENT.CodeDesc{eType};
event(index).edftype = eType;
elseif isfield(EVT, 'EVENT') && isfield(EVT.EVENT,'CodeIndex') && isfield(EVT.EVENT,'CodeDesc') && importEDFplus
try
event(index).type = EVT.EVENT.CodeDesc{EVT.EVENT.CodeIndex==eType};
event(index).edftype = eType;
catch
event(index).type = eType;
end
if eType == 32766 || eType == 32767
event(index).edfplustype = event(index).type;
event(index).type = eeg_boundarytype(event);
end
else
event(index).type = eType;
end
else
event(index).type = eType;
end
end
if isfield(EVENT, 'CHN')
event(count).chanindex = EVENT.CHN(index);
end
if isfield(EVENT, 'DUR')
event(count).duration = min(EVENT.DUR(index), interval(2) - EVENT.POS(index));
end
count = count + 1;
end
end
end