crystal-scene
crystal-scene converts one CIF string or a pymatgen Structure into a deterministic,
renderer-neutral Pydantic scene. It resolves bonds and periodic images on the backend
so HSC, Materiae, and other consumers can draw the same scientific structure consistently.
The package consumes source-neutral values from matdomain-structure and owns
only renderer-facing scene derivation.
The package intentionally does not depend on Crystal Toolkit, Dash, a database, or a frontend framework.
Python 3.12 or newer is required.
Installation
Install the published distribution with:
pip install crystal-scene
From a matdomain checkout, install both workspace distributions into an active
environment:
python -m pip install -e ./packages/matdomain-structure -e ./packages/crystal-scene
Usage
from pathlib import Path
from crystal_scene import build_crystal_scene
cif_text = Path("structure.cif").read_text(encoding="utf-8")
scene = build_crystal_scene(cif_text)
payload = scene.model_dump(mode="json")
build_crystal_scene also accepts a pymatgen Structure. Structure inputs are copied,
then fractional coordinates along periodic lattice axes are wrapped into the input unit
cell; nonperiodic axes retain their input values and callers are not mutated. CIF input
must contain exactly one non-empty structure. Blank input, parser errors, multiple
structures, and empty structures raise ValueError or a pymatgen parser exception.
JSON contract
scene.model_dump(mode="json") is the canonical TypeScript-facing payload. Field names
are camel case and schemaVersion is currently "1.0". A payload contains:
generator: the CrystalNN implementation, exact pymatgen and pymatgen-core versions, disorder policy, and whether every input species has an oxidation state;lattice.matrix: three row vectors in angstroms;sites: stable input-cell indices, source labels, full species occupancies and oxidation states, and wrapped fractional coordinates;siteImages: every input-cell site plus the one-hop periodic site images needed as endpoints of the emitted bonds;bonds: each input-cell site's complete CrystalNN neighbor view, including distance in angstroms and CrystalNN topology weight.
A physical CrystalNN bond is undirected. Each serialized bond anchors one view of that
connection at sourceSite in the input cell, while targetImage translates targetSite
by an integer linear combination of the three lattice rows. The reverse neighbor view is
also emitted, so every input-cell site retains its complete coordination environment. In
fractional coordinates, the anchored bond vector is:
sites[targetSite].fractional + targetImage - sites[sourceSite].fractional
Swapping the source and target therefore also requires negating targetImage. Renderers
can materialize siteImages directly and deduplicate coincident undirected segments.
Distinct images remain distinct connections, including bonds from a site to its own
periodic images.
For disordered sites, the scene always retains every species and occupancy. CrystalNN
uses pymatgen's take_max_species policy only to choose a representative species for
bond inference; equal maximum occupancies use pymatgen's deterministic first-maximum
behavior. Isotope mass numbers and idealized species spin are accepted as structure
identity, while scene schema 1.0 retains its legacy projection of element, occupancy,
and oxidation state only.
The input cell is preserved deliberately. Primitive, conventional, refined, or reduced
cells change site indices and may depend on symmetry tolerances, so they are not implicit
view switches in schema 1.0. Callers that need another cell must supply that pymatgen
Structure explicitly.
Colors, atomic radii, bond-cylinder dimensions, boundary-face duplicates, incomplete-bond
stubs, labels, and camera state are renderer policy and are not scene data. Magnetic
moments and coordination polyhedra are not part of scene schema 1.0: moments require an
explicit basis/unit contract, while polyhedra are derived geometry that renderers can
construct from the complete neighbor topology when needed. CrystalNN weight is a
method-specific topology value (and is normally 1 in the default unweighted mode), not
a chemical bond order.
The project is distributed under the terms of the MIT License. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file crystal_scene-0.1.1.tar.gz.
File metadata
- Download URL: crystal_scene-0.1.1.tar.gz
- Upload date:
- Size: 9.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bee880242d1ff399a3b796322cb7b184c9303b23795bff9185594f455a912baf
|
|
| MD5 |
4287b6d9fa9f06db8bc7040e4116477c
|
|
| BLAKE2b-256 |
67ca409a12fb1cf8136afe7291685795257afbeeda937f2fc5de17c3c84000ae
|
Provenance
The following attestation bundles were made for crystal_scene-0.1.1.tar.gz:
Publisher:
publish.yml on tiannianzhu/matdomain
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
crystal_scene-0.1.1.tar.gz -
Subject digest:
bee880242d1ff399a3b796322cb7b184c9303b23795bff9185594f455a912baf - Sigstore transparency entry: 2656576115
- Sigstore integration time:
-
Permalink:
tiannianzhu/matdomain@2d454fac177a0ef2a1ea47fc43d2b75dbda0db12 -
Branch / Tag:
refs/tags/crystal-scene-v0.1.1 - Owner: https://github.com/tiannianzhu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2d454fac177a0ef2a1ea47fc43d2b75dbda0db12 -
Trigger Event:
release
-
Statement type:
File details
Details for the file crystal_scene-0.1.1-py3-none-any.whl.
File metadata
- Download URL: crystal_scene-0.1.1-py3-none-any.whl
- Upload date:
- Size: 7.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f4c4727ac0a0a3422b05bf18d3a8644337b77ac617ffd99a4478885da3872b6
|
|
| MD5 |
6986e5e62cf5d38db6e681f108fc6ea1
|
|
| BLAKE2b-256 |
18c5cd6c43af64b15f4a9ebb08313b6a0ca3d6e08902d87dd52f66bc26a590d1
|
Provenance
The following attestation bundles were made for crystal_scene-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on tiannianzhu/matdomain
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
crystal_scene-0.1.1-py3-none-any.whl -
Subject digest:
6f4c4727ac0a0a3422b05bf18d3a8644337b77ac617ffd99a4478885da3872b6 - Sigstore transparency entry: 2656576174
- Sigstore integration time:
-
Permalink:
tiannianzhu/matdomain@2d454fac177a0ef2a1ea47fc43d2b75dbda0db12 -
Branch / Tag:
refs/tags/crystal-scene-v0.1.1 - Owner: https://github.com/tiannianzhu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2d454fac177a0ef2a1ea47fc43d2b75dbda0db12 -
Trigger Event:
release
-
Statement type: