class Roi(object):
    """ Object that represents a Project X-ray ROI.

    Can be used to iterate over tiles and sites within an ROI.

    """

    def __init__(self, db, x1, x2, y1, y2):
        self.grid = db.grid()
        self.x1 = x1
        self.x2 = x2
        self.y1 = y1
        self.y2 = y2

    def tile_in_roi(self, grid_loc):
        """ Returns true if grid_loc (GridLoc tuple) is within the ROI. """
        x = grid_loc.grid_x
        y = grid_loc.grid_y
        return self.x1 <= x and x <= self.x2 and self.y1 <= y and y <= self.y2

    def gen_tiles(self, tile_types=None):
        ''' Yield tile names within ROI.

        tile_types: list of tile types to keep, or None for all
        '''

        for tile_name in self.grid.tiles():
            loc = self.grid.loc_of_tilename(tile_name)

            if not self.tile_in_roi(loc):
                continue

            gridinfo = self.grid.gridinfo_at_loc(loc)

            if tile_types is not None and gridinfo.tile_type not in tile_types:
                continue

            yield tile_name

    def gen_sites(self, site_types=None):
        ''' Yield (tile_name, site_name, site_type) within ROI.

        site_types: list of site types to keep, or None for all

        '''

        for tile_name in self.grid.tiles():
            loc = self.grid.loc_of_tilename(tile_name)

            if not self.tile_in_roi(loc):
                continue

            gridinfo = self.grid.gridinfo_at_loc(loc)

            for site_name, site_type in gridinfo.sites.items():
                if site_types is not None and site_type not in site_types:
                    continue

                yield (tile_name, site_name, site_type)
