Source code for aiida.cmdline.commands.cmd_data.cmd_show
###########################################################################
# 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 #
###########################################################################
"""This allows to manage showfunctionality to all data types."""
import pathlib
from aiida.cmdline.utils import echo
from aiida.common.exceptions import MultipleObjectsError
[docs]
def has_executable(exec_name):
""":return: True if executable can be found in PATH, False otherwise."""
import shutil
return shutil.which(exec_name) is not None
[docs]
def _show_jmol(exec_name, trajectory_list, **_kwargs):
"""Plugin for jmol"""
import subprocess
import tempfile
if not has_executable(exec_name):
echo.echo_critical(f"No executable '{exec_name}' found. Add to the path, or try with an absolute path.")
with tempfile.NamedTemporaryFile(mode='w+b') as handle:
for trajectory in trajectory_list:
handle.write(trajectory._exportcontent('cif')[0])
handle.flush()
try:
subprocess.check_output([exec_name, handle.name])
except subprocess.CalledProcessError:
# The program died: just print a message
echo.echo_error(f'the call to {exec_name} ended with an error.')
[docs]
def _show_xcrysden(exec_name, trajectory_list, **_kwargs):
"""Plugin for xcrysden"""
import subprocess
import tempfile
if len(trajectory_list) > 1:
raise MultipleObjectsError('Visualization of multiple trajectories is not implemented')
obj = trajectory_list[0]
if not has_executable(exec_name):
echo.echo_critical(f"No executable '{exec_name}' found.")
with tempfile.NamedTemporaryFile(mode='w+b', suffix='.xsf') as tmpf:
tmpf.write(obj._exportcontent('xsf')[0])
tmpf.flush()
try:
subprocess.check_output([exec_name, '--xsf', tmpf.name])
except subprocess.CalledProcessError:
# The program died: just print a message
echo.echo_error(f'the call to {exec_name} ended with an error.')
[docs]
def _show_mpl_pos(exec_name, trajectory_list, **kwargs):
"""Produces a matplotlib plot of the trajectory"""
for traj in trajectory_list:
traj.show_mpl_pos(**kwargs)
[docs]
def _show_mpl_heatmap(exec_name, trajectory_list, **kwargs):
"""Produces a matplotlib plot of the trajectory"""
for traj in trajectory_list:
traj.show_mpl_heatmap(**kwargs)
[docs]
def _show_ase(exec_name, structure_list):
"""Plugin to show the structure with the ASE visualizer"""
try:
from ase.visualize import view
for structure in structure_list:
view(structure.get_ase())
except ImportError:
raise
[docs]
def _show_vesta(exec_name, structure_list):
"""Plugin for VESTA
This VESTA plugin was added by Yue-Wen FANG and Abel Carreras
at Kyoto University in the group of Prof. Isao Tanaka's lab
"""
import subprocess
import tempfile
with tempfile.NamedTemporaryFile(mode='w+b', suffix='.cif') as tmpf:
for structure in structure_list:
tmpf.write(structure._exportcontent('cif')[0])
tmpf.flush()
try:
subprocess.check_output([exec_name, tmpf.name])
except subprocess.CalledProcessError:
# The program died: just print a message
echo.echo_error(f'the call to {exec_name} ended with an error.')
except OSError as err:
if err.errno == 2:
echo.echo_critical(f"No executable '{exec_name}' found. Add to the path, or try with an absolute path.")
else:
raise
[docs]
def _show_vmd(exec_name, structure_list):
"""Plugin for vmd"""
import subprocess
import tempfile
if len(structure_list) > 1:
raise MultipleObjectsError('Visualization of multiple objects is not implemented')
structure = structure_list[0]
with tempfile.NamedTemporaryFile(mode='w+b', suffix='.xsf') as tmpf:
tmpf.write(structure._exportcontent('xsf')[0])
tmpf.flush()
try:
subprocess.check_output([exec_name, tmpf.name])
except subprocess.CalledProcessError:
# The program died: just print a message
echo.echo_error(f'the call to {exec_name} ended with an error.')
except OSError as err:
if err.errno == 2:
echo.echo_critical(f"No executable '{exec_name}' found. Add to the path, or try with an absolute path.")
else:
raise
[docs]
def _show_xmgrace(exec_name, list_bands):
"""Plugin for showing the bands with the XMGrace plotting software."""
import subprocess
import sys
import tempfile
from aiida.orm.nodes.data.array.bands import MAX_NUM_AGR_COLORS
list_files = []
current_band_number = 0
with tempfile.TemporaryDirectory() as tmpdir:
dirpath = pathlib.Path(tmpdir)
for iband, bnds in enumerate(list_bands):
# extract number of bands
nbnds = bnds.get_bands().shape[1]
text, _ = bnds._exportcontent(
'agr', setnumber_offset=current_band_number, color_number=(iband + 1 % MAX_NUM_AGR_COLORS)
)
# write a tempfile
filepath = dirpath / f'{iband}.agr'
filepath.write_bytes(text)
list_files.append(str(filepath))
# update the number of bands already plotted
current_band_number += nbnds
try:
subprocess.check_output([exec_name] + [str(filepath) for filepath in list_files])
except subprocess.CalledProcessError:
print(f'Note: the call to {exec_name} ended with an error.')
except OSError as err:
if err.errno == 2:
print(f"No executable '{exec_name}' found. Add to the path, or try with an absolute path.")
sys.exit(1)
else:
raise