##################################
#                                #
# Last modified 2024/02/12       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import gzip
import string
import math
from sets import Set

def run():

    if len(sys.argv) < 4:
        print 'usage: python %s input bin_size chrom_sizes outfileprefix' % sys.argv[0]
        print '\tassumed file format is the output of InteractionMatrix-PE.py'
        print '\thave the input split by chromsome'
        sys.exit(1)

    input = sys.argv[1]
    BS = int(sys.argv[2])
    CS = int(sys.argv[3])
    outfilename = sys.argv[4]

    InteractionMatrix = {}

    if input.endswith('.gz'):
        linelist = gzip.open(input)
    else:
        linelist = open(input)
    for line in linelist:
        fields = line.strip().split('\t')
        chr1 = fields[0]
        chr2 = fields[3]
        if chr1 != chr2:
            print 'different chromosomes encountered, exiting'
            sys.exit(1)
        pos1 = int(fields[1])
        pos2 = int(fields[4])
        score = float(fields[6].split('=')[1])
        if InteractionMatrix.has_key(pos1):
            pass
        else:
            InteractionMatrix[pos1] = {}
        if InteractionMatrix[pos1].has_key(pos2):
            pass
        else:
            InteractionMatrix[pos1][pos2] = score

    outfile = open(outfilename,'w')

    outline = '#'
    for i in range(0,CS,BS):
        outline += '\t' + str(i)
    outfile.write(outline + '\n')

    for i in range(0,CS,BS):
        outline = str(i)
        for j in range(0,CS,BS):
            if InteractionMatrix.has_key(i) and InteractionMatrix[i].has_key(j):
                score = InteractionMatrix[i][j]
            elif InteractionMatrix.has_key(j) and InteractionMatrix[j].has_key(i):
                score = InteractionMatrix[j][i]
            else:
                score = 0
            outline += '\t' + str(score)
        outfile.write(outline + '\n')

    outfile.close()
        
run()