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