Cartoon of CCD exposure and shift-register readout
Matlab code 

% Program to generate a cartoon of a 1D CCD exposure and readout

clear; close all;

 

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

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

vid.FrameRate = 15;    % Default 30

vid.Quality = 100;    % Default 75

open(vid);

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

set(gca,'linewidth',7);

 

myBlue = [0.3 0.28 0.55];

numPks = 20; % Number of detected Gaussian peaks in 1D array

intArray = rand(1,numPks); % Assign random intensities

posnArray = rand(1,numPks); % Assign random positions

steps = 500; % number of steps from 0 to 1

x = 0:1/steps:1;

y = x*0.0;

sigma = 0.005; % SD for Gaussian peaks

binSize = 2; % Binning of individual pixels

 

pos1 = [0.1 0.64 0.8 0.255];

subplot('Position',pos1)

 

% Plot 1D spectrum of numPks Gaussian peaks

for j = 1:numPks

    y = y + intArray(1,j)*exp(-(x-posnArray(1,j)).^2/(2*sigma^2));

end

plot(x,y,'color','r', 'LineWidth', 2)

axis off

 

pos2 = [0.1 0.1 0.8 0.52];

subplot('Position',pos2)

 

% Dimensions and position of shutter

pos = [0 1.05*max(y)*binSize steps 0.05];

cur = [0.1 0.5];

 

for i = 1:binSize:steps % Loop to plot out rectangles moving to right in steps of binSize

    newplot

    if (i == 1)

        rectangle('Position',pos,'Curvature',cur,'FaceColor',[0.2 0.2 0.2],'LineStyle','none');

        xlim([0 steps]);

        ylim([0 1.1*max(y)*binSize]);

        set(gca,'linewidth',2,'fontsize',18);

        ax2 = gca;

        ax2.YAxis.Visible = 'off';   % remove y-axis

 

        pauseMov(vid,10); % Pause movie for 10 frames

    end

    xwidth = binSize;

    ystart = 0.0;

    if (i == 1)

        newplot

        for k = 0:0.05:1 % Grow signal while exposing

            newplot

            for j = 1:binSize:steps % Loop to get rectangle size and position

                xstart = steps*x(j)+(i-1);

                ytemp = sum(y(j:j+binSize-1));

                ywidth = ytemp*k;

                if (xstart < steps)

                    rectangle('Position',[xstart ystart xwidth ywidth],'FaceColor',myBlue);

                    yout = sum(y(j:j+binSize-1));

                end

                xlim([0 steps]);

                ylim([0 1.1*max(y)*binSize]);

                set(gca,'linewidth',2,'fontsize',18);

                ax2 = gca;

                ax2.YAxis.Visible = 'off';   % remove y-axis

            end % Loop of plot out of each rectangle

            xlabel('Pixel #');

 

            % Store the frame

            frame = getframe(gcf);

            writeVideo(vid,frame);

        end

    elseif (i>1)

        newplot

        for j = 1:binSize:steps % Loop to get rectangle size and position

            xstart = steps*x(j)+(i-1);

            ytemp = sum(y(j:j+binSize-1));

            ywidth = ytemp;

            if (xstart < steps)

                rectangle('Position',[xstart ystart xwidth ywidth],'FaceColor',myBlue);

                yout = sum(y(j:j+binSize-1));

            end

            xlim([0 steps]);

            ylim([0 1.1*max(y)*binSize]);

            set(gca,'linewidth',2,'fontsize',18);

            ax2 = gca;

            ax2.YAxis.Visible = 'off';   % remove y-axis

        end % Loop of plotout of each rectangle

 

        rectangle('Position',pos,'Curvature',cur,'FaceColor',[0.2 0.2 0.2],'LineStyle','none');

        xlim([0 steps]);

        ylim([0 1.1*max(y)*binSize]);

        set(gca,'linewidth',2,'fontsize',18);

        ax2 = gca;

        ax2.YAxis.Visible = 'off';   % remove y-axis

 

        str1 = num2str(yout*1000,'% 5.0f');

        if (round(yout*1000) == 1)

            str2 = ' count';

        else

            str2 = ' counts';

        end

        strTot = [str1,str2];

        hText = text(510, 0, strTot, 'FontSize',18);

        xlabel('Pixel #');

 

        % Store the frame

        frame = getframe(gcf);

        writeVideo(vid,frame);

    end

end % Loop of moving output to the right

 

% Output the movie as an mpg file

close(vid);

% function pauseMov adds frames to movie

function h = pauseMov(vid,mframes)

for i = 1:mframes 

    frame = getframe(gcf); 

    writeVideo(vid,frame); 

end