def METHOD_NAME(self, chunks, selector, fields, size):
    chunks = list(chunks)  # generator --> list
    if any((ftype != "gamer" for ftype, fname in fields)):
        raise NotImplementedError
    rv = {}
    for field in fields:
        rv[field] = np.empty(size, dtype=self._field_dtype)
    ng = sum(len(c.objs) for c in chunks)  # c.objs is a list of grids
    mylog.debug(
        "Reading %s cells of %s fields in %s grids",
        size,
        [f2 for f1, f2 in fields],
        ng,
    )
    # shortcuts
    ps2 = self.patch_size
    ps1 = ps2 // 2
    for field in fields:
        ds = self._group_grid[field[1]]
        offset = 0
        for chunk in chunks:
            for gs in grid_sequences(chunk.objs):
                start = (gs[0].id) * self.pgroup
                end = (gs[-1].id + 1) * self.pgroup
                buf = ds[start:end, :, :, :]
                ngrid = len(gs)
                data = np.empty((ngrid, ps2, ps2, ps2), dtype=self._field_dtype)
                for g in range(ngrid):
                    pid0 = g * self.pgroup
                    data[g, 0:ps1, 0:ps1, 0:ps1] = buf[pid0 + 0, :, :, :]
                    data[g, 0:ps1, 0:ps1, ps1:ps2] = buf[pid0 + 1, :, :, :]
                    data[g, 0:ps1, ps1:ps2, 0:ps1] = buf[pid0 + 2, :, :, :]
                    data[g, ps1:ps2, 0:ps1, 0:ps1] = buf[pid0 + 3, :, :, :]
                    data[g, 0:ps1, ps1:ps2, ps1:ps2] = buf[pid0 + 4, :, :, :]
                    data[g, ps1:ps2, ps1:ps2, 0:ps1] = buf[pid0 + 5, :, :, :]
                    data[g, ps1:ps2, 0:ps1, ps1:ps2] = buf[pid0 + 6, :, :, :]
                    data[g, ps1:ps2, ps1:ps2, ps1:ps2] = buf[pid0 + 7, :, :, :]
                data = data.transpose()
                for i, g in enumerate(gs):
                    offset += g.select(selector, data[..., i], rv[field], offset)
    return rv