Source code for mxcubecore.utils.conversion

# encoding: utf-8
#
# License:
#
# This file is part of MXCuBE.
#
# MXCuBE is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# MXCuBE 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 Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with MXCuBE. If not, see <https://www.gnu.org/licenses/>.

"""General data and functions, that can be shared between different HardwareObjects"""

from __future__ import (
    absolute_import,
    division,
    print_function,
    unicode_literals,
)

import re

from scipy.constants import (
    c,
    e,
    h,
)

__date__ = "19/06/17"
__credits__ = ["MXCuBE collaboration"]

# Constants

try:
    # Python 2
    string_types = (basestring,)
    text_type = unicode
    binary_type = str
except Exception:
    # Python 3+
    string_types = (str,)
    text_type = str
    binary_type = bytes

# Conversion from kEv to A, wavelength = HC_OVER_E/energy
HC_OVER_E = h * c / e * 10e6


# Utility functions:


[docs]def java_property(keyword, value, quote_value=False): """Return argument list for command line invocation setting java property keyword, value are stringtypes""" if value is None: return ["-D" + keyword] else: if value and quote_value: value = quoted_string(value) return ["-D%s=%s" % (keyword, value)]
[docs]def command_option(keyword, value, prefix="-", quote_value=False): """Return argument list for command line option""" if value is None: return [prefix + keyword] else: if value and quote_value: value = quoted_string(value) else: value = str(value) return [prefix + keyword, value]
[docs]def quoted_string(text): """Return quoted value of a (single-line) string Intended for command line arguments. Will work for Python 2 str or unicode, OR Python 3 str and (some) bytes). Somewhat fragile, will definitely break for multiline strings or strings containing both single and double quotes """ result = ensure_text(text) if not '"' in result: result = "".join(('"', result, '"')) elif not "'" in result: result = "".join(("'", result, "'")) else: result = repr(result) ind = 0 for ind, char in enumerate(result): if char in ('"', "'"): break return result[ind:]
[docs]def convert_string_value(text): """Convert input string to int, float, or string (in order of priority)""" try: return int(text) except ValueError: try: return float(text) except ValueError: return text
# 'Borrowed' from six, pending installation as a dependency
[docs]def ensure_text(chars, encoding="utf-8", errors="strict"): """Coerce *chars* to six.text_type. For Python 2: - `unicode` -> `unicode` - `str` -> `unicode` For Python 3: - `str` -> `str` - `bytes` -> decoded to `str` """ if isinstance(chars, binary_type): return chars.decode(encoding, errors) elif isinstance(chars, text_type): return chars else: raise TypeError("not expecting type '%s'" % type(chars))
[docs]def make_table(column_names, rows): """Generate string with pretty-printed table Args: column_names (Sequence[str]) : Column names rows (Sequence[Sequence[str]]) : List of row data Returns: """ lines = [] longest_cols = [ (max([len(str(row[i])) for row in rows]) + 3) for i in range(len(rows[0])) ] longest_cols = list( max(longest_cols[ind], len(txt)) for ind, txt in enumerate(column_names) ) ruler = "+" + "=" * sum(longest_cols) + "+" row_format = "| ".join( ["{:<" + str(longest_col) + "}" for longest_col in longest_cols] ) lines.append(ruler) lines.append("| %s" % row_format.format(*column_names)) lines.append(ruler) for row in rows: lines.append("| %s" % row_format.format(*row)) lines.append(ruler) return "\n".join(lines)
def camel_to_snake(name): pattern = re.compile(r"(?<!^)(?=[A-Z])") return pattern.sub("_", name).lower()