Source code for matador.cli.dispersion

# coding: utf-8
# Distributed under the terms of the MIT License.

""" This script mimics the script bundled
with CASTEP. For the given bands file, a bandstructure
is created. If a <seed>.adaptive.dat file exists
then a combined BS/DOS plot will be created.

from os.path import isfile
import argparse
import glob
from matador import __version__, script_epilog

[docs]def main(): """ Parse args and run the script. """ parser = argparse.ArgumentParser( prog='dispersion', epilog=script_epilog, description='simple plotting script for bandstructures/DOS based on matador', add_help=True) parser.add_argument('--version', action='version', version='matador version ' + __version__ + '.') parser.add_argument('--pdf', action='store_true', help='save pdf rather than showing plot in X') parser.add_argument('--png', action='store_true', help='save png rather than showing plot in X') parser.add_argument('--svg', action='store_true', help='save svg rather than showing plot in X') parser.add_argument('--labels', type=str, nargs='*', help='list of legend labels, comma separated') parser.add_argument('--dos_only', action='store_true', help='only plot DOS') parser.add_argument('--bs_only', action='store_true', help='only plot dispersion') parser.add_argument('--preserve_kspace_distance', action='store_true', help='when linearising kpoint path, ensure distance in reciprocal space is conserved') parser.add_argument('--cmap', type=str, help='matplotlib colourmap name to use') parser.add_argument('--spin_only', type=str, help='either "up" or "down" to only plot one channel') parser.add_argument('-interp', '--pdis_interpolation_factor', type=float, help='multiple by which to interpolate pDIS bands (DEFAULT: 2)') parser.add_argument('-scale', '--pdis_point_scale', type=float, help='point scale in pDIS plots (DEFAULT: 25)') parser.add_argument('-p', '--projectors_to_plot', type=str, help=("a list of projectors to plot, in the format element:orbital, " "e.g. -p K:s,P:p. If the orbital is omitted, all orbitals will be used for that element.")) parser.add_argument('--unstacked_pdos', action='store_true', help='plot PDOS as overlap rather than stack') parser.add_argument('--no_pdis', action='store_true', help='do not try to plot PDIS, even if its available') parser.add_argument('--band_reorder', action='store_true', help='try to reorder bands based on local gradients') parser.add_argument('--pdos_hide_sum', action='store_true', help='plot PDOS without sum pDOS') parser.add_argument('--projector_colours', type=str, nargs="+", help='override all projector colour options with a list of matplotlib-interpretable colours, ' 'e.g. --projector_colours red blue #ff00ff') parser.add_argument('--colours', type=str, nargs="+", help='override all colour options with a list of matplotlib-interpretable colours, ' 'e.g. --colours red blue #ff00ff') parser.add_argument('-g', '--gap', action='store_true', help='plot position and size of band gap') parser.add_argument('-ph', '--phonons', action='store_true', default=False, help='plot phonon calculation, rather than electronic') parser.add_argument('-ir', '--infrared', action='store_true', default=False, help='plot infrared spectrum from file') parser.add_argument('-ir_ss', '--infrared_step_size', type=float, nargs='?', default=1.0, help='step size in cm^{-1} on x-axis for IR plots; must be > 0, default is 1') parser.add_argument('-gw', '--gaussian_width', type=float, help=('smearing width for DOS from .bands_dos (default: 0.1 eV) or ' '.phonon_dos files (default: 10 1/cm)')) parser.add_argument('--highlight_bands', nargs='+', type=int, help='specify band numbres to highlight in plot') parser.add_argument('-v', '--verbosity', type=int, default=0, help='control verbosity of output') parser.add_argument('-figsize', '--figsize', nargs='+', type=int, help='figure size in inches to pass to matplotlib') parser.add_argument('-pw', '--plot_window', nargs='+', type=float, help='energy window [x, y] or [-x, x] to plot either side of E_F (eV)\ (DEFAULT: 5 eV)') parser.add_argument('seed', type=str, nargs='+', help='seedname or related filename (e.g. bands or dos file)') kwargs = vars(parser.parse_args()) if 'gap' in kwargs: gap = kwargs['gap'] del kwargs['gap'] seeds = kwargs.get('seed') exts_to_strip = ['bands', 'linear.dat', 'adaptive.dat', 'pdis.dat', 'bands_dos', 'pdos.dat', 'phonon', 'phonon_dos'] for ind, seed in enumerate(seeds): for ext in exts_to_strip: seeds[ind] = seeds[ind].replace('.' + ext, '') verbosity = kwargs.get('verbosity') phonons = kwargs.get('phonons') ir = kwargs.get('infrared') if kwargs.get('labels'): labels = ' '.join(kwargs.get('labels')).split(',') else: labels = None if kwargs['no_pdis']: plot_pdis = False else: plot_pdis = True del kwargs['no_pdis'] cmap = kwargs.get('cmap') band_reorder = kwargs.get('band_reorder', False) from matador.plotting import plot_spectral, plot_ir_spectrum del kwargs['seed'] del kwargs['verbosity'] del kwargs['labels'] del kwargs['cmap'] del kwargs['band_reorder'] bandstructure = False dos = False for seed in seeds: if not phonons and not ir: bs_seed = seed + '.bands' bandstructure = isfile(bs_seed) dos_seeds = glob.glob(seed + '*.dat') if isfile(seed + '.bands_dos'): dos_seeds.append(seed + '.bands_dos') dos = any([isfile(dos_seed) for dos_seed in dos_seeds]) elif phonons and not ir: phonon_seed = seed + '.phonon' bandstructure = isfile(phonon_seed) dos_seed = seed + '.phonon_dos' dos = isfile(dos_seed) elif ir: if len(seeds) > 1: exit('Multiple seeds not supported for IR plot.') ir_seed = seed + '.phonon' if bandstructure: cell_seed = seed + '.cell' cell = isfile(cell_seed) else: cell = False if kwargs.get('dos_only') and dos: bandstructure = False if kwargs.get('bs_only') and bandstructure: dos = False if not any([bandstructure, dos, ir]): raise SystemExit("Unable to find files for seedname {}".format(seed)) if not ir: return plot_spectral( seeds, plot_bandstructure=bandstructure, plot_dos=dos, plot_pdis=plot_pdis, cell=cell, gap=gap, verbosity=verbosity, labels=labels, cmap=cmap, band_reorder=band_reorder, **kwargs ) if ir: return plot_ir_spectrum( ir_seed, bin_width=kwargs['infrared_step_size'], **kwargs ) exit("Issue plotting {}: did you specify -ph/-ir appropriately?" .format(seeds))
if __name__ == '__main__': main()