Source code for pyretis.bin.pyvisa

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright (c) 2023, PyRETIS Development Team.
# Distributed under the LGPLv2.1+ License. See LICENSE for more info.
"""pyvisa - An application for analysing PyRETIS simulations.

This script is a part of the PyRETIS library and can be used for
analysing the result from simulations.

usage: pyvisa.py [-h]

optional arguments:
  -cmp --pyvisa_compressor  use only the compressor tool without GUI.
  -data --pyvisa-data       select the data source.
  -h, --help                show this help message and exit.
  -i INPUT, --input INPUT   location of PyRETIS input files
                            or PyVisA compressed file.
  -oo --only-order          read only the order.txt files.
  -V, --version             show program's version number and exit.

"""
# pylint: disable=invalid-name
import argparse
import datetime
import logging
import os
import sys
import colorama
from pyretis import __version__ as VERSION
from pyretis.bin.pyretisanalyse import write_traceback
from pyretis.pyvisa.info import PROGRAM_NAME, CITE, LOGO, URL
from pyretis.inout.common import (
    check_python_version)
from pyretis.inout.formats.formatter import (
    LOG_FMT,
    PyretisLogFormatter,
)
from pyretis.inout import print_to_screen
from pyretis.pyvisa.orderparam_density import PathDensity, pyvisa_compress
from pyretis.pyvisa.common import recalculate_all
from pyretis.__init__ import HAS_PYVISA_REQ
if HAS_PYVISA_REQ:
    from pyretis.pyvisa.visualize import visualize_main  # pragma: no cover


# Set up for logging:
logger = logging.getLogger('')
logger.setLevel(logging.DEBUG)

runpath = os.getcwd()
ERROR_FILE = 'pyvisa_error.txt'


[docs]def hello_pyvisa(run_dir, infile): """Output a standard greeting for PyVISA. Parameters ---------- run_dir : string The location where we are executing the analysis. infile : string String showing the location of the input file. """ pyversion = sys.version.split()[0] msgtxt = [LOGO] msgtxt += [' Starting'] msgtxt += [f'{PROGRAM_NAME} version: {VERSION}'] msgtxt += [f'Python version: {pyversion}'] msgtxt += [f'Running in directory: {run_dir}'] msgtxt += [f'Input file: {infile}'] print_to_screen('\n'.join(msgtxt), level='message') logger.info('\n'.join(msgtxt))
[docs]def bye_pyvisa(): """Print out the goodbye message for PyVisA.""" _DATE_FMT = '%d.%m.%Y %H:%M:%S' timeend = datetime.datetime.now().strftime(_DATE_FMT) msgtxt = f'End of {PROGRAM_NAME} execution: {timeend}' print_to_screen(msgtxt, level='info') logger.info(msgtxt) # display some references: references = [f'{PROGRAM_NAME} references:'] references.append(('-')*len(references[0])) for line in CITE.split('\n'): if line: references.append(line) reftxt = '\n'.join(references) logger.info(reftxt) print_to_screen() print_to_screen(reftxt) urltxt = str(URL) logger.info(urltxt) print_to_screen() print_to_screen(urltxt, level='info')
[docs]def pyvisa_visual(basepath, input_file, pyvisa_dict): # pragma: no cover """Load data to PyVisA. Parameters ---------- basepath : string The execution folder where the input files are. input_file : string The input file with settings for the analysis. pyvisa_dict : dictionary, optional It determines the section of pyvisa to use, it contains: """ if not HAS_PYVISA_REQ: msg = ('Requirements not installed. You can still generate the ' 'hdf5 by using the -cmp flag instead') raise ImportError(msg) if input_file is None: visualize_main(basepath) # If a compressed file is given as an input elif input_file.endswith(('.hdf5', '.zip')): visualize_main(basepath, input_file) elif input_file.endswith('rst'): # If -data is selected with a trajectory if pyvisa_dict['pyvisa_data'] is not None: visualize_main(basepath, input_file, trajfile=pyvisa_dict['pyvisa_data']) else: p_data = PathDensity(basepath, iofile=input_file) p_data.infos['only_ops'] = pyvisa_dict['only_order'] # Walk selected ensemble directories p_data.walk_dirs(only_ops=pyvisa_dict['only_order']) visualize_main(basepath, p_data, rst_file=input_file) else: msg = f'The format of {input_file} is not supported.' raise ImportError(msg)
[docs]def main(basepath, input_file, pyvisa_dict=None): """Run the analysis. Parameters ---------- basepath : string The execution folder where the input files are. input_file : string The input file with settings for the analysis. pyvisa_dict : dictionary, optional It determines the section of pyvisa to use, it contains: * `pyvisa_cmp`, boolean If true, only the compressor tool will be executed. A compressed file will be produced. * `pyvisa_visual`, boolean If true, only the visualization tool will be executed. * `pyvisa_data`, str If given, the file or folder containing the files that will be used to feed to PyVisA. * `pyvisa_recalculate`, boolean If true, use the recalculation tool to compute new op and cv values. """ try: if input_file is not None and \ not os.path.isfile(os.path.join(basepath, input_file)): raise FileNotFoundError(f'Input file "{input_file}" NOT found!') # For recalculation of op and cv's if pyvisa_dict.get('pyvisa_recalculate', False): recalculate_all(basepath, input_file, data=pyvisa_dict['pyvisa_data']) # For compression of the files ONLY elif pyvisa_dict.get('pyvisa_compressor', False): pyvisa_compress(basepath, input_file, pyvisa_dict) else: pyvisa_visual(basepath, input_file, pyvisa_dict) except Exception as error: # pragma: no cover errtxt = f'{type(error).__name__}: {error.args}' print_to_screen(errtxt, level='error') print_to_screen('Execution failed!', level='error') print_to_screen(f'Error traceback is written to: {ERROR_FILE}', level='error') write_traceback(os.path.join(basepath, ERROR_FILE)) finally: bye_pyvisa()
[docs]def entry_point(): # pragma: no cover """entry_point - The entry point for the pip install of pyretisanalyse.""" colorama.init(autoreset=True) parser = argparse.ArgumentParser(description=PROGRAM_NAME) parser.add_argument('-i', '--input', help=(f'Location of {PROGRAM_NAME} input file'), required=False, default=None) parser.add_argument('-V', '--version', action='version', version=f'{PROGRAM_NAME} {VERSION}') parser.add_argument('-cmp', '--pyvisa_compressor', action='store_true', help='Run PyVisA compressor tool', default=False) parser.add_argument('-data', '--pyvisa-data', action='store', help='Select PyVisA data', default=None) parser.add_argument('-recalculate', '--pyvisa-recalculate', action='store_true', help='Recalculate op and cv data.', default=False) parser.add_argument('-oo', '--only_order', action='store_true', help=('PyVisA: Use only data from order.txt files'), default=False) args_dict = vars(parser.parse_args()) # Define a console logger. This will log to sys.stderr: console = logging.StreamHandler() console.setLevel(logging.WARNING) console.setFormatter(PyretisLogFormatter(LOG_FMT)) logger.addHandler(console) check_python_version() infile = args_dict['input'] basepath = os.getcwd() if infile is None else os.path.dirname( os.path.abspath(infile)) hello_pyvisa(basepath, infile) main(basepath, infile, args_dict)
if __name__ == '__main__': # pragma: no cover entry_point()