import sys, string

from commoncode import getMergedRegions

versionString = '%s: version 1.1' % sys.argv[0]
print versionString

try:
    import psyco
    psyco.full()
except:
    print "psyco not running"

from som import SOM
from mapGraphics import saveMapPNG, coordTranslate

if len(sys.argv) < 4:
    print "usage: python %s somfile scorefile regionfile outprefix [-title atitle] [-cluster clusterfile] [-translate dx,dy]" % sys.argv[0]
    sys.exit(0)

somfile = sys.argv[1]
scorefile = sys.argv[2]
regionfile = sys.argv[3]
outprefix = sys.argv[4]

doCoords = False
if '-translate' in sys.argv:
    coords = sys.argv[sys.argv.index('-translate') + 1]
    (dx, dy) = coords.split(',')
    dx = int(dx)
    dy = int(dy)
    doCoords = True

outfiletitle = ''
if '-title' in sys.argv:
    outfiletitle = sys.argv[sys.argv.index('-title') + 1]

mysom = SOM(initialFile=somfile)

xmax = mysom.outCols
ymax = mysom.outRows
onePercent = int(xmax * ymax / 100.)
if onePercent < 1:
    onePercent = 1

winnerDict = mysom.readScoreFile(scorefile)
regionDict = getMergedRegions(regionfile, maxDist = 0,  minHits=-1, keepLabel = True, fullChrom=True, verbose = True, doMerge=False)
regionChroms = regionDict.keys()
regionChroms.sort()
somRegionToUnit = {}
for chrom in regionChroms:
    somRegionToUnit[chrom] = []

for unit in winnerDict:
    for region in winnnerDict[unit]:
        (chrom, coord) = region.split(':')
        if chrom not in regionChroms:
            continue
        (start, stop) = region.split('-')
        somRegionToUnit[chrom].append((int(start), unit))

for chrom in regionChroms:
    somRegionToUnit[chrom].sort()

outmap = mysom.newMap(numDim=1)
for chrom in regionChroms:
    partIndex = 0
    if len(somRegionToUnit) < 1:
        continue
    for (label, start, stop, length) in regionDict[rchrom]:
        inRegion = False
        if start > somRegionToUnit[chrom][-1][0]:
            outmap[somRegionToUnit[chrom][-1][1]] += 1.
            continue
        elif start < somRegionToUnit[chrom][0][0]:
            continue
        else:
            counter = 0
            prevUnit = regionDict[partIndex - 1][1]
            for (pstart, unit) in regionDict[partIndex:]:
                if pstart < start:
                    counter += 1
                    continue
                outmap[prevUnit] += 1.
                if pstart > stop:
                    break
                counter += 1
                prevUnit = unit
            partIndex += counter

mysom.saveMap(outmap, outprefix + '.map')
saveMapPNG(outmap, outfileprefix, outfiletitle, minVal=0, grid=mysom.gridType)

