##################################
#                                #
# Last modified 04/03/2011       # 
#                                #
# 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) < 8:
        print 'usage: python %s datafile title labelX labelY rangeLeft RangeRight binsize outfile [-titlesize size] [-resize factor]' % sys.argv[0]
        print '       input file format: <value> <tab> <counts>'
        print '       enter lables from the command line with "_" instead of sapces, the code will replace them with spaces'
        print '       the script will ignore header lines in the input file starting with #'
        print '       default color is red'
        print '       default size is 10x10, you can resize by using the -factor option'
        sys.exit(1)
    
    input = sys.argv[1]
    title = sys.argv[2].replace('_',' ')
    label1 = sys.argv[3].replace('_',' ')
    label2 = sys.argv[4].replace('_',' ')
    rangeLeft=float(sys.argv[5])
    rangeRight=float(sys.argv[6])
    binSize=int(sys.argv[7])
    outfilename = sys.argv[8]

    color='r'
    if '-color' in sys.argv:
        color=sys.argv[sys.argv.index('-color')+1]

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

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

    DataDict={}

    for i in range(rangeLeft,rangeRight,binSize):
        DataDict[i]=0

    A=[]
    B=[]
    lineslist=open(input)
    for line in lineslist:
        if line.startswith('#'):
            continue
        fields=line.strip().split('\t')
        value=float(fields[0])
        counts=float(fields[1])
        if DataDict.has_key(value):
            DataDict[value]=counts
        else:
            if value < min(DataDict.keys()):
                DataDict[min(DataDict.keys())]+=counts
            if value > max(DataDict.keys()):
                DataDict[max(DataDict.keys())]+=counts


    keys=DataDict.keys()
    keys.sort()

    for i in keys:
        A.append(i)
        B.append(DataDict[i])

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

    lowerlimitX=min(A)
    upperlimitX=max(A)
    lowerlimitY=min(B)
    upperlimitY=max(B)

    ax.plot(A,B,'r-', linewidth=5*resize)
#    ax.plot(A,B)
    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)
    xticks=ax.get_xticks()
    yticks=ax.get_yticks()
    xticklabels=[]
    yticklabels=[]
    for i in xticks:
        xticklabels.append(str(int(i)))
    for i in yticks:
        yticklabels.append(str(int(i)))
    ax.set_xticklabels(xticklabels,size=20*resize,weight='bold')
    ax.set_yticklabels(yticklabels,size=20*resize,weight='bold')

    savefig(outfilename)
   
run()
