function [offsetTable] = generateOffsetTable(pFloatDetails, pSoundsources) %GETDEFAULTOFFSETTABLE Summary of this function goes here % Detailed explanation goes here %% Get required variables variableNames = artoa.offsets.getDefaultVariableNames(); %% Initialize return variable offsetTable = cell2table( ... artoa.offsets.getDefaultRowValues(), ... 'VariableNames', variableNames ... ); %% Setup rows % float offsetTable.Properties.RowNames(1) = {'Float'}; floatOffsets = artoa.data.getMember(pFloatDetails, {'offset'}, false); startDate = NaN; endDate = NaN; startOffset = NaN; endOffset = NaN; drift = NaN; if ~islogical(floatOffsets) sizeOffsets = size(floatOffsets); if sizeOffsets(1) >= 1 && sizeOffsets(2) >= 3 % start date can be calculated startDate = artoa.convert.dmy2rd( ... floatOffsets(1, 3), ... floatOffsets(1, 2), ... floatOffsets(1, 1) ... ); end if sizeOffsets(1) >= 2 && sizeOffsets(2) >= 3 % end date can be calculated endDate = artoa.convert.dmy2rd( ... floatOffsets(2, 3), ... floatOffsets(2, 2), ... floatOffsets(2, 1) ... ); end if sizeOffsets(1) >= 1 && sizeOffsets(2) >= 7 % start offset can be stored startOffset = floatOffsets(1, 7); end if sizeOffsets(1) >= 2 && sizeOffsets(2) >= 7 % end offset can be stored and drift can be calculated endOffset = floatOffsets(2, 7); % calculate drift per day drift = (endOffset - startOffset) / (endDate - startDate); end end offsetTable{1, variableNames{1}} = startDate; offsetTable{1, variableNames{2}} = startOffset; offsetTable{1, variableNames{3}} = endDate; offsetTable{1, variableNames{4}} = endOffset; offsetTable{1, variableNames{5}} = drift; clear startDate startOffset endDate endOffset drift; if nargin == 1 return; end if iscell(pSoundsources) for i = 1:length(pSoundsources) offsetTable(i + 1, :) = artoa.offsets.getDefaultRowValues(); offsetTable.Properties.RowNames(i + 1) = {pSoundsources{i}.sourcename}; [ ... offsetTable{i + 1, variableNames{1}}, ... offsetTable{i + 1, variableNames{2}}, ... offsetTable{i + 1, variableNames{3}}, ... offsetTable{i + 1, variableNames{4}}, ... offsetTable{i + 1, variableNames{5}} ... ] = extract(pSoundsources{i}); end end if isstruct(pSoundsources) fnames = fieldnames(pSoundsources); for i = 1:length(fnames) offsetTable(i + 1, :) = artoa.offsets.getDefaultRowValues(); offsetTable.Properties.RowNames(i + 1) = {pSoundsources.(fnames{i}).sourcename}; [ ... offsetTable{i + 1, variableNames{1}}, ... offsetTable{i + 1, variableNames{2}}, ... offsetTable{i + 1, variableNames{3}}, ... offsetTable{i + 1, variableNames{4}}, ... offsetTable{i + 1, variableNames{5}} ... ] = extract(pSoundsources.(fnames{i})); end end function [startDate, startOffset, endDate, endOffset, drift] = extract(pSoundsource) startDate = NaN; startOffset = NaN; endDate = NaN; endOffset = NaN; drift = NaN; % start date and offset paramOffset = artoa.data.getMember(pSoundsource, {'offset'}, false); if ~islogical(paramOffset) sizeOffset = size(paramOffset); if sizeOffset(1) >= 1 && sizeOffset(2) >= 3 % start date can be calculated startDate = artoa.convert.dmy2rd( ... paramOffset(1, 3), ... paramOffset(1, 2), ... paramOffset(1, 1) ... ); end if sizeOffset(1) >= 1 && sizeOffset(2) >= 4 % start offset can be stored startOffset = paramOffset(1, 4); end end % end date, offset and drift calculation paramRcvOffset = artoa.data.getMember(pSoundsource, {'rcv_offset'}, false); if ~islogical(paramRcvOffset) sizeRcvOffset = size(paramRcvOffset); if sizeRcvOffset(1) >= 1 && sizeRcvOffset(2) >= 3 % end date can be calculated endDate = artoa.convert.dmy2rd( ... paramRcvOffset(1, 3), ... paramRcvOffset(1, 2), ... paramRcvOffset(1, 1) ... ); end if sizeRcvOffset(1) >= 1 && sizeRcvOffset(2) >= 4 % end offset can be stored endOffset = paramRcvOffset(1, 4); if ~isnan(startOffset) % calculate drift per day drift = (endOffset - startOffset) / (endDate - startDate); end end end end end