summaryrefslogtreecommitdiff
path: root/silx/sx/__init__.py
blob: 97a34601d5cc423f5a98c7aa5a904a52d84ea1c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# coding: utf-8
# /*##########################################################################
#
# Copyright (c) 2016-2019 European Synchrotron Radiation Facility
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# ###########################################################################*/
"""This is a convenient package to use from Python or IPython interpreter.
It loads the main features of silx and provides high-level functions.

>>> from silx import sx

When used in an interpreter is sets-up Qt and loads some silx widgets.
In a `jupyter <https://jupyter.org/>`_  / `IPython <https://ipython.org/>`_
notebook, to set-up Qt and loads silx widgets, you must then call:

>>> sx.enable_gui()

When used in `IPython <https://ipython.org/>`_, it also runs ``%pylab``,
thus importing `numpy <http://www.numpy.org/>`_ and
`matplotlib <https://matplotlib.org/>`_.
"""


__authors__ = ["T. Vincent"]
__license__ = "MIT"
__date__ = "16/01/2017"


import logging as _logging
import sys as _sys
import os as _os


_logger = _logging.getLogger(__name__)


# Init logging when used from the console
if hasattr(_sys, 'ps1'):
    _logging.basicConfig()

# Probe DISPLAY available on linux
_NO_DISPLAY = _sys.platform.startswith('linux') and not _os.environ.get('DISPLAY')

# Probe ipython
try:
    from IPython import get_ipython as _get_ipython
except (NameError, ImportError):
    _get_ipython = None

# Probe ipython/jupyter notebook
if _get_ipython is not None and _get_ipython() is not None:

    # Notebook detection probably fragile
    _IS_NOTEBOOK = ('parent_appname' in _get_ipython().config['IPKernelApp'] or
                    hasattr(_get_ipython(), 'kernel'))
else:
    _IS_NOTEBOOK = False


# Placeholder for QApplication
_qapp = None


def enable_gui():
    """Populate silx.sx module with silx.gui features and initialise Qt"""
    if _NO_DISPLAY:  # Missing DISPLAY under linux
        _logger.warning(
            'Not loading silx.gui features: No DISPLAY available')
        return

    global qt, _qapp

    if _IS_NOTEBOOK:
        _get_ipython().enable_pylab(gui='qt', import_all=False)

    from silx.gui import qt
    # Create QApplication and keep reference only if needed
    if not qt.QApplication.instance():
        _qapp = qt.QApplication([])

    if hasattr(_sys, 'ps1'):  # If from console, change windows icon
        # Change windows default icon
        from silx.gui import icons
        app = qt.QApplication.instance()
        app.setWindowIcon(icons.getQIcon('silx'))

    global ImageView, PlotWidget, PlotWindow, Plot1D
    global Plot2D, StackView, ScatterView, TickMode
    from silx.gui.plot import (ImageView, PlotWidget, PlotWindow, Plot1D,
                               Plot2D, StackView, ScatterView, TickMode)  # noqa

    global plot, imshow, scatter, ginput
    from ._plot import plot, imshow, scatter, ginput  # noqa

    try:
        import OpenGL
    except ImportError:
        _logger.warning(
            'Not loading silx.gui.plot3d features: PyOpenGL is not installed')
    else:
        global contour3d, points3d
        from ._plot3d import contour3d, points3d  # noqa


# Load Qt and widgets only if running from console and display available
if _IS_NOTEBOOK:
    _logger.warning(
        'Not loading silx.gui features: Running from the notebook')
else:
    enable_gui()


# %pylab
if _get_ipython is not None and _get_ipython() is not None:
    if not _NO_DISPLAY:  # Not loading pylab without display
        from IPython.core.pylabtools import import_pylab as _import_pylab
        _import_pylab(_get_ipython().user_ns, import_all=False)


# Clean-up
del _os

# Load some silx stuff in namespace
from silx import version  # noqa
from silx.io import open  # noqa
from silx.io import *  # noqa
from silx.math import Histogramnd, HistogramndLut  # noqa
from silx.math.fit import leastsq  # noqa