将 Melo-1 虚拟筛选结果生成为交互报告,即可在浏览器中比较候选排名、按指标排序和筛选,并查看各候选的三维结构与置信度。报告保存为一个 HTML 文件,支持离线打开和分享。
准备好报告模板和完整结果 ZIP,即可按下方步骤生成报告。
下载模板
curl --fail --location \
'https://www.atomelody.com/templates/atomelody-virtual-screening-report-template.html' \
--output atomelody-virtual-screening-report-template.html
本模板支持 Melo-1 虚拟筛选的完整结果 ZIP。请保留包内的 summary.csv 和各候选结果 ZIP,无需提前解压。
单个结构预测任务请使用结构预测报告模板。
生成报告
- 按虚拟筛选使用指南获取任务结果,通过
output_url下载完整 ZIP。下载地址过期时,请重新查询任务。 - 下载上方报告模板,与结果 ZIP 放在同一目录。
- 运行下方 Python 示例,生成报告 HTML。如需显示模型、任务名称和输入,可同时准备任务详情。
- 用浏览器打开生成的 HTML,确认候选排名、结构和置信度展示正常后即可分享。
分享报告会同时分享其中的结果和已添加的任务信息。请勿将 API Key 或临时下载地址写入报告。
数据槽约定
以下约定供自行编写生成脚本时参考;直接使用下方 Python 示例时,无需手动修改模板。
<script id="reportData" type="application/json">null</script>
将 null 替换为 JSON 对象,唯一必需字段为 archiveBase64:
{"archiveBase64":"完整筛选 ZIP 的 Base64 内容"}
| 可选字段 | 用途 |
|---|---|
taskId | 任务 ID,省略时不展示 |
taskName | 任务名称,显示为报告顶部标题;省略时使用 ZIP 文件名(不含扩展名) |
model | 模型名称,显示在报告顶部;省略时不展示 |
input | 原始任务输入 JSON 对象,默认收起,可在报告中展开查看;省略时不显示输入折叠区 |
archiveName | 导出 ZIP 的文件名,不包含目录;省略时使用 <taskId>-output.zip,没有有效任务 ID 时使用 output.zip |
generatedAt | ISO 8601 格式的报告生成时间,省略时不展示 |
如需自行编写生成脚本,请将完整 ZIP 编码为无换行的标准 Base64,并使用 JSON 序列化工具生成报告数据。写入 HTML 前,将 JSON 中的 < 替换为 \u003c,其余模板内容保持原样。下方 Python 示例已包含这些处理。
添加任务输入
如需在报告中显示模型、任务名称和输入,请查询同一任务的详情,将响应保存为 task-details.json,并把下方脚本中的 task_details_path 改为 Path("task-details.json")。未提供详情时,也可以生成报告。
脚本会读取 model、input,并将 task_name 转为报告使用的 taskName。自行生成时,也可使用保存的原始提交参数;请确保它们与结果属于同一任务。
任务输入默认收起,点击「任务输入」即可展开。收起不会移除输入数据,分享报告时仍会包含这些内容。
Python 示例
使用 Python 3.9 或更新版本,无第三方依赖。调整文件名后运行:
python3 - <<'PY'
import base64
import io
import json
from pathlib import Path
import zipfile
archive = Path("screening-output.zip")
template = Path("atomelody-virtual-screening-report-template.html")
output = archive.with_name(archive.stem + "-report.html")
slot = '<script id="reportData" type="application/json">null</script>'
html = template.read_text(encoding="utf-8")
if html.count(slot) != 1 or 'data-report-kind="virtual-screening"' not in html:
raise ValueError("请使用未填充数据的虚拟筛选报告模板")
if archive.stat().st_size > 200 * 1024 * 1024:
raise ValueError("结果 ZIP 不能超过 200 MiB")
with zipfile.ZipFile(archive) as batch:
total = sum(item.file_size for item in batch.infolist())
if total > 800 * 1024 * 1024:
raise ValueError("累计解压大小不能超过 800 MiB")
if "summary.csv" not in batch.namelist():
raise ValueError("结果包缺少 summary.csv")
for item in batch.infolist():
if item.filename.lower().endswith(".zip"):
with zipfile.ZipFile(io.BytesIO(batch.read(item))) as candidate:
total += sum(entry.file_size for entry in candidate.infolist())
if total > 800 * 1024 * 1024:
raise ValueError("外层与候选包累计解压大小不能超过 800 MiB")
report = {
"archiveBase64": base64.b64encode(archive.read_bytes()).decode("ascii"),
"archiveName": archive.name,
# "taskId": "实际任务 ID",
# "taskName": "我的虚拟筛选报告",
}
# 可选:改为 Path("task-details.json"),嵌入同一任务的模型、名称和输入。
task_details_path = None
if task_details_path is not None:
details = json.loads(task_details_path.read_text(encoding="utf-8"))
if not isinstance(details, dict):
raise ValueError("任务详情必须是 JSON 对象")
details = details.get("data", details)
if not isinstance(details, dict):
raise ValueError("任务详情 data 必须是 JSON 对象")
# API 使用下划线命名,报告数据槽统一使用驼峰命名。
for key, report_key in (("model", "model"), ("task_name", "taskName"), ("input", "input")):
if key in details:
expected = dict if key == "input" else str
if not isinstance(details[key], expected):
raise ValueError(f"任务详情字段 {key} 类型不正确")
report[report_key] = details[key]
payload = json.dumps(report, ensure_ascii=True).replace("<", "\\u003c")
filled = '<script id="reportData" type="application/json">' + payload + '</script>'
with output.open("x", encoding="utf-8") as file:
file.write(html.replace(slot, filled))
print(f"报告已生成:{output.resolve()}")
PY
脚本不会覆盖已有报告。重新生成时,请修改输出文件名或移走旧文件。查看报告不需要安装 Python。
打开与检查
双击 HTML 即可离线打开,三维展示需要浏览器支持 WebGL。分享前,建议确认:
- 候选数量和成功、失败状态与任务结果一致。
- 可以切换候选及结构样本,三维结构与置信度指标正常显示。
- 添加的任务信息正确,任务输入可展开查看。
- 可以导出整批结果、候选结果和当前结构。
候选列表默认按排名分数排序,也可切换指标、筛选候选状态或排除有碰撞的候选。失败候选不参与评分比较,缺失指标显示为「—」。预测评分与置信度用于辅助筛选,不能替代实验验证。
结果 ZIP 最大支持 200 MiB,外层结果与所有候选包的累计解压大小不超过 800 MiB,最多支持 10,000 个候选。较大的报告需要更长的加载时间和更多浏览器内存。
报告支持通过「打开其他结果」临时查看另一份 ZIP。此操作不会保存新结果;如需分享,请为该任务重新生成报告。