Bin Analysis 与数据处理指南
功能概览
DataProcessforDQMC.jl 提供了完整的bin数据处理和分析工作流。
数据处理流程
原始数据 (.bin 文件)
↓
数据处理 (四大核心操作)
├─ combine: 多文件加权组合
├─ scale: 列缩放
├─ merge: 列合并
└─ filter: 行提取 (特定坐标)
↓
数据导出
├─ CSV: Excel/Python 友好
└─ JLD2: Julia 原生高效
↓
可视化分析核心数据处理 (src/data-processing/)
基本操作 (bin-file-operations-basic.jl):
combine_bin_files- Combine 操作scale_bin_columns- Scale 操作merge_bin_columns- Merge 操作filter_bin_file- Filter 操作
导出功能 (bin-file-export.jl):
export_bin_to_dataframe- 转换为 DataFrameexport_bin_to_csv- 导出为 CSVexport_bin_to_jld2- 导出为 JLD2export_directory_bins- 批量导出
导出量生成 (derived-bin-generation-*.jl):
afm_k_files_generation- AFM 相关文件生成工作流cdw_k_files_generation- CDW 相关文件生成工作流merge_afm_sf- AFM 结构因子 (应用 merge 操作)combine_ss_components- 自旋分量合并 (应用 combine 操作)
主要功能
1. 数据处理的四大核心操作
数据处理模块位于 src/data-processing/,提供四种对 .bin 文件的基本操作:
1.1 Combine - 多文件加权组合
将多个 bin 文件按权重组合成新文件。
combine_bin_files("ss_k.bin", [("spsm_k.bin", 1.0), ("szsz_k.bin", 1.0)])应用场景: 合并自旋分量(如 (S⁺S⁻ + S⁻S⁺)/2 + SᶻSᶻ)
1.2 Scale - 列缩放
对 bin 文件的指定列进行缩放。
scale_bin_columns("input.bin", "scaled.bin", [1, 1, 0.5, 0.5, ...])应用场景: 归一化、单位换算
1.3 Merge - 列合并
将多个文件的列合并,或对列进行线性组合。
merge_afm_sf("ss_k.bin", "afm_sf_k.bin") # S_AFM = AA + BB - AB - BA应用场景: 生成导出量(如 AFM/CDW 结构因子)
1.4 Filter - 行提取
提取特定坐标的所有 bin 数据。
# K空间:提取特定动量点的所有bin
filter_bin_file("nn_k.bin", (-0.458, -0.458), dir="data/")
# 输出: nn_k_-0.458_-0.458.bin (包含该k点的所有bin)
# R空间:提取特定格点的所有bin
filter_bin_file("nn_r.bin", (1, 2), dir="data/")
# 输出: nn_r_1_2.bin (包含该位置的所有bin)应用场景: Bin 收敛性分析、特定点的统计涨落分析
2. 数据导出功能
导出为DataFrame
# 默认导出(4个轨道:AA, AB, BA, BB)
df = export_bin_to_dataframe("nn_k.bin", dir="data/")
# 返回DataFrame,包含列: bin, kx, ky, AA_real, AA_imag, AB_real, AB_imag, ...
# 自定义轨道对配置(仅导出对角项 AA, BB)
df = export_bin_to_dataframe("nn_k.bin", dir="data/",
orbital_columns=[(3,4), (9,10)],
orbital_labels=["AA", "BB"])
# 返回DataFrame,包含列: bin, kx, ky, AA_real, AA_imag, BB_real, BB_imag
# 注:AA, BB等表示轨道对,如AA表示轨道A到轨道A的关联导出为CSV
export_bin_to_csv("nn_k.bin", dir="data/")
# 输出: data/exported_csv/nn_k.csv导出为JLD2
export_bin_to_jld2("nn_k.bin", dir="data/")
# 输出: data/exported_jld2/nn_k.jld2 (dataset: "nn_k")
# 读取: load("nn_k.jld2", "nn_k")
# 如需合并多个文件到一个JLD2
export_bin_to_jld2("nn_k.bin", dir="data/", output_file="all_data.jld2") # dataset: nn_k
export_bin_to_jld2("nn_r.bin", dir="data/", output_file="all_data.jld2") # dataset: nn_r
# 输出: data/exported_jld2/all_data.jld2 (datasets: "nn_k", "nn_r")
# 读取: load("all_data.jld2", "nn_k") 或 load("all_data.jld2", "nn_r")批量导出
# 默认导出为CSV和JLD2
export_directory_bins("data/", file_patterns=["*_k.bin", "*_r.bin"])
# 指定输出格式
export_directory_bins("data/", output_format=:csv) # 仅CSV
export_directory_bins("data/", output_format=:jld2) # 仅JLD2
export_directory_bins("data/", output_format=:both) # CSV + JLD2(默认)数据格式说明
Bin文件结构
原始bin文件 (如 nn_k.bin):
- 5760行 = 576个k点 × 10个bin
- 按bin分块存储:
第1-576行: bin 0 (所有k点)
第577-1152行: bin 1 (所有k点)
...
第5185-5760行: bin 9 (所有k点)CSV输出格式
多轨道数据 (nn_k.csv):
bin,kx,ky,AA_real,AA_imag,AB_real,AB_imag,BA_real,BA_imag,BB_real,BB_imag
1,-0.458,-0.458,0.297,-6.62e-10,0.055,0.003,0.055,-0.003,0.289,-8.10e-10
2,-0.458,-0.458,0.292,-5.75e-10,0.055,-0.002,0.055,0.002,0.299,-3.34e-10
...单列数据 (afmsfk.csv):
bin,kx,ky,value_real,value_imag
1,-0.458,-0.458,0.503,-9.38e-10
2,-0.458,-0.458,0.497,-6.46e-10
...过滤后的数据 (afmsfk0.5000.500.csv):
bin,kx,ky,value_real,value_imag
1,0.5,0.5,0.496,-9.28e-10
2,0.5,0.5,0.497,-6.46e-10
...
10,0.5,0.5,0.496,-1.15e-9典型工作流
工作流1: 生成导出量(derive 应用)
使用数据处理操作生成物理导出量:
using DataProcessforDQMC
# 应用示例:生成 AFM 相关文件
# 内部使用 combine + merge 操作
afm_k_files_generation("data/")
# Step 2: 过滤特定k点 (filter 操作)
filter_bin_file("afm_sf_k.bin", (0.5, 0.5), dir="data/")
# Step 3: 导出为CSV用于可视化
export_bin_to_csv("afm_sf_k_0.500_0.500.bin", dir="data/")
# Step 4: 在Python中绘图
# import pandas as pd
# import matplotlib.pyplot as plt
# df = pd.read_csv('afm_sf_k_0.500_0.500.csv')
# plt.plot(df['bin'], df['value_real'])
# plt.xlabel('Bin index')
# plt.ylabel('S_AFM(π,π)')涉及操作: derive 工作流 (combine+merge) → filter → export
工作流2: 批量数据导出
using DataProcessforDQMC
# 导出目录下所有关联函数(默认为CSV和JLD2)
export_directory_bins(
"data/",
file_patterns=["nn_*.bin", "spsm_*.bin", "afm_sf_*.bin"],
iscorrelation=true
)
# 在Excel中打开:exported_csv/*.csv
# 在Python中批量分析:
# import pandas as pd
# import glob
# for f in glob.glob('exported_csv/*.csv'):
# df = pd.read_csv(f)
# # 进行分析...
# 在Julia中批量加载(使用JLD2):
# using JLD2, DataFrames
# nn_k_df = load("exported_jld2/nn_k.jld2", "nn_k")
# nn_r_df = load("exported_jld2/nn_r.jld2", "nn_r")
# spsm_k_df = load("exported_jld2/spsm_k.jld2", "spsm_k")涉及操作: export
工作流3: 多k点关联函数的Bin涨落分析
目的: 检查DQMC模拟是否已经热化并达到统计平衡,通过观察不同bin的涨落判断收敛性。
分析指标:
- 前几个bin: 可能处于热化阶段,数值逐渐稳定
- 后续bin: 应呈现统计涨落(上下振荡),围绕平均值波动
- 收敛标志: bin数据在误差范围内上下振荡,无明显趋势
方案1: 先筛选特定k点再导出(推荐用于关注少数k点)
using DataProcessforDQMC
# 指定关心的k点(通常是高对称点)
k_points = [
(0.0, 0.0), # Γ点
(0.5, 0.0), # X点
(0.5, 0.5) # M点
]
for k in k_points
# 1. 筛选特定k点的所有bin数据
filter_bin_file("nn_k.bin", k, dir="data/")
# 2. 导出为CSV用于Excel分析
kx_str = @sprintf("%.3f", k[1])
ky_str = @sprintf("%.3f", k[2])
filename = "nn_k_$(kx_str)_$(ky_str).bin"
export_bin_to_csv(filename, dir="data/")
end
# 3. 在Excel中打开CSV文件,观察每个k点的bin演化
# - 横轴: bin index (1, 2, 3, ...)
# - 纵轴: 关联函数值
# - 检查: 数据是否在后期呈现稳定的上下振荡方案2: 直接导出全部数据(适合系统性分析)
using DataProcessforDQMC
# 直接导出完整的关联函数数据
export_bin_to_csv("nn_k.bin", dir="data/")
# 在Excel中:
# 1. 打开 exported_csv/nn_k.csv
# 2. 使用筛选功能选择特定k点 (kx, ky)
# 3. 绘制 bin vs value_real 曲线
# 4. 观察数据点的演化趋势收敛性判断:
- ✅ 良好收敛: bin 3-10 在平均值附近上下振荡,标准差较小
- ⚠️ 未完全热化: 前几个bin数值持续增大或减小
- ❌ 未收敛: 所有bin呈现明显趋势,无稳定振荡
涉及操作: filter → export (或直接 export)