107 lines
3.4 KiB
Matlab
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
|