Robust Detection of Heart Beats in Multimodal Data: The PhysioNet/Computing in Cardiology Challenge 2014 1.0.0
(3,461 bytes)
function challenge(recordName)
%
% challenge(recordName)
%
% Sample entry for the 2014 PhysioNet/CinC Challenge.
% This function should takes three parameters:
%
% recordName
% String specifying the record name to process
%
% This function has no output arguments, its writes an "recordName.qrs" annotation file
% at the current directory. Do not include file extensions on the recordName string.
%
% The annotations file should contain all the beats that you were able
% to detect in the record.
%
% Dependencies:
%
% 1) This function requires that you have the WFDB
% App Toolbox installed. For information on how to install the toolbox
% please see:
% http://www.physionet.org/physiotools/matlab/wfdb-app-matlab/
%
% Please note that the Toolbox is supported only on MATLAB 2013a
% and 2013b. Supported operating systems are 64 bit versions of:
% Linux, Mac OS X, and Windows.
%
% 2) The CHALLENGE function requires that you have downloaded the challenge
% data 'set-p' in a subdirectory of the current directory. The subdirectory
% should be called '/challenge/2014/set-p/' . The 'set-p' dataset can
% be downloaded from PhysioNet at:
% http://physionet.org/physiobank/database/challenge/2014/
%
% This dataset is used by the generateValidationSet.m script to
% create the annotations on your traing set that will be used to
% verify that your entry works properly in the PhysioNet testing
% environment.
%
% Version 0.9
%
% See also: RDSAMP, RDANN, WRANN, GQRS, ECGPUWAVE, SQRS, WQRS, WABP
%
% Written by Ikaro Silva, December 10, 2013.
% Last Modified: February 11, 2014
%
%
%
% %Example using training data-
% challenge('100')
%
%This line is required in order to properly load the WFDB Toolbox
%in the Octave testing framework
[~,config]=wfdbloadlib;
%Used for discarding annotations that dont have a minimum number of beats
annName='qrs'; %All competitors are expected to save their annotation as *.qrs
%Get all ECG and blood pressure signals
siginfo=wfdbdesc(recordName);
description=squeeze(struct2cell(siginfo));
description=description(5,:);
ecg_ind=get_index(description,'ECG'); %Call subfunction to get channel indices
Mecg=length(ecg_ind);
%%Users can access the raw samples of the record by running the following
%command:
%[tm,signal]=rdsamp(recordName);
%
%%For more information please see the help in RDSAMP
%Annotated the first ECG channel with GQRS and default values to generare QRS file
N=[];
N0=[];
threshold=[];
gqrs(recordName,N,N0,ecg_ind(1),threshold,annName);
%Run WABP on the record, which by default will analyze the first ABP, ART, or BP signal
bp_ind=get_index(description,'BP');
if(~isempty(bp_ind))
wabp(recordName);
%Read annotations back to compare with ECG annotations to find the one
%with smallest RR variance (our best estimate)
[rr_abp,~]=ann2rr(recordName,'wabp');
[rr_ecg,~]=ann2rr(recordName,'qrs');
[~,best]=min([var(rr_abp) var(rr_ecg)]);
%If ABP has smallest annotation, overwrite the qrs file from GQRS
if(best==1)
movefile([recordName '.wabp'],[recordName '.' annName]);
end
end
%%%%%%%%%%%% Helper Function %%%%%%%%%%%%%%%%%%%%%
function ind=get_index(description,pattern)
M=length(description);
tmp_ind=strfind(description,pattern);
ind=[];
for m=1:M
if(~isempty(tmp_ind{m}))
ind(end+1)=m;
end
end