diff --git a/processing/post/addAPS34IDEstrainCoords.py b/processing/post/addAPS34IDEstrainCoords.py index fe834cf38..c14983799 100755 --- a/processing/post/addAPS34IDEstrainCoords.py +++ b/processing/post/addAPS34IDEstrainCoords.py @@ -2,6 +2,7 @@ import os import sys +from io import StringIO from optparse import OptionParser import numpy as np @@ -24,61 +25,33 @@ Transform X,Y,Z,F APS BeamLine 34 coordinates to x,y,z APS strain coordinates. parser.add_option('-f','--frame',dest='frame', metavar='string', help='label of APS X,Y,Z coords') -parser.add_option('--depth', dest='depth', metavar='string', +parser.add_option('--depth', dest='depth', metavar='string', help='depth') (options,filenames) = parser.parse_args() +if filenames == []: filenames = [None] if options.frame is None: parser.error('frame not specified') if options.depth is None: parser.error('depth not specified') -# --- loop over input files ------------------------------------------------------------------------ -if filenames == []: filenames = [None] +theta=-0.75*np.pi +RotMat2TSL=np.array([[1., 0., 0.], + [0., np.cos(theta), np.sin(theta)], # Orientation to account for -135 deg + [0., -np.sin(theta), np.cos(theta)]]) # rotation for TSL convention for name in filenames: - try: table = damask.ASCIItable(name = name, - buffered = False) - except: continue - damask.util.report(scriptName,name) + damask.util.report(scriptName,name) -# ------------------------------------------ read header ------------------------------------------ + table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name) + + coord = - table.get(options.frame) + coord[:,2] += table.get(options.depth)[:,0] - table.head_read() + table.add('coord', + np.einsum('ijk,ik->ij',np.broadcast_to(RotMat2TSL,(coord.shape[0],3,3)),coord), + scriptID+' '+' '.join(sys.argv[1:])) -# ------------------------------------------ sanity checks ----------------------------------------- - errors = [] - if table.label_dimension(options.frame) != 3: - errors.append('input {} does not have dimension 3.'.format(options.frame)) - if table.label_dimension(options.depth) != 1: - errors.append('input {} does not have dimension 1.'.format(options.depth)) - if errors != []: - damask.util.croak(errors) - table.close(dismiss = True) - continue - - table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - -# ------------------------------------------ assemble header --------------------------------------- - table.labels_append(['%i_coord'%(i+1) for i in range(3)]) # extend ASCII header with new labels - table.head_write() - -# ------------------------------------------ process data ------------------------------------------ - theta=-0.75*np.pi - RotMat2TSL=np.array([[1., 0., 0.], - [0., np.cos(theta), np.sin(theta)], # Orientation to account for -135 deg - [0., -np.sin(theta), np.cos(theta)]]) # rotation for TSL convention - outputAlive = True - while outputAlive and table.data_read(): # read next data line of ASCII table - coord = list(map(float,table.data[table.label_index(options.frame):table.label_index(options.frame)+3])) - depth = float(table.data[table.label_index(options.depth)]) - - table.data_append(np.dot(RotMat2TSL,np.array([-coord[0],-coord[1],-coord[2]+depth]))) - - outputAlive = table.data_write() # output processed line - -# ------------------------------------------ output finalization ----------------------------------- - - table.close() # close ASCII tables + table.to_ASCII(sys.stdout if name is None else name)