##################################
#                                #
# Last modified 2018/04/06       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import os
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) < 2:
        print 'usage: python %s datafile.npy outfile [-average bp] [-window bp] [-sequence]' % sys.argv[0]
        sys.exit(1)
    
    input = sys.argv[1]
    outfilename = sys.argv[2]

    window=1
    averageRadius=0
    doAverage=False
    if '-average' in sys.argv:
        doAverage=True
        averageRadius=int(int(sys.argv[sys.argv.index('-average')+1])/2.0)
        print 'will average signal over', 2*averageRadius, 'bp'

    doWindow=False
    if '-window' in sys.argv:
        doWindow=True
        window = int(sys.argv[sys.argv.index('-window')+1])
        print 'will split into windows of size', window, 'bp'

    doSequence = False
    if '-sequence' in sys.argv:
        doSequence = True
        print 'will treat input as sequence, and will take the unsigned sum over the four values'

    Data = np.load(input)

    print len(Data), len(Data[0])

    DataMatrix = []

    i=0
    for row in Data:
        i+=1
        newrow = []
        for score in row:
            if doSequence:
                newscore = 0
                for ss in score:
                    newscore += math.fabs(ss)
            else:
                newscore = sum(score)
            newrow.append(newscore)
        finalrow = []
        if doWindow:
            for i in range(0, len(newrow) - window, window):
                score = sum(newrow[i:i + window])/(window + 0.0)
                finalrow.append(score)
        elif doAverage:
            for i in range(0 + averageRadius, len(newrow) - averageRadius):
                score = sum(newrow[i - averageRadius:i + averageRadius])/(2.0*averageRadius)
                finalrow.append(score)
        else:
            for i in range(len(newrow)):
                finalrow.append(newrow[i])
        DataMatrix.append(finalrow)

    print len(DataMatrix), len(DataMatrix[0])

    NRows = len(DataMatrix)
    NColumns = len(DataMatrix[0])

    FinalValues = []

    for i in range(NColumns):
        FinalValues.append(0)

    for i in range(NRows):
        for j in range(NColumns):
            FinalValues[j] += DataMatrix[i][j]

    outfile = open(outfilename,'w')

    for i in range(NColumns):
        outline = str(i) + '\t' + str(FinalValues[i]/NRows)
        outfile.write(outline + '\n')

    outfile.close()
   
run()
