コード例 #1
0
def aggregate(**kwargs):
    """ Create aggregates given some commandline arguments. """
    # Determine action
    task = tasks.aggregate
    if kwargs['direct']:
        action = task
    else:
        action = task.delay
    # Determine derived arguments
    declutter = dict(
        size=kwargs['declutter_size'],
        history=kwargs['declutter_history'],
    )
    datetimes = utils.MultiDateRange(kwargs['range']).iterdatetimes()
    combinations = utils.get_aggregate_combinations(
        datetimes=datetimes, timeframes=kwargs['timeframes'],
    )
    # Execute or delay task
    for combination in combinations:
        if kwargs['nowcast'] != combination['nowcast']:
            continue
        action_kwargs = dict(result=None,
                             declutter=declutter,
                             radars=kwargs['radars'],
                             direct=kwargs['direct'],
                             cascade=kwargs['cascade'])
        action_kwargs.update(combination)
        action(**action_kwargs)
コード例 #2
0
ファイル: image.py プロジェクト: islenv/openradar
def product_generator(product, prodcode, timeframe, datetimes, nowcast):
    """ Return product generator. """
    if product == 'a':
        aggregate_kwargs = dict(declutter=None,
                                radars=config.ALL_RADARS)
        combinations = utils.get_aggregate_combinations(
            datetimes=datetimes,
            timeframes=timeframe,
        )
        for combination in combinations:
            if nowcast != combination['nowcast']:
                continue
            if nowcast:
                aggregate_kwargs.update(dict(
                    basedir=config.NOWCAST_AGGREGATE_DIR,
                    multiscandir=config.NOWCAST_MULTISCAN_DIR,
                    grid=scans.NOWCASTGRID,
                    datetime=combination['datetime'],
                    timeframe=combination['timeframe']))
            else:
                aggregate_kwargs.update(dict(
                    basedir=config.AGGREGATE_DIR,
                    multiscandir=config.MULTISCAN_DIR,
                    grid=scans.BASEGRID,
                    datetime=combination['datetime'],
                    timeframe=combination['timeframe']))

            yield scans.Aggregate(**aggregate_kwargs)
    else:
        combinations = utils.get_product_combinations(prodcodes=prodcode,
                                                      datetimes=datetimes,
                                                      timeframes=timeframe)
        for combination in combinations:
            if nowcast != combination.pop('nowcast'):
                continue
            if nowcast:
                yield products.CopiedProduct(datetime=combination['datetime'])
            else:
                if product == 'b':
                    yield products.CalibratedProduct(**combination)
                else:
                    yield products.ConsistentProduct(**combination)
コード例 #3
0
ファイル: image.py プロジェクト: jaapschellekens/openradar
def product_generator(product, prodcode, timeframe, datetimes, nowcast):
    """ Return product generator. """
    if product == 'a':
        aggregate_kwargs = dict(declutter=None, radars=config.ALL_RADARS)
        combinations = utils.get_aggregate_combinations(
            datetimes=datetimes,
            timeframes=timeframe,
        )
        for combination in combinations:
            if nowcast != combination['nowcast']:
                continue
            if nowcast:
                aggregate_kwargs.update(
                    dict(basedir=config.NOWCAST_AGGREGATE_DIR,
                         multiscandir=config.NOWCAST_MULTISCAN_DIR,
                         grid=scans.NOWCASTGRID,
                         datetime=combination['datetime'],
                         timeframe=combination['timeframe']))
            else:
                aggregate_kwargs.update(
                    dict(basedir=config.AGGREGATE_DIR,
                         multiscandir=config.MULTISCAN_DIR,
                         grid=scans.BASEGRID,
                         datetime=combination['datetime'],
                         timeframe=combination['timeframe']))

            yield scans.Aggregate(**aggregate_kwargs)
    else:
        combinations = utils.get_product_combinations(prodcodes=prodcode,
                                                      datetimes=datetimes,
                                                      timeframes=timeframe)
        for combination in combinations:
            if nowcast != combination.pop('nowcast'):
                continue
            if nowcast:
                yield products.CopiedProduct(datetime=combination['datetime'])
            else:
                if product == 'b':
                    yield products.CalibratedProduct(**combination)
                else:
                    yield products.ConsistentProduct(**combination)
コード例 #4
0
ファイル: master.py プロジェクト: islenv/openradar
def master(**kwargs):
    """ Run the radar production chain for a single datetime. """
    loghelper.setup_logging(logfile_name='radar_master.log')
    logging.info(20 * '-' + ' master ' + 20 * '-')

    # Determine the delivery datetime and if necessary wait for files.
    if kwargs['range'] is not None:
        datetimes = utils.DateRange(kwargs['range']).iterdatetimes()
        for i, datetime_delivery in enumerate(datetimes):
            if i > 0:
                logging.warning('Range of datetimes given. Using the first.')
                break
    else:
        datetime_delivery = utils.closest_time()
        try:
            files.sync_and_wait_for_files(dt_calculation=datetime_delivery)
        except Exception as exception:
            logging.exception(exception)

    # Organize
    files.organize_from_path(source_dir=config.SOURCE_DIR)

    # Product datetime depends on delevery times
    declutter = dict(
        size=config.DECLUTTER_SIZE,
        history=config.DECLUTTER_HISTORY,
    )
    radars = config.ALL_RADARS

    # nowcast extent is from utils.get_combinations
    delivery_times = [(p, t) for p, t in config.DELIVERY_TIMES if p in 'rnau']

    # Submit tasks in a chain.
    subtasks = [tasks.do_nothing.s()]
    for prodcode, timedelta_delivery in delivery_times:
        datetime_product = datetime_delivery - timedelta_delivery
        combinations = utils.get_aggregate_combinations(
            datetimes=[datetime_product], )
        for combination in combinations:
            # Add a separator between groups of tasks
            logging.info(40 * '-')

            # Nowcast combinations only proceed for prodcode r
            if combination['nowcast'] and not prodcode == 'r':
                continue

            # Append aggregate subtask
            aggregate_kwargs = dict(declutter=declutter, radars=radars)
            aggregate_kwargs.update(combination)
            subtasks.append(tasks.aggregate.s(**aggregate_kwargs))
            tpl = 'Agg. task: {datetime} {timeframe}   {nowcast}'
            logging.info(tpl.format(**aggregate_kwargs))

            # Append calibrate subtask
            calibrate_kwargs = dict(prodcode=prodcode)
            calibrate_kwargs.update(aggregate_kwargs)
            subtasks.append(tasks.calibrate.s(**calibrate_kwargs))
            tpl = 'Cal. task: {datetime} {timeframe} {prodcode} {nowcast}'
            logging.info(tpl.format(**calibrate_kwargs))

            # Append rescale subtask
            rescale_kwargs = {
                k: v
                for k, v in calibrate_kwargs.items()
                if k in ['datetime', 'prodcode', 'timeframe']
            }
            subtasks.append(tasks.rescale.s(**rescale_kwargs))
            tpl = 'Res. task: {datetime} {timeframe} {prodcode}'
            logging.info(tpl.format(**rescale_kwargs))

            # Append publication subtask
            subtasks.append(
                tasks.publish.s(
                    datetimes=[calibrate_kwargs['datetime']],
                    prodcodes=[calibrate_kwargs['prodcode']],
                    timeframes=[calibrate_kwargs['timeframe']],
                    nowcast=calibrate_kwargs['nowcast'],
                    endpoints=['ftp', 'h5', 'local', 'image', 'h5m'],
                    cascade=True,
                ))
            tpl = 'Pub. task: {datetime} {timeframe} {prodcode} {nowcast}'
            logging.info(tpl.format(**calibrate_kwargs))

    # Append subtask to create animated gif
    subtasks.append(tasks.animate.s(datetime=datetime_delivery))

    # Submit all subtask as a single chain
    chain(*subtasks).apply_async()

    logging.info(20 * '-' + ' master complete ' + 20 * '-')
コード例 #5
0
ファイル: master.py プロジェクト: jaapschellekens/openradar
def master(**kwargs):
    """ Run the radar production chain for a single datetime. """
    loghelper.setup_logging(logfile_name='radar_master.log')
    logging.info(20 * '-' + ' master ' + 20 * '-')

    # Determine the delivery datetime and if necessary wait for files.
    if kwargs['range'] is not None:
        datetimes = utils.DateRange(kwargs['range']).iterdatetimes()
        for i, datetime_delivery in enumerate(datetimes):
            if i > 0:
                logging.warning('Range of datetimes given. Using the first.')
                break
    else:
        datetime_delivery = utils.closest_time()
        try:
            files.sync_and_wait_for_files(dt_calculation=datetime_delivery)
        except Exception as exception:
            logging.exception(exception)

    # Organize
    files.organize_from_path(source_dir=config.SOURCE_DIR)

    # Product datetime depends on delevery times
    declutter = dict(
        size=config.DECLUTTER_SIZE,
        history=config.DECLUTTER_HISTORY,
    )
    radars = config.ALL_RADARS
    delivery_times = (
        ('r', datetime.timedelta()),
        ('n', datetime.timedelta(hours=1)),
        ('a', datetime.timedelta(days=2)),
    )

    # Submit tasks in a chain.
    subtasks = [tasks.do_nothing.s()]
    for prodcode, timedelta_delivery in delivery_times:
        datetime_product = datetime_delivery - timedelta_delivery
        combinations = utils.get_aggregate_combinations(
            datetimes=[datetime_product],
        )
        for combination in combinations:
            # Add a separator between groups of tasks
            logging.info(40 * '-')

            # Nowcast combinations only proceed for prodcode r
            if combination['nowcast'] and not prodcode == 'r':
                continue

            # Append aggregate subtask
            aggregate_kwargs = dict(declutter=declutter, radars=radars)
            aggregate_kwargs.update(combination)
            subtasks.append(tasks.aggregate.s(**aggregate_kwargs))
            tpl = 'Agg. task: {datetime} {timeframe}   {nowcast}'
            logging.info(tpl.format(**aggregate_kwargs))

            # Append calibrate subtask
            calibrate_kwargs = dict(prodcode=prodcode)
            calibrate_kwargs.update(aggregate_kwargs)
            subtasks.append(tasks.calibrate.s(**calibrate_kwargs))
            tpl = 'Cal. task: {datetime} {timeframe} {prodcode} {nowcast}'
            logging.info(tpl.format(**calibrate_kwargs))

            # Append rescale subtask
            rescale_kwargs = {k: v
                              for k, v in calibrate_kwargs.items()
                              if k in ['datetime', 'prodcode', 'timeframe']}
            subtasks.append(tasks.rescale.s(**rescale_kwargs))
            tpl = 'Res. task: {datetime} {timeframe} {prodcode}'
            logging.info(tpl.format(**rescale_kwargs))

            # Append publication subtask
            subtasks.append(tasks.publish.s(
                datetimes=[calibrate_kwargs['datetime']],
                prodcodes=[calibrate_kwargs['prodcode']],
                timeframes=[calibrate_kwargs['timeframe']],
                nowcast=calibrate_kwargs['nowcast'],
                endpoints=['ftp', 'h5', 'local', 'image', 'h5m'],
                cascade=True,
            ))
            tpl = 'Pub. task: {datetime} {timeframe} {prodcode} {nowcast}'
            logging.info(tpl.format(**calibrate_kwargs))

    # Append subtask to create animated gif
    subtasks.append(tasks.animate.s(datetime=datetime_delivery))

    # Submit all subtask as a single chain
    chain(*subtasks).apply_async()

    logging.info(20 * '-' + ' master complete ' + 20 * '-')