增加扩胞逻辑

This commit is contained in:
2025-12-14 18:01:11 +08:00
parent 9b36aa10ff
commit 83647c2218

View File

@@ -214,103 +214,103 @@ class DatabaseAnalyzer:
return self.scheduler.submit_slurm_job(script, script_path) return self.scheduler.submit_slurm_job(script, script_path)
# 更新 _compute_statistics 方法 # 更新 _compute_statistics 方法
def _compute_statistics(self, report: DatabaseReport): def _compute_statistics(self, report: DatabaseReport):
"""计算统计数据(含扩胞分析)""" """计算统计数据(含扩胞分析)"""
for info in report.all_structures: for info in report.all_structures:
if info.is_valid: if info.is_valid:
report.valid_files += 1 report.valid_files += 1
else:
report.invalid_files += 1
continue
if not info.contains_target_cation:
continue
report.cation_containing_count += 1
for anion in info.anion_types:
report.anion_distribution[anion] = \
report.anion_distribution.get(anion, 0) + 1
if info.anion_mode == "single":
report.single_anion_count += 1
elif info.anion_mode == "mixed":
report.mixed_anion_count += 1
# 根据阴离子模式过滤
if self.anion_mode == "single" and info.anion_mode != "single":
continue
if self.anion_mode == "mixed" and info.anion_mode != "mixed":
continue
if info.anion_mode == "none":
continue
# 各项统计
if info.has_oxidation_states:
report.with_oxidation_states += 1
else:
report.without_oxidation_states += 1
# Li共占位统计修改
if info.cation_with_vacancy:
report.cation_with_vacancy_count += 1
if info.cation_with_other_cation:
report.cation_with_other_cation_count += 1
if info.anion_has_partial_occupancy:
report.anion_partial_occupancy_count += 1
if info.is_binary_compound:
report.binary_compound_count += 1
if info.has_water_molecule:
report.has_water_count += 1
if info.has_radioactive_elements:
report.has_radioactive_count += 1
# 可处理性
if info.can_process:
if info.needs_expansion:
report.needs_preprocessing += 1
else: else:
report.directly_processable += 1 report.invalid_files += 1
else: continue
report.cannot_process += 1
if info.skip_reason:
for reason in info.skip_reason.split("; "):
report.skip_reasons_summary[reason] = \
report.skip_reasons_summary.get(reason, 0) + 1
# 扩胞统计(新增) if not info.contains_target_cation:
exp_info = info.expansion_info continue
factor = exp_info.expansion_factor
if not exp_info.needs_expansion: report.cation_containing_count += 1
report.expansion_stats['no_expansion_needed'] += 1
elif not exp_info.can_expand:
report.expansion_stats['cannot_expand'] += 1
elif factor == 2:
report.expansion_stats['expansion_factor_2'] += 1
elif factor == 3:
report.expansion_stats['expansion_factor_3'] += 1
elif 4 <= factor <= 8:
report.expansion_stats['expansion_factor_4_8'] += 1
else:
report.expansion_stats['expansion_factor_large'] += 1
# 详细分布 for anion in info.anion_types:
if exp_info.needs_expansion and exp_info.can_expand: report.anion_distribution[anion] = \
report.expansion_factor_distribution[factor] = \ report.anion_distribution.get(anion, 0) + 1
report.expansion_factor_distribution.get(factor, 0) + 1
report.needs_expansion_count += 1
# 计算比例 if info.anion_mode == "single":
if report.valid_files > 0: report.single_anion_count += 1
report.cation_containing_ratio = \ elif info.anion_mode == "mixed":
report.cation_containing_count / report.valid_files report.mixed_anion_count += 1
if report.cation_containing_count > 0: # 根据阴离子模式过滤
for anion, count in report.anion_distribution.items(): if self.anion_mode == "single" and info.anion_mode != "single":
report.anion_ratios[anion] = \ continue
count / report.cation_containing_count if self.anion_mode == "mixed" and info.anion_mode != "mixed":
continue
if info.anion_mode == "none":
continue
# 各项统计
if info.has_oxidation_states:
report.with_oxidation_states += 1
else:
report.without_oxidation_states += 1
# Li共占位统计修改
if info.cation_with_vacancy:
report.cation_with_vacancy_count += 1
if info.cation_with_other_cation:
report.cation_with_other_cation_count += 1
if info.anion_has_partial_occupancy:
report.anion_partial_occupancy_count += 1
if info.is_binary_compound:
report.binary_compound_count += 1
if info.has_water_molecule:
report.has_water_count += 1
if info.has_radioactive_elements:
report.has_radioactive_count += 1
# 可处理性
if info.can_process:
if info.needs_expansion:
report.needs_preprocessing += 1
else:
report.directly_processable += 1
else:
report.cannot_process += 1
if info.skip_reason:
for reason in info.skip_reason.split("; "):
report.skip_reasons_summary[reason] = \
report.skip_reasons_summary.get(reason, 0) + 1
# 扩胞统计(新增)
exp_info = info.expansion_info
factor = exp_info.expansion_factor
if not exp_info.needs_expansion:
report.expansion_stats['no_expansion_needed'] += 1
elif not exp_info.can_expand:
report.expansion_stats['cannot_expand'] += 1
elif factor == 2:
report.expansion_stats['expansion_factor_2'] += 1
elif factor == 3:
report.expansion_stats['expansion_factor_3'] += 1
elif 4 <= factor <= 8:
report.expansion_stats['expansion_factor_4_8'] += 1
else:
report.expansion_stats['expansion_factor_large'] += 1
# 详细分布
if exp_info.needs_expansion and exp_info.can_expand:
report.expansion_factor_distribution[factor] = \
report.expansion_factor_distribution.get(factor, 0) + 1
report.needs_expansion_count += 1
# 计算比例
if report.valid_files > 0:
report.cation_containing_ratio = \
report.cation_containing_count / report.valid_files
if report.cation_containing_count > 0:
for anion, count in report.anion_distribution.items():
report.anion_ratios[anion] = \
count / report.cation_containing_count