import sys,Image,Bio.SeqIO,math,os,random
fn=sys.argv[1]
seqs=Bio.SeqIO.parse(open(fn, "rU"), "fasta")
first=list(seqs)[0]
print first.description
aas=str(first.seq)
pack_len=3
frames=9999
def aa_image(sp,n=0):
"""
Amino Acid Triplet Projection:
Projection of amino acid sequence into an image.
Amino acid triplets are used as colors.
- At each frame, amino acids are randomly mapped to uniformly distributed RGB intensities.
- Triplet phase is randomly selected at each frame.
"""
aa_color=lambda x : int(255*float(aalist.index(x))/float(len(aalist)))
aalist=list('RHKDESTNQCUGPAILMFWYV')
if n: random.shuffle(aalist)
x=int(math.sqrt(len(sp))*1.2)
y=int(float(len(sp))/float(x))
img=Image.new('RGB',(x*2,y*2))
for i in range(x):
for j in range(y):
idx=i*y+j
if idx>=len(sp): continue
t=sp[idx]
col=tuple(map(aa_color,list(t)))
if len(col)<3: continue
for xi,yi in [(0,0),(1,0),(0,1),(1,1)]: img.putpixel((i*2+xi,j*2+yi),col)
fn_png=os.path.splitext(fn)[0]+'.png'
if n: fn_png=os.path.splitext(fn)[0]+'%04d.png' % n
img.save(fn_png)
print 'Saved to %s' % fn_png
for c in range(1,frames):
r=int(random.random()*3)
if frames>2: aar=aas[r:]
else: aar=aas
sp=[aar[x:x+pack_len] for x in range(0,len(aar),pack_len)]
aa_image(sp,c)