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)
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)
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)
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)
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)
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()
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()