Reading and Processing XrdML Files With MATLAB

 

The XrdML file format is used to store X-ray powder diffraction measurements. Since XrdML format using the .xrdml file extension is an XML-based open file format using an ASCII format, reading such files with MATLAB is easy. Here is an example of reading multiple XrdML files from a file directory, convert the files in text files, display the measurements together with standard mineral data from a XRD data base.

The XrdML format was created by PANalytical B.V. as a version of the open XML format to store XRD results. The following MATLAB script allows to extract the 2theta and intensity from the XrdML files. You can also define min and max 2theta values, as well as an interval to interpolate the data upon an alternative theta grid. The script then saves the 2theta values to the file collect2theta.txt and the intensities of all XrdML in a single file collectintensities.txt.

Do you wish to use the original data (thetaopt=0) or to limit the 2thetas (thetaopt=1) or to limit and/or decimate the 2thetas (thetaopt=2)? The new 2theta limits *thetaminnew* and *thetamaxnew* have to be defined, as well as the 2theta interval *thetaint* for thetaopt=2. If the values of thetaminnew and thetamaxnew are outside the range of 2theta in the data set the values will be adjusted to thetamin and thetamax. This avoids extrapolation of the data beyond the limits of the original data.

clear, clc, close all
thetaopt = 2;
thetaminnew = 30;
thetamaxnew = 50;
thetaint = 0.015;

Do you wish to display the spectra? no=0, yes=1

dispopt = 1;

Define and read file from RRUFF data base (http://rruff.info/).

fidA = fopen('Analcime__R040128-1.txt');
A2 = textscan(fidA,'%f %f',...
   'Delimiter',',',...
   'Headerlines',11,...
   'CollectOutput',1);
fclose(fidA);
rruff = A2{1};

Listing XrdML files in the current working directory (data from Foerster et al., 2018).

filelist = dir('*.xrdml');

Read all files listed in *list* and convert to .txt files. It also display the measurements (in blue) together with the mineral standard (in orange).

h = waitbar(0,'Please wait...');

for i = 1 : size(filelist,1)

waitbar(i/size(filelist,1),h)
filename = filelist(i).name;

clear *data

fidA = fopen(filename);
formatSpec='<startPosition>%f</startPosition>';
A1 = textscan(fidA,formatSpec,...
   'Delimiter',{'>';'<'},...
   'Headerlines',89);
fclose(fidA);
thetamin = A1{1};

fidA = fopen(filename);
formatSpec='<endPosition>%f</endPosition>';
A2 = textscan(fidA,formatSpec,...
   'Delimiter',{'>';'<'},...
   'Headerlines',90);
fclose(fidA);
thetamax = A2{1};

fidA = fopen(filename);
formatSpec = '%s';
A3 = textscan(fidA,formatSpec,...
   'Delimiter',{'>';'<';' '},...
   'Headerlines',100);
fclose(fidA);
A3 = A3{1}(4:end-9);
intensities = str2double(A3);

clear fidA

theta = thetamin : (thetamax-thetamin)/...
   (size(A3,1)-1) : thetamax;
theta = theta';

if thetaminnew < thetamin
disp('The value of thetaminnew is adjusted')
thetaminnew=thetamin
end
if thetamaxnew > thetamax
disp('The value of thetamaxnew is adjusted')
thetamaxnew=thetamax
end

data(:,1) = theta;
data(:,2) = intensities;

if thetaopt==1
newdata = data(data(:,1)>=thetaminnew & ...
   data(:,1)<=thetamaxnew,:);
data = newdata;
elseif thetaopt==2
newdata(:,1) = thetaminnew : thetaint : ...
   thetamaxnew;
newdata(:,2) = interp1(data(:,1),data(:,2),...
newdata(:,1),'pchip');
data = newdata;
end

if dispopt==1
figure(...
   'Position',[200 200 1200 300],...
   'Color',[1 1 1])
axes(...
   'Box','on',...
   'LineWidth',0.6,...
   'XLim',[thetaminnew thetamaxnew],...
   'FontName','Helvetica',...
   'FontSize',10);
yyaxis left
line(data(:,1),data(:,2),...
   'LineWidth',0.75)
xlabel('2Theta')
ylabel('Intensity')
yyaxis right
line(rruff(:,1),rruff(:,2),...
   'LineWidth',0.75)
ylabel('Intensity')
title(filename)
legend(filenname,...
   'RRUFF Analcime R040128-1',...
   'Location','Northeast',...
   'Box','Off');
end

newfilename = [filename(1:end-6),'.txt'];
save(newfilename,'data','-ascii')
collect2theta(:,1) = data(:,1);
collectintensities(:,i) = data(:,2);

end
close(h)

save('collect2theta.txt','collect2theta',...
    '-ascii')
save('collectintensities.txt',...
    'collectintensities','-ascii')

References

Foerster, V., Deocampo, D., Asrat, A., Günter, C., Junginger, A., Krämer, H., Stroncik, N., Trauth, M.H. (2018) Towards an understanding of climate proxy formation in the Chew Bahir basin, southern Ethiopian Rift. Palaeogeography, Palaeoclimatology, Palaeoecology, 501, 111-123.