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)