clear all;
programmversion=('TappingMagnet_light | version: 1.00');
%========== E I N G A B E T E I L ================
% Hier bitte den Pfad eintragen, 
% in dem standardmaessig zuerst nach Dateien gesucht werden soll;
preferredFolder=("C:/");
%===============================================================================
%                  Inhalt:                                                 Zeile
%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% 1. Optionen...............................................................  
% 2. Ordnerverzeichnisse erstellen..........................................  
% 3. Dateien laden..........................................................  
% 4. Maxima suchen.............................................................
% 5. Ausgabe der Ergebnisse................................................. 579
%-------------------------------------------------------------------------------
%=============== O P T I O N E N ================
FENSTER_VOR_MS=100;  % Suchabstand nach vorn   in Millisekunden (standard = 100)
FENSTER_NACH_MS=80;  % Suchabstand nach hinten in Millisekunden (standard =  80)
NIMMABLEITUNG=true;  % true: waehlt das hoechste lokale Maxima aus der 1. Ablei-
                     % tung der Onset-Detection Function (empfohlen). 
                     % false: nimmt das hoechste lokale Maxima der Onset-
                     % Detection Function
%-------------------------------------------------
%-------------------------------------------------
%-------------------------------------------------
%=========== P R O G R A M M T E I L =============
%-------------------------------------------------
%-------------------------------------------------
%       Terminal-Ausgabe des Programmnamens
disp(programmversion); 
disp(von Tilo Haehnel);
disp('-----------------------------'); 
graphics_toolkit='qt';                             % Oberfläche fuer Dialoge
%=================================================
%         2. Datei laden
%--------------------------------------------------
disp('Datei laden........................');
response=helpdlg({'Bitte Onset-Datei waehlen'});
do 
  % Oeffnen-Dialog: Auswahl Dateiname und Pfad
  [dateiname, pfad, dateiindex]=uigetfile(preferredFolder,'oeffnen')
  % Dateiname ohne Endung (fuer spaetere Ausgaben):
  dateinamekurz=substr(dateiname,1,(rindex(dateiname,'.')-1)); 
  % vollstaendiger Dateipfad:
  datei=strcat(pfad,dateiname); 
  if exist(datei,'file')==2     % wenn Datei existiert,
    try                         % versuche,
      % (unbeweglicher) Fortschrittsbalken mit Feedback
      disp('Datei laden');
      X=dlmread (datei, "\t");
    catch                       % wenn Einlesen nicht geht, Fehlermeldung:
      response=questdlg({'Datei entspricht nicht den inhaltlichen Anforderungen'},
          'Fehler',
          'neue Datei waehlen',
          'Abbrechen',
          'neue Datei waehlen');
      if strcmp(response, 'Abbrechen')
        msgbox('Abgebrochen');
      endif;
    end_try_catch
  else                          % Datei existiert nicht; dann Hinweismeldung:
   response=questdlg('Datei konnte nicht gefunden werden'
       , 'Fehler', 'neue Datei waehlen','Abbrechen','neue Datei waehlen');
   if strcmp(response, 'Abbrechen')
      exit;     
   endif
  endif
  if exist('X','var')==1        % Wenn eingelesene Daten in Variable vorliegen
    weiter=logical(true);       % verlasse die Schleife
  else                          % Wenn eingelesene Daten nicht vorliegen
    weiter=logical(false);      % wiederhole die Dateiauswahl ab "do"
  endif
until weiter==true
response=helpdlg({'Bitte Beat-Detection Function waehlen.'});
do 
  % Oeffnen-Dialog: Auswahl Dateiname und Pfad
  [dateiname2, pfad2, dateiindex2]=uigetfile(pfad,'oeffnen')
  % Dateiname ohne Endung (fuer spaetere Ausgaben):
  dateinamekurz2=substr(dateiname2,1,(rindex(dateiname2,'.')-1)); 
  % vollstaendiger Dateipfad:
  datei2=strcat(pfad2,dateiname2); 
  if exist(datei2,'file')==2     % wenn Datei existiert,
    try                         % versuche,
      % (unbeweglicher) Fortschrittsbalken mit Feedback
      disp('Datei laden');
      Y=dlmread (datei2, "\t");
    catch                       % wenn Einlesen nicht geht, Fehlermeldung:
      response=questdlg({'Datei entspricht nicht den inhaltlichen Anforderungen'},
          'Fehler',
          'neue Datei waehlen',
          'Abbrechen',
          'neue Datei waehlen');
      if strcmp(response, 'Abbrechen')
        msgbox('Abgebrochen');
      endif;
    end_try_catch
  else                          % Datei existiert nicht; dann Hinweismeldung:
   response=questdlg('Datei konnte nicht gefunden werden'
       , 'Fehler', 'neue Datei waehlen','Abbrechen','neue Datei waehlen');
   if strcmp(response, 'Abbrechen')
      exit;     
   endif
  endif
  if exist('Y','var')==1        % Wenn eingelesene Daten in Variable vorliegen
    weiter=logical(true);       % verlasse die Schleife
  else                          % Wenn eingelesene Daten nicht vorliegen
    weiter=logical(false);      % wiederhole die Dateiauswahl ab "do"
  endif
until weiter==true
%--------------------------------------------------
%         3. Berechnen
%--------------------------------------------------
onsets=X(:,1);
n_onsets=length(onsets); % Anzahl aller Onsets
disp('gefundene Onsets');
disp(n_onsets);

if NIMMABLEITUNG==true
  yt=Y(1:length(Y)-1,1); % Zeit der Onset-Detection-Function
  yy=diff(Y(:,2));       % Ableitung des Werts der Onset-Detection-Function
else
  yt=Y(:,1);
  yy=Y(:,2);
endif
% 
onsets_neu=zeros(n_onsets,1); % neue Liste fuer neue Onsets
%-------------------- MAXIMA SUCHEN --------------------------
fenster1=FENSTER_VOR_MS/1000; % Fensterstart in Sekunden wenn KEIN Autofenster
fenster2=FENSTER_NACH_MS/1000;% Fensterstart in Sekunden wenn KEIN Autofenster

%------- erster Onset ----------
onset=onsets(1);
t_start= onset-fenster1;                                          % Anfang 
t_end  = min( [ onset+fenster2 , onset+(onsets(2)-onset)/3 ] );   % Ende 
fenster=[find(yt>=t_start)(1):max(find(yt<t_end))];               % Analysefenster
onsets_neu(1)=yt(fenster)(  find( yy(fenster)==max(yy(fenster)) )  ); % Zeit bei y-Maximalwert 
%------- zweiter bis vorletzter Onset ---------- 
for i=2:n_onsets-1
  onset=onsets(i);
  t_start= max( [ onset-fenster1 , onset-(onset-onsets(i-1))/3 ] ); % Anfang 
  t_end  = min( [ onset+fenster2 , onset+(onsets(i+1)-onset)/3 ] ); % Ende 
  fenster=[find(yt>=t_start)(1):max(find(yt<t_end))];               % Analysefenster
  onsets_neu(i)=yt(fenster)(  find( yy(fenster)==max(yy(fenster)) )  ); % Zeit bei y-Maximalwert 
endfor
%------- letzter Onset ----------
onset=onsets(n_onsets);
t_start= max( [ onset-fenster1 , onset-(onset-onsets(n_onsets-1))/3 ] ); % Anfang 
t_end  = onset+fenster2;                                          % Ende
fenster=[find(yt>=t_start)(1):max(find(yt<t_end))];               % Analysefenster
onsets_neu(n_onsets)=yt(fenster)(  find( yy(fenster)==max(yy(fenster)) )  ); % Zeit bei y-Maximalwert 

%-------------------------------------------------------------------------------
% 4. Ausgabe der Ergebnisse................................................. 579
%-------------------------------------------------------------------------------
dlmwrite (strcat(pfad,dateinamekurz,"_magnetisiert.txt"), [onsets_neu,X(:,2)], "delimiter", "\t")

msgbox('fertig.');
%=================================================
%     Terminal-Ausgabe zum Ende des Programms
disp('-----------------------------'); 
disp(' Zum Beenden "exit" eingeben');
disp('-----------------------------'); 
