Example of 3D ARPES data: EB, kx, ky
Matlab code
clear
close
% Data file: EB, ky, kx in hdf5 format
data = h5read('CVS_FMap_200K.h5','/FMap_76eV_CN');
blackblue = customcolormap([0 0.5 1], {'#000000','#0000ff','#ffffff'});
colormap(blackblue);
vid = VideoWriter('arpes3d.mp4','MPEG-4');
vid.Quality = 100;
vid.FrameRate = 30;
open(vid);
%figure('units','pixels','position',[0 0 1920 1080]);
set(0,'defaultfigurecolor',[1 1 1]);
set(gca,'linewidth',7);
% Define borders to be trimmed which contain NaNs
trimkyLo = 11;
trimkyHi = 270;
kyRange = trimkyHi - trimkyLo + 1;
trimkxLo = 10;
trimkxHi = 337;
kxRange = trimkxHi - trimkxLo + 1;
% kykx layer corresponding to Fermi surface
trimEBhi = 872;
% -------------------------------------------------------------------------
% Scan E_B
zmax = 6*floor(size(data,1)/6);
EB1 = zmax:-3:1;
EB2 = 2:6:trimEBhi; % Only back up to Fermi surface
EB = [EB1 EB2];
for ii = EB % Move kykx-plane down through binding energies
newplot
hold off
hold on
% kykx plane contains Fermi surface data
% Trim borders which contain NaNs
kykx = mat2gray(data(ii,trimkyLo:trimkyHi,trimkxLo:trimkxHi));
% Eky plane
% Trim borders which contain NaNs
Eky = mat2gray(data(1:ii,trimkyLo:trimkyHi,trimkxLo));
% Ekx plane
% Trim borders which contain NaNs
Ekx = mat2gray(data(1:ii,trimkyLo,trimkxLo:trimkxHi));
kykx = uint8(255*kykx); % Convert to uint8 data
imgkykx = reshape(kykx,[kyRange,kxRange]); % Reshape from 3D to 2D matrix
rgbkykxImg = ind2rgb(imgkykx,blackblue); % Render it in a nice colormap
kykxXX = [0 kxRange; 0 kxRange];
kykxYY = [0 0; kyRange kyRange];
kykxZZ = [ii ii; ii ii]/2; % Division by 2 compresses EB axis
surf(kykxXX,kykxYY,kykxZZ,rgbkykxImg,'FaceColor','texturemap','EdgeColor','none');
Eky = uint8(255*Eky); % Convert to uint8 data
imgEky = (reshape(Eky, [ii,kyRange]))'; % Reshape from 3D to 2D matrix
rgbEkyImg = ind2rgb(imgEky,blackblue); % Render it in a nice colormap
EkyXX = [0 0; 0 0];
EkyYY = [0 0; kyRange kyRange];
EkyZZ = [0 ii; 0 ii]/2;
surf(EkyXX,EkyYY,EkyZZ,rgbEkyImg,'FaceColor','texturemap','EdgeColor','none');
Ekx = uint8(255*Ekx); % Convert to uint8 data
imgEkx = (reshape(Ekx, [ii,kxRange]))'; % Reshape from 3D to 2D matrix
rgbEkxImg = ind2rgb(imgEkx,blackblue); % Render it in a nice colormap
EkxXX = [0 0; kxRange kxRange];
EkxYY = [0 0; 0 0];
EkxZZ = [0 ii; 0 ii]/2;
surf(EkxXX,EkxYY,EkxZZ,rgbEkxImg,'FaceColor','texturemap','EdgeColor','none');
line([156 156], [-25,kyRange+25], [-0.1,-0.1], 'LineWidth', 1, 'Color', 'k');
line([-25 kxRange+25], [216 216], [-0.1,-0.1], 'LineWidth', 1, 'Color', 'k');
line([-1 -1], [kyRange kyRange]+1, [-0.11,960/2], 'LineWidth', 1, 'Color', 'w');
xlim([-25 kxRange+25]);
ylim([-25 kyRange+25]);
zlim([-0.11 963/2])
axis off
axis equal
xmax = size(imgkykx,2);
ymax = size(imgkykx,1);
set(gca, 'Projection','perspective');
view(-40,20)
% Store the frame
frame = getframe(gcf);
writeVideo(vid,frame);
hold off
end
% -------------------------------------------------------------------------
% Scan k_y
zmax = 6*floor(size(data,1)/6);
ky1 = 0:2:kyRange-1;
ky2 = kyRange-2:-2:0;
ky = [ky1 ky2];
for ii = ky % Move Ekx plane along ky wavevector
newplot
hold off
hold on
% kykx plane contains Fermi surface data
% Trim borders which contain NaNs and remove gradually kxky plane as
% the Ekx plane moves along the ky wavevector
% Choose kykx-plane representing FS = layer trimEBhi
kykx = mat2gray(data(trimEBhi,trimkyLo+ii:trimkyHi,trimkxLo:trimkxHi));
% Eky plane
% Trim borders which contain NaNs
Eky = mat2gray(data(1:trimEBhi,trimkyLo+ii:trimkyHi,trimkxLo));
% Ekx plane
% Trim borders which contain NaNs
Ekx = mat2gray(data(1:trimEBhi,trimkyLo+ii,trimkxLo:trimkxHi));
kykx = uint8(255*kykx); % Convert to uint8 data
imgkykx = reshape(kykx, [kyRange-ii,kxRange]); % Reshape from 3D to 2D matrix
rgbkykxImg = ind2rgb(imgkykx,blackblue); % Render it in a nice colormap
kykxXX = [0 kxRange; 0 kxRange];
kykxYY = [ii ii; kyRange kyRange];
kykxZZ = [1 1; 1 1]*trimEBhi/2;
surf(kykxXX,kykxYY,kykxZZ,rgbkykxImg,'FaceColor','texturemap','EdgeColor','none');
Eky = uint8(255*Eky); % Convert to uint8 data
imgEky = (reshape(Eky, [trimEBhi,kyRange - ii]))'; % Reshape from 3D to 2D matrix
rgbEkyImg = ind2rgb(imgEky,blackblue); % Render it in a nice colormap
EkyXX = [0 0; 0 0];
EkyYY = [ii ii; kyRange kyRange];
EkyZZ = [0 trimEBhi; 0 trimEBhi]/2;
surf(EkyXX,EkyYY,EkyZZ,rgbEkyImg,'FaceColor','texturemap','EdgeColor','none');
Ekx = uint8(255*Ekx); % Convert to uint8 data
imgEkx = (reshape(Ekx, [trimEBhi,kxRange]))'; % Reshape from 3D to 2D matrix
rgbEkxImg = ind2rgb(imgEkx,blackblue); % Render it in a nice colormap
EkxXX = [0 0; kxRange kxRange];
EkxYY = [ii ii; ii ii];
EkxZZ = [0 trimEBhi; 0 trimEBhi]/2;
surf(EkxXX,EkxYY,EkxZZ,rgbEkxImg,'FaceColor','texturemap','EdgeColor','none');
line([156 156], [-25,kyRange+25], [-0.1,-0.1], 'LineWidth', 1, 'Color', 'k');
line([-25 kxRange+25], [216 216], [-0.1,-0.1], 'LineWidth', 1, 'Color', 'k');
xlim([-25 kxRange+25]);
ylim([-25 kyRange+25]);
zlim([-0.11 963/2])
axis off;
axis equal
xmax = size(imgkykx,2);
ymax = size(imgkykx,1);
set(gca, 'Projection','perspective');
view(-40,20)
% Store the frame
frame = getframe(gcf);
writeVideo(vid,frame);
hold off
end
% -------------------------------------------------------------------------
% Scan k_x
zmax = 6*floor(size(data,1)/6);
kx1 = 0:2:kxRange-1;
kx2 = kxRange-2:-2:0;
kx = [kx1 kx2];
for ii = kx % Move Eky plane along kx wavevector
newplot
hold off
hold on
% kykx plane contains Fermi surface data
% Trim borders which contain NaNs and remove gradually kxky plane as
% the Eky plane moves along the kx wavevector
% Choose kykx-plane representing FS = layer trimEBhi
kykx = mat2gray(data(trimEBhi,trimkyLo:trimkyHi,trimkxLo+ii:trimkxHi));
% Eky plane
% Trim borders which contain NaNs
Eky = mat2gray(data(1:trimEBhi,trimkyLo:trimkyHi,trimkxLo+ii));
% Ekx plane
% Trim borders which contain NaNs
Ekx = mat2gray(data(1:trimEBhi,trimkyLo,trimkxLo+ii:trimkxHi));
kykx = uint8(255*kykx); % Convert to uint8 data
imgkykx = reshape(kykx, [kyRange,kxRange-ii]); % Reshape from 3D to 2D matrix
rgbkykxImg = ind2rgb(imgkykx,blackblue); % Render it in a nice colormap
kykxXX = [ii kxRange; ii kxRange];
kykxYY = [0 0; kyRange kyRange];
kykxZZ = [1 1; 1 1]*trimEBhi/2;
surf(kykxXX,kykxYY,kykxZZ,rgbkykxImg,'FaceColor','texturemap','EdgeColor','none');
Eky = uint8(255*Eky); % Convert to uint8 data
imgEky = (reshape(Eky, [trimEBhi,kyRange]))'; % Reshape from 3D to 2D matrix
rgbEkyImg = ind2rgb(imgEky,blackblue); % Render it in a nice colormap
EkyXX = [ii ii; ii ii];
EkyYY = [0 0; kyRange kyRange];
EkyZZ = [0 trimEBhi; 0 trimEBhi]/2;
surf(EkyXX,EkyYY,EkyZZ,rgbEkyImg,'FaceColor','texturemap','EdgeColor','none');
Ekx = uint8(255*Ekx); % Convert to uint8 data
Ekx = squeeze(Ekx);
imgEkx = (reshape(Ekx, [trimEBhi,kxRange-ii]))'; % Reshape from 3D to 2D matrix
rgbEkxImg = ind2rgb(imgEkx,blackblue); % Render it in a nice colormap
EkxXX = [ii ii; kxRange kxRange];
EkxYY = [0 0; 0 0];
EkxZZ = [0 trimEBhi; 0 trimEBhi]/2;
surf(EkxXX,EkxYY,EkxZZ,rgbEkxImg,'FaceColor','texturemap','EdgeColor','none');
line([156 156], [-25,kyRange+25], [-0.1,-0.1], 'LineWidth', 1, 'Color', 'k');
line([-25 kxRange+25], [216 216], [-0.1,-0.1], 'LineWidth', 1, 'Color', 'k');
xlim([-25 kxRange+25]);
ylim([-25 kyRange+25]);
zlim([-0.11 963/2])
axis off
axis equal
xmax = size(imgkykx,2);
ymax = size(imgkykx,1);
set(gca, 'Projection','perspective');
view(-40,20)
% Store the frame
frame = getframe(gcf);
writeVideo(vid,frame);
hold off
end
% Output the movie as an mpg file
close(vid)