Calculations/Dipolar-Gas-Simulator/+Scripts/editPhaseDiagram.m

75 lines
2.4 KiB
Matlab

function editPhaseDiagram(M, SCATTERING_LENGTH_RANGE, NUM_ATOMS_LIST)
% Validate dimensions
[ylen, xlen] = size(M);
if length(NUM_ATOMS_LIST) ~= xlen || length(SCATTERING_LENGTH_RANGE) ~= ylen
error('Matrix dimensions do not match axis lengths.');
end
% Create figure
fig = figure('Name', 'Manual Phase Diagram Editor', ...
'NumberTitle', 'off', ...
'KeyPressFcn', @keyCallback);
fig.WindowState = 'maximized';
clf
set(gcf,'Position', [100, 100, 1600, 900])
hImg = imagesc(M);
set(gca, 'YDir', 'normal');
colormap(parula);
colorbar;
axis equal tight;
xticks(1:xlen);
yticks(1:ylen);
xticklabels(string(NUM_ATOMS_LIST));
yticklabels(string(SCATTERING_LENGTH_RANGE));
xlabel('Number of Atoms');
ylabel('Scattering Length (a₀)');
grid on;
title('Click a cell to modify value. Press "q" to quit.');
set(fig, 'WindowButtonDownFcn', @clickCallback);
uiwait(fig); % Wait until user quits
% Prompt for saving
[filename, pathname] = uiputfile('edited_phase_diagram.mat', 'Save Edited Matrix As');
if ischar(filename)
save(fullfile(pathname, filename), 'M', 'SCATTERING_LENGTH_RANGE', 'NUM_ATOMS_LIST');
disp(['Matrix saved to ' fullfile(pathname, filename)]);
end
% Callback: Mouse click to edit value
function clickCallback(~, ~)
C = get(gca, 'CurrentPoint');
col = round(C(1,1));
row = round(C(1,2));
if row >= 1 && row <= ylen && col >= 1 && col <= xlen
prompt = sprintf('Enter new value for a = %.2f, N = %d:', ...
SCATTERING_LENGTH_RANGE(row), NUM_ATOMS_LIST(col));
answer = inputdlg(prompt, 'Edit Cell Value', 1, {num2str(M(row,col))});
if ~isempty(answer)
val = str2double(answer{1});
if ~isnan(val)
M(row, col) = val;
refreshDisplay();
else
warndlg('Invalid input. Please enter a numeric value.', 'Invalid Input');
end
end
end
end
% Callback: Quit on 'q'
function keyCallback(~, event)
if strcmp(event.Key, 'q')
uiresume(fig);
close(fig);
end
end
% Update image
function refreshDisplay()
set(hImg, 'CData', M);
drawnow;
end
end