##################################
#                                #
# Last modified 5/21/2009         # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import string

try:
	import psyco
	psyco.full()
except:
	pass

def run():

    if len(sys.argv) < 8:
        print 'usage: python %s [regionfilename chromosomeStartField] ERANGEgetallgenesfilename [secondSpeciesRegionfilename chromosomeStartField] liftOver-conversionfailures-filename ERANGEgetallgenesfilename-SecondSpecies outpufilename ' % sys.argv[0]
        print 'where: -regionfilename- is first speacies region filename'
        print '       -secondSpeciesRegionfilename- is the file with the liftover results from the first to the second species'
        print '        and the the getallgenes files are generated from the two files above'

        sys.exit(1)

    regionfilename = sys.argv[1]
    startField1 = int(sys.argv[2])
    GAGfile = sys.argv[3]
    SecondSpeciesFile = sys.argv[4]
    startField2 = int(sys.argv[5])
    liftOverFailures = sys.argv[6]
    GAGSecondSpeciesFile = sys.argv[7]
    outputfilename = sys.argv[8]

    outfile = open(outputfilename, 'w')

    listoflines = open(regionfilename)
    lineslist = listoflines.readlines()
    listoflines = open(GAGfile)
    lineslistGAG = listoflines.readlines()
    listoflines = open(SecondSpeciesFile)
    lineslistSS = listoflines.readlines()
    listoflines = open(liftOverFailures)
    lineslistFailures = listoflines.readlines()
    listoflines = open(GAGSecondSpeciesFile)
    lineslistGAGSS = listoflines.readlines()

    liftOverFailures=[]
    for line in lineslistFailures:
        if line[0]=='#':
            continue
        fields=line.split('\n')[0].split('\t')
        line = fields[startField2] + '\t' + fields[startField2+1] + '\t' + fields[startField2+2]
        liftOverFailures.append(line)

    lineslistSSlist=[]
    for i in range(len(lineslistSS)):
        if line[0]=='#':
            continue
        fields=lineslistSS[i].split('\n')[0].split('\t')
        line = fields[startField2] + '\t' + fields[startField2+1] + '\t' + fields[startField2+2]
        lineslistSSlist.append(line)    

    print 'len(lineslistSSlist)', len(lineslistSSlist)
    print 'len(lineslist)', len(lineslist)
    regionconversion={}
    i=0
    for line in lineslist:
        if line[0]=='#':
            continue
        fields=line.split('\n')[0].split('\t')
        line = fields[startField1] + '\t' + fields[startField1+1] + '\t' + fields[startField1+2]
        regionconversion[line]={}
        regionconversion[line]['gene']='0'
        regionconversion[line]['geneSS']='0'
        fields=0
        if line in liftOverFailures:
            regionconversion[line]['conversion']='FailedConversion'
            continue
        else:
            fields=lineslistSSlist[i].split('\n')[0].split('\t')
            lineSS = fields[startField2] + '\t' + fields[startField2+1] + '\t' + fields[startField2+2]
            regionconversion[line]['conversion']=lineSS
            i=i+1

    for line in lineslistGAG:
        if line[0]=='#':
            continue
        fields=line.strip().split('\t')
        fields2=fields[0].split(' ')
        region=fields[1]+'\t'+fields[2]+'\t'+fields[3]
        regionconversion[region]['gene']=fields2[0].lower()

    for line in lineslistGAGSS:
        if line[0]=='#':
            continue
        fields1=line.split('\n')[0].split(' ')
        fields2=fields1[2].split('\t')
        regionSS=fields2[0]+'\t'+fields2[1]+'\t'+fields2[2]
        for region in regionconversion.keys():
            if regionconversion[region]['conversion']==regionSS:
                regionconversion[region]['geneSS']=fields1[0].lower()
                continue

    for region in regionconversion.keys():
        if len(regionconversion[region]['gene'])=='0' or len(regionconversion[region]['geneSS'])=='0':
            continue
        if regionconversion[region]['gene']==regionconversion[region]['geneSS']:
            line=regionconversion[region]['gene'].lower().capitalize()+'\t'+region+'\n'
            if line[0]!='0':
                outfile.write(line)

    outfile.close() 

run()

