'''
Created on Feb 27, 2011

@author: ola
'''

import random,time

def make_strand(size):
    dna = "cgat"
    str = ""
    for i in xrange(0,size):
        str += dna[random.randint(0,3)]
    return str

def cgratio(strand):
    """
    return # of c's and g's in strand
    """
    cg = 0
    for nuc in strand:
        if nuc == 'c' or nuc == 'g':
            cg += 1
    return cg

def max_index(strand,windowSize):
    """
    return index in strand
    of max cg ratio in a sub-strand/windo
    whose length is windowSize
    """
    index = 0
    max = 0
    for i in range(0,len(strand)-windowSize+1):
        cg = cgratio(strand[i:i+windowSize])
        if cg > max:
            max = cg
            index = i
    return index

def running_max(strand,windowSize):
    gc = 0
    counters = []
    for nuc in strand:
        counters.append(gc)
        if nuc == 'c' or nuc == 'g':
            gc += 1
    counters.append(gc)
    
    index = 0
    max = 0
    for i in range(windowSize,len(strand)+1):
        diff = counters[i] - counters[i-windowSize]
        if diff > max:
            max = diff
            index = i
    return index-windowSize

def timings(size, window_range):
    strand = make_strand(size)
    funcs = [max_index,running_max]
    print "strand size = %d\n" % (size)
    for f in funcs:
        print "function = %s" % (f)
        for win in window_range:
            start = time.time()
            i = f(strand,win)
            end = time.time()
            print "win = %d\tindex = %d\ttime=%4.3f" % (win,i,(end-start))
        
if __name__ == "__main__":
    timings(10000,xrange(1000,3100,100))
