##################################
#                                #
# Last modified 2019/07/09       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import string
import math
import gzip
import numpy as np

def run():

    if len(sys.argv) < 4:
        print 'usage: python %s wig chrom.sizes window outputfilename [-int]' % sys.argv[0]
        sys.exit(1)

    doInt = False
    if '-int' in sys.argv:
        doInt = True
    
    wig = sys.argv[1]

    W = int(sys.argv[3])
    if W % 2 == 0:
        W1 = W/2
        W2 = W/2
    else:
        W1 = W/2
        W2 = W/2+1

    print W,W1,W2

    chrominfo = sys.argv[2]
    chromInfoDict = {}
    linelist = open(chrominfo)
    for line in linelist:
        fields = line.strip().split('\t')
        chr = fields[0]
        start = 0
        end = int(fields[1])
        chromInfoDict[chr] = end

    outfilename = sys.argv[4]

    outfile=open(outfilename,'w')

    currentChr = ''
    ValuesDict = {}
    if wig.endswith('.gz'):
        linelist = gzip.open(wig)
    else:
        linelist = open(wig)
    for line in linelist:
        if line.startswith('#'):
            continue
        fields = line.strip().split('\t')
        chr = fields[0]
        left = int(fields[1])
        right = int(fields[2])
        score = float(fields[3])
        if currentChr == '':
            currentChr = chr
            print chr
        if chr != currentChr:
            positions = ValuesDict.keys()
            positions.sort()
            currentPos = 0
            for pos in positions:
                if pos <= currentPos:
                    continue
                for i in range(pos - W1,pos + W2):
                    if i <= currentPos:
                        continue
                    score = 0
                    for j in range(i - W1,i + W2):
                        if ValuesDict.has_key(j):
                            score += ValuesDict[j]
                    if doInt:
                        score = int(score/W)
                    currentPos = i
                    if i+1 < chromInfoDict[currentChr] and score != 0:
                        outline = currentChr + '\t' + str(i) + '\t' + str(i+1) + '\t' + str(score)
                        outfile.write(outline + '\n')
            ValuesDict = {}            
            currentChr = chr
            print chr
        for i in range(left,right):
            ValuesDict[i] = score
    positions = ValuesDict.keys()
    positions.sort()
    currentPos = 0
    for pos in positions:
        if pos <= currentPos:
            continue
        for i in range(pos - W1,pos + W2):
            if i <= currentPos:
                continue
            score = 0
            for j in range(i - W1,i + W2):
                if ValuesDict.has_key(j):
                    score += ValuesDict[j]
            if doInt:
                score = int(score/W)
            currentPos = i
            if i+1 < chromInfoDict[currentChr] and score != 0:
                outline = currentChr + '\t' + str(i) + '\t' + str(i+1) + '\t' + str(score)
                outfile.write(outline + '\n')

    outfile.close()
   
run()
