From 883c9a8510459245b531a257c8ba865283312c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20J=C3=B8rgen=20Mortensen?= <jensj@fysik.dtu.dk> Date: Thu, 28 Jan 2016 09:33:59 +0100 Subject: [PATCH] Tar file reader --- parser/parser-gpaw/tar.py | 61 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 parser/parser-gpaw/tar.py diff --git a/parser/parser-gpaw/tar.py b/parser/parser-gpaw/tar.py new file mode 100644 index 0000000..b45b302 --- /dev/null +++ b/parser/parser-gpaw/tar.py @@ -0,0 +1,61 @@ +import tarfile +import xml.etree.ElementTree as ElementTree + +import numpy as np + + +class Reader: + def __init__(self, name): + self.dims = {} + self.shapes = {} + self.dtypes = {} + self.parameters = {} + self.tar = tarfile.open(name, 'r') + f = self.tar.extractfile('info.xml').read() + root = ElementTree.fromstring(f) + self.byteswap = ((root.attrib['endianness'] == 'little') != + np.little_endian) + for child in root: + a = child.attrib + if child.tag == 'parameter': + try: + value = eval(a['value'], {}) + except (SyntaxError, NameError): + value = str(a['value']) + self.parameters[a['name']] = value + elif child.tag == 'array': + name = a['name'] + self.dtypes[name] = a['type'] + self.shapes[name] = [] + for dim in child: + n = int(dim.attrib['length']) + self.shapes[name].append(n) + self.dims[dim.attrib['name']] = n + + def __getattr__(self, name): + if name in self.parameters: + return self.parameters[name] + else: + return self.get_array(name) + + def get_array(self, name): + fileobj = self.tar.extractfile(name) + shape = self.shapes[name] + dtype = self.dtypes[name] + dtype = np.dtype({'int': 'int32'}.get(dtype, dtype)) + size = np.prod(shape) * dtype.itemsize + array = np.fromstring(fileobj.read(size), dtype) + if self.byteswap: + array = array.byteswap() + if dtype == np.int32: + array = np.asarray(array, int) + array.shape = shape + return array + + def close(self): + self.tar.close() + + +if __name__ == '__main__': + r = Reader('H2.gpw') + print(r.Eigenvalues, r.FermiLevel, r.UnitCell) -- GitLab