function [a_out, b_out, c_out]=tt(x)
% TT   Mean trapping time and its distribution.
%    A=TT(X) computes the mean of the length of the vertical 
%    line structures in a recurrence plot, so called trapping 
%    time TT.
%
%    [A B]=TT(X) computes the TT and the lengths of the
%    found vertical lines, stored in B. In order to get the 
%    histogramme of the line lengths, simply call 
%    HIST(B,[1 MAX(B)]).
%
%    Examples: X = crp(rand(200,1),1,1,.3,'fan','silent');
%              [v v_dist] = tt(X);
%              hist(v_dist,200)
%
%    See also CRQA, DL, RPDE.

% Copyright (c) 2008-2009
% Norbert Marwan, Potsdam Institute for Climate Impact Research, Germany
% http://www.pik-potsdam.de
%
% Copyright (c) 2001-2008
% Norbert Marwan, Potsdam University, Germany
% http://www.agnld.uni-potsdam.de
%
% $Date$
% $Revision$
%
% $Log$
% Revision 3.8  2013/08/22 06:35:01  marwan
% bugfix in estimation black and white vertical lines
%
% Revision 3.7  2010/06/30 12:02:52  marwan
% Help text modified
%
% Revision 3.6  2009/03/24 08:33:47  marwan
% copyright address changed
%
% Revision 3.5  2008/04/29 14:50:06  marwan
% fixed problem of empty RP
%
% Revision 3.4  2007/12/20 16:26:57  marwan
% includes also white vertical lines
%
% Revision 3.3  2005/11/23 07:29:14  marwan
% help text updated
%
% Revision 3.2  2005/03/16 11:19:02  marwan
% help text modified
%
% Revision 3.1  2004/11/10 07:07:35  marwan
% initial import
%
%
% This program is free software; you can redistribute it and/or
% modify it under the terms of the GNU General Public License
% as published by the Free Software Foundation; either version 2
% of the License, or any later version.

error(nargchk(1,1,nargin));
if nargout>3, error('Too many output arguments'), end
    
%a_out = NaN; b_out = NaN; c_out = NaN;

warning off
try

    if any(x(:))


        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % for black vertical lines
        xb=double(x); 
        xb(end+1,:)=0;xb=double(xb(:));
        z=diff(xb);
        z0=find(z==1); % begin of black sequence
        z1=find(z==-1); % end of black sequence


        % measure the length of black lines
        if z0(1)>z1(1)
          z0(2:end+1,1)=z0(1:end);z0(1,1)=0;
          if length(z0)>length(z1) 
             z0(end)=[];
          end
        end

        t=sort(z1-z0);
        t1=t(find(t-1));


        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % for white vertical lines
        
        % if LOI is not present then put it in!
        if ~all(diag(x))
           x = x + eye(size(x));
        end
        
        for i = 1:size(x,2)
            i_ = find(x(:,i));
            i1 = min(i_); i2 = max(i_);
            x(1:i1,i) = 1;
            x(i2:end,i) = 1;
        end

        xw=double(x); xw(end+1,:)=1;
        zw=diff(xw(:));
        z0w=find(zw==-1); % begin of white sequence
        z1w=find(zw==1); % end of white sequence


        % measure the length of white lines
        if z0w(1)>z1w(1)
          z0w(1)=[]; 
          if length(z1w)>length(z0w) 
             z1w(end)=[];
          end
        end
        if length(z1w)>length(z0w) 
             z0w=[1;z0w];
        end

        tw=sort(z1w-z0w);
        t1w=tw(find(tw-1));

        if nargout==3
           c_out=zeros(length(tw),1);
           c_out=tw+1; % +1 correction to get the correct RT
        end

        if nargout>=2
           b_out=zeros(length(t),1);
           b_out=t;
        end

        if nargout>0
           if isempty(t1), a_out=0;
           else, a_out=mean(t1); 
           end
        else
           mean(t1)
        end

    else

        if nargout==3
           c_out=NaN;
        end

        if nargout>=2
           b_out=NaN;
        end

        if nargout>0
           a_out=NaN;
        else
           NaN
        end

    end

    warning on

catch
    if nargout==3
        c_out=NaN;
    end

    if nargout>=2
        b_out=NaN;
    end

    if nargout>0
        a_out=NaN;
    else
        NaN
    end
end
