diff --git a/qiskit_experiments/framework/composite/composite_experiment_data.py b/qiskit_experiments/framework/composite/composite_experiment_data.py index 7fe1064c40..8a789f076b 100644 --- a/qiskit_experiments/framework/composite/composite_experiment_data.py +++ b/qiskit_experiments/framework/composite/composite_experiment_data.py @@ -17,7 +17,7 @@ from qiskit.result import marginal_counts from qiskit.exceptions import QiskitError from qiskit_experiments.framework.experiment_data import ExperimentData -from qiskit_experiments.database_service import DbExperimentDataV1, DatabaseServiceV1 +from qiskit_experiments.database_service import DatabaseServiceV1 class CompositeExperimentData(ExperimentData): @@ -114,19 +114,16 @@ def save_metadata(self) -> None: @classmethod def load(cls, experiment_id: str, service: DatabaseServiceV1) -> "CompositeExperimentData": - expdata = DbExperimentDataV1.load(experiment_id, service) - components = [] + expdata = ExperimentData.load(experiment_id, service) + expdata.__class__ = CompositeExperimentData + expdata._components = [] for comp_id, comp_class in zip( expdata.metadata["component_ids"], expdata.metadata["component_classes"] ): load_class = globals()[comp_class] load_func = getattr(load_class, "load") loaded_comp = load_func(comp_id, service) - components.append(loaded_comp) - - expdata.__class__ = CompositeExperimentData - expdata._experiment = None - expdata._components = components + expdata._components.append(loaded_comp) return expdata diff --git a/qiskit_experiments/framework/experiment_data.py b/qiskit_experiments/framework/experiment_data.py index 0742e27cec..eae48238bb 100644 --- a/qiskit_experiments/framework/experiment_data.py +++ b/qiskit_experiments/framework/experiment_data.py @@ -17,6 +17,7 @@ from datetime import datetime from qiskit_experiments.database_service import DbExperimentDataV1 +from qiskit_experiments.database_service.database_service import DatabaseServiceV1 LOG = logging.getLogger(__name__) @@ -62,6 +63,22 @@ def completion_times(self) -> Dict[str, datetime]: return job_times + @classmethod + def load(cls, experiment_id: str, service: DatabaseServiceV1) -> "ExperimentData": + """Load a saved experiment data from a database service. + + Args: + experiment_id: Experiment ID. + service: the database service. + + Returns: + The loaded experiment data. + """ + expdata = DbExperimentDataV1.load(experiment_id, service) + expdata.__class__ = ExperimentData + expdata._experiment = None + return expdata + def _copy_metadata(self, new_instance: Optional["ExperimentData"] = None) -> "ExperimentData": """Make a copy of the experiment metadata. diff --git a/releasenotes/notes/fix-expdata-load-b7c6569bfbe67bec.yaml b/releasenotes/notes/fix-expdata-load-b7c6569bfbe67bec.yaml new file mode 100644 index 0000000000..4aa9251974 --- /dev/null +++ b/releasenotes/notes/fix-expdata-load-b7c6569bfbe67bec.yaml @@ -0,0 +1,8 @@ +--- +fixes: + - | + Fixes bug where the + :meth:`~qiskit_experiments.framework.ExperimentData.load` method of + :class:`~qiskit_experiments.framework.ExperimentData` would return a + :class:`~qiskit_experiments.database_service.DbExperimentDataV1` object + instead of a :class:`~qiskit_experiments.framework.ExperimentData` object.