Major bugfixes

This commit is contained in:
Karthik 2025-08-30 03:01:00 +02:00
parent 369a0da75d
commit 9e03632b4f
4 changed files with 168 additions and 47 deletions

View File

@ -123,10 +123,22 @@ function [od_imgs, scan_parameter_values, file_list] = collectODImages(options)
% If user forces recompute -> recompute from selected raw path
if isfield(options,'skipFullODImagesFolderUse') && options.skipFullODImagesFolderUse
[full_od_imgs, full_bkg_imgs, raw_scan_parameter_values, raw_file_list] = ...
recomputeODImages(options, selPath);
matched = true;
[full_od_imgs, full_bkg_imgs, raw_scan_parameter_values, raw_file_list] = recomputeODImages(options, selPath);
if ~options.SAVE_TO_WORKSPACE
% --- Determine parent folder for FullODImages ---
if isfield(options, 'FullODImagesFolder') && ...
~isempty(options.FullODImagesFolder) && ...
isfolder(options.FullODImagesFolder)
parentFolder = dir(fullfile(options.FullODImagesFolder, 'FullODImages_*'));
elseif isfield(options, 'saveDirectory') && isfolder(options.saveDirectory)
parentFolder = dir(fullfile(options.saveDirectory, 'FullODImages_*'));
end
fullodimagesFolder = createFullODImagesFolderPath(parentFolder, dataSource);
[mat_files, ~, ~, nFiles] = prepareData(fullodimagesFolder);
else
nFiles = numel(raw_file_list);
end
matched = true;
else
% Try to find an existing full-OD folder whose metadata references this raw path
found = false;
@ -152,8 +164,21 @@ function [od_imgs, scan_parameter_values, file_list] = collectODImages(options)
% If no matching full-OD folder found, recompute from the selected raw path
if ~found
[full_od_imgs, full_bkg_imgs, raw_scan_parameter_values, raw_file_list] = ...
recomputeODImages(options, selPath);
[full_od_imgs, full_bkg_imgs, raw_scan_parameter_values, raw_file_list] = recomputeODImages(options, selPath);
if ~options.SAVE_TO_WORKSPACE
% --- Determine parent folder for FullODImages ---
if isfield(options, 'FullODImagesFolder') && ...
~isempty(options.FullODImagesFolder) && ...
isfolder(options.FullODImagesFolder)
parentFolder = dir(fullfile(options.FullODImagesFolder, 'FullODImages_*'));
elseif isfield(options, 'saveDirectory') && isfolder(options.saveDirectory)
parentFolder = dir(fullfile(options.saveDirectory, 'FullODImages_*'));
end
fullodimagesFolder = createFullODImagesFolderPath(parentFolder, dataSource);
[mat_files, ~, ~, nFiles] = prepareData(fullodimagesFolder);
else
nFiles = numel(raw_file_list);
end
matched = true;
end
end
@ -163,10 +188,22 @@ function [od_imgs, scan_parameter_values, file_list] = collectODImages(options)
% --- No selectedPath provided: either force recompute or search among fullodimage_folders ---
if isfield(options,'skipFullODImagesFolderUse') && options.skipFullODImagesFolderUse
% forced recompute
[full_od_imgs, full_bkg_imgs, raw_scan_parameter_values, raw_file_list] = ...
recomputeODImages(options, options.baseDataFolder);
[full_od_imgs, full_bkg_imgs, raw_scan_parameter_values, raw_file_list] = recomputeODImages(options, options.baseDataFolder);
if ~options.SAVE_TO_WORKSPACE
% --- Determine parent folder for FullODImages ---
if isfield(options, 'FullODImagesFolder') && ...
~isempty(options.FullODImagesFolder) && ...
isfolder(options.FullODImagesFolder)
parentFolder = dir(fullfile(options.FullODImagesFolder, 'FullODImages_*'));
elseif isfield(options, 'saveDirectory') && isfolder(options.saveDirectory)
parentFolder = dir(fullfile(options.saveDirectory, 'FullODImages_*'));
end
fullodimagesFolder = createFullODImagesFolderPath(parentFolder, dataSource);
[mat_files, ~, ~, nFiles] = prepareData(fullodimagesFolder);
else
nFiles = numel(raw_file_list);
end
matched = true;
else
% Search for existing matching full-OD folder based on options.folderPath
if ~isempty(full_od_image_parent_folder) && useFullODFolders
@ -198,8 +235,21 @@ function [od_imgs, scan_parameter_values, file_list] = collectODImages(options)
else
fprintf('\n[INFO] No matching full OD images subfolder found. Recomputing from raw data...\n');
end
[full_od_imgs, full_bkg_imgs, raw_scan_parameter_values, raw_file_list, full_od_image_subfolder, nFiles] = ...
recomputeODImages(options, options.baseDataFolder);
[full_od_imgs, full_bkg_imgs, raw_scan_parameter_values, raw_file_list] = recomputeODImages(options, options.baseDataFolder);
if ~options.SAVE_TO_WORKSPACE
% --- Determine parent folder for FullODImages ---
if isfield(options, 'FullODImagesFolder') && ...
~isempty(options.FullODImagesFolder) && ...
isfolder(options.FullODImagesFolder)
parentFolder = dir(fullfile(options.FullODImagesFolder, 'FullODImages_*'));
elseif isfield(options, 'saveDirectory') && isfolder(options.saveDirectory)
parentFolder = dir(fullfile(options.saveDirectory, 'FullODImages_*'));
end
fullodimagesFolder = createFullODImagesFolderPath(parentFolder, dataSource);
[mat_files, ~, ~, nFiles] = prepareData(fullodimagesFolder);
else
nFiles = numel(raw_file_list);
end
end
% --- If a folder was determined, load its contents (listing) ---
@ -466,12 +516,12 @@ function [full_od_imgs, full_bkg_imgs, raw_scan_parameter_values, raw_file_list]
fprintf('\n[INFO] Cropping and subtracting background from images...\n');
end
function fullodimage_folder = createRunFolder(options, dataSource)
function fullodimagesFolder = createFullODImagesFolderPath(parentFolder, dataSource)
runID = sprintf('%s_%s_Run%04d', ...
dataSource{1}.sequence, ...
strrep(dataSource{1}.date,'/','-'), ...
dataSource{1}.runs);
fullodimage_folder = fullfile(options.saveDirectory, ['FullODImages_' runID]);
fullodimagesFolder = fullfile(parentFolder, ['FullODImages_' runID]);
end
function [mat_files, raw_scan_parameter_values, raw_file_list, nFiles] = prepareData(folder)

View File

@ -41,10 +41,10 @@ function [full_od_imgs, full_bkg_imgs, raw_scan_parameter_values, raw_file_list]
dataSource{1}.runs);
% --- Determine parent folder for FullODImages ---
if isfield(options, 'FullODImagesFoldersPath') && ...
~isempty(options.FullODImagesFoldersPath) && ...
isfolder(options.FullODImagesFoldersPath)
parentFolder = options.FullODImagesFoldersPath;
if isfield(options, 'FullODImagesFolder') && ...
~isempty(options.FullODImagesFolder) && ...
isfolder(options.FullODImagesFolder)
parentFolder = options.FullODImagesFolder;
else
parentFolder = options.saveDirectory;
end
@ -61,9 +61,6 @@ function [full_od_imgs, full_bkg_imgs, raw_scan_parameter_values, raw_file_list]
metadata.imageSize = [ny, nx];
metadata.fileList = string(arrayfun(@(f) fullfile(f.folder, f.name), files, 'UniformOutput', false));
save(fullfile(fullODImageFolder,'metadata.mat'),'metadata','-v7.3');
full_od_imgs = fullODImageFolder;
full_bkg_imgs = fullODImageFolder;
end
% --- Prepare file names ---
@ -82,7 +79,12 @@ function [full_od_imgs, full_bkg_imgs, raw_scan_parameter_values, raw_file_list]
% --- Parallel loop without progress bar ---
parfor k = 1:nFiles
[od_img, bkg_img, val] = readAndComputeOD(fullFileNames(k), options, groupList, ny, nx);
writeFullODImagesToDisk(fullODImageFolder, od_img, bkg_img, val, fullFileNames(k), k);
if options.SAVE_TO_WORKSPACE
full_od_imgs(:,:,k) = single(od_img);
full_bkg_imgs(:,:,k) = single(bkg_img);
else
writeFullODImagesToDisk(fullODImageFolder, od_img, bkg_img, val, fullFileNames(k), k);
end
raw_scan_parameter_values(k) = val;
end
else

View File

@ -10,18 +10,61 @@ function [selectedPath, folderPath] = selectDataSourcePath(dataSources, options)
% folderPath - constructed path from dataSources (always raw folder)
allPaths = {}; % initialize candidate paths
lookup = struct('rawPath', {}, 'fullODPath', {});
% --- Gather candidate raw data paths ---
for i = 1:numel(dataSources)
ds = dataSources{i};
dateParts = strsplit(ds.date,'/');
for run = ds.runs
runStr = sprintf('%04d', run);
rawPath = fullfile(options.baseDataFolder, ds.sequence, dateParts{:}, runStr);
if isfolder(rawPath)
allPaths{end+1} = rawPath;
else
fprintf('[INFO] Raw data folder does not exist: %s\n', rawPath);
% Ensure sequences, dates, and runs are cell arrays
sequences = ds.sequence; if ischar(sequences), sequences = {sequences}; end
dates = ds.date; if ischar(dates), dates = {dates}; end
runs = ds.runs; if isnumeric(runs), runs = num2cell(runs); end
if isstring(runs), runs = cellstr(runs); end
% Loop over all combinations of sequence × date × run
for seqIdx = 1:numel(sequences)
for dateIdx = 1:numel(dates)
for runIdx = 1:numel(runs)
targetSequence = sequences{seqIdx};
targetDate = dates{dateIdx};
runItem = runs{runIdx};
% Convert runItem to string with leading zeros if numeric
if isnumeric(runItem)
runID = sprintf('%04d', runItem);
elseif isstring(runItem)
runID = char(runItem);
elseif ischar(runItem)
runID = runItem;
elseif iscell(runItem)
runID = char(runItem{1});
else
error('Unsupported type for run entry: %s', class(runItem));
end
% Build raw data path
dateParts = strsplit(targetDate,'/');
rawPath = fullfile(options.baseDataFolder, targetSequence, dateParts{:}, runID);
if isfolder(rawPath)
allPaths{end+1} = rawPath;
else
fprintf('[INFO] Raw data folder does not exist: %s\n', rawPath);
end
% Build matching FullOD path
expectedName = sprintf('FullODImages_%s_%s_Run%s', ...
targetSequence, strrep(targetDate,'/','-'), runID);
if isfield(options,'FullODImagesFolder') && ~isempty(options.FullODImagesFolder)
fullODPath = fullfile(options.FullODImagesFolder, expectedName);
else
fullODPath = '';
end
% Store lookup mapping
lookup(end+1).rawPath = rawPath; %#ok<AGROW>
lookup(end).fullODPath = fullODPath;
end
end
end
end
@ -71,14 +114,9 @@ function [selectedPath, folderPath] = selectDataSourcePath(dataSources, options)
% --- If using full OD images folder, match the subfolder corresponding to sequence/date/run ---
if useFullOD
matchedPaths = {};
for i = 1:numel(dataSources)
ds = dataSources{i};
for run = ds.runs
expectedName = sprintf('FullODImages_%s_%s_Run%04d', ds.sequence, strrep(ds.date,'/','-'), run);
candidateFolder = fullfile(full_od_image_parent_folder, expectedName);
if isfolder(candidateFolder)
matchedPaths{end+1} = candidateFolder;
end
for k = 1:numel(lookup)
if isfolder(lookup(k).fullODPath)
matchedPaths{end+1} = lookup(k).fullODPath;
end
end
if ~isempty(matchedPaths)
@ -90,26 +128,57 @@ function [selectedPath, folderPath] = selectDataSourcePath(dataSources, options)
% --- Determine if user selection is needed ---
if numel(allPaths) > 1
% Build compact display names for selection
listStrings = cell(size(allPaths));
for idx = 1:numel(allPaths)
% Match to lookup table
label = '';
for k = 1:numel(lookup)
if strcmp(allPaths{idx}, lookup(k).rawPath) || strcmp(allPaths{idx}, lookup(k).fullODPath)
% Extract from rawPath parts
rawParts = strsplit(lookup(k).rawPath, filesep);
runID = rawParts{end};
seq = rawParts{end-4};
year = rawParts{end-3};
month = rawParts{end-2};
day = rawParts{end-1};
dateFormatted = sprintf('%s/%s/%s', day, month, year); % dd/mm/yyyy
label = sprintf('%s | %s | Run:%s', seq, dateFormatted, runID);
break;
end
end
if isempty(label)
[~, label] = fileparts(allPaths{idx}); % fallback
end
listStrings{idx} = label;
end
set(0,'DefaultUicontrolFontSize',10);
[selectedIndex, tf] = listdlg('PromptString','Select a run to analyze:', ...
'SelectionMode','single', ...
'ListString', allPaths, ...
'ListString', listStrings, ...
'ListSize',[500, 300]);
if ~tf
error('No path selected. Aborting.');
end
selectedPath = allPaths{selectedIndex};
else
% Only one candidate; select automatically
selectedPath = allPaths{1};
end
% --- Construct corresponding raw folderPath ---
folderPath = '';
for k = 1:numel(lookup)
if strcmp(selectedPath, lookup(k).rawPath) || strcmp(selectedPath, lookup(k).fullODPath)
folderPath = lookup(k).rawPath;
break;
end
end
if isempty(folderPath)
error('Could not map selected path back to a raw data folder path.');
end
fprintf('\n[INFO] Selected path: %s\n', selectedPath);
% --- Construct folderPath from first entry in dataSources ---
ds = dataSources{1};
dateParts = strsplit(ds.date,'/');
runStr = sprintf('%04d', ds.runs(1));
folderPath = fullfile(options.baseDataFolder, ds.sequence, dateParts{:}, runStr);
end
end

View File

@ -70,7 +70,7 @@ options.skipMasking = true;
options.skipIntensityThresholding = true;
options.skipBinarization = true;
options.skipFullODImagesFolderUse = false;
options.skipFullODImagesFolderUse = true;
options.skipSaveData = false;
options.skipSaveFigures = true;
options.skipSaveProcessedOD = true;