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
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)