예제 #1
0
def generate_hibed_tiles(tileset, tile_ids):
    '''
    Generate tiles from a hibed file.

    Parameters
    ----------
    tileset: tilesets.models.Tileset object
        The tileset that the tile ids should be retrieved from
    tile_ids: [str,...]
        A list of tile_ids (e.g. xyx.0.0.1) identifying the tiles
        to be retrieved

    Returns
    -------
    generated_tiles: [(tile_id, tile_data),...]
        A list of tile_id, tile_data tuples
    '''
    generated_tiles = []
    for tile_id in tile_ids:
        tile_id_parts = tile_id.split('.')
        tile_position = list(map(int, tile_id_parts[1:3]))
        dense = hdft.get_discrete_data(h5py.File(tileset.datafile.path),
                                       tile_position[0], tile_position[1])

        tile_value = {
            'discrete':
            list([list([x.decode('utf-8') for x in d]) for d in dense])
        }

        generated_tiles += [(tile_id, tile_value)]

    return generated_tiles
예제 #2
0
def generate_tile(tile_id, request):
    '''
    Create a tile. The tile_id specifies the dataset as well
    as the position.

    This function will look at the filetype and determine what type
    of tile to retrieve (e..g cooler -> 2D dense, hitile -> 1D dense,
    elasticsearch -> anything)

    Args:
        tile_id (str): The id of a tile, consisting of the tileset id,
            followed by the tile position (e.g. PIYqJpdyTCmAZGmA6jNHJw.4.0.0)
        request (django.http.HTTPRequest): The request that included this tile.

    Returns:
        (string, dict): A tuple containing the tile ID tile data
    '''

    tile_id_parts = tile_id.split('.')
    tile_position = map(int, tile_id_parts[1:])
    tileset_uuid = tile_id_parts[0]

    tileset = tm.Tileset.objects.get(uuid=tileset_uuid)

    if tileset.private and request.user != tileset.owner:
        # dataset is not public return an empty set
        return (tileset_uuid, {'error': "Forbidden"})

    tile_value = rdb.get(tile_id)
    if tile_value is not None:
        tile_value = pickle.loads(tile_value)
        return (tile_id, tile_value)

    if tileset.filetype == "hitile":
        dense = hdft.get_data(
            h5py.File(
                get_datapath(tileset.datafile)
            ),
            tile_position[0],
            tile_position[1]
        )
        tile_value = {'dense': base64.b64encode(dense)}

    elif tileset.filetype == 'beddb':
        tile_value = cdt.get_tile(
            get_datapath(tileset.datafile),
            tile_position[0],
            tile_position[1]
        )

    elif tileset.filetype == 'bed2ddb':
        tile_value = cdt.get_2d_tile(
            get_datapath(tileset.datafile),
            tile_position[0],
            tile_position[1],
            tile_position[2]
        )

    elif tileset.filetype == 'hibed':
        dense = hdft.get_discrete_data(
            h5py.File(
                get_datapath(tileset.datafile)
            ),
            tile_position[0],
            tile_position[1]
        )

        tile_value = {'discrete': list([list(d) for d in dense])}

    elif tileset.filetype == "elasticsearch":
        response = urllib.urlopen(
            tileset.datafile + '/' + '.'.join(map(str, tile_position))
        )
        tile_value = json.loads(response.read())["_source"]["tile_value"]

    else:
        tile_value = make_cooler_tile(
            get_datapath(tileset.datafile), tile_position
        )
        if tile_value is None:
            return None

    rdb.set(tile_id, pickle.dumps(tile_value))
    return (tile_id, tile_value)