305 lines
14 KiB
Matlab
305 lines
14 KiB
Matlab
%% Generate Spectra
|
||
%
|
||
% Here we plot all spectra and all regions to confirm that we get what we
|
||
% need.
|
||
%
|
||
% This file shows some typical out-of-the-box examples.
|
||
|
||
%% Start fresh
|
||
clc
|
||
close all
|
||
clearvars
|
||
|
||
%% Import Data
|
||
%
|
||
% This was generated by importData.m. You can either force that it runs
|
||
% again before this script runs (preferred, ensures you always have recent
|
||
% data in MATLAB's data table) or load the FileList.
|
||
run('importData.m')
|
||
% load("FileList.mat","FileList")
|
||
|
||
%% Plot a Survey
|
||
for ii = 1
|
||
%% Start fresh
|
||
close all
|
||
clc
|
||
|
||
%% Select data
|
||
|
||
% It is convenient to add date and year of the beamtime. This ensures you
|
||
% can use the code also when you work with data from several beamtimes
|
||
% (indexing of the files starts with 0 for each beamtime by default).
|
||
tmpDataSelection = month(FileList.lastModifiedDatenum) == 11 ...
|
||
& year(FileList.lastModifiedDatenum) == 2025 ...
|
||
& ~contains(FileList.sample,"(bad data)") ...
|
||
& contains(FileList.name,"Survey") ...
|
||
& (contains(FileList.name,"128"));
|
||
% Always ensure that you select the spectra you intended.
|
||
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr'}))
|
||
|
||
%% Generate spectrum and plot
|
||
FileList = nappGenerateSpectra(FileList,tmpDataSelection);
|
||
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond','mode','OneEach');
|
||
|
||
%% Add annotation to the figure
|
||
%
|
||
% In a survey, we usually want to identify all peaks. Here, based on
|
||
% binding energies from the literature and a shift, we add common regions:
|
||
%
|
||
% **Note that the binding energies are rough estimates – to use this further
|
||
% we need to confirm them and add the source/reference.**
|
||
dataObjs = findobj(gcf,'-property','YData');
|
||
tmpxShift = 7;
|
||
tmpxRayEnergy = 850;
|
||
tmpyPosition = 0.5E5;
|
||
tmpyPositionTwo = 0.8E5;
|
||
|
||
% Au peaks
|
||
%nappAnnotateSurvey(tmpxRayEnergy-57-tmpxShift,tmpyPosition-tmpyPositionTwo,dataObjs(1),'Au5p3/2');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-74-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Au5p5/2');
|
||
nappAnnotateSurvey(tmpxRayEnergy-84-tmpxShift,tmpyPosition,dataObjs(1),'Au4f7/2');
|
||
nappAnnotateSurvey(tmpxRayEnergy-88-tmpxShift,tmpyPosition-tmpyPositionTwo,dataObjs(1),'Au4f5/2');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-107-tmpxShift,tmpyPosition,dataObjs(1),'Au5s');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-335-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Au4d1/2');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-353-tmpxShift,tmpyPosition,dataObjs(1),'Au4d3/2');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-546-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Au4p3/2');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-643-tmpxShift,tmpyPosition,dataObjs(1),'Au4p1/2');
|
||
nappAnnotateSurvey(tmpxRayEnergy-762-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Au4s');
|
||
nappAnnotateSurvey(tmpxRayEnergy-8-tmpxShift,tmpyPosition,dataObjs(1),'AuVB');
|
||
|
||
% Usual suspects
|
||
nappAnnotateSurvey(tmpxRayEnergy-285-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'C1s');
|
||
nappAnnotateSurvey(tmpxRayEnergy-534-tmpxShift,tmpyPosition,dataObjs(1),'O1s');
|
||
nappAnnotateSurvey(tmpxRayEnergy-30-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'O2s');
|
||
nappAnnotateSurvey(tmpxRayEnergy-405-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'N1s');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-495-tmpxShift,tmpyPosition,dataObjs(1),'Sn3d');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-691-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'F1s');
|
||
nappAnnotateSurvey(tmpxRayEnergy-295-tmpxShift,tmpyPosition,dataObjs(1),'K2p');
|
||
nappAnnotateSurvey(tmpxRayEnergy-380-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'K2s');
|
||
nappAnnotateSurvey(tmpxRayEnergy-153-tmpxShift,tmpyPosition,dataObjs(1),'Si2s');
|
||
nappAnnotateSurvey(tmpxRayEnergy-100-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Si2p');
|
||
nappAnnotateSurvey(tmpxRayEnergy-197-tmpxShift,tmpyPosition,dataObjs(1),'Cl2p');
|
||
nappAnnotateSurvey(tmpxRayEnergy-271-tmpxShift,tmpyPosition,dataObjs(1),'Cl2s');
|
||
nappAnnotateSurvey(tmpxRayEnergy-286-tmpxShift,tmpyPosition-tmpyPositionTwo,dataObjs(1),'Sn3p');
|
||
|
||
% Clay
|
||
%nappAnnotateSurvey(tmpxRayEnergy-351-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Ca2p');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-347-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Ca2p');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-440-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Ca2s');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-34-tmpxShift,tmpyPosition+tmpyPosition,dataObjs(1),'Ca3s');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-26-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Ca3p');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-297-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'K2p');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-294-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'K2p');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-35-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'K3s');
|
||
%nappAnnotateSurvey(tmpxRayEnergy-19-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'K3p');
|
||
nappAnnotateSurvey(tmpxRayEnergy-118-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Al');
|
||
nappAnnotateSurvey(tmpxRayEnergy-72.5-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Al');
|
||
|
||
% Ar gas
|
||
nappAnnotateSurvey(tmpxRayEnergy-245-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Ar2p');
|
||
nappAnnotateSurvey(tmpxRayEnergy-323-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Ar2s');
|
||
nappAnnotateSurvey(tmpxRayEnergy-12-tmpxShift,tmpyPosition+tmpyPositionTwo,dataObjs(1),'Ar3p');
|
||
|
||
% Some Auger
|
||
nappAnnotateSurvey(363,tmpyPosition-tmpyPositionTwo,dataObjs(1),'N KLL');
|
||
nappAnnotateSurvey(203,tmpyPosition-tmpyPositionTwo,dataObjs(1),'Ar LMN');
|
||
nappAnnotateSurvey(500,tmpyPosition-tmpyPositionTwo,dataObjs(1),'O KLL');
|
||
end
|
||
|
||
%% Plot NEXAFS & Resonant Data
|
||
%
|
||
% You can plot images (raw data from SES) without generating the spectra.
|
||
% (You can also first generate the spectra, but to plot images the spectra
|
||
% are not needed.)
|
||
for ii = 1
|
||
%% Start fresh
|
||
clc; close all
|
||
|
||
%% Select data
|
||
tmpDataSelection = month(FileList.lastModifiedDatenum) == 11 ...
|
||
& year(FileList.lastModifiedDatenum) == 2025 ...
|
||
& ~contains(FileList.sample,"(bad data)") ...
|
||
& contains(FileList.name,"O_Kedge_Resonant") ...
|
||
& contains(FileList.name,"0025");
|
||
% Always ensure that you select the spectra you intended.
|
||
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr'}))
|
||
|
||
%% Plot images
|
||
|
||
% This one shows x, y in energy scales (data were interpolated).
|
||
nappPlot(FileList,tmpDataSelection,'tableVariable','image',...
|
||
'mode','OneEach');
|
||
% This one shows sweeps (original data).
|
||
nappPlot(FileList,tmpDataSelection,'tableVariable','image','energyScale','sweep');
|
||
|
||
%% Plot selected Auger-Meitner
|
||
%
|
||
% This plots the electron intensity vs. kinetic energy for chosen X-ray
|
||
% energies (directly from the image).
|
||
|
||
tmpDataSelection = month(FileList.lastModifiedDatenum) == 11 ...
|
||
& year(FileList.lastModifiedDatenum) == 2025 ...
|
||
& ~contains(FileList.sample,"(bad data)") ...
|
||
& contains(FileList.name,"O_Kedge_Resonant") ...
|
||
& contains(FileList.name,"0025");
|
||
nappPlot(FileList,tmpDataSelection,'tableVariable','image','mode','AugerMeitner','AugerMeitnerEnergies',[525,545,550]);
|
||
% It also shows an example of how the current plot can be edited manually
|
||
% after its generation by nappPlot.
|
||
hax = gca;
|
||
hax.XDir = 'reverse';
|
||
xlabel('Auger-Meitner binding energy [eV]');
|
||
|
||
%% Plot image interactive
|
||
%
|
||
% Use the mouse: click once in the image, then the Auger-Meitner and NEXAFS will
|
||
% follow the mouse position.
|
||
|
||
% Select data (Nov 2025, O_Kedge resonant, and file number 25):
|
||
tmpDataSelection = month(FileList.lastModifiedDatenum) == 11 ...
|
||
& year(FileList.lastModifiedDatenum) == 2025 ...
|
||
& ~contains(FileList.sample,"(bad data)") ...
|
||
& contains(FileList.name,"O_Kedge_Resonant") ...
|
||
& contains(FileList.name,"0025");
|
||
% Plot the selected data in an interactive figure:
|
||
nappPlot(FileList,tmpDataSelection,'tableVariable','image','mode','interactive');
|
||
|
||
%% Generate spectra and plot
|
||
|
||
FileList = nappGenerateSpectra(FileList,tmpDataSelection);
|
||
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_counts',...
|
||
'mode','OneEach');
|
||
%% arrange figures
|
||
distFig
|
||
end
|
||
|
||
%% Plot iterations
|
||
for ii = 1
|
||
%% Select your data
|
||
%
|
||
% You can change the plotStep to show fewer iterations (for example 2 for every second one).
|
||
% However, the total number of sequence iterations needs to be a multiple of
|
||
% that factor. This is nice to follow a signal with time, e.g. upon dosing.
|
||
% It requires that each sequence iteration has long enough dwell time and
|
||
% iterations to give a signal with decent S/N.
|
||
|
||
%% Select data
|
||
close all; clc
|
||
tmpDataSelection = startsWith(FileList.name, "0191191_O1s_VB_525eV");
|
||
% List the selected files in the command window.
|
||
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','scientaPassEnergy_eV'}))
|
||
|
||
%% Plot the iterations
|
||
nappPlot(FileList,tmpDataSelection,'tableVariable','image','mode','iterations','plotStep',6);
|
||
|
||
%% Modify the top figure
|
||
legend
|
||
distFig
|
||
end
|
||
|
||
%% Look at all regions
|
||
%
|
||
% To confirm you see what you expect or to change the experimental settings
|
||
% if not.
|
||
|
||
for ii = 1
|
||
%% Start fresh
|
||
close all
|
||
clc
|
||
% Filter data (select all regions of two files).
|
||
tmpDataSelection = month(FileList.lastModifiedDatenum) == 11 ...
|
||
& year(FileList.lastModifiedDatenum) == 2025 ...
|
||
& ~contains(FileList.sample,"(bad data)") ...
|
||
& ~contains(FileList.name,"Survey") ...
|
||
& ~contains(FileList.name,"Resonant") ...
|
||
& (contains(FileList.name,"146") | contains(FileList.name,"148"));
|
||
% List the selected files in the command window.
|
||
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','scientaPassEnergy_eV'}))
|
||
|
||
%% Generate spectra and plot
|
||
FileList = nappGenerateSpectra(FileList,tmpDataSelection);
|
||
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond','mode','OneEach');
|
||
distFig
|
||
%% Discussion
|
||
%
|
||
% Your observation and comments could go here
|
||
end
|
||
|
||
%% Look at one region in detail
|
||
%
|
||
% To confirm you see what you expect or to change the experimental settings
|
||
% if not.
|
||
|
||
for ii = 1
|
||
%% Start fresh
|
||
clc; close all
|
||
|
||
%% Select data
|
||
tmpDataSelection = month(FileList.lastModifiedDatenum) == 11 ...
|
||
& year(FileList.lastModifiedDatenum) == 2025 ...
|
||
& ~contains(FileList.sample,"(bad data)") ...
|
||
& ~contains(FileList.name,"Survey") ...
|
||
& ~contains(FileList.name,"Resonant") ...
|
||
& (contains(FileList.name,"Al2p") | contains(FileList.name,"Cl2p")) ...
|
||
& (contains(FileList.name,"146") | contains(FileList.name,"148"));
|
||
% List the selected files in the command window.
|
||
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr'}))
|
||
|
||
%% Plot
|
||
FileList = nappGenerateSpectra(FileList,tmpDataSelection);
|
||
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond','mode','OneEach');
|
||
|
||
%% Normalize Cl2p intensity to that of Al2p
|
||
tmpDataSelection = month(FileList.lastModifiedDatenum) == 11 ...
|
||
& year(FileList.lastModifiedDatenum) == 2025 ...
|
||
& ~contains(FileList.sample,"(bad data)") ...
|
||
& ~contains(FileList.name,"Survey") ...
|
||
& ~contains(FileList.name,"Resonant") ...
|
||
& contains(FileList.name,"Cl2p") ...
|
||
& contains(FileList.name,"146");
|
||
FileList(tmpDataSelection,:).spectrum_countsPerSecond{:} = FileList(tmpDataSelection,:).spectrum_countsPerSecond{:} .* 22335./39687;
|
||
|
||
tmpDataSelection = month(FileList.lastModifiedDatenum) == 11 ...
|
||
& year(FileList.lastModifiedDatenum) == 2025 ...
|
||
& ~contains(FileList.sample,"(bad data)") ...
|
||
& ~contains(FileList.name,"Survey") ...
|
||
& ~contains(FileList.name,"Resonant") ...
|
||
& contains(FileList.name,"Al2p") ...
|
||
& contains(FileList.name,"146");
|
||
FileList(tmpDataSelection,:).spectrum_countsPerSecond{:} = FileList(tmpDataSelection,:).spectrum_countsPerSecond{:} .* 22335./39687;
|
||
|
||
%% Align to same background
|
||
tmpDataSelection = month(FileList.lastModifiedDatenum) == 11 ...
|
||
& year(FileList.lastModifiedDatenum) == 2025 ...
|
||
& ~contains(FileList.sample,"(bad data)") ...
|
||
& ~contains(FileList.name,"Survey") ...
|
||
& ~contains(FileList.name,"Resonant") ...
|
||
& contains(FileList.name,"Cl2p") ...
|
||
& (contains(FileList.name,"146") | contains(FileList.name,"148"));
|
||
FileList = nappBackground(FileList,647,648,'tableSelection',tmpDataSelection,'energyScale','kinetic',...
|
||
'mode','mean','showFigures','off');
|
||
|
||
%% Plot again
|
||
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond','mode','AllInOne');
|
||
% Optimize figure
|
||
xlim([647 652])
|
||
ylabel("counts [norm to Al]")
|
||
legend
|
||
distFig
|
||
end
|
||
|
||
%% Plot several spectra in one figure
|
||
clc; close all
|
||
for ii = 1
|
||
close all
|
||
clc
|
||
tmpDataSelection = month(FileList.lastModifiedDatenum) == 11 ...
|
||
& year(FileList.lastModifiedDatenum) == 2025 ...
|
||
& ~contains(FileList.sample,"(bad data)") ...
|
||
& contains(FileList.name, "Cl2p")...
|
||
& ~contains(FileList.name,"Survey") ...
|
||
& contains(FileList.name,"680eV") ...
|
||
& (contains(FileList.name,"77") | contains(FileList.name,"116") | contains(FileList.name,"130") | contains(FileList.name,"132") | contains(FileList.name,"133"));
|
||
FileList = nappGenerateSpectra(FileList,tmpDataSelection);
|
||
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond','mode','AllInOne');
|
||
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','scientaRegionIterations','scientaSequenceIterations','scientaDwellTime_ms','scientaPassEnergy_eV'}))
|
||
end |