Source code for galore.cli.galore_plot_cs

#! /usr/bin/env python3
###############################################################################
#                                                                             #
# GALORE: Gaussian and Lorentzian broadening for simulated spectra            #
#                                                                             #
# Developed by Adam J. Jackson and Alex Ganose                                #
# at University College London (2018)                                         #
#                                                                             #
###############################################################################
#                                                                             #
# This file is part of Galore. Galore is free software: you can redistribute  #
# it and/or modify it under the terms of the GNU General Public License as    #
# published by the Free Software Foundation, either version 3 of the License, #
# or (at your option) any later version.  This program is distributed in the  #
# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the     #
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.    #
# See the GNU General Public License for more details.  You should have       #
# received a copy of the GNU General Public License along with this program.  #
# If not, see <http://www.gnu.org/licenses/>.                                 #
#                                                                             #
###############################################################################
from argparse import ArgumentParser
from itertools import cycle

import logging
import numpy as np
from matplotlib import pyplot as plt
plt.style.use('seaborn-colorblind')

from galore.cross_sections import get_cross_sections_scofield


[docs]def main(): parser = get_parser() args = parser.parse_args() args = vars(args) run(**args)
[docs]def get_parser(): parser = ArgumentParser() parser.add_argument('--emin', type=float, default=1, help="Minimum energy in keV") parser.add_argument('--emax', type=float, default=20, help="Maximum energy in keV") parser.add_argument('--megabarn', action='store_true', help="Set y-axis unit to megabarn/electron") parser.add_argument('--size', type=float, nargs=2, default=None, help="Figure dimensions in cm") parser.add_argument('--output', '-o', type=str, default=None, help="Output filename. If not given, plot to screen.") parser.add_argument('--fontsize', type=int, default=12, help="Font size in pt") parser.add_argument( '--style', type=str, nargs='+', default=['seaborn-colorblind'], help='Plotting style: a sequence of matplotlib styles and paths to ' 'style files. The default palette is called "seaborn-colorblind".' ) parser.add_argument('elements', type=str, nargs='+', help=""" Space-separated symbols for elements in material.""") return parser
[docs]def run(elements, emin=1, emax=10, megabarn=False, size=None, output=None, fontsize=10, style=None): energies = np.linspace(emin, emax, 200) cross_sections = get_cross_sections_scofield(energies, elements) if style is not None: plt.style.use(style) if size is None: fig = plt.figure() else: size_inches = [float(x) / 2.54 for x in size] fig = plt.figure(figsize=size_inches) ax = fig.add_subplot(1, 1, 1) colors = cycle(('C0', 'C1', 'C2', 'C3', 'C4')) markers = cycle(('o', '^', 'D', 'x', '*')) if megabarn: unit = "Mb" conversion = 1E6 else: unit = "barn" conversion = 1 for element in elements: color, marker = next(colors), next(markers) linestyles = cycle((['-', '--', ':', '-.'])) if 'warning' in cross_sections[element]: logging.warning(" {0}: {1}".format( element, cross_sections[element]['warning'])) for orbital in 'spdf': if (orbital in cross_sections[element] and cross_sections[element][orbital] is not None): ax.plot(energies, cross_sections[element][orbital] / conversion, color=color, linestyle=next(linestyles), marker=marker, markevery=40, label='{0}-{1}'.format(element, orbital), markersize=5) ax.tick_params(labelsize=(fontsize - 2)) ax.set_xlabel('Photon energy / keV', fontsize=fontsize) ylabel = ('Photoionization cross-section /' ' {} electron$^{{-1}}$'.format(unit)) ax.set_ylabel(ylabel, fontsize=fontsize) ax.set_yscale('log') ax.legend(loc='lower right', fontsize=fontsize) fig.subplots_adjust(right=0.98, top=0.98) if output is None: plt.show() else: fig.savefig(output, bbox_inches='tight')
if __name__ == '__main__': main()