diff --git a/Data-Analyzer/+Helper/batchAnalyze.m b/Data-Analyzer/+Helper/batchAnalyze.m index b030ed3..5d983a2 100644 --- a/Data-Analyzer/+Helper/batchAnalyze.m +++ b/Data-Analyzer/+Helper/batchAnalyze.m @@ -38,14 +38,9 @@ function results_all = batchAnalyze(dataSources, options) end % Build folder path - folderPath = fullfile(baseFolder, runID); - if ~endsWith(folderPath, filesep) - folderPath = [char(folderPath) filesep]; - else - folderPath = char(folderPath); - end + folderPath = fullfile(baseFolder, runID); options.folderPath = folderPath; - + try % Convert struct -> name-value args args = [fieldnames(options), struct2cell(options)]'; diff --git a/Data-Analyzer/+Helper/collectODImages.m b/Data-Analyzer/+Helper/collectODImages.m index db61aae..4d42853 100644 --- a/Data-Analyzer/+Helper/collectODImages.m +++ b/Data-Analyzer/+Helper/collectODImages.m @@ -32,11 +32,17 @@ function [od_imgs, scan_parameter_values, file_list] = collectODImages(options) critical_fields = {'folderPath','cam','angle','ImagingMode','PulseDuration','center','span','fraction','removeFringes','skipUnshuffling','scan_reference_values'}; if ~haveOptionsChanged(options, prior_options, critical_fields) - fprintf('\nReusing processed OD images, scan parameters, and file list from memory (options unchanged).\n'); + fprintf('\nReusing processed OD images, scan parameters, and file list from memory.\n'); od_imgs = evalin('base','od_imgs'); scan_parameter_values = evalin('base','scan_parameter_values'); file_list = evalin('base','file_list'); - return; % ✅ skip rest of the function + + % --- Ensure figures exist if requested now --- + if ~options.skipSaveFigures + saveODFigures(od_imgs, options.saveDirectory); + end + + return; % ✅ safe to exit now else fprintf('\nProcessed-data-related options changed. Reprocessing full OD image dataset...\n'); end @@ -46,7 +52,8 @@ function [od_imgs, scan_parameter_values, file_list] = collectODImages(options) fullDataExists = evalin('base', 'exist(''full_od_imgs'', ''var'')') && ... evalin('base', 'exist(''full_bkg_imgs'', ''var'')') && ... evalin('base', 'exist(''raw_scan_parameter_values'', ''var'')') && ... - evalin('base', 'exist(''raw_file_list'', ''var'')'); + evalin('base', 'exist(''raw_file_list'', ''var'')') && ... + evalin('base', 'exist(''prior_options'',''var'')'); if fullDataExists % Both required datasets exist, check if raw-data options changed @@ -174,25 +181,17 @@ function [od_imgs, scan_parameter_values, file_list] = collectODImages(options) assignin('base', 'file_list', file_list); assignin('base', 'prior_options', options); - % --- Optionally save OD images as figures --- + % --- Save OD images as figures if requested --- if ~options.skipSaveFigures - odFolder = fullfile(options.saveDirectory, "Results", "ODImages"); - if ~exist(odFolder, 'dir') - mkdir(odFolder); - end - - for k = 1:length(od_imgs) - img = od_imgs{k}; - fileName = fullfile(odFolder, sprintf('OD_img_%03d.png', k)); - imwrite(mat2gray(img), fileName); - end + saveODFigures(od_imgs, options.saveDirectory); end fprintf('\nOD image dataset ready for further analysis.\n'); end -% --- Local helper function to compare options --- +%% --- Local helper functions --- + function changed = haveOptionsChanged(options, prior_options, critical_fields) changed = false; for f = critical_fields @@ -205,4 +204,35 @@ function changed = haveOptionsChanged(options, prior_options, critical_fields) changed = true; return end end -end \ No newline at end of file +end + +function saveODFigures(od_imgs, saveDirectory) + odFolder = fullfile(saveDirectory, "Results", "ODImages"); + if ~exist(odFolder, 'dir') + mkdir(odFolder); + end + + nImgs = length(od_imgs); + filesExist = all(arrayfun(@(k) isfile(fullfile(odFolder, sprintf('OD_img_%03d.fig', k))), 1:nImgs)); + + if filesExist + fprintf('\nOD figures already exist in %s. Skipping save.\n', odFolder); + return; + end + + fprintf('\nSaving OD figures to %s ...\n', odFolder); + for k = 1:nImgs + img = od_imgs{k}; + + % Create invisible figure for saving + hFig = figure('Visible','off'); + imagesc(img); + axis image off; colormap gray; + fileName = fullfile(odFolder, sprintf('OD_img_%03d.fig', k)); + + % Save as .fig + savefig(hFig, fileName); + close(hFig); + end + fprintf('OD figures saved successfully.\n'); +end diff --git a/Data-Analyzer/+Scripts/BECToDropletsToStripes/plotImages.m b/Data-Analyzer/+Scripts/BECToDropletsToStripes/plotImages.m index 60968bd..e3ae082 100644 --- a/Data-Analyzer/+Scripts/BECToDropletsToStripes/plotImages.m +++ b/Data-Analyzer/+Scripts/BECToDropletsToStripes/plotImages.m @@ -103,7 +103,7 @@ set(0,'DefaultUicontrolFontSize',10); % increase default font size 'ListString', allPaths, ... 'ListSize',[400, 300]); % width x height in pixels if tf - options.folderPath = allPaths{selectedIndex}; % ✅ store in options + options.folderPath = fullfile(allPaths{selectedIndex}); % ✅ store in options fprintf('Path set to selection: %s\n', options.folderPath); else error('No path selected. Aborting.'); diff --git a/Data-Analyzer/+Scripts/BECToDropletsToStripes/runFullAnalysis.m b/Data-Analyzer/+Scripts/BECToDropletsToStripes/runFullAnalysis.m index d8ec23d..75525d9 100644 --- a/Data-Analyzer/+Scripts/BECToDropletsToStripes/runFullAnalysis.m +++ b/Data-Analyzer/+Scripts/BECToDropletsToStripes/runFullAnalysis.m @@ -67,7 +67,7 @@ options.skipPreprocessing = true; options.skipMasking = true; options.skipIntensityThresholding = true; options.skipBinarization = true; -options.skipSaveFigures = false; +options.skipSaveFigures = true; options.skipLivePlot = false; options.showProgressBar = true;