Skip to content
Snippets Groups Projects
gtCalculateDist.m 2.46 KiB
Newer Older
function [dsp,crystal_system,tt]=gtCalculateDist(hkl,parameters)
% [dsp,crystal_system]=gtCalculateDist(hkl,parameters)
%      hkl <double 1x3>

if nargin < 2
   disp('Usage: [dsp,crystal]=gtCalculateDist(hkl,parameters)')
   return
end

latticepar=parameters.acq.latticepar;
spacegroup=parameters.acq.spacegroup;

a=latticepar(1);b=latticepar(2);c=latticepar(3);
alpha=latticepar(4);beta=latticepar(5);gamma=latticepar(6);

if size(hkl,2)==4 %hexagonal materials
    h=hkl(1);k=hkl(2);l=hkl(4);
else
    h=hkl(1);k=hkl(2);l=hkl(3);
end
        
if ~isfield(parameters.acq,'hermann_mauguin')
   hermann=readSpaceGroup(spacegroup); 
end

% calculate twotheta (twoth) for different spacegroups
if between(spacegroup,1,2)
    crystal='triclinic';
    Y=h^2/a^2*(sind(alpha))^2 + k^2/b^2*(sind(beta))^2 + l^2/c^2*(sind(gamma))^2;
    Z=2*k*l/b/c*(cosd(beta)*cosd(gamma)-cosd(alpha)) + ...
             2*l*h/c/a*(cosd(gamma)*cosd(alpha)-cosd(beta)) + ...
             2*h*k/a/b*(cosd(alpha)*cosd(beta)-cosd(gamma));
    invdsp2=1/(1-(cosd(alpha))^2-(cosd(beta))^2-(cosd(gamma))^2+2*cosd(alpha)*cosd(beta)*cosd(gamma)) * ( Y + Z );
end
if between(spacegroup,3,15)
    crystal='monoclinic';
    invdsp2=h^2/(a*sind(beta))^2 + k^2/b^2 + l^2/(c*sind(beta))^2 - (2*h*l*cosd(beta)) / (a*c*(sind(beta))^2);
end
if between(spacegroup,16,74)
    crystal='orthorhombic';
    invdsp2=h^2/a^2+k^2/b^2+l^2/c^2;
end
if between(spacegroup,75,142)
    crystal='tetragonal';
    invdsp2=(h^2+k^2)/a^2+l^2/c^2;
end
if between(spacegroup,143,167)
    crystal='trigonal';
    if ~isempty(strfind(hermann,'P')) % hexagonal system
        invdsp2=4/(3*a^2) * (h^2 + k^2 + h*k) + l^2/c^2;
    elseif ~isempty(strfind(hermann,'R')) % rhombohedral system
        Y1=h^2+k^2+h*k;
        Y2=2*(h*k+h*l+k*l);
        Z1=(sind(alpha))^2;
        Z2=(cosd(alpha))^2-cosd(alpha);
        W=1+2*(cosd(alpha))^3-3*(cosd(alpha))^2;
        invdsp2=1/a^2*(Y1*Z1+Y2*Z2)/W;
    end
end
if between(spacegroup,168,194) || spacegroup==663 % snow case
    crystal='hexagonal';
    invdsp2=4/(3*a^2) * (h^2 + k^2 + h*k) + l^2/c^2;
end
if between(spacegroup,195,230)
    crystal='cubic';
    invdsp2=(h^2+k^2+l^2)/a^2;
end
dsp=1/(invdsp2)^0.5;
lambda=gtConvEnergyToWavelength(parameters.acq.energy);
twoth=2*asind(lambda/(2*dsp));

if nargout == 2
    crystal_system=crystal;
end

if nargout == 3
    crystal_system=crystal;
    tt=twoth;
end

if ~isfield(parameters.acq,'crystal_system')
   parameters.acq.crystal_system=crystal;
   save parameters parameters
end


end