Plot of f1 and f2 v photon energy and their impact on the total atomic form factor
Matlab code 

% Program tracking f1 and f2 for the elements (gallium is the default

% element) as a function of photon energy and an animation of the vector

% addition of different components of f

 

clear; close all;

 

myBlue = [0.4 0.44 0.73];

 

scale=1;

 

% Prompt user for input file containing 3 columns of hv, f_1(Q = 0), and

% f_2(Q = 0). If no file is read, the data for gallium is taken

prompt = 'Do you want to input a form factor dispersion file (hv, f1, f2)? Y/N [N]: ';

str = input(prompt,'s');

if isempty(str) || (str == 'N') || (str == 'n')

    % Data for gallium

    f12 = importdata('Gaf1f2.dat');

    vid = VideoWriter('Ga_f1f2Venergy.mp4','MPEG-4');

else

    prompt = 'Name of input file? : ';

    filestr = input(prompt,'s');

    f12 = importdata(filestr);

    prompt = 'Name of output mp4 movie file (including .mp4)? : ';

    mp4str = input(prompt,'s');

    vid = VideoWriter(mp4str,'MPEG-4');

end

 

datSizef12 = size(f12); % Get size of data file

N = datSizef12(1); % Number of data points

energy = f12(:,1); % Photon energy

f1plot = f12(:,2); % f_1(Q = 0) = f^0(Q = 0) + f' (f' assumes negative values)

f2plot = f12(:,3); % f_2 = f"

f1max = max(f1plot);

f2max = max(f2plot);

 

prompt = 'Value of f^0(Q = 0)? [default = 31, Ga]: ';

f00 = input(prompt);

if isempty(f00)

    f00 = 31;

end

 

 

prompt = 'Plot in eV [e] or keV [k]: ';

str = input(prompt,'s');

if (str == 'e') || (str == 'E')

    energy = 1000*energy;

    edatamin = min(energy);

    edatamax = max(energy);

 

    % Prompt user for photon-energy range to be plotted

    str1 = 'Minimum photon energy in eV? (> ';

    str2 = num2str(edatamin);

    str3 = ' eV) [default minimum of input data] : ';

    strTot1 = [str1,str2,str3];

 

    prompt = strTot1;

    hvmin = input(prompt);

    if isempty(hvmin)

        hvmin = edatamin;

    end

 

    str1 = 'Maximum photon energy in eV? (< ';

    str2 = num2str(edatamax);

    str3 = ' eV) [default maximum of input data] : ';

    strTot1 = [str1,str2,str3];

    streVkeV = '[eV]';

    prompt = strTot1;

    hvmax = input(prompt);

    if isempty(hvmax)

        hvmax = edatamax;

    end

else % Plot in keV

    edatamin = min(energy);

    edatamax = max(energy);

 

    % Prompt user for photon-energy range to be plotted

    str1 = 'Minimum photon energy in keV? (> ';

    str2 = num2str(edatamin);

    str3 = ' keV) [default minimum of input data] : ';

    strTot1 = [str1,str2,str3];

    streVkeV = '[keV]';

    prompt = strTot1;

    hvmin = input(prompt);

    if isempty(hvmin)

        hvmin = edatamin;

    end

 

    str1 = 'Maximum photon energy in keV? (< ';

    str2 = num2str(edatamax);

    str3 = ' keV) [default maximum of input data] : ';

    strTot1 = [str1,str2,str3];

    prompt = strTot1;

    hvmax = input(prompt);

    if isempty(hvmax)

        hvmax = edatamax;

    end

end

 

figure('units','pixels','position',[0 0 1920 1080],'ToolBar','none');

set(0,'defaultfigurecolor',[1 1 1]);

vid.FrameRate = 60;    % Default 30

vid.Quality = 100;    % Default 75

 

% Determine range to plot out

minindex = 1;

maxindex = 1;

for ii = 2:N

    if (energy(ii)<=hvmin)

        minindex = ii;

    end

    if (energy(ii)>hvmax) && (energy(ii-1)<hvmax)

        maxindex = ii-1;

    elseif (energy(ii)==hvmax)

        maxindex = ii;

    end

end

 

open(vid);

for ii = minindex:maxindex % all data rows

    newplot

    % subplot 1

    pos1 = [0.25 0.43 0.5 0.5]; % x, y, Dx, Dy

    subplot('Position',pos1) % Plot of f1 and f2 v hv

 

    plot(hvmin,hvmax,0.0,f1max,energy(1:N),f1plot(1:N),'color',myBlue, 'LineWidth', 2.5);

    hold on

    plot(hvmin,hvmax,0.0,f1max,energy(1:N),f2plot(1:N),'color','g', 'LineWidth', 2.5);

    plot(energy(ii),f1plot(ii),'o','MarkerFaceColor',myBlue,'MarkerSize',10,...

        'MarkerEdgeColor','none')  % marking the ith data point of x and y

    plot(energy(ii),f2plot(ii),'o','MarkerFaceColor','g','MarkerSize',10,...

        'MarkerEdgeColor','none')  % marking the ith data point of x and y

 

    hold off

    set(gca,'FontName','Helvetica','fontsize',18);

    set(gca,'TickLength',[0.016, 2]);

    xlim([hvmin hvmax])

    ylim([0 1.1*f1max])

 

    str1 = 'f_1';

    str2 = 'f_2';

    strTot = [str1,str2,str3];

    text(hvmin+(hvmax-hvmin)/10, 0.989*f1max, str1, 'FontSize',18, 'color', myBlue);

    text(hvmin+(hvmax-hvmin)/10, 0.22*f1max, str2, 'FontSize',18, 'color', 'green');

    set(gca,'linewidth',2);

 

    xlabstr1 = 'Photon energy ';

    xlabstr = [xlabstr1,streVkeV];

    xlabel(xlabstr);

    ylabel('f_1, f_2');

 

    % subplot 2

 

    pos2 = [0.2 0.1 0.6 f2max/f00]; % x, y, Dx, Dy

    subplot2 = subplot('Position',pos2); % Plot of f1 and f2 v hv

 

    xlim(subplot2,[-f00/20 21*f00/20]);

    ylim(subplot2,[-f2max/20 21*f2max/20]);

 

    % Plot quiver vectors

    axis equal

 

    quiver(0,0,f00,0,scale, 'LineWidth', 2.5, 'MaxHeadSize', 0.1, 'Color', 'red');

    hold on

    quiver(0,0,0,f2max,scale, 'LineWidth', 0.01, 'MaxHeadSize', 0.01, 'Color', 'white');

    quiver(f00,0,-f00+f1plot(ii),0,scale, 'LineWidth', 2.5, 'MaxHeadSize', 0.4, 'Color', myBlue);

    quiver(f1plot(ii), 0,0,f2plot(ii),scale, 'LineWidth', 2.5, 'MaxHeadSize', 0.4, 'Color', 'g');

    quiver(0,0,f1plot(ii),f2plot(ii),scale, 'LineWidth', 3.5, 'MaxHeadSize', 0.1, 'Color', 'black');

 

    xlim(subplot2,[-f00/20 21*f00/20]);

    ylim(subplot2,[-f2max/20 21*f2max/20]);

    hold off;

 

    axis off

 

    % Store the frame

    frame = getframe(gcf);

    writeVideo(vid,frame);

end

 

% Output the movie as an mp4 file

close(vid);