From 179a9e7b81a7525a72896d3a3fcbc06b324b55a2 Mon Sep 17 00:00:00 2001
From: Lewin Probst <info@emirror.de>
Date: Wed, 25 Sep 2019 18:05:34 +0200
Subject: [PATCH] Bugfix, Added duplicate toa table.

Bugfix:
  When soundsource has been applied, the zoom function was not functioning
  anymore.

Toa table:
  It is now possible to select the duplicates in the toa table, and the
  the plot will zoom to it.
---
 .../applySoundSourceToAllVisible.m            |  3 ++
 .../applySoundSourceToSelectedPoints.m        |  3 ++
 .../applyStatusToSelectedPoints.m             |  4 ++
 .../createSoundsourceColorsPanel.m            |  2 +-
 .../+controller/+edit/+timeOfArrival/open.m   |  3 ++
 .../+controller/+edit/+timeOfArrival/plot.m   |  8 +++-
 .../removeSoundSourceFromSelectedPoints.m     |  3 ++
 .../tableDuplicateToaSelection.m              | 20 ++++++++++
 .../+timeOfArrival/updateDuplicateToaTable.m  | 33 +++++++++++++++++
 .../withdrawSoundSourceToAllVisible.m         |  3 ++
 .../+controller/+track/+parameter/close.m     | 17 +++++++--
 lib/+artoa/+data/getDuplicateAppliedDates.m   | 37 +++++++++++++++++++
 lib/+artoa/+gui/+edit/timeOfArrival.m         | 25 +++++++++++++
 lib/+artoa/+gui/+track/parameter.m            |  2 +-
 14 files changed, 156 insertions(+), 7 deletions(-)
 create mode 100644 lib/+artoa/+controller/+edit/+timeOfArrival/tableDuplicateToaSelection.m
 create mode 100644 lib/+artoa/+controller/+edit/+timeOfArrival/updateDuplicateToaTable.m
 create mode 100644 lib/+artoa/+data/getDuplicateAppliedDates.m

diff --git a/lib/+artoa/+controller/+edit/+timeOfArrival/applySoundSourceToAllVisible.m b/lib/+artoa/+controller/+edit/+timeOfArrival/applySoundSourceToAllVisible.m
index a8986ba..3df3e6d 100644
--- a/lib/+artoa/+controller/+edit/+timeOfArrival/applySoundSourceToAllVisible.m
+++ b/lib/+artoa/+controller/+edit/+timeOfArrival/applySoundSourceToAllVisible.m
@@ -46,6 +46,9 @@ artoaWorkspace.toaData.soundSource( ...
 % apply status to selection
 artoaWorkspace.toaData.status(selection) = 1;
 
+%% Update duplicate toa table
+artoa.controller.edit.timeOfArrival.updateDuplicateToaTable();
+
 %% Update plots
 artoa.controller.edit.updateAvailablePlots();
 
diff --git a/lib/+artoa/+controller/+edit/+timeOfArrival/applySoundSourceToSelectedPoints.m b/lib/+artoa/+controller/+edit/+timeOfArrival/applySoundSourceToSelectedPoints.m
index 6366cc7..1d1bbc9 100644
--- a/lib/+artoa/+controller/+edit/+timeOfArrival/applySoundSourceToSelectedPoints.m
+++ b/lib/+artoa/+controller/+edit/+timeOfArrival/applySoundSourceToSelectedPoints.m
@@ -41,6 +41,9 @@ artoaWorkspace.toaData.soundSource( ...
 % Update status to selected
 artoa.controller.edit.timeOfArrival.applyStatusToSelectedPoints(1);
 
+%% Update duplicate toa table
+artoa.controller.edit.timeOfArrival.updateDuplicateToaTable();
+
 %% Update plots
 artoa.controller.edit.updateAvailablePlots();
 %artoa.controller.edit.timeOfArrival.plot();
diff --git a/lib/+artoa/+controller/+edit/+timeOfArrival/applyStatusToSelectedPoints.m b/lib/+artoa/+controller/+edit/+timeOfArrival/applyStatusToSelectedPoints.m
index e1ee78f..161a50a 100644
--- a/lib/+artoa/+controller/+edit/+timeOfArrival/applyStatusToSelectedPoints.m
+++ b/lib/+artoa/+controller/+edit/+timeOfArrival/applyStatusToSelectedPoints.m
@@ -23,6 +23,10 @@ end
 %% Set status
 artoaWorkspace.toaData.status(artoaWorkspace.editTimeOfArrival.userSelection) = pStatusCode;
 
+
+%% Update duplicate toa table
+artoa.controller.edit.timeOfArrival.updateDuplicateToaTable();
+
 %% Update gui
 artoa.controller.edit.updateAvailablePlots();
 
diff --git a/lib/+artoa/+controller/+edit/+timeOfArrival/createSoundsourceColorsPanel.m b/lib/+artoa/+controller/+edit/+timeOfArrival/createSoundsourceColorsPanel.m
index a8b97a9..90741b8 100644
--- a/lib/+artoa/+controller/+edit/+timeOfArrival/createSoundsourceColorsPanel.m
+++ b/lib/+artoa/+controller/+edit/+timeOfArrival/createSoundsourceColorsPanel.m
@@ -12,7 +12,7 @@ artoaGui.editTimeOfArrival.frameControlsSoundSourceColors = uipanel( ...
     'Title', 'Soundsource colors', ...
     'Units', 'normalized', ...
     'BackgroundColor', 'white', ...
-    'Position', [.01 .3 width .6] ...
+    'Position', [.01 .4 width .5] ...
 );
 
 % add label and color for every sound source that is available
diff --git a/lib/+artoa/+controller/+edit/+timeOfArrival/open.m b/lib/+artoa/+controller/+edit/+timeOfArrival/open.m
index aeac618..24db049 100644
--- a/lib/+artoa/+controller/+edit/+timeOfArrival/open.m
+++ b/lib/+artoa/+controller/+edit/+timeOfArrival/open.m
@@ -17,6 +17,9 @@ artoa.gui.edit.timeOfArrival();
 %% Create workspace variables
 artoaWorkspace.editTimeOfArrival = struct();
 
+%% Update duplicate toa table
+artoa.controller.edit.timeOfArrival.updateDuplicateToaTable();
+
 
 end
 
diff --git a/lib/+artoa/+controller/+edit/+timeOfArrival/plot.m b/lib/+artoa/+controller/+edit/+timeOfArrival/plot.m
index a156082..cffd326 100644
--- a/lib/+artoa/+controller/+edit/+timeOfArrival/plot.m
+++ b/lib/+artoa/+controller/+edit/+timeOfArrival/plot.m
@@ -34,9 +34,15 @@ if isfield(artoaGui.editTimeOfArrival, 'scatterTimeOfArrival') ...
     artoaGui.editTimeOfArrival.scatterTimeOfArrival.CData = c;
     % update applied sound sources
     artoa.controller.edit.timeOfArrival.plotAppliedSoundsources();
-    artoa.controller.edit.timeOfArrival.plotSoundsourceToaFromGps(artoaWorkspace.filteredSoundsources);
     artoa.controller.edit.timeOfArrival.applyToaAxesToGpsAndSoundsources();
     artoa.controller.edit.timeOfArrival.createSoundsourceColorsPanel();
+    linkaxes([ ...
+        artoaGui.editTimeOfArrival.axesScatterTimeOfArrival, ...
+        artoaGui.editTimeOfArrival.axesToaFromGps, ...
+        artoaGui.editTimeOfArrival.axesAppliedSoundsources ...
+    ]);
+    % force toa scatter to be current axes of figure
+    artoaGui.figures.editTimeOfArrival.CurrentAxes = artoaGui.editTimeOfArrival.axesScatterTimeOfArrival;
     return
 end
 
diff --git a/lib/+artoa/+controller/+edit/+timeOfArrival/removeSoundSourceFromSelectedPoints.m b/lib/+artoa/+controller/+edit/+timeOfArrival/removeSoundSourceFromSelectedPoints.m
index 411610a..be718ea 100644
--- a/lib/+artoa/+controller/+edit/+timeOfArrival/removeSoundSourceFromSelectedPoints.m
+++ b/lib/+artoa/+controller/+edit/+timeOfArrival/removeSoundSourceFromSelectedPoints.m
@@ -27,6 +27,9 @@ artoaWorkspace.toaData.soundSource( ...
 % Update status to selected
 artoa.controller.edit.timeOfArrival.applyStatusToSelectedPoints(0);
 
+%% Update duplicate toa table
+artoa.controller.edit.timeOfArrival.updateDuplicateToaTable();
+
 %% Update plot
 artoa.controller.edit.updateAvailablePlots();
 %artoa.controller.edit.timeOfArrival.plot();
diff --git a/lib/+artoa/+controller/+edit/+timeOfArrival/tableDuplicateToaSelection.m b/lib/+artoa/+controller/+edit/+timeOfArrival/tableDuplicateToaSelection.m
new file mode 100644
index 0000000..b0d44c2
--- /dev/null
+++ b/lib/+artoa/+controller/+edit/+timeOfArrival/tableDuplicateToaSelection.m
@@ -0,0 +1,20 @@
+function [] = tableDuplicateToaSelection(~, event)
+%TABLESOUNDSOURCECOMBINATIONSSELECTION Summary of this function goes here
+%   Detailed explanation goes here
+
+global artoaGui;
+
+%% Get selected date
+date = str2double(artoaGui.editTimeOfArrival.tableDuplicateAppliedToa.Data{event.Indices(1), 2});
+toas = artoaGui.editTimeOfArrival.tableDuplicateAppliedToa.Data{event.Indices(1), 3};
+toas = strsplit(toas, ' ');
+
+
+%% Zoom to the selected points
+
+artoaGui.editTimeOfArrival.axesScatterTimeOfArrival.XLim = [date - 25; date + 25];
+artoaGui.editTimeOfArrival.axesScatterTimeOfArrival.YLim = [str2double(toas{1}) - 25; str2double(toas{end - 1}) + 25];
+
+
+end
+
diff --git a/lib/+artoa/+controller/+edit/+timeOfArrival/updateDuplicateToaTable.m b/lib/+artoa/+controller/+edit/+timeOfArrival/updateDuplicateToaTable.m
new file mode 100644
index 0000000..5e56139
--- /dev/null
+++ b/lib/+artoa/+controller/+edit/+timeOfArrival/updateDuplicateToaTable.m
@@ -0,0 +1,33 @@
+function [] = updateDuplicateToaTable()
+%UPDATEDUPLICATETOATABLE Summary of this function goes here
+%   Detailed explanation goes here
+
+
+global artoaWorkspace artoaGui;
+
+
+%% Get required data
+
+fnames = fieldnames(artoaWorkspace.filteredSoundsources);
+toaData = artoaWorkspace.toaData;
+
+tableData = {};
+
+%% calculate duplicated data
+
+for i = 1:length(fnames)
+    soundsource = artoaWorkspace.filteredSoundsources.(fnames{i});
+    [dates, toas] = artoa.data.getDuplicateAppliedDates(soundsource, toaData);
+    for o = 1:length(dates)
+        tableData{end + 1, 1} = fnames{i};
+        tableData{end, 2} = sprintf('%3.1f', dates{o});
+        tableData{end, 3} = sprintf('%3.1f ', sort(toas{o}));
+    end
+end
+
+%% Update table
+artoaGui.editTimeOfArrival.tableDuplicateAppliedToa.Data = tableData;
+
+
+end
+
diff --git a/lib/+artoa/+controller/+edit/+timeOfArrival/withdrawSoundSourceToAllVisible.m b/lib/+artoa/+controller/+edit/+timeOfArrival/withdrawSoundSourceToAllVisible.m
index fa5d734..3717b57 100644
--- a/lib/+artoa/+controller/+edit/+timeOfArrival/withdrawSoundSourceToAllVisible.m
+++ b/lib/+artoa/+controller/+edit/+timeOfArrival/withdrawSoundSourceToAllVisible.m
@@ -35,6 +35,9 @@ artoaWorkspace.toaData.soundSource(selection) = {''};
 % apply status to selection
 artoaWorkspace.toaData.status(selection) = 0;
 
+%% Update duplicate toa table
+artoa.controller.edit.timeOfArrival.updateDuplicateToaTable();
+
 %% Update plots
 artoa.controller.edit.updateAvailablePlots();
 
diff --git a/lib/+artoa/+controller/+track/+parameter/close.m b/lib/+artoa/+controller/+track/+parameter/close.m
index 0620fe9..0090fce 100644
--- a/lib/+artoa/+controller/+track/+parameter/close.m
+++ b/lib/+artoa/+controller/+track/+parameter/close.m
@@ -6,15 +6,24 @@ global artoaGui;
 
 %% Close the figure
 
-delete(artoaGui.figures.trackParameter);
+try
+    delete(artoaGui.figures.trackParameter);
+catch
+    delete(gcf);
+end
 
 %% Clean up variables
 
-artoaGui = rmfield(artoaGui, 'trackParameter');
-artoaGui.figures = rmfield(artoaGui.figures, 'trackParameter');
+try
+    artoaGui = rmfield(artoaGui, 'trackParameter');
+catch
+end
+try
+    artoaGui.figures = rmfield(artoaGui.figures, 'trackParameter');
+catch
+end
 % Workspace is not cleaned, because we need the values after closing the
 % window
-%artoaWorkspace = rmfield(artoaWorkspace, 'trackParameter');
 
 end
 
diff --git a/lib/+artoa/+data/getDuplicateAppliedDates.m b/lib/+artoa/+data/getDuplicateAppliedDates.m
new file mode 100644
index 0000000..266df5f
--- /dev/null
+++ b/lib/+artoa/+data/getDuplicateAppliedDates.m
@@ -0,0 +1,37 @@
+function [duplicateDates, duplicateToas] = getDuplicateAppliedDates(pSoundsource, pToaData)
+%GETDUPLICATEAPPLIEDDATES Collects all dates that have been applied multiple times to the soundsource.
+%   Returns two cells with indices consistent to each other.
+%
+%   Parameters:
+%       pSoundsource (struct):      The soundsource details.
+%       pToaData (struct):          The TOA data.
+%
+%   Returns:
+%       duplicateDates (cell):      Containing all rafos dates where
+%                                   multiple applications have been found.
+%       duplicateToas (cell):       Contains all toas that are found.
+
+%% Get required data
+
+name = pSoundsource.sourcename;
+selection = strcmp(pToaData.soundSource, name);
+toaDates = pToaData.toaDate(selection);
+toa = pToaData.toa(selection);
+
+%% Collect duplications
+
+[~, ind] = unique(toaDates);
+duplicateIndices = setdiff(1:size(toaDates, 1), ind);
+
+duplicateDates = cell(length(duplicateIndices), 1);
+duplicateToas = cell(length(duplicateIndices), 1);
+
+%% Get all duplicate toas
+for i = 1:length(duplicateIndices)
+    index = duplicateIndices(i);
+    duplicateDates(i) = {toaDates(index)};
+    duplicateToas(i) = {toa(toaDates == duplicateDates{i})};
+end
+
+end
+
diff --git a/lib/+artoa/+gui/+edit/timeOfArrival.m b/lib/+artoa/+gui/+edit/timeOfArrival.m
index 1bdffd1..b74bd3b 100644
--- a/lib/+artoa/+gui/+edit/timeOfArrival.m
+++ b/lib/+artoa/+gui/+edit/timeOfArrival.m
@@ -149,6 +149,31 @@ artoaGui.editTimeOfArrival.buttonWithdrawAllVisible = uicontrol( ...
     'CallBack', 'artoa.controller.edit.timeOfArrival.withdrawSoundSourceToAllVisible();' ...
 );
 
+%% Duplicate applied TOA table
+
+artoaGui.editTimeOfArrival.frameDuplicateAppliedToa = uipanel( ...
+    'Title', 'Duplicates', ...
+    'Units', 'normalized', ...
+    'BackgroundColor', 'white', ...
+    'Position', [.01 .25 width .15] ...
+);
+
+columns = { ...
+    'Soundsource', 'Date', 'TOAs' ...
+};
+artoaGui.editTimeOfArrival.tableDuplicateAppliedToa = uitable( ...
+    artoaGui.editTimeOfArrival.frameDuplicateAppliedToa, ...
+    'Units', 'normalized', ...
+    'Position', [.1, .1, .8, .8], ...
+    'Data', cell(1, length(columns)), ...
+    'ColumnName', columns, ...
+    'ColumnEditable', false, ...
+    'CellSelectionCallback', @artoa.controller.edit.timeOfArrival.tableDuplicateToaSelection,...
+    'CellEditCallback', '', ...
+    'ColumnWidth', {60, 120, 120} ...
+);
+clear columns;
+
 %% Sound source color legend frame
 
 artoa.controller.edit.timeOfArrival.createSoundsourceColorsPanel();
diff --git a/lib/+artoa/+gui/+track/parameter.m b/lib/+artoa/+gui/+track/parameter.m
index 364f27f..27f2da2 100644
--- a/lib/+artoa/+gui/+track/parameter.m
+++ b/lib/+artoa/+gui/+track/parameter.m
@@ -38,7 +38,7 @@ for i = 1:length(availableCallbacks) % check if a callback is undefined
 end
 
 
-%% Initialize pressure gui
+%% Initialize track parameter gui
 
 artoaGui.figures.trackParameter = figure( ...
     'Name', windowTitle, ...
-- 
GitLab