106 lines
3.9 KiB
Python
Executable File
106 lines
3.9 KiB
Python
Executable File
#!/usr/bin/python
|
|
# -*- coding: UTF-8 no BOM -*-
|
|
|
|
import os,string,sys,re
|
|
from optparse import OptionParser
|
|
import numpy as np
|
|
import damask
|
|
|
|
scriptID = string.replace('$Id$','\n','\\n')
|
|
scriptName = scriptID.split()[1]
|
|
|
|
sampleSym = { 'Orthotropic' : (90,90,90),
|
|
'Triclinic' : (360,180,360)
|
|
}
|
|
|
|
# --------------------------------------------------------------------
|
|
# MAIN
|
|
# --------------------------------------------------------------------
|
|
|
|
parser = OptionParser(option_class=damask.extendableOption, usage='%prog options [file[s]]', description = """
|
|
Transform the binned texture data from "TSL OIM Analysis" into linear ODF data,
|
|
|
|
""", version = scriptID)
|
|
|
|
parser.add_option('-s', '--symmetry', dest='symmetry', choices=sampleSym.keys(),
|
|
help='Sample symmetry, the default is [%default]')
|
|
|
|
parser.set_defaults(symmetry = 'Triclinic')
|
|
|
|
(options,filenames) = parser.parse_args()
|
|
|
|
#--- setup file handles ---------------------------------------------------------------------------
|
|
files = []
|
|
if filenames == []:
|
|
files.append({'name':'STDIN',
|
|
'input':sys.stdin,
|
|
'output':sys.stdout,
|
|
'croak':sys.stderr,
|
|
})
|
|
else:
|
|
for name in filenames:
|
|
if os.path.exists(name):
|
|
files.append({'name':name,
|
|
'input':open(name),
|
|
'output':open(name+'_tmp','w'),
|
|
'croak':sys.stdout,
|
|
})
|
|
|
|
#--- loop over input files ------------------------------------------------------------------------
|
|
for file in files:
|
|
file['croak'].write('\033[1m' + scriptName + '\033[0m: ' + (file['name'] if file['name'] != 'STDIN' else '') + '\n')
|
|
|
|
while True: # read header (forward and get bin Size)
|
|
line = file['input'].readline()
|
|
words = line.split()
|
|
if len(words)>=3:
|
|
if words[1]=='Bin' and words[2]=='Size:': binSize=float(words[3][:-1])
|
|
if not line.startswith('#'): break
|
|
|
|
delta = [sampleSym[options.symmetry][i]/binSize for i in xrange(3)]
|
|
|
|
nPhi1,nPHI,nPhi2 = map(int,delta)
|
|
dPhi1,dPHI,dPhi2 = [sampleSym[options.symmetry][i]/delta[i] for i in xrange(3)]
|
|
|
|
N = (nPhi1-1)*(nPHI-1)*(nPhi2-1)
|
|
|
|
|
|
ODF = [[[[None] for k in range(nPhi2)] for j in range(nPHI)] for i in range(nPhi1)]
|
|
linear = [None]*N
|
|
|
|
ODF = np.empty([nPhi1,nPHI,nPhi2],'d')
|
|
|
|
for iPhi1 in range(nPhi1):
|
|
for iPHI in range(nPHI):
|
|
for iPhi2 in range(nPhi2):
|
|
ODF[iPhi1,iPHI,iPhi2] = float(line.split()[3])*0.125 # extract intensity (in column 4) and weight by 1/8 (since we convert from the 8 corners to the center later on)
|
|
line = file['input'].readline()
|
|
|
|
for iPhi1 in range(nPhi1-1):
|
|
for iPHI in range(nPHI-1):
|
|
for iPhi2 in range(nPhi2-1):
|
|
linear[iPhi1*(nPHI-1)*(nPhi2-1)+iPHI*(nPhi2-1)+iPhi2] =\
|
|
ODF[iPhi1 ,iPHI ,iPhi2 ] +\
|
|
ODF[iPhi1 ,iPHI ,iPhi2+1] +\
|
|
ODF[iPhi1 ,iPHI+1,iPhi2 ] +\
|
|
ODF[iPhi1 ,iPHI+1,iPhi2+1] +\
|
|
ODF[iPhi1+1,iPHI ,iPhi2 ] +\
|
|
ODF[iPhi1+1,iPHI ,iPhi2+1] +\
|
|
ODF[iPhi1+1,iPHI+1,iPhi2 ] +\
|
|
ODF[iPhi1+1,iPHI+1,iPhi2+1]
|
|
|
|
|
|
file['output'].write('4 header\n')
|
|
file['output'].write('limit phi1 %-6.2f Phi %-6.2f phi2 %-6.2f\n'%sampleSym[options.symmetry])
|
|
file['output'].write('delta phi1 %-6.2f Phi %-6.2f phi2 %-6.2f\n'%(dPhi1,dPHI,dPhi2))
|
|
file['output'].write('centration cell-centered\n')
|
|
file['output'].write('density\n')
|
|
|
|
for i in range(N):
|
|
file['output'].write('%g\n'%(linear[i]))
|
|
|
|
#--- output finalization --------------------------------------------------------------------------
|
|
if file['name'] != 'STDIN':
|
|
file['output'].close()
|
|
os.rename(file['name']+'_tmp',os.path.splitext(file['name'])[0] +'.linearODF')
|