Skip to content

XinRefinement v1.1.0 — Import XinMatch phase analysis (.xinm), self-contained project files

Choose a tag to compare

@PolyXRD PolyXRD released this 05 Nov 03:16
· 47 commits to master since this release

XinRefinement v1.1.0 — Import XinMatch phase analysis (.xinm), self-contained project files

Baseline v1.0.0 | Released alongside XinMatch 3.4.0. The refinement engine, parameter model, CLI parameters, and registration mechanism are unchanged; this release adds one import channel, one project container format, and fixes a v1.0.0 .xrp field-dropping defect.

Download

File Purpose
XinRefinement-1.1.0-setup.exe Release installer (includes registration mechanism, zh/en/ja trilingual install UI)

The internal evaluation portable package is for internal acceptance only and is not published with this Release.

Key Capabilities

Import XinMatch phase analysis (.xinm)

File → Import XinMatch Phase Analysis…. Loads three things at once, no more manual copying:

Loaded Source Notes
Pattern .xinm pattern/pattern.csv Two-column CSV, %.10g round-trip with zero error; wavelength is also passed to the canvas (d-axis conversion available immediately)
Phase CIF .xinm cifs/*.cif Cached per phase then routed through the existing _load_cif_paths, same code path as manual import
Unit cell / space group manifest Checked against CIF parsed values: if consistent, pre-fill "Phase Parameter Editor"; if significantly inconsistent (>0.1% / >0.05°), the CIF value takes precedence and a list is shown

Phases without structure (PDF2-type, or COD archives where no CIF was found) are listed as "reference only": shown in gray, not involved in refinement, with a human-readable reason, and a CIF can be manually specified to fill them in.

The import kernel core/io/xinm_import.py does not depend on Qt and is shared by GUI / CLI / library API; it includes manifest validation, version negotiation (prompts to upgrade if version exceeds supported), zip-bomb protection (512 MB decompression cap), line-by-line CSV parsing with readable errors.

Project file .xinr: self-contained zip container

Item v1.0.0 v1.1.0
Form Plain JSON, stores only external paths zip: manifest.json + pattern/ + cifs/ + result/
Move to another machine Useless if files missing Embeds pattern CSV + CIF + full refinement results by default; can still open and reproduce after moving the original files
Results Stores only R-factor summary result/refine.json (same schema as CLI --out) + navigation history; opening refills the results panel and convergence curve

Extension routing: .xinr → container; .xrp → v1.0.0 JSON, permanently read-only compatible.
Also fixes the v1.0.0 .xrp bug that dropped phase_edits (phase parameter edits disappeared after reopening the project).

Library API

capabilities() now returns xinm_import: "1", so consumers can probe the capability bit and decide whether to expose the import entry.

Validation Data

Item Result
S1 full closed loop (real COD archives 7206075 + 9001681) .xinm import → refinement Rwp 3.409617019598457, bit-identical to P0 golden; GUI one-click run-all path and "manual import same pattern/CIF" have bit-identical Rwp; save .xinr → delete temp pattern and .xinm → reopen and reproduce (rel 1e-9)
Quantification Two phases 50.03 / 49.97 wt%
S2 mixed sources COD + user CIF packed into cifs/; PDF2 phase structural=false listed as "reference only"; no ICDD-derived file inside the package
S3 exception boundaries Missing CIF member / corrupt zip / missing pattern / version=2 each give readable errors, no crash
S4 family registration XinRefinement.json and XinMatch.json manage their own; registration code algorithm interoperability unchanged
Full test suite 286 all green (259 in v1.0.0; added test_xinm_import.py 13 cases, test_project_zip.py 7 cases, etc.)

Installation and Registration

Same as v1.0.0: trilingual installer (Simplified Chinese / English / Japanese), {autopf}\XinRefinement; on first launch the release build prompts "unregistered" (can enter registration code); internal evaluation build needs no registration. The registration code is interoperable with the XinMatch family—the same code works for both software.

Build and Binary Acceptance (six rounds)

Round Result Measured
1 · Reproducible build ✅ Two consecutive builds from the same source, XinRefinement.exe / XinRefinementCLI.exe byte-identical: a2c9fcc80b0f291e… / 7d1ed1ec7efc8642… (SOURCE_DATE_EPOCH + PYTHONHASHSEED=0)
2 · CLI cold start ✅ Both variants print XinRefinement 1.1.0, no missing DLLs
3 · CLI end-to-end ✅ Both variants refine v50_wide.xy anatase.cif rutile.cif --peak-height → rwp = 3.409617, 2 phases, success = true (synthetic pattern is peak-height basis, so --peak-height is needed; without it, integral basis gives rwp = 5.935965, bit-identical to source)
4 · GUI smoke 🟡 offscreen pass Offscreen launch + self-check JSON: release {release, registration_enabled: true, unregistered}, internal {internal, false, internal evaluation build}; double-click visual inspection still needs human
5 · Install/uninstall ✅ silent Silent install 606 files → installed --version normal → silent uninstall leaves 0 residue; Chinese install UI needs human visual check. (Installer requires admin by default; non-interactive environment cannot escalate privilege to re-verify; since build is reproducible and setup.exe SHA-256 is byte-identical to last round, last round's conclusion still holds)
6 · Dual-variant difference ✅ Tagged release / internal; setting XINREFINEMENT_VARIANT=internal on the release build still reports release (anti-bypass)

Release artifacts:

File Bytes SHA-256
XinRefinement-1.1.0-setup.exe 67,586,555 046179e6f3ef45d651b241b41dafb273990b423667bc066e5eba2b3982a44926
XinRefinement-internal-1.1.0-portable.zip 113,946,723 a9012229b268bae36741bbd7cd9d5782ecf55a814ea907d4b39dded701db09d1

Known Notes

  • The release build .xinr embeds CIF and pattern, so the project file is larger than v1.0.0's .xrp (pattern stored as CSV text, ~2 MB per 100k points). Save as .xrp when you want the old "store paths only" behavior.
  • .xrp is read-only compatible, not written back: opening an old file and saving again will write JSON or container based on the extension.
  • The frozen package has no pyproject.toml; the version comes from the literal constant in xinrefinement/__init__.py (__version__ = "1.1.0"), not from the runtime environment's install metadata.
  • Not code-signed: on first run Windows SmartScreen may warn "Unknown publisher".

License

Same as v1.0.0: see repository root LICENSE / LICENSE-CN (same source as XinMatch).