##################################
#                                #
# Last modified 2019/03/01       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import string
# import scipy.stats
import numpy as np
import math
import random
from sets import Set
import time

def run():

    if len(sys.argv) < 8:
        print 'usage: python %s minCell maxCells step FirstRoundBarcodes SecondRoundBarcodes ThirdRoundBarcodes cell_loss_rate outfile' % sys.argv[0]
        sys.exit(1)

    minC = int(sys.argv[1])
    maxC = int(sys.argv[2])
    step = int(sys.argv[3])
    BC1 = int(sys.argv[4])
    BC2 = int(sys.argv[5])
    BC3 = int(sys.argv[6])
    loss = float(sys.argv[7])
    outfilename = sys.argv[8]

    BC1Set = []
    for i in range(BC1):
        BC1Set.append(i)

    BC2Set = []
    for i in range(BC2):
        BC1Set.append(i)

    BC3Set = []
    for i in range(BC3):
        BC1Set.append(i)

    outfile = open(outfilename,'w')
    outline = '#Starting_cells\tSequenced_cells\tduplicates_fraction'
    outfile.write(outline + '\n')

    for m in range(minC,maxC,step):
        PF = int((m + 0.0)/BC1)
        cells = []
        for i in range(1,BC1+1):
            C = np.random.poisson(PF)
            for c in range(C):
                cells.append([i])
        random.shuffle(cells)
        AfterRound1LossCells = int((1 - loss)*len(cells))
        cells = cells[0:AfterRound1LossCells]
        PF = int((AfterRound1LossCells + 0.0)/BC2)
        c = 0
        for i in range(1,BC2):
            C = np.random.poisson(PF)
            for j in range(C):
                if c < len(cells):
                    cells[c] += [i]
                c += 1
        for i in range(c,AfterRound1LossCells):
            cells[i] += [BC2]
        random.shuffle(cells)
        AfterRound2LossCells = int((1 - loss)*len(cells))
        cells = cells[0:AfterRound2LossCells]
        PF = int((AfterRound2LossCells + 0.0)/BC3)
        c = 0
        for i in range(1,BC3):
            C = np.random.poisson(PF)
            for j in range(C):
                if c < len(cells):
                    cells[c] += [i]
                c += 1
        for i in range(c,AfterRound2LossCells):
            cells[i] += [BC3]
        for i in range(len(cells)):
            cells[i] = tuple(cells[i])
        BCset = list(Set(cells))
        Duplicates = len(cells) - len(BCset) + 0.0
        outline = str(m) + '\t' + str(len(cells)) + '\t' + str(Duplicates/len(cells))
        print outline
        outfile.write(outline + '\n')
    
    outfile.close()

run()