From 4f6e0eda32d26fb643e91e1e394c440b03f369a8 Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Wed, 5 Sep 2012 15:15:11 +0000 Subject: [PATCH] splitter geom-file un/packing into two separate scripts. --- processing/pre/spectral_geomPack.py | 239 +++++++++++++++----------- processing/pre/spectral_geomUnpack.py | 150 ++++++++++++++++ processing/setup/setup_processing.py | 1 + 3 files changed, 288 insertions(+), 102 deletions(-) create mode 100755 processing/pre/spectral_geomUnpack.py diff --git a/processing/pre/spectral_geomPack.py b/processing/pre/spectral_geomPack.py index 2e6b311a1..25cdf9995 100755 --- a/processing/pre/spectral_geomPack.py +++ b/processing/pre/spectral_geomPack.py @@ -1,69 +1,51 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- +# -*- coding: UTF-8 no BOM -*- -import os,re,sys,math,string +import os,sys,string,re,math,numpy from optparse import OptionParser, OptionGroup, Option, SUPPRESS_HELP - -def writeKey(outType, begin, counter): - if outType == 'range': - a=str(begin) +' to '+ str(begin+counter-1)+'\n' - file['output'].write(a) - if outType == 'copy': - b=str(counter)+ ' copies of '+str(begin)+'\n' - file['output'].write(b) - if outType == 'none': - c=str(begin)+'\n' - file['output'].write(c) - - + # ----------------------------- 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",) + + 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) - + 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'], + 'origin': ['x','y','z'], + } +mappings = { + 'resolution': lambda x: int(x), + 'dimension': lambda x: float(x), + 'origin': lambda x: float(x), + 'homogenization': lambda x: int(x), + } + -# -------------------------------------------------------------------- -# MAIN -# -------------------------------------------------------------------- parser = OptionParser(option_class=extendedOption, usage='%prog options [file[s]]', description = """ -Pack/unpack geometry files by adding or removing range indicator "to" and copy indicator "copies of". - +compress geometry files with ranges "a to b" and/or multiples "n of x". """ + string.replace('$Id$','\n','\\n') ) +(options, filenames) = parser.parse_args() -parser.add_option('-p','--pack', dest='pack', action='store_true', \ - help='pack input file [%default]') -parser.add_option('-u','--unpack', dest='unpack', action='store_true', \ - help='unpack input file [%default]') -parser.add_option('-l','--linelength', dest='lineLength',type='int', nargs=1, \ - help='length of line, leave blank for auto (FPs in x direction)') - - -parser.set_defaults(pack = False) -parser.set_defaults(unpack = False) -parser.set_defaults(lineLength = 0) - -(options,filenames) = parser.parse_args() - -if options.pack and options.unpack: - print 'cannot pack and unpack at the same time' # ------------------------------------------ setup file handles --------------------------------------- files = [] @@ -72,61 +54,114 @@ if filenames == []: else: for name in filenames: if os.path.exists(name): - files.append({'name':name, 'input':open(name), 'output':open(name+'_tmp','w+')}) + files.append({'name':name, 'input':open(name), 'output':open(name+'_tmp','w')}) # ------------------------------------------ loop over input files --------------------------------------- -for file in files: - digits=2 - counter = 1 - begin = -1 - outType = '' - current=-1 # current material ID - wordsWritten=0 # number of words per line in the output file - currentLine=0 - if file['name'] != 'STDIN': print file['name'] - for line in file['input']: - words=line.split() - currentLine+=1 - if('head' in line): headNumber=int(words[0])+1 - if(currentLine<=headNumber): - if('maxgraincount'==words[0].lower()): digits = 1+int(math.log10(int(words[1]))) - if(words[0].lower()=='resolution' and words[1].lower()=='a' and options.lineLength==0): - options.lineLength = int(words[2].lower()) - file['output'].write(line) - else: - if options.unpack: # unpacking the geometry file - words = map(str.lower,line.split()) - if len(words) > 1: # any packing keywords? - if (words[1] == 'to'): line = ' '.join(map(str,range(int(words[0]),int(words[2])+1))) - if (words[1] == 'copies' and words[2] == 'of'): line = ' '.join([words[3]]*int(words[0])) - for word in line.split(): - wordsWritten += 1 - file['output'].write(word.zfill(digits)+{True:'\n',False:' '}[wordsWritten%options.lineLength == 0]) # newline every options.linelength words - - if options.pack: # packing the geometry file - numbers=line.split() - i=len(numbers) - for x in xrange(i): - last=current - current = int(numbers[x]) - if current == last+1 and current==begin+counter: - counter+=1 - outType = 'range' - elif current == begin and current == last: - counter+=1 - outType = 'copy' - else: - writeKey(outType, begin, counter) - counter = 1 - outType= 'none' - begin = current - - - writeKey(outType, begin, counter) # just for packing (last line), outType not defined for unpacking - - - file['output'].close() +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() - os.rename(file['name']+'_tmp',file['name']) - + + info = {'resolution': [0,0,0], + 'dimension': [0.0,0.0,0.0], + 'origin': [0.0,0.0,0.0], + 'homogenization': 1, + } + + new_header = [] + for header in headers: + headitems = map(str.lower,header.split()) + if headitems[0] in mappings.keys(): + if headitems[0] in identifiers.keys(): + for i in xrange(len(identifiers[headitems[0]])): + info[headitems[0]][i] = \ + mappings[headitems[0]](headitems[headitems.index(identifiers[headitems[0]][i])+1]) + else: + info[headitems[0]] = mappings[headitems[0]](headitems[1]) + + if info['resolution'] == [0,0,0]: + print 'no resolution info found.' + continue + if info['dimension'] == [0.0,0.0,0.0]: + print 'no dimension info found.' + continue + + if file['name'] != 'STDIN': + print 'resolution: %s'%(' x '.join(map(str,info['resolution']))) + print 'dimension: %s'%(' x '.join(map(str,info['dimension']))) + print 'origin: %s'%(' : '.join(map(str,info['origin']))) + + new_header.append("resolution\ta %i\tb %i\tc %i\n"%( + info['resolution'][0], + info['resolution'][1], + info['resolution'][2],)) + new_header.append("dimension\tx %f\ty %f\tz %f\n"%( + info['dimension'][0], + info['dimension'][1], + info['dimension'][2])) + new_header.append("origin\tx %f\ty %f\tz %f\n"%( + info['origin'][0], + info['origin'][1], + info['origin'][2])) + new_header.append("homogenization\t%i\n"%info['homogenization']) + +# ------------------------------------------ assemble header --------------------------------------- + + file['output'].write('%i\theader\n'%(len(new_header))+''.join(new_header)) + +# ------------------------------------------ pack input --------------------------------------- + + type = '' + former = -1 + start = -1 + reps = 0 + + for line in content: + for current in map(int,line.split()): + print 'current',current,'former',former + if current == former+1 and start+reps == former+1: + type = 'to' + reps += 1 + elif current == former and start == former: + type = 'of' + reps += 1 + else: + output = {'': '', + '.': str(former)+'\n', + 'to': '%i to %i\n'%(former-reps+1,former), + 'of': '%i of %i\n'%(reps,former), + }[type] + file['output'].write(output) + print 'did output',type,output + type = '.' + start = current + reps = 1 + + former = current + +# write out last item... + + output = {'.': str(former), + 'to': '%i to %i'%(former-reps+1,former), + 'of': '%i of %i'%(reps,former), + }[type] + file['output'].write(output+'\n') + +# ------------------------------------------ output finalization --------------------------------------- + + if file['name'] != 'STDIN': + file['output'].close() + os.rename(file['name']+'_tmp',file['name']) diff --git a/processing/pre/spectral_geomUnpack.py b/processing/pre/spectral_geomUnpack.py new file mode 100755 index 000000000..d663e56da --- /dev/null +++ b/processing/pre/spectral_geomUnpack.py @@ -0,0 +1,150 @@ +#!/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'], + 'origin': ['x','y','z'], + } +mappings = { + 'resolution': lambda x: int(x), + 'dimension': lambda x: float(x), + 'origin': lambda x: float(x), + 'homogenization': lambda x: int(x), + } + + +parser = OptionParser(option_class=extendedOption, usage='%prog options [file[s]]', description = """ +Unpack geometry files containing ranges "a to b" and/or "n of x" multiples (exclusively in one line). +""" + string.replace('$Id: spectral_geomCanvas.py 1576 2012-06-26 18:08:50Z MPIE\p.eisenlohr $','\n','\\n') +) + +parser.add_option('-2', '--twodimensional', dest='twoD', action='store_true', \ + help='output geom file with two-dimensional data arrangement') + +parser.set_defaults(twoD = False) + +(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() + + info = {'resolution': [0,0,0], + 'dimension': [0.0,0.0,0.0], + 'origin': [0.0,0.0,0.0], + 'homogenization': 1, + } + + new_header = [] + for header in headers: + headitems = map(str.lower,header.split()) + if headitems[0] in mappings.keys(): + if headitems[0] in identifiers.keys(): + for i in xrange(len(identifiers[headitems[0]])): + info[headitems[0]][i] = \ + mappings[headitems[0]](headitems[headitems.index(identifiers[headitems[0]][i])+1]) + else: + info[headitems[0]] = mappings[headitems[0]](headitems[1]) + + if info['resolution'] == [0,0,0]: + print 'no resolution info found.' + continue + if info['dimension'] == [0.0,0.0,0.0]: + print 'no dimension info found.' + continue + + format = {True: info['resolution'][0], + False: 1}[options.twoD] + + if file['name'] != 'STDIN': + print 'resolution: %s'%(' x '.join(map(str,info['resolution']))) + print 'dimension: %s'%(' x '.join(map(str,info['dimension']))) + print 'origin: %s'%(' : '.join(map(str,info['origin']))) + + new_header.append("resolution\ta %i\tb %i\tc %i\n"%( + info['resolution'][0], + info['resolution'][1], + info['resolution'][2],)) + new_header.append("dimension\tx %f\ty %f\tz %f\n"%( + info['dimension'][0], + info['dimension'][1], + info['dimension'][2])) + new_header.append("origin\tx %f\ty %f\tz %f\n"%( + info['origin'][0], + info['origin'][1], + info['origin'][2])) + new_header.append("homogenization\t%i\n"%info['homogenization']) + +# ------------------------------------------ assemble header --------------------------------------- + + file['output'].write('%i\theader\n'%(len(new_header))+''.join(new_header)) + +# ------------------------------------------ unpack input --------------------------------------- + + wordsWritten = 0 + for line in content: + words = map(str.lower,line.split()) + if len(words) > 1: # any packing keywords? + if (words[1] == 'to'): words = map(str,range(int(words[0]),int(words[2])+1)) + if (words[1] == 'of'): words = [words[2]]*int(words[0]) + + for word in words: + wordsWritten += 1 + file['output'].write(word+{True:'\n',False:' '}[wordsWritten%format == 0]) # newline every format words + +# ------------------------------------------ output finalization --------------------------------------- + + if file['name'] != 'STDIN': + file['output'].close() + os.rename(file['name']+'_tmp',file['name']) diff --git a/processing/setup/setup_processing.py b/processing/setup/setup_processing.py index 674c74249..500288eb4 100755 --- a/processing/setup/setup_processing.py +++ b/processing/setup/setup_processing.py @@ -91,6 +91,7 @@ bin_link = { \ 'spectral_randomSeeding.py', 'spectral_layeredGeom.py', 'spectral_geomPack.py', + 'spectral_geomUnpack.py', 'spectral_voronoiTessellation.py', 'OIMang_hex2cub.py', ],