119 lines
4.2 KiB
Matlab
119 lines
4.2 KiB
Matlab
function plotG2MeanHeatmap(results, theta_query, scan_reference_values, varargin)
|
||
%% plotG2MeanHeatmap
|
||
% Author: Karthik
|
||
% Date: 2025-09-12
|
||
% Version: 1.0
|
||
%
|
||
% Description:
|
||
% Plots a heatmap of mean g² values at a specified theta across the phase
|
||
% diagram.
|
||
%
|
||
% Notes:
|
||
% Optional notes, references.
|
||
|
||
% --- Parse optional inputs ---
|
||
p = inputParser;
|
||
addParameter(p, 'FigNum', []);
|
||
addParameter(p, 'Colormap', @jet);
|
||
addParameter(p, 'CLim', []);
|
||
addParameter(p, 'ColorScale', 'linear', @(x) any(validatestring(x,{'linear','log'})));
|
||
addParameter(p, 'XLabel', 'Param1');
|
||
addParameter(p, 'YLabel', 'Param2');
|
||
addParameter(p, 'Title', 'Mean g²');
|
||
addParameter(p, 'FontName', 'Arial');
|
||
addParameter(p, 'FontSize', 14);
|
||
addParameter(p, 'SkipSaveFigures', false, @islogical);
|
||
addParameter(p, 'SaveFileName', 'g2MeanHeatmap.fig', @ischar);
|
||
addParameter(p, 'SaveDirectory', pwd, @ischar);
|
||
parse(p, varargin{:});
|
||
opts = p.Results;
|
||
|
||
% --- Extract data at requested theta ---
|
||
theta_vals = results.theta_values;
|
||
[~, idx_theta] = min(abs(theta_vals - theta_query)); % closest index
|
||
N_total = numel(results.g2_curves);
|
||
dataCell = cell(N_total,1);
|
||
for i = 1:N_total
|
||
G = results.g2_curves{i}; % [N_reps × Nθ]
|
||
dataCell{i} = G(:, idx_theta); % all repetitions at chosen theta
|
||
end
|
||
|
||
% --- Convert reference/parameter values to numeric arrays ---
|
||
scanRefArray = cell2mat(scan_reference_values(:)); % nParams × 2
|
||
|
||
% --- Determine unique X and Y values ---
|
||
XValues = sort(unique(scanRefArray(:,2)), 'ascend'); % Param1 → X
|
||
YValues = sort(unique(scanRefArray(:,1)), 'ascend'); % Param2 → Y
|
||
nX = numel(XValues);
|
||
nY = numel(YValues);
|
||
|
||
% --- Preallocate data matrix ---
|
||
data_matrix = NaN(nY, nX);
|
||
|
||
% --- Fill matrix by looping over parameter pairs ---
|
||
for k = 1:N_total
|
||
X = scanRefArray(k,2);
|
||
Y = scanRefArray(k,1);
|
||
|
||
row = find(ismembertol(YValues, Y, 1e-6));
|
||
col = find(ismembertol(XValues, X, 1e-6));
|
||
|
||
if isempty(row) || isempty(col), continue; end
|
||
|
||
% Get g² values for this (Y,X)
|
||
G = results.g2_curves{k}; % [N_reps × Nθ]
|
||
vals = G(:, idx_theta); % repetitions at chosen θ
|
||
|
||
% Store mean
|
||
data_matrix(row,col) = mean(vals, 'omitnan');
|
||
end
|
||
|
||
% --- Create figure ---
|
||
if isempty(opts.FigNum)
|
||
fig = figure;
|
||
else
|
||
fig = figure(opts.FigNum);
|
||
end
|
||
clf(fig);
|
||
set(fig, 'Color', 'w', 'Position', [100 100 950 750]);
|
||
|
||
% --- Plot heatmap ---
|
||
imagesc(XValues, YValues, data_matrix);
|
||
set(gca, ...
|
||
'FontName', opts.FontName, ...
|
||
'FontSize', opts.FontSize, ...
|
||
'YDir', 'normal', ...
|
||
'ColorScale', opts.ColorScale);
|
||
|
||
% --- Labels and title ---
|
||
xlabel(opts.XLabel, 'Interpreter', 'tex', 'FontName', opts.FontName, 'FontSize', opts.FontSize);
|
||
ylabel(opts.YLabel, 'Interpreter', 'tex', 'FontName', opts.FontName, 'FontSize', opts.FontSize);
|
||
|
||
% --- Compute fraction of pi for theta label ---
|
||
theta_factor = theta_query / pi;
|
||
if abs(round(1/theta_factor) - 1/theta_factor) < 1e-6
|
||
theta_str = sprintf('\\pi/%d', round(1/theta_factor));
|
||
elseif abs(theta_factor - round(theta_factor)) < 1e-6
|
||
theta_str = sprintf('%d\\pi', round(theta_factor));
|
||
else
|
||
theta_str = sprintf('%.3g \\pi', theta_factor);
|
||
end
|
||
|
||
% --- Set title ---
|
||
title(sprintf('%s | Mean g^{(2)}(\\delta\\theta = %s)', ...
|
||
opts.Title, theta_str), ...
|
||
'FontName', opts.FontName, 'FontSize', opts.FontSize + 2, 'FontWeight', 'bold');
|
||
|
||
% --- Colorbar ---
|
||
colormap(feval(opts.Colormap));
|
||
if ~isempty(opts.CLim)
|
||
caxis(opts.CLim);
|
||
end
|
||
colorbar;
|
||
|
||
% --- Save figure ---
|
||
if ~opts.SkipSaveFigures
|
||
if ~exist(opts.SaveDirectory,'dir'), mkdir(opts.SaveDirectory); end
|
||
savefig(fig, fullfile(opts.SaveDirectory, opts.SaveFileName));
|
||
end
|
||
end |