From 77ee33ec1f2b70ebba226cb2b63d15a3e73478aa Mon Sep 17 00:00:00 2001 From: Pratheek Shanthraj Date: Thu, 21 Jun 2012 12:57:14 +0000 Subject: [PATCH] script to changes the (three-dimensional) canvas of a spectral geometry description --- processing/pre/spectral_geomCanvas.py | 162 ++++++++++++++++++++++++++ processing/setup/setup_processing.py | 1 + 2 files changed, 163 insertions(+) create mode 100755 processing/pre/spectral_geomCanvas.py diff --git a/processing/pre/spectral_geomCanvas.py b/processing/pre/spectral_geomCanvas.py new file mode 100755 index 000000000..80292ccee --- /dev/null +++ b/processing/pre/spectral_geomCanvas.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 no BOM -*- + +import os,sys,string,re,math,numpy +from optparse import OptionParser, OptionGroup, Option, SUPPRESS_HELP + + +# ----------------------------- +class extendedOption(Option): +# ----------------------------- +# used for definition of new option parser action 'extend', which enables to take multiple option arguments +# taken from online tutorial http://docs.python.org/library/optparse.html + + ACTIONS = Option.ACTIONS + ("extend",) + STORE_ACTIONS = Option.STORE_ACTIONS + ("extend",) + TYPED_ACTIONS = Option.TYPED_ACTIONS + ("extend",) + ALWAYS_TYPED_ACTIONS = Option.ALWAYS_TYPED_ACTIONS + ("extend",) + + def take_action(self, action, dest, opt, value, values, parser): + if action == "extend": + lvalue = value.split(",") + values.ensure_value(dest, []).extend(lvalue) + else: + Option.take_action(self, action, dest, opt, value, values, parser) + + +# ----------------------- MAIN ------------------------------- + +identifiers = { + 'resolution': ['a','b','c'], + 'dimension': ['x','y','z'], + } +mappings = { + 'resolution': lambda x: int(x), + 'dimension': lambda x: float(x), + } + + +parser = OptionParser(option_class=extendedOption, usage='%prog options [file[s]]', description = """ +Changes the (three-dimensional) canvas of a spectral geometry description. +""" + string.replace('$Id: spectral_geomCrop.py 1449 2012-04-24 11:31:18Z MPIE\t.elachkar $','\n','\\n') +) + +parser.add_option('-b', '--box', dest='resolution', type='int', nargs = 3, \ + help='resolution of new canvas (a,b,c)') +parser.add_option('-o', '--offset', dest='offset', type='int', nargs = 3, \ + help='offset from old to new origin of grid') +parser.add_option('-f', '--fill', dest='fill', type='int', \ + help='(background) canvas grain index') +parser.add_option('-2', '--twodimensional', dest='twoD', action='store_true', \ + help='output geom file with two-dimensional data arrangement') + +parser.set_defaults(resolution = [0,0,0]) +parser.set_defaults(offset = [0,0,0]) +parser.set_defaults(twoD = False) +parser.set_defaults(fill = 0) + +(options, filenames) = parser.parse_args() + +# ------------------------------------------ setup file handles --------------------------------------- + +files = [] +if filenames == []: + files.append({'name':'STDIN', 'input':sys.stdin, 'output':sys.stdout}) +else: + for name in filenames: + if os.path.exists(name): + files.append({'name':name, 'input':open(name), 'output':open(name+'_tmp','w')}) + +# ------------------------------------------ loop over input files --------------------------------------- + +for file in files: + if file['name'] != 'STDIN': print file['name'] + + # get labels by either read the first row, or - if keyword header is present - the last line of the header + + firstline = file['input'].readline() + m = re.search('(\d+)\s*head', firstline.lower()) + if m: + headerlines = int(m.group(1)) + headers = [firstline]+[file['input'].readline() for i in range(headerlines)] + else: + headerlines = 1 + headers = firstline + + content = file['input'].readlines() + file['input'].close() + if 0 in options.resolution: + for header in headers: + headitems = header.split() + if headitems[0] == 'resolution': # located resolution entry + for i in xrange(3): + options.resolution[i] = mappings['resolution'](headitems[headitems.index(identifiers['resolution'][i])+1]) + + resolution = [0,0,0] + dimension = [0.0,0.0,0.0] + new_header = [] + for header in headers: + headitems = header.split() + if headitems[0] == 'resolution': # located resolution entry + for i in xrange(3): + resolution[i] = mappings['resolution'](headitems[headitems.index(identifiers['resolution'][i])+1]) + header = "resolution\ta %i\tb %i\tc %i\n"%(options.resolution[0],options.resolution[1],options.resolution[2],) + if headitems[0] == 'dimension': # located dimension entry + for i in xrange(3): + dimension[i] = mappings['dimension'](headitems[headitems.index(identifiers['dimension'][i])+1]) + header = "dimension\tx %f\ty %f\tz %f\n"%(dimension[0]/resolution[0]*options.resolution[0], + dimension[1]/resolution[1]*options.resolution[1], + dimension[2]/resolution[2]*options.resolution[2],) + + new_header.append(header) + + if resolution == [0,0,0]: + print 'no resolution info found.' + sys.exit(1) + if dimension == [0.0,0.0,0.0]: + print 'no dimension info found.' + sys.exit(1) + + if file['name'] != 'STDIN': + print 'resolution: %s'%(' x '.join(map(str,resolution))) + print 'dimension: %s'%(' x '.join(map(str,dimension))) + + microstructure = numpy.zeros(resolution,'i') + i = 0 + for line in content: + for item in map(int,line.split()): + microstructure[i%resolution[0],(i/resolution[0])%resolution[1],i/resolution[0]/resolution[1]] = item + i += 1 + + microstructure_cropped = numpy.zeros(options.resolution,'i') + microstructure_cropped.fill({True:options.fill,False:microstructure.max()+1}[options.fill>0]) + xindex = list(set(xrange(options.offset[0],options.offset[0]+options.resolution[0])) & set(xrange(resolution[0]))) + yindex = list(set(xrange(options.offset[1],options.offset[1]+options.resolution[1])) & set(xrange(resolution[1]))) + zindex = list(set(xrange(options.offset[2],options.offset[2]+options.resolution[2])) & set(xrange(resolution[2]))) + translate_x = [i - options.offset[0] for i in xindex] + translate_y = [i - options.offset[1] for i in yindex] + translate_z = [i - options.offset[2] for i in zindex] + microstructure_cropped[min(translate_x):(max(translate_x)+1),min(translate_y):(max(translate_y)+1),min(translate_z):(max(translate_z)+1)] = microstructure[min(xindex):(max(xindex)+1),min(yindex):(max(yindex)+1),min(zindex):(max(zindex)+1)] + formatwidth = int(math.floor(math.log10(microstructure.max()+1))) + + +# ------------------------------------------ assemble header --------------------------------------- + + output = ''.join(new_header) + +# ------------------------------------- regenerate texture information ---------------------------------- + + for z in xrange(options.resolution[2]): + for y in xrange(options.resolution[1]): + output += {True:' ',False:'\n'}[options.twoD].join(map(lambda x: ('%%%ii'%formatwidth)%x, microstructure_cropped[:,y,z])) + '\n' + + #output += '\n' + +# ------------------------------------------ output result --------------------------------------- + + file['output'].write(output) + + if file['name'] != 'STDIN': + file['output'].close() + os.rename(file['name']+'_tmp',file['name']) + \ No newline at end of file diff --git a/processing/setup/setup_processing.py b/processing/setup/setup_processing.py index e47016352..11f216e03 100755 --- a/processing/setup/setup_processing.py +++ b/processing/setup/setup_processing.py @@ -83,6 +83,7 @@ bin_link = { \ 'spectral_geomCheck.py', 'spectral_geomMultiply.py', 'spectral_geomCrop.py', + 'spectral_geomCanvas.py', 'spectral_minimalSurface.py', 'spectral_vicinityOffset.py', 'spectral_ang2geom.py',