Source code for aiida.restapi.translator.data.kpoints

# -*- coding: utf-8 -*-
###########################################################################
# Copyright (c), The AiiDA team. All rights reserved.                     #
# This file is part of the AiiDA code.                                    #
#                                                                         #
# The code is hosted on GitHub at https://github.com/aiidateam/aiida_core #
# For further information on the license, see the LICENSE.txt file        #
# For further information please visit http://www.aiida.net               #
###########################################################################
from aiida.restapi.translator.data import DataTranslator

[docs]class KpointsDataTranslator(DataTranslator): """ Translator relative to resource 'kpoints' and aiida class KpointsData """ # A label associated to the present class (coincides with the resource name) __label__ = "kpoints" # The AiiDA class one-to-one associated to the present class from aiida.orm.data.array.kpoints import KpointsData _aiida_class = KpointsData # The string name of the AiiDA class _aiida_type = "data.array.kpoints.KpointsData" # The string associated to the AiiDA class in the query builder lexicon _qb_type = _aiida_type + '.' _result_type = __label__
[docs] def __init__(self, **kwargs): """ Initialise the parameters. Create the basic query_help """ super(KpointsDataTranslator, self).__init__(Class=self.__class__, **kwargs)
[docs] @staticmethod def get_visualization_data(node, format=None): """ Returns: data in a format required by dr.js to visualize a 2D plot with multiple data series. """ """ Strategy: For the time being rely on the function implemented in seekpath to calculate brillouin zone faces, and triangulate them. The other fielsd of the response are retrieved by ordniary kpointsdata methods, except the logic to create an list of explicit keypoints from the mesh and the cell vectors. """ import numpy as np # First, check whether it contains the cell => BZ and explicit kpoints # can be plotted try: cell = node.reciprocal_cell except AttributeError: has_cell = False else: has_cell = True # Then, check whether kpoint node has an explicit list including b # vectors try: explicit_kpoints_rel = node.get_kpoints() except AttributeError: explicit_kpoints = False else: explicit_kpoints = True # Check if it has kpoint mesh (still compatible with the explicit # list of kpoints) try: (mesh, offset) = node.get_kpoints_mesh() except AttributeError: has_mesh = False else: has_mesh = True explicit_kpoints_rel = node.get_kpoints_mesh(print_list=True) # Initialize response json_visualization = {} # First dump out the kpoints in relative coordinates (which are # always available) json_visualization['explicit_kpoints_rel'] = \ explicit_kpoints_rel.tolist() # For kpoints objects that have an explicit list of kpoints we can # construct BZ and return an explicit list of kpoint coordinates if has_cell: # Retrieve b1, b2, b3 and add them to the json (b1, b2, b3) = (cell[0], cell[1], cell[2]) json_visualization['b1'] = b1.tolist() json_visualization['b2'] = b2.tolist() json_visualization['b3'] = b3.tolist() json_visualization['reciprocal_vectors_unit'] = u'1/\u212b' # Get BZ facesa and add them to the json. Fields: faces, # triangles, triangle_vertices. Most probably only faces is needed. from seekpath.brillouinzone.brillouinzone import get_BZ json_visualization['faces_data'] = get_BZ(b1, b2, b3) # Provide kpoints cooridnates in absolute units ... explicit_kpoints_abs = np.dot(explicit_kpoints_rel, cell) json_visualization['explicit_kpoints_abs'] = \ explicit_kpoints_abs.tolist() # ... and units! json_visualization['kpoints_abs_unit'] = u'1/\u212b' # Add labels field has_labels=False if explicit_kpoints: if node.labels is not None: has_labels=True high_symm_rel = {} path = [] for idx, label in node.labels: high_symm_rel[label] = explicit_kpoints_rel[idx].tolist() if idx>0: path.append([old_label, label]) old_label = label json_visualization['kpoints_rel'] = high_symm_rel json_visualization['path'] = path # If absolute coordinates can be calculated also provide them if has_cell: high_symm_abs = {} for idx, label in node.labels: high_symm_abs[label] = explicit_kpoints_abs[ idx].tolist() json_visualization['kpoints'] = high_symm_abs # Return mesh and offset lists to be represented in a table if has_mesh: json_visualization['mesh'] = mesh json_visualization['offset'] = offset """ # Populate json content with booleans to make it easy to determine how to visualize the node. plot_bz: whether to make the plot (BZ, cell vectors, and explicit kpoints) tab_mesh: whether to include a table with the mesh and offsets """ bool_fields = dict( has_cell=has_cell, has_mesh=has_mesh, has_labels=has_labels ) json_visualization.update(bool_fields) # Construct json and return it return json_visualization
[docs] @staticmethod def get_downloadable_data(node, format=None): """ Generic function extented for kpoints data. Currently it is not implemented. :param node: node object that has to be visualized :param format: file extension format :returns: raise RestFeatureNotAvailable exception """ from aiida.restapi.common.exceptions import RestFeatureNotAvailable raise RestFeatureNotAvailable("This endpoint is not available for Kpoints.")