akaitools
akaitools parses output files from AkaiKKR, a Korringa–Kohn–Rostoker (KKR) Green's function code for electronic structure calculations. It turns raw text output into structured, fully typed Python objects without any manual text wrangling.
Key features
- Parse SCF, DOS, and BSF output files with a single function call (
parse_go,parse_dos,parse_spc) - Spin-resolved DOS with direct access via
spin_up,spin_down,get_component(), andselect() - Bloch Spectral Function intensity matrix with k-path high-symmetry labels
- Export any result to a pandas DataFrame for downstream analysis
- Built-in Matplotlib plotting for DOS and SCF convergence
- Command-line interface for quick summaries and JSON export
- Generate AkaiKKR input files from scratch or from any parsed result with
InputFile - Fully typed: all models are standard Python
dataclassobjects
Quickstart
from akaitools import parse_go
scf = parse_go("calculation.out")
print(f"Converged : {scf.converged}")
print(f"Iterations : {len(scf.iterations)}")
print(f"Total energy: {scf.iterations[-1].total_energy:.8f} Ry")
print(f"Moment : {scf.iterations[-1].moment:.4f} μB")
for prop in scf.atomic_properties:
print(f" {prop.element:<4s} charge={prop.total_charge:.3f} m={prop.spin_moment:.4f} μB")
from akaitools import parse_dos
dos = parse_dos("dos.out")
# Spin-resolved access
for comp in dos.spin_up:
print(f"Component {comp.component_index} [{comp.label}] ↑: {len(comp.energy)} points")
# Direct lookup by component index and spin
fe_up = dos.get_component(1, "up")
print(f"Energy range: {fe_up.energy[0]:.3f} – {fe_up.energy[-1]:.3f} Ry")
print(f"d-DOS max : {fe_up.d.max():.4f} states/Ry/cell")
# Export to pandas
df = dos.to_dataframe()
print(df.head())
from akaitools import parse_spc
# *_up.spc / *_dn.spc are located automatically next to the log file
spc = parse_spc("calculation.spc")
if spc.spectral_up is not None and spc.spectral_up.data is not None:
bsf = spc.spectral_up
print(f"BSF shape: {bsf.data.shape}") # (n_energy, n_kpoints)
print(f"k-labels : {bsf.kmesh.high_symmetry_indices}")
from akaitools import parse_dos, parse_go
from akaitools.plot import plot_convergence, plot_dos
scf = parse_go("calculation.out")
dos = parse_dos("dos.out")
# SCF convergence
plot_convergence(scf, field="rms_error").savefig("convergence.png", dpi=150)
# Total + d-orbital DOS, energy in eV
plot_dos(dos, ef=0.0, orbitals=["total", "d"], energy_unit="eV").savefig("dos.png", dpi=150)
# Component totals plus system total on the same axes
plot_dos(dos, orbitals=["total"], system_total=True, ef=0.0).savefig("dos_overlay.png", dpi=150)
from akaitools import InputFile, parse_go
from akaitools.models import AtomicComponent, AtomPosition, AtomType
# Build from scratch
fe = InputFile(
mode="go",
data_file="data/fe",
bravais="bcc",
a=5.27,
atom_types=[
AtomType(name="Fe", rmt=0.0, field=0.0, lmxtyp=2,
components=[AtomicComponent(anclr=26.0, conc=1.0)])
],
positions=[AtomPosition(x=0.0, y=0.0, z=0.0, atom_type="Fe")],
)
fe.write("fe.in")
# Reconstruct from a parsed result and switch to DOS mode
scf = parse_go("calculation.out")
InputFile.from_result(scf, mode="dos").write("dos.in")
Citation
We are currently preparing a preprint for publication. If you use akaitools in your research, please cite the following:
Sarıtürk, D. (2026). akaitools. Zenodo. https://doi.org/10.5281/zenodo.19874850
BibTeX: