ECG-Kit 1.0
(7,858 bytes)
%% (Internal) function reads the header of signal files
%
% This function creates a report of the signals handled by the ECG wrapper
% object ECG_w. The report includes several views of the signals, from a
% wide to a narrow scale. Some aspects of the report can be configured as
% the detail degree, the length of each time scale and the report format.
%
% Arguments:
%
% +ECG_w: [ECGwrapper object] REQUIRED. The signal handler.
%
% +detailLevel: [char] OPTIONAL. The report detail level:
% 'HighDetail', 'MediumDetail', 'LowDetail'. A higher
% detail level means report the whole recording at every
% time resolution defined in "win_lengths". High
% resolution also means larger reports. Default 'LowDetail'.
%
% +report_mode: [char] OPTIONAL. Information from other tasks like QRS
% detection/delineation/classification added to the
% signals in case available mode. Possible values are:
% 'full' 'ECG only' 'QRS detection' 'Wave delineation'
% 'Heartbeat classification'
% Default "ECG only".
%
% +win_lengths: [numeric] OPTIONAL. The amount and size (in seconds) of
% each scale length present in the report. Default
% [60*60 30*60 60 10] it means 1 hour - 30 min - 1 min
% and 10 seconds.
%
% +report_format: [char] OPTIONAL. The report format of the document.
% Default PDF.
%
% +filename: [char] OPTIONAL. The report filename. Default same folder
% of the original recording handled by ECG_w.
%
%
% See also plot_ecg_strip
%
% Author: Mariano Llamedo Soria (llamedom at {electron.frba.utn.edu.ar; unizar.es}
% Version: 0.1 beta
% Last update: 17/6/2014
% Birthdate : 15/8/2012
% Copyright 2008-2015
%
function reportECG(ECG_w, detailLevel, report_mode, win_lengths, report_format, filename)
%% constants
cKnownModes = {'full' 'ECG only' 'QRS detection' 'Wave delineation' 'Heartbeat classification' };
cKnownFormats = {'pdf' 'eps' 'png' 'tiff' 'jpg' 'bmp' };
cDetails = {'HighDetail' 'MediumDetail' 'LowDetail'};
%% argument parsing
if( nargin < 5 || ~any(strcmpi(cKnownFormats, report_format)) )
report_format = 'pdf';
end
heasig = ECG_w.ECG_header;
if( nargin < 3 || isempty(intersect(cKnownModes, report_mode)) )
report_mode = 'ECG only';
end
file_suffix = rowvec(colvec(char(report_mode)'));
prev_length = length(file_suffix);
file_suffix = strrep(file_suffix, ' ', ' ');
while( length(file_suffix) ~= prev_length )
prev_length = length(file_suffix);
file_suffix = strrep(file_suffix, ' ', ' ');
end
file_suffix = ['_' file_suffix];
if( any(strcmpi(report_mode, 'full')) )
report_mode = cKnownModes(2:end);
end
if( nargin < 6 || isempty(filename) )
% [report_path, file_recname ]= fileparts(ECG_w.recording_name);
% report_path = [report_path filesep];
[~, file_recname ]= fileparts(ECG_w.recording_name);
report_path = ECG_w.output_path;
if( isfield(heasig, 'recname') )
filename = [report_path heasig.recname file_suffix '.' report_format];
else
filename = [report_path file_recname file_suffix '.' report_format];
end
ii = 1;
while( exist(filename, 'file') )
if( isfield(heasig, 'recname') )
filename = [report_path heasig.recname file_suffix '_copy' num2str(ii) '.' report_format];
else
filename = [report_path file_recname file_suffix '_copy' num2str(ii) '.' report_format];
end
ii = ii + 1;
end
end
if( nargin < 2 || ~any(strcmpi(cDetails, detailLevel)) )
detailLevel = 'LowDetail'; % seconds
end
if( nargin < 4 || isempty(win_lengths) || ~isnumeric(win_lengths) )
win_lengths = [60*60 30*60 59 7]; % seconds
end
if( ~isobject(ECG_w) || ~isa(ECG_w, 'ECGwrapper') )
error('reportECG:BadArg', 'Need an ECGwrapper object to work.')
end
init_ghostscript();
bAux = (win_lengths * heasig.freq) <= heasig.nsamp;
% Activate the progress_struct bar.
pb = progress_bar('Report ECG');
pb.Loops2Do = sum(bAux);
ii = 1;
fig_hdl = [];
try
for win_length = win_lengths(bAux)
pb.start_loop();
if( (win_length * heasig.freq) > heasig.nsamp )
win_length = round(heasig.nsamp / heasig.freq);
end
switch detailLevel
case 'LowDetail'
max_cant_figs = 10;
case 'MediumDetail'
max_cant_figs = 30;
case 'HighDetail'
max_cant_figs = realmax;
end
cant_figs = min(max_cant_figs, ceil(heasig.nsamp / win_length / heasig.freq));
starts = linspace(0, round(heasig.nsamp / heasig.freq) - win_length, cant_figs);
str_aux = ['Reporting for window size: ' Seconds2HMS(win_length) ];
pb1 = pb.AddInerLoop( str_aux );
pb1.Loops2Do = cant_figs;
jj = 1;
for start_time = starts
pb1.start_loop();
fig_hdl = prepare_fig_hdl( fig_hdl );
if( all(strcmpi(report_mode, 'ECG only')) )
plot_ecg_strip(ECG_w, 'PrettyPrint', true, 'Figure_handle', fig_hdl, 'Start_time', start_time, 'End_time', start_time + win_length);
else
plot_ecg_strip(ECG_w, 'PrettyPrint', true, ...
'Figure_handle', fig_hdl, ...
'Start_time', start_time, ...
'End_time', start_time + win_length);
end
set(fig_hdl, 'Visible', 'off');
str_aux2 = [ str_aux ' - Start: ' Seconds2HMS(start_time) ];
pb1.checkpoint(str_aux2);
switch( report_format )
case {'pdf' 'tiff' }
if( jj == 1 )
export_fig(filename, '-nocrop', '-bookmark', Seconds2HMS(win_length), '-append', ['-' report_format], fig_hdl);
else
export_fig(filename, '-nocrop', '-bookmark', [' ' Seconds2HMS(start_time)], '-append', ['-' report_format], fig_hdl);
end
otherwise
[aux_path, aux_filename] = fileparts(filename);
aux_filename = [aux_path filesep aux_filename];
aux_filename = sprintf( '%s_%04d.%s', aux_filename, ii, report_format);
export_fig(aux_filename, '-nocrop', ['-' report_format], fig_hdl);
end
pb1.checkpoint(str_aux2);
ii = ii + 1;
jj = jj + 1;
pb1.end_loop();
end
pb.end_loop();
end
if( ishandle(fig_hdl) )
close(fig_hdl)
end
clear pb
catch MException
%% Error handling
%% No User interface report clearly to log file
disp_string_framed(2, sprintf('ERROR in rec %s', ECG_w.ECG_header.recname))
rethrow(MException)
end
function fig_hdl = prepare_fig_hdl( fig_hdl )
paper_size = [0 0 29.7 21.0 ];
if( ishandle(fig_hdl) )
close(fig_hdl)
end
fig_hdl = figure('Visible', 'off');
% fig_hdl = figure();
set(fig_hdl, 'NumberTitle', 'off');
% prev_units = get(fig_hdl, 'PaperUnits');
set(fig_hdl, 'PaperUnits', 'centimeters');
set(fig_hdl, 'PaperType', 'A4');
set(fig_hdl, 'PaperOrientation', 'landscape');
set(fig_hdl, 'PaperPosition', paper_size);
% disp(get(fig_hdl, 'PaperPosition'));
% set(fig_hdl, 'PaperUnits', prev_units);
% prev_units = get(fig_hdl, 'Units');
set(fig_hdl, 'Units', 'centimeters');
set(fig_hdl, 'Position', paper_size);
% disp(get(fig_hdl, 'Position'));
% set(fig_hdl, 'Units', prev_units);