Source code for qiskit_nature.second_q.formats.qcschema.qc_topology

# This code is part of a Qiskit project.
#
# (C) Copyright IBM 2022, 2023.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.

"""The QCSchema topology dataclass."""

from __future__ import annotations

from dataclasses import dataclass
from typing import Any, Sequence, cast

import h5py

from .qc_base import _QCBase
from .qc_provenance import QCProvenance


[docs]@dataclass class QCTopology(_QCBase): """A dataclass to store the topological information of the physical system. For more information refer to [here](https://molssi-qc-schema.readthedocs.io/en/latest/spec_components.html#topology). """ symbols: Sequence[str] """The list of atom symbols in this topology.""" geometry: Sequence[float] """The XYZ coordinates (in Bohr units) of the atoms. This is a flat list of three times the length of the `symbols` list.""" schema_name: str """The name of this schema. This value is expected to be `qcschema_molecule`.""" schema_version: int """The version of this specific schema.""" molecular_charge: int | None = None """The overall charge of the molecule.""" molecular_multiplicity: int | None = None """The overall multiplicity of the molecule.""" fix_com: bool | None = None """Whether translation of the geometry is allowed (`False`) or not (`True`).""" real: Sequence[bool] | None = None """A list indicating whether each atom is real (`True`) or a ghost (`False`). Its length must match that of the `symbols` list.""" connectivity: Sequence[tuple[int, int, int]] | None = None """A list indicating the bonds between the atoms in the molecule. Each item of this list must be a tuple of three integers, indicating the first atom index in the bond, the second atom index, and finally the order of the bond.""" fix_orientation: bool | None = None """Whether rotation of the geometry is allowed (`False`) or not (`True`).""" atom_labels: Sequence[str] | None = None """A list of user-provided information for each atom. Its length must match that of the `symbols` list.""" fragment_multiplicities: Sequence[int] | None = None """The list of multiplicities associated with each fragment.""" fix_symmetry: str | None = None """The maximal point group symmetry at which the `geometry` should be treated.""" fragment_charges: Sequence[float] | None = None """The list of charges associated with each fragment.""" mass_numbers: Sequence[int] | None = None """The mass numbers of all atoms. If it is an unknown isotope, the value should be -1. Its length must match that of the `symbols` list.""" name: str | None = None """The (user-given) name of the molecule.""" masses: Sequence[float] | None = None """The masses (in atomic units) of all atoms. Canonical weights are assumed if this is not given explicitly.""" comment: str | None = None """Any additional (user-provided) comment.""" provenance: QCProvenance | None = None """An instance of :class:`QCProvenance`.""" fragments: Sequence[tuple[int, ...]] | None = None """The list of fragments. Each item of this list must be a tuple of integers with variable length (greater than 1). The first number indicates the fragment index, all following numbers refer to the (0-indexed) atom indices that constitute this fragment.""" atomic_numbers: Sequence[int] | None = None """The atomic numbers of all atoms, indicating their nuclear charge. Its length must match that of the `symbols` list."""
[docs] @classmethod def from_dict(cls, data: dict[str, Any]) -> QCTopology: provenance: QCProvenance | None = None if "provenance" in data.keys(): provenance = cast(QCProvenance, QCProvenance.from_dict(data.pop("provenance"))) return cls(**data, provenance=provenance)
@classmethod def _from_hdf5_group(cls, h5py_group: h5py.Group) -> QCTopology: data = dict(h5py_group.attrs.items()) for key, value in h5py_group.items(): data[key] = value if "provenance" in h5py_group.keys(): data["provenance"] = cast( QCProvenance, QCProvenance.from_hdf5(h5py_group["provenance"]) ) return cls(**data)