Files
screen/readme.md
2025-12-16 11:36:49 +08:00

416 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 高通量筛选与扩胞项目 v2.3
## 环境配置需求
项目需要配置两个 Conda 环境,名称分别为 **screen****zeo**
### 1. zeo 环境 (用于几何结构分析)
* **Python**: 2
* **核心库**: `zeo++` (需编译), `pymatgen==2018.12.12`, `numpy==1.16.6`
* **其他**: `os`, `argparse`, `PrettyTable`, `monty`, `future`
### 2. screen 环境 (用于逻辑筛选与数据处理)
* **Python**: 3.11.4
* **核心库**: `pymatgen==2024.11.13`, `pandas` (新增用于处理CSV)
* **路径**: `/cluster/home/koko125/anaconda3/envs/screen`
## 快速开始
### 方式一:使用新版主程序(推荐)
```bash
# 激活 screen 环境
conda activate /cluster/home/koko125/anaconda3/envs/screen
# 运行主程序
python main.py
```
主程序提供交互式界面,支持:
- 数据库分析与筛选
- 本地多进程并行
- SLURM 直接提交(无需生成脚本文件)
- 实时进度条显示
- 扩胞处理与化合价添加
### 方式二:传统方式
1. **数据准备**:
* 如果数据来源为 **Materials Project (MP)**,请将 CIF 文件放入 `data/input_pre`
* 如果数据来源为 **ICSD**,请直接将 CIF 文件放入 `data/input`
2. **运行**:
* 确保已创建上述两个 Conda 环境。
* 在根目录下运行自动化脚本:
```bash
bash main.sh
```
## 新版功能特性 (v2.1)
### 执行模式
1. **本地多进程模式** (`local`)
- 使用 Python multiprocessing 在本地并行执行
- 适合小规模任务或测试
2. **SLURM 直接提交模式** (`slurm`)
- 直接在 Python 中提交 SLURM 作业
- 无需生成脚本文件
- 实时监控作业状态和进度
- 适合大规模高通量计算
### 进度显示
```
分析CIF文件: |████████████████████░░░░░░░░░░░░░░░░░░░░| 500/1000 (50.0%) [0:05:23<0:05:20, 1.6it/s] ✓480 ✗20
```
### 输出格式
处理后的文件支持两种输出格式:
1. **原始格式**(平铺)
```
workspace/processed/
├── 1514027.cif
├── 1514072.cif
└── ...
```
2. **分析格式**(按阴离子分类)
```
workspace/data/
├── O/
│ ├── 1514027/
│ │ └── 1514027.cif
│ └── 1514072/
│ └── 1514072.cif
├── S/
│ └── ...
└── Cl+O/
└── ...
```
## 处理流程详解
### Stage 1: 预处理与基础筛选 (Step 1)
* **Pre-process**: 清洗数据,统一放入 `input` 文件夹。
* **Step 1**:
* 读取 CIF 文件,利用 `crystal_2` 库检查电荷平衡与化学式。
* **文件重组**: 将通过筛选的文件按阴离子类型分类。
* **新结构**: 每个材料拥有独立的文件夹(例如 `after_step1/O/141/141.cif`),便于管理后续的计算日志。
* **Make SH**: 自动生成用于调用 Zeo++ 的 `analyze.sh` 脚本。
### Stage 2: Zeo++ 计算
* 切换至 `zeo` 环境。
* 计算材料的孔径 (Percolation diameter)、比表面积等几何参数。
* 结果输出为每个文件夹下的 **`log.txt`**。
### Stage 3: 数据提取与联合筛选 (Step 2-4)
* **数据提取 (`extract_data.py`)**:
* 自动遍历所有文件夹中的 `log.txt`。
* 提取关键参数:`Percolation Diameter` (Step 2), `Minimum of d` (Step 3), `Maximum Node Length` (Step 4)。
* 结果汇总为 CSV 文件保存在 `output/` 目录下(例如 `output/O/O.csv`)。
* **联合筛选 (`step2_4_combined.py`)**:
* 读取 CSV 文件,根据预设的阈值(如 O: Perc>0.5, Min_d<3.0, Node>2.2)进行过滤。
* **结果**: 将符合所有条件的材料,以**软链接**的形式汇聚到 `data/after_screening` 文件夹中。
---
## 扩胞逻辑 (Step 5)
扩胞处理已集成到新版主程序中,支持:
- 自动计算扩胞因子
- 可选保存数量当为1时不加后缀
- 自动添加化合价信息
### 算法分解
1. **读取结构**: 解析 CIF 文件。
2. **统计 Occupation**:
* 将具有相同 Occupation 值的原子归为一类。
* 生成 `Occupation_list` 字典。
3. **计算扩大倍数**:
* 根据 Occupation 的分子分母情况(如 0.5 对应 1/2计算公约数。
4. **生成结构列表**:
* 根据分子与分母生成 `structure_list`。
5. **对称性处理与扩胞**:
* 根据材料结构的对称性,生成三个方向的扩胞列表 (如 `{"x":1, "y":2, "z":1}`)。
6. **生成新文件**:
* 结合 `structure_list` 与扩胞倍数生成最终的超胞 CIF。
### 假设条件
* 只考虑两个原子在同一位置上的共占位情况。
* 不考虑 Li 原子的共占位情况,对 Li 原子不做处理。
## 项目结构
```
screen/
├── main.py # 主入口(新版)
├── main.sh # 传统脚本入口
├── readme.md # 本文档
├── config/ # 配置文件
│ ├── settings.yaml
│ └── valence_states.yaml
├── src/ # 源代码
│ ├── analysis/ # 分析模块
│ │ ├── database_analyzer.py
│ │ ├── report_generator.py
│ │ ├── structure_inspector.py
│ │ └── worker.py
│ ├── core/ # 核心模块
│ │ ├── executor.py # 任务执行器(新)
│ │ ├── scheduler.py # 调度器
│ │ └── progress.py # 进度管理
│ ├── preprocessing/ # 预处理模块
│ │ ├── processor.py # 结构处理器
│ │ └── ...
│ └── utils/ # 工具函数
├── py/ # 传统脚本
├── tool/ # 工具和配置
│ ├── analyze_voronoi_nodes.py
│ └── Li/ # 化合价配置
└── workspace/ # 工作区
├── data/ # 分析格式输出
└── processed/ # 原始格式输出
```
## API 使用示例
### 使用执行器
```python
from src.core.executor import create_executor, TaskExecutor
# 创建执行器
executor = create_executor(
mode="slurm", # 或 "local"
max_workers=32,
conda_env="/cluster/home/koko125/anaconda3/envs/screen"
)
# 定义任务
tasks = [
(file_path, "Li", {"O", "S"})
for file_path in cif_files
]
# 执行
from src.analysis.worker import analyze_single_file
results = executor.run(tasks, analyze_single_file, desc="分析CIF文件")
```
### 使用数据库分析器
```python
from src.analysis.database_analyzer import DatabaseAnalyzer
analyzer = DatabaseAnalyzer(
database_path="/path/to/cif/files",
target_cation="Li",
target_anions={"O", "S", "Cl", "Br"},
anion_mode="all"
)
report = analyzer.analyze(show_progress=True)
report.save("analysis_report.json")
```
### 使用 Zeo++ 执行器
```python
from src.computation.workspace_manager import WorkspaceManager
from src.computation.zeo_executor import ZeoExecutor, ZeoConfig
# 设置工作区
ws_manager = WorkspaceManager(
workspace_path="workspace",
tool_dir="tool",
target_cation="Li"
)
# 创建软链接
workspace_info = ws_manager.setup_workspace()
# 获取计算任务
tasks = ws_manager.get_computation_tasks(workspace_info)
# 配置 Zeo++ 执行器
config = ZeoConfig(
conda_env="/cluster/home/koko125/anaconda3/envs/zeo",
partition="cpu",
max_concurrent=50,
time_limit="2:00:00"
)
# 执行计算
executor = ZeoExecutor(config)
results = executor.run_batch(tasks, output_dir="slurm_logs")
executor.print_results_summary(results)
```
## 新版功能特性 (v2.2)
### Zeo++ Voronoi 分析
新增 SLURM 作业数组支持,可高效调度大量 Zeo++ 计算任务:
1. **自动工作区管理**
- 检测现有工作区数据
- 自动创建配置文件软链接
- 按阴离子类型组织目录结构
2. **SLURM 作业数组**
- 使用 `--array` 参数批量提交任务
- 支持最大并发数限制(如 `%50`
- 自动分批处理超大任务集
3. **实时进度监控**
- 通过状态文件跟踪任务完成情况
- 支持 Ctrl+C 中断监控(作业继续运行)
- 自动收集输出文件
### 工作流程
```
Step 1: 数据库分析
Step 1.5: 扩胞处理 + 化合价添加
Step 2-4: Zeo++ Voronoi 分析
├── 创建软链接 (yaml 配置 + 计算脚本)
├── 提交 SLURM 作业数组
└── 监控进度并收集结果
Step 5: 结果处理与筛选
├── 从 log.txt 提取关键参数
├── 汇总到 CSV 文件
├── 应用筛选条件
└── 复制通过筛选的结构到 passed/ 目录
```
### 筛选条件
Step 5 支持以下筛选条件:
- **最小渗透直径** (Percolation Diameter): 默认 1.0 Å
- **最小 d 值** (Minimum of d): 默认 2.0
- **最大节点长度** (Maximum Node Length): 默认不限制
### 日志输出
Zeo++ 计算的输出会重定向到每个结构目录下的 `log.txt` 文件:
```bash
python analyze_voronoi_nodes.py *.cif -i O.yaml > log.txt 2>&1
```
日志中包含的关键信息:
- `Percolation diameter (A): X.XX` - 渗透直径
- `the minium of d\nX.XX` - 最小 d 值
- `Maximum node length detected: X.XX A` - 最大节点长度
### 目录结构
```
workspace/
├── data/ # 分析格式数据
│ ├── O/ # 氧化物
│ │ ├── O.yaml -> tool/Li/O.yaml
│ │ ├── analyze_voronoi_nodes.py -> tool/analyze_voronoi_nodes.py
│ │ ├── 1514027/
│ │ │ ├── 1514027.cif
│ │ │ ├── 1514027_all_accessed_node.cif # Zeo++ 输出
│ │ │ ├── 1514027_bond_valence_filtered.cif
│ │ │ └── 1514027_bv_info.csv
│ │ └── ...
│ ├── S/ # 硫化物
│ └── Cl+O/ # 复合阴离子
├── processed/ # 原始格式数据
├── slurm_logs/ # SLURM 日志
│ ├── tasks.json
│ ├── submit_array.sh
│ ├── task_0.out
│ ├── task_0.err
│ ├── status_0.txt
│ └── ...
└── zeo_results.json # 计算结果汇总
```
### 配置文件说明
`tool/Li/O.yaml` 示例:
```yaml
SPECIE: Li+
ANION: O
PERCO_R: 0.5
NEIGHBOR: 1.8
LONG: 2.2
```
参数说明:
- `SPECIE`: 目标扩散离子(带电荷)
- `ANION`: 阴离子类型
- `PERCO_R`: 渗透半径阈值
- `NEIGHBOR`: 邻近距离阈值
- `LONG`: 长节点判定阈值
## 新版功能特性 (v2.3)
### 断点续做功能
v2.3 新增智能断点续做功能,支持从任意步骤继续执行:
1. **自动状态检测**
- 启动时自动检测工作流程状态
- 检测 `workspace/data/` 是否存在且有结构 → 判断 Step 1 是否完成
- 检测结构目录下是否有 `log.txt` → 判断 Zeo++ 计算是否完成
- 如果 50% 以上结构有 log.txt认为 Zeo++ 计算已完成
2. **智能流程跳转**
- 如果已完成 Zeo++ 计算 → 可直接进行筛选
- 如果已完成扩胞处理 → 可直接进行 Zeo++ 计算
- 从后往前检测,自动跳过已完成的步骤
3. **分步执行与中断**
- 每个大步骤完成后询问是否继续
- 支持中途退出,下次运行时自动检测进度
- 三大步骤:扩胞与加化合价 → Zeo++ 计算 → 筛选
### 工作流程状态示例
```
工作流程状态检测
检测到现有工作区数据:
- 结构总数: 1234
- 已完成 Zeo++ 计算: 1200 (97.2%)
- 未完成 Zeo++ 计算: 34
当前状态: Zeo++ 计算已完成
可选操作:
[1] 直接进行结果筛选 (Step 5)
[2] 重新运行 Zeo++ 计算 (Step 2-4)
[3] 从头开始 (Step 1)
[0] 退出
请选择 [1]:
```
### 使用场景
1. **首次运行**
- 从 Step 1 开始完整执行
- 每步完成后可选择继续或退出
2. **中断后继续**
- 自动检测已完成的步骤
- 提供从当前进度继续的选项
3. **重新筛选**
- 修改筛选条件后
- 可直接运行 Step 5 而无需重新计算
4. **部分重算**
- 如需重新计算部分结构
- 可选择重新运行 Zeo++ 计算