A practical toolkit for Many-Body Expansion (MBE) workflows: cluster design, MBE input generation, output parsing, and analysis.
Project description
mbe-tools
mbe-tools is a Python package that covers the full Many-Body Expansion (MBE) loop:
- Cluster design: read
.xyz, extract fragments, and sample subsets (with optional ion retention). - MBE job prep: generate subset geometries, build Q-Chem/ORCA inputs, and emit PBS/Slurm job scripts (with optional chunked submission).
- Parsing: read ORCA / Q-Chem outputs, infer method/basis/grid metadata from paths or companion inputs, and write JSONL.
- Analysis: inclusion–exclusion MBE(k), summaries, CSV/Excel export, and basic plots.
Status: 0.1.0 (MVP). Backend syntax (e.g., ghost atoms) may need local tweaks.
What changed (P0–P5)
- P0: Settings loader and precedence (
mbe.toml, env vars) for commands/modules/scratch/queue hints. - P1: Parser auto-detects program and infers method/basis/grid metadata from paths; emits detection + error tags.
- P2: Spatial fragment sampling mode with centroid-based compact selection and ion retention.
- P3: Connectivity-driven fragmentation and fragment labeling (water/methanol/ethanol/benzene/ions).
- P4: Tunable MBE params and input builders (thresh/tole/scf, grid) exposed in CLI.
- P5: Run-control for PBS/Slurm templates (regex confirmation, retries/cleanup, optional delete, state JSON).
Install (editable for development)
cd mbe-tools
python -m pip install -e .[analysis,cli]
Global settings (P0)
Configure default commands/modules/scratch once and reuse across CLI calls. Precedence (lowest → highest): environment variables → ~/.config/mbe-tools/config.toml → ./mbe.toml → explicit path passed to load_settings(path=...).
Supported keys: qchem_command, orca_command, qchem_module, orca_module, scratch_dir, scheduler_queue, scheduler_partition, scheduler_account.
Environment variable map: MBE_QCHEM_CMD, MBE_ORCA_CMD, MBE_QCHEM_MODULE, MBE_ORCA_MODULE, MBE_SCRATCH, MBE_SCHED_QUEUE, MBE_SCHED_PARTITION, MBE_SCHED_ACCOUNT.
Minimal mbe.toml example (edit paths/modules to your site):
qchem_command = "/opt/qchem/bin/qchem"
orca_command = "/opt/orca/bin/orca"
qchem_module = "qchem/5.2.2"
orca_module = "orca/5.0.3"
scratch_dir = "/scratch/${USER}"
scheduler_queue = "normal" # PBS
scheduler_partition = "work" # Slurm
scheduler_account = "proj123"
Quickstart
1) Parse an XYZ and fragment it
from mbe_tools.cluster import read_xyz, fragment_by_water_heuristic, fragment_by_connectivity
xyz = read_xyz("Water20.xyz")
frags = fragment_by_water_heuristic(xyz, oh_cutoff=1.25)
print(len(frags), "fragments (water heuristic)")
# Connectivity + labeling (water/methanol/ethanol/benzene/ions)
frags_conn = fragment_by_connectivity(xyz, scale=1.2)
print(len(frags_conn), "fragments (connectivity)")
2) Randomly sample N fragments and write a new XYZ
from mbe_tools.cluster import sample_fragments, write_xyz
picked = sample_fragments(frags, n=10, seed=42)
write_xyz("Water10_sample.xyz", picked)
3) Generate MBE geometries (subsets)
from mbe_tools.mbe import MBEParams, generate_subsets_xyz
params = MBEParams(max_order=3, cp_correction=True, backend="qchem")
subset_jobs = list(generate_subsets_xyz(frags, params))
# subset_jobs yields (job_id, subset_frag_indices, xyz_text)
4) Build inputs (Q-Chem/ORCA)
Prepare a geometry block file (e.g., water.geom), then:
mbe build-input water.geom --backend qchem --method wb97m-v --basis def2-ma-qzvpp --out water_qchem.inp
mbe build-input water.geom --backend orca --method wb97m-v --basis def2-ma-qzvpp --out water_orca.inp
5) Emit scheduler templates (PBS/Slurm)
mbe template --scheduler pbs --backend qchem --job-name mbe-qchem --chunk-size 20 --out qchem.pbs
mbe template --scheduler slurm --backend orca --job-name mbe-orca --partition work --chunk-size 10 --out orca.sbatch
Run-control (P5) is baked into the emitted templates (行为概要/可执行规范):
- Detects control files named
<input>.mbe.control.tomlormbe.control.toml. - Temporary log per attempt: writes
job._try.out; on failure renames tojob.attemptN.out; on success renames tojob.out. - Supports regex confirmation on the temporary log (default path above unless
confirm.log_pathoverrides), retries with cleanup/sleep, and state tracking in.mbe_state.json. - Can optionally delete inputs/outputs on success (guarded by
allow_delete_outputs).
Example control file:
version = 1
[confirm]
regex_any = ['TOTAL ENERGY', 'Energy\s+=']
regex_none = ['SCF failed', 'Error']
[retry]
enabled = true
max_attempts = 2
sleep_seconds = 5
cleanup_globs = ["temp*", "Scratch/*"]
write_failed_last = true
[state]
skip_if_done = true
[delete]
enabled = false
allow_delete_outputs = false
6) Parse outputs to JSONL
mbe parse ./Output --program auto --glob "*.out" --out parsed.jsonl
# 若目录全是同一程序,可显式指定 --program qchem 或 --program orca 以跳过检测、略微提速
7) Analyze JSONL to CSV/Excel + plot
mbe analyze parsed.jsonl --to-csv results.csv --to-xlsx results.xlsx --plot mbe.png
-## CLI
After installing with [cli], you get a mbe command. Key commands and parameters (defaults in []):
-
mbe fragment <xyz_path>→ fragment + sample → write XYZ(当前 CLI 使用水启发式;连接性/标签请参考 Quickstart 的 Python 示例,后续 CLI 将补齐)--out-xyz [sample.xyz]output path--n [10],--seed [None]--require-ion [False]ensure at least one special/ion if present--mode [random|spatial]; spatial extras:--prefer-special [False],--k-neighbors [4],--start-index [None]--oh-cutoff [1.25]water heuristic O–H cutoff
-
mbe gen <xyz_path>→ MBE subset geometries--out-dir [mbe_geoms],--max-order [2],--orders/--order(repeatable),--cp/--no-cp [cp],--scheme [mbe],--backend [qchem|orca],--oh-cutoff [1.25]
-
mbe build-input <geom>→ render Q-Chem/ORCA input- Common:
--backend [qchem],--method (required),--basis (required),--charge [0],--multiplicity [1] - Q-Chem:
--thresh,--tole,--scf-convergence,--rem-extra - ORCA:
--grid,--scf-convergence,--keyword-line-extra --out [job.inp]
- Common:
-
mbe template→ PBS/Slurm scripts with run-control wrapper- Common:
--scheduler [pbs|slurm],--backend [qchem|orca],--job-name [mbe-job],--walltime [24:00:00],--mem-gb [32.0],--chunk-size [None],--module [auto per backend],--command [override binary],--out [job.sh] - PBS+qchem:
--ncpus [16],--queue,--project - Slurm+orca:
--ncpus [16](cpus-per-task),--ntasks [1],--partition,--project(account),--qos
- Common:
-
mbe parse <root>→ outputs → JSONL--program [auto|qchem|orca],--glob-pattern ["*.out"],--out [parsed.jsonl],--infer-metadata [True]
-
mbe analyze <parsed.jsonl>→ summaries/exports--to-csv,--to-xlsx,--plot--scheme [simple|strict],--max-order [None]
Run mbe <command> --help for complete details.
mbe analyze– compute MBE(i), ΔE, CPU time summaries → csv/xlsx/plot (simple mean or strict inclusion–exclusion)
Run help:
mbe --help
mbe fragment --help
Filename convention for subset metadata
Generated job IDs now include order and 0-based fragment indices plus a hash for stability. Use one canonical pattern to avoid ambiguity:
- Recommended:
{backend}_k{order}_f{i1}-{i2}-{i3}_{cp|nocp}_{hash}with 0-based indices in the name (zero-padding allowed), e.g.qchem_k2_f000-003_cp_deadbeef.out. - Legacy (still parsed):
{backend}_k{order}_{i1}.{i2}..._{hash}treated as 1-based indices in the string but converted to 0-based internally.
JSON outputs always expose subset_indices as 0-based. If you keep 1-based names for human readability, be aware the parser will convert them to 0-based fields.
Data model (JSONL)
Each parsed calculation becomes one JSON object per line. Key fields surfaced by mbe parse:
{
"job_id": "qchem_k2_f000-003_cp_deadbeef",
"program": "qchem",
"program_detected": "qchem",
"status": "ok",
"error_reason": null,
"path": ".../job.out",
"energy_hartree": -458.7018184,
"cpu_seconds": 1234.5,
"wall_seconds": 1234.5,
"method": "wB97M-V",
"basis": "def2-ma-QZVPP",
"grid": "SG-2",
"subset_size": 2,
"subset_indices": [0, 2],
"cp_correction": true,
"extra": {}
}
program_detectedis auto-set by the parser implementation;programis the requested parser backend.statusis set to"ok"when energy is parsed successfully;error_reasoncarries a short tag if parsing fails.wall_secondsis parsed for ORCA runtime blocks and falls back tocpu_secondswhen only CPU time is available.
Extending / customizing
- Add or override parsers in
mbe_tools/parsers/* - Adjust ghost-atom formatting in
mbe_tools/backends/* - Add new metrics in
mbe_tools/analysis.py
Sample notebook
A lightweight walkthrough lives at notebooks/sample_walkthrough.ipynb showing how to:
- build Q-Chem/ORCA inputs from a geometry block,
- generate PBS/Slurm templates,
- assemble MBE(k) energies from synthetic data.
License
MIT
API reference (Python) — functions与缺省行为
Cluster helpers (src/mbe_tools/cluster.py)
read_xyz(path): 严格读取 XYZ,坏行/数量直接报错。write_xyz(path, fragments, comment="Generated by mbe-tools"): 扁平化所有片段写出,默认注释。fragment_by_water_heuristic(xyz, oh_cutoff=1.25): 每个 O 选最近的两颗 H(<=cutoff)成水分子;剩余原子各自成单原子片段并标记special=True。fragment_by_connectivity(xyz, scale=1.2): 共价半径×scale 建立键,连通分量即片段;自动标签 water/methanol/ethanol/benzene/ions,否则 unknown。sample_fragments(fragments, n, seed=None, require_ion=False): 随机采样n;当require_ion=True且存在 special 片段时强制包含至少一个。spatial_sample_fragments(fragments, n, seed=None, prefer_special=True, k_neighbors=4, start="random", start_index=None): 基于质心的贪心紧凑采样;默认偏向 special,起点随机(或start="special"用第一个特殊片段)。
MBE generation (src/mbe_tools/mbe.py)
MBEParams(max_order=2, orders=None, cp_correction=True, backend="qchem", charge=0, multiplicity=1, scheme="mbe", thresh=None, tole=None, scf_convergence=None):参数容器。generate_subsets_xyz(fragments, params, orders=None): 目标阶次默认params.orders,缺省为1..max_order;非子集原子在cp_correction=True时转 ghost;- job_id 模式
{backend}_k{order}_{1-based-indices}_{md5}(md5 前缀可复现)。
- job_id 模式
qchem_molecule_block(geom_block, charge=0, multiplicity=1)/orca_xyz_block(geom_block):包裹坐标块。
Input builders (src/mbe_tools/input_builder.py)
render_qchem_input(geom_block, method, basis, charge=0, multiplicity=1, thresh=None, tole=None, scf_convergence=None, rem_extra=None): 可选项为None时不写出,rem_extra行按原样附在$rem。render_orca_input(geom_block, method, basis, charge=0, multiplicity=1, grid=None, scf_convergence=None, keyword_line_extra=None): 头行!追加可选 token(grid/SCF/附加关键字)。build_input_from_geom(geom_path, backend, ...): 读取坐标并分派到 Q-Chem/ORCA 渲染;未知 backend 抛错。
HPC templates & run-control (src/mbe_tools/hpc_templates.py)
render_pbs_qchem(job_name, walltime="24:00:00", ncpus=16, mem_gb=32.0, queue=None, project=None, module="qchem/5.2.2", input_glob="*.inp", chunk_size=None): chunk 模式每批写子 PBS 并qsub;默认加载模块、设置NCPUS/MEM。render_slurm_orca(job_name, walltime="24:00:00", ntasks=1, cpus_per_task=16, mem_gb=32.0, partition=None, account=None, qos=None, module="orca/5.0.3", command="orca", input_glob="*.inp", chunk_size=None): 类似逻辑,默认OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}。- 两者都会生成
run_with_control:优先<input>.mbe.control.toml,否则mbe.control.toml;WRAPPER_LOG默认.mbe_wrapper.log;命令默认QC_CMD=qchem、ORCA_CMD=orca。 - Run-control 缺省(无控制文件):不做正则确认,重试/删除关闭,状态文件
.mbe_state.json默认跳过,严格模式关闭。存在控制文件时:- 每次尝试先写
job._try.out,失败重命名为job.attemptN.out,成功重命名为job.out;可用confirm.log_path改写临时日志路径。 confirm.regex_any/regex_none决定成功判断。retry.enabled/max_attempts/sleep_seconds/cleanup_globs/write_failed_last控制重试与清理。delete.enabled+allow_delete_outputs才会删输出;输入删除受delete_inputs_globs。state.skip_if_done默认 true,会在.mbe_state.json记录done/failed、尝试次数、日志路径。- 解析失败且
template.strict=true时直接退出,否则回落到默认配置并记录警告。
- 每次尝试先写
Parsing (src/mbe_tools/parsers/io.py)
detect_program(text): 返回qchem/orca/unknown。glob_paths(root, pattern): 排序后的 glob 结果。infer_metadata_from_path(path): 从文件名推断subset_size(ktoken)、subset_indices(推荐 f-token 0-based;旧式点分视为 1-based 再转 0-based)、cp_correction,以及常见 method/basis/grid(可缺省)。parse_files(paths, program, infer_metadata=True):program="auto"时按内容检测;指定qchem/orca时跳过检测更快更稳。默认infer_metadata=True会套用路径推断,并在需要时尝试配套输入文件.inp/.in填充 method/basis/grid;设置program_detected/status/error_reason。
Analysis helpers (src/mbe_tools/analysis.py)
read_jsonl(path): 读取非空行 JSON。to_dataframe(records): 需要 pandas(mbe-tools[analysis])。summarize_by_order(df): 按subset_size汇总 count/min/max/CPU 总和与均值。compute_delta_energy(df, reference_order=1): 相对参考阶次的能量差列。strict_mbe_orders(records, max_order=None): 用assemble_mbe_energy做包含–排除,返回行列表和缺失子集列表。
Examples (Python)
Fragment, generate subsets, build inputs
from mbe_tools.cluster import read_xyz, fragment_by_water_heuristic, sample_fragments
from mbe_tools.mbe import MBEParams, generate_subsets_xyz
from mbe_tools.input_builder import render_qchem_input
xyz = read_xyz("Water20.xyz")
frags = fragment_by_water_heuristic(xyz)
picked = sample_fragments(frags, n=10, seed=7)
params = MBEParams(max_order=2, cp_correction=True, backend="qchem")
job_id, subset, geom = next(generate_subsets_xyz(picked, params))
inp_text = render_qchem_input(geom, method="wb97m-v", basis="def2-ma-qzvpp")
with open(f"{job_id}.inp", "w", encoding="utf-8") as f:
f.write(inp_text)
Generate job scripts
from mbe_tools.hpc_templates import render_pbs_qchem, render_slurm_orca
pbs = render_pbs_qchem(job_name="mbe-qchem", chunk_size=20)
slurm = render_slurm_orca(job_name="mbe-orca", partition="work", chunk_size=10)
Parse outputs and compute MBE(k)
from mbe_tools.parsers.io import glob_paths, parse_files
from mbe_tools.mbe_math import assemble_mbe_energy
paths = glob_paths("./Output", "*.out")
records = parse_files(paths, program="qchem", infer_metadata=True)
mbe = assemble_mbe_energy(records, max_order=2)
print(mbe["order_totals"]) # {1: ..., 2: ...}
Project details
Release history Release notifications | RSS feed
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 mbe_tools-0.1.0.tar.gz.
File metadata
- Download URL: mbe_tools-0.1.0.tar.gz
- Upload date:
- Size: 56.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b6a081de6ac760f7c8b55dfe8b0faf9fbd5a7690c1d4b58e3ca6d993baa58c60
|
|
| MD5 |
3f48a182f8ac279fe4f94c256a99d22b
|
|
| BLAKE2b-256 |
7de9d190b1c251ac2f7c0356751b3145691cf581b4aa0e94eb78cc3d3194e9eb
|
File details
Details for the file mbe_tools-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mbe_tools-0.1.0-py3-none-any.whl
- Upload date:
- Size: 33.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91fb2ec5a06d68512b9a8dd28958c56b4dc9f1992d0ae3804bfaf65d27501a13
|
|
| MD5 |
fd3e9a5c2cfc9ecd8653befde28e27eb
|
|
| BLAKE2b-256 |
406e262061bdf21c4a108e3086e3d59b3b9e43ce4ef849af052d057d03079439
|