During compression, each available process will calculate a subportion of the BWT independently using this 
    function.  This process takes the chunk and rewrites it into a given filename using the technique described
    in the compressBWT(...) function header

def compressBWTPoolProcess(tup):
    '''
    During compression, each available process will calculate a subportion of the BWT independently using this 
    function.  This process takes the chunk and rewrites it into a given filename using the technique described
    in the compressBWT(...) function header
    '''
    #pull the tuple info
    inputFN = tup[0]
    startIndex = tup[1]
    endIndex = tup[2]
    tempFN = tup[3]
    
    #this shouldn't happen
    if startIndex == endIndex:
        print 'ERROR: EQUAL INDICES'
        return None
    
    #load the file
    bwt = np.load(inputFN, 'r')
    
    #create bit spacings
    letterBits = 3
    numberBits = 8-letterBits
    numPower = 2**numberBits
    mask = 255 >> letterBits
    
    #search for the places they're different
    whereSol = np.add(startIndex+1, np.where(bwt[startIndex:endIndex-1] != bwt[startIndex+1:endIndex])[0])
    
    #this is the difference between two adjacent ones
    deltas = np.zeros(dtype='<u4', shape=(whereSol.shape[0]+1,))
    if whereSol.shape[0] == 0:
        deltas[0] = endIndex-startIndex
    else:
        deltas[0] = whereSol[0]-startIndex
        deltas[1:-1] = np.subtract(whereSol[1:], whereSol[0:-1])
        deltas[-1] = endIndex - whereSol[-1]
    
    #calculate the number of bytes we need to store this information
    size = 0
    byteCount = 0
    lastCount = 1
    while lastCount > 0:
        lastCount = np.where(deltas >= 2**(numberBits*byteCount))[0].shape[0]
        size += lastCount
        byteCount += 1
    
    #create the file
    ret = np.lib.format.open_memmap(tempFN, 'w+', '<u1', (size,))
    retIndex = 0
    c = bwt[startIndex]
    startChar = c
    delta = deltas[0]
    while delta > 0:
        ret[retIndex] = ((delta & mask) << letterBits)+c
        delta /= numPower
        retIndex += 1
    
    #fill in the values based on the bit functions
    for i in xrange(0, whereSol.shape[0]):
        c = bwt[whereSol[i]]
        delta = deltas[i+1]
        while delta > 0:
            ret[retIndex] = ((delta & mask) << letterBits)+c
            delta /= numPower
            retIndex += 1
    endChar = c
    
    #return a lot of information so we can easily combine the results
    return (size, startChar, deltas[0], endChar, deltas[-1], tempFN)