##################################
#                                #
# Last modified 09/11/2013       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import string

def run():

    if len(sys.argv) < 2:
        print 'usage: python %s list_of_bed_files outputfilename [-scores]' % sys.argv[0]
        print '\tlist_of_bed_files format: file_name \t chrFieldID'
        print '\tlist_of_bed_files format if you use the [-scores] option: file_name \t chrFieldID \t ScoreFieldID; the maximum score will then be outputted'
        print '\tuse - instead of a filename if you want to print the output to stdout'
        sys.exit(1)
    
    files = sys.argv[1]
    outfilename = sys.argv[2]

    doStdOut = False
    if outfilename == '-':
        doStdOut = True

    doScores = False
    if '-scores' in sys.argv:
        doScores = True

    RegionDict={}
    linelist = open(files)
    for line in linelist:
        fields1 = line.strip().split('\t')
        file = fields1[0]
        chrID = int(fields1[1])
        if doScores:
            scoreID = int(fields1[2])
        lines = open(file)
        if doStdOut:
            pass
        else:
            print file
        for line2 in lines:
            if line2.startswith('#'):
                continue
            fields = line2.strip().split('\t')
            chr = fields[chrID]
            left = int(fields[chrID+1])
            right = int(fields[chrID+2])
            if RegionDict.has_key(chr):
                pass
            else:
                RegionDict[chr]=[]
            if doScores:
                score = float(fields[scoreID])
                RegionDict[chr].append((left,right,score))
            else:
                RegionDict[chr].append((left,right))


    if doStdOut:
        pass
    else:
        outfile = open(outfilename, 'w')
    chromosomes = RegionDict.keys()
    chromosomes.sort()
    for chr in chromosomes:
        CoverageDict={}
        if doScores:
            for (left,right,score) in RegionDict[chr]:
                for i in range(left,right):
                    if CoverageDict.has_key(i):
                        pass
                    else:
                        CoverageDict[i]=0
                    CoverageDict[i] = max(CoverageDict[i],score)
        else:
            for (left,right) in RegionDict[chr]:
                for i in range(left,right):
                    if CoverageDict.has_key(i):
                        pass
                    else:
                        CoverageDict[i]=0
                    CoverageDict[i]+=1
        positions = CoverageDict.keys()
        positions.sort()
        k=0
        for i in positions:
            k+=1
            if k % 5000000 == 0:
                if doStdOut:
                    pass
                else:
                    print chr, i
            outline = chr + '\t' + str(i) + '\t' + str(i+1) + '\t' + str(CoverageDict[i])
            if doStdOut:
                print outline
            else:
                outfile.write(outline + '\n')

    if doStdOut:
        pass
    else:
        outfile.close()
            
run()
