<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _load_hdf5(self, filename, parent_level="CellpyData"):
 """Load a cellpy-file. Args: filename (str):
 Name of the cellpy file. parent_level (str) (optional):
 name of the parent level (defaults to "CellpyData") Returns: loaded datasets (DataSet-object) """


        if not os.path.isfile(filename):
            self.logger.info(f"file does not exist: {filename}")
            raise IOError
        store = pd.HDFStore(filename)

        # required_keys = ['dfdata', 'dfsummary', 'fidtable', 'info']
        required_keys = ['dfdata', 'dfsummary', 'info']
        required_keys = ["/" + parent_level + "/" + _ for _ in required_keys]

        for key in required_keys:
            if key not in store.keys():
                self.logger.info(f"This hdf-file is not good enough - "
                                 f"at least one key is missing: {key}")
                raise Exception(f"OH MY GOD! At least one crucial key"
                                f"is missing {key}!")

        self.logger.debug(f"Keys in current hdf5-file: {store.keys()}")
        data = DataSet()

        if parent_level != "CellpyData":
            self.logger.debug("Using non-default parent label for the "
                              "hdf-store: {}".format(parent_level))

        # checking file version
        infotable = store.select(parent_level + "/info")
        try:
            data.cellpy_file_version = \
                self._extract_from_dict(infotable, "cellpy_file_version")
        except Exception as e:
            data.cellpy_file_version = 0
            warnings.warn(f"Unhandled exception raised: {e}")

        if data.cellpy_file_version < MINIMUM_CELLPY_FILE_VERSION:
            raise WrongFileVersion

        if data.cellpy_file_version > CELLPY_FILE_VERSION:
            raise WrongFileVersion

        data.dfsummary = store.select(parent_level + "/dfsummary")
        data.dfdata = store.select(parent_level + "/dfdata")

        try:
            data.step_table = store.select(parent_level + "/step_table")
        except Exception as e:
            self.logging.debug("could not get step_table from cellpy-file")
            data.step_table = pd.DataFrame()
            warnings.warn(f"Unhandled exception raised: {e}")

        try:
            fidtable = store.select(
                parent_level + "/fidtable")  # remark! changed spelling from
            # lower letter to camel-case!
            fidtable_selected = True
        except Exception as e:
            self.logging.debug("could not get fid-table from cellpy-file")
            fidtable = []

            warnings.warn("no fidtable - you should update your hdf5-file")
            fidtable_selected = False
        self.logger.debug("  h5")
        # this does not yet allow multiple sets

        newtests = []  # but this is ready when that time comes

        # The infotable stores "meta-data". The follwing statements loads the
        # content of infotable and updates div. DataSet attributes.
        # Maybe better use it as dict?

        data = self._load_infotable(data, infotable, filename)

        if fidtable_selected:
            data.raw_data_files, data.raw_data_files_length = \
                self._convert2fid_list(fidtable)
        else:
            data.raw_data_files = None
            data.raw_data_files_length = None
        newtests.append(data)
        store.close()
        # self.datasets.append(data)
        return newtests