##################################
#                                #
# Last modified 2018/03/29       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import string
import math
import numpy as np
import matplotlib, copy
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from pylab import *
from matplotlib.patches import Circle, RegularPolygon
from matplotlib.collections import PatchCollection

def run():

    if len(sys.argv) < 3:
        print 'usage: python %s datafile color outfile [-saveps] [-resize factor] [-XYaspectRatio factor] [-alpha float]' % sys.argv[0]
        print '\tA data matrix with row and column titles is assumed as input'
        sys.exit(1)
    
    input = sys.argv[1]
    color = sys.argv[2]
    outfilename = sys.argv[3]

    doPostScript = False
    if '-saveps' in sys.argv:
        doPostScript = True

    ALPHA = 1
    if '-alpha' in sys.argv:
        ALPHA = float(sys.argv[sys.argv.index('-alpha')+1])

    resize = 1
    if '-resize' in sys.argv:
        resize = float(sys.argv[sys.argv.index('-resize')+1])
        print 'will resize dots by a factor of', resize

    XYaspect = 1
    if '-XYaspectRatio' in sys.argv:
        XYaspect = float(sys.argv[sys.argv.index('-XYaspectRatio')+1])

    Xlabels = []
    Ylabels = []

    A = []
    B = []
    lineslist=open(input)
    i=0
    for line in lineslist:
        fields = line.strip().split('\t')
        if line.startswith('#'):
            for j in range(1,len(fields)):
                Xlabels.append(fields[j])
                A.append(j)
            continue
        scores = []
        for j in range(1,len(fields)):
            scores.append(float(fields[j]))
        B.append(scores)
        Ylabels.append(fields[0])

    rect = 0.10,0.10,0.8,0.8
    fig = figure(figsize=(len(A), len(B)*XYaspect))
    print (len(A), len(B)*XYaspect)
#    ax = fig.add_subplot(1,1,1,aspect='equal')
    ax = fig.add_axes(rect)

    for i in range(len(B)):
        K = []
        for j in (A):
            K.append(i)
        SS = np.array(B[i])
        ax.scatter(A, K, c=color, s=SS*resize, alpha=ALPHA)

#    ax.set_title(title,size=titlesize*resize,weight='bold')
#    ax.set_xlabel(label1,size=30*resize,weight='bold')
#    ax.set_ylabel(label2,size=30*resize,weight='bold')
#    ax.set_xlim(lowerlimitX,upperlimitX)
#    ax.set_ylim(lowerlimitY,upperlimitY)
#    ax.set_xticklabels(Xlabels,size=20*resize,weight='bold')
#    ax.set_yticklabels(Ylabels,size=20*resize,weight='bold')

    savefig(outfilename)

    if doPostScript:
        savefig(outfilename + '.eps', format='eps')
   
run()
