Source code for dpgen.tools.stat_iter
#!/usr/bin/env python3
import json
import os
import subprocess
from collections import defaultdict
import dpdata
[docs]
def stat_iter(target_folder, param_file="param.json", verbose=True, mute=False):
jdata = {}
with open(f"{target_folder}/{param_file}") as param_file:
jdata = json.load(param_file)
iter_dict = defaultdict(lambda: defaultdict(int))
output = subprocess.run(
[
f"wc -l {target_folder}/iter.??????/02.fp/*out",
],
shell=True,
stdout=subprocess.PIPE,
).stdout
data = output.decode() # split(b'\n')
for line in data.split("\n"):
if "out" in line:
num, relative_path_doc = line.strip().split(" ")
path_doc = os.path.abspath(relative_path_doc)
num = int(num)
prefix, iter_dirname, stage, out_filename = path_doc.rsplit("/", 3) # pylint: disable=unused-variable
pk_id, out_filename = path_doc.rsplit("/", 1)
iter = int(iter_dirname.split(".")[-1]) # pylint: disable=unused-variable
out_id = int(out_filename.strip().split(".")[-2]) # pylint: disable=unused-variable
out_type = out_filename.strip().split(".")[0]
iter_dict[pk_id][out_type] += num
# for ii in
output2 = subprocess.run(
[
f"ls -d -1 {target_folder}/iter.??????/02.fp/task.*/OUTCAR",
],
shell=True,
stdout=subprocess.PIPE,
).stdout
data2 = output2.decode()
if verbose:
# print('find OUTCAR', data2)
print("use param_jsonfile jdata['type_map']", jdata["type_map"])
for line in data2.split("\n"):
if line:
# [/home/felix/workplace/SiC/iter.000002/02.fp/task.018.000040/OUTCAR]
path_doc = os.path.abspath(line)
pk_id, task_dirname, OUTCAR_filename = path_doc.rsplit("/", 2) # pylint: disable=unused-variable
try:
_sys = dpdata.LabeledSystem(path_doc, type_map=jdata["type_map"])
except Exception:
try:
_sys = dpdata.LabeledSystem(
path_doc.replace("OUTCAR", "vasprun.xml"),
type_map=jdata["type_map"],
)
except Exception:
_sys = dpdata.LabeledSystem()
if len(_sys) == 1:
pass
else:
if verbose:
print(
"OUTCAR not label by dpdata, not convergence or unfinshed",
path_doc,
)
iter_dict[pk_id]["OUTCAR_not_convergence"] += 1
iter_dict[pk_id]["OUTCAR_total_count"] += 1
for pk_id in {**iter_dict}:
if iter_dict[pk_id]["OUTCAR_total_count"]:
iter_dict[pk_id]["reff"] = round(
iter_dict[pk_id]["OUTCAR_not_convergence"]
/ iter_dict[pk_id]["OUTCAR_total_count"],
5,
)
for pk_id, value in iter_dict.items():
print(
f"{pk_id}:candidate:{value['candidate']}"
f":rest_failed:{value['rest_failed']}"
f":rest_accurate:{value['rest_accurate']}"
f":OUTCAR_total_count:{value['OUTCAR_total_count']}"
f":OUTCAR_not_convergence:{value['OUTCAR_not_convergence']}"
f":reff:{value['reff']}"
)