Source code for pynao.m_tools
"""
modules containing tools and utility functions
"""
from __future__ import division
import numpy as np
[docs]def read_xyz(fname):
"""
Reads xyz files
"""
a2s = np.loadtxt(fname, skiprows=2, usecols=[0], dtype=str)
a2xyz = np.loadtxt(fname, skiprows=2, usecols=[1,2,3])
assert len(a2s)==len(a2xyz)
return a2s,a2xyz
[docs]def write_xyz(fname, s, ccc):
"""
Writes xyz files
"""
assert len(s) == len(ccc)
f = open(fname, "w")
print(len(s), file=f)
print(fname, file=f)
for sym,xyz in zip(s,ccc):
print("%2s %18.10f %18.10f %18.10f"%(sym, xyz[0],xyz[1],xyz[2]), file=f)
f.close()
return
[docs]def xyz2rtp( x,y,z):
r=np.sqrt( x**2+y**2+z**2)
t=np.acos( z/r )
p=np.atan2( y, x )
return (r,t,p)
[docs]def rtp2xyz( r, t, p):
x = r*np.sin(t)*np.cos(p)
y = r*np.sin(t)*np.sin(p)
z = r*np.cos(t)
return (x, y, z)
[docs]def transformData2newCoordinate(oldCoordinates, newCoordinates, data,
transform=rtp2xyz):
"""
transform a 3D array from a coodinate system to another.
For example, transforming from cartesian to spherical coordinates:
from __future__ import division
import numpy as np
from pynao.m_tools import transformData2newCoordinate
dims = (10, 5, 6)
x = np.linspace(-5, 5, dims[0])
y = np.linspace(-2, 2, dims[1])
z = np.linspace(-3, 3, dims[2])
dn = np.random.randn(dims[0], dims[1], dims[2])
r = np.arange(0.0, 2.0, 0.1)
phi = np.arange(0.0, 2*np.pi, 0.01)
theta = np.arange(0.0, np.pi, 0.01)
dn_new = transformData2newCoordinate((x, y, z), (r, phi, theta), dn)
"""
import scipy
assert len(oldCoordinates) == len(data.shape)
assert len(newCoordinates) == len(data.shape)
xyzinterpolator = scipy.interpolate.RegularGridInterpolator( oldCoordinates, data )
newData = np.zeros((newCoordinates[0].size, newCoordinates[1].size, newCoordinates[2].size), dtype=data.dtype)
max_dim = max(newCoordinates[0].size, newCoordinates[1].size, newCoordinates[2].size)
if max_dim == newCoordinates[0].size:
for i, v1 in enumerate(newCoordinates[1]):
for j, v2 in enumerate(newCoordinates[2]):
newData[:, i, j] = xyzinterpolator(transform(newCoordinates[0], v1, v2))
elif max_dim == newCoordinates[1].size:
for i, v1 in enumerate(newCoordinates[0]):
for j, v2 in enumerate(newCoordinates[2]):
newData[i, :, j] = xyzinterpolator(transform(v1, newCoordinates[1], v2))
elif max_dim == newCoordinates[2].size:
for i, v1 in enumerate(newCoordinates[0]):
for j, v2 in enumerate(newCoordinates[1]):
newData[i, j, :] = xyzinterpolator(transform(v1, v2, newCoordinates[2]))
else:
raise ValueError("Wrong max dim")
return newData
[docs]def is_power2(n):
"""
Check if n is a power of 2
"""
assert isinstance(n, int)
return ((n & (n-1)) == 0) and n != 0