Grain Tutorial edit page

The following script is a quick guide through the grain reconstruction capabilities of MTEX. It uses the same data set as in the corresponding publication Grain detection from 2d and 3d EBSD data. Data courtesy of Daniel Rutte and Bret Hacker, Stanford.

mtexdata mylonite

% plot a phase map
plot(ebsd)
ebsd = EBSD
 
 Phase  Orientations     Mineral         Color  Symmetry  Crystal reference frame
     1    3444 (28%)    Andesina  LightSkyBlue        -1              X||a*, Z||c
     2    3893 (31%)      Quartz  DarkSeaGreen      -3m1       X||a*, Y||b, Z||c*
     3    368 (2.9%)     Biotite     Goldenrod     2/m11       X||a*, Y||b*, Z||c
     4    4781 (38%)  Orthoclase    LightCoral     12/m1       X||a*, Y||b*, Z||c
 
 Scan unit : um
 X x Y x Z : [15000 24000] x [1020 3990] x [0 0]
 Normal vector: (0,0,1)

The phase map shows a multi-phase rock specimen with Andesina, Quartz, Biotite and Orthoclase. Lets restrict it to a smaller region of interest. The rectangle is defined by [xmin, ymin, xmax-xmin, ymax-ymin].

region = [19000 1500 4000 1500];
% overlay the selected region on the phase map
rectangle('position',region,'edgecolor','k','linewidth',2)

Now copy the EBSD data within the selected rectangle to a new variable

ebsd_region = ebsd(inpolygon(ebsd,region))
ebsd_region = EBSD
 
 Phase  Orientations     Mineral         Color  Symmetry  Crystal reference frame
     1     578 (20%)    Andesina  LightSkyBlue        -1              X||a*, Z||c
     2    1144 (40%)      Quartz  DarkSeaGreen      -3m1       X||a*, Y||b, Z||c*
     3       58 (2%)     Biotite     Goldenrod     2/m11       X||a*, Y||b*, Z||c
     4    1066 (37%)  Orthoclase    LightCoral     12/m1       X||a*, Y||b*, Z||c
 
 Scan unit : um
 X x Y x Z : [19020 22980] x [1500 3000] x [0 0]
 Normal vector: (0,0,1)

Grain Reconstruction

Next we reconstruct the grains and grain boundaries in the region of interest, using a 15 degree orientation change threshold.

grains = calcGrains(ebsd_region,'angle',15*degree)

% plot a phase map of the region of interest
plot(ebsd_region)

% overlay the grain boundaries
hold on
plot(grains.boundary,'color','k','linewidth',1.5)
hold off
grains = grain2d
 
 Phase  Grains  Pixels     Mineral  Symmetry  Crystal reference frame
     1     371     578    Andesina        -1              X||a*, Z||c
     2     189    1144      Quartz      -3m1       X||a*, Y||b, Z||c*
     3      55      58     Biotite     2/m11       X||a*, Y||b*, Z||c
     4     380    1066  Orthoclase     12/m1       X||a*, Y||b*, Z||c
 
 boundary segments: 4626 (157002 µm)
 inner boundary segments: 1 (45 µm)
 triple points: 1333
 
 Properties: meanRotation, GOS

We may also visualize the different quartz orientations together with the grain boundaries.

% plot a phase map of three of the phases based on the grains data
plot(grains({'Andesina','Biotite','Orthoclase'}),'FaceAlpha',0.4)

hold on
% add the quartz orientations as ipf map based on EBSD data
plot(ebsd_region('Quartz'),ebsd_region('Quartz').orientations)

% plot grain boundaries so that those in the Quartz are shown
plot(grains.boundary,'color','black');
legend off
hold off

For the map created, most of the phases are colored based on where they exist, while only the Quartz phase is colored according to the orientation. The quartz orientations are colored using the following ipf color key

close all
ipfKey = ipfColorKey(ebsd_region('Quartz'));
plot(ipfKey)

Alternatively, we may colorize each quartz grain according to its mean orientation. Again, the other phases are colored based on where they exist.

plot(grains({'Andesina','Biotite','Orthoclase'}),'FaceAlpha',0.4)
hold on
plot(grains('Quartz'),grains('Quartz').meanOrientation)
legend off

Highlight specific boundaries

We can create a phase map with certain grain boundaries highlighted. In this case, we highlight where adjacent grains of Andesina and Orthoclase have a misorientation with rotational axis close to the c-axis.

close all
% copy all boundaries between Andesina, Orthoclase to a new variable
AOboundary = grains.boundary('Andesina','Orthoclase');
% copy the misorientation angle of this boundary in radians to a new variable.
angle = AOboundary.misorientation.angle;

plot(grains,'FaceAlpha',0.4)
hold on
% highlight boundaries where the angle between the Andesina and Orthoclase phase is over 160 degrees
plot(AOboundary(angle>160*degree),'linewidth',2,'linecolor','red')
hold off

We can also represent the angular misorientation data between these two phases as a histogram.

figure;histogram(angle./degree)
xlabel('angle in degrees of boundary segment')
ylabel('count of boundary segments')
title('angular relationships between Andesina and Orthoclase')