##################################
#                                #
# Last modified 2018/03/23       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import os

def run():

    if len(sys.argv) < 6:
        print 'usage: python %s bed chrFieldID leftFieldID rightFieldID left_extension right_extension [-midPoint midPointFieldID|narrowPeak|middle] [-TFDragoNNintervals 0|1|-1]' % sys.argv[0]
        sys.exit(1)

    doMP = False
    doNP = False
    doMiddle = False
    if '-midPoint' in sys.argv:
        doMP = True
        if sys.argv[sys.argv.index('-midPoint') + 1] == 'narrowPeak':
            doNP = True
        elif sys.argv[sys.argv.index('-midPoint') + 1] == 'middle':
            doMiddle = True
        else:
            MPFieldID = int(sys.argv[sys.argv.index('-midPoint') + 1])

    doTFDNN = False
    if '-TFDragoNNintervals' in sys.argv:
        doTFDNN = True
        TFDNN = sys.argv[sys.argv.index('-TFDragoNNintervals') + 1]

    input = sys.argv[1]
    chrFieldID = int(sys.argv[2])
    leftFieldID = int(sys.argv[3])
    rightFieldID = int(sys.argv[4])
    leftExt = int(sys.argv[5])
    rightExt = int(sys.argv[6])
#    outfilename = sys.argv[7]

#    outfile = open(outfilename, 'w')

    if input.endswith('.bz2'):
        cmd = 'bzip2 -cd ' + input
    elif input.endswith('.gz'):
        cmd = 'zcat ' + input
    else:
        cmd = 'cat ' + input
    p = os.popen(cmd, "r")
    line = 'line'
    i=0
    while line != '':
        line = p.readline()
        if line == '':
            break
        if line.startswith('#'):
#            outfile.write(line)
            print line.strip()
            continue
        if line.strip() == '':
            continue
        fields = line.strip().split('\t')
        chr = fields[chrFieldID]
        left = int(fields[leftFieldID])
        right = int(fields[rightFieldID])
        middle = int((left + right)/2.0)
        if doMP:
            if doNP:
                MP = left + int(fields[9])
            elif doMiddle:
                MP = int((left + right)/2.0)
            else:
                MP = int(fields[MPFieldID])
            newLeft = MP - leftExt
            newRight = MP + rightExt
        else:
            newLeft = left - leftExt
            newRight = right + rightExt
        outline = ''
        if doTFDNN:
            outline = chr + '\t' + str(newLeft) + '\t' + str(newRight) + '\t' + TFDNN
        else:
            for ID in range(len(fields)):
                if ID == leftFieldID:
                    outline = outline + str(newLeft) + '\t'
                elif ID == rightFieldID:
                    outline = outline + str(newRight) + '\t'
                else:
                    outline = outline + fields[ID] + '\t'
        print outline.strip()
#        outfile.write(outline.strip() + '\n')
#    outfile.close()

run()

