def create_viewer(root_dir, parameters):
    """
    Given a set of parameters for a certain set of diagnostics,
    create a single page.

    Return the title and url for this page.
    """
    viewer = OutputViewer(path=root_dir)

    # The name that's displayed on the viewer.
    display_name = 'Area Mean Time Series'
    set_name = 'area_mean_time_series'
    cols = ['Description', 'Plot']
    viewer.add_page(display_name, short_name=set_name, columns=cols)
    viewer.add_group('Variable')

    for param in parameters:
        for var in param.variables:
            viewer.add_row(var)
            # Adding the description for this var to the current row.
            # This was obtained and stored in the driver for this plotset.
            viewer.add_col(param.viewer_descr[var])

            ext = param.output_format[0]
            file_name = os.path.join('..', set_name, param.case_id, '{}.{}'.format(var, ext))
            viewer.add_col(file_name, is_file=True, title='Plot',
                meta=create_metadata(param))

    url = viewer.generate_page()
    add_header(root_dir, os.path.join(root_dir, url), parameters)
    h1_to_h3(os.path.join(root_dir, url))

    return display_name, url
def create_viewer(root_dir, parameters):
    """
    Given a set of parameters for a the diff_diags set, create a single webpage.

    Return the title and url for this page.
    """
    viewer = OutputViewer(path=root_dir)
    display_name = "Annual Cycle Zonal Mean Contour Plots"
    set_name = "annual_cycle_zonal_mean"
    cols = ["Description", "Plot"]

    viewer.add_page(display_name, short_name=set_name, columns=cols)
    viewer.add_group("Variable")

    for param in parameters:
        for var in param.variables:
            viewer.add_row("{} {}".format(var, param.ref_name))
            # Adding the description for this var to the current row.
            # This was obtained and stored in the driver for this plotset.
            viewer.add_col(param.viewer_descr[var])

            file_name = "{}-{}-{}.png".format(param.ref_name, var,
                                              "Annual-Cycle")
            # We need to make sure we have relative paths, and not absolute ones.
            # This is why we don't use get_output_dir() as in the plotting script
            # to get the file name.
            file_name = os.path.join("..", set_name, param.case_id, file_name)
            viewer.add_col(file_name,
                           is_file=True,
                           title="Plot",
                           meta=create_metadata(param))

    url = viewer.generate_page()
    add_header(root_dir, os.path.join(root_dir, url), parameters)
    h1_to_h3(os.path.join(root_dir, url))

    return display_name, url
def create_viewer(root_dir, parameters):
    """
    Given a set of parameters for the enso_diags set,
    create a single webpage.

    Return the title and url for this page.
    """
    viewer = OutputViewer(path=root_dir)

    # The name that's displayed on the viewer.
    display_name = "ENSO Diagnostics"
    set_name = "enso_diags"
    # The title of the colums on the webpage.
    # Appears in the second and third columns of the bolded rows.
    cols = ["Description", "Plot"]
    viewer.add_page(display_name, short_name=set_name, columns=cols)
    param_dict = {}  # type: Dict[str, List[str]]
    for param in parameters:
        key = param.plot_type
        if key not in param_dict.keys():
            param_dict[key] = []
        param_dict[key].append(param)
    for plot_type in param_dict.keys():
        # Appears in the first column of the bolded rows.
        viewer.add_group(plot_type.capitalize())
        # Only iterate through parameters with this plot type.
        valid_parameters = param_dict[plot_type]
        for param in valid_parameters:
            # We need to make sure we have relative paths, and not absolute ones.
            # This is why we don't use get_output_dir() as in the plotting script
            # to get the file name.
            ext = param.output_format[0]
            # param.output_file is defined in e3sm_diags/driver/enso_diags_driver.py
            # This must be use param.case_id and param.output_file
            # to match the file_path determined in
            # e3sm_diags/plot/cartopy/enso_diags_plot.py.
            # Otherwise, the plot will not be properly linked from the viewer.
            relative_path = os.path.join("..", set_name, param.case_id,
                                         param.output_file)
            image_relative_path = "{}.{}".format(relative_path, ext)
            if param.print_statements:
                print("image_relative_path: {}".format(image_relative_path))
            formatted_files = []
            if param.save_netcdf:
                nc_files = [
                    relative_path + nc_ext
                    for nc_ext in ["_test.nc", "_ref.nc", "_diff.nc"]
                ]
                formatted_files = [{"url": f, "title": f} for f in nc_files]
            # TODO: will param.variables ever be longer than one variable?
            #  If so, we'll need to create unique image_relative_paths
            for var in param.variables:
                # Appears in the first column of the non-bolded rows.
                # This should use param.case_id to match the output_dir determined by
                # get_output_dir in e3sm_diags/plot/cartopy/enso_diags_plot.py.
                # Otherwise, the plot image and the plot HTML file will have URLs
                # differing in the final directory name.
                viewer.add_row(param.case_id)
                # Adding the description for this var to the current row.
                # This was obtained and stored in the driver for this plotset.
                # Appears in the second column of the non-bolded rows.
                viewer.add_col(param.viewer_descr[var])
                # Link to an html version of the plot png file.
                # Appears in the third column of the non-bolded rows.
                viewer.add_col(
                    image_relative_path,
                    is_file=True,
                    title="Plot",
                    other_files=formatted_files,
                    meta=create_metadata(param),
                )

    url = viewer.generate_page()
    add_header(root_dir, os.path.join(root_dir, url), parameters)
    h1_to_h3(os.path.join(root_dir, url))

    return display_name, url
def create_viewer(root_dir, parameters):
    """
    Given a set of parameters for the streamflow set,
    create a single webpage.

    Return the title and url for this page.
    """
    viewer = OutputViewer(path=root_dir)

    # The name that's displayed on the viewer.
    display_name = "Streamflow"
    set_name = "streamflow"
    # The title of the columns on the webpage.
    # Appears in the second and third columns of the bolded rows.
    cols = ["Description", "Plot"]
    viewer.add_page(display_name, short_name=set_name, columns=cols)
    for plot_type in ["seasonality_map", "annual_map", "annual_scatter"]:
        if plot_type == "seasonality_map":
            group_name = "Seasonality Map"
        elif plot_type == "annual_map":
            group_name = "Mean Annual Streamflow Map"
        elif plot_type == "annual_scatter":
            group_name = "Mean Annual Streamflow Scatter Plot"
        else:
            raise Exception("Invalid plot_type={}".format(plot_type))
        # Appears in the first column of the bolded rows.
        viewer.add_group(group_name)
        for param in parameters:
            # We need to make sure we have relative paths, and not absolute ones.
            # This is why we don't use get_output_dir() as in the plotting script
            # to get the file name.
            ext = param.output_format[0]
            # TODO: will param.variables ever be longer than one variable?
            #  If so, we'll need to create unique image_relative_paths
            for var in param.variables:
                param.var_id = "{}-{}".format(var, plot_type)
                if plot_type == "seasonality_map":
                    param.viewer_descr[var] = param.main_title_seasonality_map
                    output_file = param.output_file_seasonality_map
                elif plot_type == "annual_map":
                    param.viewer_descr[var] = param.main_title_annual_map
                    output_file = param.output_file_annual_map
                elif plot_type == "annual_scatter":
                    param.viewer_descr[var] = param.main_title_annual_scatter
                    output_file = param.output_file_annual_scatter
                else:
                    raise Exception("Invalid plot_type={}".format(plot_type))
                # param.output_file_{seasonality, annual_map, annual_scatter} is defined in
                # acme_diags/parameter/streamflow_parameter.py.
                # relative_path must use param.case_id and output_file
                # to match the file_path determined in
                # acme_diags/plot/cartopy/streamflow_plot.py.
                # Otherwise, the plot will not be properly linked from the viewer.
                relative_path = os.path.join("..", set_name, param.case_id,
                                             output_file)
                image_relative_path = "{}.{}".format(relative_path, ext)
                if param.print_statements:
                    print(
                        "image_relative_path: {}".format(image_relative_path))
                # Appears in the first column of the non-bolded rows.
                # To match the output_dir determined by get_output_dir in acme_diags/plot/cartopy/streamflow_plot.py,
                # the row name should be param.case_id.
                # Otherwise, the plot image and the plot HTML file will have URLs with different final directory names.
                # (The viewer will still display everything properly though).
                viewer.add_row("{}-{}".format(param.case_id, plot_type))
                # Adding the description for this var to the current row.
                # Appears in the second column of the non-bolded rows.
                viewer.add_col(param.viewer_descr[var])
                # Link to an html version of the plot png file.
                # Appears in the third column of the non-bolded rows.
                meta = create_metadata(param)
                viewer.add_col(
                    image_relative_path,
                    is_file=True,
                    title="Plot",
                    other_files=[],
                    meta=meta,
                )

    url = viewer.generate_page()
    add_header(root_dir, os.path.join(root_dir, url), parameters)
    h1_to_h3(os.path.join(root_dir, url))

    return display_name, url
Exemple #5
0
def create_viewer(root_dir, parameters):
    """
    Given a set of parameters for the qbo set,
    create a single webpage.

    Return the title and url for this page.
    """
    viewer = OutputViewer(path=root_dir)

    # The name that's displayed on the viewer.
    display_name = 'Quasi-biennial Oscillation'
    set_name = 'qbo'
    # The title of the colums on the webpage.
    # Appears in the second and third columns of the bolded rows.
    cols = ['Description', 'Plot']
    viewer.add_page(display_name, short_name=set_name, columns=cols)
    # Appears in the first column of the bolded rows.
    viewer.add_group('Variable')
    for param in parameters:
        # We need to make sure we have relative paths, and not absolute ones.
        # This is why we don't use get_output_dir() as in the plotting script
        # to get the file name.
        ext = param.output_format[0]
        # param.output_file is defined in acme_diags/driver/qbo_driver.py
        # This must be use param.case_id and param.output_file
        # to match the file_path determined in
        # acme_diags/plot/cartopy/qbo_plot.py.
        # Otherwise, the plot will not be properly linked from the viewer.
        relative_path = os.path.join('..', set_name, param.case_id,
                                     param.output_file)
        image_relative_path = '{}.{}'.format(relative_path, ext)
        if param.print_statements:
            print('image_relative_path: {}'.format(image_relative_path))
        formatted_files = []
        if param.save_netcdf:
            nc_files = []
            variables = ['qbo', 'level']
            for variable_name in variables:
                for label in ['test', 'ref']:
                    file_name = '{}_{}_{}.nc'.format(param.output_file,
                                                     variable_name, label)
                    nc_files.append(relative_path + file_name)
            formatted_files = [{'url': f, 'title': f} for f in nc_files]
        # TODO: will param.variables ever be longer than one variable?
        #  If so, we'll need to create unique image_relative_paths
        for var in param.variables:
            # Appears in the first column of the non-bolded rows.
            # This should use param.case_id to match the output_dir determined by
            # get_output_dir in acme_diags/plot/cartopy/qbo_plot.py.
            # Otherwise, the plot image and the plot HTML file will have URLs
            # differing in the final directory name.
            viewer.add_row(param.case_id)
            # Adding the description for this var to the current row.
            # This was obtained and stored in the driver for this plotset.
            # Appears in the second column of the non-bolded rows.
            viewer.add_col(param.viewer_descr[var])
            # Link to an html version of the plot png file.
            # Appears in the third column of the non-bolded rows.
            viewer.add_col(image_relative_path,
                           is_file=True,
                           title='Plot',
                           other_files=formatted_files,
                           meta=create_metadata(param))

    url = viewer.generate_page()
    add_header(root_dir, os.path.join(root_dir, url), parameters)
    h1_to_h3(os.path.join(root_dir, url))

    return display_name, url
def create_viewer(root_dir, parameters):
    """
    Given a set of parameters for a certain set of diagnostics,
    create a single page.

    Return the title and url for this page.
    """
    # Information for each row in the viewer.
    # The order is:
    # {
    #  case_id: {
    #       row_name: {
    #             season: filename
    #       }
    #   }
    # }
    ROW_INFO = collections.OrderedDict()
    # A similar dict, but for creating the lat-lon tables.
    LAT_LON_TABLE_INFO = collections.OrderedDict()

    # Since we're only having one set for each
    # create_viewer() call, this works.
    set_name = parameters[0].sets[0]

    viewer = OutputViewer(path=root_dir)
    cols = ['Description'] + seasons_used(parameters)
    viewer.add_page(SET_TO_NAME[set_name], short_name=set_name, columns=cols)

    for parameter in parameters:
        results_dir = parameter.results_dir

        # Filenames are like one in the two formats:
        #   ref_name-variable-season-region
        #   ref_name-variable-plev'mb'-season-region
        ref_name = getattr(parameter, 'ref_name', '')
        for var in parameter.variables:
            for season in parameter.seasons:
                for region in parameter.regions:
                    # Since some parameters have plevs, there might be
                    # more than one row_name, filename pair.
                    # Hence, this is why we have a list.
                    row_name_and_filename = []

                    if parameter.plevs == []:  # 2d variables.
                        if parameter.run_type == 'model_vs_model':
                            row_name = '{} {}'.format(var, region)
                        else: 
                            row_name = '{} {} {}'.format(var, region, ref_name)
                        fnm = '{}-{}-{}-{}'.format(ref_name,
                                                    var, season, region)
                        row_name_and_filename.append((row_name, fnm))
                    else:  # 3d variables.
                        for plev in parameter.plevs:
                            if parameter.run_type == 'model_vs_model':
                                row_name = '{}-{} {}'.format(
                                    var, str(int(plev)) + 'mb', region)
                            else:
                                row_name = '{}-{} {} {}'.format(
                                    var, str(int(plev)) + 'mb', region, ref_name)
                            fnm = '{}-{}-{}-{}-{}'.format(
                                ref_name, var, int(plev), season, region)
                            row_name_and_filename.append((row_name, fnm))

                    if set_name == 'lat_lon':
                        metrics_path = os.path.join(results_dir, '{}'.format(set_name), parameter.case_id, fnm)
                        if os.path.exists(metrics_path + '.json'):
                            _add_to_lat_lon_metrics_table(LAT_LON_TABLE_INFO, metrics_path, season, row_name)
                        else:
                            print(('JSON does not exist: {}'.format(metrics_path + '.json')))
                            continue
                    for row_name, fnm in row_name_and_filename:
                        if set_name not in ROW_INFO:
                            ROW_INFO[set_name] = collections.OrderedDict()
                        if parameter.case_id not in ROW_INFO[set_name]:
                            ROW_INFO[set_name][parameter.case_id] = collections.OrderedDict(
                            )
                        if row_name not in ROW_INFO[set_name][parameter.case_id]:
                            ROW_INFO[set_name][parameter.case_id][row_name] = collections.OrderedDict(
                            )
                            ROW_INFO[set_name][parameter.case_id][row_name]['descr'] = _get_description(
                                var, parameter)
                        # Each season has a image_path and metadata linked to it, thus we use a dict.
                        ROW_INFO[set_name][parameter.case_id][row_name][season] = {}
                        # Format the filename to support relative paths.
                        ROW_INFO[set_name][parameter.case_id][row_name][season]['image_path'] = os.path.join(
                            '..', '{}'.format(set_name), parameter.case_id, fnm)
                        ROW_INFO[set_name][parameter.case_id][row_name][season]['metadata'] = create_metadata(parameter)

    save_netcdf = parameters[0].save_netcdf
    ext = parameters[0].output_format[0]
    _add_information_to_viewer(viewer, ROW_INFO, set_name, save_netcdf, ext)

    viewer.set_page(SET_TO_NAME[set_name])
    # Return the name and the url of the current page of the viewer.
    name, url = SET_TO_NAME[set_name], viewer.generate_page()

    # Edit the final URL to add in the header.
    utils.add_header(root_dir, os.path.join(root_dir, url), parameters)
    utils.h1_to_h3(os.path.join(root_dir, url))

    if set_name == 'lat_lon':
        table_tuple = lat_lon_viewer.generate_lat_lon_metrics_table(
            LAT_LON_TABLE_INFO, SEASONS, viewer, root_dir, parameters)
        taylor_diag_tuple = lat_lon_viewer.generate_lat_lon_taylor_diag(
            LAT_LON_TABLE_INFO, SEASONS, viewer, root_dir, parameters)

        return [(name, url), table_tuple, taylor_diag_tuple]

    return (name, url)
Exemple #7
0
def create_viewer(root_dir, parameters):
    """
    Given a set of parameter for a certain set of diagnostics,
    create a single page.

    Return the title and url for this page.
    """
    viewer = OutputViewer(path=root_dir)
    # The name that's displayed on the viewer.
    set_name = "tc_analysis"
    display_name = "Diagnostics for Tropical Cyclones"
    # The title of the colums on the webpage.
    # Appears in the second and third columns of the bolded rows.
    cols = ["Description", "Plot"]

    viewer.add_page(display_name, short_name=set_name, columns=cols)

    relative_path = os.path.join("..", set_name)
    ext = parameters[0].output_format[0]

    viewer.add_group("Bar/Line plots")
    viewer.add_row("TC Frequency")
    output_file = "tc-frequency.{}".format(ext)
    image_relative_path = os.path.join(relative_path, output_file)
    viewer.add_col("Frequency of TCs by ocean basins")
    viewer.add_col(image_relative_path, is_file=True, title="Plot")

    viewer.add_row("TC Intensity")
    output_file = "tc-intensity.{}".format(ext)
    image_relative_path = os.path.join(relative_path, output_file)
    viewer.add_col("Intensity of TCs by ocean basins")
    viewer.add_col(image_relative_path, is_file=True, title="Plot")

    viewer.add_row("TC Seasonality")
    output_file = "tc-frequency-annual-cycle.{}".format(ext)
    image_relative_path = os.path.join(relative_path, output_file)
    viewer.add_col("Annual cycle of TC frequency by ocean basins")
    viewer.add_col(image_relative_path, is_file=True, title="Plot")

    viewer.add_row("ACE Distribution")
    output_file = "ace-distribution.{}".format(ext)
    image_relative_path = os.path.join(relative_path, output_file)
    viewer.add_col("Distribution of Accumulated Cyclone Energy (ACE)")
    viewer.add_col(image_relative_path, is_file=True, title="Plot")

    viewer.add_group("Maps")
    viewer.add_row("Cyclone Density Map")
    output_file = "cyclone-density-map.{}".format(ext)
    image_relative_path = os.path.join(relative_path, output_file)
    viewer.add_col("Density map of Tropical Cyclones")
    viewer.add_col(image_relative_path, is_file=True, title="Plot")

    viewer.add_row("AEW Density Map")
    output_file = "aew-density-map.{}".format(ext)
    image_relative_path = os.path.join(relative_path, output_file)
    viewer.add_col("Density map of African Easterly Wave")
    viewer.add_col(image_relative_path, is_file=True, title="Plot")

    url = viewer.generate_page()
    add_header(root_dir, os.path.join(root_dir, url), parameters)
    h1_to_h3(os.path.join(root_dir, url))

    return display_name, url
def create_viewer(root_dir, parameters):
    """
    Given a set of parameter for a certain set of diagnostics,
    create a single page.

    Return the title and url for this page.
    """
    viewer = OutputViewer(path=root_dir)
    # The name that's displayed on the viewer.
    set_name = "arm_diags"
    display_name = "Diagnostics at ARM stations"
    # The title of the colums on the webpage.
    # Appears in the second and third columns of the bolded rows.
    cols = ["Description", "Plot", "", "", "", ""]

    viewer.add_page(display_name, short_name=set_name, columns=cols)
    param_dict = {}  # type: ignore

    relative_path = os.path.join("..", set_name)
    for param in parameters:
        key = param.diags_set
        if key not in param_dict.keys():
            param_dict[key] = []
        param_dict[key].append(param)

    for diags_set in param_dict.keys():
        valid_parameters = param_dict[diags_set]
        if diags_set == "annual_cycle":
            viewer.add_group("Annual Cycle")
            for param in valid_parameters:
                ext = param.output_format[0]
                viewer.add_row("{} at {} ({})".format(
                    param.variables[0],
                    region_name[param.regions[0]],
                    param.regions[0],
                ))
                viewer.add_col("Annual cycles of " + param.var_name)
                image_relative_path = os.path.join(
                    relative_path, "{}.{}".format(param.output_file, ext))
                viewer.add_col(image_relative_path, is_file=True, title="Plot")
        if diags_set == "diurnal_cycle":
            viewer.add_group("Diurnal Cycle")
            for param in valid_parameters:
                ext = param.output_format[0]
                viewer.add_row("PRECT at SGP")
                viewer.add_col("Diurnal cycle of precipitation")
                for season in ["DJF", "MAM", "JJA", "SON"]:
                    output_file = "{}-PRECT-{}-sgp-diurnal-cycle.{}".format(
                        param.ref_name, season, ext)
                    image_relative_path = os.path.join(relative_path,
                                                       output_file)
                    viewer.add_col(image_relative_path,
                                   is_file=True,
                                   title=season)
        if diags_set == "convection_onset":
            viewer.add_group("Convection Onset Statistics")
            for param in valid_parameters:
                ext = param.output_format[0]
                viewer.add_row("{} ({})".format(region_name[param.regions[0]],
                                                param.regions[0]))
                viewer.add_col("Convection Onset Statistics")
                region = param.regions[0]
                output_file = "{}-convection-onset-{}.{}".format(
                    param.ref_name, region, ext)
                image_relative_path = os.path.join(relative_path, output_file)
                viewer.add_col(image_relative_path, is_file=True, title="Plot")
        if diags_set == "diurnal_cycle_zt":
            viewer.add_group("Monthly Diurnal Cycle of Cloud")
            for param in valid_parameters:
                ext = param.output_format[0]
                viewer.add_row("{} ({})".format(region_name[param.regions[0]],
                                                param.regions[0]))
                region = param.regions[0]
                viewer.add_col("Monthly Diurnal Cycle of Cloud")
                output_file1 = "{}-CLOUD-ANNUALCYCLE-{}-{}.{}".format(
                    param.ref_name, region, "test", ext)
                output_file2 = "{}-CLOUD-ANNUALCYCLE-{}-{}.{}".format(
                    param.ref_name, region, "ref", ext)
                image_relative_path = os.path.join(relative_path, output_file1)
                viewer.add_col(image_relative_path, is_file=True, title="Test")
                image_relative_path = os.path.join(relative_path, output_file2)
                viewer.add_col(image_relative_path,
                               is_file=True,
                               title="Reference")

    url = viewer.generate_page()
    add_header(root_dir, os.path.join(root_dir, url), parameters)
    h1_to_h3(os.path.join(root_dir, url))

    return display_name, url
def create_viewer(root_dir, parameters):
    """
    Given a set of parameters for a certain set of diagnostics,
    create a single page.

    Return the title and url for this page.
    """
    viewer = OutputViewer(path=root_dir)

    set_name = parameters[0].sets[0]
    # The name that's displayed on the viewer.
    if set_name == 'zonal_mean_2d':
        display_name = 'Pressure-Latitude zonal mean contour plots'
    elif set_name == 'meridional_mean_2d':
        display_name = 'Pressure-Longitude meridional mean contour plots'

    cols = ['Description'] + seasons_used(parameters)
    viewer.add_page(display_name, short_name=set_name, columns=cols)

    # Sort the parameters so that the viewer is created in the correct order.
    # Using SEASONS.index(), we make sure we get the parameters in
    # ['ANN', 'DJF', ..., 'SON'] order instead of alphabetical.
    parameters.sort(
        key=lambda x: (x.case_id, x.variables[0], SEASONS.index(x.seasons[0])))

    for param in parameters:
        ref_name = getattr(param, 'ref_name', '')
        for var in param.variables:
            for season in param.seasons:
                for region in param.regions:

                    try:
                        viewer.set_group(param.case_id)
                    except RuntimeError:
                        viewer.add_group(param.case_id)

                    if param.run_type == 'model_vs_model':
                        row_name = '{} {}'.format(var, region)
                    else:
                        row_name = '{} {} {}'.format(var, region, ref_name)

                    try:
                        viewer.set_row(row_name)
                    except RuntimeError:
                        # A row of row_name wasn't in the viewer, so add it.
                        viewer.add_row(row_name)
                        # Adding the description for the row.
                        viewer.add_col(param.viewer_descr[var])

                    ext = param.output_format[0]
                    fnm = '{}-{}-{}-{}'.format(ref_name, var, season, region)
                    file_name = os.path.join('..', set_name, param.case_id,
                                             '{}.{}'.format(fnm, ext))
                    viewer.add_col(file_name,
                                   is_file=True,
                                   title=season,
                                   meta=create_metadata(param))

    url = viewer.generate_page()
    add_header(root_dir, os.path.join(root_dir, url), parameters)
    h1_to_h3(os.path.join(root_dir, url))

    return display_name, url