feat(pl): phonon, pourbaix, neb, rdf_msd, wulff and chempot renderers - #24
Merged
Starlitnightly merged 2 commits intoSep 12, 2026
Merged
Conversation
Six analysis namespaces deposited data mv.pl could not draw, so agents fell
back to raw matplotlib. Each renderer reads the slot its producer writes,
takes md/level/ax, returns the Axes, puts units on the axes and the level of
theory in the title, uses Okabe-Ito for series and viridis for the one
surface, and raises a ValueError naming the producer when its slot is absent.
- mv.pl.phonon reads obsm['phonon_dos_{level}'] + uns['grids']['phonon_dos']
(method, supercell) and obs['n_imaginary_modes_{level}'];
dispersion= takes the mv.prop.dispersion bands object and
shares the frequency axis (DOS drawn sideways).
- mv.pl.pourbaix reads uns['pourbaix'] maps/ph_grid/potential_grid and
obs['pourbaix_decomposition']; water window, threshold
contour (0.5 eV/atom), evaluated point.
- mv.pl.neb reads obsm['neb_profile_{level}'] + grid 'neb_profile',
obs['neb_converged_{level}']; barrier annotated, unconverged
bands dashed.
- mv.pl.rdf_msd reads obsm['rdf_md_{rdf_level}'], ['coordination_md_..'],
obs['first_shell_..'], obsm['md_msd_trace_{level}'] + grid,
obs['diffusivity_{level}']; 6Dt slope drawn where fitted.
- mv.pl.wulff reads uns['wulff'][level][name] vertices/face_index/
face_miller/area_fractions; 3D polyhedron by Miller family.
- mv.pl.chempot reads uns['chempot_diagram'] (segments for a binary,
polygons for a ternary, artificial floor cut where the
title says); kind='window' reads uns['chempot_limits'].
Three producers deposited nothing drawable and are extended minimally:
- mv.md.run keeps the MSD trace it already fitted D to, as
obsm['md_msd_trace_<level>'] on the same ps grid as the temperature
trace (replaced together on a rerun of different length); both traces
are now claimed in produces.
- mv.surf.wulff stores the polyhedron as three h5ad-writable arrays plus
the per-family area fractions, and the bulk.uns['wulff'] claim the README
recorded as "never written" is restored because it now is.
- mv.thermo.pourbaix evaluates the decomposition energy over a pH/E mesh
(ph_range=, potential_range=, n_grid=) on the diagram it already fetched
and stores it in uns['pourbaix']['maps'].
Tests: tests/test_pl_<name>.py for each (real EMT producers where they run
offline, synthetic deposits in the producer's own shape for Pourbaix),
probe cases in tests/_contract_cases.py so every new requires claim is
checked by deletion, and a tutorial code cell per function so
test_notebook_coverage stays green. 3D collections bypass matplotlib's
autolim, which produced infinite limits on NaN-padded ragged faces.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
pymatgen's elemental price table is read through bibtexparser's v1 API (bibtexparser.bparser); v2 removed it and pymatgen does not constrain the version, so the Python 3.10 job resolved 2.0.1 and eight pre-existing tests (mv.prop.cost, prototype matching) failed at import while 3.11/3.12 happened to resolve 1.x. Pin it in the dev extra the workflow installs. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Starlitnightly
deleted the
feat/pl-phonon-pourbaix-neb-md-wulff-chempot
branch
September 12, 2026 17:35
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Six plots the analysis namespaces produced data for and
mv.plcould not drawAgents fell back to raw matplotlib for these. Each renderer is
@registered with arequirescontract the probe battery checks by deletion, takesmd/level/ax, returns the Axes, puts units on the axes and the level of theory in the title, uses Okabe–Ito for series (viridis for the one surface), and raises aValueErrornaming the producer when its slot is absent.mv.pl.phononobsm['phonon_dos_{level}'],uns['grids']['phonon_dos'](method, supercell),obs['n_imaginary_modes_{level}'];dispersion=takes themv.prop.dispersionbands object on a shared frequency axismv.pl.pourbaixuns['pourbaix']→maps[name],ph_grid,potential_grid,ph,potential;obs['pourbaix_decomposition']mv.pl.nebobsm['neb_profile_{level}']+ gridneb_profile,obs['neb_converged_{level}']mv.pl.rdf_msdobsm['rdf_md_{rdf_level}'],obsm['coordination_md_{rdf_level}'],obs['first_shell_{rdf_level}'],obsm['md_msd_trace_{level}']+ grid,obs['diffusivity_{level}']mv.pl.wulffuns['wulff'][level][name]→vertices,face_index,face_miller,area_fractions,anisotropymv.pl.chempotuns['chempot_diagram'](elements,domains[*].vertices);kind='window'readsuns['chempot_limits']Three producers deposited nothing drawable, extended minimally
mv.md.runkeeps the MSD trace it already fitted D to, asobsm['md_msd_trace_<level>']on the same picosecond grid as the temperature trace (replaced together on a rerun of a different length). Both traces are now claimed inproduces.mv.surf.wulffstores the polyhedron as three h5ad-writable arrays (vertices (n,3),face_index (n,),face_miller) plus per-familyarea_fractions. Thebulk.uns['wulff']claim the README recorded as "never written" is restored — it now is, and the plot depends on it. README row updated.mv.thermo.pourbaixevaluates the decomposition energy over a pH/E mesh (ph_range=,potential_range=,n_grid=) on the diagram it already fetched per material and stores it inuns['pourbaix']['maps']. Still network-gated, still inUNPROBEABLE.Tests
tests/test_pl_{phonon,pourbaix,neb,rdf_msd,wulff,chempot}.py— real EMT producers where they run offline; the Pourbaix map is synthetic in the producer's own shape.tests/_contract_cases.py(aqueous,barred,diffusing,chempot_mapped,wulffed), sotest_no_claim_goes_unprobedstays green.nb_getting_started,nb_screening,nb_defects_and_diffusion— replaces themv.pl.spectraNEB workaround —,nb_dynamics,nb_surfaces_and_adsorption), sotest_notebook_coveragestays green.main: 914 passed, 143 skipped; +32 new tests, +1 mp-api-gated skip).3D collections bypass matplotlib ≥ 3.10's
autolim, which produced infinite limits on the NaN-padded ragged face array under pytest; both callers set limits themselves.🤖 Generated with Claude Code