15. Query an OPTIMADE server¶
OPTIMADE is the generic HTTP interface for materials data. The client below
uses a plain base_url, so the same code works with any compatible provider.
Use providers.optimade.org to discover
provider endpoints, then assign the selected OPTIMADE base URL to base_url.
For the captured output below, base_url points at a local httk₂
OPTIMADE server backed by the presentation.sqlite store from the earlier
tutorial sequence. The client does not depend on that server implementation;
replace the URL with any provider endpoint.
15.1. Discover and filter structures¶
OptimadeStore is the synchronous, read-only OPTIMADE client. It discovers the
service schema first, then exposes one portable search root. The element filter
is an OPTIMADE list query; it selects the Ca–Ti–O structure without relying on a
provider-specific endpoint name or database API.
from httk.atomistic import OptimadeStructure, UnitcellStructureView
from httk.serve.optimade import OptimadeStore
base_url = "http://127.0.0.1:18770"
with OptimadeStore(base_url) as store:
print("entry types", [entry_type.name for entry_type in store.entry_types])
search = store.searcher()
structure = search.variable(OptimadeStructure)
search.add(
structure.elements.has("Ca")
& structure.elements.has("Ti")
& structure.elements.has("O")
)
rows = [row for row in search.results(structure=structure)]
print("matches", len(rows))
for row in rows:
remote = row.structure
loaded = UnitcellStructureView(remote)
print("loaded", type(remote).__name__, remote.id, loaded.elements, loaded.nsites)
entry types ['structures']
matches 1
loaded OptimadeStructure d68ac9ddb91b3bee269a37683a3541bb3dddcc4a2784861cbdcbc06c17067e8b ('Ca', 'O', 'Ti') 5
The result is an OptimadeStructure, which retains the exact remote
OPTIMADE resource. UnitcellStructureView loads its structural data into the
ordinary httk atomistic interface; the conversion happens only when the view’s
properties are requested. No remote write occurs. For one known entry URL,
httk.core.fetch(url, kind="optimade") is also available, but filtered
queries use OptimadeStore as shown here.
This is the same read-only interoperability boundary as the old OMDB example, without an OMDB-specific singleton: providers publish OPTIMADE, and httk consumes the standard service.