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