Source code for qtdraw.parser.xsf
"""
Read data in xsf file.
Note:
- https://web.mit.edu/xcrysden_v1.5.60/www/XCRYSDEN/doc/XSF.html#__toc__12
"""
import numpy as np
from qtdraw.util.util import create_grid
# ==================================================
[docs]
def extract_data_xsf(filename):
"""
Read xsf file (grid data part only).
Args:
filename (str): file name.
Returns:
- (dict) -- extracted data.
Note:
- n : [nx,ny,nz] division of grid.
- origin : [rx,ry,rz] origin in fractional coordinate.
- Ag : [g1,g2,g3] grid vectors in 4x4 matrix.
- data : data at each grid point.
- surface : surface data at each grid point.
- endpoint : include endpoint ?
- row_major : row-major grid ?
"""
with open(filename, mode="r", encoding="utf-8") as f:
s = f.read()
s = s.replace("\n", " ")
start = s.find("BEGIN_DATAGRID_3D_UNKNOWN")
end = s.rfind("END_DATAGRID_3D")
s = s[start:end]
lst = s.split(" ")
lst = [i for i in lst if i != ""]
nv = np.array(lst[1:4]).astype(int) # nx, ny, nz
rv = np.array(lst[4:7]).astype(float) # x0, y0, z0
A = np.eye(4)
A[0:3, 0] = np.array(lst[7:10]).astype(float) # dx1, dy1, dz1
A[0:3, 1] = np.array(lst[10:13]).astype(float) # dx2, dy2, dz2
A[0:3, 2] = np.array(lst[13:16]).astype(float) # dx3, dy3, dz3
n = nv[0] * nv[1] * nv[2]
data = np.array(lst[16 : 16 + n]).astype(float) # data (nx*ny*nz)
r0 = np.linalg.inv(A)[0:3, 0:3] @ rv
grid_data = {
"n": nv.tolist(),
"origin": r0.tolist(),
"Ag": A.tolist(),
"endpoint": True,
"row_major": False,
"data": np.abs(data).tolist(),
"surface": {"phase": data.tolist()},
}
return grid_data
# ==================================================
def create_data(n, origin, A, endpoint, f_data, f_surface):
r = origin + np.array([1.0, 1.0, 1.0])
grid = create_grid(n, origin, r, A, endpoint).points
data = f_data(grid[:, 0], grid[:, 1], grid[:, 2]).tolist()
if f_surface is not None:
surface = {}
for name, f in f_surface.items():
surface[name] = f(grid[:, 0], grid[:, 1], grid[:, 2]).tolist()
else:
surface = None
grid_data = {
"n": n,
"origin": origin,
"Ag": A.tolist(),
"data": data,
"surface": surface,
"endpoint": endpoint,
"row_major": False,
}
return grid_data