Source code for qcportal.reaction.dataset_models

from collections.abc import Iterable
from typing import Any
from typing import Literal

from pydantic import BaseModel, ConfigDict

from qcportal.dataset_models import BaseDataset
from qcportal.internal_jobs import InternalJob
from qcportal.metadata_models import InsertMetadata
from qcportal.molecules import Molecule
from qcportal.reaction.record_models import ReactionRecord, ReactionSpecification


[docs] class ReactionDatasetEntryStoichiometry(BaseModel): coefficient: float molecule: Molecule
[docs] class ReactionDatasetNewEntry(BaseModel): model_config = ConfigDict(extra="forbid") name: str stoichiometries: list[ReactionDatasetEntryStoichiometry | tuple[float, int | Molecule]] additional_keywords: dict[str, Any] = {} attributes: dict[str, Any] = {} comment: str | None = None
[docs] class ReactionDatasetEntry(ReactionDatasetNewEntry): model_config = ConfigDict(extra="forbid") stoichiometries: list[ReactionDatasetEntryStoichiometry]
[docs] class ReactionDatasetSpecification(BaseModel): model_config = ConfigDict(extra="forbid") name: str specification: ReactionSpecification description: str | None = None
[docs] class ReactionDatasetRecordItem(BaseModel): model_config = ConfigDict(extra="forbid") entry_name: str specification_name: str record_id: int record: ReactionRecord | None
[docs] class ReactionDataset(BaseDataset): dataset_type: Literal["reaction"] = "reaction" # Needed by the base class _entry_type = ReactionDatasetEntry _new_entry_type = ReactionDatasetNewEntry _specification_type = ReactionDatasetSpecification _record_item_type = ReactionDatasetRecordItem _record_type = ReactionRecord
[docs] def add_specification( self, name: str, specification: ReactionSpecification, description: str | None = None ) -> InsertMetadata: spec = ReactionDatasetSpecification(name=name, specification=specification, description=description) return self._add_specifications(spec)
[docs] def add_entries(self, entries: ReactionDatasetNewEntry | Iterable[ReactionDatasetNewEntry]) -> InsertMetadata: return self._add_entries(entries)
[docs] def background_add_entries( self, entries: ReactionDatasetNewEntry | Iterable[ReactionDatasetNewEntry] ) -> InternalJob: return self._background_add_entries(entries)
[docs] def add_entry( self, name: str, stoichiometries: list[tuple[float, int | Molecule]], additional_keywords: dict[str, Any] | None = None, attributes: dict[str, Any] | None = None, comment: str | None = None, ): if additional_keywords is None: additional_keywords = {} if attributes is None: attributes = {} ent = ReactionDatasetNewEntry( name=name, stoichiometries=stoichiometries, additional_keywords=additional_keywords, attributes=attributes, comment=comment, ) return self.add_entries(ent)