code: def open(self, data_source, *args, **kwargs):
          
          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)
docs: 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.