Rules of thumb determining the modulation appearance in EXAFS spectra
Matlab code
% Movie depicting cartoons of rules of thumb for changes in the appearance
% of EXAFS spectra according to the number of scatterers in a shell, the
% radius of the shell, and the scattering strength of the atoms in the
% shell
clear; close all;
vid = VideoWriter('EXAFSrot.mp4','MPEG-4');
vid.Quality = 100;
vid.FrameRate = 30;
open(vid);
figure('units','pixels','position',[0 0 1920 1080],'ToolBar','none');
set(0,'defaultfigurecolor',[1 1 1]);
set(gca,'linewidth',7);
myBlue = [0.4 0.44 0.73];
myGold = [220 166 3]/255;
myGrey = [0.5 0.5 0.5];
[xx,yy,zz] = sphere(50);
r1 = 0.5;
r2 = 0.25;
rt32 = (3^0.5)/2;
% Positions of six subplots
pos1 = [0.01 0.52 0.32 0.46]; % Top left 3D cartoon
pos2 = [0.01 0.02 0.32 0.46]; % Bottom left EXAFS plot
pos3 = [0.34 0.52 0.32 0.46]; % Top middle 3D cartoon
pos4 = [0.34 0.02 0.32 0.46]; % Bottom middle EXAFS plot
pos5 = [0.67 0.52 0.32 0.46]; % Top right 3D cartoon
pos6 = [0.67 0.02 0.32 0.46]; % Bottom right EXAFS plot
tt = 0:pi/180:pi*(1 - 1/180); % 180 frames for full cycle
Rn = 1+(sin(tt)).^2; % Shell radius breathing sinusoidally out and in between 1 and 2
ttt = 0;
LL = 2.35;
hold off;
lp = [0.4 -0.4 0.7];
light('Position',lp,'Style','infinite');
for ii = Rn % Breathing radius
ttt = ttt+1;
% -------------------------------------------------------
% Variation of EXAFS signal with number of atoms in shell
subplot('Position',pos1);
newplot;
hold off
surf(xx*r1,yy*r1,zz*r1,'FaceColor',myBlue,'EdgeColor','none','FaceLighting','gouraud');
hold on
surf(xx*1.5,yy*1.5,zz*1.5,'FaceColor',myGrey,'EdgeColor','none','FaceAlpha',0.1,'FaceLighting','gouraud');
twoon = 30;
if (ttt <= twoon)
surf(xx*r2+1.5,yy*r2,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2-1.5,yy*r2,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
end
fouron = 60;
if (ttt > twoon) && (ttt <= fouron)
surf(xx*r2+1.5,yy*r2,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2-1.5,yy*r2,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2+1.5,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2-1.5,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
end
sixon = 90;
if (ttt > fouron) && (ttt <= sixon)
surf(xx*r2+1.5,yy*r2,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2-1.5,yy*r2,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2+1.5,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2-1.5,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2,zz*r2+1.5,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2,zz*r2-1.5,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
end
eighton = 120;
if (ttt > sixon) && (ttt <= eighton)
surf(xx*r2+rt32,yy*r2+rt32,zz*r2+rt32,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2-rt32,yy*r2+rt32,zz*r2+rt32,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2+rt32,yy*r2-rt32,zz*r2+rt32,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2-rt32,yy*r2-rt32,zz*r2+rt32,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2+rt32,yy*r2+rt32,zz*r2-rt32,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2-rt32,yy*r2+rt32,zz*r2-rt32,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2+rt32,yy*r2-rt32,zz*r2-rt32,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2-rt32,yy*r2-rt32,zz*r2-rt32,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
end
sixon2 = 150;
if (ttt > eighton) && (ttt <= sixon2)
surf(xx*r2+1.5,yy*r2,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2-1.5,yy*r2,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2+1.5,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2-1.5,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2,zz*r2+1.5,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2,zz*r2-1.5,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
end
fouron2 = 180;
if (ttt > sixon2) && (ttt <= fouron2)
surf(xx*r2+1.5,yy*r2,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2-1.5,yy*r2,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2+1.5,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2-1.5,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
end
axis off;
axis equal;
light('Position',lp,'Style','infinite');
set(gca, 'Projection','perspective');
xlim([-LL LL]);
ylim([-LL LL]);
zlim([-LL LL]);
view(16,10);
hold off
subplot('Position',pos2);
newplot;
hold off
if (ttt <= twoon)
noAt = 2;
end
if (ttt > twoon) && (ttt <= fouron)
noAt = 4;
end
if (ttt > fouron) && (ttt <= sixon)
noAt = 6
end
if (ttt > sixon) && (ttt <= eighton)
noAt = 8
end
if (ttt > eighton) && (ttt <= sixon2)
noAt = 6;
end
if (ttt > sixon2) && (ttt <= fouron2)
noAt = 4;
end
% Range of x centred around absorption edge
x = -2:0.01:6;
% Quasi step-function on a falling slope to represent bare absorption edge
y1 = 1./(1+exp(-20*x))-x/20;
% chi(E), the EXAFS modulation of the absorption with a period proportional
% to the square-root of the electron energy (hv - E_B)
y2 = 0.28*exp(-x).*cos(20*abs(x+0.2).^0.5)./(1+exp(-50*x));
y3 = 0.4*y2*noAt/8; % Modulation varies as number of atoms in shell
plot(x,y1+y3,'Color',myBlue,'LineWidth',3.0)
axis off;
xlim([-2 6]);
ylim([-0.1 1.25]);
hold off
% ----------------------------------------------
% Variation of EXAFS signal with radius of shell
subplot('Position',pos3);
newplot;
hold off
surf(xx*r1,yy*r1,zz*r1,'FaceColor',myBlue,'EdgeColor','none','FaceLighting','gouraud');
hold on
surf(xx*ii,yy*ii,zz*ii,'FaceColor',myGrey,'EdgeColor','none','FaceAlpha',0.1,'FaceLighting','gouraud');
surf(xx*r2+ii,yy*r2,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2-ii,yy*r2,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2+ii,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2-ii,zz*r2,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2,zz*r2+ii,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2,yy*r2,zz*r2-ii,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
axis off;
axis equal;
light('Position',lp,'Style','infinite');
set(gca, 'Projection','perspective');
xlim([-LL LL]);
ylim([-LL LL]);
zlim([-LL LL]);
view(16,10);
hold off
subplot('Position',pos4);
newplot;
hold off
% Range of x centred around absorption edge
x = -2:0.01:6;
% Quasi step-function on a falling slope to represent bare absorption edge
y1 = 1./(1+exp(-20*x))-x/20;
% chi(E), the EXAFS modulation of the absorption with a period proportional
% to the square-root of the electron energy (hv - E_B)
y2 = 0.28*exp(-x).*cos(20*abs(x*ii+0.2).^0.5)./(1+exp(-50*x));
y3 = y2/ii^2; % Modulation varies as 1/Rn^2
plot(x,y1+y3,'Color',myBlue,'LineWidth',3.0)
axis off;
xlim([-2 6]);
ylim([-0.1 1.25]);
hold off
% ---------------------------------------------------------------------
% Variation of EXAFS signal with scattering strenngth of atoms in shell
subplot('Position',pos5);
newplot;
hold off
surf(xx*r1,yy*r1,zz*r1,'FaceColor',myBlue,'EdgeColor','none','FaceLighting','gouraud');
hold on
surf(xx*1.5,yy*1.5,zz*1.5,'FaceColor',myGrey,'EdgeColor','none','FaceAlpha',0.1,'FaceLighting','gouraud');
surf(xx*r2*ii+1.5,yy*r2*ii,zz*r2*ii,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2*ii-1.5,yy*r2*ii,zz*r2*ii,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2*ii,yy*r2*ii+1.5,zz*r2*ii,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2*ii,yy*r2*ii-1.5,zz*r2*ii,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2*ii,yy*r2*ii,zz*r2*ii+1.5,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
surf(xx*r2*ii,yy*r2*ii,zz*r2*ii-1.5,'FaceColor',myGold,'EdgeColor','none','FaceLighting','gouraud');
axis off;
axis equal;
light('Position',lp,'Style','infinite');
set(gca, 'Projection','perspective');
xlim([-LL LL]);
ylim([-LL LL]);
zlim([-LL LL]);
view(16,10);
hold off
subplot('Position',pos6);
newplot;
hold off
% Range of x centred around absorption edge
x = -2:0.01:6;
% Quasi step-function on a falling slope to represent bare absorption edge
y1 = 1./(1+exp(-20*x))-x/20;
% chi(E), the EXAFS modulation of the absorption with a period proportional
% to the square-root of the electron energy (hv - E_B)
y2 = 0.28*exp(-x).*cos(20*abs(x+0.2).^0.5)./(1+exp(-50*x));
y3 = 0.25*y2*ii^2; % Modulation varies as tj, itself proportional to area
plot(x,y1+y3,'Color',myBlue,'LineWidth',3.0)
axis off;
xlim([-2 6]);
ylim([-0.1 1.25]);
hold off
% Store the frame
frame = getframe(gcf);
writeVideo(vid,frame);
hold off;
end
% Output the movie as an mpg file
close(vid)