Cartoon of parallel data acquisition in powder diffraction
Matlab code 

% Cartoon movie of a modern powder diffraction experiment employing a

% microstrip detector for parallel data acquisition. The generated powder

% pattern is of silicon at 1-Angstrom radiation


clear; close all;


% -----------------------------------------------------------------------

% Storyboard of the movie

% _______________________

% 1) Let sample holder accelerate to full speed

% 2) Fade in incident radiation and Debye-Scherrer cones/intersections

% 3) Continue for a short while

% 4) Fade out full cones, leaving only the parts of the cones incident on

% the detector, plus the bright lines on detector where the rings intersect

% 5) Fade in curved diffraction pattern in front of detector and hold for a

% short while

% 6) Straighten diffraction pattern to lie on x-axis

% 7) Show Cartesian plot for a short while

% -----------------------------------------------------------------------


% Timing of movie

rampSpeed = 0.4; % degrees increase/frame during sample angular acceleration

topSpeed = 24; % top speed of rotation of sample holder/frame

sampleAccelFrames = round(topSpeed/rampSpeed) + 1; % Frames to get capillary to full speed

accel = 0:rampSpeed:topSpeed; % Values of steps in position during sample acceleration

fadeInRadiation = 60; % Number of frames to fade in the incident radiation and DS-cones

initialSitch = 60; % Number of frames to accustomize viewer to the full scattering scenario

fadeOutFullFadeInDet = 60; % Number of frames to fade in detector signal and fade out full DS-cones

fadeInRadial = 60; % Number of frames to fade in radial diffraction pattern

keepRadial = 60; % Number of frames to hold on radial diffraction pattern

radToLin = 60; % Number of frames to straighten diffraction pattern to being linear

linDiff = 90; % Number of frames showing linear diffraction pattern

constSpeedSteps = fadeInRadiation + initialSitch + fadeOutFullFadeInDet + ...

    fadeInRadial + keepRadial + radToLin + linDiff; % Number of frames at top sample speed

totSteps = constSpeedSteps + sampleAccelFrames; % Total number of frames

constSpeed = topSpeed*ones(1,constSpeedSteps); % Vector of angle changes for each frame when running at full speed

totAngleSteps = [accel constSpeed]; % Vector of angle changes for each and every frame


% Form factor parameters for tetravalent silicon

a1 = 5.66269;

b1 = 2.6652;

a2 = 3.07164;

b2 = 38.6634;

a3 = 2.62446;

b3 = 0.916946;

a4 = 1.3932;

b4 = 93.5458;

c = 1.24707;


% Set up and initialize x-y data for plot out of powder intensity graph

mythenMax = 127; % Maximum 2theta angle measured by microstrip detector

tthStep = 0.025; % Step size in 2theta in degrees

powderPattx = (mythenMax-120:tthStep:mythenMax); % Range of 2theta values

powderPatty = 0.0*powderPattx; % Initialize diffraction intensities to zero

sigma = 0.16; % Standard deviation of diffraction-peak widths


coneRad = 7; % Radius of Debye-Scherrer cone


aSi = 5.431; % u.c. size of cubic silicon in Angstroms

hv = 12.3984; % Photon energy for 1 Angstrom radiation

lambda = 1.0; % X-ray wavelength


% -------------------------------------------------------

% Calculate Bragg-peak intensities and angles for silicon 


hklmax = 10; % Maximum Miller index

nBPs = 0; % Initialize the number of Bragg peaks to zero

% Now work out SFs for 1/32 of volume: only positive h, k, l; k <= h, l <= k

for h = 1:hklmax

    for k = 0:h

        for l = 0:k

            % dhkl = 1/Y. Determine here Y

            hkl = (h^2 + k^2 + l^2)^0.5;

            hkl2 = (h^2 + k^2 + l^2);

            Y = (hkl)/aSi; % 1/d_hkl

            twoth = 2*asind(lambda*Y/2); % 2theta in degrees

            % Only allowed reflections for diamond structure

            % For h, k, l all odd, or h, k, l all even and h+k+l = 4m

            % See plot of allowed reflections v (h^2 + k^2 + l^2) in

            % Figure 6.13 of the second edition of "Introduction to

            % Synchrotron Radiation - Techniques and Applications" by

            % Philip Willmott, Wiley (2019)

            if (mod(hkl2,8) == 0) || (mod(hkl2,8) == 3) && (twoth < mythenMax)

                Q = 2*pi*Y; % Scattering vector

                % Not the Q=0 forward scattered reflection or Q > Qmax

                if (h^2 + k^2 + l^2 ~= 0) && (hkl <= hklmax) && (1/Y > lambda/2)

                    % Determine multiplicity of each reflection depending

                    % on symmetry of the (hkl) values

                    if (k==0) && (l==0) % (h00) reflection, multiplicity = 6

                        M = 6;

                    end

                    if (k==h) && (l==0) % (hh0) reflection, multiplicity = 12

                        M = 12;

                    end

                    if (k==h) && (l==h) % (hhh) reflection, multiplicity = 8

                        M = 8;

                    end

                    if (k~=h) && (k~=0) && (l==0) % (hk0) reflection, multiplicity = 24

                        M = 24;

                    end

                    if (k~=h) && (k~=0) && (l==k) % (hkk) reflection, multiplicity = 24

                        M = 24;

                    end

                    if (k~=h) && (l~=h) && (l~=0) && (l~=k) && (k~=0) % (hkl) reflection, multiplicity = 48

                        M = 48;

                    end

                    

                    % Now calculate form factors for silicon according

                    % to standard of four Gaussians plus a constant

                    fSi = a1*exp(-b1*(Q/(4*pi))^2) + ...

                        a2*exp(-b2*(Q/(4*pi))^2) + ...

                        a3*exp(-b3*(Q/(4*pi))^2) + ...

                        a4*exp(-b4*(Q/(4*pi))^2) + c;

                    FSi = fSi*(1+(-1)^(h+k) + (-1)^(k+l) + (-1)^(h+l))...

                        * (1 + (-1i)^(h+k+l)); % Structure factor for present h,k,l

                    if (FSi ~= 0)

                        sinth = Q*lambda/(4*pi); % sin(theta)

                        sin2th = sin(2*asin(sinth)); % sin(2theta)

                        LF = 1/(sinth*sin2th); % Lorentz factor

                        ISi = M*LF*FSi*conj(FSi); % Intensity of Bragg peak

                        twoth = 2*asind(sinth); % 2theta in degrees

                        nBPs = nBPs+1; % Increase number of registered Bragg peaks by 1

                        twothVector(nBPs) = twoth; % Add to vector array of 2theta positions of Bragg peaks

                        powderInt(nBPs) = ISi; % Add to vector array of intensities of Bragg peaks

                        % Add Bragg peak to powder pattern

                        powderPatty = powderPatty + ...

                            ISi*exp(-(powderPattx-twoth).^2/(2*sigma^2));

                    end % Determine intensities and 2theta values

                end % Not direct beam and inaccessible peaks for which sin(theta) > 1

            end % Only allowed peaks for silicon

        end % l-loop

    end % k-loop

end % h-loop


% -------------------------------------------------------------------

% Calculate x- and z-positions of curved plotted out diffraction pattern on

% the front face of the microstrip detector (@ y = -0.801)


RdataZero = 1.8*coneRad; % Radius of baseline with zero intensity

RdataMax = 1.2*coneRad; % Radius of maximum of diffraction data

Rdiff = RdataZero - RdataMax; % Span of data

powderPatty = powderPatty/max(powderPatty); % Normalize diffraction pattern to unity

Rdata = RdataZero - powderPatty*Rdiff; % Convert diffraction intensities to radii from (000)

Rdatax = -Rdata.*cosd(powderPattx); % x-values of curved data

Rdatay = 0*Rdatax-0.801; % y-values of curved data

Rdataz = -Rdata.*sind(powderPattx); % z-values of curved data


% -------------------------------------------------------------------

% Calculate x- and z-positions of standard Cartesian plot of diffraction

% pattern


xExtent = 20; % Width of plot in matlab units

xZero = -17; % x-origin in matlab units

zExtent = 10; % Height of plot in matlab units

zZero = -15.65; % z-origin in matlab units

% x, y, and z values for "normal" Cartesian plot of the powder pattern

powderCartx = powderPattx*xExtent/(max(powderPattx) - min(powderPattx))+xZero;

powderCarty = 0*powderPattx-0.801;

powderCartz = powderPatty*zExtent/(max(powderPatty) - min(powderPatty))+zZero;


% -----------------------------------------------------

% Determine surfs for Debye-Scherrer cones and strips


for kk = 1:nBPs % For all registered Bragg peaks

    % Render entire cone

    t = 0:1;

    r = coneRad*t*sind(twothVector(kk));

    [x,y,z] = cylinder(r,500);

    surfArrayx(:,:,kk) = [x];

    surfArrayy(:,:,kk) = [y];

    surfArrayz(:,:,kk) = [z];

    

    [x2,y2,z2] = cylinder(r,500);

    for iii = 1:2

        for jjj = 1:501

            if (abs(y2(2,jjj))>0.4 || x2(2,jjj)>0)

                x2(iii,jjj) = NaN;

                y2(iii,jjj) = NaN;

                z2(iii,jjj) = NaN;

            end

        end

    end

    stripArrayx(:,:,kk) = [x2];

    stripArrayy(:,:,kk) = [y2];

    stripArrayz(:,:,kk) = [z2];

end


% -------------------------------------------------------------------

% Set up movie parameters and graphics settings


vid = VideoWriter('PDexperimental.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(0, 'DefaultFigureRenderer', 'opengl');

set(gca,'linewidth',7);


myBlue = [0.4 0.44 0.73];

myCopper = [0.73 0.45 0.20];

myGold = [0.7969 0.6406 0.2383];

myBrass = [225 193 110]/255;

midGrey  = [0.65 0.65 0.65];

lightGrey  = [0.8 0.8 0.8];

lightGrey2  = [0.85 0.85 0.85];

darkGrey = [0.5 0.5 0.5];

lightBlue  = [0.2 0.6 0.8];


lp = [1 -1 2];

lp2 = [1 0.1 0.5];

pos1 = [-0.1 -0.2 1.0 1.5];


maxAlpha = 0.5; % Maximum allowed opacity of Debye-Scherrer cone

maxPowderInt = max(powderInt); % Associated maximum signal intensity


moveSampleHolder = 3.3034; % Distance to move holder so middle of capillary is at (0,0,0)


angSum = 0;

frmNo = 0;

varAlp = 0.001; 


% --------------

% Generate movie 


subplot('position',pos1);

for ii = totAngleSteps % Loop according to vector containing change in angle for each new frame

    frmNo = frmNo + 1; % Increase frame number by 1

    angSum = angSum + ii; % Increase total rotational angle by value of ii

    angNow = mod(angSum,360); % Just use values between 0 and 360 degrees

    hold off;

    newplot;

    light('Position',lp,'Style','infinite');

    set(gca,'Projection','perspective');

    az = 40;

    pol = 40;

    set(gca,'view',[az,pol]);

    axis equal

    axis off

    axis tight

    

    hold on

    % Dummy line to keep viewing field constant

    plot3([-17 0],[-0.802 -0.802],[-20.1 -20.1],...

        'color','w', 'LineWidth', 0.1);

    

    % ------------------------------------------------------------

    % Rotating capillary holder 

    

    [X,Y,Z] = cylinder(1,360);

    baseRing1 = surf(X*0.95,Y*0.95,0.6*Z-moveSampleHolder,'FaceColor',...

        lightGrey,'LineStyle','none','FaceLighting','gouraud','DiffuseStrength',1);

    rotate(baseRing1,[1 0 0],90,[0,0,0]);

    rotate(baseRing1,[0 1 0],angNow,[0,0,0]);

    

    baseRing2 = surf(X,Y,0.5*Z+0.05-moveSampleHolder,'FaceColor',...

        lightGrey,'LineStyle','none','FaceLighting','gouraud','DiffuseStrength',1);

    rotate(baseRing2,[1 0 0],90,[0,0,0]);

    rotate(baseRing2,[0 1 0],angNow,[0,0,0]);

    

    theta = (0:360);

    Xadd = 0.02*cosd(64*theta);

    Yadd = 0.02*sind(64*theta);

    X = X+Xadd; % Make ring nobbly

    Y = Y+Yadd; % Make ring nobbly

    fingerRing = surf(X,Y,0.4*Z+0.1-moveSampleHolder,'FaceColor',...

        lightGrey,'LineStyle','none','FaceLighting','gouraud','DiffuseStrength',1);

    rotate(fingerRing,[1 0 0],90,[0,0,0]);

    rotate(fingerRing,[0 1 0],angNow,[0,0,0]);

    

    % Top circular surface of base ring

    x = sind(theta);

    y = cosd(theta);

    z = 0.0*y;

    topSurf1 = fill3(x,y,z+0.55-moveSampleHolder,lightGrey,'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);

    rotate(topSurf1,[1 0 0],90,[0,0,0]);

    rotate(topSurf1,[0 1 0],angNow,[0,0,0]);

    topSurf2 = fill3(0.95*x,0.95*y,z+0.6-moveSampleHolder,lightGrey,'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);

    rotate(topSurf2,[1 0 0],90,[0,0,0]);

    rotate(topSurf2,[0 1 0],angNow,[0,0,0]);

    

    % Lower translation stage

    [V,F] = platonic_solid(2,3^0.5);

    V(:,1) = 0.6*V(:,1);

    V(:,2) = 0.6*V(:,2);

    V(:,3) = 0.3*V(:,3)-moveSampleHolder+0.9;

    stage1 = patch('Faces',F,'Vertices',V,'FaceColor',lightGrey,...

        'EdgeColor','none','FaceLighting','gouraud','DiffuseStrength',1,'SpecularStrength',0.5);

    rotate(stage1,[1 0 0],90,[0,0,0]);

    rotate(stage1,[0 1 0],angNow,[0,0,0]);

    

    dovetail1 = plot3([-0.6 -0.3 -0.4 0.4 0.3 0.6,0.6 0.3 0.4 -0.4 -0.3 -0.6 -0.6],...

        [0.6001 0.6001 0.6001 0.6001 0.6001 0.6001 -0.6001 -0.6001 -0.6001 -0.6001 -0.6001 -0.6001 0.6001],...

        [0.8 0.8 0.9 0.9 0.8 0.8 0.8 0.8 0.9 0.9 0.8 0.8 0.8]+0.05-moveSampleHolder,'color',darkGrey, 'LineWidth',1.25);

    rotate(dovetail1,[1 0 0],90,[0,0,0]);

    rotate(dovetail1,[0 1 0],angNow,[0,0,0]);

    

    [V,F] = platonic_solid(2,3^0.5);

    V(:,1) = 0.05*V(:,1)-0.05;

    V(:,2) = 0.1*V(:,2)-0.65;

    V(:,3) = 0.05*V(:,3)-moveSampleHolder+0.8;

    adjust1 = patch('Faces',F,'Vertices',V,'FaceColor',myBrass,...

        'EdgeColor','none','FaceLighting','gouraud','DiffuseStrength',1,'SpecularStrength',0.5);

    rotate(adjust1,[1 0 0],90,[0,0,0]);

    rotate(adjust1,[0 1 0],angNow,[0,0,0]);

    

    % Upper translation stage

    [V,F] = platonic_solid(2,3^0.5);

    V(:,1) = 0.5*V(:,1);

    V(:,2) = 0.5*V(:,2);

    V(:,3) = 0.3*V(:,3)-moveSampleHolder+1.5;

    stage2 = patch('Faces',F,'Vertices',V,'FaceColor',lightGrey2,...

        'EdgeColor','none','FaceLighting','gouraud','DiffuseStrength',1,'SpecularStrength',0.5);

    rotate(stage2,[1 0 0],90,[0,0,0]);

    rotate(stage2,[0 1 0],angNow,[0,0,0]);

    

    dovetail2 = plot3([0.5001 0.5001 0.5001 0.5001 0.5001 0.5001 -0.5001 -0.5001 -0.5001 -0.5001 -0.5001 -0.5001 0.5001],...

        [-0.5 -0.3 -0.4 0.4 0.3 0.5,0.5 0.3 0.4 -0.4 -0.3 -0.5 -0.5],...

        [0.8 0.8 0.9 0.9 0.8 0.8 0.8 0.8 0.9 0.9 0.8 0.8 0.8]+0.65-moveSampleHolder,'color',darkGrey, 'LineWidth',1.25);

    rotate(dovetail2,[1 0 0],90,[0,0,0]);

    rotate(dovetail2,[0 1 0],angNow,[0,0,0]);

    

    [V,F] = platonic_solid(2,3^0.5);

    V(:,1) = 0.1*V(:,1)-0.55;

    V(:,2) = 0.05*V(:,2)-0.025;

    V(:,3) = 0.05*V(:,3)-moveSampleHolder+1.425;

    adjust2 = patch('Faces',F,'Vertices',V,'FaceColor',myBrass,...

        'EdgeColor','none','FaceLighting','gouraud','DiffuseStrength',1,'SpecularStrength',0.5);

    rotate(adjust2,[1 0 0],90,[0,0,0]);

    rotate(adjust2,[0 1 0],angNow,[0,0,0]);

    

    % Domed connector block

    [X,Y,Z] = sphere(2000);

    sphnot = 0.3;

    % Only surviving part of sphere for X > xnot - a small slice of the sphere

    X(abs(X)>sphnot) = NaN ; Y(abs(Y)>sphnot) = NaN ; Z(Z<sphnot) = NaN;

    domeSurf = surf(X,Y,Z+1.25-moveSampleHolder,'FaceColor',lightGrey,'LineStyle','none',...

        'FaceLighting','flat','DiffuseStrength',0.4);

    rotate(domeSurf,[1 0 0],90,[0,0,0]);

    rotate(domeSurf,[0 1 0],angNow,[0,0,0]);

    

    radSide = (1^2 - sphnot^2)^0.5; % Radius of side wall of domed connector block

    xx0 = -sphnot:0.01:sphnot; % Range of x-values for top curved part of side wall

    angSide = asin(xx0); % Range of angles defining curved top side of side wall of domed connector

    xx = [-sphnot xx0 sphnot -sphnot]; % Range of x-values for entire side wall

    zSid = cos(angSide);

    zSide = [0 zSid 0 0];

    domeSide1 = fill3(xx,xx*0+sphnot,zSide+1.2034-moveSampleHolder,lightGrey,'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);

    rotate(domeSide1,[1 0 0],90,[0,0,0]);

    rotate(domeSide1,[0 1 0],angNow,[0,0,0]);

    domeSide2 = fill3(xx,xx*0+sphnot,zSide+1.2034-moveSampleHolder,lightGrey,'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);

    rotate(domeSide2,[0 0 1],180,[0,0,0]);

    rotate(domeSide2,[1 0 0],90,[0,0,0]);

    rotate(domeSide2,[0 1 0],angNow,[0,0,0]);

    domeSide3 = fill3(xx,xx*0+sphnot,zSide+1.2034-moveSampleHolder,lightGrey,'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);

    rotate(domeSide3,[0 0 1],90,[0,0,0]);

    rotate(domeSide3,[1 0 0],90,[0,0,0]);

    rotate(domeSide3,[0 1 0],angNow,[0,0,0]);

    domeSide4 = fill3(xx,xx*0+sphnot,zSide+1.2034-moveSampleHolder,lightGrey,'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);

    rotate(domeSide4,[0 0 1],270,[0,0,0]);

    rotate(domeSide4,[1 0 0],90,[0,0,0]);

    rotate(domeSide4,[0 1 0],angNow,[0,0,0]);

    

    % Brass capillary holder ring

    [X,Y,Z] = cylinder(1,360);

    Xadd = 0.005*cosd(45*theta);

    Yadd = 0.005*sind(45*theta);

    X = X+Xadd;

    Y = Y+Yadd;

    fingerRing2 = surf(0.1*X,0.1*Y,0.1*Z+2.2034-moveSampleHolder,'FaceColor',...

        myBrass,'LineStyle','none','FaceLighting','gouraud','DiffuseStrength',1);

    rotate(fingerRing2,[1 0 0],90,[0,0,0]);

    rotate(fingerRing2,[0 1 0],angNow,[0,0,0]);

    % Top circular surface of base ring

    x = 0.1*sind(theta);

    y = 0.1*cosd(theta);

    z = 0.0*y;

    fingerRingTop = fill3(x,y,z+2.3024-moveSampleHolder,myBrass,'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);

    rotate(fingerRingTop,[1 0 0],90,[0,0,0]);

    rotate(fingerRingTop,[0 1 0],angNow,[0,0,0]);

    

    % Capillary glass - slightly off rotation axis (0.005) to lend a bit of

    % wobbly verisimilitude to the animation

    [X,Y,Z] = cylinder(1,360);

    capillaryGlass = surf(0.035*X+0.005,0.035*Y,2*Z+2.3034-moveSampleHolder,...

        lightGrey,'LineStyle','none','FaceLighting','gouraud',...

        'FaceColor',lightGrey,'faceAlpha',0.2,'DiffuseStrength',1);

    rotate(capillaryGlass,[1 0 0],90,[0,0,0]);

    rotate(capillaryGlass,[0 1 0],angNow,[0,0,0]);

    

    % Capillary powder - slightly off rotation axis (0.005) to lend a bit

    % of wobbly verisimilitude to the animation

    [X,Y,Z] = cylinder(1,360);

    capillaryPowder = surf(0.014*X+0.005,0.014*Y,2*Z+2.3034-moveSampleHolder,...

        'FaceColor',lightBlue,'LineStyle','none','FaceLighting','gouraud',...

        'faceAlpha',1,'DiffuseStrength',1);

    rotate(capillaryPowder,[1 0 0],90,[0,0,0]);

    rotate(capillaryPowder,[0 1 0],angNow,[0,0,0]);

    

    % -------------------------------------------------------------

    % Create a cone of incident radiation

    

    t = 0.35:0.05:1;

    r = t/14;

    [x,y,z] = cylinder(r,100);

    if (frmNo <= sampleAccelFrames)

        incRadAlp = 0.001; % Very weak but defines viewing region

    elseif (frmNo > sampleAccelFrames) && (frmNo <= sampleAccelFrames+fadeInRadiation)

        incRadAlp = (frmNo-sampleAccelFrames)/fadeInRadiation;

    else

        incRadAlp = 1;

    end

    sourceRad = surf(x/2,y,10*z,'FaceAlpha',incRadAlp,'FaceColor',...

        myGold,'LineStyle','none','FaceLighting','gouraud','DiffuseStrength',1);

    rotate(sourceRad,[0 1 0],90,[0,0,0]);

    

    % -------------------------------------------------------------

    % Create set of Debye-Scherrer cones and strips of these that impinge

    % on the microstrip detector

    

    % Define Debye-Scherrer cone alpha (opacity) for all frames

    fadeInConesStart = sampleAccelFrames;

    fadeInConesFinish = fadeInConesStart+fadeInRadiation;

    initialSitchStart = fadeInConesFinish;

    initialSitchFinish = fadeInConesFinish+initialSitch;

    fadeOutConesStart = initialSitchFinish;

    fadeOutConesFinish = fadeOutConesStart+fadeOutFullFadeInDet;

    if (frmNo <= sampleAccelFrames)

        DSalp = 0.001; % Very weak but defines viewing region

    elseif (frmNo > fadeInConesStart) && (frmNo <= fadeInConesFinish)

        DSalp = (frmNo-fadeInConesStart)/fadeInRadiation; % Fade in DS cones

    elseif (frmNo > initialSitchStart) && (frmNo <= initialSitchFinish)

        DSalp = 1; % Full intensity cones

    elseif (frmNo > fadeOutConesStart) && (frmNo <= fadeOutConesFinish)

        DSalp = 1 - (frmNo-fadeOutConesStart)/fadeOutFullFadeInDet; % Fade out DS cones

    else

        DSalp = 0;

    end

    

    % Define Debye-Scherrer strip alpha (opacity) for all frames

    if (frmNo <= fadeOutConesStart)

        stripAlp = 0.001; % Very weak but defines viewing region

    elseif (frmNo > fadeOutConesStart) && (frmNo <= fadeOutConesFinish)

        stripAlp = (frmNo-fadeOutConesStart)/fadeOutFullFadeInDet; % Fade in DS strips

    else

        stripAlp = 1;

    end

    

    for kk = 1:nBPs % For all registered Bragg peaks

        % Render entire cone

        coneAlpha = maxAlpha*powderInt(kk)*DSalp/maxPowderInt;

        sourceRad = surf(surfArrayx(:,:,kk),-surfArrayy(:,:,kk),... 

            coneRad*cosd(twothVector(kk))*surfArrayz(:,:,kk),'FaceAlpha',...

            coneAlpha,'FaceColor',myGold,'LineStyle','none',...

            'FaceLighting','gouraud','DiffuseStrength',1);

        rotate(sourceRad,[0 1 0],-90,[0,0,0]);


        % Draw intersections of cones with microstrip detector brighter yellow

        if (frmNo > sampleAccelFrames)

            lineAlpha = incRadAlp*(powderInt(kk)/maxPowderInt)^0.7; % power of 0.7 to increase intensity of weak peaks

            lineSig = plot3(stripArrayx(2,:,kk),-stripArrayy(2,:,kk),...

                0.999*coneRad*cosd(twothVector(kk))*stripArrayz(2,:,kk),...

                'color',[1 1 0 lineAlpha], 'LineWidth', 2);

            rotate(lineSig,[0 1 0],-90,[0,0,0]);

        end 

        % Render only that part of the cone falling on the detector strip

        if (frmNo > fadeOutConesStart)

            partConeAlpha = maxAlpha*powderInt(kk)*stripAlp/maxPowderInt;

            stripRad = surf(stripArrayx(:,:,kk),-stripArrayy(:,:,kk),... 

                coneRad*cosd(twothVector(kk))*stripArrayz(:,:,kk)*1.001,...

                'FaceAlpha',partConeAlpha,'FaceColor',myGold,'LineStyle',...

                'none','FaceLighting','gouraud','DiffuseStrength',1);

            rotate(stripRad,[0 1 0],-90,[0,0,0]);

        end 

    end

    

    % -------------------------------------------------------------

    % Create 1D microstrip detector 

    

    theta2 = (mythenMax-122:mythenMax+2);

    x2 = cosd(theta2);

    z2 = sind(theta2);

    outCurvex2 = 2*coneRad*x2;

    outCurvez2 = 2*coneRad*z2;

    inCurvex2 = coneRad*x2;

    inCurvez2 = coneRad*z2;

    plateX = -[outCurvex2 flip(inCurvex2)];

    plateZ = -[outCurvez2 flip(inCurvez2)];

    plate1 = fill3(plateX,0*plateX+0.8,plateZ,lightGrey,'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);

    plate2 = fill3(plateX,0*plateX-0.8,plateZ,lightGrey,'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);

    curvePlateX = -[max(outCurvex2) inCurvex2 min(outCurvex2) min(outCurvex2)...

        flip(inCurvex2) max(outCurvex2)];

    curvePlateY = -[0.8 0*inCurvex2+0.8 0.8 -0.8 0*inCurvex2-0.8 -0.8];

    curvePlateZ = -[outCurvez2(1) inCurvez2 outCurvez2(125) outCurvez2(125)...

        flip(inCurvez2) outCurvez2(1)];

    curvePlate = fill3(curvePlateX,curvePlateY,curvePlateZ,midGrey,'LineStyle',...

        'none','FaceLighting','gouraud','DiffuseStrength',1);

    

    theta3 = (mythenMax-120:mythenMax);

    x3 = cosd(theta3);

    z3 = sind(theta3);

    detSurfx3 = 0.999*coneRad*x3;

    detSurfy3 = 0*detSurfx3;

    detSurfz3 = 0.999*coneRad*z3;

    detSurfX = -[detSurfx3 flip(detSurfx3)];

    detSurfY = -[detSurfy3-0.4 flip(detSurfy3)+0.4];

    detSurfZ = -[detSurfz3 flip(detSurfz3)];

    detSurf = fill3(detSurfX,detSurfY,detSurfZ,'k','LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);

    

    % --------------------------------------------------------------------

    % Plot curved diffraction data on front surface of microstrip detector

    % and then straighten it into a Cartesian plot 

    

    fadeInCurvedDataStart = fadeOutConesFinish;

    fadeInCurvedDataFinish = fadeInCurvedDataStart+fadeInRadial;

    if (frmNo <= fadeInCurvedDataStart)

        curveAlp = 0;

    elseif (frmNo > fadeInCurvedDataStart) && (frmNo <= fadeInCurvedDataFinish)

        curveAlp = (frmNo - fadeInCurvedDataStart)/fadeInRadial;

    else

        curveAlp = 1;

    end

    % Straightening plot to Cartesian

    radToLinStart = fadeInCurvedDataFinish+keepRadial;

    radToLinFinish = radToLinStart+radToLin;

    if (frmNo <= fadeInCurvedDataFinish+keepRadial)

        plot3(Rdatax,Rdatay,Rdataz,...

            'color',[0 0 0 curveAlp], 'LineWidth', 2.8);

    elseif (frmNo > radToLinStart) && (frmNo <= radToLinFinish)

        xCurveToLin = Rdatax - (Rdatax - powderCartx)*(frmNo-radToLinStart)/radToLin;

        yCurveToLin = 0*Rdatax -0.801;

        zCurveToLin = Rdataz - (Rdataz - powderCartz)*(frmNo-radToLinStart)/radToLin;

        azvar = az - az*(frmNo - radToLinStart)/radToLin;

        polvar = pol - pol*(frmNo - radToLinStart)/radToLin;

        set(gca,'view',[azvar,polvar]);

        plot3(xCurveToLin,yCurveToLin,zCurveToLin,...

            'color','k', 'LineWidth', 2.8);

    else % Last 90 frames showing Cartesian plot

        set(gca,'view',[0,0]);

        plot3(powderCartx,powderCarty,powderCartz,...

            'color','k', 'LineWidth', 2.8);

    end

    

    % -------------------------------------------------------------

    % Store the frame 

    

    axis tight

    axis off

    frame = getframe(gcf);

    writeVideo(vid,frame);

    hold off

end


% Output the movie as an mpg file

close(vid);