function [Data,SamplingFrequency,ChanType,evt] = loadOTB(filename)


tmp_folder = tempdir;
if~exist(fullfile(tmp_folder,'tmpopen'),'dir')
    mkdir(fullfile(tmp_folder,'tmpopen'));
end
untar(filename,fullfile(tmp_folder,'tmpopen'));
% unzip([PATHNAME FILENAME]);
signals=dir(fullfile(fullfile(tmp_folder,'tmpopen'),'*.sig'));
AD_dynamic=4.8;
abstracts=[signals.name(1:end-4) '.xml'];
abstract = xml2struct(fullfile(tmp_folder,'tmpopen',abstracts));
for nAtt=1:length(abstract.Device.Attributes)
    Fsample=str2num(abstract.Device.Attributes.SampleFrequency);
    nChannel=str2num(abstract.Device.Attributes.DeviceTotalChannels);
    nADBit=str2num(abstract.Device.Attributes.ad_bits);
end
vett=zeros(1,nChannel);
Gains=vett;
for nChild=1:length(abstract.Device.Channels.Adapter)
    localGain=str2num(abstract.Device.Channels.Adapter{nChild}.Attributes.Gain);
    startIndex=str2num(abstract.Device.Channels.Adapter{nChild}.Attributes.ChannelStartIndex);
    
    Channel = abstract.Device.Channels.Adapter{nChild}.Channel;
    for nChan=1:length(Channel)
        if iscell(Channel)
            ChannelAtt = Channel{nChan}.Attributes;
        elseif isstruct(Channel)
            ChannelAtt = Channel(nChan).Attributes;
        end
        idx=str2num(ChannelAtt.Index);
        Gains(startIndex+idx+1)=localGain;
        if(~isempty(strfind(ChannelAtt.ID,'EEG')))
            ChanType{startIndex+idx+1}= 'EEG';
        elseif (~isempty(strfind(ChannelAtt.ID,'AUX')))
            ChanType{startIndex+idx+1}= 'STIM';
        else
            ChanType{startIndex+idx+1}= 'SERVICE';
        end
        
    end
end

h=fopen(fullfile(tmp_folder,'tmpopen',signals.name),'r');
Data=fread(h,[nChannel Inf],'long');
fclose(h);

rmdir(fullfile(tmp_folder,'tmpopen'),'s');

nADBit = 24;

for nCh=1:nChannel-1
    Data(nCh,:)=Data(nCh,:)*AD_dynamic/(2^nADBit)*1000000/Gains(nCh);
end

SamplingFrequency = Fsample;

AUXsignal = find(strcmp(lower(ChanType),'stim'));

evt = [];
for itrig =1:length(AUXsignal)
    trig = Data(AUXsignal(itrig),:);
    trig = trig - mean(trig(1:10));
    peakpeak=[max(trig),min(trig)];
    [~,idx]=max(abs(peakpeak));
    trig = trig/sign(peakpeak(idx));
    e=[find(diff(trig)>100)];
    if(not(isempty(e)))
        e = e - round(0.033*SamplingFrequency);%ritardo RF pari a 33ms
        e(find(diff(e)<5)+1)=[];
    end
    evt = [evt e];
end

if ~isempty(evt)
    evt = sort(evt);
end

Servicesignal = find(strcmp(lower(ChanType),'service'));
    
timeramp = Data(Servicesignal(2),:);
m = max(timeramp);
timeramp = ((timeramp/m)*2*pi)-pi;
timeramp = unwrap(timeramp);

timeramp = round(((timeramp+pi)/(2*pi))*m);
timeramp = timeramp-timeramp(1)+1;
Data(Servicesignal(2),:) = timeramp;

end

function [ s ] = xml2struct( file )
%Convert xml file into a MATLAB structure
% [ s ] = xml2struct( file )
%
% A file containing:
% <XMLname attrib1="Some value">
%   <Element>Some text</Element>
%   <DifferentElement attrib2="2">Some more text</Element>
%   <DifferentElement attrib3="2" attrib4="1">Even more text</DifferentElement>
% </XMLname>
%
% Will produce:
% s.XMLname.Attributes.attrib1 = "Some value";
% s.XMLname.Element.Text = "Some text";
% s.XMLname.DifferentElement{1}.Attributes.attrib2 = "2";
% s.XMLname.DifferentElement{1}.Text = "Some more text";
% s.XMLname.DifferentElement{2}.Attributes.attrib3 = "2";
% s.XMLname.DifferentElement{2}.Attributes.attrib4 = "1";
% s.XMLname.DifferentElement{2}.Text = "Even more text";
%
% Please note that the following characters are substituted
% '-' by '_dash_', ':' by '_colon_' and '.' by '_dot_'
%
% Written by W. Falkena, ASTI, TUDelft, 21-08-2010
% Attribute parsing speed increased by 40% by A. Wanner, 14-6-2011
% Added CDATA support by I. Smirnov, 20-3-2012
%
% Modified by X. Mo, University of Wisconsin, 12-5-2012

if (nargin < 1)
    clc;
    help xml2struct
    return
end

if isa(file, 'org.apache.xerces.dom.DeferredDocumentImpl') || isa(file, 'org.apache.xerces.dom.DeferredElementImpl')
    % input is a java xml object
    xDoc = file;
else
    %check for existance
    if (exist(file,'file') == 0)
        %Perhaps the xml extension was omitted from the file name. Add the
        %extension and try again.
        if (isempty(strfind(file,'.xml')))
            file = [file '.xml'];
        end
        
        if (exist(file,'file') == 0)
            error(['The file ' file ' could not be found']);
        end
    end
    %read the xml file
    xDoc = xmlread(file);
end

%parse xDoc into a MATLAB structure
s = parseChildNodes(xDoc);

end

% ----- Subfunction parseChildNodes -----
function [children,ptext,textflag] = parseChildNodes(theNode)
% Recurse over node children.
children = struct;
ptext = struct; textflag = 'Text';
if hasChildNodes(theNode)
    childNodes = getChildNodes(theNode);
    numChildNodes = getLength(childNodes);
    
    for count = 1:numChildNodes
        theChild = item(childNodes,count-1);
        [text,name,attr,childs,textflag] = getNodeData(theChild);
        
        if (~strcmp(name,'#text') && ~strcmp(name,'#comment') && ~strcmp(name,'#cdata_dash_section'))
            %XML allows the same elements to be defined multiple times,
            %put each in a different cell
            if (isfield(children,name))
                if (~iscell(children.(name)))
                    %put existsing element into cell format
                    children.(name) = {children.(name)};
                end
                index = length(children.(name))+1;
                %add new element
                children.(name){index} = childs;
                if(~isempty(fieldnames(text)))
                    children.(name){index} = text;
                end
                if(~isempty(attr))
                    children.(name){index}.('Attributes') = attr;
                end
            else
                %add previously unknown (new) element to the structure
                children.(name) = childs;
                if(~isempty(text) && ~isempty(fieldnames(text)))
                    children.(name) = text;
                end
                if(~isempty(attr))
                    children.(name).('Attributes') = attr;
                end
            end
        else
            ptextflag = 'Text';
            if (strcmp(name, '#cdata_dash_section'))
                ptextflag = 'CDATA';
            elseif (strcmp(name, '#comment'))
                ptextflag = 'Comment';
            end
            
            %this is the text in an element (i.e., the parentNode)
            if (~isempty(regexprep(text.(textflag),'[\s]*','')))
                if (~isfield(ptext,ptextflag) || isempty(ptext.(ptextflag)))
                    ptext.(ptextflag) = text.(textflag);
                else
                    %what to do when element data is as follows:
                    %<element>Text <!--Comment--> More text</element>
                    
                    %put the text in different cells:
                    % if (~iscell(ptext)) ptext = {ptext}; end
                    % ptext{length(ptext)+1} = text;
                    
                    %just append the text
                    ptext.(ptextflag) = [ptext.(ptextflag) text.(textflag)];
                end
            end
        end
        
    end
end
end

% ----- Subfunction getNodeData -----
function [text,name,attr,childs,textflag] = getNodeData(theNode)
% Create structure of node info.

%make sure name is allowed as structure name
name = toCharArray(getNodeName(theNode))';
name = strrep(name, '-', '_dash_');
name = strrep(name, ':', '_colon_');
name = strrep(name, '.', '_dot_');

attr = parseAttributes(theNode);
if (isempty(fieldnames(attr)))
    attr = [];
end

%parse child nodes
[childs,text,textflag] = parseChildNodes(theNode);

if (isempty(fieldnames(childs)) && isempty(fieldnames(text)))
    %get the data of any childless nodes
    % faster than if any(strcmp(methods(theNode), 'getData'))
    % no need to try-catch (?)
    % faster than text = char(getData(theNode));
    text.(textflag) = toCharArray(getTextContent(theNode))';
end

end

% ----- Subfunction parseAttributes -----
function attributes = parseAttributes(theNode)
% Create attributes structure.

attributes = struct;
if hasAttributes(theNode)
    theAttributes = getAttributes(theNode);
    numAttributes = getLength(theAttributes);
    
    for count = 1:numAttributes
        %attrib = item(theAttributes,count-1);
        %attr_name = regexprep(char(getName(attrib)),'[-:.]','_');
        %attributes.(attr_name) = char(getValue(attrib));
        
        %Suggestion of Adrian Wanner
        str = toCharArray(toString(item(theAttributes,count-1)))';
        k = strfind(str,'=');
        attr_name = str(1:(k(1)-1));
        attr_name = strrep(attr_name, '-', '_dash_');
        attr_name = strrep(attr_name, ':', '_colon_');
        attr_name = strrep(attr_name, '.', '_dot_');
        attributes.(attr_name) = str((k(1)+2):(end-1));
    end
end
end