function [loggedData, headers] = parse_log_model(filename)
%parse_log This independent function parses the data stored in the file and
%returns a structure containing the data
%   filename    - this is the complete path of the file with the filename
%   params      - this is the params structure which holds the analysis
%                 configuration options

% Check if file exists
if (~exist(filename,'file'))
    error(strcat(filename, ' does not exist'));
end

% Open file
FileID = fopen(filename, 'r');

% Gets the first line of the file
string = fgetl(FileID);

% Test first line, if not formatted correctly, reject
if(size(regexp(string, '^#')) == 0)
    error(strcat(filename, ' is not properly formatted, and does not contain "#" headers'));
end

% Loop through header lines
while( regexp(string, '^#') == 1 )
    
    %Print out string and move on
    disp(string)
    old = string;
    string = fgetl(FileID);
    
end

% Two possibilities for the next two lines:
%   1) line of headers
%   2) line of units
foundHeaders = 0;
foundUnits = 0;

% Checking current line's type:
identifier = string(1);

if (regexp(identifier,'%'))
    foundHeaders = 1;
    % this is a line of headers; extract headers:
    string = strrep(string,' ', '_');
    headers = strsplit(string);
    headers{1} = strrep(headers{1},'%', '');
    numOfHeaders = length(headers);
else
    if (regexp(identifier,'&'))
        foundUnits = 1;
        % this is a line of units; extract units:
        units = strsplit(string);
        units{1} = strrep(units{1},'&','');
    else
         error(strcat(filename, ' is not properly formatted, contains undefined line identifier.'));
    end
end

% Obtaining the next line
string = fgetl(FileID); 
identifier = string(1);

if(foundHeaders)
    if(regexp(identifier,'&'))
        foundUnits = 1;
        % this is a line of units; extract units:
        units = strsplit(string);
        units{1} = strrep(units{1},'&','');
    else
        error(strcat(filename, ' is not properly formatted, contains or undefined/excessive line identifiers.'));
    end
else
    if(foundUnits)
        if(regexp(identifier,'%'))
            % this is a line of headers; extract headers:
            headers = strsplit(string);
            headers{1} = strrep(headers{1},'%', '');
            numOfHeaders = length(headers);
        end
    else
        error('Should never be able to get here');
    end
end

% sanity check and clean up
if(numOfHeaders ~= length(units))
    error(strcat(filename, ' is not properly formatted, contains unmatched number of units and headers'));
end
clear foundHeaders foundUnits;

% Get all data into a single matrix called "log"
log = [];
line = zeros(1,numOfHeaders);
while ~feof(FileID)
    line = textscan(FileID, '%f', numOfHeaders);
    line = transpose(cell2mat(line));
    log = [log;line];
end

% Converting the log matrix into a expData structure.
for i = 1:numOfHeaders
    
    eval(['loggedData.' headers{i} '.data = log(:,i);']);           % adding data
    eval(['loggedData.' headers{i} '.unit = cell2mat(units(i));']); % adding unit
        
end

end