# Ingesting source data Before you can run anything you need to read source files — CIFs from a database, POSCARs from an earlier project, outputs from a finished run. In httk v1 loading dispatched to a patchwork of format backends, some of them external command-line tools configured in `httk.cfg`. In *httk₂* there is one entry point, the readers are pure Python, and dispatch is by filename. ## One entry point `httk.core.load(path)` returns the file's native representation: a CIF loads as an asymmetric-unit structure, a POSCAR as a unit-cell structure. Compressed files decompress transparently, and dispatch is on the extension or exact basename, case-insensitively. ```python from httk.core import load structure = load("example.cif") # CIF -> ASUStructure # POSCAR, CONTCAR, and "CONTCAR.bz2" work too; POSCAR -> UnitcellStructure. print("Formula:", structure.formula) print("Volume:", float(structure.cell.volume)) ``` To expand an asymmetric unit to a full unit cell, or to get the lazy view form, construct the view explicitly: ```python from httk.atomistic import UnitcellStructureView unitcell = UnitcellStructureView(load("example.cif")) unitcell = UnitcellStructureView("example.cif") # equivalent, lazy ``` For a remote source, `httk.core.fetch(url)` takes a plain URL string and is itself the explicit network consent. The lazy view/loader path instead gates remote access with a `DatastreamURL` token — for example `UnitcellStructureView(DatastreamURL(url))`. New formats are added by modules through `register_reader`; `httk-atomistic` registers the CIF/mCIF, POSCAR, OUTCAR, and WAVECAR readers among others. The ASE bridge works both directions (`UnitcellStructureView(atoms)` and `ASEAtomsView(structure)`), and a pymatgen bridge lives in `httk.atomistic`. ```{admonition} In httk v1 :class: note `httk.load()` existed, but it dispatched to per-format backends — `httk.atomistic.atomisticio.cif_to_struct(filename, backends=['internal', 'cif2cell', 'ase', 'platon'])` for CIFs, `httk.iface.vasp_if.poscar_to_structure()` for POSCARs. The pure-Python `internal` backend came first; the external tools (`cif2cell`, `ase`, `platon`) were optional fallbacks, used only if installed and configured in `httk.cfg` under `[paths]`. *httk₂* readers are pure Python, registered, and chosen by filename with no external-tool configuration. ``` ```{admonition} In httk v1 :class: note You may have loaded through the class method `Structure.io.load("example.cif")`. The *httk₂* equivalent is `UnitcellStructureView(load(path))` (or passing the path straight to the view). See {doc}`../structures` for the current structure vocabulary — views, asymmetric units, and where exact geometry becomes a float. ``` ## Into a database The same source directory can become a queryable DuckDB *httk-store* database. `UnitcellStructureView` normalizes each CIF-native asymmetric unit to the unit-cell representation declared for the `structures` entry family: ```python from pathlib import Path from httk.atomistic import StructureEntry, UnitcellStructureRecord, UnitcellStructureView from httk.core import load from httk.store import Backend, EntryIdScheme, SqlStore db = Backend.duckdb("source.duckdb") store = SqlStore( db, entry_records={StructureEntry: UnitcellStructureRecord}, entry_ids=EntryIdScheme("httk.source", "1"), ) count = 0 with store.transaction(): for path in sorted(Path("structures").glob("*.cif")): structure = UnitcellStructureView(load(path)) store.save(structure) count += 1 print(f"Stored {count} structures") ``` Records are content-addressed and deduplicated, so re-running the ingest is idempotent. The same store can later receive calculation results; see {doc}`06-database`. ```{admonition} In httk v1 :class: note The comparable habit was `store.save(struct)` on `httk.db.store.SqlStore`; *httk₂* keeps the save operation but declares the durable structure representation when the store is first opened. ``` ## Read next - {doc}`../structures` — structures and file formats at ecosystem level. - {doc}`../tutorial/01-load-structure` — load and inspect a structure in one call. - {doc}`../tutorial/04-ase` — the ASE bridge in both directions. - — `register_reader` and the neutral registration pattern. - — the structure model and views. - and — the POSCAR and VASP output readers.