Calculations/Data-Analyzer/+Plotter/plotSpectralAverages.m

124 lines
4.9 KiB
Matlab

function plotSpectralAverages(scan_parameter_values, results_full, varargin)
%% plotSpectralAverages
% Author: Karthik
% Date: 2025-09-12
% Version: 1.0
%
% Description:
% Plot averaged power, radial, and angular spectra for a scan
%
% Inputs:
% scan_parameter_values - array of scan parameter values
% spectral_analysis_results - struct with fields:
% kx, ky, PS_all, k_rho_vals, S_k_all, theta_vals, S_theta_all
%
% Name-Value Pair Arguments:
% 'FigNum', 'ColormapPS', 'Font',
% 'SaveFileName', 'SaveDirectory', 'SkipSaveFigures'
%
% Notes:
% Dataset 1 = Solid line
% Dataset 2 = Dashed line
% Marker shape encodes θ value (consistent across datasets)
% Dataset colors are distinct
% --- Extract data from struct ---
kx = results_full.kx;
ky = results_full.ky;
ps_list = results_full.PS_all;
k_rho_vals = results_full.k_rho_vals;
s_k_list = results_full.S_k_all;
theta_vals = results_full.theta_vals;
s_theta_list = results_full.S_theta_all;
% --- Parse optional parameters ---
p = inputParser;
addParameter(p, 'Title', 'Average Curves', @(x) ischar(x) || isstring(x));
addParameter(p, 'AnnotationSuffix', '%.1f^\\circ', @(x) ischar(x) || isstring(x));
addParameter(p, 'ColormapPS', [], @(x) isnumeric(x) || ismatrix(x));
addParameter(p, 'FontName', 'Arial', @ischar);
addParameter(p, 'FontSize', 14, @isnumeric);
addParameter(p, 'FigNum', 1, @(x) isnumeric(x) && isscalar(x));
addParameter(p, 'SaveFileName', 'avgspectra.fig', @ischar);
addParameter(p, 'SaveDirectory', pwd, @ischar);
addParameter(p, 'SkipSaveFigures', false, @islogical);
parse(p, varargin{:});
opts = p.Results;
axisFontSize = opts.FontSize;
titleFontSize = opts.FontSize+2;
% --- Compute averaged data using shared helper ---
PS_data = Analyzer.computeSpectralAverages(ps_list, scan_parameter_values);
S_k_data = Analyzer.computeSpectralAverages(s_k_list, scan_parameter_values);
S_theta_data = Analyzer.computeSpectralAverages(s_theta_list, scan_parameter_values);
% --- Unique scan parameters ---
uniqueParams = S_k_data.scan_parameters;
nParams = numel(uniqueParams);
% --- Loop over each unique parameter ---
for pIdx = 1:nParams
currentParam = uniqueParams(pIdx);
avgPS = PS_data.curves_mean{pIdx};
avgS_k = S_k_data.curves_mean{pIdx};
avgS_theta = S_theta_data.curves_mean{pIdx};
% ==== Plot ====
fig = figure(opts.FigNum); clf;
set(fig, 'Color', 'w', 'Position', [400 200 1200 400]);
tLayout = tiledlayout(1,3,'TileSpacing','compact','Padding','compact');
% --- 1. Power Spectrum ---
nexttile;
imagesc(kx, ky, log(1 + avgPS));
axis image;
set(gca, 'FontSize', axisFontSize, 'YDir', 'normal');
xlabel('k_x [\mum^{-1}]','Interpreter','tex','FontSize',axisFontSize,'FontName',opts.FontName);
ylabel('k_y [\mum^{-1}]','Interpreter','tex','FontSize',axisFontSize,'FontName',opts.FontName);
title('Average Power Spectrum','FontSize',titleFontSize,'FontWeight','bold');
if isempty(opts.ColormapPS)
opts.ColormapPS = Colormaps.coolwarm();
end
colormap(opts.ColormapPS);
colorbar;
% --- Annotate scan parameter ---
txt = sprintf(opts.AnnotationSuffix, currentParam);
text(0.975,0.975,txt,'Color','white','FontWeight','bold','FontSize',axisFontSize, ...
'Interpreter','tex','Units','normalized','HorizontalAlignment','right','VerticalAlignment','top');
% --- 2. Radial Spectrum ---
nexttile;
plot(k_rho_vals, avgS_k, 'LineWidth', 2);
xlabel('k_\rho [\mum^{-1}]','Interpreter','tex','FontSize',axisFontSize);
ylabel('Magnitude (a.u.)','Interpreter','tex','FontSize',axisFontSize);
title('Average S(k_\rho)','FontSize',titleFontSize,'FontWeight','bold');
set(gca,'FontSize',axisFontSize,'YScale','log','XLim',[min(k_rho_vals), max(k_rho_vals)]);
grid on;
% --- 3. Angular Spectrum ---
nexttile;
plot(theta_vals/pi, avgS_theta, 'LineWidth', 2);
xlabel('\theta/\pi [rad]','Interpreter','tex','FontSize',axisFontSize);
ylabel('Magnitude (a.u.)','Interpreter','tex','FontSize',axisFontSize);
title('Average S(\theta)','FontSize',titleFontSize,'FontWeight','bold');
set(gca,'FontSize',axisFontSize,'YScale','log','YLim',[1e4, 1e7]);
ax = gca;
ax.XMinorGrid = 'on';
ax.YMinorGrid = 'on';
grid on;
sgtitle(opts.Title, 'FontName', opts.FontName, 'FontSize', titleFontSize+2);
drawnow;
% --- Save figure ---
Plotter.saveFigure(fig, ...
'SaveFileName', opts.SaveFileName, ...
'SaveDirectory', opts.SaveDirectory, ...
'SkipSaveFigures', opts.SkipSaveFigures);
end
end