class ReaderWrapper(roles.FrontendRole): FILE_EXTENSIONS = [] DEFAULT_READER_NAME = None DEFAULT_DATASETS = [] # This is temporary until a better solution is found for loading start/end time on init PRIMARY_FILE_TYPE = None def __init__(self, **kwargs): self.reader = kwargs.pop("reader", self.DEFAULT_READER_NAME) super(ReaderWrapper, self).__init__(**kwargs) pathnames = self.find_files_with_extensions() # Create a satpy Scene object self.scene = Scene(reader=self.reader, filenames=pathnames, reader_kwargs=kwargs) self._begin_time = self.scene.start_time self._end_time = self.scene.end_time self.wishlist = set() @property def begin_time(self): return self._begin_time @property def end_time(self): return self._end_time @property def available_product_names(self): return self.scene.available_dataset_names(reader_name=self.reader, composites=True) @property def all_product_names(self): return self.scene.all_dataset_names(reader_name=self.reader, composites=True) @property def default_products(self): return self.DEFAULT_DATASETS def filter(self, scene): pass def create_scene(self, products=None, **kwargs): LOG.debug("Loading scene data...") # If the user didn't provide the products they want, figure out which ones we can create if products is None: LOG.debug("No products specified to frontend, will try to load logical defaults products") products = self.default_products kwargs.pop("overwrite_existing") kwargs.pop("exit_on_error") kwargs.pop("keep_intermediate") self.scene.load(products, **kwargs) self.wishlist = self.scene.wishlist # Apply Filters self.filter(self.scene) # Delete the satpy scene so memory is cleared out if it isn't used by the caller scene = self.scene self.scene = None return scene
class ReaderWrapper(roles.FrontendRole): FILE_EXTENSIONS = [] DEFAULT_READER_NAME = None DEFAULT_DATASETS = [] # This is temporary until a better solution is found for loading start/end time on init PRIMARY_FILE_TYPE = None def __init__(self, **kwargs): self.reader = kwargs.pop("reader", self.DEFAULT_READER_NAME) super(ReaderWrapper, self).__init__(**kwargs) pathnames = self.find_files_with_extensions() # Create a satpy Scene object self.scene = Scene(reader=self.reader, filenames=pathnames) self._begin_time = self.scene.start_time self._end_time = self.scene.end_time @property def begin_time(self): return self._begin_time @property def end_time(self): return self._end_time @property def available_product_names(self): return self.scene.available_dataset_names(reader_name=self.reader, composites=True) @property def all_product_names(self): return self.scene.all_dataset_names(reader_name=self.reader, composites=True) @property def default_products(self): return self.DEFAULT_DATASETS def filter(self, scene): pass def create_scene(self, products=None, **kwargs): LOG.debug("Loading scene data...") # If the user didn't provide the products they want, figure out which ones we can create if products is None: LOG.debug( "No products specified to frontend, will try to load logical defaults products" ) products = self.default_products kwargs.pop("overwrite_existing") kwargs.pop("exit_on_error") kwargs.pop("keep_intermediate") self.scene.load(products, **kwargs) self.wishlist = self.scene.wishlist # Apply Filters self.filter(self.scene) # Delete the satpy scene so memory is cleared out if it isn't used by the caller scene = self.scene self.scene = None return scene
class ReaderWrapper(roles.FrontendRole): FILE_EXTENSIONS = [] DEFAULT_READER_NAME = None DEFAULT_DATASETS = [] # This is temporary until a better solution is found for loading start/end time on init PRIMARY_FILE_TYPE = None GENERATE_COMPOSITES = False def __init__(self, **kwargs): self.reader = kwargs.pop("reader", self.DEFAULT_READER_NAME) super(ReaderWrapper, self).__init__(**kwargs) pathnames = self.find_files_with_extensions() # Remove keyword arguments that Satpy won't understand for key in ('search_paths', 'keep_intermediate', 'overwrite_existing', 'exit_on_error'): kwargs.pop(key, None) # Create a satpy Scene object self.scene = Scene(reader=self.reader, filenames=pathnames, reader_kwargs=kwargs) self._begin_time = self.scene.start_time self._end_time = self.scene.end_time self.wishlist = set() self.missing_datasets = set() @property def begin_time(self): return self._begin_time @property def end_time(self): return self._end_time @property def available_product_names(self): return self.scene.available_dataset_names(reader_name=self.reader, composites=True) @property def all_product_names(self): return self.scene.all_dataset_names(reader_name=self.reader, composites=True) @property def default_products(self): return self.DEFAULT_DATASETS def filter(self, scene): pass def _purge_node(self, parent_node, missing_nodes): """We no longer need this Node, remove it and any children.""" for child in parent_node.children: self._purge_node(child, missing_nodes) if parent_node.name is None: # root node return if all(parent in missing_nodes or parent is None for parent in parent_node.parents) and \ parent_node.name in self.scene: # we aren't needed by anything # if not parent_node.parents and parent_node.name in self.scene: LOG.debug("Removing {} because it is no longer needed".format( parent_node.name)) del self.scene[parent_node.name] def _update_filtered_dep_tree(self, parent_node): """Update Scene wishlist and needed datasets based on filtered datasets.""" missing_deps = set() for child in parent_node.children: _req_deps = self._update_filtered_dep_tree(child) missing_deps.update(_req_deps) # we are the root node no need to do the rest of the checks if parent_node.name is None: # get rid of any dependencies that are no longer needed self._purge_node(self.scene.dep_tree, missing_deps) return None # if we are missing any of our required dependencies then we can't be made if missing_deps or (not parent_node.children and parent_node.name not in self.scene): missing_deps.add(parent_node) if missing_deps: if parent_node.name in self.scene: LOG.debug( "Removing {} because it is missing some dependencies". format(parent_node.name)) del self.scene[parent_node.name] elif parent_node.name in self.scene.wishlist: # it was asked for but hasn't been generated yet LOG.debug( "Removing {} because it is missing some dependencies". format(parent_node.name)) self.scene.wishlist.remove(parent_node.name) return missing_deps def create_scene(self, products=None, **kwargs): LOG.debug("Loading scene data...") # If the user didn't provide the products they want, figure out which ones we can create if products is None: LOG.debug( "No products specified to frontend, will try to load logical defaults products" ) products = self.default_products kwargs.pop("overwrite_existing") kwargs.pop("exit_on_error") kwargs.pop("keep_intermediate") self.scene.load(products, generate=self.GENERATE_COMPOSITES, **kwargs) # Apply Filters self.filter(self.scene) if not self.GENERATE_COMPOSITES: self._update_filtered_dep_tree(self.scene.dep_tree) self.wishlist = self.scene.wishlist self.missing_datasets = self.scene.missing_datasets # Delete the satpy scene so memory is cleared out if it isn't used by the caller scene = self.scene self.scene = None return scene