function [] = run(~, ~) %RUN Summary of this function goes here % Detailed explanation goes here global artoaWorkspace artoaDataInput; %% Validate soundsource table input [success, message] = artoa.controller.track.parameter.validateCombinationsInput( ... artoaWorkspace.trackParameter.soundsourceCombinations ... ); if ~success errordlg(message, 'Input error'); return; end %% Prepare variable if required if ~artoa.data.hasMember(artoaWorkspace, {'trajectoryOutput', 'trajectories'}) artoaWorkspace.trajectoryOutput.trajectories = {}; end %% Prepare sound velocity soundVelocity = NaN( ... size(artoaWorkspace.trackParameter.soundsourceCombinations, 1), ... 3 ... ); %% Get sound velocity for i = 1:size(soundVelocity, 1) if strcmpi( ... artoaWorkspace.trackParameter.soundspeedMethodString, ... 'manual' ... ) soundVelocity(i, :) = [ ... artoaWorkspace.trackParameter.soundsourceCombinations.soundspeed1(i), ... artoaWorkspace.trackParameter.soundsourceCombinations.soundspeed2(i), ... artoaWorkspace.trackParameter.soundsourceCombinations.soundspeed3(i) ... ]; elseif strcmpi( ... artoaWorkspace.trackParameter.soundspeedMethodString, ... 'soundsource file' ... ) % get soundsource names soundsourceNames = strsplit(artoaWorkspace.trackParameter.soundsourceCombinations.soundsources{i}); % get soundspeed for every soundsource for oName = 1:length(soundsourceNames) soundVelocity(i, oName) = ... artoaWorkspace.filteredSoundsources.(soundsourceNames{oName}).sound_speed; end else soundVelocity(i, :) = artoa.data.calculateSoundVelocity( ... artoaWorkspace.temperature(artoaWorkspace.statusTemperature == 1), ... artoaWorkspace.pressure(artoaWorkspace.statusPressure == 1), ... artoaWorkspace.trackParameter.soundspeedMethodString ... ); end end %% Calculate and append track pressureAndDate = { ... artoaWorkspace.pressure(artoaWorkspace.statusPressure == 1), ... artoaWorkspace.rafosDate(artoaWorkspace.statusPressure == 1) ... }; [ ... trajectory, ... trajectoryDates, ... trajectoryClockError, ... trajectoryResiduals, ... trajectoryVelocities, ... trajectoryTimeDivergenceToGps ... ] = artoa.float.calculateTrajectory( ... artoaWorkspace.float, ... pressureAndDate, ... artoaWorkspace.satData, ... artoaWorkspace.toaData, ... artoaWorkspace.filteredSoundsources, ... artoaWorkspace.trackParameter, ... soundVelocity, ... artoaDataInput.ini.leapseconds ... ); if trajectory == false errordlg( [ ... 'The trajectory could not be calculated. ' ... 'Please check the inputs of the tracking parameter window and make sure ' ... ' the combinations you chose have applied TOAs!' ... ], ... 'Trajectory error' ... ); return; end %% Setup trajectory object trajectoryObject = struct(); trajectoryObject.trackParameter = artoaWorkspace.trackParameter; % trajectory contains [lat lon] trajectoryObject.latitude = trajectory(:, 1); trajectoryObject.longitude = trajectory(:, 2); trajectoryObject.date = trajectoryDates; trajectoryObject.clockError = trajectoryClockError; trajectoryObject.residuals = trajectoryResiduals; trajectoryObject.velocities = trajectoryVelocities; trajectoryObject.timeDivergenceToGps = trajectoryTimeDivergenceToGps; %% Generate trajectory id if isempty(artoaWorkspace.trajectoryOutput.trajectories) trajectoryObject.id = 1; else trajectoryObject.id = artoaWorkspace.trajectoryOutput.trajectories{end}.id + 1; end trajectoryObject.hidden = false; % store to workspace artoaWorkspace.trajectoryOutput.trajectories{end + 1} = trajectoryObject; %% Open track gui artoa.controller.track.trajectoryOutput.open(); end