diff --git a/lib/+artoa/+controller/+edit/+timeOfArrival/applySoundSourceToAllVisible.m b/lib/+artoa/+controller/+edit/+timeOfArrival/applySoundSourceToAllVisible.m index a8986baa2fd319c283f978bd5e36072e50f532f1..3df3e6dde559cae25ffc9ea8742a472dc9443e99 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 6366cc713f57d54eac18594fb55000e389d88f4a..1d1bbc960a25300962fee4c322a711afe7b21170 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 e1ee78f32d94684b6b3f5bd5274cebff570b2ec8..161a50adeb616c93e94447c5f5b9e554272f83e6 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 a8b97a9583e42f241c3e349531079adc84cde976..90741b8a403d663f7c5b637094319aefe552edd9 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 aeac618c5587173e52c29c067f0ebdbe5bb70f06..24db0493bf198a976aca853a890b369df4a3487e 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 a156082c0db0496d1314380f472b7b6afaf4a986..cffd326545b997b87089bea94c77fe410ad31ea1 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 411610a55074633050ab135c43daaadce54476f4..be718ea1d005dab3bdb7dbc6ec762e0cdc5f0fbb 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 0000000000000000000000000000000000000000..b0d44c289aa29f24c5467925f8bfca81662d0095 --- /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 0000000000000000000000000000000000000000..5e5613933d4462d898eee8aae1e6b5f6333fe80e --- /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 fa5d7342080e01b71717824d38170e2add574614..3717b57da361ee94866d3b0d59301260054debe4 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 0620fe9b1ba100cf11ba6726ff7d271853198b71..0090fcebd2ee79180e4a83e63a7c82d94ab51134 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 0000000000000000000000000000000000000000..266df5fe36418decafab26e0b33a6c23f84ee005 --- /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 1bdffd18c0447fc5220f1b767b4205c9b92cfad8..b74bd3b9949fc0a84b825d6d35550bcb0e36d2c5 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 364f27f9cc6df043851e093e3488db45d85101da..27f2da2d8b3687eec9a0308889a56bf0d5de2670 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, ...