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

119 lines
4.2 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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