##################################
#                                #
# Last modified 2018/10/18       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import os
import string
import math
from sets import Set
import numpy as np
import gzip
import pickle
import numpy as np
import matplotlib
from cycler import cycler
import urllib
from MulticoreTSNE import MulticoreTSNE as TSNE
# import MulticoreTSNE as TSNE

def run():

    if len(sys.argv) < 4:
        print 'usage: python %s input.csv(.gz/.bz2) Ncores perplexity outfile [-tsv]' % sys.argv[0]
        print '\tinput format: one label field and then a matrix of values, genes in rows, cells in columns' 
        print '\tthe script will print to stdout' 
        sys.exit(1)
    
    input = sys.argv[1]
    Ncores = int(sys.argv[2])
    perp = int(sys.argv[3])
    outfilename = sys.argv[4]

    doTSV = False
    if '-tsv' in sys.argv:
        doTSV = True

    G = []
    X = []

    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'
    while line != '':
        line = p.readline()
        if line == '':
            break
        if doTSV:
            fields = line.strip().split('\t')
        else:
            fields = line.strip().split(',')
        if line.startswith('#'):
            for ID in range(1,len(fields)):
                G.append(fields[ID])
            continue
        D = []
        for ID in range(1,len(fields)):
            D.append(float(fields[ID]))
        X.append(D)

    X = np.array(X)
    X = np.transpose(X)

    tsne = TSNE(n_jobs=Ncores,perplexity=perp)
    mnist_tsne = tsne.fit_transform(X)

    print mnist_tsne

    outfile = open(outfilename, 'w') 

    i = 0
    for (t1,t2) in mnist_tsne:
        outline = str(G[i]) + '\t' + str(t1) + '\t' + str(t2)
        outfile.write(outline + '\n')
        i += 1
   
run()
