Calculations/Data-Analyzer/+Helper/batchAnalyze.m

107 lines
3.4 KiB
Matlab

function results_all = batchAnalyze(dataSources, options)
arguments
dataSources (1,:) cell
options struct
end
% Default base folder if not specified
if ~isfield(options, 'baseDataFolder')
options.baseDataFolder = '//DyLabNAS/Data';
end
results_all = {}; % one element per folder
for i = 1:numel(dataSources)
ds = dataSources{i};
% Use per-sequence baseFolder if present, otherwise default from options
if isfield(ds, 'baseFolder') && ~isempty(ds.baseFolder)
baseFolder = fullfile(ds.baseFolder, ds.sequence, ds.date);
else
baseFolder = fullfile(options.baseDataFolder, ds.sequence, ds.date);
end
for j = 1:numel(ds.runs)
runItem = ds.runs(j);
% Convert numeric or char arrays to a string with leading zeros if needed
if isnumeric(runItem)
runID = sprintf('%04d', runItem); % adjust padding as needed
elseif isstring(runItem)
runID = runItem;
elseif ischar(runItem)
runID = string(runItem);
elseif iscell(runItem)
runID = string(runItem{1}); % handles cell of char
else
error('Unsupported type for run entry: %s', class(runItem));
end
% Build folder path
folderPath = fullfile(baseFolder, runID);
options.folderPath = folderPath;
try
% Convert struct -> name-value args
args = [fieldnames(options), struct2cell(options)]';
args = args(:)';
% Perform analysis
analysisResults = Analyzer.performAnalysis(args{:});
% Store flat struct with metadata + results
result = struct();
result.sequence = ds.sequence;
result.date = ds.date;
result.run = runID;
result.path = folderPath;
result.results = analysisResults;
% Save each dataset as its own MAT file
if ~isfield(options, 'skipSaveData') || ~options.skipSaveData
saveResultStruct(result, options.saveDirectory);
end
% Append to output
results_all{end+1,1} = result;
catch ME
warning("Error processing %s/%s/%s: %s", ...
ds.sequence, ds.date, runID, ME.message);
end
end
end
end
%% ---- Local function for saving results ----
function saveResultStruct(result, saveDirectory)
% Define results folder
resultsFolder = fullfile(saveDirectory, "Results", "AnalysisSavedData");
if ~exist(resultsFolder, 'dir')
mkdir(resultsFolder);
end
% Path to index file
indexFile = fullfile(resultsFolder, "datasetsIndex.mat");
% Load or initialize index
if isfile(indexFile)
S = load(indexFile, "nextIdx");
nextIdx = S.nextIdx;
else
nextIdx = 1;
end
% Variable name and file path
varName = sprintf('Dataset_%d', nextIdx);
savePath = fullfile(resultsFolder, varName + ".mat");
% Save dataset as struct inside MAT file
S.(varName) = result;
save(savePath, '-struct', 'S');
% Update index
nextIdx = nextIdx + 1;
save(indexFile, "nextIdx");
end