diff --git a/VERSION b/VERSION index bea0d09c49935aac714f5439285e2706b15e1dd9..274ccca8ac98c5054b0d25975485dfad65ac8673 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -207 \ No newline at end of file +209 \ No newline at end of file diff --git a/lib/+artoa/+controller/+main/open.m b/lib/+artoa/+controller/+main/open.m index 967fb560dc4c73e6ced8ff14ec7be0afd48232b3..c220fcf25c2d6447f180c2e270feab9dbd746c07 100644 --- a/lib/+artoa/+controller/+main/open.m +++ b/lib/+artoa/+controller/+main/open.m @@ -34,6 +34,7 @@ callbacks.convertProfilesToRfb = @artoa.controller.file.profile2rfb.open; %% Prepare callbacks for track parameter callbacks.checkboxDopplerCorrection = @artoa.controller.track.parameter.checkboxDopplerCorrection; +callbacks.checkboxBackwardTracking = @artoa.controller.track.parameter.checkboxBackwardTracking; callbacks.comboboxInterpolationMethod = @artoa.controller.track.parameter.comboboxInterpolationMethod; callbacks.comboboxSoundspeedMethod = @artoa.controller.track.parameter.comboboxSoundspeedMethod; callbacks.checkboxPlotResiduals = @artoa.controller.track.parameter.checkboxPlotResiduals; diff --git a/lib/+artoa/+controller/+track/+parameter/checkboxBackwardTracking.m b/lib/+artoa/+controller/+track/+parameter/checkboxBackwardTracking.m new file mode 100644 index 0000000000000000000000000000000000000000..1e9aeb6ec6f4c8d879ca6a89c74bfef8384f7716 --- /dev/null +++ b/lib/+artoa/+controller/+track/+parameter/checkboxBackwardTracking.m @@ -0,0 +1,22 @@ +function [newValue] = checkboxBackwardTracking(~, ~) +%CHECKBOXDOPPLERCORRECTION Summary of this function goes here +% Detailed explanation goes here + +global artoaGui artoaWorkspace; + +newValue = logical(artoaGui.trackParameter.checkboxBackwardTracking.Value); + +artoaWorkspace.trackParameter.enableBackwardTracking = newValue; + +%% Flip current soundsource combination table + +artoaWorkspace.trackParameter.soundsourceCombinations = ... + flipud(artoaWorkspace.trackParameter.soundsourceCombinations); +begin = artoaWorkspace.trackParameter.soundsourceCombinations.combinationBegin; +artoaWorkspace.trackParameter.soundsourceCombinations.combinationBegin = ... + artoaWorkspace.trackParameter.soundsourceCombinations.combinationEnd; +artoaWorkspace.trackParameter.soundsourceCombinations.combinationEnd = begin; + +artoa.controller.track.parameter.updateGui(); + +end \ No newline at end of file diff --git a/lib/+artoa/+controller/+track/+parameter/getDefaultCombinationCell.m b/lib/+artoa/+controller/+track/+parameter/getDefaultCombinationCell.m index 697b6e904d0c357de2bed73031b01d288af54711..4a21536603cd60824a4da25fdc02c0b029a2007e 100644 --- a/lib/+artoa/+controller/+track/+parameter/getDefaultCombinationCell.m +++ b/lib/+artoa/+controller/+track/+parameter/getDefaultCombinationCell.m @@ -11,13 +11,26 @@ referencePosition = ''; isNotNan = ~isnan(artoaWorkspace.satData.lat_sat) & ~isnan(artoaWorkspace.satData.lon_sat); knownPositions = [artoaWorkspace.satData.lat_sat(isNotNan), artoaWorkspace.satData.lon_sat(isNotNan)]; if ~(size(knownPositions, 1) == 0) + if artoaWorkspace.trackParameter.enableBackwardTracking + referencePosition = [num2str(knownPositions(end, 1)) ' ' num2str(knownPositions(end, 2))]; + else referencePosition = [num2str(knownPositions(1, 1)) ' ' num2str(knownPositions(1, 2))]; + end +end + +%% Set start and end date +if ~artoaWorkspace.trackParameter.enableBackwardTracking + startDate = floor(min(artoaWorkspace.toaData.toaDate(artoaWorkspace.toaData.status ~= 2))); + endDate = floor(max(artoaWorkspace.toaData.toaDate(artoaWorkspace.toaData.status ~= 2))); +else + startDate = floor(max(artoaWorkspace.toaData.toaDate(artoaWorkspace.toaData.status ~= 2))); + endDate = floor(min(artoaWorkspace.toaData.toaDate(artoaWorkspace.toaData.status ~= 2))); end %% Create default cell emptyCell = { ... - floor(min(artoaWorkspace.toaData.toaDate(artoaWorkspace.toaData.status ~= 2))), ... - floor(max(artoaWorkspace.toaData.toaDate(artoaWorkspace.toaData.status ~= 2))), ... + startDate, ... + endDate, ... '', ... referencePosition, ... 1464, ... diff --git a/lib/+artoa/+controller/+track/+parameter/initialize.m b/lib/+artoa/+controller/+track/+parameter/initialize.m index 095848fa602ca40a44d4c04449e14e2e0b6f3749..45291b11d280bf0187ff545d1da33204cf010f48 100644 --- a/lib/+artoa/+controller/+track/+parameter/initialize.m +++ b/lib/+artoa/+controller/+track/+parameter/initialize.m @@ -14,6 +14,7 @@ callbacks = artoaGui.callbacks.main; %% Create workspace variables if pForceOverwrite || ~isfield(artoaWorkspace, 'trackParameter') artoaWorkspace.trackParameter = struct(); + artoaWorkspace.trackParameter.enableBackwardTracking = false; % setup sound source combinations artoaWorkspace.trackParameter.soundsourceCombinations = ... diff --git a/lib/+artoa/+controller/+track/+parameter/updateGui.m b/lib/+artoa/+controller/+track/+parameter/updateGui.m index ed3c64ee2617b880eb39b1d9dcfd59fe338a53b8..71737b2f7f578b7945c35c960b9e8685bd1523cb 100644 --- a/lib/+artoa/+controller/+track/+parameter/updateGui.m +++ b/lib/+artoa/+controller/+track/+parameter/updateGui.m @@ -16,6 +16,8 @@ for i = 1:length(fieldNames) switch fieldNames{i} case 'dopplerCorrection' artoaGui.trackParameter.checkboxDopplerCorrection.Value = currentValue; + case 'enableBackwardTracking' + artoaGui.trackParameter.checkboxBackwardTracking.Value = currentValue; case 'plotResiduals' artoaGui.trackParameter.checkboxPlotResiduals.Value = currentValue; case 'trackingMethodValue' diff --git a/lib/+artoa/+gui/main.m b/lib/+artoa/+gui/main.m index 377d66a148a152225abca03b6db820dd0341c2f1..21f3983cf73ff3611c88931192f4d5db066a4e92 100644 --- a/lib/+artoa/+gui/main.m +++ b/lib/+artoa/+gui/main.m @@ -25,6 +25,7 @@ availableCallbacks = { ... 'openTrackTrajectoryOutput', ... 'switchHideDeletedDataPoints', ... 'checkboxDopplerCorrection', ... % FIRST ITEM TRACK PARAMETER CALLBACKS + 'checkboxBackwardTracking', ... 'comboboxInterpolationMethod', ... 'comboboxSoundspeedMethod', ... 'checkboxPlotResiduals', ... @@ -279,6 +280,17 @@ artoaGui.trackParameter.checkboxDopplerCorrection = uicontrol( ... 'CallBack', pCallbacks.checkboxDopplerCorrection ... ); +artoaGui.trackParameter.checkboxBackwardTracking = uicontrol( ... + 'Parent', artoaGui.trackParameter.frameOptions, ... + 'String', 'Enable backward tracking', ... + 'Style', 'checkbox', ... + 'FontSize', 8, ... + 'Units', 'normalized', ... + 'Position', [left .1 .9 .3], ... + 'Value', 0, ... + 'CallBack', pCallbacks.checkboxBackwardTracking ... +); + % Interpolation method frame artoaGui.trackParameter.frameInterpolationMethod = uipanel( ... 'Parent', artoaGui.trackParameter.frameTrackingParameter, ... diff --git a/lib/+artoa/+trajectory/calculate.m b/lib/+artoa/+trajectory/calculate.m index 093349c4b045f81b3b7c4f34308f06a770908d42..52caa5bd037513c752b57237bbdf5292289d8f5c 100644 --- a/lib/+artoa/+trajectory/calculate.m +++ b/lib/+artoa/+trajectory/calculate.m @@ -227,11 +227,18 @@ for oCombination = 1:size(soundsourceCombinations, 1) elseif isempty(currentCombination.referencePosition{1}) currentCombination.referencePosition{1} = num2str(trajectory(end, :)); end - [segmentPositions, segmentDates, segmentClockError, segmentResiduals] = artoa.trajectory.calculateCombinationSegment( ... + + [ ... + segmentPositions, ... + segmentDates, ... + segmentClockError, ... + segmentResiduals ... + ] = artoa.trajectory.calculateCombinationSegment( ... preparedData, ... currentCombination, ...%trajectory(end, :), ... floatReferenceTime, ... - pSoundVelocity(oCombination, :) ... + pSoundVelocity(oCombination, :), ... + pTrackingParameter.enableBackwardTracking ... ); % remove NaNs from segment diff --git a/lib/+artoa/+trajectory/calculateCombinationSegment.m b/lib/+artoa/+trajectory/calculateCombinationSegment.m index 3634792d0f2bdbb76fdf4fbb3176a17b34422547..46c46b8ba0790e52d07701c5ce39422a9c48b02b 100644 --- a/lib/+artoa/+trajectory/calculateCombinationSegment.m +++ b/lib/+artoa/+trajectory/calculateCombinationSegment.m @@ -1,4 +1,16 @@ -function [segmentPositions, segmentDates, segmentClockError, segmentResiduals] = calculateCombinationSegment(pCorrectedData, pCombinationDetails, pFloatReferenceTime, pSoundVelocity) +function [ ... + segmentPositions, ... + segmentDates, ... + segmentClockError, ... + segmentResiduals ... + ] = ... + calculateCombinationSegment( ... + pCorrectedData, ... + pCombinationDetails, ... + pFloatReferenceTime, ... + pSoundVelocity, ... + pBackwardTracking ... + ) %CALCULATECOMBINATIONSEGMENT Combination segment calculation. % Using the input data, the function calculates the segment positions, % its corresponding dates as well as the clock error (in case of hyperbolic calculation) @@ -20,6 +32,8 @@ function [segmentPositions, segmentDates, segmentClockError, segmentResiduals] = % used. % For all other methods, only one value needs to be set. % Unit: [m/s] +% pBackwardTracking (bool): +% If true, the data will be prepared for backward tracking % % Returns: % segmentPositions (double): @@ -54,11 +68,18 @@ for i = 2:length(soundsourceNames) end %% Remove all dates that are out of bounds +if pBackwardTracking + tmp = segmentStart; + segmentStart = segmentEnd; + segmentEnd = tmp; +end + intersectedToaDates = intersectedToaDates( ... intersectedToaDates >= segmentStart ... & intersectedToaDates <= segmentEnd ... ); + %% Create a table for every soundsource (required by tracking plugin system) pluginTables = struct(); for i = 1:length(soundsourceNames) @@ -110,7 +131,15 @@ for oDates = 1:lenIntersectedToaDates end warning('on'); -% Call the corresponding tracking method from the plugin folder +%% Backward tracking +% if enabled, everything needs to be upside down for the calculation +if pBackwardTracking + for i = 1:length(soundsourceNames) + pluginTables.(soundsourceNames{i}) = flipud(pluginTables.(soundsourceNames{i})); + end +end + +%% Call the corresponding tracking method from the plugin folder [segmentPositions, segmentClockError] = artoa.plugins.tracking.callTrackingMethod( ... trackingMethod, ... pluginTables, ... @@ -118,6 +147,13 @@ warning('on'); pCombinationDetails ... ); +%% Restore backward tracking changes +% if enabled, the calculated positions need to be flipped upside down to be +% able to display them correctly +if pBackwardTracking + segmentPositions = flipud(segmentPositions); + segmentClockError = flipud(segmentClockError); +end %% Store toa dates segmentDates = intersectedToaDates; diff --git a/lib/+artoa/+versioning/+migrations/versions/v4208.m b/lib/+artoa/+versioning/+migrations/versions/v4208.m new file mode 100644 index 0000000000000000000000000000000000000000..f891d8f9ae4e14442d718626e456bd0ebbe3ecb7 --- /dev/null +++ b/lib/+artoa/+versioning/+migrations/versions/v4208.m @@ -0,0 +1,4 @@ +%% Backward tracking features +if ~artoa.data.hasMember(artoaWorkspace, 'trackParameter', 'enableBackwardTracking') + artoaWorkspace.trackParameter.enableBackwardTracking = false; +end