2016-10-17 21:54:29 +05:30
|
|
|
#!/usr/bin/env python2.7
|
|
|
|
# -*- coding: UTF-8 no BOM -*-
|
|
|
|
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import math
|
|
|
|
import damask
|
|
|
|
import numpy as np
|
|
|
|
from optparse import OptionParser
|
|
|
|
|
|
|
|
scriptName = os.path.splitext(os.path.basename(__file__))[0]
|
|
|
|
scriptID = ' '.join([scriptName, damask.version])
|
|
|
|
|
|
|
|
# TODO
|
|
|
|
# This implementation will have to iterate through the array one
|
|
|
|
# element at a time, maybe there are some other ways to make this
|
|
|
|
# faster.
|
|
|
|
|
|
|
|
# --------------------------------------------------------------------
|
|
|
|
# MAIN
|
|
|
|
# --------------------------------------------------------------------
|
|
|
|
desp = "Add RGB color value corresponding to TSL-OIM scheme for IPF."
|
|
|
|
parser = OptionParser(option_class=damask.extendableOption,
|
|
|
|
usage='%prog options [file[s]]',
|
|
|
|
description=desp,
|
|
|
|
version=scriptID)
|
|
|
|
parser.add_option('-p', '--pole',
|
|
|
|
dest='pole',
|
|
|
|
type='float', nargs=3, metavar='float float float',
|
|
|
|
help='lab frame direction for IPF [%default]')
|
|
|
|
msg = ', '.join(damask.Symmetry.lattices[1:])
|
|
|
|
parser.add_option('-s', '--symmetry',
|
|
|
|
dest='symmetry',
|
|
|
|
type='choice', choices=damask.Symmetry.lattices[1:],
|
|
|
|
metavar='string',
|
|
|
|
help='crystal symmetry [%default] {{{}}} '.format(msg))
|
|
|
|
parser.add_option('-e', '--eulers',
|
|
|
|
dest='eulers',
|
|
|
|
type='string', metavar='string',
|
|
|
|
help='Euler angles label')
|
|
|
|
parser.add_option('-d', '--degrees',
|
|
|
|
dest='degrees',
|
|
|
|
action='store_true',
|
|
|
|
help='Euler angles are given in degrees [%default]')
|
|
|
|
parser.add_option('-m', '--matrix',
|
|
|
|
dest='matrix',
|
|
|
|
type='string', metavar='string',
|
|
|
|
help='orientation matrix label')
|
|
|
|
parser.add_option('-a',
|
|
|
|
dest='a',
|
|
|
|
type='string', metavar='string',
|
|
|
|
help='crystal frame a vector label')
|
|
|
|
parser.add_option('-b',
|
|
|
|
dest='b',
|
|
|
|
type='string', metavar='string',
|
|
|
|
help='crystal frame b vector label')
|
|
|
|
parser.add_option('-c',
|
|
|
|
dest='c',
|
|
|
|
type='string', metavar='string',
|
|
|
|
help='crystal frame c vector label')
|
|
|
|
parser.add_option('-q', '--quaternion',
|
|
|
|
dest='quaternion',
|
|
|
|
type='string', metavar='string',
|
|
|
|
help='quaternion label')
|
|
|
|
|
|
|
|
parser.set_defaults(pole=(0.0, 0.0, 1.0),
|
|
|
|
symmetry=damask.Symmetry.lattices[-1],
|
|
|
|
degrees=False)
|
|
|
|
|
|
|
|
(options, filenames) = parser.parse_args()
|
|
|
|
|
|
|
|
# safe guarding to have only one orientation representation
|
|
|
|
# use dynamic typing to group a,b,c into frame
|
|
|
|
options.frame = [options.a, options.b, options.c]
|
|
|
|
input = [options.eulers is not None,
|
|
|
|
all(options.frame),
|
|
|
|
options.matrix is not None,
|
|
|
|
options.quaternion is not None]
|
|
|
|
|
|
|
|
if np.sum(input) != 1:
|
|
|
|
parser.error('needs exactly one input format.')
|
|
|
|
|
|
|
|
# select input label that was requested (active)
|
|
|
|
label_active = np.where(input)[0][0]
|
|
|
|
(label, dim, inputtype) = [(options.eulers, 3, 'eulers'),
|
|
|
|
(options.frame, [3, 3, 3], 'frame'),
|
|
|
|
(options.matrix, 9, 'matrix'),
|
|
|
|
(options.quaternion, 4, 'quaternion')][label_active]
|
|
|
|
|
|
|
|
# rescale degrees to radians
|
|
|
|
toRadians = math.pi/180.0 if options.degrees else 1.0
|
|
|
|
|
|
|
|
# only use normalized pole
|
|
|
|
pole = np.array(options.pole)
|
|
|
|
pole /= np.linalg.norm(pole)
|
|
|
|
|
|
|
|
# ----- Loop over input files ----- #
|
|
|
|
for name in filenames:
|
|
|
|
try:
|
|
|
|
h5f = damask.H5Table(name, new_file=False)
|
|
|
|
except:
|
|
|
|
continue
|
|
|
|
damask.util.report(scriptName, name)
|
|
|
|
|
|
|
|
# extract data from HDF5 file
|
|
|
|
if inputtype == 'eulers':
|
|
|
|
orieData = h5f.get_data(label)
|
|
|
|
elif inputtype == 'matrix':
|
|
|
|
orieData = h5f.get_data(label)
|
|
|
|
orieData = orieData.reshape(orieData.shape[0], 3, 3)
|
|
|
|
elif inputtype == 'frame':
|
|
|
|
vctr_a = h5f.get_data(label[0])
|
|
|
|
vctr_b = h5f.get_data(label[1])
|
|
|
|
vctr_c = h5f.get_data(label[2])
|
|
|
|
frame = np.column_stack((vctr_a, vctr_b, vctr_c))
|
|
|
|
orieData = frame.reshape(frame.shape[0], 3, 3)
|
|
|
|
elif inputtype == 'quaternion':
|
|
|
|
orieData = h5f.get_data(label)
|
|
|
|
|
|
|
|
# calculate the IPF color
|
|
|
|
rgbArrays = np.zeros((orieData.shape[0], 3))
|
2016-10-25 00:46:29 +05:30
|
|
|
for ci in range(rgbArrays.shape[0]):
|
2016-10-17 21:54:29 +05:30
|
|
|
if inputtype == 'eulers':
|
|
|
|
o = damask.Orientation(Eulers=np.array(orieData[ci, :])*toRadians,
|
|
|
|
symmetry=options.symmetry).reduced()
|
|
|
|
elif inputtype == 'matrix':
|
|
|
|
o = damask.Orientation(matrix=orieData[ci, :, :].transpose(),
|
|
|
|
symmetry=options.symmetry).reduced()
|
|
|
|
elif inputtype == 'frame':
|
|
|
|
o = damask.Orientation(matrix=orieData[ci, :, :],
|
|
|
|
symmetry=options.symmetry).reduced()
|
|
|
|
elif inputtype == 'quaternion':
|
|
|
|
o = damask.Orientation(quaternion=orieData[ci, :],
|
|
|
|
symmetry=options.symmetry).reduced()
|
|
|
|
rgbArrays[ci, :] = o.IPFcolor(pole)
|
|
|
|
|
|
|
|
# compose labels/headers for IPF color (RGB)
|
|
|
|
labelIPF = 'IPF_{:g}{:g}{:g}_{sym}'.format(*options.pole,
|
|
|
|
sym=options.symmetry.lower())
|
|
|
|
|
|
|
|
# compose cmd history (go with dataset)
|
|
|
|
cmd_log = scriptID + '\t' + ' '.join(sys.argv[1:])
|
|
|
|
|
|
|
|
# write data to HDF5 file
|
|
|
|
h5f.add_data(labelIPF, rgbArrays, cmd_log=cmd_log)
|