ECG-Kit 1.0

File: <base>/common/wavedet/t5.m (11,834 bytes)
% script which used ascale 5 in T wave delineation 
% Rute Almeida 
% Last update: Rute Almeida  19/07/2011
%
% Designed for MATLAB Version R12; tested with MATLAB Version R13

if absmax >= absmin,    % the greatest modulus maximum is the maximum
    % Now we search the two minima nearest to maxpos, one before and one after
    minapos = max(modmax(w(begwin+1:maxpos-1,scale2),2,0,-1));
    minapos = begwin + minapos; % Position of the negative minimum before the maximum
    if isempty(minapos) && (maxpos ~= begwin) && (w(begwin,scale2)<0),
        minapos = begwin;        % If no local minimum before the maximum, take the first sample
    end
    minppos = min(modmax(w(maxpos+1:endwin,scale2),2,0,-1));
    minppos = maxpos + minppos; % Position of the positive maximum after the minimum
    if isempty(minppos) && (maxpos ~= endwin) && (w(endwin,scale2)<0),
        minppos = endwin;        % If no local minimum after the maximum, take the last sample
    end
    
    mina = abs(w(minapos,scale2));     % Amplitude of minimum before maximum
    minp = abs(w(minppos,scale2));     % Amplitude of minimum after maximum
    
    if (mina < umbralsig*absmax), % If mina is not big enough
        mina =[];                  % forget it
    elseif (maxpos-minapos>Tmax_Tmin_time_min*messages.setup.wavedet.freq), %or if ther are more than 150 ms to maxpos
        mina = [];
    end
    if (minp < umbralsig*absmax), % If minp is not big enough
        minp =[];                  % forget it
    elseif (minppos-maxpos>Tmax_Tmin_time_min*messages.setup.wavedet.freq), % and also if there are more than 150 ms to maxpos
        minp =[];
    end
    
    if ~isnan(mina)&~isnan(minp),  %#ok<AND2>    %%% NUEVO JP
        if (mina >= minp)&&(minp < umbralsig*absmax*Tmax_Tmin_bifasic),
            minp = [];
        elseif (minp> mina)&&(mina < umbralsig*absmax*Tmax_Tmin_bifasic),
            mina = [];
        end
    end
    
    % Test which modulus maxima are significative and find zero crossings
    if isempty(mina),
        if isempty(minp),
            tipoT = 2;      % only upwards T wave
            if maxpos - minapos > 2,         % if not !!!!!!!!!!!
                ind = zerocros(flipud(w(minapos:maxpos,scalezerocros)));   %Scale scalezerocros !!!
                if isempty(ind) %%%%%%%%%%%%%%Rute 03/09/02
                    ind = zerocros(flipud(w(minapos:maxpos,scale2)));
                end %%%%%%%%%%%%%%Rute 03/09/02
                T = maxpos - ind +1;                           % Zero crossing = T wave position
                picoff = maxpos;                               %wavelet  peak to detect offset
            elseif isempty(minapos);  % If there were no minimum, there is no zero crossing				
                T = picant (w(begwin:maxpos,scale2),maxpos);       % Take the minimum at scale scale2
                if ~isempty(T) %%%%%%%%%%%% 14/06 /02 Rute 
                    picoff = maxpos;
                else
                    picoff = []; % if did not exist a peak in scale scale2 there is no T
                end %%%%%%%%%%%% 14/06/02 Rute 
            else %%%%%%%%%%%%%%%%%%%%% nao faz nada!!!!!!! % 12/06/02  Rute
              messages.warnings=[messages.warnings {'unknown case: unable to classify T wave.'}];
            end
        else      % minp exists (is significative) but mina not
            tipoT = 0;  		%normal T wave
            if minppos -maxpos >2,       % if not!!!!!!???
                ind = zerocros(w(maxpos:minppos,scalezerocros));  %% 07/06/02 Rute
                if isempty(ind) %%%%%%%%%%%%%%Rute 03/09/02
                    ind = zerocros(w(maxpos:minppos,scalezerocros2));
                end %%%%%%%%%%%%%%Rute 03/09/02
                T = maxpos + ind -1;
                picon = maxpos;		% For determining onset and offset
                picoff = minppos;
            else %%%%%%%%%%%%%%%%%%%%% nao faz nada!!!!!!! % 12/06/02  Rute
                messages.warnings=[messages.warnings {'unknown case: unable to classify T wave.'}];
            end
        end
    else
        if isempty(minp),   %  mina exists (is significative) but minp not
            tipoT = 1;  	%inverted T wave
            if maxpos -minapos >2,  % if not !!!!!!!!!
                ind = zerocros(w(minapos:maxpos,scalezerocros));  % wavelet zero crossing is T wave peak  %% 07/06/02 Rute
                if isempty(ind) %%%%%%%%%%%%%%Rute 03/09/02
                    ind = zerocros(w(minapos:maxpos,scalezerocros2));
                end %%%%%%%%%%%%%%Rute 03/09/02
                T = minapos + ind -1;
                picon = minapos;
                picoff = maxpos;
            else %%%%%%%%%%%%%%%%%%%%% nao faz nada!!!!!!! % 12/06/02  Rute
               messages.warnings=[messages.warnings {'unknown case: unable to classify T wave.'}];
            end
        else    % both mina and minp are significative.  Biphasic wave.
            tipoT = 5;	% biphasic neg-pos T wave
            if maxpos - minapos > 2,    %!!!!!!!!!!!!
                ind = zerocros(flipud(w(minapos:maxpos,scalezerocros))); %% 07/06/02 Rute
                if isempty(ind) %%%%%%%%%%%%%%Rute 03/09/02
                    ind = zerocros(flipud(w(minapos:maxpos,scalezerocros2)));
                end %%%%%%%%%%%%%%Rute 03/09/02
                T = maxpos - ind +1;
                picon = minapos;
            else %%%%%%%%%%%%%%%%%%%%% nao faz nada!!!!!!! % 12/06/02  Rute
               messages.warnings=[messages.warnings {'unknown case: unable to classify T wave.'}];
            end
            if minppos - maxpos > 2,    %!!!!!!!!!!!!
                ind = zerocros(flipud(w(maxpos:minppos,scalezerocros))); %% 07/06/02 Rute
                if isempty(ind) %%%%%%%%%%%%%%Rute 03/09/02
                    ind = zerocros(flipud(w(minapos:maxpos,scalezerocros2))); 
                end %%%%%%%%%%%%%%Rute 03/09/02
                Tprima = maxpos + ind -1;
                picoff = minppos;
            else %%%%%%%%%%%%%%%%%%%%% nao faz nada!!!!!!! % 12/06/02  Rute
               messages.warnings=[messages.warnings {'unknown case: unable to classify T wave.'}];
            end
        end
    end
else        % If the greatest modulus maximum is the minimum
    % Search two maxima, one before and one after the minimum
    maxapos = max(modmax(w(begwin+1:minpos-1,scale2),2,0,1));
    maxapos = begwin + maxapos;
    if isempty(maxapos) && (minpos ~= begwin) && (w(begwin,scale2)>0),
        maxapos = begwin;           
    end
    maxppos = min(modmax(w(minpos+1:endwin,scale2),2,0,1));
    maxppos = minpos + maxppos;
    if isempty(maxppos) && (minpos ~= endwin) && (w(endwin,scale2)>0),
        maxppos = endwin;           
    end
    maxa = abs(w(maxapos,scale2));
    maxp = abs(w(maxppos,scale2));
    % See if they are significative
    if (maxa < umbralsig*absmin)
        maxa =[];
    elseif (minpos-maxapos>Tmax_Tmin_time_min*messages.setup.wavedet.freq),
        maxa = [];
    end
    if (maxp < umbralsig*absmin),
        maxp =[];
    elseif (maxppos-minpos>Tmax_Tmin_time_min*messages.setup.wavedet.freq),
        maxp = [];
    end
    if ~isnan(maxa)&~isnan(maxp),   %#ok<AND2>   %%% NUEVO JP
        if (maxa >= maxp)&&(maxp < umbralsig*absmin*Tmax_Tmin_bifasic),
            maxp = [];
        elseif (maxp> maxa)&&(maxa < umbralsig*absmin*Tmax_Tmin_bifasic),
            maxa = [];
        end
    end
    % Test which modulus maxima are significative and find zero crossings
    if isempty(maxa),
        if isempty(maxp),
            tipoT = 3;      % only downwards T wave
            if minpos - maxapos > 2, %!!!!!!!!
                ind = zerocros(flipud(w(maxapos:minpos,scalezerocros)));   %Scale scalezerocros
                if isempty(ind) %%%%%%%%%%%%%%Rute 03/09/02
                    ind = zerocros(flipud(w(maxapos:minpos,scalezerocros2))); 
                end %%%%%%%%%%%%%%Rute 03/09/02
                T = minpos - ind +1;
                picoff = minpos;
            elseif isempty(maxapos);  % If there were no maximum, there is no zero crossing.	
                T = picant (w(begwin:minpos,scale2),minpos);  % menimo en escala 4.
                if ~isempty(T) %%%%%%%%%%%% 14/06/02 Rute 
                    picoff = maxpos;
                else
                    picoff = []; % if did not exist a peak in scale 4 there is no T
                end %%%%%%%%%%%% 14/06/02 Rute 
            else %%%%%%%%%%%%%%%%%%%%% nao faz nada!!!!!!! % 12/06/02  Rute
                messages.warnings=[messages.warnings {'unknown case: unable to classify T wave.'}];
            end
        else      % maxp is signficative, but not maxa
            tipoT = 1;  %inverted T wave
            if maxppos -minpos >2,  % !!!!!!
                ind = zerocros(w(minpos:maxppos,scalezerocros));  %% 07/06/02 Rute
                if isempty(ind) %%%%%%%%%%%%%%Rute 03/09/02
                    ind = zerocros(w(minpos:maxppos,scalezerocros2)); 
                end %%%%%%%%%%%%%%Rute 03/09/02
                T = minpos + ind -1;
                picon = minpos;		% For calculating onset and offset
                picoff = maxppos;
            else %%%%%%%%%%%%%%%%%%%%% nao faz nada!!!!!!! % 12/06/02  Rute
               messages.warnings=[messages.warnings {'unknown case: unable to classify T wave.'}];
            end
        end
    else
        if isempty(maxp),   % maxa is significative, but not maxp
            tipoT = 0;       %normal T wave
            if minpos -maxapos >2,
                ind = zerocros(w(maxapos:minpos,scalezerocros)); %% 07/06/02 Rute
                if isempty(ind) %%%%%%%%%%%%%%Rute 03/09/02
                    ind = zerocros(w(maxapos:minpos,scalezerocros2)); 
                end %%%%%%%%%%%%%%Rute 03/09/02
                T = maxapos + ind -1;
                picon = maxapos;
                picoff = minpos;
            else %%%%%%%%%%%%%%%%%%%%% nao faz nada!!!!!!! % 12/06/02  Rute
               messages.warnings=[messages.warnings {'unknown case: unable to classify T wave.'}];
            end
        else    % both maxa and maxp are significative.  Biphasic wave.
            tipoT = 4;	% biphasic pos-neg T wave
            if minpos - maxapos > 2,  %!!!!!!!!!!!
                % %% 07/06/02 Rute
                ind = zerocros(flipud(w(maxapos:minpos,scalezerocros))); %% 07/06/02 Rute
                if isempty(ind) %%%%%%%%%%%%%%Rute 03/09/02
                    ind = zerocros(flipud(w(maxapos:minpos,scalezerocros2)));
                end %%%%%%%%%%%%%%Rute 03/09/02
                T = minpos - ind +1;
                picon = maxapos;
            else %%%%%%%%%%%%%%%%%%%%% nao faz nada!!!!!!! % 12/06/02  Rute
                messages.warnings=[messages.warnings {'unknown case: unable to classify T wave.'}];
            end
            if maxppos - minpos > 2,    %!!!!!!!!!!!!
                ind = zerocros(flipud(w(minpos:maxppos,scalezerocros))); %% 07/06/02 Rute
                if isempty(ind) %%%%%%%%%%%%%%Rute 03/09/02
                    ind = zerocros(flipud(w(minpos:maxpos,scalezerocros2)));
                end %%%%%%%%%%%%%%Rute 03/09/02
                Tprima = minpos + ind -1;
                picoff = maxppos;
            else %%%%%%%%%%%%%%%%%%%%% nao faz nada!!!!!!! % 12/06/02  Rute
                messages.warnings=[messages.warnings {'unknown case: unable to classify T wave.'}];
            end
        end
    end
end

% T wave onset and offset detection
%if isempty(T), picon=[]; picoff=[]; end
if ~isempty(picon),
    Ton = searchon (picon, w(max(begwin,picon-round(T_bound_tol*messages.setup.wavedet.freq)):picon,scale2), Kton); 
end

if ~isempty(picoff),
    Toff=searchoff(picoff, w(picoff:min([size(w,1) picoff+round(T_bound_tol*messages.setup.wavedet.freq) ]) ,scale2) , Ktoff);
    if (Toff > endwin),
        Toff = endwin;
    end 
end