예제 #1
0
 def get_variable_for_z(self, ds_id: str, var_name: str, z_index: int) -> xr.DataArray:
     ml_dataset = self.get_ml_dataset(ds_id)
     index = ml_dataset.num_levels - 1 - z_index
     if index < 0 or index >= ml_dataset.num_levels:
         raise ServiceResourceNotFoundError(f'Variable "{var_name}" has no z-index {z_index} in dataset "{ds_id}"')
     dataset = ml_dataset.get_dataset(index)
     if var_name not in dataset:
         raise ServiceResourceNotFoundError(f'Variable "{var_name}" not found in dataset "{ds_id}"')
     return dataset[var_name]
예제 #2
0
    def test_same_base_type(self):

        self.assertIsInstance(ServiceError(''), HTTPError)
        self.assertEqual(500, ServiceError('').status_code)
        self.assertEqual(503, ServiceError('', status_code=503).status_code)

        self.assertIsInstance(ServiceConfigError(''), ServiceError)
        self.assertEqual(500, ServiceConfigError('').status_code)

        self.assertIsInstance(ServiceBadRequestError(''), ServiceError)
        self.assertEqual(400, ServiceBadRequestError('').status_code)

        self.assertIsInstance(ServiceResourceNotFoundError(''), ServiceError)
        self.assertEqual(404, ServiceResourceNotFoundError('').status_code)
예제 #3
0
 def get_dataset_and_coord_variable(self, ds_name: str, dim_name: str):
     ds = self.get_dataset(ds_name)
     if dim_name not in ds.coords:
         raise ServiceResourceNotFoundError(
             f'Dimension {dim_name!r} has no coordinates in dataset {ds_name!r}'
         )
     return ds, ds.coords[dim_name]
예제 #4
0
 def _get_place_group_descriptor(self, place_group_id: str) -> Dict:
     place_group_descriptors = self._config.get("PlaceGroups", [])
     for place_group_descriptor in place_group_descriptors:
         if place_group_descriptor['Identifier'] == place_group_id:
             return place_group_descriptor
     raise ServiceResourceNotFoundError(
         f'Place group "{place_group_id}" not found')
예제 #5
0
 def get_legend_label(self, ds_id: str, var_name: str):
     dataset = self.get_dataset(ds_id)
     if var_name in dataset:
         ds = self.get_dataset(ds_id)
         units = ds[var_name].units
         return units
     raise ServiceResourceNotFoundError(f'Variable "{var_name}" not found in dataset "{ds_id}"')
예제 #6
0
 def get_dataset_place_group(self, ds_id: str, place_group_id: str, base_url: str, load_features=False) -> Dict:
     place_groups = self.get_dataset_place_groups(ds_id, base_url, load_features=False)
     for place_group in place_groups:
         if place_group_id == place_group['id']:
             if load_features:
                 self._load_place_group_features(place_group)
             return place_group
     raise ServiceResourceNotFoundError(f'Place group "{place_group_id}" not found')
예제 #7
0
 def get_dataset_descriptor(self, ds_id: str) -> Dict[str, Any]:
     dataset_descriptors = self.get_dataset_descriptors()
     if not dataset_descriptors:
         raise ServiceConfigError(f"No datasets configured")
     dataset_descriptor = self.find_dataset_descriptor(dataset_descriptors, ds_id)
     if dataset_descriptor is None:
         raise ServiceResourceNotFoundError(f'Dataset "{ds_id}" not found')
     return dataset_descriptor
예제 #8
0
 def get_dataset(self, ds_id: str, expected_var_names: Collection[str] = None) -> xr.Dataset:
     ml_dataset, _ = self._get_dataset_entry(ds_id)
     dataset = ml_dataset.base_dataset
     if expected_var_names:
         for var_name in expected_var_names:
             if var_name not in dataset:
                 raise ServiceResourceNotFoundError(f'Variable "{var_name}" not found in dataset "{ds_id}"')
     return dataset
예제 #9
0
def get_legend(ctx: ServiceContext, ds_id: str, var_name: str,
               params: RequestParams):
    cmap_name = params.get_query_argument('cbar', default=None)
    cmap_vmin = params.get_query_argument_float('vmin', default=None)
    cmap_vmax = params.get_query_argument_float('vmax', default=None)
    cmap_w = params.get_query_argument_int('width', default=None)
    cmap_h = params.get_query_argument_int('height', default=None)
    if cmap_name is None or cmap_vmin is None or cmap_vmax is None or cmap_w is None or cmap_h is None:
        default_cmap_cbar, (default_cmap_vmin,
                            default_cmap_vmax) = ctx.get_color_mapping(
                                ds_id, var_name)
        cmap_name = cmap_name or default_cmap_cbar
        cmap_vmin = cmap_vmin or default_cmap_vmin
        cmap_vmax = cmap_vmax or default_cmap_vmax
        cmap_w = cmap_w or DEFAULT_CMAP_WIDTH
        cmap_h = cmap_h or DEFAULT_CMAP_HEIGHT

    try:
        _, cmap = get_cmap(cmap_name)
    except ValueError:
        raise ServiceResourceNotFoundError(
            f"color bar {cmap_name!r} not found")

    fig = matplotlib.figure.Figure(figsize=(cmap_w, cmap_h))
    ax1 = fig.add_subplot(1, 1, 1)
    if '.cpd' in cmap_name:
        norm, ticks = get_norm(cmap_name)
    else:
        norm = matplotlib.colors.Normalize(vmin=cmap_vmin, vmax=cmap_vmax)
        ticks = None

    image_legend = matplotlib.colorbar.ColorbarBase(ax1,
                                                    format='%.1f',
                                                    ticks=ticks,
                                                    cmap=cmap,
                                                    norm=norm,
                                                    orientation='vertical')

    image_legend_label = ctx.get_legend_label(ds_id, var_name)
    if image_legend_label is not None:
        image_legend.set_label(image_legend_label)

    fig.patch.set_facecolor('white')
    fig.patch.set_alpha(0.0)
    fig.tight_layout()

    buffer = io.BytesIO()
    fig.savefig(buffer, format='png')

    return buffer.getvalue()
예제 #10
0
 def get_dataset_config(self, ds_id: str) -> Dict[str, Any]:
     dataset_configs = self.get_dataset_configs()
     dataset_config = self.find_dataset_config(dataset_configs, ds_id)
     if dataset_config is None:
         raise ServiceResourceNotFoundError(f'Dataset "{ds_id}" not found')
     return dataset_config