Open Matlab File in the Editor MTEX

Simulating Pole Figure data

Simulate arbitary pole figure data

On this page ...
Introduction
Simulate Pole Figure Data
ODF Estimation from Pole Figure Data
Exploration of the relationship between estimation error and number of single orientations

Introduction

MTEX allows to to simulate an arbitary number of pole figure data from any ODF. This is quit helpfull if you want to analyse the pole figure to ODF estimation routine. Let us start with a model ODF given as the superposition of 6 components.

cs = crystalSymmetry('orthorhombic');
mod1 = orientation('axis',xvector,'angle',45*degree,cs);
mod2 = orientation('axis',yvector,'angle',65*degree,cs);
model_odf = 0.5*uniformODF(cs) + ...
  0.05*fibreODF(Miller(1,0,0,cs),xvector,'halfwidth',10*degree) + ...
  0.05*fibreODF(Miller(0,1,0,cs),yvector,'halfwidth',10*degree) + ...
  0.05*fibreODF(Miller(0,0,1,cs),zvector,'halfwidth',10*degree) + ...
  0.05*unimodalODF(mod1,'halfwidth',15*degree) + ...
  0.3*unimodalODF(mod2,'halfwidth',25*degree);
plot(model_odf,'sections',6,'silent','sigma')
Plotting ODF as sigma sections, range: 0° - 150°

Simulate Pole Figure Data

In order to simulate pole figure data the following parameters has to be specified

  1. an arbitrary ODF
  2. a list of Miller indece
  3. a grid of specimen directions
  4. superposition coefficients (optional)
  5. the magnitude of error (optional)

The list of Miller indece

h = [Miller(1,1,1,cs),Miller(1,1,0,cs),Miller(1,0,1,cs),Miller(0,1,1,cs),...
  Miller(1,0,0,cs),Miller(0,1,0,cs),Miller(0,0,1,cs)];

The grid of specimen directions

r = regularS2Grid('resolution',5*degree);

Now the pole figures can be simulated using the command calcPoleFigure.

pf = calcPoleFigure(model_odf,h,r)
 
pf = PoleFigure  
  crystal symmetry : mmm
  specimen symmetry: 1
 
  h = (111), r = 72 x 37 points
  h = (110), r = 72 x 37 points
  h = (101), r = 72 x 37 points
  h = (011), r = 72 x 37 points
  h = (100), r = 72 x 37 points
  h = (010), r = 72 x 37 points
  h = (001), r = 72 x 37 points

Add some noise to the data. Here assume that the mean intensity is 1000.

pf = noisepf(pf,1000);

Plot the simulated pole figures.

plot(pf)

ODF Estimation from Pole Figure Data

From these simulated pole figures we can now estimate an ODF,

odf = calcODF(pf)
------ MTEX -- PDF to ODF inversion ------------------
Call c-routine
initialize solver
start iteration
error: 2.3727E-01 4.8281E-02 7.4052E-03 3.3336E-03 2.0276E-03 1.5139E-03 1.2333E-03 1.0773E-03 9.7963E-04 9.1731E-04 8.7413E-04 
Finished PDF-ODF inversion.
error: 8.7413E-04
alpha: 1.0008E+03 1.0010E+03 9.9844E+02 1.0030E+03 9.9457E+02 1.0117E+03 1.0047E+03 
required time: 20s
ghost correction
calculate with fixed background 0.46
initialize solver
start iteration
error: 5.4175E-01 2.4823E-01 1.2119E-01 5.4796E-02 2.4615E-02 9.8356E-03 7.4699E-03 6.4562E-03 5.7386E-03 5.1784E-03 4.7236E-03 
Finished PDF-ODF inversion.
error: 4.7236E-03
alpha: 9.9008E+02 9.8695E+02 1.0068E+03 1.0044E+03 1.0222E+03 1.0478E+03 1.0476E+03 
 
odf = ODF  
  crystal symmetry : mmm
  specimen symmetry: 1
 
  Uniform portion:
    weight: 0.4636
 
  Radially symmetric portion:
    kernel: de la Vallee Poussin, halfwidth 5°
    center: 29772 orientations, resolution: 5°
    weight: 0.5364
 

which can be plotted,

plot(odf,'sections',6,'silent','sigma')
Plotting ODF as sigma sections, range: 0° - 150°

and compared to the original model ODF.

calcError(odf,model_odf,'resolution',5*degree)
ans =
    0.0781

Exploration of the relationship between estimation error and number of single orientations

For a more systematic analysis of the estimation error we vary the number of pole figures used for ODF estimation from 1 to 7 and calculate for any number of pole figures the approximation error. Furthermore, we also apply ghost correction and compare the approximation error to the previous reconstructions.

e = [];
for i = 1:pf.numPF

  odf = calcODF(pf({1:i}),'silent','NoGhostCorrection');
  e(i,1) = calcError(odf,model_odf,'resolution',2.5*degree);
  odf = calcODF(pf({1:i}),'silent');
  e(i,2) = calcError(odf,model_odf,'resolution',2.5*degree);

end

Plot the error in dependency of the number of single orientations.

close all;
plot(1:pf.numPF,e)
ylim([0.07 0.32])
xlabel('Number of Pole Figures');
ylabel('Reconstruction Error');
legend({'Without Ghost Correction','With Ghost Correction'});