Source code for pymchelper.run

#!/usr/bin/env python

import glob
import logging
import sys

import argparse

from pymchelper.estimator import ErrorEstimate
from pymchelper.input_output import convertfrompattern, convertfromlist
from pymchelper.writers.common import Converters
from pymchelper.writers.plots import ImageWriter, PlotAxis

logger = logging.getLogger(__name__)


[docs]def add_default_options(parser): import pymchelper parser.add_argument('input', help='input filename, file list or pattern', type=str) parser.add_argument('output', help='output filename or directory', nargs='?') parser.add_argument('-j', '--jobs', help='number of parallel jobs to use (-1 means all CPUs)', default=-1, type=int) parser.add_argument('--many', help='automatically merge data from various sources', action="store_true") parser.add_argument('-a', '--nan', help='ignore NaN in averaging', action="store_true") parser.add_argument('-e', '--error', help='type of error estimate to add (default: ' + ErrorEstimate.stderr.name + ')', default=ErrorEstimate.stderr.name, choices=[x.name for x in ErrorEstimate], type=str) parser.add_argument('-n', '--nscale', help='scale with number of primaries N.', default=1, type=float) parser.add_argument('-v', '--verbose', action='count', default=0, help='give more output. Option is additive, and can be used up to 3 times') parser.add_argument('-q', '--quiet', action='count', default=0, help='be silent') parser.add_argument('-V', '--version', action='version', version=pymchelper.__version__)
[docs]def main(args=None): if args is None: args = sys.argv[1:] import pymchelper import os _progname = os.path.basename(sys.argv[0]) _helptxt = 'Universal converter for FLUKA and SHIELD-HIT12A output files.' _epitxt = '''Type '{:s} <converter> --help' for help on a specific converter.'''.format(_progname) parser = argparse.ArgumentParser(description=_helptxt, epilog=_epitxt) subparsers = parser.add_subparsers(dest='command', metavar='converter') parser_txt = subparsers.add_parser(Converters.txt.name, help='converts to plain txt file') add_default_options(parser_txt) parser_image = subparsers.add_parser(Converters.image.name, help='converts to PNG images') add_default_options(parser_image) axis_names = [x.name for x in PlotAxis] parser_image.add_argument('-l', '--log', help='set logscale for plot axis', nargs='+', choices=axis_names, default={}, type=str) parser_image.add_argument("--colormap", help='image color map, see https://matplotlib.org/stable/tutorials/colors/colormaps.html ' 'for list of possible options (default: ' + ImageWriter.default_colormap + ')', default=ImageWriter.default_colormap, type=str) parser_excel = subparsers.add_parser(Converters.excel.name, help='converts to MS Excel file') add_default_options(parser_excel) parser_hdf = subparsers.add_parser(Converters.hdf.name, help='converts to HDF file') add_default_options(parser_hdf) parser_plotdata = subparsers.add_parser(Converters.plotdata.name, help='converts to gnuplot data') add_default_options(parser_plotdata) parser_gnuplot = subparsers.add_parser(Converters.gnuplot.name, help='converts to gnuplot script') add_default_options(parser_gnuplot) parser_inspect = subparsers.add_parser(Converters.inspect.name, help='prints metadata') add_default_options(parser_inspect) parser_inspect.add_argument('-d', '--details', help='print detailed information about data attribute', action="store_true") parser_sparse = subparsers.add_parser(Converters.sparse.name, help='converts to sparse matrix format') add_default_options(parser_sparse) parser_sparse.add_argument("--threshold", help='only values greater than threshold are saved', type=float, default=0.0) parser_tripcube = subparsers.add_parser(Converters.tripcube.name, help='converts to TRiP98 data cube') add_default_options(parser_tripcube) parser_tripddd = subparsers.add_parser(Converters.tripddd.name, help='converts to TRiP98 DDD file') add_default_options(parser_tripddd) parser_tripddd.add_argument("--energy", help='energy of the beam [MeV/amu] (guess from data if option missing)', type=float) parser_tripddd.add_argument("--projectile", help='projectile (guess from data if option missing)', type=str) parser_tripddd.add_argument("--ngauss", help='number of Gaussian functions to fit (default: 0)', choices=(0, 1, 2), default=0, type=int) parser.add_argument('-V', '--version', action='version', version=pymchelper.__version__) parsed_args = parser.parse_args(args) verbose_flag = getattr(parsed_args, 'verbose', 0) if verbose_flag == 1: logging.basicConfig(level=logging.INFO) elif verbose_flag > 1: logging.basicConfig(level=logging.DEBUG) else: logging.basicConfig() status = 0 if parsed_args.command is not None: # TODO add filename discovery files = sorted(glob.glob(parsed_args.input)) if not files: logger.error('File does not exist: ' + parsed_args.input) # check if output should be interpreted as a filename if not parsed_args.many and len(files) == 1: output_file = parsed_args.output else: output_file = None if parsed_args.output is not None and output_file is None: output_dir = parsed_args.output # check if output directory exists if output_dir and not os.path.exists(output_dir): logger.warning("Directory {:s} does not exist, creating.".format(output_dir)) os.makedirs(output_dir) else: output_dir = '.' parsed_args.error = ErrorEstimate[parsed_args.error] if parsed_args.many: status = convertfrompattern(parsed_args.input, output_dir, converter_name=parsed_args.command, options=parsed_args, error=parsed_args.error, nan=parsed_args.nan, jobs=parsed_args.jobs, verbose=parsed_args.verbose) else: status = convertfromlist(parsed_args.input, error=parsed_args.error, nan=parsed_args.nan, outputdir=output_dir, converter_name=parsed_args.command, options=parsed_args, outputfile=output_file) return status
if __name__ == '__main__': sys.exit(main(sys.argv[1:]))