Source code for tools_ssg

import sys
import operator
import string
import numpy as np
from math import *
from kvh.kvh import *
letters=string.ascii_lowercase

[docs]def aff(name, obj, ident=0, f=sys.stdout): r""" print formatted object: name=obj """ saveout=sys.stdout sys.stdout=f to=type(obj) if to == type({}): # dictionary case print('|'*ident+'+'+str(name)+' #'+str(len(obj))) for k in obj: aff('{'+str(k)+'}', obj[k], ident+1, f) elif to == type(()): # tuple case print('|'*ident+'+'+str(name)+' #'+str(len(obj))) for (i,k) in enumerate(obj): aff('('+str(i)+')', obj[i], ident+1, f) elif to == type([]): # list case print('|'*ident+'+'+str(name)+' #'+str(len(obj))) for (i,k) in enumerate(obj): aff('['+str(i)+']', obj[i], ident+1, f) else: print('%s%s: %s' % ('|'*ident+'+', name, obj)) sys.stdout=saveout
[docs]def asort(d): r"""sorts a dictionnary by value preserving key=value association the result is a list of tuples (key,value)""" return sorted(list(a.items()), key=operator.itemgetter(1))
[docs]def iterbit(i, size=0): r"""iterator on bits in integer starting from 0-position. The iterator stops at highest non-zero bit""" i=int(i) moveb=1 b_no=0 while (moveb <= i and size==0) or (b_no < size): yield (1 if (moveb&i) else 0) moveb<<=1 b_no+=1
[docs]def iternumbit(i, size=0): r"""iterator on bits and its number in integer starting from 0-position. The iterator yields tuples (n,bit). If optional size is zero then it stops at highest non-zero bit. If not, it will stop at bit number size-1.""" i=int(i) moveb=1 b_no=0 while (moveb <= i and size==0) or (b_no < size): yield (b_no, 1 if (moveb&i) else 0) moveb<<=1 b_no+=1
[docs]def sumbit(i): r""":returns: sum of bits in an integer""" return sum(iterbit(i))
[docs]def strbit32(i): r""":returns: a string of 0-1s (in chunk of 4) in an 32 bit integer""" i=int(i) moveb=1<<31 res='' for b in range(32): res+=str(int((moveb&i) > 0)) res+=' ' if not (b+1)%4 and b < 31 else '' moveb>>=1 return res
[docs]def strbit(i,size=0): r""":returns: the lowest part of integer as string binary representation""" return ''.join(('1' if b else '0') for b in iterbit(i,size) )[::-1]
[docs]def rstrbit(i,size=0): r""":returns: the integer as reversed string binary representation. The lowest bit is on the left side""" return ''.join(('1' if b else '0') for b in iterbit(i,size) )
[docs]def setbit32(i, nb): r"""set a bit number nb (0 based) in an integer i""" if (nb < 0 or nb > 31): return i; # do nothing to i i|=(1<<nb)
[docs]def valval(o, keepNone=True): r""":returns: an iterator over values of values, i.e. collapsing values of fisrt two nested lists in one list, for example.""" if isstr(o): yield o else: for i1 in o: if isstr(i1): yield i1 else: try: for i2 in i1: if keepNone: yield i2 elif i2 is not None: yield i2 except: if keepNone: yield i1 elif i1 is not None: yield i1
[docs]def join(c,l,p='',s='',a=''): r"""join the items of the list (or iterator) l separated by c. Each item is prefixed with p and suffixed with s. If the join result is empty for any reason, an alternative a is returned. p, s and a are optional""" i=0 return c.join(p+str(i)+s for i in l) or a
[docs]def joint(c,l,p='',s='',a=''): r"""join "true" items of the list (or iterator) l separated by c. Each item is prefixed with p and suffixed with s. If the join result is empty for any reason, an alternative a is returned. p, s and a are optional""" i=0 return c.join(p+str(i)+s for i in l if i) or a
[docs]def list2count(l, incr=1): r"""count values in a (short) list l incrementing the counter by optional incr. :returns: a dictionary {item:count}""" dico=dict((x,l.count(x)*incr) for x in set(l)) return dico
[docs]def strbit2int(s): r"""translate a string of 0's and 1's interpreted as bits to an integer all characters different from 0,1 are silently ignored.""" res=0 movb=1 for c in s[::-1]: if c=='1': res+=movb elif c!='0': continue movb<<=1 return res
[docs]def setcharbit(s,ch,i): r"""set character ch in a string s everywhere a corresponding bit of i is set""" res=''.join((ch if b else s[-b_no-1]) for (b_no,b) in iternumbit(i)) #print 'in:', s, ch, strbit(i) #print 'r', res res=s[:len(s)-len(res)]+res[::-1] #print 'final', res return res
[docs]def expandbit(i,pos): r"""copy bits set to 1 in i to the result position given in the list pos. length of pos must be greater or equal to bitlength of i""" #print i, pos;## return sum(b<<pos[b_no] for (b_no,b) in iternumbit(i))
[docs]def isstr(s): r""":returns: True if the argument is a string""" return isinstance(s,str)
[docs]def trd(l, d, p="", s="", a=""): r"""translate items in an iterable l by a dictionary d, prefixing translated items by optional p and suffixing them by optional s. If an item is not found in the dictionnary alternative string a is used. If a==None, the item is left unchanged. No prefix or suffix are applied in both case. :returns: iterator""" return (p+str(d[i])+s if i in d else i if a==None else a for i in l)
[docs]def icumo2iiso(icumo, size): r""":returns: iterator on isotopomers composing a given icumo. size is carbon number""" nzero=size-sumbit(icumo) zpos=[n for (n,b) in iternumbit(icumo, size) if not b] return (expandbit(iz,zpos)+icumo for iz in range(1<<nzero))
[docs]def reverse(it): r"""reverse order of an iterable""" for i in range(len(it),0,-1): yield it[i-1]
[docs]def ssign(i, sp="+", sm="-"): r""":returns: a string of i sign: sp (i>=0) or sm (i<0). """ return sp if float(i) >= 0 else sm
[docs]def arr2pbm(A, fp): r"""Write an image map of non-zero entries of matrix A to file pointer fp. Matrix A is an array""" fp.write("P1\n%d %d\n" % A.shape[::-1]) for row in A: p=0 for c in row: fp.write("1 " if c else "0 ") p+=2 if p >= 69: fp.write("\n") p=0 fp.write("\n") p=0
[docs]def cumsum(l, tot=0): r""":Returns: an iterable of the length len(l)+1 with cumulated sum of items in l. First element in cumsum is equal to initial value of tot. Result depends on the meaning of "+" operator for l items and of tot type. .. doctest: >>> list(cumsum("abc",tot="")) ['', 'a', 'ab', 'abc'] >>> list(cumsum(xrange(1,5))) [0, 1, 3, 6, 10] """ for i in l: yield tot tot+=i yield tot
[docs]def wxlay2py(kvt, parent=[None]): r""" :returns: a string with python code generating wxWindow widget layout described in kvh tlist sturcture """ res="" # get the kvh tuples for (k,v) in kvt: if k[:3]=="wx." or k[:3]=="wx_"and type(v)==type([]): ## produce the code for this widget # call class init varname=kvh_getv_by_k(v, ["varname"]) res+=(varname+"=") if varname else "" param=kvh_getv_by_k(v, ["param"]) if param: param=param.replace(".parent", str(parent[-1])) if len(parent) > 1: param=param.replace(".top", str(parent[1])) res+=k+"("+(param or "")+");\n" # recursivly create children res+=wxlay2py(v, parent+[varname]) # call methods if any and varname is set cl=kvh_getv_by_k(v, ["callmeth"]) if varname and cl: for (kc,vc) in cl: if vc: # if key and value store the result in key vc=vc.replace(".parent", str(parent[-1])) vc=vc.replace(".self", varname) kc=kc.replace(".self", varname) if len(parent) > 1: vc=vc.replace(".top", str(parent[1])) res+=kc+"="+(varname+"." if vc[:2] != "wx" else "")+vc+";\n" elif kc: # just call the key content if kc[:1] != "#": kc=kc.replace(".parent", str(parent[-1])) kc=kc.replace(".self", varname) if len(parent) > 1: kc=kc.replace(".top", str(parent[1])) res+=(varname+"." if vc[:2] != "wx" else "")+kc+";\n" else: # we don't know what it is, just silently ignore pass return(res)
[docs]def ulong(i): r"""ulong(i) -> workarounded ulong""" return(-((i^0xffffffff)+1))
[docs]def read_table(fp, sep=None, skip=0, header=False): r"""read_table(f) -> dict(mat, col_names) read a plain text file f in a numpy mat. If some columns are not numerical, they are replaced by np.nan. If header=True, number of column names in the first row after skip must be the same as the number of values in each following row. """ open_here=False if isstr(fp): fp=open(fp, "rb") fp.seek(0) open_here=True i=0 while i < skip: fp.readline() i+=1 continue line=fp.readline() fields=line.strip().split(sep) # count fields, create array col_names=fields if header else None # proceed normal (i.e. data) line data=np.asmatrix(np.ndfromtxt(fp, delimiter=sep)) if open_here: fp.close() return {"mat": data, "col_names": col_names}