makevestafile

#!/usr/bin/env python
from optparse import OptionParser
from math import sqrt, acos, pi
 
from Dacapo import Dacapo
from ASE.ChemicalElements import Element
 
def getabs(v):
  _av = sqrt(v[0]**2 + v[1]**2 + v[2]**2)
  return _av
 
def getangle(v1, v2):
  _av1 = getabs(v1)
  _av2 = getabs(v2)
  _ang = acos((v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2])/(_av1*_av2))*180/pi
  return _ang
 
def WriteVESTA(filename, atoms, cubefile = None):
  natoms = len(atoms)
  (a1, a2, a3) = atoms.GetUnitCell()
  f = open(filename, 'w')
  f.write("#VESTA_FORMAT_VERSION 2\n")
  f.write('\n')
  f.write("TITLE\n")
  f.write('\n')
  if cubefile is not None:
    f.write("IMPORT_DENSITY\n")
    f.write("+1.000000 %s\n" % cubefile)
  f.write('\n')
  f.write("GROUP\n")
  f.write("1 1 P 1  \n")
  f.write("SYMOP\n")
  f.write(" 0.000000  0.000000  0.000000   1  0  0   0  1  0   0  0  1\n")
  f.write(" -1.0 -1.0 -1.0  0 0 0  0 0 0  0 0 0\n")
  f.write("TRANM\n")
  f.write(" 0.000000  0.000000  0.000000  1  0  0   0  1  0   0  0  1\n")
  f.write("CELLP\n")
  f.write("%10.6f "*6 % (getabs(a1), getabs(a2), getabs(a3), getangle(a2, a3), getangle(a3, a1), getangle(a1, a2)))
  f.write('\n')
  f.write("  0.000000   0.000000   0.000000   0.000000   0.000000   0.000000 \n")
  f.write("STRUC\n")
  for i in range(natoms):
    (x, y, z) = atoms.GetScaledPositions()[i]
    symb = Element(atoms.GetAtomicNumbers()[i]).symbol
    f.write("%3d %2s       H  1.0000 %10.6f %10.6f %10.6f    1a       1\n" % (i + 1, symb, x, y, z))
    f.write("                         0.000000   0.000000   0.000000  0.00\n")
  f.write("  0 0 0 0 0 0 0\n")
 
 
cmd = OptionParser(usage = '%prog [-e embeded_cube_file] input_nc_file output_vesta_file')
cmd.add_option('-e', '--embed', type = 'string', nargs = 1,
               help = 'Embed the embeded_cube_file in the output_vesta_file.',
               metavar = 'embeded_cube_file')
 
(opt, argv) = cmd.parse_args()
 
if len(argv) != 2:
    cmd.print_help()
    raise SystemExit
 
ncfile = argv[0]
vestafile = argv[1]
 
model = Dacapo.ReadAtoms(ncfile)
WriteVESTA(vestafile, atoms = model, cubefile = opt.embed)