class LaunchFunctor:
    def __init__(self, data_dir, initial_time, time_step, max_chunk_size):
        self.data_parser = DataParser(data_dir, initial_time, time_step, max_chunk_size)

    def __call__(self, task):
        chunk_ind = task.chunk
        block_ind = task.block
        surf_ind = task.surface
        observer = task.observer

        surf_info = self.data_parser.parse_geometry_file(surf_ind, block_ind)
        gdf_info = self.data_parser.parse_data_file_chunk(surf_ind, block_ind, chunk_ind)
        start_time = self.data_parser.get_time_offset(surf_ind, block_ind, chunk_ind) + self.data_parser.initial_time

        return {'start_time': start_time, 'observer': observer, 'gdf_info': gdf_info, 'surf_info': surf_info}
class QLaunchFunctor:
    def __init__(self, data_dir, initial_time, time_step, max_chunk_size):
        self.data_parser = DataParser(data_dir, initial_time, time_step, max_chunk_size)

    def __call__(self, task_seq, queue):
        grouped_task_seq = task_seq['observer'].groupby([task_seq.block, task_seq.chunk, task_seq.surface])
        for (block_ind, chunk_ind, surf_ind), observer_series in grouped_task_seq:
            surf_info = self.data_parser.parse_geometry_file(surf_ind, block_ind)
            gdf_info = self.data_parser.parse_data_file_chunk(surf_ind, block_ind, chunk_ind)
            start_time = self.data_parser.get_time_offset(surf_ind, block_ind, chunk_ind) + \
                         self.data_parser.initial_time

            for observer in observer_series:
                task = {'block_ind': block_ind, 'surf_ind': surf_ind, 'chunk_ind': chunk_ind,
                        'start_time': start_time, 'observer': observer, 'gdf_info': gdf_info, 'surf_info': surf_info}
                queue.put(task)