function[vetorPFid,Desvio_ampl_pfid,fplim,VetorOn,VetorOff,Hist_Best_SD1_QRS,Hist_Best_SD2_QRS,Hist_Perc_Corte1,Hist_Perc_Corte2,Hist_Erro_Matching] = Det_PrBat(sinal,sinal_ref,ider)

global limiar Fam kernelx
global Nbatmin Nbatmax vetor_eg


pinic = round(0.0004*Fam); %%% Ponto de partida a 40ms do inicio do sinal
pfin = length(sinal);
%vetor_eg = [];
VetorOn = [];
VetorOff = [];
Hist_Best_SD1_QRS = [];
Hist_Best_SD2_QRS = [];
Hist_Perc_Corte1 = []; 
Hist_Perc_Corte2 = [];
Hist_Erro_Matching = [];


MaxSinal = max(sinal(pinic:pfin));
sinal = sinal/MaxSinal;  %%% Normalizações
vbolParou = 0;
dlim = round(2*Fam); %%% distancia limite de 2s
fplim = 0.2;
fplimI = 0.2;
limiarAmp = fplim*max(sinal(pinic:pfin));
dmin = 0.050*Fam; %%% Distância mínima entre dois pontos fiduciais
Niter = 0;



while vbolParou == 0 & Niter <= 50

    limiarAmp = fplim*max(sinal(pinic:pfin));    
    count = 1;
    i = pinic;
    mudlim = 0;
    vetorPFid = [];
    vetorPFid_Sfilt = [];

    if sinal(i) > limiarAmp
        i = ultrapassa_limiar2(i,sinal,pfin,limiarAmp)+1;
    end

    while i < pfin
    
    
        PosAcima = ultrapassa_limiar1(i,sinal,pfin,limiarAmp,vetorPFid_Sfilt,dmin);
    
        if PosAcima == 0
            break;
        end
    
        PosAbaixo = ultrapassa_limiar2(PosAcima,sinal,pfin,limiarAmp);
    
        if PosAbaixo == 0
            break;
        end
    
        PontoFiducial = Pico_Intervalo(PosAcima,PosAbaixo,sinal);
    
    
        %if length(vetorPFid_Sfilt) > 0
        if length(vetorPFid) > 0
            %if abs(PontoFiducial - vetorPFid_Sfilt(end)) > dmin
            if abs(PontoFiducial - vetorPFid(end)) > dmin
            
                vetorPFid_Sfilt = [vetorPFid_Sfilt PontoFiducial];
            
                %%% TESTAR MODELAGEM DO BATIMENTO %%%
                
                          PicoMapeado = Mapeia_Pico(PontoFiducial,sinal_ref);

                       [New_R,On,Off,Best_SD1_QRS,Best_SD2_QRS,Perc_Corte1,Perc_Corte2,Erro_Matching,pmedio] = Busca_Melhor_Rayleigh1_Plot(PicoMapeado,sinal_ref,Fam);
                       
                       Hist_Best_SD1_QRS = [Hist_Best_SD1_QRS Best_SD1_QRS];
                       Hist_Best_SD2_QRS = [Hist_Best_SD2_QRS Best_SD2_QRS];
                       Hist_Perc_Corte1 = [Hist_Perc_Corte1 Perc_Corte1]; 
                       Hist_Perc_Corte2 = [Hist_Perc_Corte2 Perc_Corte2];
                       Hist_Erro_Matching = [Hist_Erro_Matching Erro_Matching]; 
                       PontoFiducial = PicoMapeado; 
                       vetorPFid = [vetorPFid PontoFiducial];
                       
                       %            
%           %%% Armazenando vetores On-Off %%%
%           
                 VetorOn = [VetorOn On];
                 VetorOff = [VetorOff Off];
            
%                 offset0 = round(0.007*Fam);
%                 PicoMapeado = Mapeia_Pico(PontoFiducial,sinal_ref);
%                 Win = sinal_ref(1,max(PicoMapeado-offset0,1):PicoMapeado+offset0);
%                 if PicoMapeado-offset0 > 0
%                     Pico = offset0+1;
%                 else
%                     Pico = PicoMapeado;
%                 end
%                 if Win(Pico) > 0
%                     tipoQRS = 1;  %% Polaridade Positiva
%                 else
%                     tipoQRS = 2;  %% Polaridade Negativa
%                 end
%                 pck1 = Pico;
%                 ljan1 = offset0;
%                 ljan2 = offset0;
%                 newbegin = max(round(pck1(1)-ljan1),1); newend=min(round(pck1(1)+ljan2),length(Win));signal2=Win(newbegin:newend);pck2=pck1-newbegin+1;
%                 [gmod1,eg] = normalizag_QRS_rms(kernelx,signal2,pck2(1),tipoQRS,ljan1,ljan2);
%            
%                 if eg < mean(vetor_eg)*1.5
%                     PontoFiducial = PicoMapeado;
%                     vetorPFid = [vetorPFid PontoFiducial];
%                     vetor_eg = [vetor_eg eg];
%                 
%                     %%Detectando Onset Offset %%
%                 
%                      gpico = find(gmod1 == min(gmod1));
%                     
%                     
%                     index = gpico;
%                     dgmod1 = gmod1(2:end)-gmod1(1:end-1);
%             
%                     if Perc_Corte1 > 0
%             
%                         calc1 = find(dgmod1(1:gpico) ==0);
%                         if length(calc1) > 0
%                             index = calc1(end);
%                         else index = 1;
%                         end
%                         On = index-gpico+PicoMapeado;
%             
%                     else 
%             
%                         ds2 = dgmod1(2:end)-dgmod1(1:end-1);
%                         ds21 = ds2(2:end);
%                         ds22 = ds2(1:end-1);
%                         pds2 = ds21.*ds22;
%                         zcr = find(pds2 < 0);
%                         setP = zcr+1;
%                         if length(setP) == 0
%                             index = 1;
%                         else
%                             fzcr = setP(1)+1;
%                             fpcr = dgmod1(fzcr);
%                             index = fzcr;
%                             while index > 1
%                                 if abs(dgmod1(index)) < 0.1*abs(fpcr)
%                                     break;
%                                 end
%                                 index = index-1;
%                             end
%                         end
%                         On = index-gpico+PicoMapeado;
%             
%                     end
%                     
%         
%                     if Perc_Corte2 > 0
%             
%                         calc1 = find(dgmod1(gpico:end) ==0);
%                         if length(calc1) == 0
%                             calc1 = length(dgmod1(gpico:end));
%                         end
%                         index = calc1(1)+gpico-1;
%                         Off = index-gpico+PicoMapeado;
%             
%                     else 
%             
%                         ds2 = dgmod1(2:end)-dgmod1(1:end-1);
%                         ds21 = ds2(2:end);
%                         ds22 = ds2(1:end-1);
%                         pds2 = ds21.*ds22;
%                         zcr = find(pds2 < 0);
%                         setP = zcr+1;
%                         if length(setP) == 0 | setP < gpico
%                             index = length(dgmod1);
%                         else
%                 
%                             lzcr = setP(end)+1;
%                             lpcr = dgmod1(lzcr);
%                             index = lzcr;
%                             while index < length(dgmod1)
%                                 if abs(dgmod1(index)) < 0.1*abs(lpcr)
%                                     break;
%                                 end
%                                 index = index+1;
%                             end
%                         end
%                         Off = index-gpico+PicoMapeado;
%                         VetorOn = [VetorOn On];
%                         VetorOff = [VetorOff Off];
%                 
%                     %% Fim de detecção Onset Offset%%
%                     end
%                     
%                 end
%             
            
            %%% FIM DO TESTE %%%
            
            
%             PicoMapeado = Mapeia_Pico(PontoFiducial,sinal_ref);
%             PontoFiducial = PicoMapeado;
%             if abs(PontoFiducial - vetorPFid(end)) > dmin
%                 vetorPFid = [vetorPFid PontoFiducial];
%             end
            else
            
                if sinal(PontoFiducial) > sinal(vetorPFid_Sfilt(end))
                    vetorPFid_Sfilt(end) = PontoFiducial;
                    
                       [New_R,On,Off,Best_SD1_QRS,Best_SD2_QRS,Perc_Corte1,Perc_Corte2,Erro_Matching,pmedio] = Busca_Melhor_Rayleigh1_Plot(PicoMapeado,sinal_ref,Fam);
                       
                       Hist_Best_SD1_QRS = [Hist_Best_SD1_QRS Best_SD1_QRS];
                       Hist_Best_SD2_QRS = [Hist_Best_SD2_QRS Best_SD2_QRS];
                       Hist_Perc_Corte1 = [Hist_Perc_Corte1 Perc_Corte1]; 
                       Hist_Perc_Corte2 = [Hist_Perc_Corte2 Perc_Corte2];
                       Hist_Erro_Matching = [Hist_Erro_Matching Erro_Matching];
                       
                       PontoFiducial = PicoMapeado; 
                       vetorPFid(end) = PontoFiducial;
                       
                       %            
%           %%% Armazenando vetores On-Off %%%
%           
                 VetorOn(end)= On;
                 VetorOff(end)=Off;
                
%                     %% Novo Teste de Modelagem %%
%                 
%                     offset0 = round(0.007*Fam);
%                     PicoMapeado = Mapeia_Pico(PontoFiducial,sinal_ref);
%                     Win = sinal_ref(1,max(PicoMapeado-offset0,1):PicoMapeado+offset0);
%                     if PicoMapeado-offset0 > 0
%                         Pico = offset0+1;
%                     else
%                         Pico = PicoMapeado;
%                     end
%                     if Win(Pico) > 0
%                         tipoQRS = 1;  %% Polaridade Positiva
%                     else
%                         tipoQRS = 2;  %% Polaridade Negativa
%                     end
%                     pck1 = Pico;
%                     ljan1 = offset0;
%                     ljan2 = offset0;
%                     newbegin = max(round(pck1(1)-ljan1),1); newend=min(round(pck1(1)+ljan2),length(Win));signal2=Win(newbegin:newend);pck2=pck1-newbegin+1;
%                     [gmod1,eg] = normalizag_QRS_rms(kernelx,signal2,pck2(1),tipoQRS,ljan1,ljan2);
%            
%                     if eg < mean(vetor_eg)*1.5
%                         PontoFiducial = PicoMapeado;
%                         if length(vetorPFid) == 0
%                             keyboard;
%                         end
%                         vetorPFid(end) = PontoFiducial;
%                         vetor_eg = [vetor_eg eg];
%                     
%                         %% Detectando Onset -- Offset %%
%                     
%                         gpico = find(gmod1 == min(gmod1));
%                     
%                     
%                         index = gpico;
%                         dgmod1 = gmod1(2:end)-gmod1(1:end-1);
%             
%                         if Perc_Corte1 > 0
%             
%                             calc1 = find(dgmod1(1:gpico) ==0);
%                             if length(calc1) > 0
%                                 index = calc1(end);
%                             else index = 1;
%                             end
%                             On = index-gpico+PicoMapeado;
%             
%                         else 
%             
%                             ds2 = dgmod1(2:end)-dgmod1(1:end-1);
%                             ds21 = ds2(2:end);
%                             ds22 = ds2(1:end-1);
%                             pds2 = ds21.*ds22;
%                             zcr = find(pds2 < 0);
%                             setP = zcr+1;
%                             if length(setP) == 0
%                                 index = 1;
%                             else
%                                 fzcr = setP(1)+1;
%                                 fpcr = dgmod1(fzcr);
%                                 index = fzcr;
%                                 while index > 1
%                                     if abs(dgmod1(index)) < 0.1*abs(fpcr)
%                                         break;
%                                     end
%                                     index = index-1;
%                                 end
%                             end
%                             On = index-gpico+PicoMapeado;
%             
%                         end
%                         index1 = index-gpico+pico;
%         
%                         if Perc_Corte2 > 0
%             
%                             calc1 = find(dgmod1(gpico:end) ==0);
%                             if length(calc1) == 0
%                                 calc1 = length(dgmod1(gpico:end));
%                             end
%                             index = calc1(1)+gpico-1;
%                             Off = index-gpico+PicoMapeado;
%             
%                         else 
%             
%                             ds2 = dgmod1(2:end)-dgmod1(1:end-1);
%                             ds21 = ds2(2:end);
%                             ds22 = ds2(1:end-1);
%                             pds2 = ds21.*ds22;
%                             zcr = find(pds2 < 0);
%                             setP = zcr+1;
%                             if length(setP) == 0 | setP < gpico
%                                 index = length(dgmod1);
%                             else
%                 
%                                 lzcr = setP(end)+1;
%                                 lpcr = dgmod1(lzcr);
%                                 index = lzcr;
%                                 while index < length(dgmod1)
%                                     if abs(dgmod1(index)) < 0.1*abs(lpcr)
%                                         break;
%                                     end
%                                     index = index+1;
%                                 end
%                             end
%                             Off = index-gpico+PicoMapeado;
%                             VetorOn = [VetorOn On];
%                             VetorOff = [VetorOff Off];
%                             
%                         end
%                     
%                         %% Fim de detecção Onset -- Offset %%%
%                     
%                     end
%                 
%                 
%                 
%                 %% Fim do Novo Teste %%
                
                
                
%                 PicoMapeado = Mapeia_Pico(PontoFiducial,sinal_ref);
%                 PontoFiducial = PicoMapeado;
%                 vetorPFid(end) = PontoFiducial;
            end
        end
    else vetorPFid_Sfilt = [vetorPFid_Sfilt PontoFiducial];
        
        %% TESTAR MODELAGEM DO BATIMENTO %%
        
          PicoMapeado = Mapeia_Pico(PontoFiducial,sinal_ref);
%           if length(kernelx) == 0
                 [New_R,On,Off,Best_SD1_QRS,Best_SD2_QRS,Perc_Corte1,Perc_Corte2,Erro_Matching,pmedio] = Busca_Melhor_Rayleigh1_Plot(PicoMapeado,sinal_ref,Fam);
                 
                 Hist_Best_SD1_QRS = [Hist_Best_SD1_QRS Best_SD1_QRS];
                 Hist_Best_SD2_QRS = [Hist_Best_SD2_QRS Best_SD2_QRS];
                 Hist_Perc_Corte1 = [Hist_Perc_Corte1 Perc_Corte1]; 
                 Hist_Perc_Corte2 = [Hist_Perc_Corte2 Perc_Corte2];
                 Hist_Erro_Matching = [Hist_Erro_Matching Erro_Matching];
                 
                 PontoFiducial = PicoMapeado;
                 vetorPFid = [vetorPFid PontoFiducial];
                 %            
%           %%% Armazenando vetores On-Off %%%
%           
                 VetorOn = [VetorOn On];
                 VetorOff = [VetorOff Off];
%            
%                 kernel1 = Mix_Rayleigh_QRS_modif(Best_SD1_QRS,Best_SD1_QRS,Fam,Perc_Corte1);
%                 kernel2 = Mix_Rayleigh_QRS_modif(Best_SD2_QRS,Best_SD2_QRS,Fam,Perc_Corte2);
%                 kernelx = [kernel1(1:pmedio) kernel2(pmedio+1:end)];
%                 vetor_eg = [vetor_eg Erro_Matching];
%                 vetorPFid = [vetorPFid PontoFiducial];
%            
%            
%           else 
%               
%                 offset0 = round(0.007*Fam);
%                 PicoMapeado = Mapeia_Pico(PontoFiducial,sinal_ref);
%                 Win = sinal_ref(1,max(PicoMapeado-offset0,1):PicoMapeado+offset0);
%                 if PicoMapeado-offset0 > 0
%                     Pico = offset0+1;
%                 else
%                     Pico = PicoMapeado;
%                 end
%                 if Win(Pico) > 0
%                     tipoQRS = 1;  %% Polaridade Positiva
%                 else
%                     tipoQRS = 2;  %% Polaridade Negativa
%                 end
%                 pck1 = Pico;
%                 ljan1 = offset0;
%                 ljan2 = offset0;
%                 newbegin = max(round(pck1(1)-ljan1),1); newend=min(round(pck1(1)+ljan2),length(Win));signal2=Win(newbegin:newend);pck2=pck1-newbegin+1;
%                 [gmod1,eg] = normalizag_QRS_rms(kernelx,signal2,pck2(1),tipoQRS,ljan1,ljan2);
%                  if eg < mean(vetor_eg)*1.5
%                     PontoFiducial = PicoMapeado;
%                     vetorPFid = [vetorPFid PontoFiducial];
%                     vetor_eg = [vetor_eg eg];
%                     
%                     gpico = find(gmod1 == min(gmod1));
%                     
%                     
%                     index = gpico;
%                     dgmod1 = gmod1(2:end)-gmod1(1:end-1);
%             
%                     if Perc_Corte1 > 0
%             
%                         calc1 = find(dgmod1(1:gpico) ==0);
%                         if length(calc1) > 0
%                             index = calc1(end);
%                         else index = 1;
%                         end
%                         On = index-gpico+PicoMapeado;
%             
%                     else 
%             
%                         ds2 = dgmod1(2:end)-dgmod1(1:end-1);
%                         ds21 = ds2(2:end);
%                         ds22 = ds2(1:end-1);
%                         pds2 = ds21.*ds22;
%                         zcr = find(pds2 < 0);
%                         setP = zcr+1;
%                         if length(setP) == 0
%                             index = 1;
%                         else
%                             fzcr = setP(1)+1;
%                             fpcr = dgmod1(fzcr);
%                             index = fzcr;
%                             while index > 1
%                                 if abs(dgmod1(index)) < 0.1*abs(fpcr)
%                                     break;
%                                 end
%                                 index = index-1;
%                             end
%                         end
%                         On = index-gpico+PicoMapeado;
%             
%                     end
%                     index1 = index-gpico+pico;
%         
%                     if Perc_Corte2 > 0
%             
%                         calc1 = find(dgmod1(gpico:end) ==0);
%                         if length(calc1) == 0
%                             calc1 = length(dgmod1(gpico:end));
%                         end
%                         index = calc1(1)+gpico-1;
%                         Off = index-gpico+PicoMapeado;
%             
%                     else 
%             
%                         ds2 = dgmod1(2:end)-dgmod1(1:end-1);
%                         ds21 = ds2(2:end);
%                         ds22 = ds2(1:end-1);
%                         pds2 = ds21.*ds22;
%                         zcr = find(pds2 < 0);
%                         setP = zcr+1;
%                         if length(setP) == 0 | setP < gpico
%                             index = length(dgmod1);
%                         else
%                 
%                             lzcr = setP(end)+1;
%                             lpcr = dgmod1(lzcr);
%                             index = lzcr;
%                             while index < length(dgmod1)
%                                 if abs(dgmod1(index)) < 0.1*abs(lpcr)
%                                     break;
%                                 end
%                                 index = index+1;
%                             end
%                         end
%                         Off = index-gpico+PicoMapeado;
%                         VetorOn = [VetorOn On];
%                         VetorOff = [VetorOff Off];
%             
%             
%             
%                     end
%                     
%                     
%                     
%                     
%                 end
%                 
%                 
%           end
           
%          PontoFiducial = PicoMapeado;
%          vetorPFid = [vetorPFid PontoFiducial];
    end
    
     %keyboard;
     
     i = PosAbaixo+1;
     
     
end


%% COMENTEI ESTA PARTE AQUI PARA TESTAR UMA NOVA ABORDAGEM !!

% for jj = 1:length(vetorPFid_Sfilt)
%     PontoFiducial = vetorPFid_Sfilt(jj);
%     if jj == 1
%         PicoMapeado = Mapeia_Pico(PontoFiducial,sinal_ref);
%         PontoFiducial = PicoMapeado;
%         vetorPFid = [vetorPFid PontoFiducial];
%     else 
%         PicoMapeado = Mapeia_Pico(PontoFiducial,sinal_ref);
%         PontoFiducial = PicoMapeado;
%         if abs(PontoFiducial - vetorPFid(end)) > dmin
%              vetorPFid = [vetorPFid PontoFiducial];
%         end
%     end
% end

Desvio_ampl_pfid = std(sinal(vetorPFid_Sfilt));



if (length(vetorPFid) >= Nbatmin & length(vetorPFid) < Nbatmax) %&  abs(vetorPFid(1)-1) <= 2*Fam  & abs(vetorPFid(end)-length(sinal)) <= 2*Fam 
%if length(vetorPFid) < Nbatmax
    vbolParou = 1;
else %fplim = fplim*1.2;
    if length(vetorPFid) < Nbatmin & fplim >= 0.5*fplimI %| abs(vetorPFid(1)-1) > 2*Fam | abs(vetorPFid(end)-length(sinal)) > 2*Fam
        fplim = fplim*0.8;
    else fplim = fplim*1.2;
    end
    Niter = Niter +1;
end
end        


%  if ider == 0
%     fplim
% %    keyboard;
% % end
% 

Teste_On_Null = find(VetorOn == 0);
Teste_Off_Null = find(VetorOff == 0);

if length(Teste_On_Null) > 0 | length(Teste_Off_Null) > 0
    keyboard;
end

limiarAmp = fplim*max(sinal(pinic:pfin));
%   figure;
%   subplot(2,1,1);
%   plot((1:length(sinal))/Fam,sinal);
%   hold on;
%   plot((1:length(sinal))/Fam,limiarAmp*ones(1,length(sinal)),'k');
%   hold on;
%   plot(vetorPFid_Sfilt/Fam,sinal(vetorPFid_Sfilt),'ro');
%   xlabel('tempo (s)');
%   ylabel('Unidades arbitrárias');
%   
%   subplot(2,1,2);
%   plot((1:length(sinal_ref))/Fam,sinal_ref);
%   hold on;
%   plot(vetorPFid/Fam,sinal_ref(vetorPFid),'ro');
%   plot(VetorOn/Fam,sinal_ref(VetorOn),'ok');
%   plot(VetorOff/Fam,sinal_ref(VetorOff),'ok');
%   xlabel('tempo (s)');
%   ylabel('Unidades arbitrárias');
%   
%   figure;
%   plot(vetor_eg);
%   pause(3);
%   close all;
  
  



% figure;
% plot((1:length(sinal_ref))/Fam,sinal_ref);
%   hold on;
%   plot(vetorPFid/Fam,sinal_ref(vetorPFid),'ro');
%   plot(VetorOn/Fam,sinal_ref(VetorOn),'ok');
%   plot(VetorOff/Fam,sinal_ref(VetorOff),'ok');
%   plot(Ppv/Fam,sinal_ref(Ppv),'ro');
%   plot(Piniv/Fam,sinal_ref(Piniv),'ok');
%   plot(Pendv/Fam,sinal_ref(Pendv),'ok');
%   xlabel('tempo (s)');
%   ylabel('Unidades arbitrárias');
% 
% pause(2);
% close all; 
%  end

 
 
            