예제 #1
0
    def load_qa(self):
        cam = self.selected_arm+str(self.selected_spectrograph)

        mergedqa = QLFModels().get_output(self.selected_process_id, cam)
        check_ccds = mergedqa['TASKS']['CHECK_CCDs']
        getbias = check_ccds['METRICS']

        nrg = check_ccds['PARAMS']['BIAS_AMP_NORMAL_RANGE']
        wrg = check_ccds['PARAMS']['BIAS_AMP_WARN_RANGE']
        if mergedqa['FLAVOR'].upper() == 'SCIENCE':
            program = mergedqa['GENERAL_INFO']['PROGRAM'].upper()
            program_prefix = '_'+program
        else:
            program_prefix = ''
        refexp = mergedqa['TASKS']['CHECK_CCDs']['PARAMS']['BIAS_AMP' +
                                                           program_prefix+'_REF']

        # PATCH
        p = Patch().plot_amp(
            dz=getbias["BIAS_AMP"],
            refexp=refexp,
            name="BIAS_AMP",
            description="Average bias value (photon counts)",
            wrg=wrg
        )

        p_status = Patch().plot_amp(
            dz=getbias["BIAS_AMP"],
            refexp=refexp,
            name="BIAS_AMP (STATUS)",
            description="Average bias value (photon counts)",
            wrg=wrg,
            nrg=nrg,
            status_plot=True,
        )

        # INFO TABLES:
        info_col = Title().write_description('getbias')

        # Prepare tables
        current_exposures = check_ccds['METRICS']['BIAS_AMP']
        gen_info = mergedqa['GENERAL_INFO']
        flavor = mergedqa["FLAVOR"]
        if flavor == 'science':
            program = gen_info['PROGRAM'].upper()
            reference_exposures = check_ccds['PARAMS']['BIAS_AMP_' +
                                                       program + '_REF']
        else:
            reference_exposures = check_ccds['PARAMS']['BIAS_AMP_REF']
        keynames = ["BIAS_AMP" for i in range(len(current_exposures))]
        table = Table().single_table(keynames, current_exposures, reference_exposures, nrg, wrg)

        layout = column(info_col, Div(),
                        table, Div(),
                        column(p, sizing_mode='scale_both'), #css_classes=["main-one"]),
                        column(p_status, sizing_mode='scale_both'),
                        css_classes=["display-grid"])


        return file_html(layout, CDN, "GETBIAS")
예제 #2
0
파일: main.py 프로젝트: jorgemachucav/qlf
    def load_qa(self):
        cam = self.selected_arm + str(self.selected_spectrograph)

        mergedqa = QLFModels().get_output(self.selected_process_id, cam)
        check_ccds = mergedqa['TASKS']['CHECK_CCDs']
        getrms = check_ccds['METRICS']

        nrg = check_ccds['PARAMS']['NOISE_AMP_NORMAL_RANGE']
        wrg = check_ccds['PARAMS']['NOISE_AMP_WARN_RANGE']
        if mergedqa['FLAVOR'].upper() == 'SCIENCE':
            program = mergedqa['GENERAL_INFO']['PROGRAM'].upper()
            program_prefix = '_' + program
        else:
            program_prefix = ''
        refexp = mergedqa['TASKS']['CHECK_CCDs']['PARAMS']['NOISE_AMP' +
                                                           program_prefix +
                                                           '_REF']

        # amp 1
        p = Patch().plot_amp(dz=getrms["NOISE_AMP"],
                             refexp=refexp,
                             name="NOISE_AMP",
                             description="NOISE per Amp (photon counts)",
                             wrg=wrg)

        # amp 2
        p2 = Patch().plot_amp(
            dz=getrms["NOISE_OVERSCAN_AMP"],
            refexp=refexp,
            name="NOISE_OVERSCAN_AMP",
            description="NOISE Overscan per Amp (photon counts)",
            wrg=wrg)

        info_col = Title().write_description('getrms')

        # Prepare tables
        current_exposures = check_ccds['METRICS']['NOISE_AMP']
        gen_info = mergedqa['GENERAL_INFO']
        flavor = mergedqa["FLAVOR"]
        if flavor == 'science':
            program = gen_info['PROGRAM'].upper()
            reference_exposures = check_ccds['PARAMS']['LITFRAC_AMP_' +
                                                       program + '_REF']
        else:
            reference_exposures = check_ccds['PARAMS']['LITFRAC_AMP_REF']
        keynames = ["NOISE_AMP" for i in range(len(current_exposures))]
        metric = Table().reference_table(keynames, current_exposures,
                                         reference_exposures)

        alert = Table().alert_table(nrg, wrg)

        layout = column(info_col,
                        Div(),
                        metric,
                        alert,
                        column(p, sizing_mode='scale_both'),
                        column(p2, sizing_mode='scale_both'),
                        css_classes=["display-grid"])

        return file_html(layout, CDN, "GETRMS")
예제 #3
0
    def load_qa(self):

        cam = self.selected_arm + str(self.selected_spectrograph)

        mergedqa = QLFModels().get_output(self.selected_process_id, cam)

        gen_info = mergedqa['GENERAL_INFO']
        flavor = mergedqa['FLAVOR']

        if flavor == "science":
            ra = gen_info['RA']
            dec = gen_info['DEC']

        check_ccds = mergedqa['TASKS']['CHECK_CCDs']

        xwsigma = check_ccds['METRICS']['XWSIGMA']
        xw_amp = check_ccds['METRICS']['XWSIGMA_AMP']

        xw_fib = check_ccds['METRICS']['XWSIGMA_FIB']

        nrg = check_ccds['PARAMS']['XWSIGMA_NORMAL_RANGE']
        wrg = check_ccds['PARAMS']['XWSIGMA_WARN_RANGE']
        obj_type = sort_obj(gen_info)  # [""]*500

        if mergedqa['FLAVOR'].upper() == 'SCIENCE':
            program = mergedqa['GENERAL_INFO']['PROGRAM'].upper()
            program_prefix = '_' + program
        else:
            program_prefix = ''
        xw_ref = check_ccds['PARAMS']['XWSIGMA' + program_prefix + '_REF']

        xsigma = xw_fib[0]
        wsigma = xw_fib[1]

        delta_rg = wrg[1] - wrg[0]
        hist_rg = (wrg[0] - 0.1 * delta_rg, wrg[1] + 0.1 * delta_rg)

        my_palette = get_palette("RdYlBu_r")

        xfiber = np.arange(len(xsigma))
        wfiber = np.arange(len(wsigma))
        if mergedqa['FLAVOR'].upper() != 'SCIENCE':
            ra = np.full(500, np.nan)
            dec = np.full(500, np.nan)

        source = ColumnDataSource(
            data={
                'x1': ra,
                'y1': dec,
                'xsigma': xsigma,
                'wsigma': wsigma,
                'delta_xsigma': np.array(xsigma) - xw_ref[0],
                'delta_wsigma': np.array(wsigma) - xw_ref[1],
                'xref': [xw_ref[0]] * len(xsigma),
                'wref': [xw_ref[1]] * len(xsigma),
                'xfiber': xfiber,
                'wfiber': wfiber,
                'OBJ_TYPE': obj_type,
                'left': np.arange(0, 500) - 0.4,
                'right': np.arange(0, 500) + 0.4,
                'bottom': [0] * 500
            })

        xsigma_tooltip = """
            <div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">XSigma: </span>
                    <span style="font-size: 1vw; color: #515151">@xsigma</span>
                </div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">Reference: </span>
                    <span style="font-size: 1vw; color: #515151">@xref</span>
                </div>

                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">Obj Type: </span>
                    <span style="font-size: 1vw; color: #515151;">@OBJ_TYPE</span>
                </div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">RA: </span>
                    <span style="font-size: 1vw; color: #515151;">@x1</span>
                </div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">DEC: </span>
                    <span style="font-size: 1vw; color: #515151;">@y1</span>
                </div>

                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">FIBER ID: </span>
                    <span style="font-size: 1vw; color: #515151;">@xfiber</span>
                </div>

                </div>
            """

        wsigma_tooltip = """
            <div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">WSigma: </span>
                    <span style="font-size: 1vw; color: #515151">@wsigma</span>
                </div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">Reference: </span>
                    <span style="font-size: 1vw; color: #515151">@wref</span>
                </div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">Obj Type: </span>
                    <span style="font-size: 1vw; color: #515151;">@OBJ_TYPE</span>
                </div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">RA: </span>
                    <span style="font-size: 1vw; color: #515151;">@x1</span>
                </div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">DEC: </span>
                    <span style="font-size: 1vw; color: #515151;">@y1</span>
                </div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">FIBER ID: </span>
                    <span style="font-size: 1vw; color: #515151;">@wfiber</span>
                </div>

            </div>
            """

        url = "http://legacysurvey.org/viewer?ra=@ra&dec=@dec&zoom=16&layer=decals-dr5"

        # determining the position of selected cam fibers:
        obj_type = sort_obj(gen_info)
        # ---------------------------------

        if flavor == "science":

            # axes limit
            xmin, xmax = [min(ra[:]), max(ra[:])]
            ymin, ymax = [min(dec[:]), max(dec[:])]
            xfac, yfac = [(xmax - xmin) * 0.06, (ymax - ymin) * 0.06]
            left, right = xmin - xfac, xmax + xfac
            bottom, top = ymin - yfac, ymax + yfac

            low, high = wrg
            xmapper = LinearColorMapper(palette=my_palette,
                                        low=low,
                                        high=high,
                                        nan_color="darkgrey")

            wmapper = LinearColorMapper(palette=my_palette,
                                        low=low,
                                        high=high,
                                        nan_color="darkgrey")

            # ============
            # XSIGMA WEDGE

            radius = 0.0165
            radius_hover = 0.02

            # centralize wedges in plots:
            ra_center = 0.5 * (max(ra) + min(ra))
            dec_center = 0.5 * (max(dec) + min(dec))
            xrange_wedge = Range1d(start=ra_center + .95, end=ra_center - .95)
            yrange_wedge = Range1d(start=dec_center + .82,
                                   end=dec_center - .82)

            wedge_plot_x = Plot2d(x_range=xrange_wedge,
                                  y_range=yrange_wedge,
                                  x_label="RA",
                                  y_label="DEC",
                                  tooltip=xsigma_tooltip,
                                  title="XSIGMA",
                                  width=500,
                                  height=380,
                                  yscale="auto").wedge(
                                      source,
                                      x='x1',
                                      y='y1',
                                      field='delta_xsigma',
                                      mapper=xmapper,
                                      colorbar_title='xsigma').plot

            taptool = wedge_plot_x.select(type=TapTool)
            taptool.callback = OpenURL(url=url)

            # ============
            # WSIGMA WEDGE
            wedge_plot_w = Plot2d(x_range=xrange_wedge,
                                  y_range=yrange_wedge,
                                  x_label="RA",
                                  y_label="DEC",
                                  tooltip=wsigma_tooltip,
                                  title="WSIGMA",
                                  width=500,
                                  height=380,
                                  yscale="auto").wedge(
                                      source,
                                      x='x1',
                                      y='y1',
                                      field='delta_wsigma',
                                      mapper=wmapper,
                                      colorbar_title='wsigma').plot

            taptool = wedge_plot_w.select(type=TapTool)
            taptool.callback = OpenURL(url=url)

        # ================================
        # Stat histogram

        # x_fiber_hist
        d_yplt = (max(xsigma) - min(xsigma)) * 0.1
        yrange = [0, max(xsigma) + d_yplt]

        xhist = Plot2d(
            yrange,
            x_label="Fiber number",
            y_label="X std dev (number of pixels)",
            tooltip=xsigma_tooltip,
            title="",
            width=600,
            height=300,
            yscale="auto",
            hover_mode="vline",
        ).quad(
            source,
            top='xsigma',
        )

        # w_fiber_hist
        d_yplt = (max(wsigma) - min(wsigma)) * 0.1
        yrange = [0, max(wsigma) + d_yplt]

        whist = Plot2d(
            yrange,
            x_label="Fiber number",
            y_label="W std dev (number of pixels)",
            tooltip=xsigma_tooltip,
            title="",
            width=600,
            height=300,
            yscale="auto",
            hover_mode="vline",
        ).quad(
            source,
            top='wsigma',
        )

        # ================================
        # Stat histogram

        def histpar(yscale, hist):
            if yscale == 'log':
                ylabel = "Frequency + 1"
                yrange = (1, 11**(int(np.log10(max(hist))) + 1))
                bottomval = 'bottomplusone'
                histval = 'histplusone'
            else:
                ylabel = "Frequency"
                yrange = (0.0 * max(hist), 1.1 * max(hist))
                bottomval = 'bottom'
                histval = 'hist'
            return [ylabel, yrange, bottomval, histval]

        xhistlabel = "XSIGMA"
        yscale = "auto"

        hist_tooltip_x = """
            <div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">Frequency: </span>
                    <span style="font-size: 1vw; color: #515151">@hist</span>
                </div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">XSIGMA: </span>
                    <span style="font-size: 1vw; color: #515151;">[@left, @right]</span>
                </div>
            </div>
        """

        hist, edges = np.histogram(xsigma, 'sqrt')

        source_hist = ColumnDataSource(
            data={
                'hist': hist,
                'histplusone': hist + 1,
                'bottom': [0] * len(hist),
                'bottomplusone': [1] * len(hist),
                'left': edges[:-1],
                'right': edges[1:]
            })

        ylabel, yrange, bottomval, histval = histpar(yscale, hist)

        p_hist_x = Plot2d(
            x_label=xhistlabel,
            y_label=ylabel,
            tooltip=hist_tooltip_x,
            title="",
            width=600,
            height=300,
            yscale="auto",
            y_range=yrange,
            x_range=(hist_rg[0] + xw_ref[0], hist_rg[1] + xw_ref[0]),
            hover_mode="vline",
        ).quad(
            source_hist,
            top=histval,
            bottom=bottomval,
            line_width=0.4,
        )

        # Histogram 2
        xhistlabel = "WSIGMA"
        hist_tooltip_w = """
            <div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">Frequency: </span>
                    <span style="font-size: 1vw; color: #515151">@hist</span>
                </div>
                <div>
                    <span style="font-size: 1vw; font-weight: bold; color: #303030;">WSIGMA: </span>
                    <span style="font-size: 1vw; color: #515151;">[@left, @right]</span>
                </div>
            </div>
        """

        hist, edges = np.histogram(wsigma, 'sqrt')

        source_hist = ColumnDataSource(
            data={
                'hist': hist,
                'histplusone': hist + 1,
                'bottom': [0] * len(hist),
                'bottomplusone': [1] * len(hist),
                'left': edges[:-1],
                'right': edges[1:]
            })

        ylabel, yrange, bottomval, histval = histpar(yscale, hist)
        yrangew = yrange

        p_hist_w = Plot2d(
            x_label=xhistlabel,
            y_label=ylabel,
            tooltip=hist_tooltip_w,
            title="",
            width=600,
            height=300,
            yscale="auto",
            y_range=yrange,
            x_range=(hist_rg[0] + xw_ref[1], hist_rg[1] + xw_ref[1]),
            hover_mode="vline",
        ).quad(
            source_hist,
            top=histval,
            bottom=bottomval,
            line_width=0.8,
        )

        # --------------------------------------------------------------
        # vlines ranges:
        bname = 'XWSIGMA'

        for ialert in nrg:  # par[bname+'_NORMAL_RANGE']:
            spans = Span(location=ialert + xw_ref[0],
                         dimension='height',
                         line_color='green',
                         line_dash='dashed',
                         line_width=2)
            p_hist_x.add_layout(spans)
            my_label = Label(x=ialert + xw_ref[0],
                             y=yrange[-1] / 2.2,
                             y_units='data',
                             text='Normal Range',
                             text_color='green',
                             angle=np.pi / 2.)
            p_hist_x.add_layout(my_label)

        for ialert in wrg:  # par[bname+'_WARN_RANGE']:
            spans = Span(location=ialert + xw_ref[0],
                         dimension='height',
                         line_color='tomato',
                         line_dash='dotdash',
                         line_width=2)
            p_hist_x.add_layout(spans)
            my_label = Label(x=ialert + xw_ref[0],
                             y=yrange[-1] / 2.2,
                             y_units='data',
                             text='Warning Range',
                             text_color='tomato',
                             angle=np.pi / 2.)
            p_hist_x.add_layout(my_label)

        for ialert in nrg:  # par[bname+'_NORMAL_RANGE']:
            spans = Span(location=ialert + xw_ref[1],
                         dimension='height',
                         line_color='green',
                         line_dash='dashed',
                         line_width=2)
            p_hist_w.add_layout(spans)
            my_label = Label(x=ialert + xw_ref[1],
                             y=yrangew[-1] / 2.2,
                             y_units='data',
                             text='Normal Range',
                             text_color='green',
                             angle=np.pi / 2.)
            p_hist_w.add_layout(my_label)

        for ialert in wrg:  # par[bname+'_WARN_RANGE']:
            spans = Span(location=ialert + xw_ref[1],
                         dimension='height',
                         line_color='tomato',
                         line_dash='dotdash',
                         line_width=2)
            p_hist_w.add_layout(spans)
            my_label = Label(x=ialert + xw_ref[1],
                             y=yrangew[-1] / 2.2,
                             y_units='data',
                             text='Warning Range',
                             text_color='tomato',
                             angle=np.pi / 2.)
            p_hist_w.add_layout(my_label)

        # amp 1
        xamp = Patch().plot_amp(
            dz=xw_amp[0],
            refexp=[xw_ref[0]] * 4,
            name="XSIGMA AMP",
            description="X standard deviation per Amp (number of pixels)",
            wrg=wrg)

        # amp 2
        wamp = Patch().plot_amp(
            dz=xw_amp[1],
            refexp=[xw_ref[1]] * 4,
            name="WSIGMA AMP",
            description="W standard deviation per Amp (number of pixels)",
            wrg=wrg)

        # -------------------------------------------------------------------------
        info_col = Title().write_description('xwsigma')

        current_exposures = check_ccds['METRICS']['XWSIGMA']

        alert_x = Table().alert_table(nrg, wrg)
        alert_w = Table().alert_table(nrg, wrg)

        if flavor == 'science':
            program = gen_info['PROGRAM'].upper()
            reference_exposures = check_ccds['PARAMS']['XWSIGMA_' + program +
                                                       '_REF']
            keynames = ["XSIGMA"]
            x_metric = Table().reference_table(keynames,
                                               [current_exposures[0]],
                                               [reference_exposures[0]])
            keynames = ["WSIGMA"]
            w_metric = Table().reference_table(keynames,
                                               [current_exposures[1]],
                                               [reference_exposures[1]])
            layout = column(
                info_col,
                widgetbox(Div(), css_classes=["tableranges"]),
                widgetbox(
                    Div(text=
                        '<h2 align=center style="text-align:center;">  XSIGMA </h2>'
                        )),
                widgetbox(
                    Div(text=
                        '<h2 align=center style="text-align:center;">  WSIGMA </h2>'
                        )),
                x_metric,
                w_metric,
                alert_x,
                alert_w,
                column(wedge_plot_x, sizing_mode='scale_both'),
                column(wedge_plot_w, sizing_mode='scale_both'),
                column(xhist, sizing_mode='scale_both'),
                column(whist, sizing_mode='scale_both'),
                column(p_hist_x, sizing_mode='scale_both'),
                column(p_hist_w, sizing_mode='scale_both'),
                column(xamp, sizing_mode='scale_both'),
                column(wamp, sizing_mode='scale_both'),
                css_classes=["display-grid"],
                sizing_mode='scale_width')
        else:
            reference_exposures = check_ccds['PARAMS']['XWSIGMA_REF']
            keynames = ["XSIGMA"]
            x_metric = Table().reference_table(keynames,
                                               [current_exposures[0]],
                                               [reference_exposures[0]])
            keynames = ["WSIGMA"]
            w_metric = Table().reference_table(keynames,
                                               [current_exposures[1]],
                                               [reference_exposures[1]])
            layout = column(
                info_col,
                widgetbox(Div(), css_classes=["tableranges"]),
                widgetbox(
                    Div(text=
                        '<h2 align=center style="text-align:center;">  XSIGMA </h2>'
                        )),
                widgetbox(
                    Div(text=
                        '<h2 align=center style="text-align:center;">  WSIGMA </h2>'
                        )),
                x_metric,
                w_metric,
                alert_x,
                alert_w,
                column(xhist, sizing_mode='scale_both'),
                column(whist, sizing_mode='scale_both'),
                column(p_hist_x, sizing_mode='scale_both'),
                column(p_hist_w, sizing_mode='scale_both'),
                column(xamp, sizing_mode='scale_both'),
                column(wamp, sizing_mode='scale_both'),
                css_classes=["display-grid"],
                sizing_mode='scale_width')

        return file_html(layout, CDN, "XWSIGMA")