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]
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)
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]
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')
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}"')
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')
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
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
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()
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