From 0ddc8bda009776df03dbc9956b19f4717beb3a69 Mon Sep 17 00:00:00 2001 From: Karthik Chandrashekara Date: Tue, 10 Jun 2025 18:44:21 +0200 Subject: [PATCH] Added way to match TF radii by matching atom number in addition to scaling magnification --- Data-Analyzer/matchTFRadiiAtomNumber.m | 163 ++++++++++++++++++ ...hTFRadii.m => matchTFRadiiMagnification.m} | 0 2 files changed, 163 insertions(+) create mode 100644 Data-Analyzer/matchTFRadiiAtomNumber.m rename Data-Analyzer/{matchTFRadii.m => matchTFRadiiMagnification.m} (100%) diff --git a/Data-Analyzer/matchTFRadiiAtomNumber.m b/Data-Analyzer/matchTFRadiiAtomNumber.m new file mode 100644 index 0000000..871d1f4 --- /dev/null +++ b/Data-Analyzer/matchTFRadiiAtomNumber.m @@ -0,0 +1,163 @@ +% ---------------------------- +% Experimental data +% ---------------------------- +PixelSize = 4.6; % microns + +TF_Radii_X_pixels = [48.44308968, 46.01326593, 46.45950681, 46.41644117, 45.56176919, ... + 46.60816438, 46.85307478, 47.61086543, 46.66687703, 46.17986721, ... + 46.67877165, 46.07789481, 46.42285497, 46.22167708, 45.95144492, ... + 47.05400117, 49.03005788, 45.84588659, 46.85742777, 45.9824117 , ... + 47.14731188, 47.4984484 , 45.9055646 , 47.31804553, 47.52321888, ... + 47.76823968, 46.459749 , 45.4498851 , 45.38339308, 46.68736642, ... + 45.76607233, 48.1796053 , 46.94291541, 47.54092708, 48.26130406, ... + 47.44092616, 48.73463214, 46.39356452, 48.74120217, 45.57014182, ... + 47.56467835, 46.62867035, 46.62322802, 46.03032919, 44.78559832, ... + 46.31282562, 46.83537518, 47.68015029, 47.71093571, 47.34079816]; + +TF_Radii_Y_pixels = [113.52610841, 113.68862761, 112.84031747, 114.22062324, ... + 112.45378285, 114.53863928, 111.39181472, 112.67024271, ... + 113.65387448, 113.57576769, 110.22576589, 110.45091803, ... + 109.97966067, 112.84785553, 109.3836049 , 111.22290862, ... + 111.17028727, 110.71088554, 111.72973603, 112.39623635, ... + 113.18160954, 112.00016346, 109.66542778, 111.98705097, ... + 112.35983901, 110.21703075, 112.14565939, 111.2029942 , ... + 110.74296 , 112.56607054, 112.58015318, 111.93031032, ... + 111.59774288, 112.30723266, 112.79543793, 111.08288891, ... + 113.85269603, 111.77349741, 113.58639434, 111.28694353, ... + 112.1993445 , 111.72215918, 111.93271101, 112.17593036, ... + 110.82246602, 113.61806907, 114.13693144, 114.27245731, ... + 114.24223538, 112.61704196]; + +% ---------------------------- +% Load simulation data for fitting +% ---------------------------- +% baseDir = 'D:\Results - Numerics\Data_Full3D\PhaseDiagram\TFRadii\LowN'; +baseDir = 'C:\Users\Karthik\Documents\GitRepositories\Calculations\Estimations\ThomasFermiRadius'; +refData = load(fullfile(baseDir, 'TFFermi_Theta0.mat')); + +% ---------------------------- +% Set fixed magnification and convert experimental TF radii to real units +% ---------------------------- +Magnification = 24; % Set your desired fixed magnification here +fprintf('Using fixed magnification: %.2f\n', Magnification); + +TF_Radii_X_Real = TF_Radii_X_pixels * PixelSize / Magnification; +TF_Radii_Y_Real = TF_Radii_Y_pixels * PixelSize / Magnification; + +Avg_X = mean(TF_Radii_X_Real); +Avg_Y = mean(TF_Radii_Y_Real); +Std_X = std(TF_Radii_X_Real); +Std_Y = std(TF_Radii_Y_Real); + +fprintf('Experimental TF Radius X = %.2f ± %.2f µm\n', Avg_X, Std_X); +fprintf('Experimental TF Radius Y = %.2f ± %.2f µm\n', Avg_Y, Std_Y); + +% ---------------------------- +% Fit atom number to match experimental radii +% ---------------------------- +if ndims(refData.TF_Radii) > 2 + TF_Radii = squeeze(refData.TF_Radii); +else + TF_Radii = refData.TF_Radii; +end + +NUM_ATOMS_LIST = refData.NUM_ATOMS_LIST; + +errorFunc = @(N) ... + (interp1(NUM_ATOMS_LIST, TF_Radii(:,1), N) - Avg_X)^2 + ... + (interp1(NUM_ATOMS_LIST, TF_Radii(:,2), N) - Avg_Y)^2; + +AtomNumberFit = fminbnd(errorFunc, min(NUM_ATOMS_LIST), max(NUM_ATOMS_LIST)); +fprintf('Best-fit atom number (fixed magnification): %.0f\n', AtomNumberFit); + +TF_X_target = interp1(NUM_ATOMS_LIST, TF_Radii(:,1), AtomNumberFit); +TF_Y_target = interp1(NUM_ATOMS_LIST, TF_Radii(:,2), AtomNumberFit); +fprintf('TF_X_target = %.2f µm\n', TF_X_target); +fprintf('TF_Y_target = %.2f µm\n', TF_Y_target); + +% ---------------------------- +% Convert to real space and get stats +% ---------------------------- +TF_Radii_X_Real = TF_Radii_X_pixels * PixelSize / Magnification; +TF_Radii_Y_Real = TF_Radii_Y_pixels * PixelSize / Magnification; + +Avg_X = mean(TF_Radii_X_Real); +Avg_Y = mean(TF_Radii_Y_Real); +Std_X = std(TF_Radii_X_Real); +Std_Y = std(TF_Radii_Y_Real); + +fprintf('TF Radius X = %.2f ± %.2f µm\n', Avg_X, Std_X); +fprintf('TF Radius Y = %.2f ± %.2f µm\n', Avg_Y, Std_Y); + +% ---------------------------- +% Plotting +% ---------------------------- +fileList = {'TFFermi_Theta0.mat'}; +thetaLabels = {'\theta = 0^\circ', '\theta = 20^\circ', '\theta = 40^\circ'}; + +fig = figure(1); clf; +set(gcf,'Position', [100, 100, 1200, 500]) +t = tiledlayout(1, 2, 'TileSpacing', 'compact', 'Padding', 'compact'); +colors = lines(length(fileList)); +legendEntries = cell(1, length(fileList)); + +for j = 1:length(fileList) + data = load(fullfile(baseDir, fileList{j})); + + aS = data.SCATTERING_LENGTH_RANGE; + NUM_ATOMS_LIST = data.NUM_ATOMS_LIST; + if ndims(data.TF_Radii) > 2 + TF_Radii = squeeze(data.TF_Radii); + else + TF_Radii = data.TF_Radii; + end + + legendEntries{j} = sprintf('%s, a_s = %.2f a_0', thetaLabels{j}, aS); + + % Rx + nexttile(1); + plot(NUM_ATOMS_LIST, TF_Radii(:,1), '-', ... + 'Color', colors(j,:), 'LineWidth', 1.5, ... + 'DisplayName', legendEntries{j}); hold on; + + % Ry + nexttile(2); + plot(NUM_ATOMS_LIST, TF_Radii(:,2), '-', ... + 'Color', colors(j,:), 'LineWidth', 1.5, ... + 'DisplayName', legendEntries{j}); hold on; +end + +% ---------------------------- +% Add experimental point w/ error bars and annotation +% ---------------------------- +% TF Radius X +nexttile(1); +errorbar(AtomNumberFit, Avg_X, Std_X, ... + 'd', 'MarkerSize', 8, 'MarkerFaceColor', [0.2 0.2 0.8], ... + 'MarkerEdgeColor', 'k', 'Color', 'k', 'LineWidth', 1.2, ... + 'DisplayName', '\theta = 0^\circ, Experimental Value'); + +% TF Radius Y +nexttile(2); +errorbar(AtomNumberFit, Avg_Y, Std_Y, ... + 'd', 'MarkerSize', 8, 'MarkerFaceColor', [0.2 0.2 0.8], ... + 'MarkerEdgeColor', 'k', 'Color', 'k', 'LineWidth', 1.2, ... + 'DisplayName', '\theta = 0^\circ, Experimental Value'); + +% ---------------------------- +% Finalize +% ---------------------------- +nexttile(1); +xlabel('Number of Atoms', 'FontSize', 16); +ylabel('TF Radius - X ($\mu$m)', 'Interpreter', 'latex', 'FontSize', 16); +legend('FontSize', 12, 'Interpreter', 'tex', 'Location', 'bestoutside'); +axis square; grid on; + +nexttile(2); +xlabel('Number of Atoms', 'FontSize', 16); +ylabel('TF Radius - Y ($\mu$m)', 'Interpreter', 'latex', 'FontSize', 16); +legend('FontSize', 12, 'Interpreter', 'tex', 'Location', 'bestoutside'); +axis square; grid on; + +sgtitle('[ \omega_x, \omega_y, \omega_z ] = 2 \pi \times [ 50, 20, 150 ] Hz', ... + 'Interpreter', 'tex', 'FontSize', 18); diff --git a/Data-Analyzer/matchTFRadii.m b/Data-Analyzer/matchTFRadiiMagnification.m similarity index 100% rename from Data-Analyzer/matchTFRadii.m rename to Data-Analyzer/matchTFRadiiMagnification.m