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); if ~endsWith(folderPath, filesep) folderPath = [char(folderPath) filesep]; else folderPath = char(folderPath); end 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; % 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