def mapperWrapper(locs_subset, values_subset, randomIndxMatrix, chrm, x):
    # print number of iterations
    if x%20==0:
        print 'iteration %d'%x
    numPeaks = len(values_subset)
    randomIndx = randomIndxMatrix[x]
    signalDensityRandom, windowedLocs = smooth_windowed_genome.findSmoothLocValues(locs_subset,
                                                                values_subset[randomIndx],
                                                                genomeSize[chrm],
                                                                windowSize,
                                                                stepSize,
                                                                baseValue=[0],
                                                                getDensity=False)
    return signalDensityRandom
def findIntervalEnrichment(values_subset, locs_subset, chrm, windowSize=None, numIterations=None, blacklist=None):
    """
    given values and locations on, for example, a single chromosome, find the
    smoothed values in windows over that chromosome.
    
    Requires locations, values at those locations, and the chromosome.
    
    """
        
    # unles window Size is given, it should be 1Mb
    if windowSize is None:
        windowSize = 1E6
    stepSize = windowSize/10
        
    # peak signal
    signalDensity, windowedLocs = smooth_windowed_genome.findSmoothLocValues(locs_subset,
                                                                                values_subset,
                                                                                genomeSize[chrm],
                                                                                windowSize,
                                                                                stepSize,
                                                                                getDensity=False,
                                                                                blacklist=blacklist)
    # get significance by shuffling peak scores location wise, keeping samples the same
    if numIterations is None:
        numIterations = 1000
    numPeaks = len(values_subset)
    numWindows = len(windowedLocs)
    randomIndxMatrix = np.array([np.random.permutation(np.arange(numPeaks)) for x in range(numIterations)])
    pool = Pool(processes=options.p)
    sigArray =  pool.map(functools.partial(mapperWrapper, locs_subset, values_subset, randomIndxMatrix, chrm) , range(0, numIterations))
    pool.close()
    signalDensityRandom = np.array(sigArray)
    randomIndx = np.random.permutation(np.arange(numPeaks))
    foldChange = signalDensity/np.mean(signalDensity, 0)
    foldChangeRandom = np.mean(signalDensityRandom, 0)/np.mean(np.mean(signalDensityRandom, 0),0)

    return windowedLocs, signalDensity, signalDensityRandom