def source_to_unknowns(source, write=False, verbose=True, min_ampl=0.): """ Parameters ---------- source write min_ampl : float (optional) Minimum amplitude for a new UNKNOWN Returns ------- """ # Load src_dict = load_source.load(source) U_lines = src_dict['U_lines'] # Cut on amplitude print("Cutting UNKNOWNs on min_ampl") U_lines = U_lines[U_lines['amplitude'] > min_ampl] src_dict['U_lines'] = U_lines # UNKNWN lines if U_lines is None: return # Unique ions uions = arcl_utils.unique_ions(source, src_dict=src_dict) # Check against 'complete' NIST and our line lists mask, _ = arcl_utils.vette_unkwn_against_lists(U_lines, uions, verbose=verbose) if np.sum(mask) == 0: return if not os.path.isfile(unk_file): # Generate? if write: print("Generating line list:\n {:s}".format(unk_file)) unknwn_list = create_line_list(U_lines[mask > 0], source['File'], source['Instr'], unknown=True, ions=uions) arcl_io.write_line_list(unknwn_list, unk_file) else: # Update unknwn_list, updated = update_uline_list(U_lines[mask > 0], source['File'], source['Instr'], uions) if write and updated: arcl_io.write_line_list(unknwn_list, unk_file) # Return return unknwn_list
def source_to_line_lists(source, write=False, llist_dict=None): """ Parameters ---------- source write scratch : bool, optional Build from scratch -- EXPERTS ONLY Returns ------- """ if llist_dict is None: # For building without writing llist_dict = {} # Parse src_dict = load_source.load(source) # Check if src_dict['ID_lines'] is None: print("No IDs in source: {:s}".format(source['File'])) return llist_dict # Unique ions uions = arcl_utils.unique_ions(source, src_dict=src_dict) # Loop on ID ions for ion in uions: ion_file = llist_path + '{:s}_lines.dat'.format(ion) # Parse idx = src_dict['ID_lines']['ion'] == ion sub_tbl = src_dict['ID_lines'][idx] # Generate? if (not os.path.isfile(ion_file)) and (ion not in llist_dict.keys()): # New llist_dict[ion] = create_line_list(sub_tbl, source['File'], source['Instr']) if not write: print("Would generate line list:\n {:s}".format(ion_file)) else: print("Generating line list:\n {:s}".format(ion_file)) arcl_io.write_line_list(llist_dict[ion], ion_file) else: if ion not in llist_dict.keys(): raise KeyError( "You are trying to build from scratch but didn't remove {:s}" .format(ion_file)) llist_dict[ion], updated = update_line_list( llist_dict[ion], sub_tbl, source['File'], source['Instr']) # Write if write and updated: arcl_io.write_line_list(llist_dict[ion], ion_file) # Return return llist_dict
def master_build(write=False, nsources=None, plots=True, verbose=True): """ Master loop to build the line lists Parameters ---------- check_only : bool, optional Only check to see what would be created, i.e. do not execute nsources : int, optional Mainly for step-by-step build plots : bool, optional Generate plots, if write=True too """ # Load sources sources = arcl_io.load_source_table() if nsources is not None: sources = sources[0:nsources] # Loop on sources for source in sources: print("=============================================================") print("Working on source {:s}".format(source['File'])) print("=============================================================") # Load line table ID_lines, U_lines = load_source.load(source['File'], source['Format'], source['Lines'].split(','), plot=plots, wvmnx=[source['wvmin'], source['wvmax']]) # Lines (Double check) src_lines = source['Lines'].split(',') if ID_lines is None: uions = src_lines else: # Check uions = np.unique(ID_lines['ion'].data) for src_line in src_lines: if src_line not in uions.tolist(): raise ValueError("Line {:s} not found in ID_lines".format(src_line)) # Loop on ID ions for ion in uions: # Parse idx = ID_lines['ion'] == ion sub_tbl = ID_lines[idx] # Generate? ion_file = llist_path+'{:s}_lines.dat'.format(ion) if not os.path.isfile(ion_file): if not write: print("Would generate line list:\n {:s}".format(ion_file)) else: print("Generating line list:\n {:s}".format(ion_file)) create_line_list(sub_tbl, source['File'], source['Instr'], ion_file) else: update_line_list(sub_tbl, source['File'], source['Instr'], ion_file, write=write)
def main(args=None): """ Run Parameters ---------- args Returns ------- """ # Grab arguments pargs = parser(options=args) import numpy as np from astropy.table import vstack from arclines import build_lists from arclines import io as arcl_io from arclines import load_source from arclines import plots as arcl_plots from arclines import utils as arcl_utils print("=============================================================") print("This script is for EXPERTS ONLY") print("Continue only if you know what you are doing") print("This script adds only the *last* source listed") print("Otherwise exit") print("=============================================================") if not pargs.skip_stop: pdb.set_trace() # Load sources sources = arcl_io.load_source_table() source = sources[-1] # Load line lists uions = arcl_utils.unique_ions(source) llist_dict = {} for ion in uions: try: llist_dict[ion] = arcl_io.load_line_list(ion, use_ion=True) except IOError: print("No linelist found for ion={:s}. Will create one".format(ion)) # IDs print("=============================================================") print("Working on adding IDs from source {:s}".format(source['File'])) print("=============================================================") llist_dict = build_lists.source_to_line_lists(source, write=pargs.write, llist_dict=llist_dict) # Create line list ll = [] for key in llist_dict.keys(): ll.append(llist_dict[key]) line_lists = vstack(ll) # Purge unknowns print("=============================================================") print("Purging UNKNOWNs") print("=============================================================") build_lists.purge_unknowns(line_lists, write=pargs.write) print("=============================================================") print("Working on adding Unknowns from source {:s}".format(source['File'])) print("=============================================================") if not pargs.no_unknowns: unknwns = build_lists.source_to_unknowns(source, write=pargs.write) unknwns.remove_column('line_flag') else: unknwns = None if unknwns is not None: ll.append(unknwns) # Loop to my loop print("=============================================================") print("Working on plot for {:s}".format(source['File'])) print("=============================================================") # Load src_dict = load_source.load(source) uions = arcl_utils.unique_ions(source, src_dict=src_dict) src_dict['uions'] = uions # Outfile iext = source['File'].rfind('.') outfile = source['File'][:iext]+'.pdf' title = source['File'][:iext] # arcl_plots.show_source(src_dict, line_lists, outfile, title=title, clobber=True)