#!/usr/bin/python
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)