127 lines
4.6 KiB
Matlab
127 lines
4.6 KiB
Matlab
function plotTwoModeGaussianFitsOnRawRSD(fitResults, rawCurves, nRows, nCols, varargin)
|
||
%% plotTwoModeGaussianFitsOnRawRSD
|
||
% Author: Karthik
|
||
% Date: 2025-10-16
|
||
% Version: 1.0
|
||
%
|
||
% Description:
|
||
% Plots raw radial spectral curves with their two-Gaussian fits in a
|
||
% compact, paginated layout. Each page shows up to nRows × nCols subplots.
|
||
%
|
||
% Inputs:
|
||
% fitResults - struct array from fitTwoGaussianCurvesToRadialSpectralDistribution
|
||
% rawCurves - struct array with fields:
|
||
% .x - raw normalized amplitudes
|
||
% .k - corresponding k_rho values
|
||
% nRows - number of subplot rows per page (default: 8)
|
||
% nCols - number of subplot columns per page (default: 12)
|
||
% varargin - name-value pairs:
|
||
% 'FontName', 'FontSize', 'SkipLivePlot', 'SkipSaveFigures',
|
||
% 'SaveDirectory', 'RepsPerPage'
|
||
|
||
% --- Parse optional name-value pairs ---
|
||
p = inputParser;
|
||
addParameter(p, 'FontName', 'Arial', @ischar);
|
||
addParameter(p, 'FontSize', 12, @isnumeric);
|
||
addParameter(p, 'SkipLivePlot', false, @islogical);
|
||
addParameter(p, 'SkipSaveFigures', true, @islogical);
|
||
addParameter(p, 'SaveDirectory', pwd, @ischar);
|
||
addParameter(p, 'RepsPerPage', [], @isnumeric); % optional override of nRows*nCols
|
||
parse(p, varargin{:});
|
||
opts = p.Results;
|
||
|
||
% --- Default subplot grid if not provided ---
|
||
if nargin < 3 || isempty(nRows), nRows = 8; end
|
||
if nargin < 4 || isempty(nCols), nCols = 12; end
|
||
|
||
plotsPerPage = nRows * nCols;
|
||
if ~isempty(opts.RepsPerPage)
|
||
plotsPerPage = opts.RepsPerPage;
|
||
end
|
||
|
||
Ncurves = numel(rawCurves);
|
||
numPages = ceil(Ncurves / plotsPerPage);
|
||
|
||
% --- Setup save directory if needed ---
|
||
if ~opts.SkipSaveFigures
|
||
saveFolder = fullfile(opts.SaveDirectory, 'Results', 'SavedFigures', 'TwoGaussianFits');
|
||
if ~exist(saveFolder, 'dir')
|
||
mkdir(saveFolder);
|
||
end
|
||
end
|
||
|
||
for pageIdx = 1:numPages
|
||
repStart = (pageIdx-1)*plotsPerPage + 1;
|
||
repEnd = min(pageIdx*plotsPerPage, Ncurves);
|
||
repSubset = repStart:repEnd;
|
||
N_rows = numel(repSubset);
|
||
|
||
% --- Create figure ---
|
||
if ~opts.SkipLivePlot
|
||
fig = figure('Color', 'w', 'Position', [50 50 1600 900]);
|
||
else
|
||
fig = figure('Color', 'w', 'Position', [50 50 1600 900], 'Visible', 'off');
|
||
end
|
||
|
||
t = tiledlayout(fig, ceil(N_rows/nCols), nCols, 'TileSpacing', 'compact', 'Padding', 'compact');
|
||
title(t, sprintf('Two-Gaussian fits | Page %d/%d', pageIdx, numPages), ...
|
||
'FontSize', opts.FontSize + 2, 'FontWeight', 'bold', 'FontName', opts.FontName);
|
||
|
||
for r = 1:N_rows
|
||
k = repSubset(r);
|
||
nexttile;
|
||
hold on; grid on; box on;
|
||
|
||
% --- Plot raw curve ---
|
||
if isfield(rawCurves, 'x') && isfield(rawCurves, 'k') && ...
|
||
~isempty(rawCurves(k).x) && all(isfinite(rawCurves(k).x))
|
||
plot(rawCurves(k).k, rawCurves(k).x, 'k.-', ...
|
||
'LineWidth', 1, 'DisplayName', 'Raw data');
|
||
end
|
||
|
||
% --- Overlay fit if valid ---
|
||
if k <= numel(fitResults)
|
||
fit = fitResults(k);
|
||
if isfield(fit, 'isValid') && ~isempty(fit.isValid) && fit.isValid && ...
|
||
isfield(fit, 'kFine') && isfield(fit, 'yFit') && ...
|
||
~isempty(fit.kFine) && all(isfinite(fit.yFit))
|
||
plot(fit.kFine, fit.yFit, 'r-', ...
|
||
'LineWidth', 1.2, 'DisplayName', 'Two-Gaussian fit');
|
||
end
|
||
end
|
||
|
||
set(gca, 'YScale', 'log');
|
||
|
||
% --- Labels and title ---
|
||
xlabel('k_\rho', 'FontSize', opts.FontSize);
|
||
ylabel('N. A.', 'FontSize', opts.FontSize);
|
||
title(sprintf('Curve %d', k), 'FontSize', opts.FontSize - 2, 'Interpreter', 'none');
|
||
|
||
hold off;
|
||
end
|
||
|
||
% --- Render live plot ---
|
||
if ~opts.SkipLivePlot
|
||
drawnow;
|
||
end
|
||
|
||
% --- Save figure ---
|
||
if ~opts.SkipSaveFigures
|
||
saveFileName = sprintf('TwoGaussianFits_page_%02d.png', pageIdx);
|
||
if exist('Plotter', 'class')
|
||
Plotter.saveFigure(fig, ...
|
||
'SaveFileName', saveFileName, ...
|
||
'SaveDirectory', saveFolder, ...
|
||
'SkipSaveFigures', opts.SkipSaveFigures);
|
||
else
|
||
saveas(fig, fullfile(saveFolder, saveFileName));
|
||
end
|
||
end
|
||
|
||
% --- Close invisible figure to free memory ---
|
||
if opts.SkipLivePlot
|
||
close(fig);
|
||
end
|
||
end
|
||
end
|