Photoemission electron microscopy experiment cartoon
Matlab code
% Cartoon of a PEEM experimental setup with x-rays crossing over the L2 and
% L3 edges of iron from 700 to 740 eV. Experimental data ironPEEM.mp4
% courtesy Armin Kleibert, PSI.
clear; close all;
peemV = VideoReader('ironPEEM.mp4');
xanesData = importdata('FeL2L3.txt'); % Absorption data around Fe L-edge
pos1 = [0.01 0.01 0.49 0.98]; % Experiment
pos2 = [0.5 0.5 0.49 0.49]; % PEEM image
pos3 = [0.53 0.08 0.43 0.4]; % Fe L2, L3 spectrum
vid = VideoWriter('PEEMexpt.mp4','MPEG-4');
vid.Quality = 100;
vid.FrameRate = 15;
open(vid);
figure('units','pixels','position',[0 0 1920 1080]);
set(0,'defaultfigurecolor',[1 1 1]);
set(gca,'linewidth',7);
myBlue = [0.4 0.44 0.73];
myGold = [220 166 3]/255;
lp1 = [0. -0.4 0.25];
lp2 = [0. 0 -1.6];
% red - yellow - green - blue - violet custom colormap
rgb = customcolormap([0 0.25 0.5 0.75 1], {'#ff0000','#ffff00','#00ff00','#0000ff','#7f00ff'});
fliprgb = flip(rgb);
colormap(fliprgb);
Nframes = peemV.NumFrames; % Number of frames in PEEM video
frameNow = 0;
rmax = [5 4 3]; % Upper radii of three objective cones
baseHt = [0 1 2]; % Heights of bases of three objective cones
rmin = 1; % Common inner radius of three objective cones
objLensHt = [5 4.5 4]; % Axial heights of three objective cones
% Coordinates of top and bottom of lens structures
phiRange = -3*pi/4:pi/360:3*pi/4;
arcx = sin(phiRange); % Inner curved surface
arcy = cos(phiRange); % Outer curved surface
arc1x = [arcx 1.1*flip(arcx)]; % Concatenate for fill3
arc1y = [arcy 1.1*flip(arcy)]; % Concatenate for fill3
arc1z = 0.0*arc1x; % z-coordinates
for hv = 700:40/(Nframes-1):740
subplot('Position',pos1);
newplot
frameNow = frameNow+1;
% Create three cones as the curved surfaces of the objective lens of
% the PEEM electron microscope
surfRes = 360; % Fineness of cylindrical division
for cone = 1:3
r = rmin:rmax(cone);
[x1,y1,z1] = cylinder(r,surfRes);
% Delete quarter of the objective lens to see wot's goin' on, loik
for ii = rmin:rmax(cone)
for jj = 1:surfRes+1
if (y1(ii,jj) < -ii/sqrt(2)-0.001) % -0.001 needed to avoid rounding errors
x1(ii,jj) = NaN;
y1(ii,jj) = NaN;
z1(ii,jj) = NaN;
end
end
end
% Curved surface, objective 1,2,3
surf(x1,y1,z1*objLensHt(cone)+baseHt(cone),'FaceAlpha',1,...
'FaceColor',[0.5 0.5 0.5],'LineStyle',...
'none','FaceLighting','gouraud','DiffuseStrength',1);
surf(1.1*x1,1.1*y1,z1*objLensHt(cone)+baseHt(cone),'FaceAlpha',1,...
'FaceColor',[0.5 0.5 0.5],'LineStyle',...
'none','FaceLighting','gouraud','DiffuseStrength',1);
axis off;
axis equal;
hold on
% Top and bottom surfaces, objective lenses
fill3(rmin*arc1x,rmin*arc1y,arc1z+baseHt(cone),[0.7 0.7 0.7],...
'LineStyle','none','FaceLighting','gouraud','DiffuseStrength',1);
fill3(rmax(cone)*arc1x,rmax(cone)*arc1y,arc1z+baseHt(cone)+objLensHt(cone),...
[0.7 0.7 0.7],'LineStyle','none','FaceLighting','gouraud','DiffuseStrength',1);
% Exposed edges of cutaway, objective lenses
x1flat = -sqrt(1/2)*[rmax(cone) 1.1*rmax(cone) 1.1*rmin rmin];
y1flat = -sqrt(1/2)*[rmax(cone) 1.1*rmax(cone) 1.1*rmin rmin];
z1flat = [objLensHt(cone) objLensHt(cone) 0 0]+baseHt(cone);
fill3(x1flat,y1flat,z1flat,[0.7 0.7 0.7],'LineStyle','none',...
'FaceLighting','gouraud','DiffuseStrength',1);
fill3(-x1flat,y1flat,z1flat,[0.7 0.7 0.7],'LineStyle','none',...
'FaceLighting','gouraud','DiffuseStrength',1);
end
% Projector lens
% Curved surfaces
r3 = 2;
[x3,y3,z3] = cylinder(r3,surfRes);
for ii = 1:2
for jj = 1:surfRes+1
if (y3(ii,jj) < -r3/sqrt(2)-0.001)
x3(ii,jj) = NaN;
y3(ii,jj) = NaN;
z3(ii,jj) = NaN;
end
end
end
surf(x3,y3,2*z3+11,'FaceAlpha',1,'FaceColor',[0.5 0.5 0.5],'LineStyle',...
'none','FaceLighting','gouraud','DiffuseStrength',1);
r4 = 4;
[x4,y4,z4] = cylinder(r4,surfRes);
for ii = 1:2
for jj = 1:surfRes+1
if (y4(ii,jj) < -r4/sqrt(2)-0.001)
x4(ii,jj) = NaN;
x4(ii,jj) = NaN;
z4(ii,jj) = NaN;
end
end
end
surf(x4,y4,2*z4+11,'FaceAlpha',1,'FaceColor',[0.5 0.5 0.5],'LineStyle',...
'none','FaceLighting','gouraud','DiffuseStrength',1);
% Top and bottom surfaces, projector lens
arc2x = [r3*arcx r4*flip(arcx)];
arc2y = [r3*arcy r4*flip(arcy)];
arc2z = 0.0*arc2x;
fill3(arc2x,arc2y,arc2z+11,[0.7 0.7 0.7],'LineStyle','none',...
'FaceLighting','gouraud','DiffuseStrength',1);
fill3(arc2x,arc2y,arc2z+13,[0.7 0.7 0.7],'LineStyle','none',...
'FaceLighting','gouraud','DiffuseStrength',1);
% Exposed edges of cutaway, projector lens
x2flat = -sqrt(1/2)*[r3 r4 r4 r3];
y2flat = -sqrt(1/2)*[r3 r4 r4 r3];
z2flat = [11 11 13 13];
fill3(x2flat,y2flat,z2flat,[0.7 0.7 0.7],'LineStyle','none',...
'FaceLighting','gouraud','DiffuseStrength',1);
fill3(-x2flat,y2flat,z2flat,[0.7 0.7 0.7],'LineStyle','none',...
'FaceLighting','gouraud','DiffuseStrength',1);
% Two shielding plates for projector lens
spHtDiff = 2.75;
for shield = 0:1
% Curved surfaces
r5 = 1.9;
[x5,y5,z5] = cylinder(r5,surfRes);
for ii = 1:2
for jj = 1:surfRes+1
if (y5(ii,jj) < -r5/sqrt(2)-0.001)
x5(ii,jj) = NaN;
y5(ii,jj) = NaN;
z5(ii,jj) = NaN;
end
end
end
surf(x5,y5,0.05*z5+10.6+(shield*spHtDiff),'FaceAlpha',1,...
'FaceColor',[0.5 0.5 0.5],'LineStyle',...
'none','FaceLighting','gouraud','DiffuseStrength',1);
r6 = 5;
[x6,y6,z6] = cylinder(r6,surfRes);
for ii = 1:2
for jj = 1:surfRes+1
if (y6(ii,jj) < -r6/sqrt(2)-0.001)
x6(ii,jj) = NaN;
x6(ii,jj) = NaN;
z6(ii,jj) = NaN;
end
end
end
surf(x6,y6,0.05*z6+10.6+(shield*spHtDiff),'FaceAlpha',1,...
'FaceColor',[0.5 0.5 0.5],'LineStyle',...
'none','FaceLighting','gouraud','DiffuseStrength',1);
% Top and bottom surfaces, shielding plate 1
arc2x = [r5*arcx r6*flip(arcx)];
arc2y = [r5*arcy r6*flip(arcy)];
arc2z = 0.0*arc2x;
fill3(arc2x,arc2y,arc2z+10.6+(shield*spHtDiff),[0.4 0.4 0.4],...
'LineStyle','none','FaceLighting','gouraud','DiffuseStrength',1);
fill3(arc2x,arc2y,arc2z+10.65+(shield*spHtDiff),[0.4 0.4 0.4],...
'LineStyle','none','FaceLighting','gouraud','DiffuseStrength',1);
% Exposed edges of cutaway, projector lens
x2flat = -sqrt(1/2)*[r5 r6 r6 r5];
y2flat = -sqrt(1/2)*[r5 r6 r6 r5];
z2flat = [10.6 10.6 10.65 10.65]+(shield*spHtDiff);
fill3(x2flat,y2flat,z2flat,[0.7 0.7 0.7],'LineStyle','none',...
'FaceLighting','gouraud','DiffuseStrength',1);
fill3(-x2flat,y2flat,z2flat,[0.7 0.7 0.7],'LineStyle','none',...
'FaceLighting','gouraud','DiffuseStrength',1);
end
PEEMframe = read(peemV,frameNow); % grey image but in fact RGB
XX = [1 1; -1 -1];
YY = [1 -1; 1 -1];
ZZ = [0 0; 0 0]-0.5;
surf(-5*XX,-5*YY,ZZ+20.499,PEEMframe,'FaceColor','texturemap','EdgeColor','none');
plotcube([10 10 0.7],[-5 -5 20],1,[0.5 0.5 0.5],0);
surf(XX,YY,ZZ,PEEMframe,'FaceColor','texturemap','EdgeColor','none');
plotcube([2 2 0.1],[-1 -1 -0.601],1,[0.5 0.5 0.5],0);
fill3([-7 -7 7 7],[-7 7 7 -7],[0 0 0 0]-0.6,'w','LineStyle','none',...
'FaceLighting','none','DiffuseStrength',1);
% Interpolate PEEM spectrum
xintp = 700:0.1:740; % Interpolated x-values
yintp = interp1(xanesData(:,1),xanesData(:,2),xintp,'pchip'); % Interpolated y-values
xnowIndex = 1+round(400*(hv-700)/40);
ynow = yintp(xnowIndex);
FaceAlphaPlus = ynow/200;
% Electron beam from sample to detector
surfRes2 = 90;
R = 1;
ze1 = -0.2:0.01:1;
re1 = (R^2 - ze1.^2).^0.5-0.7*R;
[xe1,ye1,ze1] = cylinder(re1,surfRes2);
for ii = 1:121
if (re1(ii) < 0)
xe1(ii,:) = NaN;
ye1(ii,:) = NaN;
ze1(ii,:) = NaN;
end
end
aaa = max(max(ze1));
surf(2.68*xe1,2.68*ye1,5*ze1-0.5,'FaceAlpha',0.2+1.6*FaceAlphaPlus,...
'FaceColor',myBlue,'LineStyle',...
'none','FaceLighting','gouraud','DiffuseStrength',1);
aaa = 5*aaa-0.5; % Maximum height of first part of electron beam
ze1 = -1:0.01:1;
re1 = (R^2 - ze1.^2).^0.5-0.7*R;
[xe1,ye1,ze1] = cylinder(re1,surfRes2);
for ii = 1:201
if (re1(ii) < 0)
xe1(ii,:) = NaN;
ye1(ii,:) = NaN;
ze1(ii,:) = NaN;
end
end
bbb = min(min(ze1));
ccc = aaa+12*max(max(ze1-bbb));
surf(3.2*xe1,3.2*ye1,aaa+12*(ze1-bbb),'FaceAlpha',0.2+FaceAlphaPlus,'FaceColor',myBlue,'LineStyle',...
'none','FaceLighting','gouraud','DiffuseStrength',1);
re1 = 0:1:5;
[xe1,ye1,ze1] = cylinder(re1,surfRes);
surf(xe1,ye1,ccc+8.29*(ze1),'FaceAlpha',0.2+FaceAlphaPlus,'FaceColor',myBlue,'LineStyle',...
'none','FaceLighting','gouraud','DiffuseStrength',1);
% Incident radiation
index = 1 + round(255*(hv-700)/40);
colNow = fliprgb(index,:);
re1 = 0.8:0.2:1.4;
[xe1,ye1,ze1] = cylinder(re1,surfRes);
xrays = surf(xe1*sind(15),ye1,14*(ze1)-1.4,'FaceAlpha',0.28,'FaceColor',colNow,'LineStyle',...
'none','FaceLighting','gouraud','DiffuseStrength',0,'AmbientStrength',1);
rotate(xrays,[0 1 0],-75,[0,0,-0.5]);
axis off;
axis equal;
xlim([-9 6])
light('Position',lp1,'Style','infinite');
light('Position',lp2,'Style','infinite');
set(gca, 'Projection','perspective');
%view(32*(frameNow/112),(112-frameNow)/3) % Use for pan version
view(20,20) % Use for static version
hold off
% -------------------------------------------------------------------
subplot('Position',pos2);
newplot
imshow(PEEMframe)
% -------------------------------------------------------------------
subplot('Position',pos3);
newplot
xintp = 700:0.1:740; % Interpolated x-values
yintp = interp1(xanesData(:,1),xanesData(:,2),xintp,'pchip'); % Interpolated y-values
hold on
plot(xintp,yintp,'Color',myBlue,'LineWidth', 3.0)
xnow = hv;
ynowIndex = 1+round(400*(hv-700)/40);
ynow = yintp(ynowIndex);
colNow = fliprgb(index,:);
plot(xnow,ynow,'o','MarkerSize',10,...
'MarkerEdgeColor','none',...
'MarkerFaceColor',colNow,'MarkerSize',14)
a = get(gca,'XTickLabel');
set(gca,'XTickLabel',a,'FontName','Helvetica','fontsize',18);
set(gca,'TickLength',[0.02, 1]);
set(gca,'linewidth',2);
xlabel('Photon energy [eV]');
ylabel('Absorption [arb. units]');
set(gca,'YTickLabel',[]);
set(gca,'YTick',[])
xlim([700 740])
hold off
% Store the frame
frame = getframe(gcf);
writeVideo(vid,frame);
end
% Output the movie as an mpg file
close(vid)