#!/usr/bin/env python3
NAME = "D"
ELEMENT = "D"
NAME_MP = "Mn"
ELEMENT_MP = "Mn"
OCCUPANCY_MP = -1
_pdb_format = "{:6}{:5d}{:>5}{:1}{:>3} {:1}{:4d}{:1} {:>8.3f}{:>8.3f}{:>8.3f}{:>6.2f}{:>6.2f} {:>2}{:>2}\n"
[docs]def open_dx(grid_3d, xyz_min, d_xyz):
"""Return an OpenDX formatted string
Parameters
----------
density : ndarray
3-dimensional array of grid points with a shape given by n_xyz
xyz_min : list
origin coordinates of the grid
d_xyz : list
grid spacing in x-,y- and z-direction
Returns
-------
str
OpenDX formatted string
"""
xmin, ymin, zmin = xyz_min
nx, ny, nz = grid_3d.shape
dx, dy, dz = d_xyz
s = ""
s += "object 1 class gridpositions counts {:d} {:d} {:d}\n".format(nx, ny, nz)
s += "origin {:0.3f} {:0.3f} {:0.3f}\n".format(xmin, ymin, zmin)
s += "delta {:0.2f} 0 0\n".format(dx)
s += "delta 0 {:0.2f} 0\n".format(dy)
s += "delta 0 0 {:0.2f}\n".format(dz)
s += "object 2 class gridconnections counts {:d} {:d} {:d}\n".format(nx, ny, nz)
s += "object 3 class array type double rank 0 items {:d} data follows\n".format(nx * ny * nz)
k = 0
for ix in range(0, nx):
for iy in range(0, ny):
for iz in range(0, nz):
s += "{}".format(grid_3d[ix, iy, iz])
k += 1
if k % 3 == 0:
s += "\n"
else:
s += " "
s += 'attribute "dep" string "positions"\n'
s += 'object "density" class field\n'
s += 'component "positions" value 1\n'
s += 'component "connections" value 2\n'
s += 'component "data" value 3'
return s
[docs]def xyz(cloud_xyzqt, mp, write_weights=True, encode_element=False):
"""Return an XYZ formatted string
Parameters
----------
cloud_xyzq : ndarray
array of x-,y-,z-coordinates and corresponding weights with a shape [n_gridpts(+), 4]
mp : ndarray
mean position
write_weights : bool, optional=True
include weights in XYZ file (5th column)
encode_element : bool, optional=False
Returns
-------
str
XYZ formatted string
"""
n_points = cloud_xyzqt.shape[0]
s = ""
s += "{:d}\n".format(n_points)
s += "# Accessible contact volume\n"
if write_weights:
for k in range(n_points):
if encode_element:
if cloud_xyzqt[k, 4] == 2:
element = "C" # contact volume
else:
element = "F" # free volume
else:
element = ELEMENT
s += f"{element:1}\t{cloud_xyzqt[k, 0]:.3f}\t{cloud_xyzqt[k, 1]:.3f}\t{cloud_xyzqt[k, 2]:.3f}\t{cloud_xyzqt[k, 3]:.3f}\n"
s += f"{ELEMENT_MP:1}\t{mp[0]:.3f}\t{mp[1]:.3f}\t{mp[2]:.3f}\t{-1:.3f}\n"
else:
for k in range(n_points):
if encode_element:
if cloud_xyzqt[k, 4] == 2:
element = "C"
else:
element = "F"
else:
element = ELEMENT
s += f"{element:1}\t{cloud_xyzqt[k, 0]:.3f}\t{cloud_xyzqt[k, 1]:.3f}\t{cloud_xyzqt[k, 2]:.3f}\n"
s += f"{ELEMENT_MP:1}\t{mp[0]:.3f}\t{mp[1]:.3f}\t{mp[2]:.3f}\n"
return s
[docs]def pdb(cloud_xyzqt, mp):
"""Returns a PDB formatted string
Parameters
----------
cloud_xyzq : ndarray
array of x-,y-,z-coordinates and corresponding weights with a shape [n_gridpts(+), 4]
tag : ndarray
one-dimensional array of length n_gridpts
Returns
-------
str
PDB formatted string
Notes
-----
the PDB properties are as follows:
+--------------------------+------------+-----------+
| entry | PyMOL | pos. |
+==========================+============+===========+
| ATOM / HETATM | | [1-6] |
+--------------------------+------------+-----------+
| atom serial number | (id) | [7-11] |
+--------------------------+------------+-----------+
| atom name | (name) | [12-16] |
+--------------------------+------------+-----------+
| alternate loc. indicator | (alt) | [17] |
+--------------------------+------------+-----------+
| residue name | (resn) | [18-20] |
+--------------------------+------------+-----------+
| | | [21] |
+--------------------------+------------+-----------+
| chain identifier | (chain) | [22] |
+--------------------------+------------+-----------+
| residue seq. number | (resi) | [23-26] |
+--------------------------+------------+-----------+
| residue insertion code | | [27] |
+--------------------------+------------+-----------+
| | | [28-30] |
+--------------------------+------------+-----------+
| x coordinate (in A) | | [31-38] |
+--------------------------+------------+-----------+
| y coordinate (in A) | | [39-46] |
+--------------------------+------------+-----------+
| z coordinate (in A) | | [47-54] |
+--------------------------+------------+-----------+
| occupancy | (q) | [55-60] |
+--------------------------+------------+-----------+
| temperature factor | (b) | [61-66] |
+--------------------------+------------+-----------+
| | | [67-66] |
+--------------------------+------------+-----------+
| element | (element) | [77-78] |
+--------------------------+------------+-----------+
| charge | (fc) | [79-80] |
+--------------------------+------------+-----------+
"""
n_points = cloud_xyzqt.shape[0]
bfactor = 99
s = ""
for k in range(n_points):
if cloud_xyzqt[k, 4] == 2:
resn = "CV"
else:
resn = "FV"
s += _pdb_format.format(
"ATOM",
k + 1,
NAME,
" ",
resn,
" ",
int(cloud_xyzqt[k, 4]),
" ",
cloud_xyzqt[k, 0],
cloud_xyzqt[k, 1],
cloud_xyzqt[k, 2],
bfactor,
cloud_xyzqt[k, 3],
ELEMENT,
" ",
)
s += _pdb_format.format(
"ATOM", k + 2, NAME_MP, " ", "MP", " ", 0, " ", mp[0], mp[1], mp[2], bfactor, -1, ELEMENT_MP, " "
)
return s