Exemplo n.º 1
0
def jwst_2d_det(result_dict, plot=True, output_file='det2d.html'):
    """Plot 2d detector image
    
    Parameters
    ----------
    result_dict : dict
        Dictionary from pandexo output. If parameter space was run in run_pandexo 
        make sure to restructure the input as a list of dictionaries without they key words 
        that run_pandexo assigns. 
    
    plot : bool 
        (Optional) True renders plot, Flase does not. Default=True
    output_file : str
        (Optional) Default = 'det2d.html'    
    
    Return
    ------
    numpy array
        2D array of out of transit detector simulation
    See Also
    --------
    jwst_1d_spec, jwst_1d_bkg, jwst_1d_flux, jwst_1d_snr, jwst_noise, jwst_2d_sat

    """
    TOOLS = "pan,wheel_zoom,box_zoom,resize,reset,save"
    out = result_dict['PandeiaOutTrans']
    data = out['2d']['detector']

    xr, yr = data.shape

    plot_detector_2d = Figure(
        tools="pan,wheel_zoom,box_zoom,resize,reset,hover,save",
        x_range=[0, yr],
        y_range=[0, xr],
        x_axis_label='Pixel',
        y_axis_label='Spatial',
        title="2D Detector Image",
        plot_width=800,
        plot_height=300)

    plot_detector_2d.image(image=[data],
                           x=[0],
                           y=[0],
                           dh=[xr],
                           dw=[yr],
                           palette="Spectral11")
    if plot:
        outputfile(output_file)
        show(plot_detector_2d)
    return data
Exemplo n.º 2
0
def jwst_noise(result_dict, plot=True, output_file='noise.html'):
    """Plot background

    Parameters
    ----------
    result_dict : dict
        Dictionary from pandexo output. If parameter space was run in run_pandexo
        make sure to restructure the input as a list of dictionaries without they key words
        that run_pandexo assigns.
    plot : bool
        (Optional) True renders plot, Flase does not. Default=True
    output_file : str
        (Optional) Default = 'noise.html'
    Return
    ------
    x : numpy array
        micron
    y : numpy array
        1D noise (ppm)

    See Also
    --------
    jwst_1d_spec, jwst_1d_bkg, jwst_1d_flux, jwst_1d_snr, jwst_2d_det, jwst_2d_sat
    """
    TOOLS = "pan,wheel_zoom,box_zoom,reset,save"  #saturation

    x = result_dict['FinalSpectrum']['wave']
    y = result_dict['FinalSpectrum']['error_w_floor'] * 1e6
    x = x[~np.isnan(y)]
    y = y[~np.isnan(y)]
    ymed = np.median(y)

    plot_noise_1d1 = Figure(
        tools=TOOLS,  #responsive=True,
        x_axis_label='Wavelength (micron)',
        y_axis_label='Error on Spectrum (PPM)',
        title="Error Curve",
        plot_width=800,
        plot_height=300,
        y_range=[0, 2.0 * ymed])
    ymed = np.median(y)
    plot_noise_1d1.circle(x, y, line_width=4, alpha=.7)
    if plot:
        outputfile(output_file)
        show(plot_noise_1d1)
    return x, y
Exemplo n.º 3
0
def jwst_1d_flux(result_dict, plot=True, output_file='flux.html'):
    """Plot flux rate in e/s

    Parameters
    ----------
    result_dict : dict
        Dictionary from pandexo output. If parameter space was run in run_pandexo
        make sure to restructure the input as a list of dictionaries without they key words
        that run_pandexo assigns.
    plot : bool
        (Optional) True renders plot, Flase does not. Default=True
    output_file : str
        (Optional) Default = 'flux.html'
    Return
    ------
    x : numpy array
        micron
    y : numpy array
        1D flux rate in electrons/s

    See Also
    --------
    jwst_1d_spec, jwst_1d_bkg, jwst_noise, jwst_1d_snr, jwst_2d_det, jwst_2d_sat
    """
    TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
    out = result_dict['PandeiaOutTrans']

    # Flux 1d
    x, y = out['1d']['extracted_flux']
    x = x[~np.isnan(y)]
    y = y[~np.isnan(y)]

    plot_flux_1d1 = Figure(tools=TOOLS,
                           x_axis_label='Wavelength [microns]',
                           y_axis_label='Flux (e/s)',
                           title="Out of Transit Flux Rate",
                           plot_width=800,
                           plot_height=300)
    plot_flux_1d1.line(x, y, line_width=4, alpha=.7)

    if plot:
        outputfile(output_file)
        show(plot_flux_1d1)
    return x, y
Exemplo n.º 4
0
def jwst_1d_snr(result_dict, plot=True, output_file='snr.html'):
    """Plot SNR

    Parameters
    ----------
    result_dict : dict
        Dictionary from pandexo output. If parameter space was run in run_pandexo
        make sure to restructure the input as a list of dictionaries without they key words
        that run_pandexo assigns.
    plot : bool
        (Optional) True renders plot, Flase does not. Default=True
    output_file : str
        (Optional) Default = 'snr.html'

    Return
    ------
    x : numpy array
        micron
    y : numpy array
        1D SNR

    See Also
    --------
    jwst_1d_bkg, jwst_noise, jwst_1d_flux, jwst_1d_spec, jwst_2d_det, jwst_2d_sat
    """
    TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
    # Flux 1d
    x = result_dict['RawData']['wave']
    electrons_out = result_dict['RawData']['electrons_out']
    y = electrons_out / np.sqrt(result_dict['RawData']['var_out'])
    x = x[~np.isnan(y)]
    y = y[~np.isnan(y)]
    plot_snr_1d1 = Figure(tools=TOOLS,
                          x_axis_label='Wavelength (micron)',
                          y_axis_label='SNR',
                          title="SNR Out of Trans",
                          plot_width=800,
                          plot_height=300)
    plot_snr_1d1.line(x, y, line_width=4, alpha=.7)
    if plot:
        outputfile(output_file)
        show(plot_snr_1d1)
    return x, y
Exemplo n.º 5
0
def jwst_2d_det(result_dict, plot=True, output_file='det2d.html'): 
    """Plot 2d detector image
    
    Parameters
    ----------
    result_dict : dict
        Dictionary from pandexo output. If parameter space was run in run_pandexo 
        make sure to restructure the input as a list of dictionaries without they key words 
        that run_pandexo assigns. 
    
    plot : bool 
        (Optional) True renders plot, Flase does not. Default=True
    output_file : str
        (Optional) Default = 'det2d.html'    
    
    Return
    ------
    numpy array
        2D array of out of transit detector simulation
    See Also
    --------
    jwst_1d_spec, jwst_1d_bkg, jwst_1d_flux, jwst_1d_snr, jwst_noise, jwst_2d_sat

    """
    TOOLS = "pan,wheel_zoom,box_zoom,resize,reset,save"
    out = result_dict['PandeiaOutTrans']
    data = out['2d']['detector']

    
    xr, yr = data.shape
    
    plot_detector_2d = Figure(tools="pan,wheel_zoom,box_zoom,resize,reset,hover,save",
                         x_range=[0, yr], y_range=[0, xr],
                         x_axis_label='Pixel', y_axis_label='Spatial',
                         title="2D Detector Image",
                        plot_width=800, plot_height=300)
    
    plot_detector_2d.image(image=[data], x=[0], y=[0], dh=[xr], dw=[yr],
                      palette="Spectral11")
    if plot:
        outputfile(output_file)
        show(plot_detector_2d)
    return data
Exemplo n.º 6
0
def jwst_noise(result_dict, plot=True, output_file= 'noise.html'): 
    """Plot background
    
    Parameters
    ----------
    result_dict : dict
        Dictionary from pandexo output. If parameter space was run in run_pandexo 
        make sure to restructure the input as a list of dictionaries without they key words 
        that run_pandexo assigns. 
    plot : bool 
        (Optional) True renders plot, Flase does not. Default=True
    output_file : str
        (Optional) Default = 'noise.html'
    Return
    ------
    x : numpy array
        micron
    y : numpy array
        1D noise (ppm)

    See Also
    --------
    jwst_1d_spec, jwst_1d_bkg, jwst_1d_flux, jwst_1d_snr, jwst_2d_det, jwst_2d_sat
    """  
    TOOLS = "pan,wheel_zoom,box_zoom,resize,reset,save"    #saturation

    x = result_dict['FinalSpectrum']['wave']
    y = result_dict['FinalSpectrum']['error_w_floor']*1e6
    x = x[~np.isnan(y)]
    y = y[~np.isnan(y)]    
    ymed = np.median(y)


    plot_noise_1d1 = Figure(tools=TOOLS,#responsive=True,
                         x_axis_label='Wavelength (micron)',
                         y_axis_label='Error on Spectrum (PPM)', title="Error Curve",
                         plot_width=800, plot_height=300, y_range = [0,2.0*ymed])
    ymed = np.median(y)
    plot_noise_1d1.circle(x, y, line_width = 4, alpha = .7)
    if plot: 
        outputfile(output_file)
        show(plot_noise_1d1)
    return x,y
Exemplo n.º 7
0
def jwst_1d_flux(result_dict, plot=True, output_file= 'flux.html'): 
    """Plot flux rate in e/s
    
    Parameters
    ----------
    result_dict : dict
        Dictionary from pandexo output. If parameter space was run in run_pandexo 
        make sure to restructure the input as a list of dictionaries without they key words 
        that run_pandexo assigns. 
    plot : bool 
        (Optional) True renders plot, Flase does not. Default=True
    output_file : str
        (Optional) Default = 'flux.html'    
    Return
    ------
    x : numpy array
        micron
    y : numpy array
        1D flux rate in electrons/s
        
    See Also
    --------
    jwst_1d_spec, jwst_1d_bkg, jwst_noise, jwst_1d_snr, jwst_2d_det, jwst_2d_sat
    """
    TOOLS = "pan,wheel_zoom,box_zoom,resize,reset,save"
    out = result_dict['PandeiaOutTrans']
    
    # Flux 1d
    x, y = out['1d']['extracted_flux']
    x = x[~np.isnan(y)]
    y = y[~np.isnan(y)]

    plot_flux_1d1 = Figure(tools=TOOLS,
                         x_axis_label='Wavelength [microns]',
                         y_axis_label='Flux (e/s)', title="Out of Transit Flux Rate",
                         plot_width=800, plot_height=300)
    plot_flux_1d1.line(x, y, line_width = 4, alpha = .7)
    
    if plot: 
        outputfile(output_file)
        show(plot_flux_1d1)
    return x,y
Exemplo n.º 8
0
def jwst_1d_snr(result_dict, plot=True, output_file='snr.html'): 
    """Plot SNR
    
    Parameters
    ----------
    result_dict : dict
        Dictionary from pandexo output. If parameter space was run in run_pandexo 
        make sure to restructure the input as a list of dictionaries without they key words 
        that run_pandexo assigns. 
    plot : bool 
        (Optional) True renders plot, Flase does not. Default=True
    output_file : str
        (Optional) Default = 'snr.html'   
                
    Return
    ------
    x : numpy array
        micron
    y : numpy array
        1D SNR

    See Also
    --------
    jwst_1d_bkg, jwst_noise, jwst_1d_flux, jwst_1d_spec, jwst_2d_det, jwst_2d_sat
    """    
    TOOLS = "pan,wheel_zoom,box_zoom,resize,reset,save"
    # Flux 1d
    x= result_dict['RawData']['wave']
    electrons_out = result_dict['RawData']['electrons_out']
    y = electrons_out/np.sqrt(result_dict['RawData']['var_out'])
    x = x[~np.isnan(y)]
    y = y[~np.isnan(y)]
    plot_snr_1d1 = Figure(tools=TOOLS,
                         x_axis_label='Wavelength (micron)',
                         y_axis_label='SNR', title="SNR Out of Trans",
                         plot_width=800, plot_height=300)
    plot_snr_1d1.line(x, y, line_width = 4, alpha = .7)
    if plot: 
        outputfile(output_file)
        show(plot_snr_1d1)
    return x,y
Exemplo n.º 9
0
def jwst_1d_spec(result_dict,
                 model=True,
                 title='Model + Data + Error Bars',
                 output_file='data.html',
                 legend=False,
                 R=False,
                 num_tran=False,
                 plot_width=800,
                 plot_height=400,
                 x_range=[1, 10],
                 y_range=None,
                 plot=True,
                 output_notebook=False):
    """Plots 1d simulated spectrum and rebin or rescale for more transits

    Plots 1d data points with model in the background (if wanted). Designed to read in exact
    output of run_pandexo.

    Parameters
    ----------
    result_dict : dict or list of dict
        Dictionary from pandexo output. If parameter space was run in run_pandexo
        make sure to restructure the input as a list of dictionaries without they key words
        that run_pandexo assigns.
    model : bool
        (Optional) True is default. True plots model, False does not plot model
    title : str
        (Optional) Title of plot. Default is "Model + Data + Error Bars".
    output_file : str
        (Optional) name of html file for you bokeh plot. After bokeh plot is rendered you will
        have the option to save as png.
    legend : bool
        (Optional) Default is False. True, plots legend.
    R : float
        (Optional) Rebin data from native instrument resolution to specified resolution. Dafult is False,
        no binning. Here I adopt R as w[1]/(w[2] - w[0]) to maintain consistency with `pandeia.engine`
    num_tran : float
        (Optional) Scales data by number of transits to improve error by sqrt(`num_trans`)
    plot_width : int
        (Optional) Sets the width of the plot. Default = 800
    plot_height : int
        (Optional) Sets the height of the plot. Default = 400
    y_range : list of int
        (Optional) sets y range of plot. Defaut is +- 10% of max and min
    x_range : list of int
        (Optional) Sets x range of plot. Default = [1,10]
    plot : bool
        (Optional) Supresses the plot if not wanted (Default = True)
    out_notebook : bool 
        (Optional) Output notebook. Default is false, if true, outputs in the notebook

    Returns
    -------
    x,y,e : list of arrays
        Returns wave axis, spectrum and associated error in list format. x[0] will be correspond
        to the first dictionary input, x[1] to the second, etc.

    Examples
    --------

    >>> jwst_1d_spec(result_dict, num_tran = 3, R = 35) #for a single plot

    If you wanted to save each of the axis that were being plotted:

    >>> x,y,e = jwst_1d_data([result_dict1, result_dict2], model=False, num_tran = 5, R = 100) #for multiple

    See Also
    --------
    jwst_noise, jwst_1d_bkg, jwst_1d_flux, jwst_1d_snr, jwst_2d_det, jwst_2d_sat

    """
    outx = []
    outy = []
    oute = []
    TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
    if output_notebook:
        outnotebook()
    else:
        outputfile(output_file)
    colors = [
        'black', 'blue', 'red', 'orange', 'yellow', 'purple', 'pink', 'cyan',
        'grey', 'brown'
    ]
    #make sure its iterable
    if type(result_dict) != list:
        result_dict = [result_dict]

    if type(legend) != bool:
        legend_keys = legend
        legend = True
        if type(legend_keys) != list:
            legend_keys = [legend_keys]

    i = 0
    for dictt in result_dict:
        ntran_old = dictt['timing']['Number of Transits']
        to = dictt['timing']["Num Integrations Out of Transit"]
        ti = dictt['timing']["Num Integrations In Transit"]
        #remove any nans
        y = dictt['FinalSpectrum']['spectrum_w_rand']
        x = dictt['FinalSpectrum']['wave'][~np.isnan(y)]
        err = dictt['FinalSpectrum']['error_w_floor'][~np.isnan(y)]
        y = y[~np.isnan(y)]

        if (R == False) & (num_tran == False):
            x = x
            y = y
        elif (R != False) & (num_tran != False):
            new_wave = bin_wave_to_R(x, R)
            out = uniform_tophat_sum(
                new_wave, x,
                dictt['RawData']['electrons_out'] * num_tran / ntran_old)
            inn = uniform_tophat_sum(
                new_wave, x,
                dictt['RawData']['electrons_in'] * num_tran / ntran_old)
            vout = uniform_tophat_sum(
                new_wave, x,
                dictt['RawData']['var_out'] * num_tran / ntran_old)
            vin = uniform_tophat_sum(
                new_wave, x, dictt['RawData']['var_in'] * num_tran / ntran_old)
            var_tot = (to / ti / out)**2.0 * vin + (inn * to / ti /
                                                    out**2.0)**2.0 * vout
            if dictt['input']['Primary/Secondary'] == 'fp/f*':
                fac = -1.0
            else:
                fac = 1.0
            rand_noise = np.sqrt((var_tot)) * (np.random.randn(len(new_wave)))
            raw_spec = (out / to - inn / ti) / (out / to)
            sim_spec = fac * (raw_spec + rand_noise)
            x = new_wave
            y = sim_spec
            err = np.sqrt(var_tot)
        elif (R == False) & (num_tran != False):
            out = dictt['RawData']['electrons_out'] * num_tran / ntran_old
            inn = dictt['RawData']['electrons_in'] * num_tran / ntran_old
            vout = dictt['RawData']['var_out'] * num_tran / ntran_old
            vin = dictt['RawData']['var_in'] * num_tran / ntran_old
            var_tot = (to / ti / out)**2.0 * vin + (inn * to / ti /
                                                    out**2.0)**2.0 * vout
            if dictt['input']['Primary/Secondary'] == 'fp/f*':
                fac = -1.0
            else:
                fac = 1.0
            rand_noise = np.sqrt((var_tot)) * (np.random.randn(len(x)))
            raw_spec = (out / to - inn / ti) / (out / to)
            sim_spec = fac * (raw_spec + rand_noise)
            x = x
            y = sim_spec
            err = np.sqrt(var_tot)
        elif (R != False) & (num_tran == False):
            new_wave = bin_wave_to_R(x, R)
            out = uniform_tophat_sum(new_wave, x,
                                     dictt['RawData']['electrons_out'])
            inn = uniform_tophat_sum(new_wave, x,
                                     dictt['RawData']['electrons_in'])
            vout = uniform_tophat_sum(new_wave, x, dictt['RawData']['var_out'])
            vin = uniform_tophat_sum(new_wave, x, dictt['RawData']['var_in'])
            var_tot = (to / ti / out)**2.0 * vin + (inn * to / ti /
                                                    out**2.0)**2.0 * vout
            if dictt['input']['Primary/Secondary'] == 'fp/f*':
                fac = -1.0
            else:
                fac = 1.0
            rand_noise = np.sqrt((var_tot)) * (np.random.randn(len(new_wave)))
            raw_spec = (out / to - inn / ti) / (out / to)
            sim_spec = fac * (raw_spec + rand_noise)
            x = new_wave
            y = sim_spec
            err = np.sqrt(var_tot)
        else:
            print(
                "Something went wrong. Cannot enter both resolution and ask to bin to new wave"
            )
            return

        #create error bars for Bokeh's multi_line and drop nans
        data = pd.DataFrame({'x': x, 'y': y, 'err': err}).dropna()

        y_err = []
        x_err = []
        for px, py, yerr in zip(data['x'], data['y'], data['err']):
            np.array(x_err.append((px, px)))
            np.array(y_err.append((py - yerr, py + yerr)))
        #initialize Figure
        if i == 0:
            #Define units for x and y axis
            y_axis_label = dictt['input']['Primary/Secondary']

            if y_axis_label == 'fp/f*': p = -1.0
            else: y_axis_label = y_axis_label

            if dictt['input']['Calculation Type'] == 'phase_spec':
                x_axis_label = 'Time (secs)'
                x_range = [min(x), max(x)]
            else:
                x_axis_label = 'Wavelength [microns]'

            if y_range != None:
                ylims = y_range
            else:
                ylims = [
                    min(dictt['OriginalInput']['model_spec']) -
                    0.1 * min(dictt['OriginalInput']['model_spec']),
                    0.1 * max(dictt['OriginalInput']['model_spec']) +
                    max(dictt['OriginalInput']['model_spec'])
                ]

            fig1d = Figure(x_range=x_range,
                           y_range=ylims,
                           plot_width=plot_width,
                           plot_height=plot_height,
                           title=title,
                           x_axis_label=x_axis_label,
                           y_axis_label=y_axis_label,
                           tools=TOOLS,
                           background_fill_color='white')

        #plot model, data, and errors
        if model:
            mxx = dictt['OriginalInput']['model_wave']
            myy = dictt['OriginalInput']['model_spec']
            my = uniform_tophat_mean(x, mxx, myy)
            model_line = pd.DataFrame({'x': x, 'my': my}).dropna()
            fig1d.line(model_line['x'],
                       model_line['my'],
                       color=colors[i],
                       alpha=0.2,
                       line_width=4)

        if legend:
            fig1d.circle(data['x'],
                         data['y'],
                         color=colors[i],
                         legend=legend_keys[i])
        else:
            fig1d.circle(data['x'], data['y'], color=colors[i])
        outx += [data['x'].values]
        outy += [data['y'].values]
        oute += [data['err'].values]
        fig1d.multi_line(x_err, y_err, color=colors[i])
        i += 1
    if plot:
        show(fig1d)
    return outx, outy, oute
Exemplo n.º 10
0
def hst_simulated_lightcurve(result_dict,
                             plot=True,
                             output_file='hsttime.html',
                             model=True):
    """Plot simulated HST light curves (in fluece) for earliest and latest start times

    Parameters
    ----------
    result_dict : dict
        Dictionary from pandexo output.

    plot : bool
        (Optional) True renders plot, False does not. Default=True
    model : bool
        (Optional) Plot model under data. Default=True
    output_file : str
        (Optional) Default = 'hsttime.html'

    Return
    ------
    obsphase1 : numpy array
        earliest start time
    counts1 : numpy array
        white light curve in fluence (e/pixel)
    obsphase2 : numpy array
        latest start time
    counts2 : numpy array
        white light curve in fluence (e/pixel)
    rms : numpy array
        1D rms noise

    See Also
    --------
    hst_spec
    """
    TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
    # earliest and latest start times
    obsphase1 = result_dict['light_curve']['obsphase1']
    rms = result_dict['light_curve']['light_curve_rms']
    obsphase2 = result_dict['light_curve']['obsphase2']
    phase1 = result_dict['light_curve']['phase1']
    phase2 = result_dict['light_curve']['phase2']
    counts1 = result_dict['light_curve']['counts1']
    counts2 = result_dict['light_curve']['counts2']
    count_noise = result_dict['light_curve']['count_noise']
    ramp_included = result_dict['light_curve']['ramp_included']
    model_counts1 = result_dict['light_curve']['model_counts1']
    model_counts2 = result_dict['light_curve']['model_counts2']

    if isinstance(count_noise, float):
        rms = np.zeros(len(counts1)) + count_noise
    y_err1 = []
    x_err1 = []
    for px, py, yerr in zip(obsphase1, counts1, rms):
        np.array(x_err1.append((px, px)))
        np.array(y_err1.append((py - yerr, py + yerr)))

    y_err2 = []
    x_err2 = []
    for px, py, yerr in zip(obsphase2, counts2, rms):
        np.array(x_err2.append((px, px)))
        np.array(y_err2.append((py - yerr, py + yerr)))

    if ramp_included:
        title_description = " (Ramp Included)"
    else:
        title_description = " (Ramp Removed)"

    early = Figure(
        plot_width=400,
        plot_height=300,
        tools=TOOLS,  #responsive=True,
        x_axis_label='Orbital Phase',
        y_axis_label='Flux [electrons/pixel]',
        title="Earliest Start Time" + title_description)

    if model:
        early.line(phase1,
                   model_counts1,
                   color='black',
                   alpha=0.5,
                   line_width=4)
    early.circle(obsphase1, counts1, line_width=3, line_alpha=0.6)
    early.multi_line(x_err1, y_err1)

    late = Figure(
        plot_width=400,
        plot_height=300,
        tools=TOOLS,  # responsive=True,
        x_axis_label='Orbital Phase',
        y_axis_label='Flux [electrons/pixel]',
        title="Latest Start Time" + title_description)
    if model:
        late.line(phase2,
                  model_counts2,
                  color='black',
                  alpha=0.5,
                  line_width=3)
    late.circle(obsphase2, counts2, line_width=3, line_alpha=0.6)
    late.multi_line(x_err2, y_err2)

    start_time = row(early, late)

    if plot:
        outputfile(output_file)
        show(start_time)

    return obsphase1, counts1, obsphase2, counts2, rms
Exemplo n.º 11
0
def hst_time(result_dict, plot=True, output_file='hsttime.html', model=True):
    """Plot earliest and latest start times for hst observation

    Parameters
    ----------
    result_dict : dict
        Dictionary from pandexo output.

    plot : bool
        (Optional) True renders plot, False does not. Default=True
    model : bool
        (Optional) Plot model under data. Default=True
    output_file : str
        (Optional) Default = 'hsttime.html'

    Return
    ------
    obsphase1 : numpy array
        earliest start time
    obstr1 : numpy array
        white light curve
    obsphase2 : numpy array
        latest start time
    obstr2 : numpy array
        white light curve
    rms : numpy array
        1D rms noise

    See Also
    --------
    hst_spec
    """
    TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
    #earliest and latest start times
    obsphase1 = result_dict['calc_start_window']['obsphase1']
    obstr1 = result_dict['calc_start_window']['obstr1']
    rms = result_dict['calc_start_window']['light_curve_rms']
    obsphase2 = result_dict['calc_start_window']['obsphase2']
    obstr2 = result_dict['calc_start_window']['obstr2']
    phase1 = result_dict['calc_start_window']['phase1']
    phase2 = result_dict['calc_start_window']['phase2']
    trmodel1 = result_dict['calc_start_window']['trmodel1']
    trmodel2 = result_dict['calc_start_window']['trmodel2']

    if isinstance(rms, float):
        rms = np.zeros(len(obsphase1)) + rms
    y_err1 = []
    x_err1 = []
    for px, py, yerr in zip(obsphase1, obstr1, rms):
        np.array(x_err1.append((px, px)))
        np.array(y_err1.append((py - yerr, py + yerr)))

    y_err2 = []
    x_err2 = []
    for px, py, yerr in zip(obsphase2, obstr2, rms):
        np.array(x_err2.append((px, px)))
        np.array(y_err2.append((py - yerr, py + yerr)))

    early = Figure(
        plot_width=400,
        plot_height=300,
        tools=TOOLS,  #responsive=True,
        x_axis_label='Orbital Phase',
        y_axis_label='Flux',
        title="Earliest Start Time")

    if model:
        early.line(phase1, trmodel1, color='black', alpha=0.5, line_width=4)
    early.circle(obsphase1, obstr1, line_width=3, line_alpha=0.6)
    early.multi_line(x_err1, y_err1)

    late = Figure(
        plot_width=400,
        plot_height=300,
        tools=TOOLS,  #responsive=True,
        x_axis_label='Orbital Phase',
        y_axis_label='Flux',
        title="Latest Start Time")
    if model:
        late.line(phase2, trmodel2, color='black', alpha=0.5, line_width=3)
    late.circle(obsphase2, obstr2, line_width=3, line_alpha=0.6)
    late.multi_line(x_err2, y_err2)

    start_time = row(early, late)

    if plot:
        outputfile(output_file)
        show(start_time)

    return obsphase1, obstr1, obsphase2, obstr2, rms
Exemplo n.º 12
0
def hst_spec(result_dict, plot=True, output_file='hstspec.html', model=True):
    """Plot 1d spec with error bars for hst

    Parameters
    ----------
    result_dict : dict
        Dictionary from pandexo output.

    plot : bool
        (Optional) True renders plot, False does not. Default=True
    model : bool
        (Optional) Plot model under data. Default=True
    output_file : str
        (Optional) Default = 'hstspec.html'

    Return
    ------
    x : numpy array
        micron
    y : numpy array
        1D spec fp/f* or rp^2/r*^2
    e : numpy array
        1D rms noise
    modelx : numpy array
        micron
    modely : numpy array
        1D spec fp/f* or rp^2/r*^2
    See Also
    --------
    hst_time
    """
    TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
    #plot planet spectrum
    mwave = result_dict['planet_spec']['model_wave']
    mspec = result_dict['planet_spec']['model_spec']

    binwave = result_dict['planet_spec']['binwave']
    binspec = result_dict['planet_spec']['binspec']

    error = result_dict['planet_spec']['error']
    error = np.zeros(len(binspec)) + error
    xlims = [
        result_dict['planet_spec']['wmin'], result_dict['planet_spec']['wmax']
    ]
    ylims = [
        np.min(binspec) - 2.0 * error[0],
        np.max(binspec) + 2.0 * error[0]
    ]

    plot_spectrum = Figure(
        plot_width=800,
        plot_height=300,
        x_range=xlims,
        y_range=ylims,
        tools=TOOLS,  #responsive=True,
        x_axis_label='Wavelength [microns]',
        y_axis_label='Ratio',
        title="Original Model with Observation")

    y_err = []
    x_err = []
    for px, py, yerr in zip(binwave, binspec, error):
        np.array(x_err.append((px, px)))
        np.array(y_err.append((py - yerr, py + yerr)))
    if model:
        plot_spectrum.line(mwave,
                           mspec,
                           color="black",
                           alpha=0.5,
                           line_width=4)
    plot_spectrum.circle(binwave, binspec, line_width=3, line_alpha=0.6)
    plot_spectrum.multi_line(x_err, y_err)

    if plot:
        outputfile(output_file)
        show(plot_spectrum)

    return binwave, binspec, error, mwave, mspec
Exemplo n.º 13
0
def hst_time(result_dict, plot=True, output_file ='hsttime.html', model = True):
    """Plot earliest and latest start times for hst observation
    
    Parameters
    ----------
    result_dict : dict 
        Dictionary from pandexo output.
    
    plot : bool 
        (Optional) True renders plot, False does not. Default=True
    model : bool 
        (Optional) Plot model under data. Default=True
    output_file : str
        (Optional) Default = 'hsttime.html'    
    
    Return
    ------
    obsphase1 : numpy array
        earliest start time
    obstr1 : numpy array
        white light curve
    obsphase2 : numpy array
        latest start time
    obstr2 : numpy array
        white light curve
    rms : numpy array
        1D rms noise

    See Also
    --------
    hst_spec
    """
    TOOLS = "pan,wheel_zoom,box_zoom,resize,reset,save"
    #earliest and latest start times 
    obsphase1 = result_dict['calc_start_window']['obsphase1']
    obstr1 = result_dict['calc_start_window']['obstr1']
    rms = result_dict['calc_start_window']['light_curve_rms']
    obsphase2 = result_dict['calc_start_window']['obsphase2']
    obstr2 = result_dict['calc_start_window']['obstr2']
    phase1 = result_dict['calc_start_window']['phase1']    
    phase2 = result_dict['calc_start_window']['phase2']
    trmodel1 = result_dict['calc_start_window']['trmodel1']
    trmodel2 = result_dict['calc_start_window']['trmodel2']    
    
    if isinstance(rms, float):
        rms = np.zeros(len(obsphase1))+rms
    y_err1 = []
    x_err1 = []
    for px, py, yerr in zip(obsphase1, obstr1, rms):
        np.array(x_err1.append((px, px)))
        np.array(y_err1.append((py - yerr, py + yerr)))

    y_err2 = []
    x_err2 = []
    for px, py, yerr in zip(obsphase2, obstr2, rms):
        np.array(x_err2.append((px, px)))
        np.array(y_err2.append((py - yerr, py + yerr)))

    early = Figure(plot_width=400, plot_height=300,
                               tools=TOOLS,#responsive=True,
                                 x_axis_label='Orbital Phase',
                                 y_axis_label='Flux', 
                               title="Earliest Start Time")
    
    if model: early.line(phase1, trmodel1, color='black',alpha=0.5, line_width = 4)
    early.circle(obsphase1, obstr1, line_width=3, line_alpha=0.6)
    early.multi_line(x_err1, y_err1)
     
    late = Figure(plot_width=400, plot_height=300, 
                                tools=TOOLS,#responsive=True,
                                 x_axis_label='Orbital Phase',
                                 y_axis_label='Flux', 
                               title="Latest Start Time")
    if model: late.line(phase2, trmodel2, color='black',alpha=0.5, line_width = 3)
    late.circle(obsphase2, obstr2, line_width=3, line_alpha=0.6)
    late.multi_line(x_err2, y_err2)

    start_time = row(early, late)    
    
    if plot: 
        outputfile(output_file)
        show(start_time)
    

    
    return obsphase1, obstr1, obsphase2, obstr2,rms
Exemplo n.º 14
0
def hst_spec(result_dict, plot=True, output_file ='hstspec.html', model = True):
    """Plot 1d spec with error bars for hst 
    
    Parameters
    ----------
    result_dict : dict 
        Dictionary from pandexo output.
    
    plot : bool 
        (Optional) True renders plot, False does not. Default=True
    model : bool 
        (Optional) Plot model under data. Default=True
    output_file : str
        (Optional) Default = 'hstspec.html'    
    
    Return
    ------
    x : numpy array
        micron
    y : numpy array
        1D spec fp/f* or rp^2/r*^2
    e : numpy array
        1D rms noise
    modelx : numpy array
        micron
    modely : numpy array
        1D spec fp/f* or rp^2/r*^2        
    See Also
    --------
    hst_time
    """
    TOOLS = "pan,wheel_zoom,box_zoom,resize,reset,save"
    #plot planet spectrum
    mwave = result_dict['planet_spec']['model_wave']
    mspec = result_dict['planet_spec']['model_spec']
    
    binwave = result_dict['planet_spec']['binwave']
    binspec = result_dict['planet_spec']['binspec']
    
    error = result_dict['planet_spec']['error']
    error = np.zeros(len(binspec))+ error
    xlims = [result_dict['planet_spec']['wmin'], result_dict['planet_spec']['wmax']]
    ylims = [np.min(binspec)-2.0*error[0], np.max(binspec)+2.0*error[0]]
    
    plot_spectrum = Figure(plot_width=800, plot_height=300, x_range=xlims,
                               y_range=ylims, tools=TOOLS,#responsive=True,
                                 x_axis_label='Wavelength [microns]',
                                 y_axis_label='Ratio', 
                               title="Original Model with Observation")
    
    y_err = []
    x_err = []
    for px, py, yerr in zip(binwave, binspec, error):
        np.array(x_err.append((px, px)))
        np.array(y_err.append((py - yerr, py + yerr)))
    if model:
        plot_spectrum.line(mwave,mspec, color= "black", alpha = 0.5, line_width = 4)
    plot_spectrum.circle(binwave,binspec, line_width=3, line_alpha=0.6)
    plot_spectrum.multi_line(x_err, y_err)
    
    if plot: 
        outputfile(output_file)
        show(plot_spectrum)

    return binwave, binspec, error, mwave, mspec
Exemplo n.º 15
0
def jwst_1d_spec(result_dict, model=True, title='Model + Data + Error Bars', output_file = 'data.html',legend = False, 
        R=False,  num_tran = False, plot_width=800, plot_height=400,x_range=[1,10]):
    """Plots 1d simulated spectrum and rebin or rescale for more transits
    
    Plots 1d data points with model in the background (if wanted). Designed to read in exact 
    output of run_pandexo. 
    
    Parameters 
    ----------
    result_dict : dict or list of dict
        Dictionary from pandexo output. If parameter space was run in run_pandexo 
        make sure to restructure the input as a list of dictionaries without they key words 
        that run_pandexo assigns. 
    model : bool 
        (Optional) True is default. True plots model, False does not plot model     
    title : str
        (Optional) Title of plot. Default is "Model + Data + Error Bars".  
    output_file : str 
        (Optional) name of html file for you bokeh plot. After bokeh plot is rendered you will 
        have the option to save as png. 
    legend : bool 
        (Optional) Default is False. True, plots legend. 
    R : float 
        (Optional) Rebin data from native instrument resolution to specified resolution. Dafult is False, 
        no binning. 
    num_tran : float
        (Optional) Scales data by number of transits to improve error by sqrt(`num_trans`)
    plot_width : int 
        (Optional) Sets the width of the plot. Default = 800
    plot_height : int 
        (Optional) Sets the height of the plot. Default = 400 
    x_range : list of int
        (Optional) Sets x range of plot. Default = [1,10]

    Returns
    -------
    x,y,e : list of arrays 
        Returns wave axis, spectrum and associated error in list format. x[0] will be correspond 
        to the first dictionary input, x[1] to the second, etc. 
        
    Examples
    --------
    
    >>> jwst_1d_spec(result_dict, num_tran = 3, R = 35) #for a single plot 
    
    If you wanted to save each of the axis that were being plotted: 
    
    >>> x,y,e = jwst_1d_data([result_dict1, result_dict2], model=False, num_tran = 5, R = 100) #for multiple 
    
    See Also
    --------
    jwst_noise, jwst_1d_bkg, jwst_1d_flux, jwst_1d_snr, jwst_2d_det, jwst_2d_sat

    """
    outx=[]
    outy=[]
    oute=[]
    TOOLS = "pan,wheel_zoom,box_zoom,resize,reset,save"
    outputfile(output_file)
    colors = ['black','blue','red','orange','yellow','purple','pink','cyan','grey','brown']
    #make sure its iterable
    if type(result_dict) != list: 
        result_dict = [result_dict]
        
    if type(legend)!=bool:
        legend_keys = legend
        legend = True
        if type(legend_keys) != list:
            legend_keys = [legend_keys]
      
    i = 0     
    for dict in result_dict: 
        ntran_old = dict['timing']['Number of Transits']
        to = dict['timing']["Num Integrations Out of Transit"]
        ti = dict['timing']["Num Integrations In Transit"]
        #remove any nans 
        y = dict['FinalSpectrum']['spectrum_w_rand']
        x = dict['FinalSpectrum']['wave'][~np.isnan(y)]
        err = dict['FinalSpectrum']['error_w_floor'][~np.isnan(y)]
        y = y[~np.isnan(y)]

        
        if (R == False) & (num_tran == False): 
            x=x 
            y=y 
        elif (R != False) & (num_tran != False):     
            new_wave = bin_wave_to_R(x, R)
            out = uniform_tophat_sum(new_wave,x, dict['RawData']['electrons_out']*num_tran/ntran_old)
            inn = uniform_tophat_sum(new_wave,x, dict['RawData']['electrons_in']*num_tran/ntran_old)
            vout = uniform_tophat_sum(new_wave,x, dict['RawData']['var_out']*num_tran/ntran_old)
            vin = uniform_tophat_sum(new_wave,x, dict['RawData']['var_in']*num_tran/ntran_old)
            var_tot = (to/ti/out)**2.0 * vin + (inn*to/ti/out**2.0)**2.0 * vout
            if dict['input']['Primary/Secondary']=='fp/f*':
                fac = -1.0
            else:
                fac = 1.0
            rand_noise = np.sqrt((var_tot))*(np.random.randn(len(new_wave)))
            raw_spec = (out/to-inn/ti)/(out/to)       
            sim_spec = fac*(raw_spec + rand_noise )
            x = new_wave
            y = sim_spec
            err = np.sqrt(var_tot)
        elif (R == False) & (num_tran != False):     
            out = dict['RawData']['electrons_out']*num_tran/ntran_old
            inn = dict['RawData']['electrons_in']*num_tran/ntran_old
            vout = dict['RawData']['var_out']*num_tran/ntran_old
            vin = dict['RawData']['var_in']*num_tran/ntran_old
            var_tot = (to/ti/out)**2.0 * vin + (inn*to/ti/out**2.0)**2.0 * vout
            if dict['input']['Primary/Secondary']=='fp/f*':
                fac = -1.0
            else:
                fac = 1.0
            rand_noise = np.sqrt((var_tot))*(np.random.randn(len(x)))
            raw_spec = (out/to-inn/ti)/(out/to)       
            sim_spec = fac*(raw_spec + rand_noise ) 
            x = x
            y = sim_spec
            err = np.sqrt(var_tot)
        elif (R != False) & (num_tran == False):     
            new_wave = bin_wave_to_R(x, R)
            out = uniform_tophat_sum(new_wave,x, dict['RawData']['electrons_out'])
            inn = uniform_tophat_sum(new_wave,x, dict['RawData']['electrons_in'])
            vout = uniform_tophat_sum(new_wave,x, dict['RawData']['var_out'])
            vin = uniform_tophat_sum(new_wave,x, dict['RawData']['var_in'])
            var_tot = (to/ti/out)**2.0 * vin + (inn*to/ti/out**2.0)**2.0 * vout
            if dict['input']['Primary/Secondary']=='fp/f*':
                fac = -1.0
            else:
                fac = 1.0
            rand_noise = np.sqrt((var_tot))*(np.random.randn(len(new_wave)))
            raw_spec = (out/to-inn/ti)/(out/to)       
            sim_spec = fac*(raw_spec + rand_noise ) 
            x = new_wave
            y = sim_spec
            err = np.sqrt(var_tot)
        else: 
            print("Something went wrong. Cannot enter both resolution and ask to bin to new wave")
            return
            
        #create error bars for Bokeh's multi_line
        y_err = []
        x_err = []
        for px, py, yerr in zip(x, y, err):
            np.array(x_err.append((px, px)))
            np.array(y_err.append((py - yerr, py + yerr)))
        #initialize Figure
        if i == 0: 
            #Define units for x and y axis
            y_axis_label = dict['input']['Primary/Secondary']

            if y_axis_label == 'fp/f*': p = -1.0
            else: y_axis_label = '('+y_axis_label+')^2'

            if dict['input']['Calculation Type'] =='phase_spec':
                x_axis_label='Time (secs)'
                x_range = [min(x), max(x)]
            else:
                x_axis_label='Wavelength [microns]'
            
            ylims = [min(dict['OriginalInput']['model_spec'])- 0.1*min(dict['OriginalInput']['model_spec']),
                 0.1*max(dict['OriginalInput']['model_spec'])+max(dict['OriginalInput']['model_spec'])]
            xlims = [min(x), max(x)]
         
            fig1d = Figure(x_range=x_range, y_range = ylims, 
               plot_width = plot_width, plot_height =plot_height,title=title,x_axis_label=x_axis_label,
              y_axis_label = y_axis_label, tools=TOOLS, background_fill_color = 'white')
        
              
        #plot model, data, and errors 
        if model:
            mxx = dict['OriginalInput']['model_wave']
            myy = dict['OriginalInput']['model_spec']
            
            my = uniform_tophat_mean(x, mxx,myy)
            fig1d.line(x,my, color='black',alpha=0.2, line_width = 4)
        if legend: 
            fig1d.circle(x, y, color=colors[i], legend = legend_keys[i])
        else: 
            fig1d.circle(x, y, color=colors[i])
        outx += [x]
        outy += [y]
        oute += [err]
        fig1d.multi_line(x_err, y_err,color=colors[i])
        i += 1 
    show(fig1d)
    return outx,outy,oute