docs: def open(self, data_source, *args, **kwargs):
          """
          Open filename to get data for data_source.
  
          :param data_source: Data source for which the file contains data.
          :type data_source: str
  
          Positional and keyword arguments can contain either the data to use for
          the data source or the full path of the file which contains data for the
          data source.
          """
          if self.sources[data_source]._meta.data_reader.is_file_reader:
              filename = kwargs.get('filename')
              path = kwargs.get('path', '')
              rel_path = kwargs.get('rel_path', '')
              if len(args) > 0:
                  filename = args[0]
              if len(args) > 1:
                  path = args[1]
              if len(args) > 2:
                  rel_path = args[2]
              args = ()
              kwargs = {'filename': os.path.join(rel_path, path, filename)}
              LOGGER.debug('filename: %s', kwargs['filename'])
          # call constructor of data source with filename argument
          self.objects[data_source] = self.sources[data_source](*args, **kwargs)
          # register data and uncertainty in registry
          data_src_obj = self.objects[data_source]
          meta = [getattr(data_src_obj, m) for m in self.reg.meta_names]
          self.reg.register(data_src_obj.data, *meta)