from __future__ import annotations
from emmet.core.molecules.orbitals import OrbitalDoc
from emmet.core.mpid import MPculeID
from mp_api.client.core import BaseRester
[docs]
class MoleculesOrbitalsRester(BaseRester[OrbitalDoc]):
suffix = "molecules/orbitals"
document_model = OrbitalDoc
primary_key = "property_id"
[docs]
def search(
self,
molecule_ids: MPculeID | list[MPculeID] | None = None,
property_ids: str | list[str] | None = None,
charge: int | None = None,
spin_multiplicity: int | None = None,
level_of_theory: str | None = None,
solvent: str | None = None,
lot_solvent: str | None = None,
formula: str | list[str] | None = None,
elements: list[str] | None = None,
exclude_elements: list[str] | None = None,
chemsys: str | list[str] | None = None,
electron_type_population: str | None = None,
core_electrons: tuple[float, float] | None = None,
valence_electrons: tuple[float, float] | None = None,
rydberg_electrons: tuple[float, float] | None = None,
total_electrons: tuple[float, float] | None = None,
electron_type_lp: str | None = None,
lp_type: str | None = None,
s_character: tuple[float, float] | None = None,
p_character: tuple[float, float] | None = None,
d_character: tuple[float, float] | None = None,
f_character: tuple[float, float] | None = None,
lp_occupancy: tuple[float, float] | None = None,
electron_type_bond: str | None = None,
bond_type: str | None = None,
s_character_atom1: tuple[float, float] | None = None,
s_character_atom2: tuple[float, float] | None = None,
p_character_atom1: tuple[float, float] | None = None,
p_character_atom2: tuple[float, float] | None = None,
d_character_atom1: tuple[float, float] | None = None,
d_character_atom2: tuple[float, float] | None = None,
f_character_atom1: tuple[float, float] | None = None,
f_character_atom2: tuple[float, float] | None = None,
polarization_atom1: tuple[float, float] | None = None,
polarization_atom2: tuple[float, float] | None = None,
bond_occupancy: tuple[float, float] | None = None,
electron_type_interaction: str | None = None,
donor_type: str | None = None,
acceptor_type: str | None = None,
perturbation_energy: tuple[float, float] | None = None,
energy_difference: tuple[float, float] | None = None,
fock_element: tuple[float, float] | None = None,
num_chunks: int | None = None,
chunk_size: int = 1000,
all_fields: bool = True,
fields: list[str] | None = None,
):
"""Query molecules redox docs using a variety of search criteria.
Arguments:
molecule_ids (MPculeID, List[MPculeID]): List of Materials Project Molecule IDs (MPculeIDs) to return data
for.
property_ids (str, List[str]): List of property IDs to return data for.
charge (Tuple[int, int]): Minimum and maximum charge for the molecule.
spin_multiplicity (Tuple[int, int]): Minimum and maximum spin for the molecule.
level_of_theory (str): Desired level of theory (e.g. "wB97X-V/def2-TZVPPD/SMD")
solvent (str): Desired solvent (e.g. "SOLVENT=WATER")
lot_solvent (str): Desired combination of level of theory and solvent
(e.g. "wB97X-V/def2-TZVPPD/SMD(SOLVENT=THF)")
correction_level_of_theory (str): Desired correction level of theory (e.g. "wB97X-V/def2-TZVPPD/SMD")
correction_solvent (str): Desired correction solvent (e.g. "SOLVENT=WATER")
correction_lot_solvent (str): Desired correction combination of level of theory and solvent
(e.g. "wB97X-V/def2-TZVPPD/SMD(SOLVENT=THF)")
combined_lot_solvent (str): Desired combination of level of theory and solvent including both main
thermo calculation and single-point energy correction
(e.g. "wB97X-D/def2-SVPD/VACUUM//wB97X-V/def2-TZVPPD/SMD(SOLVENT=THF)")
formula (str, List[str]): An alphabetical formula or list of formulas
(e.g. "C2 Li2 O4", ["C2 H4", "C2 H6"]).
elements (List[str]): A list of elements.
exclude_elements (List(str)): List of elements to exclude.
chemsys (str, List[str]): A chemical system, list of chemical systems
(e.g., Li-C-O, [C-O-H-N, Li-N]), or single formula (e.g., C2 H4).
electron_type_population (str): Should alpha ('alpha'), beta ('beta'), or all electrons (None) be
considered in a query of natural electron populations?
core_electrons (Tuple[float, float]): Minimum and maximum number of core electrons in an atom
in this molecule.
valence_electrons (Tuple[float, float]): Minimum and maximum number of valence electrons in an atom
in this molecule.
rydberg_electrons (Tuple[float, float]): Minimum and maximum number of rydberg electrons in an atom
in this molecule.
total_electrons: (Tuple[float, float]): Minimum and maximum number of total electrons in an atom
in this molecule.
electron_type_lp (str): Should alpha ('alpha'), beta ('beta'), or all electrons (None) be
considered in a query of lone pairs?
lp_type (str): Type of orbital - "LP" for "lone pair" or "LV" for "lone vacant"
s_character (Tuple[float, float]): Min and max percentage of the lone pair constituted by s atomic orbitals.
p_character (Tuple[float, float]): Min and max percentage of the lone pair constituted by p atomic orbitals.
d_character (Tuple[float, float]): Min and max percentage of the lone pair constituted by d atomic orbitals.
f_character (Tuple[float, float]): Min and max percentage of the lone pair constituted by f atomic orbitals.
lp_occupancy(Tuple[float, float]): Min and max number of electrons in the lone pair.
electron_type_bond (str): Should alpha ('alpha'), beta ('beta'), or all electrons (None) be
considered in a query of bonds?
bond_type (str): Type of orbital, e.g. "BD" for bonding or "BD*" for antibonding
s_character_atom1 (Tuple[float, float]): Min and max percentage of the bond constituted by s atomic orbitals
on the first atom.
s_character_atom2 (Tuple[float, float]): Min and max percentage of the bond constituted by s atomic orbitals
on the second atom.
p_character_atom1 (Tuple[float, float]): Min and max percentage of the bond constituted by p atomic orbitals
on the first atom.
p_character_atom2 (Tuple[float, float]): Min and max percentage of the bond constituted by p atomic orbitals
on the second atom.
d_character_atom1 (Tuple[float, float]): Min and max percentage of the bond constituted by d atomic orbitals
on the first atom.
d_character_atom2 (Tuple[float, float]): Min and max percentage of the bond constituted by d atomic orbitals
on the second atom.
f_character_atom1 (Tuple[float, float]): Min and max percentage of the bond constituted by f atomic orbitals
on the first atom.
f_character_atom2 (Tuple[float, float]): Min and max percentage of the bond constituted by f atomic orbitals
on the second atom.
polarization_atom1 (Tuple[float, float]): Min and max fraction of electrons in the bond donated by the
first atom.
polarization_atom2 (Tuple[float, float]): Min and max fraction of electrons in the bond donated by the
second atom.
bond_occupancy (Tuple[float, float]): Min and max number of electrons in the bond.
electron_type_interaction (str): Should alpha ('alpha'), beta ('beta'), or all electrons (None) be
considered in a query of orbital interactions?
donor_type (str): Type of donor orbital, e.g. 'BD' for bonding or 'RY*' for anti-Rydberg
acceptor_type (str): Type of acceptor orbital, e.g. 'BD' for bonding or 'RY*' for anti-Rydberg
perturbation_energy (Tuple[float, float]): Min and max perturbation energy of the interaction
energy_difference (Tuple[float, float]): Min and max energy difference between interacting orbitals
fock_element (Tuple[float, float]): Min and max interaction Fock matrix element
num_chunks (int): Maximum number of chunks of data to yield. None will yield all possible.
chunk_size (int): Number of data entries per chunk.
all_fields (bool): Whether to return all fields in the document. Defaults to True.
fields (List[str]): List of fields in MoleculeDoc to return data for.
Default is "molecule_id", "property_id", "solvent", "method", "last_updated"
if all_fields is False.
Returns:
([RedoxDoc]) List of molecule redox documents
"""
query_params = {} # type: dict
min_max = [
"core_electrons",
"valence_electrons",
"rydberg_electrons",
"total_electrons",
"s_character",
"p_character",
"d_character",
"f_character",
"lp_occupancy",
"s_character_atom1",
"s_character_atom2",
"p_character_atom1",
"p_character_atom2",
"d_character_atom1",
"d_character_atom2",
"f_character_atom1",
"f_character_atom2",
"polarization_atom1",
"polarization_atom2",
"bond_occupancy",
"perturbation_energy",
"energy_difference",
"fock_element",
]
for param, value in locals().items():
if param in min_max and value:
if isinstance(value, (int, float)):
value = (value, value)
query_params.update(
{
f"min_{param}": value[0],
f"max_{param}": value[1],
}
)
if molecule_ids:
if isinstance(molecule_ids, str):
molecule_ids = [molecule_ids]
query_params.update({"molecule_ids": ",".join(molecule_ids)})
if property_ids:
if isinstance(property_ids, str):
property_ids = [property_ids]
query_params.update({"property_ids": ",".join(property_ids)})
if charge:
query_params.update({"charge": charge})
if spin_multiplicity:
query_params.update({"spin_multiplicity": spin_multiplicity})
if level_of_theory:
query_params.update({"level_of_theory": level_of_theory})
if solvent:
query_params.update({"solvent": solvent})
if lot_solvent:
query_params.update({"lot_solvent": lot_solvent})
if formula:
if isinstance(formula, str):
formula = [formula]
query_params.update({"formula": ",".join(formula)})
if chemsys:
if isinstance(chemsys, str):
chemsys = [chemsys]
query_params.update({"chemsys": ",".join(chemsys)})
if elements:
query_params.update({"elements": ",".join(elements)})
if exclude_elements:
query_params.update({"exclude_elements": ",".join(exclude_elements)})
if electron_type_population:
query_params.update({"electron_type_population": electron_type_population})
if electron_type_lp:
query_params.update({"electron_type_lp": electron_type_lp})
if lp_type:
query_params.update({"lp_type": lp_type})
if electron_type_bond:
query_params.update({"electron_type_bond": electron_type_bond})
if bond_type:
query_params.update({"bond_type": bond_type})
if electron_type_interaction:
query_params.update(
{"electron_type_interaction": electron_type_interaction}
)
if donor_type:
query_params.update({"donor_type": donor_type})
if acceptor_type:
query_params.update({"acceptor_type": acceptor_type})
return super()._search(
num_chunks=num_chunks,
chunk_size=chunk_size,
all_fields=all_fields,
fields=fields,
**query_params,
)