Source code for aiida_vasp.parsers.vasp2w90
"""
VASP to Wannier90 parser.
-------------------------
AiiDA Parser for aiida_vasp.Vasp2w90Calculation.
"""
from aiida.orm.nodes.data.list import List
from aiida.plugins import DataFactory
from aiida_vasp.parsers.content_parsers.win import WinParser
from .vasp import VaspParser
[docs]
class Vasp2w90Parser(VaspParser):
"""Parse a finished aiida_vasp.Vasp2w90Calculation."""
[docs]
def parse_with_retrieved(self, retrieved):
"""The main parsing method called by AiiDA."""
super().parse_with_retrieved(retrieved) # pylint: disable=no-member
win_success, kpoints_node, param_node, proj_node = self.parse_win()
self.set_node('wannier_parameters', param_node)
self.set_node('wannier_kpoints', kpoints_node)
self.set_node('wannier_projections', proj_node)
has_full_dat = self.has_full_dat()
return self.result(success=win_success and has_full_dat) # pylint: disable=no-member
[docs]
def parse_win(self):
"""Create the wannier90 input and kpoints output nodes."""
win = self._get_object('wannier90.win') # pylint: disable=no-member
if not win:
return False, None, None, None
win_result = WinParser(win).result
# remove kpoints block from parameters
kpoints = win_result.pop('kpoints', None)
success, kpoints_node = self.convert_kpoints(kpoints)
# remove structure (cannot be given in parameters)
win_result.pop('unit_cell_cart', None)
win_result.pop('atoms_cart', None)
projections = win_result.pop('projections', None)
if projections is None:
proj_node = None
else:
proj_node = List()
proj_node.extend(projections)
param_node = DataFactory('parameter')(dict=win_result)
return success, kpoints_node, param_node, proj_node
[docs]
@staticmethod
def convert_kpoints(kpoints):
"""Convert the k-points output from string to float."""
if kpoints is None:
return False, None
kpoints_node = DataFactory('core.array.kpoints')()
kpoints_node.set_kpoints([[float(x) for x in k.split()] for k in kpoints])
return True, kpoints_node
[docs]
def set_node(self, name, node):
"""Add a node if it is not None."""
if node is not None:
self.add_node(name, node) # pylint: disable=no-member
[docs]
def has_full_dat(self):
success = all(self._get_object('wannier90.' + ext) for ext in ['mmn', 'amn', 'eig']) # pylint: disable=no-member
return success