##################################
#                                #
# Last modified 10/11/2011       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import string
import math
from sets import Set


def run():

    if len(sys.argv) < 3:
        print 'usage: python %s wigfilename1 wigfilename2 outfilename [-math.fabs] [-ERANGE]' % sys.argv[0]
        sys.exit(1)
    
    inputfilename1 = sys.argv[1]
    inputfilename2 = sys.argv[2]
    outfilename = sys.argv[3]

    outfile = open(outfilename, 'w')

    doAbs=False
    if '-math.fabs' in sys.argv:
        doAbs=True

    splitby='\t'
    if '-ERANGE' in sys.argv:
        splitby=' '

    CoverageDict={}

    linelist = open(inputfilename1)
    i=0
    for line in linelist:
        i+=1
        if i % 5000000 == 0:
            print str(i/1000000) + 'M lines processed in file1'
        if line.startswith('#'):
            continue
        fields=line.strip().split(splitby)
        chr = fields[0]
        if CoverageDict.has_key(chr):
            pass
        else:
            CoverageDict[chr]={}
        left = int(fields[1])
        right = int(fields[2])
        score = float(fields[3])
        if doAbs:
            score = math.fabs(score)
        for pos in range(left,right):
            CoverageDict[chr][pos] = score

    linelist = open(inputfilename2)
    i=0
    for line in linelist:
        i+=1
        if i % 5000000 == 0:
            print str(i/1000000) + 'M lines processed in file2'
        if line.startswith('#'):
            continue
        fields=line.strip().split(splitby)
        chr = fields[0]
        if CoverageDict.has_key(chr):
            pass
        else:
            CoverageDict[chr]={}
        left = int(fields[1])
        right = int(fields[2])
        score = float(fields[3])
        if doAbs:
            score = math.fabs(score)
        for pos in range(left,right):
            if CoverageDict[chr].has_key(pos):
                CoverageDict[chr][pos] += score
            else:
                CoverageDict[chr][pos] = score

    chromosomes=CoverageDict.keys()
    chromosomes.sort()
    for chr in chromosomes:
        print chr
        posKeys=CoverageDict[chr].keys()
        posKeys.sort()
        initial=(posKeys[0],CoverageDict[chr][posKeys[0]])
        previous=(posKeys[0],CoverageDict[chr][posKeys[0]])
        written=['']
        for i in posKeys[1:len(posKeys)]:
            if previous[0]+1 == i and previous[1]==CoverageDict[chr][i]:
                 previous=(i,CoverageDict[chr][i])
            else:
                 if written[0]==initial[0]:
                     print written, initial, previous
                 outline=chr+'\t'+str(initial[0])+'\t'+str(previous[0]+1)+'\t'+str(initial[1])
                 written=(initial[0],previous[0]+1)
                 outfile.write(outline+'\n')
                 initial=(i,CoverageDict[chr][i])
                 previous=(i,CoverageDict[chr][i])



run()
