Пример #1
0
def tst_holy(name, spec_file, lines, wv_cen, disp, score, fidx, test='semi_brute', debug=False):

    # Favored parameters (should match those in the defaults)
    siglev=20.
    #min_ampl=1000.
    min_ampl=200.
    min_match = 10

    # Load spectrum
    exten = spec_file.split('.')[-1]
    if exten == 'json':
        with open(test_arc_path+spec_file,'r') as f:
            pypit_fit = json.load(f)
        # Allow for new PYPIT output
        if '0' in pypit_fit.keys():
            pypit_fit = pypit_fit['0']
        # Continue
        spec = np.array(pypit_fit['spec'])
    elif exten == 'hdf5':
        hdf = h5py.File(test_arc_path+spec_file,'r')
        spec = hdf['arcs/{:d}/spec'.format(fidx)].value
    elif exten == 'ascii':
        tbl = Table.read(test_arc_path+spec_file, format='ascii')
        spec = tbl['flux'].data
    else:
        pdb.set_trace()

    # Run
    outroot = outdir+name
    #if spec_file == 'deimos_830G_r_PYPIT.json':
    #    debug=True
    if test == 'semi_brute':
        best_dict, final_fit = grail.semi_brute(spec, lines, wv_cen, disp, debug=debug,
                             min_ampl=min_ampl, min_nmatch=min_match, outroot=outroot)
    elif test == 'general':
        best_dict, final_fit = grail.general(spec, lines, debug=debug,
                                                min_ampl=min_ampl, outroot=outroot)
    else:
        pdb.set_trace()

    # Score
    grade = 'PASSED'
    if final_fit['rms'] > score['rms']:
        grade = 'FAILED'
        warnings.warn("Solution for {:s} failed RMS!!".format(name))
    if len(final_fit['xfit']) < score['nxfit']:
        grade = 'FAILED'
        warnings.warn("Solution for {:s} failed N xfit!!".format(name))
    if best_dict['nmatch'] < score['nmatch']:
        grade = 'FAILED'
        warnings.warn("Solution for {:s} failed N match!!".format(name))

    # Warn
    return grade, best_dict, final_fit
Пример #2
0
def main(pargs=None):
    """ Run
    Parameters
    ----------
    args

    Returns
    -------

    """
    import numpy as np

    from arclines import io as arcl_io
    from arclines.holy import utils as arch_utils
    from arclines.holy.grail import semi_brute
    from arclines.holy import patterns as arch_patt
    from arclines.holy import fitting as arch_fit

    if pargs.outroot is None:
        pargs.outroot = 'tmp_matches'
    # Defaults
    min_ampl = (pargs.min_ampl if (pargs.min_ampl is not None) else 100.)

    # Load spectrum
    spec = arcl_io.load_spectrum(pargs.spectrum)
    # Arc lines
    lines = pargs.lines.split(',')

    # Call brute
    semi_brute(spec,
               lines,
               pargs.wvcen,
               pargs.disp,
               min_ampl=min_ampl,
               debug=pargs.debug,
               outroot=pargs.outroot,
               do_fit=pargs.fit,
               verbose=True)
    if pargs.debug:
        pdb.set_trace()
Пример #3
0
def test_holy(name, spec_file, lines, wv_cen, disp, score, fidx):

    # Favored parameters (should match those in the defaults)
    siglev = 20.
    min_ampl = 1000.
    min_match = 10

    # Load spectrum
    exten = spec_file.split('.')[-1]
    if exten == 'json':
        with open(test_arc_path + spec_file, 'r') as f:
            pypit_fit = json.load(f)
        spec = np.array(pypit_fit['spec'])
    elif exten == 'hdf5':
        hdf = h5py.File(test_arc_path + spec_file, 'r')
        spec = hdf['arcs/{:d}/spec'.format(fidx)].value
    else:
        pdb.set_trace()

    # Run
    outroot = outdir + name
    best_dict, final_fit = grail.semi_brute(spec,
                                            lines,
                                            wv_cen,
                                            disp,
                                            siglev=siglev,
                                            min_ampl=min_ampl,
                                            min_nmatch=10,
                                            outroot=outroot)
    # Score
    grade = 'PASSED'
    if final_fit['rms'] > score['rms']:
        grade = 'FAILED'
        warnings.warn("Solution for {:s} failed RMS!!".format(name))
    if len(final_fit['xfit']) < score['nxfit']:
        grade = 'FAILED'
        warnings.warn("Solution for {:s} failed N xfit!!".format(name))
    if best_dict['nmatch'] < score['nmatch']:
        grade = 'FAILED'
        warnings.warn("Solution for {:s} failed N match!!".format(name))

    # Warn
    return grade, best_dict, final_fit
Пример #4
0
def calib_with_arclines(slf, det, get_poly=False, use_method="general"):
    """Simple calibration algorithm for longslit wavelengths

    Uses slf._arcparam to guide the analysis

    Parameters
    ----------
    get_poly : bool, optional
      Pause to record the polynomial pix = b0 + b1*lambda + b2*lambda**2

    Returns
    -------
    final_fit : dict
      Dict of fit info
    """
    from arclines.holy.grail import basic, semi_brute, general
    # Parameters (just for convenience)
    aparm = slf._arcparam[det - 1]
    # Extract the arc
    msgs.work("Detecting lines")
    tampl, tcent, twid, w, satsnd, spec = detect_lines(slf, det,
                                                       slf._msarc[det - 1])

    if use_method == "semi-brute":
        best_dict, final_fit = semi_brute(spec,
                                          aparm['lamps'],
                                          aparm['wv_cen'],
                                          aparm['disp'],
                                          fit_parm=aparm,
                                          min_ampl=aparm['min_ampl'])
    elif use_method == "basic":
        stuff = basic(spec, aparm['lamps'], aparm['wv_cen'], aparm['disp'])
        status, ngd_match, match_idx, scores, final_fit = stuff
    else:
        # Now preferred
        best_dict, final_fit = general(spec,
                                       aparm['lamps'],
                                       fit_parm=aparm,
                                       min_ampl=aparm['min_ampl'])
    arqa.arc_fit_qa(slf, final_fit)
    #
    return final_fit
Пример #5
0
def main(pargs=None):
    """ Run
    Parameters
    ----------
    args

    Returns
    -------

    """
    import numpy as np
    from matplotlib import pyplot as plt

    from linetools import utils as ltu

    from arclines import io as arcl_io
    from arclines.holy import utils as arch_utils
    from arclines.holy.grail import general, semi_brute
    from arclines.holy import patterns as arch_patt
    from arclines.holy import fitting as arch_fit

    if pargs.outroot is None:
        pargs.outroot = 'tmp_matches'
    # Defaults

    # Load spectrum
    spec = arcl_io.load_spectrum(pargs.spectrum)
    if pargs.show_spec:
        plt.clf()
        ax = plt.gca()
        ax.plot(spec)
        plt.show()

    # Arc lines
    lines = pargs.lines.split(',')

    # Call brute
    if pargs.brute:
        best_dict, final_fit = semi_brute(spec,
                                          lines,
                                          pargs.wvcen,
                                          pargs.disp,
                                          min_ampl=pargs.min_ampl,
                                          debug=pargs.debug,
                                          outroot=pargs.outroot,
                                          do_fit=pargs.fit,
                                          verbose=True)
        #best_dict, final_fit = grail.semi_brute(spec, lines, wv_cen, disp, siglev=siglev,
        #                                        min_ampl=min_ampl, min_nmatch=min_match, outroot=outroot)
    else:
        best_dict, final_fit = general(spec,
                                       lines,
                                       do_fit=pargs.fit,
                                       verbose=True,
                                       debug=pargs.debug,
                                       min_ampl=pargs.min_ampl,
                                       outroot=pargs.outroot)
    if pargs.debug:
        pdb.set_trace()

    if pargs.fit:
        ltu.savejson(pargs.outroot + '_fit.json',
                     ltu.jsonify(final_fit),
                     easy_to_read=True,
                     overwrite=True)