01 - 解析并检查一个计算¶
本 Notebook 使用与快速上手相同的 water_mp2.out 样例,介绍 batch -> file -> frame 访问关系,并检查源文件实际提供的结果。运行前从文档下载样例并保存为 water_mp2.out。
In [1]:
Copied!
from pathlib import Path
from molop import AutoParser, molopconfig
molopconfig.quiet()
sample_candidates = (
Path("docs/assets/examples/water_mp2.out"),
Path("../../assets/examples/water_mp2.out"),
Path("water_mp2.out"),
)
sample_path = next((path for path in sample_candidates if path.is_file()), None)
if sample_path is None:
raise FileNotFoundError("请将 water_mp2.out 放在 Notebook 同目录,或使用文档中的样例文件。")
batch = AutoParser(sample_path, n_jobs=1)
parsed_file = batch[0]
frame = parsed_file[-1]
print("文件数:", len(batch))
print("frame 数:", len(parsed_file))
print("格式:", parsed_file.detected_format_id)
print("原子数与坐标:", len(frame.atoms), frame.coords.shape)
print("能量(hartree):", frame.energies.total_energy.m_as("hartree"))
from pathlib import Path
from molop import AutoParser, molopconfig
molopconfig.quiet()
sample_candidates = (
Path("docs/assets/examples/water_mp2.out"),
Path("../../assets/examples/water_mp2.out"),
Path("water_mp2.out"),
)
sample_path = next((path for path in sample_candidates if path.is_file()), None)
if sample_path is None:
raise FileNotFoundError("请将 water_mp2.out 放在 Notebook 同目录,或使用文档中的样例文件。")
batch = AutoParser(sample_path, n_jobs=1)
parsed_file = batch[0]
frame = parsed_file[-1]
print("文件数:", len(batch))
print("frame 数:", len(parsed_file))
print("格式:", parsed_file.detected_format_id)
print("原子数与坐标:", len(frame.atoms), frame.coords.shape)
print("能量(hartree):", frame.energies.total_energy.m_as("hartree"))
文件数: 1 frame 数: 1 格式: orcaout 原子数与坐标: 3 (3, 3) 能量(hartree): -74.999374598107
解析器将样例识别为 ORCA 输出;该样例包含一个最终 frame。
In [2]:
Copied!
import pandas as pd
from IPython.display import display
summary = batch.to_summary_df(
frame=-1,
brief=False,
flatten_columns=True,
)
with pd.option_context("display.max_columns", None, "display.max_rows", None, "display.width", 240):
display(summary)
import pandas as pd
from IPython.display import display
summary = batch.to_summary_df(
frame=-1,
brief=False,
flatten_columns=True,
)
with pd.option_context("display.max_columns", None, "display.max_rows", None, "display.width", 240):
display(summary)
| DiskStorage.FilePath | DiskStorage.FileFormat | General.Charge | General.Multiplicity | General.CanonicalSMILES | General.NumAtoms | General.FrameID | Calc Parameter.Software | Calc Parameter.Version | Calc Parameter.Method | Calc Parameter.BasisSet | Calc Parameter.Functional | Calc Parameter.Keywords | Environment.SolventModel | Environment.Solvent | Status.IsError | Status.IsNormal | Status.IsTS | Status.IsOptimized | Energy.electronic_energy.hartree | Energy.reference_energy.hartree | Energy.mp2_energy.hartree | Energy.total_energy.hartree | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | /home/runner/work/MolOP/MolOP/docs/assets/exam... | .out | 0 | 1 | O | 3 | 0 | ORCA | 6.0.1 | MP2 | sto-3g | MP2 sto-3g | None | None | False | True | False | False | -74.999375 | -74.963574 | -74.999375 | -74.999375 |
科学结果容器是可选的,读取字段前先检查容器是否存在。
In [3]:
Copied!
if frame.energies and frame.energies.total_energy is not None:
print(frame.energies.total_energy.m_as("eV"))
print("是否有振动结果:", frame.vibrations is not None)
if frame.energies and frame.energies.total_energy is not None:
print(frame.energies.total_energy.m_as("eV"))
print("是否有振动结果:", frame.vibrations is not None)
-2040.8369503966658 是否有振动结果: False
访问 rdmol 会提供分子图,并记录拓扑恢复状态。
In [4]:
Copied!
mol = frame.rdmol
print("键数:", mol.GetNumBonds())
print("拓扑状态:", frame.topology_reconstruction_status)
mol = frame.rdmol
print("键数:", mol.GetNumBonds())
print("拓扑状态:", frame.topology_reconstruction_status)
键数: 2 拓扑状态: succeeded