Files
nappMATLAB-toolbox/beamtime/nappPlot.m
T

802 lines
38 KiB
Matlab

function hdl = nappPlot(DataTable,varargin)
%nappPlot is the one-and-only function to plot PE spectra and images.
%
% nappPlotXps(FileList,tmpDataSelection)
%
% *input*
% FileList: data table
% tableSelection (optional): logical array to filter data table
% tableVariable (optional): select what to plot: image(default),'imageRoh','spectrum_countsPerSecond','spectrum_counts','spectrum_countsNorm'
% energyScale: kinetic (default) or binding, energy scale to be used for
% plots.
% mode: AllInOne (default) all spectra are plotted in one figure, images
% are plotted in one figure each; OneEach: all spectra are plotted in one
% figure each; iterations: each spectrum is plotted in one figure each
% showing the individual sequence iterations.
% plotStep, default 1: Specify the i-th iterations that should be
% plotted.
%
%
% *output*
% just a figure, with handle.
%% TODO
%
% TODO: Add averaging in image and in iteration plot
% TODO: Make code nicer (NEXAFS plotting)
% Define conditions and defaults of input
defaultTableVariable = 'image';
expectedTableVariable = {'image','imageRoh','spectrum_countsPerSecond','spectrum_counts','spectrum_countsNorm'};
defaultMode = 'AllInOne';
expectedMode = {'AllInOne','OneEach','iterations','AugerMeitner','interactive'};
defaultFigureMode = 'screen';
expectedFigureMode = {'screen','powerpoint','word'};
defaultEnergyScale = 'kinetic';
expectedEnergyScale = {'kinetic','binding','xRay','sweeps'};
defaultTableSelection = true(size(DataTable,1),1);
defaultPlotStep = 1;
% Parse input
p = inputParser;
addRequired(p,'DataTable',@istable);
addOptional(p,'tableSelection',defaultTableSelection,@islogical);
addParameter(p,'tableVariable',defaultTableVariable,...
@(x) any(validatestring(x,expectedTableVariable)));
addParameter(p,'mode',defaultMode,...
@(x) any(validatestring(x,expectedMode)));
addParameter(p,'figureMode',defaultFigureMode,...
@(x) any(validatestring(x,expectedFigureMode)));
addParameter(p,'energyScale',defaultEnergyScale,...
@(x) any(validatestring(x,expectedEnergyScale)));
addParameter(p,'plotStep',defaultPlotStep);
addParameter(p,'AugerMeitnerEnergies',@isnumeric)
parse(p,DataTable,varargin{:});
if ~all(cell2mat(cellfun(@size,p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable),'UniformOutput',false)),'all')
disp('The table variable appears to be empty. I quit now')
error('The table variable appears to be empty.')
end
% make figure, with options for output.
if contains(p.Results.figureMode ,'screen') % standard
alw = get(groot,'DefaultAxesLineWidth');
fsz = get(groot,'DefaultAxesFontSize');
lw = 2; %get(groot,'DefaultLineLineWidth');
fnt = get(groot,'DefaultAxesFontName');
loc = 'northeastoutside';
unt = 'pixels';
pos = [20 100 800 500];
elseif contains(p.Results.figureMode,'powerpoint')
alw = 2;
fsz = 26;
lw = 4;
fnt = 'Helvetica Neue';
loc = 'northeastoutside';
unt = 'pixels';
pos = [300 200 1280 720];
elseif contains(p.Results.figureMode,'word')
alw = 0.75;
fsz = 10;
lw = 0.5;
fnt = 'Helvetica Neue';
loc = 'southoutside';
unt = 'centimeters';
pos = [8 10 8 10];
end
if matches(p.Results.mode,'AugerMeitner')
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
if endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'h5')
hdl = figure('Name',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'units', unt,'Position',pos);
if size(p.Results.AugerMeitnerEnergies) >= 7
tmp_color = colormap(parula(size(p.Results.AugerMeitnerEnergies,2)));
else
tmp_color = colormap(lines(size(p.Results.AugerMeitnerEnergies,2)));
end
% Create axes
hold(gca,'on');
for ij = 1:size(p.Results.AugerMeitnerEnergies,2)
% find x-ray energy in data
tmpXrayEnergy = find(p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii} >= p.Results.AugerMeitnerEnergies(ij),1);
hplot= plot( p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}, ...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(:,tmpXrayEnergy));
hplot.LineWidth = lw;
hold on
end
xlabel('Auger-Meitner electron energy [eV]')
hYLabel = ylabel('Counts per dwell time');
legend(string(p.Results.AugerMeitnerEnergies))
end
end
end
if matches(p.Results.tableVariable,'image') && matches(p.Results.mode,'interactive')
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
if endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'h5') % let's do NEXAFS first.
hdl = figure('Name',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'units', unt,'Position',[20 100 1000 800]);
tld = tiledlayout(2,2);
tld.TileSpacing = 'compact';
tld.Padding = 'compact';
% image
ax1= nexttile;
img_handle = image(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},'Parent',ax1,'CDataMapping','scaled');
axis(gca,'ij');
set(gca,'Layer','top');
ylim([1 size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},1)]);
xlim([1 size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)]);
hXLabel = xlabel('# Photon energy, column number');
hYLabel = ylabel('# Auger energy, column number');
box(gca,'on');
set( gca, ...
'FontName' , fnt,'FontSize' , fsz );
set([hXLabel, hYLabel], ...
'FontName' , fnt);
set([hXLabel, hYLabel] , ...
'FontSize' , fsz );
set(gca, ...
'Box' , 'off' , ...
'TickDir' , 'out' , ...
'TickLength' , [.02 .02] , ...
'XMinorTick' , 'on' , ...
'YMinorTick' , 'off' , ...
'XGrid' , 'on' , ...
'XColor' , [0 0 0], ...
'YColor' , [0 0 0], ...
'LineWidth' , alw );
hdl.Pointer = 'crosshair';
ij= 1;
ik=1;
% Auger-Meitner
ax2 = nexttile;
hplot= plot(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(:,ij), p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii});
hplot.LineWidth = lw;
hold on
ylabel('A-M e energy [eV]')
xlabel('Counts per dwell time');
ax2.YDir = 'reverse';
box(ax2,'on');
set( ax2, ...
'FontName' , fnt,'FontSize' , fsz );
set([hXLabel, hYLabel], ...
'FontName' , fnt);
set([hXLabel, hYLabel] , ...
'FontSize' , fsz );
set(ax2, ...
'Box' , 'off' , ...
'TickDir' , 'out' , ...
'TickLength' , [.02 .02] , ...
'XMinorTick' , 'on' , ...
'YMinorTick' , 'off' , ...
'XGrid' , 'on' , ...
'XColor' , [0 0 0], ...
'YColor' , [0 0 0], ...
'LineWidth' , alw );
% NEXAFS
ax3 = nexttile;
hplot2= plot( p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}, ...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(ik,:));
hplot2.LineWidth = lw;
hold on
xlabel('xray energy [eV]')
hYLabel = ylabel('Counts per dwell time');
box(ax3,'on');
set( ax3, ...
'FontName' , fnt,'FontSize' , fsz );
set([hXLabel, hYLabel], ...
'FontName' , fnt);
set([hXLabel, hYLabel] , ...
'FontSize' , fsz );
set(ax3, ...
'Box' , 'off' , ...
'TickDir' , 'out' , ...
'TickLength' , [.02 .02] , ...
'XMinorTick' , 'on' , ...
'YMinorTick' , 'off' , ...
'XGrid' , 'on' , ...
'XColor' , [0 0 0], ...
'YColor' , [0 0 0], ...
'LineWidth' , alw );
if ~matches(p.Results.figureMode,'word')
title(tld,p.Results.DataTable(p.Results.tableSelection,:).name{ii},'Interpreter','none')
end
% % NOW set up datacursor - after all axes are created
dcm = datacursormode(hdl);
set(dcm, 'UpdateFcn', {@updatePlots, p.Results, ii, ax2, ax3, hplot, hplot2});
set(dcm, 'Enable', 'on');
set(dcm, 'SnapToDataVertex', 'off'); % Allows smooth mouse tracking
set(dcm, 'DisplayStyle', 'window'); % or 'datatip' for tooltip style
% Enable continuous update on mouse move
set(hdl, 'WindowButtonMotionFcn', {@mouseMoveFcn, dcm, p.Results, ii, ax2, ax3, hplot, hplot2, ax1});
end
end
end
if matches(p.Results.tableVariable,'image') && ~matches(p.Results.mode,'AugerMeitner') && ~matches(p.Results.mode,'interactive')
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
if endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'h5') % let's do NEXAFS first.
hdl = figure('Name',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'units', unt,'Position',pos);
% Create axes
hold(gca,'on');
if matches(p.Results.energyScale,'sweep')
image(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},'Parent',gca,'CDataMapping','scaled');
axis(gca,'ij');
set(gca,'Layer','top');
ylim([1 size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},1)]);
xlim([1 size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)]);
hXLabel = xlabel('# Photon energy, column number');
hYLabel = ylabel('# Auger energy, column number');
else
% Try to plot image with x and y
try
% interpolate, to have equal x spacing for image plot
Xq = p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}(1):0.1:p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}(end);
Vq = interp2(p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii},p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii},...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},Xq,p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii});
image(Xq,p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii},...
Vq,'Parent',gca,'CDataMapping','scaled');
axis(gca,'ij');
set(gca,'Layer','top');
xlim([p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}(1) p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}(end)]);
ylim([p.Results.DataTable(p.Results.tableSelection,:).scientaEkinRange_eV(ii,1) p.Results.DataTable(p.Results.tableSelection,:).scientaEkinRange_eV(ii,2)]);
hXLabel = xlabel('Photon energy [eV]');
hYLabel = ylabel('Auger energy [eV]');
% if this does not work, plot without scaling (just with row and column numbers)
catch
image(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},'Parent',gca,'CDataMapping','scaled');
axis(gca,'ij');
set(gca,'Layer','top');
ylim([1 size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},1)]);
xlim([1 size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)]);
hXLabel = xlabel('# Photon energy, column number');
hYLabel = ylabel('# Auger energy, column number');
end
end
box(gca,'on');
if ~matches(p.Results.figureMode,'word')
title(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'Interpreter','none')
end
set( gca, ...
'FontName' , fnt,'FontSize' , fsz );
set([hXLabel, hYLabel], ...
'FontName' , fnt);
set([hXLabel, hYLabel] , ...
'FontSize' , 1.2*fsz );
set(gca, ...
'Box' , 'off' , ...
'TickDir' , 'out' , ...
'TickLength' , [.02 .02] , ...
'XMinorTick' , 'on' , ...
'YMinorTick' , 'off' , ...
'XGrid' , 'on' , ...
'XColor' , [0 0 0], ...
'YColor' , [0 0 0], ...
'LineWidth' , alw );
elseif endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'ibw')
if contains(p.Results.energyScale,'kinetic')
hdl = figure('Name',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'units', unt,'Position',pos);
% Create axes
hold(gca,'on');
image(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii},...
1:length(1:size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)),...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}',...
'Parent',gca,'CDataMapping','scaled');
axis(gca,'ij');
set(gca,'Layer','top');
ylim([1 size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)]);
xlim([p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}(1) p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}(end)]);
hXLabel = xlabel('Electron energy [eV]');
hYLabel = ylabel('Sequence iteration');
elseif contains(p.Results.energyScale,'binding')
hdl = figure('Name',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'units', unt,'Position',pos);
% Create axes
hold(gca,'on');
image(p.Results.DataTable(p.Results.tableSelection,:).bindingEnergy_eV{ii},...
1:length(1:size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)),...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}',...
'Parent',gca,'CDataMapping','scaled');
axis(gca,'ij');
set(gca,'Layer','top');
ylim([1 size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)]);
% xlim([p.Results.DataTable(p.Results.tableSelection,:).bindingEnergy_eV(ii,1) p.Results.DataTable(p.Results.tableSelection,:).bindingEnergy_eV(ii,2)]);
hXLabel = xlabel('Binding energy [eV]');
hYLabel = ylabel('Sequence iteration');
end
box(gca,'on');
existColumn = strcmp('sample',p.Results.DataTable.Properties.VariableNames);
if ~matches(p.Results.figureMode,'word')
if ~any(existColumn)
title([{p.Results.DataTable(p.Results.tableSelection,:).name{ii} p.Results.DataTable(p.Results.tableSelection,:).lastModifiedDatestr{ii}}],'Interpreter','none')
else
title([{p.Results.DataTable(p.Results.tableSelection,:).name{ii} p.Results.DataTable(p.Results.tableSelection,:).sample{ii} p.Results.DataTable(p.Results.tableSelection,:).lastModifiedDatestr{ii}}] ,'Interpreter','none')
end
end
set( gca, ...
'FontName' , fnt,'FontSize' , fsz );
set([hXLabel, hYLabel], ...
'FontName' , fnt);
set([hXLabel, hYLabel] , ...
'FontSize' , 1.2*fsz );
set(gca, ...
'Box' , 'off' , ...
'TickDir' , 'out' , ...
'TickLength' , [.02 .02] , ...
'XMinorTick' , 'on' , ...
'YMinorTick' , 'off' , ...
'XGrid' , 'on' , ...
'XColor' , [0 0 0], ...
'YColor' , [0 0 0], ...
'LineWidth' , alw );
end
end
end
if matches(p.Results.tableVariable,'imageRoh')
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
if endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'h5') % let's do NEXAFS first.
hdl = figure('Name',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'units', unt,'Position',pos);
% Create axes
hold(gca,'on');
% Try to plot image with x and y
try
image(p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii},p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii},...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},'Parent',gca,'CDataMapping','scaled');
axis(gca,'ij');
set(gca,'Layer','top');
xlim([p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}(1) p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}(end)]);
ylim([p.Results.DataTable(p.Results.tableSelection,:).scientaEkinRange_eV(ii,1) p.Results.DataTable(p.Results.tableSelection,:).scientaEkinRange_eV(ii,2)]);
hXLabel = xlabel('Photon energy [eV]');
hYLabel = ylabel('Auger energy [eV]');
% if this does not work, plot without scaling (just with row and column numbers)
catch
image(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},'Parent',gca,'CDataMapping','scaled');
axis(gca,'ij');
set(gca,'Layer','top');
ylim([1 size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},1)]);
xlim([1 size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)]);
hXLabel = xlabel('# Photon energy, column number');
hYLabel = ylabel('# Auger energy, column number');
end
box(gca,'on');
set( gca, ...
'FontName' , fnt,'FontSize' , fsz );
set([hXLabel, hYLabel], ...
'FontName' , fnt);
set([hXLabel, hYLabel] , ...
'FontSize' , 1.2*fsz );
set(gca, ...
'Box' , 'off' , ...
'TickDir' , 'out' , ...
'TickLength' , [.02 .02] , ...
'XMinorTick' , 'on' , ...
'YMinorTick' , 'off' , ...
'XGrid' , 'on' , ...
'XColor' , [0 0 0], ...
'YColor' , [0 0 0], ...
'LineWidth' , alw );
elseif endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'ibw')
if contains(p.Results.energyScale,'kinetic')
hdl = figure('Name',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'units', unt,'Position',pos);
% Create axes
hold(gca,'on');
existColumn = strcmp('scientaEkinRoh_eV',DataTable.Properties.VariableNames);
if any(existColumn)
image(p.Results.DataTable(p.Results.tableSelection,:).scientaEkinRoh_eV{ii},...
1:length(1:size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)),...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}',...
'Parent',gca,'CDataMapping','scaled');
xlim([p.Results.DataTable(p.Results.tableSelection,:).scientaEkinRoh_eV{ii}(1) p.Results.DataTable(p.Results.tableSelection,:).scientaEkinRoh_eV{ii}(end)]);
else
image(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii},...
1:length(1:size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)),...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}',...
'Parent',gca,'CDataMapping','scaled');
xlim([p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}(1) p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}(end)]);
end
axis(gca,'ij');
set(gca,'Layer','top');
ylim([1 size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)]);
hXLabel = xlabel('Electron energy [eV]');
hYLabel = ylabel('Sequence iteration');
elseif contains(p.Results.energyScale,'binding')
hdl = figure('Name',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'units', unt,'Position',pos);
% Create axes
hold(gca,'on');
image(p.Results.DataTable(p.Results.tableSelection,:).bindingEnergy_eV{ii},...
1:length(1:size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)),...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}',...
'Parent',gca,'CDataMapping','scaled');
axis(gca,'ij');
set(gca,'Layer','top');
ylim([1 size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)]);
% xlim([p.Results.DataTable(p.Results.tableSelection,:).bindingEnergy_eV(ii,1) p.Results.DataTable(p.Results.tableSelection,:).bindingEnergy_eV(ii,2)]);
hXLabel = xlabel('Binding energy [eV]');
hYLabel = ylabel('Sequence iteration');
end
box(gca,'on');
existColumn = strcmp('sample',p.Results.DataTable.Properties.VariableNames);
if ~matches(p.Results.figureMode,'word')
if ~any(existColumn)
title([{p.Results.DataTable(p.Results.tableSelection,:).name{ii} p.Results.DataTable(p.Results.tableSelection,:).lastModifiedDatestr{ii}}],'Interpreter','none')
else
title([{p.Results.DataTable(p.Results.tableSelection,:).name{ii} p.Results.DataTable(p.Results.tableSelection,:).sample{ii} p.Results.DataTable(p.Results.tableSelection,:).lastModifiedDatestr{ii}}] ,'Interpreter','none')
end
end
set( gca, ...
'FontName' , fnt,'FontSize' , fsz );
set([hXLabel, hYLabel], ...
'FontName' , fnt);
set([hXLabel, hYLabel] , ...
'FontSize' , 1.2*fsz );
set(gca, ...
'Box' , 'off' , ...
'TickDir' , 'out' , ...
'TickLength' , [.02 .02] , ...
'XMinorTick' , 'on' , ...
'YMinorTick' , 'off' , ...
'XGrid' , 'on' , ...
'XColor' , [0 0 0], ...
'YColor' , [0 0 0], ...
'LineWidth' , alw );
end
end
end
if contains(p.Results.tableVariable,'spectrum')
if contains(p.Results.mode,'OneEach')
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
hdl = figure('Name',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'units', unt,'Position',pos);
% Create axes
hold(gca,'on');
if (contains(p.Results.energyScale,'kinetic') & (endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'ibw') | endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'xy')))
hplot = plot(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii},...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}');
hplot.LineWidth = lw;
hXLabel = xlabel('Electron kinetic energy [eV]');
xlim([p.Results.DataTable(p.Results.tableSelection,:).scientaEkinRange_eV(ii,1) p.Results.DataTable(p.Results.tableSelection,:).scientaEkinRange_eV(ii,2)]);
elseif (contains(p.Results.energyScale,'binding') & (endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'ibw')| endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'xy')))
hplot = plot(p.Results.DataTable(p.Results.tableSelection,:).bindingEnergy_eV{ii},...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}');
hplot.LineWidth = lw;
hXLabel= xlabel('Binding energy [eV]');
xlim([min(p.Results.DataTable(p.Results.tableSelection,:).bindingEnergy_eV{ii}) max(p.Results.DataTable(p.Results.tableSelection,:).bindingEnergy_eV{ii})]);
elseif (contains(p.Results.energyScale,'xRay') | endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'h5'))
hplot = plot(p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii},...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii});
hplot.LineWidth = lw;
hXLabel = xlabel('Photon Energy eV');
xlim([p.Results.DataTable(p.Results.tableSelection,:).xRayEkinRange_eV(ii,1) p.Results.DataTable(p.Results.tableSelection,:).xRayEkinRange_eV(ii,2)]);
end
if contains(p.Results.tableVariable,'Norm')
hYLabel = ylabel('Counts [arb. unit]');
elseif contains(p.Results.energyScale,'xRay')
hYLabel = ylabel('partial A-M.E.Y.');
else
hYLabel = ylabel('Counts per second');
end
box(gca,'on');
existColumn = strcmp('sample',p.Results.DataTable.Properties.VariableNames);
if ~matches(p.Results.figureMode,'word')
if ~any(existColumn)
title([{p.Results.DataTable(p.Results.tableSelection,:).name{ii} p.Results.DataTable(p.Results.tableSelection,:).lastModifiedDatestr{ii}}],'Interpreter','none')
else
try
title([{p.Results.DataTable(p.Results.tableSelection,:).name{ii} p.Results.DataTable(p.Results.tableSelection,:).sample{ii} p.Results.DataTable(p.Results.tableSelection,:).lastModifiedDatestr{ii}}] ,'Interpreter','none')
catch
title([{p.Results.DataTable(p.Results.tableSelection,:).name{ii} p.Results.DataTable(p.Results.tableSelection,:).sample{ii}}] ,'Interpreter','none')
end
end
end
set( gca, ...
'FontName' , fnt,'FontSize' , fsz );
set([hXLabel, hYLabel], ...
'FontName' , fnt);
set([hXLabel, hYLabel] , ...
'FontSize' , 1.2*fsz );
set(gca, ...
'Box' , 'off' , ...
'TickDir' , 'out' , ...
'TickLength' , [.02 .02] , ...
'XMinorTick' , 'on' , ...
'YMinorTick' , 'off' , ...
'XGrid' , 'on' , ...
'XColor' , [0 0 0], ...
'YColor' , [0 0 0], ...
'LineWidth' , alw );
end
end
if contains(p.Results.mode,'AllInOne')
% generate colormap
hdl = figure('Name','AllInOneSpectrum','units', unt,'Position',pos);
if size(p.Results.DataTable(p.Results.tableSelection,:),1) >= 7
tmp_color = colormap(parula(size(p.Results.DataTable(p.Results.tableSelection,:),1)));
else
tmp_color = colormap(lines(size(p.Results.DataTable(p.Results.tableSelection,:),1)));
end
if contains(p.Results.energyScale,'kinetic')
% axes('Parent',gcf,'XDir','reverse')
hold(gca,'on');
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
if (endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'ibw') | endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'xy'))
hplot = plot(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii},...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}','DisplayName',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'Color',tmp_color(ii,:));
hplot.LineWidth = lw;
end
end
hXLabel = xlabel('Electron kinetic energy [eV]');
elseif contains(p.Results.energyScale,'binding')
axes('Parent',gcf,'XDir','reverse')
hold(gca,'on');
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
if (endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'ibw') | endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'xy'))
hplot = plot(p.Results.DataTable(p.Results.tableSelection,:).bindingEnergy_eV{ii},...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}','DisplayName',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'Color',tmp_color(ii,:));
hplot.LineWidth = lw;
end
end
hXLabel= xlabel('Binding energy [eV]');
elseif contains(p.Results.energyScale,'xRay')
hold(gca,'on');
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
if endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'h5')
hplot = plot(p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii},...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},...
'DisplayName',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'Color',tmp_color(ii,:));
hplot.LineWidth = lw;
end
end
hXLabel = xlabel('Photon Energy eV');
end
if contains(p.Results.tableVariable,'Norm')
hYLabel = ylabel('Counts [arb. unit]');
elseif contains(p.Results.energyScale,'xRay')
hYLabel = ylabel('partial A-M.E.Y.');
else
hYLabel = ylabel('Counts per second');
end
box(gca,'on');
if ~matches(p.Results.figureMode,'word')
title('PE Spectra','Interpreter','none')
hlegend = legend(p.Results.DataTable(p.Results.tableSelection,:).name{:});
hlegend.FontSize = fsz;
hlegend.Interpreter = 'none';
hlegend.Location = loc;
set(legend, 'Interpreter','none')
end
set( gca, ...
'FontName' , fnt,'FontSize' , fsz );
set([hXLabel, hYLabel], ...
'FontName' , fnt);
set([hXLabel, hYLabel] , ...
'FontSize' , 1.2*fsz );
set(gca, ...
'Box' , 'off' , ...
'TickDir' , 'out' , ...
'TickLength' , [.02 .02] , ...
'XMinorTick' , 'on' , ...
'YMinorTick' , 'off' , ...
'XGrid' , 'on' , ...
'XColor' , [0 0 0], ...
'YColor' , [0 0 0], ...
'LineWidth' , alw );
end
end
if contains(p.Results.mode,'iterations')
% generate colormap
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
if endsWith(p.Results.DataTable(p.Results.tableSelection,:).name{ii},'ibw')
hdl = figure('Name',p.Results.DataTable(p.Results.tableSelection,:).name{ii},'units', unt,'Position',pos);
if size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2) >= 7
tmp_color = colormap(parula(size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)));
else
tmp_color = colormap(lines(size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)));
end
% Create axes
hold(gca,'on');
if contains(p.Results.energyScale,'kinetic')
for ij = 1:p.Results.plotStep:size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)
hplot= plot(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}',...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(:,ij),'Color',tmp_color(ij,:));
hplot.LineWidth = lw;
hold on
end
xlabel('Electron kinetic energy [eV]')
elseif contains(p.Results.energyScale,'binding')
%axes('Parent',gcf,'XDir','reverse')
for ij = 1:p.Results.plotStep:size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)
hplot = plot(p.Results.DataTable(p.Results.tableSelection,:).bindingEnergy_eV{ii}',...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(:,ij),'Color',tmp_color(ii,:));
hplot.LineWidth = lw;
end
hXLabel = xlabel('Binding energy [eV]');
end
if contains(p.Results.tableVariable,'Norm')
hYLabel = ylabel('Counts [arb. unit]');
else
hYLabel = ylabel('Counts per second');
end
box(gca,'on');
if ~matches(p.Results.figureMode,'word')
title([{p.Results.DataTable(p.Results.tableSelection,:).name{ii} p.Results.DataTable(p.Results.tableSelection,:).sample{ii} p.Results.DataTable(p.Results.tableSelection,:).lastModifiedDatestr{ii}}] ,'Interpreter','none')
end
set( gca, ...
'FontName' , fnt,'FontSize' , fsz );
set([hXLabel, hYLabel], ...
'FontName' , fnt);
set([hXLabel, hYLabel] , ...
'FontSize' , 1.2*fsz );
set(gca, ...
'Box' , 'off' , ...
'TickDir' , 'out' , ...
'TickLength' , [.02 .02] , ...
'XMinorTick' , 'on' , ...
'YMinorTick' , 'off' , ...
'XGrid' , 'on' , ...
'XColor' , [0 0 0], ...
'YColor' , [0 0 0], ...
'LineWidth' , alw );
end
end
end
% Nested callback function
% function txt = updatePlots(~, event_obj, pResults, ii, ax2, ax3, hplot2, hplot3)
% pos = get(event_obj, 'Position');
% ij = round(pos(1));
% ik = round(pos(2));
%
% set(hplot2, 'XData', pResults.DataTable(pResults.tableSelection,:).(pResults.tableVariable){ii}(:,ij));
% title(ax2, sprintf('Auger-Meitner (X index = %d)', ij));
%
% set(hplot3, 'YData', pResults.DataTable(pResults.tableSelection,:).(pResults.tableVariable){ii}(ik,:));
% title(ax3, sprintf('NEXAFS (Y index = %d)', ik));
%
% % Create custom datatip text showing coordinates
% txt = {sprintf('X index: %d', ij), ...
% sprintf('Y index: %d', ik), ...
% sprintf('Intensity: %.2f', dataMatrix(ik, ij))};
% end
function mouseMoveFcn(~, ~, dcm, pResults, ii, ax2, ax3, hplot2, hplot3, ax1)
% Check if mouse is over the image axes
if gca == ax1
% Get current mouse position
cp = get(ax1, 'CurrentPoint');
ij = round(cp(1, 1)); % X index
ik = round(cp(1, 2)); % Y index
% Get the data matrix
dataMatrix = pResults.DataTable(pResults.tableSelection,:).(pResults.tableVariable){ii};
% Ensure indices are within bounds
[nRows, nCols] = size(dataMatrix);
if ij >= 1 && ij <= nCols && ik >= 1 && ik <= nRows
% Update plots
set(hplot2, 'XData', dataMatrix(:, ij));
title(ax2, sprintf('Auger-Meitner (X index = %d)', ij));
set(hplot3, 'YData', dataMatrix(ik, :));
title(ax3, sprintf('NEXAFS (Y index = %d)', ik));
end
end
end
% Datatip callback - shows info
function txt = updatePlots(~, event_obj, pResults, ii, ax2, ax3, hplot2, hplot3)
try
pos = get(event_obj, 'Position');
ij = round(pos(1));
ik = round(pos(2));
dataMatrix = pResults.DataTable(pResults.tableSelection,:).(pResults.tableVariable){ii};
[nRows, nCols] = size(dataMatrix);
ij = max(1, min(ij, nCols));
ik = max(1, min(ik, nRows));
txt = {sprintf('X: %d', ij), ...
sprintf('Y: %d', ik), ...
sprintf('Intensity: %.2f', dataMatrix(ik, ij))};
catch
pos = get(event_obj, 'Position');
txt = {sprintf('X: %.1f', pos(1)), ...
sprintf('Y: %.1f', pos(2))};
end
end
end