class_docstr: File handler for TROPOMI L2 netCDF files.
class_docstr_tok: ["File","handler","for","TROPOMI","L2","netCDF","files","."]
docstr: Automatically determine datasets provided by this file.
docstr_tok: ["Automatically","determine","datasets","provided","by","this","file","."]
code: def available_datasets(self, configured_datasets=None):
      """Automatically determine datasets provided by this file."""
      logger.debug("Available_datasets begin...")
  
      # Determine shape of the geolocation data (lat/lon)
      lat_shape = None
      for var_name, _val in self.file_content.items():
          # Could probably avoid this hardcoding, will think on it
          if var_name == "PRODUCT/latitude":
              lat_shape = self[var_name + "/shape"]
              break
  
      handled_variables = set()
  
      # update previously configured datasets
      logger.debug("Starting previously configured variables loop...")
      # if bounds exists, we can assemble them later
      bounds_exist = (
          "latitude_bounds" in self and "longitude_bounds" in self
      )
      for is_avail, ds_info in configured_datasets or []:
          # some other file handler knows how to load this
          if is_avail is not None:
              yield is_avail, ds_info
  
          var_name = ds_info.get("file_key", ds_info["name"])
          # logger.debug("Evaluating previously configured variable: %s", var_name)
          matches = self.file_type_matches(ds_info["file_type"])
          # we can confidently say that we can provide this dataset and can
          # provide more info
          assembled = var_name in [
              "assembled_lat_bounds",
              "assembled_lon_bounds",
          ]
          if (matches and var_name in self) or (
              assembled and bounds_exist
          ):
              logger.debug(
                  "Handling previously configured variable: %s",
                  var_name,
              )
              if not assembled:
                  # Because assembled variables and bounds use the same file_key,
                  # we need to omit file_key once.
                  handled_variables.add(var_name)
              new_info = (
                  ds_info.copy()
              )  # don't mess up the above yielded
              yield True, new_info
          elif is_avail is None:
              # if we didn't know how to handle this dataset and no one else did
              # then we should keep it going down the chain
              yield is_avail, ds_info
  
      yield from self._iterate_over_dataset_contents(
          handled_variables, lat_shape
      )
  
imports: import logging
  from datetime import datetime
  import dask.array
  import numpy
  import xarray
  from satpy.readers.netcdf_utils import NetCDF4FileHandler, netCDF4
  from satpy.utils import get_legacy_chunk_size
label_desc: Use image node_id 8 for calling the TROPOMIL2FileHandler obj's underlying member method code with example usage: obj.available_datasets(configured_datasets) without return types