ECG-Kit 1.0

File: <base>/common/a2hbc/scripts/FindClusterExamples.m (8,595 bytes)

%centroid idx is the first
clust_sample_centroid_idx = clust_dist2mu_sorted_idx(1);

centroid_FM_idx = not_labeled_idx(aux_idx(aux_idx2(clust_sample_centroid_idx)));

centroid_QRS_idx = (centroid_FM_idx);

aux_hb_seq =    max(1, QRS_locations(centroid_QRS_idx) - round(2*sampling_rate)): ...
                min(ECG_header.nsamp, QRS_locations(centroid_QRS_idx) + round(2*sampling_rate));

aux_hb_seq2 =   max(1, centroid_FM_idx - 5):min(cant_QRS_locations, centroid_FM_idx + 2);

aux_hb_seq3 =    max(1, QRS_locations(centroid_QRS_idx) - round(0.2*sampling_rate)): ...
                min(ECG_header.nsamp, QRS_locations(centroid_QRS_idx) + round(0.5*sampling_rate));


cCentroid = {   (QRS_locations(centroid_QRS_idx) - aux_hb_seq(1) + 1) ... %relative position of the heartbeat
                ECG_total(aux_hb_seq,:) ... % ecg excerpt
                centroid_FM_idx - aux_hb_seq2(1) + 1 ... % relative position of the heartbeat 
                RR_intervals(aux_hb_seq2)/sampling_rate ... % RR interval sequence
                (QRS_locations(centroid_QRS_idx) - aux_hb_seq3(1) + 1) ... %relative position of the heartbeat                
                ECG_total(aux_hb_seq3,:) ... % morph excerpt
                clust_data_m ... % cluster size
                };
            
%closer samples
quartile_size = round(clust_data_m * 0.25);
if( quartile_size > CantSamplesClose )
    clust_samples_close_idx = clust_dist2mu_sorted_idx( 1 + randsample(quartile_size, CantSamplesClose ) );
else
    if( clust_data_m < 2 )
        % the centroid itself
        clust_samples_close_idx = clust_dist2mu_sorted_idx;
    else
        clust_samples_close_idx = clust_dist2mu_sorted_idx( 2:(2+quartile_size-1) );
    end
end

clust_samples_close_idx = sort(clust_samples_close_idx);
clust_samples_close_FM_idx = not_labeled_idx(aux_idx(aux_idx2(clust_samples_close_idx)));
clust_samples_close_QRS_idx = (clust_samples_close_FM_idx);


aux_ECGslices = [];
aux_RRslices = [];
aux_MorphSlices = [];
aux_rel_posQRS = [];
aux_rel_posRR = [];
aux_rel_MorphposQRS = [];

   
    aux_seq = colvec(1:length(clust_samples_close_QRS_idx));
    
    aux_hb_seq = arrayfun(@(a)( max(1, QRS_locations(clust_samples_close_QRS_idx((a))) - round(2*sampling_rate)): ...
                                min(ECG_header.nsamp, QRS_locations(clust_samples_close_QRS_idx((a))) + round(2*sampling_rate)) ) , ...
                           aux_seq, 'UniformOutput', false);

    aux_hb_seq2 = arrayfun(@(a)(    max(1, clust_samples_close_FM_idx((a)) - 5): ...
                                    min(cant_QRS_locations, clust_samples_close_FM_idx((a)) + 2) ) , ...
                           aux_seq, 'UniformOutput', false);

    aux_hb_seq3 = arrayfun(@(a)( max(1, QRS_locations(clust_samples_close_QRS_idx((a))) - round(0.2*sampling_rate)): ...
                                min(ECG_header.nsamp, QRS_locations(clust_samples_close_QRS_idx((a))) + round(0.5*sampling_rate)) ) , ...
                           aux_seq, 'UniformOutput', false);

    %ECG slices
    aux_ECGslices = [aux_ECGslices; cellfun(@(a)(ECG_total(a,:)), aux_hb_seq, 'UniformOutput', false)];
    %RR slices
    aux_RRslices = [aux_RRslices; cellfun(@(a)(RR_intervals(a)/sampling_rate), aux_hb_seq2, 'UniformOutput', false)];
    %Morph slices
    aux_MorphSlices = [aux_MorphSlices; cellfun(@(a)(ECG_total(a,:)), aux_hb_seq3, 'UniformOutput', false)];
    
    %relative positions
    aux_rel_posQRS = [aux_rel_posQRS; cellfun(@(a,b)(QRS_locations(clust_samples_close_QRS_idx((a))) - b(1) + 1), num2cell(aux_seq), aux_hb_seq)];
    aux_rel_posRR =  [aux_rel_posRR; cellfun(@(a,b)(clust_samples_close_FM_idx((a)) - b(1) + 1), num2cell(aux_seq), aux_hb_seq2)];
    aux_rel_MorphposQRS = [aux_rel_MorphposQRS; cellfun(@(a,b)(QRS_locations(clust_samples_close_QRS_idx((a))) - b(1) + 1), num2cell(aux_seq), aux_hb_seq3)];
                       

if( iscell(aux_ECGslices) )
    cCloserExamples = { aux_rel_posQRS ... %relative position of the heartbeat
                        aux_ECGslices ... % ecg excerpt
                        aux_rel_posRR ... % relative position of the heartbeat 
                        aux_RRslices ... % RR interval sequence
                        aux_rel_MorphposQRS ... % Morph relative position of the heartbeat 
                        aux_MorphSlices ... % Morph interval sequence
                        };
else
    cCloserExamples = { aux_rel_posQRS ... %relative position of the heartbeat
                        {aux_ECGslices} ... % ecg excerpt
                        aux_rel_posRR ... % relative position of the heartbeat 
                        {aux_RRslices} ... % RR interval sequence
                        aux_rel_MorphposQRS ... % Morph relative position of the heartbeat 
                        {aux_MorphSlices} ... % Morph interval sequence
                        };
    
end

%distant samples
if( quartile_size > CantSamplesFar )
    clust_samples_far_idx = clust_dist2mu_sorted_idx( clust_data_m - randsample(quartile_size, CantSamplesFar ) + 1  );
else
    if( clust_data_m < 3 )
        % all examples
        clust_samples_far_idx = clust_dist2mu_sorted_idx;
    else
        clust_samples_far_idx = clust_dist2mu_sorted_idx(3*quartile_size:clust_data_m);
    end
end


clust_samples_far_idx = sort(clust_samples_far_idx);
clust_samples_far_FM_idx = not_labeled_idx(aux_idx(aux_idx2(clust_samples_far_idx)));
clust_samples_far_QRS_idx = (clust_samples_far_FM_idx);

aux_ECGslices = [];
aux_RRslices = [];
aux_MorphSlices = [];
aux_rel_posQRS = [];
aux_rel_posRR = [];
aux_rel_MorphposQRS = [];

    
    aux_seq = colvec(1:length(clust_samples_far_QRS_idx));
    
    aux_hb_seq = arrayfun(@(a)( max(1, QRS_locations(clust_samples_far_QRS_idx((a))) - round(2*sampling_rate)): ...
                                min(ECG_header.nsamp, QRS_locations(clust_samples_far_QRS_idx((a))) + round(2*sampling_rate)) ) , ...
                           aux_seq, 'UniformOutput', false);

    aux_hb_seq2 = arrayfun(@(a)(    max(1, clust_samples_far_FM_idx((a)) - 5): ...
                                    min(cant_QRS_locations, clust_samples_far_FM_idx((a)) + 2) ) , ...
                           aux_seq, 'UniformOutput', false);

    aux_hb_seq3 = arrayfun(@(a)( max(1, QRS_locations(clust_samples_far_QRS_idx((a))) - round(0.2*sampling_rate)): ...
                                min(ECG_header.nsamp, QRS_locations(clust_samples_far_QRS_idx((a))) + round(0.5*sampling_rate)) ) , ...
                           aux_seq, 'UniformOutput', false);
                       
    %ECG slices
    aux_ECGslices = [aux_ECGslices; cellfun(@(a)(ECG_total(a,:)), aux_hb_seq, 'UniformOutput', false)];
    %RR slices
    aux_RRslices = [aux_RRslices; cellfun(@(a)(RR_intervals(a)/sampling_rate), aux_hb_seq2, 'UniformOutput', false)];
    %Morph slices
    aux_MorphSlices = [aux_MorphSlices; cellfun(@(a)(ECG_total(a,:)), aux_hb_seq3, 'UniformOutput', false)];
    
    %relative positions
    aux_rel_posQRS = [aux_rel_posQRS; cellfun(@(a,b)(QRS_locations(clust_samples_far_QRS_idx((a))) - b(1) + 1), num2cell(aux_seq), aux_hb_seq)];
    aux_rel_posRR =  [aux_rel_posRR; cellfun(@(a,b)(clust_samples_far_FM_idx((a)) - b(1) + 1), num2cell(aux_seq), aux_hb_seq2)];
    aux_rel_MorphposQRS = [aux_rel_MorphposQRS; cellfun(@(a,b)(QRS_locations(clust_samples_far_QRS_idx((a))) - b(1) + 1), num2cell(aux_seq), aux_hb_seq3)];


if( iscell(aux_ECGslices) )
    cDistantExamples ={ aux_rel_posQRS ... %relative position of the heartbeat
                        aux_ECGslices ... % ecg excerpt
                        aux_rel_posRR ... % relative position of the heartbeat 
                        aux_RRslices ... % RR interval sequence
                        aux_rel_MorphposQRS ... % Morph relative position of the heartbeat 
                        aux_MorphSlices ... % Morph interval sequence
                        };
else
    %force cell contents.
    cDistantExamples ={ aux_rel_posQRS ... %relative position of the heartbeat
                        {aux_ECGslices} ... % ecg excerpt
                        aux_rel_posRR ... % relative position of the heartbeat 
                        {aux_RRslices} ... % RR interval sequence
                        aux_rel_MorphposQRS ... % Morph relative position of the heartbeat 
                        {aux_MorphSlices} ... % Morph interval sequence
                        };
end

clear aux