def write(fname, data, psz=1, origin=None, fast=False):
""" Writes a MRC file. The header will be blank except for nx,ny,nz,datatype=2 for float32.
data should be (nx,ny,nz), and will be written in Fortran order as MRC requires."""
header = np.zeros(256, dtype=np.int32) # 1024 byte header
header_f = header.view(np.float32)
header[:3] = data.shape # nx, ny, nz
header[3] = 2 # mode, 2 = float32 datatype
header[7:10] = data.shape # mx, my, mz (grid size)
header_f[10:13] = [psz * i for i in data.shape] # xlen, ylen, zlen
header_f[13:16] = 90.0 # CELLB
header[16:19] = [1, 2, 3] # axis order
if not fast:
header_f[19:22] = [data.min(), data.max(), data.mean()] # data stats
if origin is None:
header_f[49:52] = [0, 0, 0]
elif origin is "center":
header_f[49:52] = [psz * i / 2 for i in data.shape]
else:
header_f[49:52] = origin
header[52] = 542130509 # 'MAP ' chars
header[53] = 16708
with open(fname, 'wb') as f:
header.tofile(f)
np.require(np.reshape(data, (-1,), order='F'), dtype=np.float32).tofile(f)
评论列表
文章目录