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.

truerefcal(varargin)
function truerefcal(varargin)
% TRUEREFCAL Called by trueref to calculate true reflectivity.
%
% Copyright 2004, Zhang Jiang

hFigTrueref = findall(0,'Tag','trueref_Fig');

% --- return if no data imported
if isappdata(hFigTrueref,'data')
   data = getappdata(hFigTrueref,'data');
else
    return;
end

% --- if true reflectivity exists plot and return
if ~isempty(data.tru)
    truePlot(hFigTrueref);
    return;
end
    

if isempty(data.ref)
    return;
end

if length(data.ref) == 1
    data.mrg{1} = data.ref{1};
elseif length(data.ref) > 1 & isempty(data.mrg{1})
    uiwait(msgbox('Merge curves first!','True Relfectivity Error','error','modal'));  
    return;
end

if length(data.pos) == 1
    data.mrg{2} = data.pos{1};
elseif length(data.pos) > 1 & isempty(data.mrg{2})
    uiwait(msgbox('Merge curves first!','True Relfectivity Error','error','modal'));
    return;
end

if length(data.neg) == 1
    data.mrg{3} = data.neg{1};
elseif length(data.neg) > 1 & isempty(data.mrg{3})
    uiwait(msgbox('Merge curves first!','True Relfectivity Error','error','modal'));
    return;
end

setappdata(hFigTrueref,'data',data);

% --- If there is no diffuse scattering, then conside reflectivity as true
if isempty(data.mrg{2}) & isempty(data.mrg{3})
    data.tru = data.mrg{1};
    setappdata(hFigTrueref,'data',data);
    truePlot(hFigTrueref);
    uiwait(msgbox({'No diffuse data imported.';'View current imported reflectivity as true reflectivity.'},'True Relfectivity Warning','warn','modal'));
    return;
end

% --- If diffuse exists, get user defined subtract factor
prompt = {'Enter FACTOR below (reflectivity - diffuse x FACTOR) :'};
dlgAnswer=inputdlg(prompt,'True Reflectivity',1,{'1'});
if isempty(dlgAnswer)
    return;
end
subtractFactor=str2num(dlgAnswer{1}); 
% if invalid factor, error and return;
if isempty(subtractFactor)
    uiwait(msgbox('Invalid factor !','True Relfectivity Error','error','modal'));    
    return;
end

% --- make the counting time for reflectivity and diffuse the same
tempdata = data.mrg;
for iDiff = 2:3
    if ~isempty(tempdata{iDiff})
        tempdata{iDiff}(:,2:3) = tempdata{iDiff}(:,2:3)*subtractFactor;
    end
end

% --- convert to relative error
for iTempdata = 1:length(tempdata)
    if ~isempty(tempdata{iTempdata})
        tempdata{iTempdata}(:,3) = tempdata{iTempdata}(:,3)./tempdata{iTempdata}(:,2);
    end
end

% --- if only positive or negative longitudinal diffuse scattering exists
if isempty(tempdata{2}) | isempty(tempdata{3})
    reflec = tempdata{1};
    if isempty(tempdata{2}) 
        diffuse = tempdata{3};
    else
        diffuse = tempdata{2};
    end
    if reflec(1,1) < diffuse(1,1) 
        diffuse  = [reflec(1,1),diffuse(1,2:3);diffuse];
    end
    if  reflec(end,1) > diffuse(end,1)
        diffuse = [diffuse;reflec(end,1),diffuse(end,2:3)];
    end
    interpDiff(:,1) = reflec(:,1);        % get angle of intercepted diffuse scattering
    interpDiff(:,2:3) = interp1(diffuse(:,1),diffuse(:,2:3),reflec(:,1),'linear');
    trueReflec(:,1) = reflec(:,1);                            % true reflectivity angle
    trueReflec(:,2) = reflec(:,2)-interpDiff(:,2);            % true reflectivity intensity
    absReflecError = reflec(:,3).*reflec(:,2);                % absolute reflectivity error
    absInterpDiffError = interpDiff(:,3).*interpDiff(:,2);    % absolute interpolated diffuse error
    trueReflec(:,3) = sqrt(absReflecError.^2+absInterpDiffError.^2)./trueReflec(:,2); % releative true reflectivity error
    data.tru = trueReflec;
end
% --- if both diffuse scattering data exist, calculate the average of the
% diffuse scattering before subtracting from reflectivity data
if ~isempty(tempdata{2}) & ~isempty(tempdata{3})
    reflec = tempdata{1};
    posDiff = tempdata{2};
    negDiff = tempdata{3};
    if reflec(1,1) < posDiff(1,1)
        posDiff  = [reflec(1,1),posDiff(1,2:3);posDiff];
    end
    if reflec(1,1) < negDiff(1,1)
        negDiff  = [reflec(1,1),negDiff(1,2:3);negDiff];
    end
    if  reflec(end,1) > posDiff(end,1)
        posDiff = [posDiff;reflec(end,1),posDiff(end,2:3)];
    end
    if  reflec(end,1) > negDiff(end,1)
        negDiff = [negDiff;reflec(end,1),negDiff(end,2:3)];
    end
    interpPosDiff(:,1) = reflec(:,1);       % set angle of intercepted positive diffuse scattering
    interpNegDiff(:,1) = reflec(:,1);       % set angle of intercepted negative diffuse scattering
    interpPosDiff(:,2:3) = interp1(posDiff(:,1),posDiff(:,2:3),reflec(:,1),'linear');    
    interpNegDiff(:,2:3) = interp1(negDiff(:,1),negDiff(:,2:3),reflec(:,1),'linear');        
    trueReflec(:,1) = reflec(:,1);                                                    % true reflectivity angle
    trueReflec(:,2) = reflec(:,2)-0.5*interpPosDiff(:,2)-0.5*interpNegDiff(:,2);      % true reflectivity intensity
    absReflecError = reflec(:,3).*reflec(:,2);                                        % absolute reflectivity error
    absInterpPosDiffError = interpPosDiff(:,3).*interpPosDiff(:,2);                   % absolute interpolated positive diffuse error    
    absInterpNegDiffError = interpNegDiff(:,3).*interpNegDiff(:,2);                   % absolute interpolated negtive diffuse error    
    trueReflec(:,3) = sqrt(absReflecError.^2+0.25*absInterpPosDiffError.^2+0.25*absInterpNegDiffError.^2)./trueReflec(:,2);
    data.tru = trueReflec;   
end
% --- Clear negative data
negPoint = find(data.tru(:,2) < 0);
data.tru(negPoint,:)=[];
% --- convert back to absolute error
data.tru(:,3) = data.tru(:,3).*data.tru(:,2);
% --- save data 
setappdata(hFigTrueref,'data',data);    
truePlot(hFigTrueref);


%===================================================
% --- plot function
%===================================================
function truePlot(hFigTrueref)
hAxes = findall(hFigTrueref,'Tag','trueref_Axes');
data = getappdata(hFigTrueref,'data');
cla(hAxes);
hLine = line('Parent',hAxes,...
    'XData',data.tru(:,1),...
    'YData',data.tru(:,2),...
    'Tag','trueReflectivity');
setappdata(hLine,'ydataError',data.tru(:,3));
set(hLine,...
    'Color','r',...
    'LineStyle','-',...
    'Marker','o',...
    'MarkerSize',3,...
    'MarkerFaceColor','m');
resettoolbar(hFigTrueref);
curvelegend(hFigTrueref);

Contact us at files@mathworks.com