def evaluateWindowsByRadius(probabilityPath, geoRadius):
    # Initialize
    print 'Evaluating windows with %s meter radius...' % geoRadius
    scanInformation = probability_store.Information(probabilityPath)
    multispectralImage, panchromaticImage, actualGeoCenters, windowPixelDimensions = scanInformation.getPackage()
    geoDiameter = float(geoRadius) * 2
    # Get predictedGeoCenters
    predictedPixelCenters = probability_store.loadPredictedPixelCenters(probabilityPath, windowPixelDimensions)
    predictedGeoCenters = multispectralImage.convertPixelLocationsToGeoLocations(predictedPixelCenters)
    # Get
    actualNotPredictedCenters = point_process.extractBadLocations(geoDiameter, actualGeoCenters, predictedGeoCenters)
    predictedNotActualCenters = point_process.extractBadLocations(geoDiameter, predictedGeoCenters, actualGeoCenters)
    # Count
    actual = len(actualGeoCenters)
    predicted = len(predictedGeoCenters)
    actualNotPredicted = len(actualNotPredictedCenters)
    predictedNotActual = len(predictedNotActualCenters)
    actualAndPredicted = len(actualGeoCenters) - actualNotPredicted
    predictedAndActual = len(predictedGeoCenters) - predictedNotActual
    return {
        'evaluation radius in meters': geoRadius,
        'actual count': actual,
        'predicted count': predicted,
        'actual not predicted count': actualNotPredicted,
        'predicted not actual count': predictedNotActual,
        'predicted and actual count': predictedAndActual,
        'actual and predicted count': actualAndPredicted,
        'pNa/p': predictedNotActual / float(predicted) if predicted else None,
        'aNp/a': actualNotPredicted / float(actual) if actual else None,
        'precision': predictedAndActual / float(predicted) if predicted else None,
        'recall': actualAndPredicted / float(actual) if actual else None,
    }
def compareLocations(geoDiameter, rawActualLocations, rawPredictedLocations, regionGeoFrames):
    # Prepare
    actualPointMachine = point_process.PointMachine(rawActualLocations, 'REAL')
    predictedPointMachine = point_process.PointMachine(rawPredictedLocations, 'REAL')
    heap = {
        'actual': set(),
        'predicted': set(),
        'actualNotPredicted': set(),
        'predictedNotActual': set(),
    }
    # For each regionGeoFrame,
    for regionIndex, regionGeoFrame in enumerate(regionGeoFrames):
        # Filter
        actualLocations = actualPointMachine.getPointsInsideFrame(regionGeoFrame)
        predictedLocations = predictedPointMachine.getPointsInsideFrame(regionGeoFrame)
        # Get
        actualNotPredictedLocations = point_process.extractBadLocations(geoDiameter, actualLocations, rawPredictedLocations)
        predictedNotActualLocations = point_process.extractBadLocations(geoDiameter, predictedLocations, rawActualLocations)
        # Store
        heap['actual'].update(actualLocations)
        heap['predicted'].update(predictedLocations)
        heap['actualNotPredicted'].update(actualNotPredictedLocations)
        heap['predictedNotActual'].update(predictedNotActualLocations)
        # Show feedback
        view.printPercentUpdate(regionIndex, len(regionGeoFrames))
    # Show feedback
    view.printPercentFinal(len(regionGeoFrames))
    # Return
    return heap, {
        'actual count': len(heap['actual']),
        'predicted count': len(heap['predicted']),
        'actual not predicted count': len(heap['actualNotPredicted']),
        'predicted not actual count': len(heap['predictedNotActual']),
    }