Code covered by the BSD License  

Highlights from
spec file reader

image thumbnail
from spec file reader by Zhang Jiang
Monitor, read, save scans from SPEC files and calculate true reflectivity.

params(scan)
function [scanPeak,scanCOM,scanFWHM] = params(scan)
% PARAMS Calculate peak,COM and FWHM of a scan
%
% Copyright 2004, Zhang Jiang

% --- peak
[peak,peakIndex] = max(scan(:,2));
scanPeak.X = scan(peakIndex,1);
scanPeak.Y = peak;

% --- COM
if sum(scan(:,2)) == 0      % denominator is not zero
    scanCOM = 0;
else
    scanCOM = sum(scan(:,1).*scan(:,2))/sum(scan(:,2));
end

% --- FWHM
try
    leftError = 0;
    halfLeftIndex = find(scan(1:peakIndex,2)<peak/2);
    left_scan = scan(halfLeftIndex(end):peakIndex,:);
    [b,m,n] = unique(left_scan(:,2));
    left_scan = left_scan(m,:);
    left_scan = sortrows(left_scan,1);
    left = interp1(...
        left_scan(:,2),left_scan(:,1),peak/2);
catch
    leftError = 1;
end
try
    rightError = 0;
    halfRightIndex = find(scan(peakIndex:end,2)<peak/2)+peakIndex-1;
    right_scan = scan(peakIndex:halfRightIndex(1),:);
    [b,m,n] = unique(right_scan(:,2));
    right_scan = right_scan(m,:);
    right_scan = sortrows(right_scan,1);  
    right = interp1(...
        right_scan(:,2),right_scan(:,1),peak/2);
catch
    rightError = 1;
end
if leftError == 0 & rightError == 0
    scanFWHM.center = (left+right)/2;
    scanFWHM.FWHM = right-left;
elseif leftError == 0 & rightError == 1
    scanFWHM.center = left;
    scanFWHM.FWHM = scan(end,1)-left;
elseif leftError == 1 & rightError == 0
    scanFWHM.center = right;
    scanFWHM.FWHM = right-scan(1,1);
else
    scanFWHM.center = (scan(end,1)+scan(1,1))/2;
    scanFWHM.FWHM = scan(end,1)-scan(1,1);
end

Contact us at files@mathworks.com