Beispiel #1
0
def main(args):
    """Run the observation.

    Run the observation script read arguments from yaml file

    """
    (opts, args) = astrokat.cli(
        os.path.basename(__file__),
        # remove redundant KAT-7 options
        long_opts_to_remove=[
            "--mode",
            "--dbe-centre-freq",
            "--no-mask",
            "--horizon",
            "--centre-freq",
        ],
        args=args,
    )

    # suppress the sessions noise diode, which is outdated
    # will use it again once functionality corrected
    # TODO: Currently the fire_noise_diode function in mkat_session.py is
    # outdated. This has to be updated to reflect the new noise diode pattern
    # implementation, and this default setting then removed.
    opts.nd_params = "off"

    # astrokat does not support observational command line parameters
    # all observational parameters must be in the YAML file
    # command line arguments will be dropped to unknown arguments
    unknown_args = [arg for arg in args if arg.startswith("--")]
    if any("horizon" in arg for arg in unknown_args):
        raise RuntimeError(
            "Command line option {} not supported. "
            "Please specify parameters in YAML file.".format("horizon"))
    # TODO: add correlator settings YAML option for config file

    # unpack observation from observation plan
    if opts.yaml:
        opts.obs_plan_params = read_yaml(opts.yaml)

    # ensure sessions has the YAML horizon value if given
    if "horizon" in opts.obs_plan_params:
        opts.horizon = opts.obs_plan_params["horizon"]
    else:
        opts.horizon = 20.0  # deg above horizon default

    # set log level
    if opts.debug:
        user_logger.setLevel(logging.DEBUG)
    if opts.trace:
        user_logger.setLevel(logging.TRACE)

    # setup and observation
    with Telescope(opts) as kat:
        run_observation(opts, kat)
Beispiel #2
0
def main(args):
    (opts, args) = astrokat.cli(
        os.path.basename(__file__),
        # remove redundant KAT-7 options
        x_long_opts=[
            '--mode', '--dbe-centre-freq', '--no-mask', '--centre-freq',
            '--observer', '--description'
        ],
        args=args)

    # suppress the sessions noise diode, which is outdated
    # will use it again once functionality corrected
    # TODO: Currently the fire_noise_diode function in mkat_session.py is
    # outdated. This has to be updated to reflect the new noise diode pattern
    # implementation, and this default setting then removed.
    opts.nd_params = 'off'

    # get correlator settings from config files
    args_ = None
    if args:
        import argparse
        parser = argparse.ArgumentParser()
        for arg in args:
            # optsparser conversion does not handle description very well
            # corrections added here clears syntax errors that produce dry-run error in output
            if 'description' in arg:
                update_opts = vars(opts)
                update_opts[arg.split('=')[0].split('-')[-1]] = arg.split(
                    '=')[1]
            # catch other hidden arguments such as correlator settings
            if len(arg.split('=')[1]) > 1:
                arg = "{}='{}'".format(arg.split('=')[0], arg.split('=')[1])
            if arg.startswith(("-", "--")):
                parser.add_argument(arg)
        args_ = parser.parse_args(args)

    # unpack observation from observation plan
    if opts.yaml:
        opts.obs_plan_params = read_yaml(opts.yaml)

    if opts.debug:
        user_logger.setLevel(logging.DEBUG)
    if opts.trace:
        user_logger.setLevel(logging.TRACE)

    # setup and observation
    with Telescope(opts, args_) as kat:
        run_observation(opts, kat)
Beispiel #3
0
    def __init__(self, opts, correlator=None):
        user_logger.info("Setting up telescope for observation")
        self.opts = opts

        # unpack user specified correlator setup values
        if correlator is not None:
            correlator_config = read_yaml(correlator)
            self.feng = correlator_config["Fengine"]
            self.xeng = correlator_config["Xengine"]
            self.beng = correlator_config["Bengine"]
        else:
            self.feng = self.xeng = self.beng = None
        # Check options and build KAT configuration,
        # connecting to proxies and devices
        # create single kat object, cannot repeatedly recreate
        self.array = verify_and_connect(opts)
Beispiel #4
0
 def __init__(self, opts, args=None):
     user_logger.info('Setting up telescope for observation')
     self.opts = opts
     # unpack user specified correlator setup values
     try:
         correlator_config = read_yaml(args.correlator)
     except AttributeError:
         self.feng = self.xeng = self.beng = None
     else:
         self.feng = correlator_config['Fengine']
         self.xeng = correlator_config['Xengine']
         self.beng = correlator_config['Bengine']
     # Check options and build KAT configuration,
     # connecting to proxies and devices
     # create single kat object, cannot repeatedly recreate
     self.array = verify_and_connect(opts)
Beispiel #5
0
def main(args):
    """Run the observation.

    Run the observation script read arguments from yaml file

    """
    (opts, args) = astrokat.cli(
        os.path.basename(__file__),
        # remove redundant KAT-7 options
        long_opts_to_remove=[
            "--mode",
            "--dbe-centre-freq",
            "--no-mask",
            "--horizon",
            "--centre-freq",
        ],
        args=args,
    )

    # suppress the sessions noise diode, which is outdated
    # will use it again once functionality corrected
    # TODO: Currently the fire_noise_diode function in mkat_session.py is
    # outdated. This has to be updated to reflect the new noise diode pattern
    # implementation, and this default setting then removed.
    opts.nd_params = "off"

    # astrokat does not support observational command line parameters
    # all observational parameters must be in the YAML file
    # command line arguments will be dropped to unknown arguments
    unknown_args = [arg for arg in args if arg.startswith("--")]
    if any("horizon" in arg for arg in unknown_args):
        raise RuntimeError(
            "Command line option {} not supported. "
            "Please specify parameters in YAML file.".format("horizon"))
    # TODO: add correlator settings YAML option for config file

    # unpack observation from observation plan
    if opts.yaml:
        opts.obs_plan_params = read_yaml(opts.yaml)

    # ensure sessions has the YAML horizon value if given
    if "horizon" in opts.obs_plan_params:
        opts.horizon = opts.obs_plan_params["horizon"]
    else:
        opts.horizon = 20.0  # deg above horizon default

    # set log level
    if opts.debug:
        user_logger.setLevel(logging.DEBUG)
    if opts.trace:
        user_logger.setLevel(logging.TRACE)

    # process the flat list of targets into a structure with sources
    # convert celestial targets coordinates to all be equatorial (ra,dec)
    # horizontal coordinates (alt, az)
    #  for scans, the coordinates will be converted to enable delay tracking
    #  for tracks the coordinates will be left as is with no delay tracking
    # planetary bodies are passed through to katpoint Target as is
    # elliptical solar bodies such as comets are also passed through as katpoint Targets
    for obs_dict in opts.obs_plan_params['observation_loop']:
        start_ts = timestamp2datetime(time.time())
        if "durations" in opts.obs_plan_params:
            obs_time_info = opts.obs_plan_params["durations"]
            if "start_time" in obs_time_info:
                start_ts = obs_time_info["start_time"]
        mkat = astrokat.Observatory(datetime=start_ts)
        obs_targets = targets.read(obs_dict["target_list"],
                                   observer=mkat.observer)
        obs_dict['target_list'] = obs_targets

    # setup and observation
    with Telescope(opts) as kat:
        run_observation(opts, kat)
Beispiel #6
0
def main(args):
    observatory = Observatory()
    location = observatory.location
    node_config_available = observatory.node_config_available
    creation_time = args.datetime
    ref_antenna = katpoint.Antenna(location)
    ref_antenna.observer.date = ephem.Date(creation_time)
    ref_antenna.observer.horizon = ephem.degrees(str(args.horizon))

    caltag_dict = {
        'bp': 'bandpass',
        'delay': 'delay',
        'flux': 'flux',
        'gain': 'gain',
        'pol': 'polarisation'
    }

    # TODO: think about moving this to a separate script
    if args.view:
        # check if view file in CSV or YAML
        data_dict = read_yaml(args.view)
        if isinstance(data_dict, dict):
            catalogue = katpoint.Catalogue()
            catalogue.antenna = ref_antenna
            for observation_cycle in data_dict['observation_loop']:
                for target_item in observation_cycle['target_list']:
                    name, target = katpoint_target(target_item)
                    catalogue.add(katpoint.Target(target))
        else:  # assume CSV
            # output observation stats for catalogue
            catalogue = katpoint.Catalogue(file(args.view))
        obs_summary = obs_table(
            ref_antenna,
            catalogue=catalogue,
            solar_sep=args.solar_angle,
            lst=args.lst,
        )
        print(obs_summary)
        if not (args.text_only or text_only):
            for view_option in args.view_tags:
                cp_cat = deepcopy(catalogue)
                if 'elevation' in view_option:
                    plot_func = source_elevation
                if 'solarangle' in view_option:
                    plot_func = source_solar_angle
                if 'riseset' in view_option:
                    plot_func = source_rise_set
                plot_func(cp_cat, ref_antenna)
            plt.show()
        quit()

    if args.cat_path and os.path.isdir(args.cat_path):
        catalogue_path = args.cat_path
        config_file_available = True
    else:
        catalogue_path = 'katconfig/user/catalogues'
        config_file_available = False

    # before doing anything, verify that calibrator catalogues can be accessed
    if not os.path.isdir(catalogue_path) and not node_config_available:
        msg = 'Could not access calibrator catalogue default location\n'
        msg += 'add explicit location of catalogue folder using --cat-path <dirname>'
        raise RuntimeError(msg)

    # constructing observational catalogue
    observation_catalogue = katpoint.Catalogue()
    observation_catalogue.antenna = ref_antenna

    # targets to obtain calibrators for
    header = ''
    cal_targets = []
    if args.target is not None:
        # input target from command line
        args.target = [target.strip() for target in args.target]
        target = ', '.join(
            map(str, [
                args.target[0], 'radec target', args.target[1], args.target[2]
            ]))
        cal_targets = [katpoint.Target(target)]
    else:  # assume the targets are in a file
        with open(args.infile, 'r') as fin:
            # extract targets tagged to be used for calibrator selection
            for line in fin.readlines():
                if line[0] == '#':  # catch and keep header lines
                    header += line
                    continue
                if len(line) < 1:  # ignore empty lines
                    continue
                if 'calref' in line:
                    target = line.strip().replace('calref', 'target')
                    cal_targets.append(katpoint.Target(target))
                else:  # add target to catalogue
                    target = line.strip().replace('radec', 'radec target')
                    observation_catalogue.add(katpoint.Target(target))
        # if not reference target for calibrator selection is specified,
        # simply select the first target listed in the catalogue
        if len(cal_targets) < 1:
            cal_targets = [observation_catalogue.targets[0]]

    for target in cal_targets:
        # read calibrator catalogues and calibrators to catalogue
        for cal_tag in args.cal_tags:
            cal_catalogue = os.path.join(
                catalogue_path,
                'Lband-{}-calibrators.csv'.format(caltag_dict[cal_tag]),
            )
            try:
                if config_file_available:
                    calibrators = katpoint.Catalogue(file(cal_catalogue))
                elif node_config_available:
                    calibrators = katpoint.Catalogue(
                        observatory.read_file_from_node_config(cal_catalogue))
                else:  # user specified calibrator file
                    calibrators = katpoint.Catalogue(file(cal_catalogue))
            except (AssertionError, IOError):
                msg = bcolors.WARNING
                msg += 'Unable to open {}\n'.format(cal_catalogue)
                msg += 'Observation file will still be created, please add calibrator manually\n'
                msg += bcolors.ENDC
                print(msg)
                continue
            if 'gain' in cal_tag or 'delay' in cal_tag:
                # for secondary calibrators such as gain:
                # find the closest calibrator
                calibrator, separation_angle = get_cal(calibrators, target,
                                                       ref_antenna)
                observation_catalogue = add_target(calibrator,
                                                   observation_catalogue,
                                                   tag=cal_tag + 'cal')
            else:
                # for primary calibrators:
                if args.all_cals:
                    # show all calibrators
                    for calibrator in calibrators:
                        observation_catalogue = add_target(
                            calibrator,
                            observation_catalogue,
                            tag=cal_tag + 'cal')
                else:
                    # find the best coverage over the target visibility period
                    calibrator, \
                        separation_angle, \
                        preceding_calibrator, \
                        preceding_calibrator_separation_angle = best_cal_cover(calibrators,
                                                                               target,
                                                                               ref_antenna)
                    if preceding_calibrator is not None \
                            and preceding_calibrator_separation_angle < 90.:
                        observation_catalogue = add_target(
                            preceding_calibrator,
                            observation_catalogue,
                            tag=cal_tag + 'cal')
                    observation_catalogue = add_target(calibrator,
                                                       observation_catalogue,
                                                       tag=cal_tag + 'cal')
        observation_catalogue = add_target(target, observation_catalogue)

    # write observation catalogue
    catalogue_header = write_header(args, userheader=header)
    catalogue_data = observation_catalogue.sort()
    if args.outfile is not None:
        filename = os.path.splitext(os.path.basename(args.outfile))[0] + '.csv'
        args.outfile = os.path.join(os.path.dirname(args.outfile), filename)
        write_catalogue(
            args.outfile,
            catalogue_header,
            catalogue_data,
        )
        print('Observation catalogue {}'.format(args.outfile))

    # output observation stats for catalogue
    obs_summary = obs_table(
        ref_antenna,
        catalogue=catalogue_data,
        ref_tgt_list=cal_targets,
        solar_sep=args.solar_angle,
        lst=args.lst,
    )
    print(obs_summary)

    if text_only and not args.text_only:
        msg = 'Required matplotlib functionalities not available\n'
        msg += 'Cannot create elevation plot\n'
        msg += 'Only producing catalogue file and output to screen'
        print(msg)
    if not (text_only or args.text_only):
        # create elevation plot for sources
        obs_catalogue = catalogue_header
        for target in catalogue_data:
            obs_catalogue += '{}\n'.format(target)
        source_elevation(observation_catalogue, ref_antenna)
        plt.show()
        plt.close()
Beispiel #7
0
def main(args):
    """Run calibration observation."""
    observatory = Observatory()
    location = observatory.location
    node_config_available = observatory.node_config_available
    creation_time = args.datetime
    ref_antenna = katpoint.Antenna(location)
    ref_antenna.observer.date = ephem.Date(creation_time)
    ref_antenna.observer.horizon = ephem.degrees(str(args.horizon))

    if args.view:
        # check if view file in CSV or YAML
        data_dict = read_yaml(args.view)
        if data_dict:
            catalogue = katpoint.Catalogue()
            catalogue.antenna = ref_antenna
            for observation_cycle in data_dict["observation_loop"]:
                for target_item in observation_cycle["target_list"]:
                    name, target = katpoint_target(target_item)
                    catalogue.add(katpoint.Target(target))
        else:  # assume CSV
            # output observation stats for catalogue
            with open(args.view, 'r') as fin:
                catalogue = katpoint.Catalogue(fin)
        obs_summary = obs_table(ref_antenna,
                                catalogue=catalogue,
                                solar_sep=args.solar_angle,
                                lst=args.lst)
        print(obs_summary)

        if not (args.text_only or text_only):
            for view_option in args.view_tags:
                cp_cat = deepcopy(catalogue)
                if "elevation" in view_option:
                    plot_func = source_elevation
                if "solarangle" in view_option:
                    plot_func = source_solar_angle
                if "riseset" in view_option:
                    plot_func = source_rise_set
                plot_func(cp_cat, ref_antenna)
            plt.show()
        quit()

    if args.cat_path and os.path.isdir(args.cat_path):
        catalogue_path = args.cat_path
        config_file_available = True
    else:
        catalogue_path = "katconfig/user/catalogues"
        config_file_available = False

    # before doing anything, verify that calibrator catalogues can be accessed
    if not os.path.isdir(catalogue_path) and not node_config_available:
        msg = "Could not access calibrator catalogue default location\n"
        msg += "add explicit location of catalogue folder using --cat-path <dirname>"
        raise RuntimeError(msg)

    # constructing observational catalogue
    observation_catalogue = katpoint.Catalogue()
    observation_catalogue.antenna = ref_antenna

    # targets to obtain calibrators for
    header = ""
    cal_targets = []
    if args.target is not None:
        # input target from command line
        args.target = [tgt.strip() for tgt in args.target]
        target = ", ".join(
            map(str, [
                args.target[0], "radec target", args.target[1], args.target[2]
            ]))
        cal_targets = [katpoint.Target(target)]
    else:  # assume the targets are in a file
        with open(args.infile, "r") as fin:
            # extract targets tagged to be used for calibrator selection
            for line in fin.readlines():
                if line[0] == "#":  # catch and keep header lines
                    header += line
                    continue
                if len(line) < 1:  # ignore empty lines
                    continue
                if "calref" in line:
                    target = line.strip().replace("calref", "target")
                    cal_targets.append(katpoint.Target(target))
                else:  # add target to catalogue
                    target = line.strip().replace("radec", "radec target")
                    observation_catalogue.add(katpoint.Target(target))
        # if not reference target for calibrator selection is specified,
        # simply select the first target listed in the catalogue
        if len(cal_targets) < 1:
            cal_targets = [observation_catalogue.targets[0]]

    for target in cal_targets:
        # add calibrator catalogues and calibrators to catalogue
        for cal_tag in args.cal_tags:
            cal_catalogue = os.path.join(
                catalogue_path,
                "Lband-{}-calibrators.csv".format(caltag_dict[cal_tag]))
            try:
                fin = open(cal_catalogue, 'r')
                if config_file_available:
                    calibrators = katpoint.Catalogue(fin)
                elif node_config_available:
                    calibrators = katpoint.Catalogue(
                        observatory.read_file_from_node_config(cal_catalogue))
                else:  # user specified calibrator file
                    calibrators = katpoint.Catalogue(fin)
            except (AssertionError, IOError):
                msg = bcolors.WARNING
                msg += "Unable to open {}\n".format(cal_catalogue)
                msg += "Observation file will still be created,"
                "please add calibrator manually\n"
                msg += bcolors.ENDC
                print(msg)
                continue
            if "gain" in cal_tag or "delay" in cal_tag:
                # for secondary calibrators such as gain:
                # find the closest calibrator
                calibrator, separation_angle = get_cal(calibrators, target,
                                                       ref_antenna)
                observation_catalogue = add_target(calibrator,
                                                   observation_catalogue,
                                                   tag=cal_tag + "cal")
            else:
                # for primary calibrators:
                if args.all_cals:
                    # show all calibrators
                    for calibrator in calibrators:
                        observation_catalogue = add_target(
                            calibrator,
                            observation_catalogue,
                            tag=cal_tag + "cal")
                else:
                    # find the best coverage over the target visibility period
                    [
                        calibrator, separation_angle, preceding_calibrator,
                        preceding_calibrator_separation_angle
                    ] = best_cal_cover(calibrators, target, ref_antenna)
                    if (preceding_calibrator is not None
                            and preceding_calibrator_separation_angle < 90.0):
                        observation_catalogue = add_target(
                            preceding_calibrator,
                            observation_catalogue,
                            tag=cal_tag + "cal",
                        )
                    observation_catalogue = add_target(calibrator,
                                                       observation_catalogue,
                                                       tag=cal_tag + "cal")
        observation_catalogue = add_target(target, observation_catalogue)

    # write observation catalogue
    catalogue_header = write_header(args, userheader=header)
    catalogue_data = observation_catalogue.sort()
    if args.outfile is not None:
        filename = os.path.splitext(os.path.basename(args.outfile))[0] + ".csv"
        args.outfile = os.path.join(os.path.dirname(args.outfile), filename)
        write_catalogue(args.outfile, catalogue_header, catalogue_data)
        print("Observation catalogue {}".format(args.outfile))

    # output observation stats for catalogue
    obs_summary = obs_table(
        ref_antenna,
        catalogue=catalogue_data,
        ref_tgt_list=cal_targets,
        solar_sep=args.solar_angle,
        lst=args.lst,
    )
    print(obs_summary)

    if text_only and not args.text_only:
        msg = "Required matplotlib functionalities not available\n"
        msg += "Cannot create elevation plot\n"
        msg += "Only producing catalogue file and output to screen"
        print(msg)
    if not (text_only or args.text_only):
        # create elevation plot for sources
        obs_catalogue = catalogue_header
        for target in catalogue_data:
            obs_catalogue += "{}\n".format(target)
        source_elevation(observation_catalogue, ref_antenna)
        if args.save_fig:
            imfile = "elevation_utc_lst.png"
            print("Elevation plot {}".format(imfile))
            plt.savefig(imfile, dpi=300)
        plt.show()
        plt.close()