write out proper Miller indices

This commit is contained in:
Martin Diehl 2020-02-15 20:09:24 +01:00
parent 5235c27ad0
commit a70721df53
1 changed files with 31 additions and 10 deletions

View File

@ -1,3 +1,5 @@
from fractions import Fraction
from functools import reduce
from queue import Queue from queue import Queue
import re import re
import glob import glob
@ -11,6 +13,7 @@ import numpy as np
from . import util from . import util
from . import version from . import version
from . import mechanics from . import mechanics
from . import Orientation
# ------------------------------------------------------------------ # ------------------------------------------------------------------
class DADF5(): class DADF5():
@ -657,31 +660,49 @@ class DADF5():
self.__add_generic_pointwise(__add_eigenvector,requested) self.__add_generic_pointwise(__add_eigenvector,requested)
def add_IPFcolor(self,q,p): def add_IPFcolor(self,q,p=[0,0,1]):
""" """
Add RGB color tuple of inverse pole figure (IPF) color. Add RGB color tuple of inverse pole figure (IPF) color.
Parameters Parameters
---------- ----------
orientation : str q : str
Label of the dataset containing the orientation data as quaternions. Label of the dataset containing the orientation data as quaternions.
pole : list of int p : list of int
Pole direction as Miller indices. Default value is [0, 0, 1]. Pole direction as Miller indices. Default value is [0, 0, 1].
""" """
def __add_IPFcolor(orientation,pole): def __add_IPFcolor(orientation,pole):
MAX_DENOMINATOR = 1000
def lcm(a, b):
"""Least common multiple."""
return a * b // np.gcd(a, b)
def get_square_denominator(x):
"""returns the denominator of the square of a number."""
return Fraction(x ** 2).limit_denominator(MAX_DENOMINATOR).denominator
def scale_to_Miller(v):
"""Factor to scale vector to integers."""
denominators = [int(get_square_denominator(i)) for i in v]
s = reduce(lcm, denominators) ** 0.5
m = (np.array(v)*s).astype(np.int)
return m//reduce(np.gcd,m)
m = scale_to_Miller(pole)
lattice = orientation['meta']['Lattice'] lattice = orientation['meta']['Lattice']
unit_pole = pole/np.linalg.norm(pole) unit_pole = pole/np.linalg.norm(pole)
colors = np.empty((len(orientation['data']),3),np.uint8) colors = np.empty((len(orientation['data']),3),np.uint8)
for i,q in enumerate(orientation['data']): for i,q in enumerate(orientation['data']):
rot = Rotation(np.array([q['w'],q['x'],q['y'],q['z']])) o = Orientation(np.array([q['w'],q['x'],q['y'],q['z']]),lattice).reduced()
orientation = Orientation(rot,lattice = lattice).reduced() colors[i] = np.uint8(o.IPFcolor(unit_pole)*255)
colors[i] = np.uint8(orientation.IPFcolor(unit_pole)*255)
return { return {
'data': colors, 'data': colors,
'label': 'IPFcolor_[{} {} {}]'.format(*pole), 'label': 'IPFcolor_[{} {} {}]'.format(*m),
'meta' : { 'meta' : {
'Unit': 'RGB (8bit)', 'Unit': 'RGB (8bit)',
'Lattice': lattice, 'Lattice': lattice,
@ -690,9 +711,9 @@ class DADF5():
} }
} }
requested = [{'label':'orientation','arg':'orientation'}] requested = [{'label':q,'arg':'orientation'}]
self.__add_generic_pointwise(__add_IPFcolor,requested,{'pole':pole}) self.__add_generic_pointwise(__add_IPFcolor,requested,{'pole':p})
def add_maximum_shear(self,x): def add_maximum_shear(self,x):