Source code for scythe.ase
import json
import datetime
from ase.io.jsonio import create_ndarray
from ase.io import read, write
from io import StringIO
import numpy as np
from scythe.base import BaseSingleFileExtractor
[docs]def object_hook(dct):
"""Custom decoder for ASE JSON objects
Does everything *except* reconstitute the JSON object and
also converts numpy arrays to lists
Adapted from ase.io.jsonio
Args:
dct (dict): Dictionary to reconstitute to an ASE object
"""
if '__datetime__' in dct:
return datetime.datetime.strptime(dct['__datetime__'], '%Y-%m-%dT%H:%M:%S.%f')
if '__complex__' in dct:
return complex(*dct['__complex__'])
if '__ndarray__' in dct:
return create_ndarray(*dct['__ndarray__'])
# No longer used (only here for backwards compatibility):
if '__complex_ndarray__' in dct:
r, i = (np.array(x) for x in dct['__complex_ndarray__'])
return r + i * 1j
return dct
[docs]class ASEExtractor(BaseSingleFileExtractor):
"""Parse information from atomistic simulation input files using ASE.
ASE can read many file types. These can be found at https://wiki.fysik.dtu.dk/ase/ase/io/io.html
Metadata are generated as ASE JSON DB format: https://wiki.fysik.dtu.dk/ase/ase/db/db.html
"""
def _extract_file(self, path, context=None):
# Attempt to read the file with ASE
# To return ASE JSON DB requires writing to file.
# Here we use StringIO instead of a file on disk.
fobj = StringIO()
m = read(path)
write(images=m, format="json", filename=fobj)
js = json.loads(fobj.getvalue(), object_hook=object_hook)
# Select the first record.
# TODO: Test this against multiple records
record = js['1']
record['chemical_formula'] = m.get_chemical_formula()
return record
def implementors(self):
return ['Ben Blaiszik <blaiszik@uchicago.edu>']
def version(self):
return '0.0.1'