Major bugfixes
This commit is contained in:
parent
369a0da75d
commit
9e03632b4f
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user